import type { ServiceUserUserInfoData } from '@/client'; import { useForm } from '@tanstack/react-form'; import { 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 { useUpdateUser } from '@/hooks/data/useUpdateUser'; import { Switch } from '../ui/switch'; const formSchema = z.object({ username: z.string().min(5), nickname: z.string(), subtitle: z.string(), avatar: z.url().or(z.literal('')), allow_public: z.boolean(), }); export function EditProfileDialog({ user }: { user: ServiceUserUserInfoData }) { const { mutateAsync } = useUpdateUser(); 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 mutateAsync({ body: value }); toast.success('个人资料更新成功'); } catch (error) { console.error('Form submission error', error); toast.error('更新个人资料失败,请重试'); } }, }); const [open, setOpen] = useState(false); if (!open) { setTimeout(() => { form.reset(); }, 200); } 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]} children={([canSubmit]) => ( )} />
); }