import { useForm } from "@tanstack/react-form";
import { Link, createFileRoute, useNavigate } from "@tanstack/react-router";
import {
AuthPageCard,
authRedirectSearchSchema,
getFieldError,
getFormError,
useAuthPageState,
} from "@/client/features/auth/AuthPage";
import { authClient } from "@/lib/auth-client";
import { getSignInSearch } from "@/lib/auth-redirect";
import {
HOSTED_PASSWORD_MAX_LENGTH,
HOSTED_PASSWORD_MIN_LENGTH,
} from "@/lib/auth-options";
import { z } from "zod";
const signUpSchema = z
.object({
name: z.string().trim(),
email: z.string().trim().email("Enter a valid email address."),
password: z
.string()
.min(
HOSTED_PASSWORD_MIN_LENGTH,
`Password must be at least ${HOSTED_PASSWORD_MIN_LENGTH} characters.`,
)
.max(
HOSTED_PASSWORD_MAX_LENGTH,
`Password must be at most ${HOSTED_PASSWORD_MAX_LENGTH} characters.`,
),
confirmPassword: z.string(),
})
.refine((value) => value.password === value.confirmPassword, {
message: "Passwords do not match.",
path: ["confirmPassword"],
});
export const Route = createFileRoute("/_auth/sign-up")({
validateSearch: authRedirectSearchSchema,
component: SignUpPage,
});
function SignUpPage() {
const search = Route.useSearch();
const navigate = useNavigate();
const { redirectTo, isHostedMode, isSessionPending } = useAuthPageState(
search.redirect,
);
const form = useForm({
defaultValues: {
name: "",
email: "",
password: "",
confirmPassword: "",
},
validators: {
onSubmit: signUpSchema,
},
onSubmit: async ({ formApi, value }) => {
try {
const email = value.email.trim();
const resolvedName =
value.name.trim() || email.split("@")[0] || "OpenSEO User";
const result = await authClient.signUp.email({
name: resolvedName,
email,
password: value.password,
callbackURL: (() => {
const url = new URL("/verify-email", window.location.origin);
if (redirectTo !== "/")
url.searchParams.set("redirect", redirectTo);
return url.toString();
})(),
});
if (result.error) {
formApi.setErrorMap({
onSubmit: {
form: result.error.message || "Unable to create account.",
fields: {},
},
});
return;
}
void navigate({
to: "/verify-email",
search: { email, ...getSignInSearch(redirectTo) },
});
} catch {
formApi.setErrorMap({
onSubmit: {
form: "Unable to create account right now. Please try again.",
fields: {},
},
});
}
},
});
return (
{error}
) : null}{error}
) : null}{error}
) : null}{error}
) : null}{errorMessage}
) : null} > ); }}