fix(multi): sync game mode changes to server in lobby

This commit is contained in:
jessy-david-dev
2026-04-12 23:59:40 +02:00
parent 064ddda23a
commit 169f71c67d
4 changed files with 29 additions and 2 deletions
+14 -1
View File
@@ -127,7 +127,7 @@ export async function PATCH(
article?: string; article?: string;
startArticle?: string; startArticle?: string;
targetArticle?: string; targetArticle?: string;
value?: boolean; value?: boolean | number | string;
}; };
// Nettoyer les joueurs inactifs uniquement hors partie (lobby/résultats) // Nettoyer les joueurs inactifs uniquement hors partie (lobby/résultats)
@@ -351,6 +351,19 @@ export async function PATCH(
return Response.json({ room }); return Response.json({ room });
} }
// Hôte change le mode de jeu
case "setGameMode": {
const host = room.players.find((p) => p.id === playerId);
if (!host?.isHost) {
return Response.json({ error: "Seul l'hôte peut modifier ce paramètre" }, { status: 403 });
}
if (value === "race" || value === "all_finish") {
room.gameMode = value;
await saveRoom(room);
}
return Response.json({ room });
}
// Hôte change la limite de temps // Hôte change la limite de temps
case "setTimeLimit": { case "setTimeLimit": {
const host = room.players.find((p) => p.id === playerId); const host = room.players.find((p) => p.id === playerId);
+3 -1
View File
@@ -18,6 +18,7 @@ type LobbyScreenProps = {
setTotalRounds: (v: number) => void; setTotalRounds: (v: number) => void;
gameMode: Room["gameMode"]; gameMode: Room["gameMode"];
setGameMode: (v: Room["gameMode"]) => void; setGameMode: (v: Room["gameMode"]) => void;
onSetGameMode: (v: Room["gameMode"]) => void;
onSetSearchAllowed: (v: boolean) => void; onSetSearchAllowed: (v: boolean) => void;
onSetTimeLimit: (v: number) => void; onSetTimeLimit: (v: number) => void;
}; };
@@ -37,6 +38,7 @@ export function LobbyScreen({
setTotalRounds, setTotalRounds,
gameMode, gameMode,
setGameMode, setGameMode,
onSetGameMode,
onSetSearchAllowed, onSetSearchAllowed,
onSetTimeLimit, onSetTimeLimit,
}: LobbyScreenProps) { }: LobbyScreenProps) {
@@ -151,7 +153,7 @@ export function LobbyScreen({
<span className="text-xs text-[#888]">Mode de jeu</span> <span className="text-xs text-[#888]">Mode de jeu</span>
<select <select
value={gameMode} value={gameMode}
onChange={(e) => setGameMode(e.target.value as Room["gameMode"])} onChange={(e) => { const v = e.target.value as Room["gameMode"]; setGameMode(v); onSetGameMode(v); }}
className="w-full min-h-11 px-2 bg-[#0f0f0f] border border-[#2e2e2e] rounded-xl text-sm text-[#f0f0f0] outline-none focus:border-[#7c3aed] cursor-pointer transition-colors" className="w-full min-h-11 px-2 bg-[#0f0f0f] border border-[#2e2e2e] rounded-xl text-sm text-[#f0f0f0] outline-none focus:border-[#7c3aed] cursor-pointer transition-colors"
> >
<option value="race">Course - le premier arrivé gagne</option> <option value="race">Course - le premier arrivé gagne</option>
+1
View File
@@ -158,6 +158,7 @@ export function ScreenRouter({
setTotalRounds={setTotalRounds} setTotalRounds={setTotalRounds}
gameMode={gameMode} gameMode={gameMode}
setGameMode={setGameMode} setGameMode={setGameMode}
onSetGameMode={(v) => multi.setGameMode(v)}
onSetSearchAllowed={(v) => multi.setSearchAllowed(v)} onSetSearchAllowed={(v) => multi.setSearchAllowed(v)}
onSetTimeLimit={(v) => multi.setTimeLimit(v)} onSetTimeLimit={(v) => multi.setTimeLimit(v)}
/> />
+11
View File
@@ -361,6 +361,16 @@ export function useMultiGame() {
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [room, playerId]); }, [room, playerId]);
async function setGameMode(value: "race" | "all_finish") {
if (!room || !playerId) return;
const res = await fetch(`/api/rooms/${room.code}`, {
method: "PATCH",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ action: "setGameMode", playerId, value }),
});
if (res.ok) setRoom((await res.json() as { room: Room }).room);
}
async function setTimeLimit(value: number) { async function setTimeLimit(value: number) {
if (!room || !playerId) return; if (!room || !playerId) return;
const res = await fetch(`/api/rooms/${room.code}`, { const res = await fetch(`/api/rooms/${room.code}`, {
@@ -468,6 +478,7 @@ export function useMultiGame() {
canGoBack: historyRef.current.length > 1, canGoBack: historyRef.current.length > 1,
surrender, surrender,
timeLeft, timeLeft,
setGameMode,
setTimeLimit, setTimeLimit,
setSearchAllowed, setSearchAllowed,
restore, restore,