import { createStore, Provider as JotaiProvider } from "jotai"; import { useEffect, useMemo, useState } from "react"; import { ApiClientContext, createApiClient } from "../api/client"; import type { components } from "../api/schema"; import GolfWatchApp from "../components/GolfWatchApp"; import { APP_NAME } from "../config"; import { usePageTitle } from "../hooks/usePageTitle"; type Game = components["schemas"]["Game"]; type LatestGameState = components["schemas"]["LatestGameState"]; type RankingEntry = components["schemas"]["RankingEntry"]; export default function GolfWatchPage({ gameId }: { gameId: string }) { const [game, setGame] = useState(null); const [ranking, setRanking] = useState([]); const [gameStates, setGameStates] = useState<{ [key: string]: LatestGameState; }>({}); const [loading, setLoading] = useState(true); const [error, setError] = useState(false); const gameIdNum = Number(gameId); usePageTitle( game ? `Golf Watching ${game.display_name} | ${APP_NAME}` : `Golf Watching | ${APP_NAME}`, ); useEffect(() => { const apiClient = createApiClient(); Promise.all([ apiClient.getGame(gameIdNum), apiClient.getGameWatchRanking(gameIdNum), apiClient.getGameWatchLatestStates(gameIdNum), ]) .then(([{ game }, { ranking }, { states }]) => { setGame(game); setRanking(ranking); setGameStates(states); }) .catch(() => setError(true)) .finally(() => setLoading(false)); }, [gameIdNum]); const store = useMemo(() => { if (!game) return null; return createStore(); }, [game]); if (loading) { return (

Loading...

); } if (error || !game || !store) { return (

試合が見つかりませんでした

); } return ( ); }