"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { AlertTriangle, Download, Laptop, Loader2, Moon, Palette, Save, Settings, Shield, 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 { TwoFactorSetup } from "@/components/two-factor-setup"; 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 { Switch } from "@/components/ui/switch"; 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(), showOnlineStatus: z.boolean(), showReadReceipts: z.boolean(), }); 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 [isExporting, setIsExporting] = React.useState(false); const [mounted, setMounted] = React.useState(false); React.useEffect(() => { setMounted(true); }, []); const form = useForm({ resolver: zodResolver(settingsSchema), defaultValues: { displayName: "", bio: "", showOnlineStatus: true, showReadReceipts: true, }, }); React.useEffect(() => { if (user) { form.reset({ displayName: user.displayName || "", bio: user.bio || "", showOnlineStatus: user.showOnlineStatus ?? true, showReadReceipts: user.showReadReceipts ?? true, }); } }, [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); } }; const handleExportData = async () => { setIsExporting(true); try { const data = await UserService.exportData(); const blob = new Blob([JSON.stringify(data, null, 2)], { type: "application/json", }); const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.setAttribute("download", `memegoat-data-${user?.username}.json`); document.body.appendChild(link); link.click(); link.remove(); toast.success("Vos données ont été exportées avec succès."); } catch (error) { console.error(error); toast.error("Erreur lors de l'exportation des données."); } finally { setIsExporting(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