'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { useMutation } from '@tanstack/react-query'; import Link from 'next/link'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { InlineMessage } from '@/components/feedback/inline-message'; import { AppCard } from '@/components/ui/app-card'; import { sendPasswordResetEmail } from '@/features/auth/api/auth'; import { AuthButton, AuthFormField, AuthInput, } from '@/features/auth/components/auth-form-primitives'; import { PublicAuthGuard } from '@/features/auth/components/public-auth-guard'; const resetRequestSchema = z.object({ email: z.string().email('请输入有效邮箱地址'), }); type ResetRequestFormValues = z.infer; export function PasswordResetRequestForm() { const [message, setMessage] = useState<{ tone: 'success' | 'danger' | 'info'; text: string; } | null>(null); const form = useForm({ resolver: zodResolver(resetRequestSchema), defaultValues: { email: '' }, }); const mutation = useMutation({ mutationFn: (values: ResetRequestFormValues) => sendPasswordResetEmail(values.email), onSuccess: () => { setMessage({ tone: 'success', text: '重置邮件发送成功,请检查邮箱。' }); form.reset(); }, onError: (error: Error) => { setMessage({ tone: 'danger', text: error.message || '重置邮件发送失败,请稍后重试。', }); }, }); const handleSubmit = form.handleSubmit((values) => { setMessage(null); mutation.mutate(values); }); return (
{form.formState.errors.email ? ( {form.formState.errors.email.message} ) : null} {message ? ( ) : null} {mutation.isPending ? '提交中...' : '发送重置邮件'}
想起密码了? 返回登录
); }