"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { AlertTriangle, Laptop, Loader2, Moon, Palette, Save, Settings, Sun, Trash2, User as UserIcon, } from "lucide-react"; import { useRouter } from "next/navigation"; import { useTheme } from "next-themes"; import * as React from "react"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import * as z from "zod"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { Spinner } from "@/components/ui/spinner"; import { Textarea } from "@/components/ui/textarea"; import { useAuth } from "@/providers/auth-provider"; import { UserService } from "@/services/user.service"; const settingsSchema = z.object({ displayName: z.string().max(32, "Le nom d'affichage est trop long").optional(), bio: z.string().max(255, "La bio est trop longue").optional(), }); type SettingsFormValues = z.infer; export default function SettingsPage() { const { theme, setTheme } = useTheme(); const { user, isLoading, refreshUser, logout } = useAuth(); const router = useRouter(); const [isSaving, setIsSaving] = React.useState(false); const [isDeleting, setIsDeleting] = React.useState(false); const [mounted, setMounted] = React.useState(false); React.useEffect(() => { setMounted(true); }, []); const form = useForm({ resolver: zodResolver(settingsSchema), defaultValues: { displayName: "", bio: "", }, }); React.useEffect(() => { if (user) { form.reset({ displayName: user.displayName || "", bio: user.bio || "", }); } }, [user, form]); if (isLoading) { return (
); } if (!user) { return (
Accès refusé Vous devez être connecté pour accéder aux paramètres.
); } const onSubmit = async (values: SettingsFormValues) => { setIsSaving(true); try { await UserService.updateMe(values); toast.success("Paramètres mis à jour !"); await refreshUser(); } catch (error) { console.error(error); toast.error("Erreur lors de la mise à jour des paramètres."); } finally { setIsSaving(false); } }; const handleDeleteAccount = async () => { setIsDeleting(true); try { await UserService.removeMe(); toast.success("Votre compte a été supprimé."); logout(); router.push("/"); } catch (error) { console.error(error); toast.error("Erreur lors de la suppression du compte."); } finally { setIsDeleting(false); } }; return (

Paramètres

Informations personnelles
Mettez à jour vos informations publiques. Ces données seront visibles par les autres utilisateurs.
Nom d'utilisateur Identifiant unique non modifiable. ( Nom d'affichage Nom visible sur votre profil. )} />
( Bio