"use client"; import { useAtomValue } from "jotai"; import { Menu, User } from "lucide-react"; import { AnimatePresence, motion } from "motion/react"; import { useTranslations } from "next-intl"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { updateUserMutationAtom } from "@/atoms/user/user-mutation.atoms"; import { currentUserAtom } from "@/atoms/user/user-query.atoms"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Spinner } from "@/components/ui/spinner"; interface ProfileContentProps { onMenuClick: () => void; } function AvatarDisplay({ url, fallback }: { url?: string; fallback: string }) { const [hasError, setHasError] = useState(false); useEffect(() => { setHasError(false); }, [url]); if (url && !hasError) { return ( Avatar setHasError(true)} /> ); } return (
{fallback}
); } export function ProfileContent({ onMenuClick }: ProfileContentProps) { const t = useTranslations("userSettings"); const { data: user, isLoading: isUserLoading } = useAtomValue(currentUserAtom); const { mutateAsync: updateUser, isPending } = useAtomValue(updateUserMutationAtom); const [displayName, setDisplayName] = useState(""); useEffect(() => { if (user) { setDisplayName(user.display_name || ""); } }, [user]); const getInitials = (email: string) => { const name = email.split("@")[0]; return name.slice(0, 2).toUpperCase(); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { await updateUser({ display_name: displayName || null, }); toast.success(t("profile_saved")); } catch { toast.error(t("profile_save_error")); } }; const hasChanges = displayName !== (user?.display_name || ""); return (

{t("profile_title")}

{t("profile_description")}

{isUserLoading ? (
) : (
setDisplayName(e.target.value)} />

{t("profile_display_name_hint")}

)}
); }