diff --git a/app/(auth)/components/auth-form.tsx b/app/(auth)/components/auth-form.tsx index 8151b44..52fb08c 100644 --- a/app/(auth)/components/auth-form.tsx +++ b/app/(auth)/components/auth-form.tsx @@ -40,13 +40,23 @@ import { type FormData = z.infer; type AuthFormProps = { mode: "login" | "signup" | "reset" }; +const defaultValues: FormData = { + email: "", + password: "", + confirmPassword: "", +}; + export function AuthForm({ mode }: AuthFormProps) { const [isEmailMode, setIsEmailMode] = React.useState(true); - const [isSubmitting, setIsSubmitting] = React.useState(false); const [isPassVisible, setIsPassVisible] = React.useState(false); const [isConfirmPassVisible, setIsConfirmPassVisible] = React.useState(false); + const [oauthLoading, setOauthLoading] = React.useState<"google" | "github">(); - const form = useForm({ resolver: zodResolver(authSchema) }); + const form = useForm({ + resolver: zodResolver(authSchema), + defaultValues, + mode: "onChange", + }); function signInToaster() { toast({ @@ -55,35 +65,32 @@ export function AuthForm({ mode }: AuthFormProps) { }); } - function onSubmit({ username, email, password }: FormData) { - setIsSubmitting(true); + async function onSubmit({ email, username, password }: FormData) { try { if (mode === "login") { signInToaster(); - signIn("credentials", { username, email, password }); + await signIn("credentials", { username, email, password }); } else if (mode === "signup") { toast({ title: "Creating account...", description: "Please wait while we create your account", }); - createNewAccount({ mode: "email", email, password }); + await createNewAccount({ mode: "email", email: email!, password }); } else { toast({ title: "Resetting password...", description: "Please wait while we reset your password", }); - resetPassword({ mode: "email", email, password }); + await resetPassword({ mode: "email", email: email!, password }); } } catch (error) { const err = error as Error; console.error(err.message); } - - setIsSubmitting(false); } async function googleSignInHandler() { - setIsSubmitting(true); + setOauthLoading("google"); try { signInToaster(); @@ -93,11 +100,11 @@ export function AuthForm({ mode }: AuthFormProps) { console.error(err.message); } - setIsSubmitting(false); + setOauthLoading(undefined); } async function githubSignInHandler() { - setIsSubmitting(true); + setOauthLoading("github"); try { signInToaster(); @@ -107,7 +114,7 @@ export function AuthForm({ mode }: AuthFormProps) { console.error(err.message); } - setIsSubmitting(false); + setOauthLoading(undefined); } const toggleCredentialMode = () => setIsEmailMode(!isEmailMode); @@ -115,6 +122,8 @@ export function AuthForm({ mode }: AuthFormProps) { const toggleConfirmPassVisibility = () => setIsConfirmPassVisible(!isConfirmPassVisible); + const isFormDisabled = !!oauthLoading || form.formState.isSubmitting; + return (
- {isSubmitting ? ( + {form.formState.isSubmitting ? ( ) : ( <> @@ -285,7 +294,7 @@ export function AuthForm({ mode }: AuthFormProps) { )} {mode === "reset" && "Reset Password"} - {mode === "login" && isEmailMode ? "Login with Email" : "Login"} + {mode === "login" && (isEmailMode ? "Login with Email" : "Login")} {mode === "signup" && "Sign Up with Email"} @@ -307,10 +316,10 @@ export function AuthForm({ mode }: AuthFormProps) {