From e239fe743fc66a8712cf9886d3dfed3cc41fce36 Mon Sep 17 00:00:00 2001
From: nsfisis <nsfisis@gmail.com>
Date: Fri, 13 Feb 2026 22:40:45 +0900
Subject: refactor(frontend): replace React Router BFF with Wouter SPA

Remove React Router 7 SSR/BFF architecture (server-side loaders,
actions, sessions, remix-auth) and replace with a client-side SPA
using Wouter for routing and cookie-based JWT auth.

- Replace reactRouter() Vite plugin with @vitejs/plugin-react
- Add index.html + app/main.tsx as SPA entry points
- Add Wouter routing with auth guards (ProtectedRoute/PublicOnlyRoute)
- Add client-side auth (app/auth.ts) and useAuth hook
- Migrate all route files to app/pages/ with client-side data fetching
- Update NavigateLink and GolfPlayAppGaming to use Wouter Link
- Remove .server/, routes/, root.tsx, react-router.config.ts
- Clean up tsconfig.json (remove .react-router references)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---
 frontend/app/routes/golf.$gameId.play.tsx | 62 -------------------------------
 1 file changed, 62 deletions(-)
 delete mode 100644 frontend/app/routes/golf.$gameId.play.tsx

(limited to 'frontend/app/routes/golf.$gameId.play.tsx')

diff --git a/frontend/app/routes/golf.$gameId.play.tsx b/frontend/app/routes/golf.$gameId.play.tsx
deleted file mode 100644
index c063d05..0000000
--- a/frontend/app/routes/golf.$gameId.play.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Provider as JotaiProvider, createStore } from "jotai";
-import { useMemo } from "react";
-import type { LoaderFunctionArgs, MetaFunction } from "react-router";
-import { redirect, useLoaderData } from "react-router";
-import { ensureUserLoggedIn } from "../.server/auth";
-import { ApiClientContext, createApiClient } from "../api/client";
-import GolfPlayApp from "../components/GolfPlayApp";
-import { APP_NAME } from "../config";
-
-export const meta: MetaFunction<typeof loader> = ({ data }) => [
-	{
-		title: data
-			? `Golf Playing ${data.game.display_name} | ${APP_NAME}`
-			: `Golf Playing | ${APP_NAME}`,
-	},
-];
-
-export async function loader({ params, request }: LoaderFunctionArgs) {
-	const { token, user } = await ensureUserLoggedIn(request);
-	const apiClient = createApiClient(token);
-
-	const gameId = Number(params.gameId);
-
-	try {
-		const [{ game }, { state: gameState }] = await Promise.all([
-			apiClient.getGame(gameId),
-			apiClient.getGamePlayLatestState(gameId),
-		]);
-
-		return {
-			apiToken: token,
-			game,
-			player: user,
-			gameState,
-		};
-	} catch {
-		throw redirect("/dashboard");
-	}
-}
-
-export default function GolfPlay() {
-	const { apiToken, game, player, gameState } = useLoaderData<typeof loader>();
-
-	const store = useMemo(() => {
-		void game.game_id;
-		void player.user_id;
-		return createStore();
-	}, [game.game_id, player.user_id]);
-
-	return (
-		<JotaiProvider store={store}>
-			<ApiClientContext.Provider value={createApiClient(apiToken)}>
-				<GolfPlayApp
-					key={game.game_id}
-					game={game}
-					player={player}
-					initialGameState={gameState}
-				/>
-			</ApiClientContext.Provider>
-		</JotaiProvider>
-	);
-}
-- 
cgit v1.3.1

