refactor(page): extract screen routing into ScreenRouter component

This commit is contained in:
jessy-david-dev
2026-04-10 16:47:13 +02:00
parent 8f62b7edbf
commit 6378056f97
2 changed files with 112 additions and 68 deletions
+104
View File
@@ -0,0 +1,104 @@
"use client";
import { Dispatch, SetStateAction } from "react";
import { Session } from "next-auth";
import type { Screen } from "../../lib/types";
import type { useSoloGame } from "../../lib/useSoloGame";
import type { useMultiGame } from "../../lib/useMultiGame";
import type { useGameHandlers } from "../../lib/useGameHandlers";
import { fmt } from "../../lib/utils";
import { HomeScreen } from "./HomeScreen";
import { LobbyScreen } from "./LobbyScreen";
import { SoloScreen } from "./SoloScreen";
import { GameScreen } from "./GameScreen";
import { AuthModal } from "./AuthModal";
import { ProfileScreen } from "./ProfileScreen";
type Props = {
screen: Screen;
setScreen: Dispatch<SetStateAction<Screen>>;
session: Session | null;
solo: ReturnType<typeof useSoloGame>;
multi: ReturnType<typeof useMultiGame>;
handlers: ReturnType<typeof useGameHandlers>;
playerName: string;
setPlayerName: Dispatch<SetStateAction<string>>;
joinCode: string;
setJoinCode: Dispatch<SetStateAction<string>>;
error: string | null;
setError: Dispatch<SetStateAction<string | null>>;
loading: boolean;
showAuth: boolean;
setShowAuth: Dispatch<SetStateAction<boolean>>;
};
export function ScreenRouter({
screen, setScreen, session, solo, multi, handlers,
playerName, setPlayerName, joinCode, setJoinCode,
error, setError, loading, showAuth, setShowAuth,
}: Props) {
if (screen === "profile") return (
<ProfileScreen userName={session?.user?.name ?? "Joueur"} onBack={() => setScreen("home")} />
);
if (screen === "home") return (
<>
<HomeScreen
playerName={playerName} setPlayerName={setPlayerName}
joinCode={joinCode} setJoinCode={setJoinCode}
error={error} setError={setError} loading={loading}
onCreateRoom={handlers.handleCreateRoom}
onJoinRoom={handlers.handleJoinRoom}
onSolo={handlers.handleSolo}
session={session}
onShowAuth={() => setShowAuth(true)}
onShowProfile={() => setScreen("profile")}
/>
{showAuth && <AuthModal onClose={() => setShowAuth(false)} onSuccess={() => setShowAuth(false)} />}
</>
);
if (screen === "solo") return (
<SoloScreen
phase={solo.phase} puzzle={solo.puzzle}
html={solo.html} title={solo.title}
loading={solo.loading} loadError={solo.loadError}
history={solo.history} clicks={solo.clicks}
elapsedDisplay={fmt(solo.elapsed)}
canGoBack={solo.canGoBack}
onStart={solo.start}
onNavigate={solo.navigate}
onBack={solo.goBack}
onQuit={() => { solo.reset(); setScreen("home"); }}
onNewGame={solo.start}
onRetry={solo.retryLoad}
/>
);
if (screen === "lobby" && multi.room && multi.playerId) return (
<LobbyScreen
room={multi.room} playerId={multi.playerId}
error={error} setError={setError} loading={loading}
onLeave={handlers.handleLeave}
onStart={handlers.handleStartGame}
onReset={handlers.handleResetGame}
/>
);
if (screen === "game" && multi.room && multi.playerId) return (
<GameScreen
room={multi.room} playerId={multi.playerId}
html={multi.html} title={multi.title}
loading={multi.loading} loadError={multi.loadError}
history={multi.history} clicks={multi.clicks}
elapsed={fmt(multi.elapsed)}
countdown={multi.countdown}
onNavigate={multi.navigate}
onRetry={multi.retryLoad}
onNextRound={handlers.handleNextRound}
onResetGame={handlers.handleResetGame}
/>
);
return null;
}
+8 -68
View File
@@ -5,14 +5,8 @@ import { useSoloGame } from "../lib/useSoloGame";
import { useMultiGame } from "../lib/useMultiGame"; import { useMultiGame } from "../lib/useMultiGame";
import { useGameEffects } from "../lib/useGameEffects"; import { useGameEffects } from "../lib/useGameEffects";
import { useGameHandlers } from "../lib/useGameHandlers"; import { useGameHandlers } from "../lib/useGameHandlers";
import { fmt } from "../lib/utils"; import { ScreenRouter } from "./components/ScreenRouter";
import type { Screen } from "../lib/types"; import type { Screen } from "../lib/types";
import { HomeScreen } from "./components/HomeScreen";
import { LobbyScreen } from "./components/LobbyScreen";
import { SoloScreen } from "./components/SoloScreen";
import { GameScreen } from "./components/GameScreen";
import { AuthModal } from "./components/AuthModal";
import { ProfileScreen } from "./components/ProfileScreen";
export default function WikiRush() { export default function WikiRush() {
const [screen, setScreen] = useState<Screen>("home"); const [screen, setScreen] = useState<Screen>("home");
@@ -28,68 +22,14 @@ export default function WikiRush() {
const { session } = useGameEffects({ solo, multi, screen, setScreen, setPlayerName }); const { session } = useGameEffects({ solo, multi, screen, setScreen, setPlayerName });
const handlers = useGameHandlers({ solo, multi, playerName, joinCode, setScreen, setError, setLoading }); const handlers = useGameHandlers({ solo, multi, playerName, joinCode, setScreen, setError, setLoading });
if (screen === "profile") return ( return (
<ProfileScreen userName={session?.user?.name ?? "Joueur"} onBack={() => setScreen("home")} /> <ScreenRouter
); screen={screen} setScreen={setScreen} session={session}
solo={solo} multi={multi} handlers={handlers}
if (screen === "home") return ( playerName={playerName} setPlayerName={setPlayerName}
<> joinCode={joinCode} setJoinCode={setJoinCode}
<HomeScreen
playerName={playerName} setPlayerName={setPlayerName}
joinCode={joinCode} setJoinCode={setJoinCode}
error={error} setError={setError} loading={loading}
onCreateRoom={handlers.handleCreateRoom}
onJoinRoom={handlers.handleJoinRoom}
onSolo={handlers.handleSolo}
session={session}
onShowAuth={() => setShowAuth(true)}
onShowProfile={() => setScreen("profile")}
/>
{showAuth && <AuthModal onClose={() => setShowAuth(false)} onSuccess={() => setShowAuth(false)} />}
</>
);
if (screen === "solo") return (
<SoloScreen
phase={solo.phase} puzzle={solo.puzzle}
html={solo.html} title={solo.title}
loading={solo.loading} loadError={solo.loadError}
history={solo.history} clicks={solo.clicks}
elapsedDisplay={fmt(solo.elapsed)}
canGoBack={solo.canGoBack}
onStart={solo.start}
onNavigate={solo.navigate}
onBack={solo.goBack}
onQuit={() => { solo.reset(); setScreen("home"); }}
onNewGame={solo.start}
onRetry={solo.retryLoad}
/>
);
if (screen === "lobby" && multi.room && multi.playerId) return (
<LobbyScreen
room={multi.room} playerId={multi.playerId}
error={error} setError={setError} loading={loading} error={error} setError={setError} loading={loading}
onLeave={handlers.handleLeave} showAuth={showAuth} setShowAuth={setShowAuth}
onStart={handlers.handleStartGame}
onReset={handlers.handleResetGame}
/> />
); );
if (screen === "game" && multi.room && multi.playerId) return (
<GameScreen
room={multi.room} playerId={multi.playerId}
html={multi.html} title={multi.title}
loading={multi.loading} loadError={multi.loadError}
history={multi.history} clicks={multi.clicks}
elapsed={fmt(multi.elapsed)}
countdown={multi.countdown}
onNavigate={multi.navigate}
onRetry={multi.retryLoad}
onNextRound={handlers.handleNextRound}
onResetGame={handlers.handleResetGame}
/>
);
return null;
} }