import type { ReactNode } from "react"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { useAuthenticatedSession } from "@/components/session-provider"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Field } from "@/components/ui/field"; import { Label } from "@/components/ui/label"; import { UploadAvatar } from "@/components/upload-avatar"; import { parseError, user } from "@/lib/server"; function AccountDialog({ trigger }: { trigger?: ReactNode }) { const { user: currentUser, setUser } = useAuthenticatedSession(); const [open, setOpen] = useState(false); const [name, setName] = useState(""); const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [avatarURL, setAvatarUrl] = useState(null); const [error, setError] = useState(""); const [submitAttempted, setSubmitAttempted] = useState(false); useEffect(() => { if (!open) return; setName(currentUser.name); setUsername(currentUser.username); setAvatarUrl(currentUser.avatarURL || null); setPassword(""); setError(""); setSubmitAttempted(false); }, [open, currentUser]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSubmitAttempted(true); if (name.trim() === "") { return; } await user.update({ name: name.trim(), password: password.trim() || undefined, avatarURL, onSuccess: (data) => { setError(""); setUser(data); setPassword(""); setOpen(false); toast.success(`Account updated successfully`, { dismissible: false, }); }, onError: (err) => { const message = parseError(err); setError(message); toast.error(`Error updating account: ${message}`, { dismissible: false, }); }, }); }; return ( {trigger || ( )} Account
{avatarURL && ( )} setName(e.target.value)} validate={(v) => (v.trim() === "" ? "Cannot be empty" : undefined)} submitAttempted={submitAttempted} /> setPassword(e.target.value)} placeholder="Leave empty to keep current password" hidden={true} /> {error !== "" && }
); } export default AccountDialog;