"use client"; import { useRouter } from "next/navigation"; import { useState, type FormEvent } from "react"; import { createClient } from "@/lib/supabase/client"; import { Avatar } from "@/components/avatar"; import { AvatarPicker } from "@/components/avatar-picker"; function mapError(message: string): string { if (message.includes("duplicate key")) { return "Ce pseudo est déjà pris."; } if (message.includes("pseudo is locked")) { return "Ton pseudo est déjà figé, contacte un Archonte."; } return "Une erreur est survenue, réessaie."; } export function ProfileForm({ userId, isJudge, initialPseudo, initialAvatarUrl, initialPseudoLocked, }: { userId: string; isJudge: boolean; initialPseudo: string; initialAvatarUrl: string | null; initialPseudoLocked: boolean; }) { const router = useRouter(); const [pseudo, setPseudo] = useState(initialPseudo); const [pseudoLocked, setPseudoLocked] = useState(initialPseudoLocked); const [avatarUrl, setAvatarUrl] = useState(initialAvatarUrl); const [avatarBlob, setAvatarBlob] = useState(null); const [avatarPreview, setAvatarPreview] = useState(null); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const [loading, setLoading] = useState(false); const pseudoChanged = pseudo.trim() !== initialPseudo; const canEditPseudo = !pseudoLocked || isJudge; function handleCropped(blob: Blob) { setAvatarBlob(blob); setAvatarPreview(URL.createObjectURL(blob)); } async function handleSubmit(event: FormEvent) { event.preventDefault(); setError(null); setSuccess(false); const trimmedPseudo = pseudo.trim(); if (!trimmedPseudo) { setError("Choisis un pseudo valide."); return; } setLoading(true); const supabase = createClient(); let nextAvatarUrl = avatarUrl; if (avatarBlob) { const path = `${userId}.webp`; const { error: uploadError } = await supabase.storage .from("avatars") .upload(path, avatarBlob, { upsert: true, contentType: "image/webp" }); if (uploadError) { setLoading(false); setError("Impossible d'envoyer la photo, réessaie."); return; } const { data: publicUrlData } = supabase.storage.from("avatars").getPublicUrl(path); nextAvatarUrl = `${publicUrlData.publicUrl}?t=${Date.now()}`; } const { error: updateError } = await supabase .from("profiles") .update({ pseudo: trimmedPseudo, avatar_url: nextAvatarUrl }) .eq("id", userId); setLoading(false); if (updateError) { setError(mapError(updateError.message)); return; } setAvatarUrl(nextAvatarUrl); setAvatarBlob(null); setAvatarPreview(null); setSuccess(true); if (pseudoChanged && !isJudge) { setPseudoLocked(true); } router.refresh(); } return (
setPseudo(event.target.value)} className="rounded-md border border-gold/30 bg-white/50 px-3 py-2 text-text-marble outline-none focus:border-gold disabled:bg-gold/5 disabled:text-text-mut" /> {!canEditPseudo && (

Pseudo figé — contacte un Archonte pour le changer.

)}
{error && (

{error}

)} {success &&

Profil mis à jour.

}
); }