import { useMutation } from "@tanstack/react-query" import { createFileRoute, useNavigate } from "@tanstack/react-router" import { GalleryVerticalEnd } from "lucide-react" import type React from "react" import { toast } from "sonner" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card" import { Field, FieldDescription, FieldError, FieldGroup, FieldLabel, } from "@/components/ui/field" import { Input } from "@/components/ui/input" import { type AuthErrorCode, authClient, BetterAuthError } from "../auth" export const Route = createFileRoute("/sign-up")({ component: SignupPage, }) type SignUpParams = { displayName: string email: string password: string confirmPassword: string } class PasswordMismatchError extends Error { constructor() { super("Passwords do not match") } } function SignupPage() { return (
Drexa
) } function SignUpFormContainer({ children }: React.PropsWithChildren) { return (
Create your account Enter your email below to create your account {children}
) } function SignupForm() { const navigate = useNavigate() const { mutate: signUp, isPending, error: signUpError, } = useMutation({ mutationFn: async (data: SignUpParams) => { if (data.password !== data.confirmPassword) { throw new PasswordMismatchError() } const { data: signUpData, error } = await authClient.signUp.email({ name: data.displayName, email: data.email, password: data.password, }) if (error) { throw new BetterAuthError(error.code as AuthErrorCode) } return signUpData }, onSuccess: () => { navigate({ to: "/", replace: true, }) }, onError: (error) => { console.error(error) toast.error("Unable to create your account") }, }) const handleSubmit = (event: React.FormEvent) => { event.preventDefault() const formData = new FormData(event.currentTarget) signUp({ displayName: formData.get("displayName") as string, email: formData.get("email") as string, password: formData.get("password") as string, confirmPassword: formData.get("confirmPassword") as string, }) } let passwordFieldError = null let emailFieldError = null if (signUpError instanceof BetterAuthError) { switch (signUpError.errorCode) { case "PASSWORD_TOO_SHORT": passwordFieldError = "Password must be at least 8 characters long" break case "INVALID_EMAIL": emailFieldError = "Invalid email address" break default: passwordFieldError = null } } else if (signUpError instanceof PasswordMismatchError) { passwordFieldError = "Passwords do not match" } return (
Your Name This is how you will be referred to on Drexa. You can change this later. Email {emailFieldError ? ( {emailFieldError} ) : null} Password Confirm Password {passwordFieldError ? ( {passwordFieldError} ) : ( Must be at least 8 characters long. )} Already have an account? Sign in
) }