"use client"; import { useState, useRef } from "react"; import { useParams, useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { ArrowLeft, Mic, MicOff, RefreshCcw } from "lucide-react"; import Link from "next/link"; import "../../styles/background-pattern.css"; const avatars = [ "/avatar1.png", "/avatar2.png", "/avatar3.png", "/avatar4.png", "/avatar5.png", ]; export default function JoinGroup() { const params = useParams(); const router = useRouter(); const [userName, setUserName] = useState(""); const [isRecording, setIsRecording] = useState(false); const [audioBlob, setAudioBlob] = useState(null); const [isLoading, setIsLoading] = useState(false); const [avatarIndex, setAvatarIndex] = useState(0); const mediaRecorder = useRef(null); const audioChunks = useRef([]); const startRecording = async () => { try { const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); mediaRecorder.current = new MediaRecorder(stream); audioChunks.current = []; mediaRecorder.current.ondataavailable = (event) => { audioChunks.current.push(event.data); }; mediaRecorder.current.onstop = () => { const audioBlob = new Blob(audioChunks.current, { type: "audio/wav" }); setAudioBlob(audioBlob); }; mediaRecorder.current.start(); setIsRecording(true); } catch (error) { console.error("Erreur lors de l'accès au microphone:", error); alert("Impossible d'accéder au microphone"); } }; const stopRecording = () => { if (mediaRecorder.current && isRecording) { mediaRecorder.current.stop(); setIsRecording(false); mediaRecorder.current.stream.getTracks().forEach((track) => track.stop()); } }; const changeAvatar = () => { setAvatarIndex((prevIndex) => (prevIndex + 1) % avatars.length); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!userName.trim() || !audioBlob) { alert("Veuillez entrer votre nom et enregistrer votre voix"); return; } setIsLoading(true); try { const formData = new FormData(); formData.append("audio", audioBlob); formData.append("name", userName); formData.append("avatar", avatars[avatarIndex]); const voiceResponse = await fetch("/api/voice", { method: "POST", body: formData, }); if (!voiceResponse.ok) throw new Error("Erreur lors de l'upload de la voix"); const userData = await voiceResponse.json(); const expirationDate = new Date(); expirationDate.setDate(expirationDate.getDate() + 30); document.cookie = `userId=${ userData.id };expires=${expirationDate.toUTCString()};path=/`; document.cookie = `userName=${encodeURIComponent( userName )};expires=${expirationDate.toUTCString()};path=/`; document.cookie = `userAvatar=${encodeURIComponent( avatars[avatarIndex] )};expires=${expirationDate.toUTCString()};path=/`; const joinResponse = await fetch(`/api/group/${params.inviteCode}/join`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ userId: userData.id, userName, avatar: avatars[avatarIndex], }), }); if (!joinResponse.ok) throw new Error("Erreur lors de la jointure au groupe"); router.push(`/group/${params.inviteCode}`); } catch (error) { console.error("Erreur:", error); alert("Une erreur est survenue lors de la jointure au groupe"); } finally { setIsLoading(false); } }; return (

Rejoindre la partie

AV
setUserName(e.target.value)} className="bg-orange-50 text-orange-800 placeholder-orange-300 border-orange-200 focus:border-orange-400 focus:ring-orange-400" placeholder="Entrez votre pseudo" required />
{audioBlob && !isRecording && (
✓ Voix enregistrée
)}
); }