Files
WikiRush/lib/useGameHandlers.ts
T

86 lines
2.4 KiB
TypeScript
Raw Normal View History

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;
maxPlayers: number;
totalRounds: number;
gameMode: "race" | "all_finish";
setScreen: Dispatch<SetStateAction<Screen>>;
setError: Dispatch<SetStateAction<string | null>>;
setLoading: Dispatch<SetStateAction<boolean>>;
};
export function useGameHandlers({
solo, multi, playerName, joinCode, maxPlayers, totalRounds, gameMode, setScreen, setError, setLoading,
}: Handlers) {
async function handleCreateRoom() {
if (!playerName.trim()) { setError("Entre ton pseudo !"); return; }
setLoading(true); setError(null);
const { error: err } = await multi.createRoom(playerName.trim(), maxPlayers, totalRounds, gameMode);
setLoading(false);
if (err) { setError(err); return; }
setScreen("lobby");
}
async function handleJoinRoom() {
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());
setLoading(false);
if (err) { setError(err); return; }
setScreen("lobby");
}
async function handleStartGame() {
setLoading(true); setError(null);
const { error: err } = await multi.startGame();
setLoading(false);
if (err) setError(err);
}
async function handleNextRound() {
await multi.nextRound();
// On reste sur "game" — le GameScreen affiche le lobby quand phase === "waiting"
}
async function handleResetGame() {
await multi.resetGame();
// On reste sur "game" — le GameScreen affiche le lobby quand phase === "waiting"
}
function handleLeave() {
multi.leave();
setScreen("home");
}
function handleSolo() {
solo.reset();
setScreen("solo");
}
async function handleSurrender() {
await multi.surrender();
}
return {
handleCreateRoom,
handleJoinRoom,
handleStartGame,
handleNextRound,
handleResetGame,
handleLeave,
handleSolo,
handleSurrender,
};
}