import type { UserRecord } from "@issue/shared"; import type { ReactNode } from "react"; import { useEffect, useState } from "react"; 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 { user } from "@/lib/server"; function AccountDialog({ onUpdate, trigger }: { onUpdate?: () => void; trigger?: ReactNode }) { 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); const [userId, setUserId] = useState(null); useEffect(() => { if (!open) return; const userStr = localStorage.getItem("user"); if (userStr) { const user = JSON.parse(userStr) as UserRecord; setName(user.name); setUsername(user.username); setUserId(user.id); setAvatarUrl(user.avatarURL || null); } setPassword(""); setError(""); setSubmitAttempted(false); }, [open]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSubmitAttempted(true); if (name.trim() === "") { return; } if (!userId) { setError("User not found"); return; } await user.update({ id: userId, name: name.trim(), password: password.trim(), avatarURL, onSuccess: (data) => { setError(""); localStorage.setItem("user", JSON.stringify(data)); setPassword(""); onUpdate?.(); setOpen(false); }, onError: (errorMessage) => { setError(errorMessage); }, }); }; 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;