"use client"; import { useState, useEffect, useRef } from "react"; import { useParams, useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ArrowLeft, Mic, MicOff } from "lucide-react"; import Link from "next/link"; import { useGameSocket } from "@/hooks/use-game-socket"; import "../../styles/background-pattern.css"; interface Player { id: number; name: string; avatar: string; isReady: boolean; isSpeaking: boolean; } interface GameState { id: number; status: "PLAYING" | "FINISHED"; players: Player[]; currentRound: number; totalRounds: number; currentSpeaker?: Player; imposteur?: Player; } export default function GamePage() { const params = useParams(); const router = useRouter(); const [gameState, setGameState] = useState(null); const [isMuted, setIsMuted] = useState(true); const [currentUserId, setCurrentUserId] = useState(null); const audioRef = useRef(null); const { startCall, handleIncomingAudio, socket } = useGameSocket( params.inviteCode as string ); useEffect(() => { // Récupérer l'ID de l'utilisateur depuis les cookies const userId = document.cookie.match(/userId=(\d+)/)?.[1]; if (!userId) { router.push("/"); return; } setCurrentUserId(parseInt(userId)); // Récupérer l'état initial du jeu fetchGameState(); }, []); const fetchGameState = async () => { try { const response = await fetch(`/api/group/${params.inviteCode}`); if (!response.ok) throw new Error("Erreur lors de la récupération du jeu"); const data = await response.json(); setGameState(data); } catch (error) { console.error("Erreur:", error); alert("Impossible de récupérer l'état du jeu"); } }; const toggleMicrophone = async () => { try { if (isMuted) { const stream = await navigator.mediaDevices.getUserMedia({ audio: true, }); await startCall(stream); } else { // Arrêter le flux audio const audioTracks = audioRef.current?.srcObject as MediaStream; audioTracks?.getTracks().forEach((track) => track.stop()); } setIsMuted(!isMuted); } catch (error) { console.error("Erreur lors de l'accès au microphone:", error); alert("Impossible d'accéder au microphone"); } }; useEffect(() => { if (!socket) return; // Gérer les événements de jeu socket.on("gameStateUpdate", (newState: GameState) => { setGameState(newState); }); // Gérer l'audio entrant handleIncomingAudio((stream) => { if (audioRef.current) { audioRef.current.srcObject = stream; audioRef.current.play().catch(console.error); } }); return () => { socket.off("gameStateUpdate"); }; }, [socket]); if (!gameState) { return (
Chargement...
); } const currentPlayer = currentUserId ? gameState.players.find((p) => p.id === currentUserId) : null; const isImposteur = currentPlayer?.id === gameState.imposteur?.id; return (
); }