2026-04-10 16:44:24 +02:00
|
|
|
import { Dispatch, SetStateAction } from "react";
|
|
|
|
|
import type { Screen } from "./types";
|
|
|
|
|
import type { useSoloGame } from "./useSoloGame";
|
|
|
|
|
import type { useMultiGame } from "./useMultiGame";
|
|
|
|
|
|
|
|
|
|
type UseSoloGame = ReturnType<typeof useSoloGame>;
|
|
|
|
|
type UseMultiGame = ReturnType<typeof useMultiGame>;
|
|
|
|
|
|
|
|
|
|
type Handlers = {
|
|
|
|
|
solo: UseSoloGame;
|
|
|
|
|
multi: UseMultiGame;
|
|
|
|
|
playerName: string;
|
|
|
|
|
joinCode: string;
|
2026-04-11 13:47:05 +02:00
|
|
|
maxPlayers: number;
|
|
|
|
|
totalRounds: number;
|
2026-04-11 21:58:35 +02:00
|
|
|
gameMode: "race" | "all_finish";
|
2026-04-10 16:44:24 +02:00
|
|
|
setScreen: Dispatch<SetStateAction<Screen>>;
|
|
|
|
|
setError: Dispatch<SetStateAction<string | null>>;
|
|
|
|
|
setLoading: Dispatch<SetStateAction<boolean>>;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export function useGameHandlers({
|
2026-04-11 22:25:34 +02:00
|
|
|
solo,
|
|
|
|
|
multi,
|
|
|
|
|
playerName,
|
|
|
|
|
joinCode,
|
|
|
|
|
maxPlayers,
|
|
|
|
|
totalRounds,
|
|
|
|
|
gameMode,
|
|
|
|
|
setScreen,
|
|
|
|
|
setError,
|
|
|
|
|
setLoading,
|
2026-04-10 16:44:24 +02:00
|
|
|
}: Handlers) {
|
|
|
|
|
async function handleCreateRoom() {
|
2026-04-11 22:25:34 +02:00
|
|
|
if (!playerName.trim()) {
|
|
|
|
|
setError("Entre ton pseudo !");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
setLoading(true);
|
|
|
|
|
setError(null);
|
|
|
|
|
const { error: err } = await multi.createRoom(
|
|
|
|
|
playerName.trim(),
|
|
|
|
|
maxPlayers,
|
|
|
|
|
totalRounds,
|
|
|
|
|
gameMode,
|
|
|
|
|
);
|
2026-04-10 16:44:24 +02:00
|
|
|
setLoading(false);
|
2026-04-11 22:25:34 +02:00
|
|
|
if (err) {
|
|
|
|
|
setError(err);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-10 16:44:24 +02:00
|
|
|
setScreen("lobby");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function handleJoinRoom() {
|
2026-04-11 22:25:34 +02:00
|
|
|
if (!playerName.trim()) {
|
|
|
|
|
setError("Entre ton pseudo !");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (joinCode.trim().length !== 4) {
|
|
|
|
|
setError("Le code doit faire 4 lettres");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
setLoading(true);
|
|
|
|
|
setError(null);
|
|
|
|
|
const { error: err } = await multi.joinRoom(
|
|
|
|
|
playerName.trim(),
|
|
|
|
|
joinCode.trim().toUpperCase(),
|
|
|
|
|
);
|
2026-04-10 16:44:24 +02:00
|
|
|
setLoading(false);
|
2026-04-11 22:25:34 +02:00
|
|
|
if (err) {
|
|
|
|
|
setError(err);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-04-10 16:44:24 +02:00
|
|
|
setScreen("lobby");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function handleStartGame() {
|
2026-04-11 22:25:34 +02:00
|
|
|
setLoading(true);
|
|
|
|
|
setError(null);
|
2026-04-10 16:44:24 +02:00
|
|
|
const { error: err } = await multi.startGame();
|
|
|
|
|
setLoading(false);
|
|
|
|
|
if (err) setError(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function handleNextRound() {
|
|
|
|
|
await multi.nextRound();
|
2026-04-11 22:25:34 +02:00
|
|
|
// On reste sur "game" - le GameScreen affiche le lobby quand phase === "waiting"
|
2026-04-10 16:44:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function handleResetGame() {
|
|
|
|
|
await multi.resetGame();
|
2026-04-11 22:25:34 +02:00
|
|
|
// On reste sur "game" - le GameScreen affiche le lobby quand phase === "waiting"
|
2026-04-10 16:44:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleLeave() {
|
|
|
|
|
multi.leave();
|
|
|
|
|
setScreen("home");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleSolo() {
|
|
|
|
|
solo.reset();
|
|
|
|
|
setScreen("solo");
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-11 21:58:35 +02:00
|
|
|
async function handleSurrender() {
|
|
|
|
|
await multi.surrender();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-10 16:44:24 +02:00
|
|
|
return {
|
|
|
|
|
handleCreateRoom,
|
|
|
|
|
handleJoinRoom,
|
|
|
|
|
handleStartGame,
|
|
|
|
|
handleNextRound,
|
|
|
|
|
handleResetGame,
|
|
|
|
|
handleLeave,
|
|
|
|
|
handleSolo,
|
2026-04-11 21:58:35 +02:00
|
|
|
handleSurrender,
|
2026-04-10 16:44:24 +02:00
|
|
|
};
|
|
|
|
|
}
|