import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Link, useNavigate } from 'react-router-dom'; import { useAuth } from '@/client/home/hooks/AuthProvider'; import { toast } from 'sonner'; import { authClient } from '@/client/api'; import { Button } from '@/client/components/ui/button'; import { Input } from '@/client/components/ui/input'; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/client/components/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/client/components/ui/form'; import { User, Lock } from 'lucide-react'; const registerSchema = z.object({ username: z.string() .min(3, '用户名至少3个字符') .max(20, '用户名不能超过20个字符') .regex(/^[a-zA-Z0-9_-]+$/, '用户名只能包含字母、数字、下划线和连字符'), password: z.string() .min(6, '密码至少6个字符') .max(30, '密码不能超过30个字符'), confirmPassword: z.string(), }).refine((data) => data.password === data.confirmPassword, { message: '两次密码输入不一致', path: ['confirmPassword'], }); type RegisterFormData = z.infer; const RegisterPage: React.FC = () => { const { login } = useAuth(); const navigate = useNavigate(); const form = useForm({ resolver: zodResolver(registerSchema), defaultValues: { username: '', password: '', confirmPassword: '', }, }); const onSubmit = async (data: RegisterFormData) => { try { const response = await authClient.register.$post({ json: { username: data.username, password: data.password, } }); if (response.status !== 201) { const result = await response.json(); throw new Error(result.message || '注册失败'); } // 注册成功后自动登录 await login(data.username, data.password); toast.success('注册成功!正在为您登录...'); navigate('/'); } catch (error) { toast.error(error instanceof Error ? error.message : '注册失败,请稍后重试'); } }; return (
创建账号 填写以下信息创建新账号
( 用户名
)} /> ( 密码
)} /> ( 确认密码
)} />
已有账号?

注册即表示您同意我们的服务条款

); }; export default RegisterPage;