import { zodResolver } from "@hookform/resolvers/zod" import { createFileRoute, Link as RouterLink, redirect, } from "@tanstack/react-router" import { useForm } from "react-hook-form" import { z } from "zod" import { AuthLayout } from "@/components/Common/AuthLayout" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { LoadingButton } from "@/components/ui/loading-button" import { PasswordInput } from "@/components/ui/password-input" import useAuth, { isLoggedIn } from "@/hooks/useAuth" const formSchema = z .object({ email: z.email(), full_name: z.string().min(1, { message: "Full Name is required" }), password: z .string() .min(1, { message: "Password is required" }) .min(8, { message: "Password must be at least 8 characters" }), confirm_password: z .string() .min(1, { message: "Password confirmation is required" }), }) .refine((data) => data.password === data.confirm_password, { message: "The passwords don't match", path: ["confirm_password"], }) type FormData = z.infer export const Route = createFileRoute("/signup")({ component: SignUp, beforeLoad: async () => { if (isLoggedIn()) { throw redirect({ to: "/", }) } }, head: () => ({ meta: [ { title: "Sign Up - FastAPI Cloud", }, ], }), }) function SignUp() { const { signUpMutation } = useAuth() const form = useForm({ resolver: zodResolver(formSchema), mode: "onBlur", criteriaMode: "all", defaultValues: { email: "", full_name: "", password: "", confirm_password: "", }, }) const onSubmit = (data: FormData) => { if (signUpMutation.isPending) return // 从提交数据中排除 confirm_password const { confirm_password: _confirm_password, ...submitData } = data signUpMutation.mutate(submitData) } return (

Create an account

( Full Name )} /> ( Email )} /> ( Password )} /> ( Confirm Password )} /> Sign Up
Already have an account?{" "} Log in
) } export default SignUp