import type { ServiceUserUserInfoData } from '@/client'; import { useForm } from '@tanstack/react-form'; import { Loader2 } from 'lucide-react'; import { useEffect, useState, } from 'react'; import { toast } from 'sonner'; import z from 'zod'; import { Button } from '@/components/ui/button'; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; import { Field, FieldError, FieldLabel, } from '@/components/ui/field'; import { Input, } from '@/components/ui/input'; import { Switch } from '../ui/switch'; const formSchema = z.object({ username: z.string().min(5, '用户名长度至少为5个字符'), nickname: z.string().nonempty('昵称不能为空'), subtitle: z.string(), avatar: z.string().url().or(z.literal('')), allow_public: z.boolean(), }); export function EditProfileDialogView({ user, updateProfile }: { user: ServiceUserUserInfoData; updateProfile: (data: ServiceUserUserInfoData) => Promise }) { const form = useForm({ defaultValues: { avatar: user.avatar, username: user.username, nickname: user.nickname, subtitle: user.subtitle, allow_public: user.allow_public, }, validators: { onBlur: formSchema, }, onSubmit: async ({ value, }) => { try { await updateProfile(value); toast.success('个人资料更新成功'); } catch (error) { console.error('Form submission error', error); toast.error('更新个人资料失败,请重试'); } }, }); const [open, setOpen] = useState(false); useEffect(() => { if (!open) { const id = setTimeout(() => { form.reset(); }, 200); return () => clearTimeout(id); } }, [open, form]); return (
{ e.preventDefault(); e.stopPropagation(); void form.handleSubmit().then(() => setOpen(false)); }} className="grid gap-4" > 编辑个人资料 {field => ( 用户名 field.handleChange(e.target.value)} /> )} {field => ( 昵称 field.handleChange(e.target.value)} /> )} {field => ( 副标题 field.handleChange(e.target.value)} /> )} {field => ( 头像链接 field.handleChange(e.target.value)} /> )} {field => ( 公开个人资料 field.handleChange(e)} defaultChecked={user.allow_public} /> )} [state.canSubmit, state.isSubmitting]} children={([canSubmit, isSubmitting]) => ( )} />
); }