2026-04-10 16:47:13 +02:00
|
|
|
"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";
|
2026-04-10 17:30:13 +02:00
|
|
|
import { LeaderboardScreen } from "./LeaderboardScreen";
|
2026-04-10 21:41:49 +02:00
|
|
|
import { DailyScreen } from "./DailyScreen";
|
|
|
|
|
import { BlitzScreen } from "./BlitzScreen";
|
2026-04-10 16:47:13 +02:00
|
|
|
|
|
|
|
|
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>>;
|
2026-04-11 13:47:05 +02:00
|
|
|
maxPlayers: number;
|
|
|
|
|
setMaxPlayers: Dispatch<SetStateAction<number>>;
|
|
|
|
|
totalRounds: number;
|
|
|
|
|
setTotalRounds: Dispatch<SetStateAction<number>>;
|
2026-04-11 21:58:35 +02:00
|
|
|
gameMode: "race" | "all_finish";
|
|
|
|
|
setGameMode: Dispatch<SetStateAction<"race" | "all_finish">>;
|
2026-04-10 16:47:13 +02:00
|
|
|
error: string | null;
|
|
|
|
|
setError: Dispatch<SetStateAction<string | null>>;
|
|
|
|
|
loading: boolean;
|
|
|
|
|
showAuth: boolean;
|
|
|
|
|
setShowAuth: Dispatch<SetStateAction<boolean>>;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function ScreenRouter({
|
2026-04-11 22:25:34 +02:00
|
|
|
screen,
|
|
|
|
|
setScreen,
|
|
|
|
|
session,
|
|
|
|
|
solo,
|
|
|
|
|
multi,
|
|
|
|
|
handlers,
|
|
|
|
|
playerName,
|
|
|
|
|
setPlayerName,
|
|
|
|
|
joinCode,
|
|
|
|
|
setJoinCode,
|
|
|
|
|
maxPlayers,
|
|
|
|
|
setMaxPlayers,
|
|
|
|
|
totalRounds,
|
|
|
|
|
setTotalRounds,
|
|
|
|
|
gameMode,
|
|
|
|
|
setGameMode,
|
|
|
|
|
error,
|
|
|
|
|
setError,
|
|
|
|
|
loading,
|
|
|
|
|
showAuth,
|
|
|
|
|
setShowAuth,
|
2026-04-10 16:47:13 +02:00
|
|
|
}: Props) {
|
2026-04-11 22:25:34 +02:00
|
|
|
if (screen === "profile")
|
|
|
|
|
return (
|
|
|
|
|
<ProfileScreen
|
|
|
|
|
userName={session?.user?.name ?? "Joueur"}
|
|
|
|
|
onBack={() => setScreen("home")}
|
|
|
|
|
/>
|
|
|
|
|
);
|
2026-04-10 16:47:13 +02:00
|
|
|
|
2026-04-11 22:25:34 +02:00
|
|
|
if (screen === "leaderboard")
|
|
|
|
|
return <LeaderboardScreen onBack={() => setScreen("home")} />;
|
2026-04-10 17:30:13 +02:00
|
|
|
|
2026-04-11 22:25:34 +02:00
|
|
|
if (screen === "daily")
|
|
|
|
|
return (
|
|
|
|
|
<DailyScreen
|
|
|
|
|
onBack={() => setScreen("home")}
|
|
|
|
|
currentUserId={session?.user?.id ?? undefined}
|
|
|
|
|
/>
|
|
|
|
|
);
|
2026-04-10 21:41:49 +02:00
|
|
|
|
2026-04-11 22:25:34 +02:00
|
|
|
if (screen === "blitz")
|
|
|
|
|
return <BlitzScreen onBack={() => setScreen("home")} />;
|
2026-04-10 21:41:49 +02:00
|
|
|
|
2026-04-11 22:25:34 +02:00
|
|
|
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")}
|
|
|
|
|
onShowLeaderboard={() => setScreen("leaderboard")}
|
|
|
|
|
onDaily={() => setScreen("daily")}
|
|
|
|
|
onBlitz={() => setScreen("blitz")}
|
|
|
|
|
/>
|
|
|
|
|
{showAuth && (
|
|
|
|
|
<AuthModal
|
|
|
|
|
onClose={() => setShowAuth(false)}
|
|
|
|
|
onSuccess={() => setShowAuth(false)}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
);
|
2026-04-10 16:47:13 +02:00
|
|
|
|
2026-04-11 22:25:34 +02:00
|
|
|
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}
|
|
|
|
|
/>
|
|
|
|
|
);
|
2026-04-10 16:47:13 +02:00
|
|
|
|
2026-04-11 22:25:34 +02:00
|
|
|
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}
|
|
|
|
|
maxPlayers={maxPlayers}
|
|
|
|
|
setMaxPlayers={setMaxPlayers}
|
|
|
|
|
totalRounds={totalRounds}
|
|
|
|
|
setTotalRounds={setTotalRounds}
|
|
|
|
|
gameMode={gameMode}
|
|
|
|
|
setGameMode={setGameMode}
|
2026-04-12 23:59:40 +02:00
|
|
|
onSetGameMode={(v) => multi.setGameMode(v)}
|
2026-04-11 22:25:34 +02:00
|
|
|
onSetSearchAllowed={(v) => multi.setSearchAllowed(v)}
|
2026-04-11 22:41:40 +02:00
|
|
|
onSetTimeLimit={(v) => multi.setTimeLimit(v)}
|
2026-04-11 22:25:34 +02:00
|
|
|
/>
|
|
|
|
|
);
|
2026-04-10 16:47:13 +02:00
|
|
|
|
2026-04-11 22:25:34 +02:00
|
|
|
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}
|
2026-04-11 22:41:40 +02:00
|
|
|
timeLeft={multi.timeLeft}
|
2026-04-11 22:25:34 +02:00
|
|
|
onNavigate={multi.navigate}
|
2026-04-11 22:30:47 +02:00
|
|
|
onGoBack={multi.goBack}
|
|
|
|
|
canGoBack={multi.canGoBack}
|
2026-04-11 22:25:34 +02:00
|
|
|
onRetry={multi.retryLoad}
|
|
|
|
|
onNextRound={handlers.handleNextRound}
|
2026-04-13 00:20:17 +02:00
|
|
|
onStartGame={handlers.handleStartGame}
|
2026-04-11 22:25:34 +02:00
|
|
|
onResetGame={handlers.handleResetGame}
|
|
|
|
|
onSurrender={handlers.handleSurrender}
|
|
|
|
|
/>
|
|
|
|
|
);
|
2026-04-10 16:47:13 +02:00
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|