import { z } from "zod"; import Headline from "../../components/Headline.tsx"; import PasswordConfirmationFields from "../../islands/PasswordConfirmationFields.tsx"; import { define } from "../../utils.ts"; const signUpSchema = z.object({ email: z.email("Please enter a valid email address.").trim(), firstName: z.string().trim().min(1, "Please enter your first name."), lastName: z.string().trim().min(1, "Please enter your last name."), password: z.string().min(8, "Password must be at least 8 characters long."), passwordConfirm: z.string(), }).refine((data) => data.password === data.passwordConfirm, { message: "Passwords do not match.", path: ["passwordConfirm"], }); const emptyForm = { email: "", firstName: "", lastName: "", error: undefined as string | undefined, }; export const handler = define.handlers({ GET() { return { data: emptyForm }; }, async POST(ctx) { const formData = await ctx.req.formData(); const result = signUpSchema.safeParse({ email: formData.get("email"), firstName: formData.get("firstName"), lastName: formData.get("lastName"), password: formData.get("password"), passwordConfirm: formData.get("passwordConfirm"), }); if (!result.success) { return { data: { email: formData.get("email")?.toString() ?? "", firstName: formData.get("firstName")?.toString() ?? "", lastName: formData.get("lastName")?.toString() ?? "", error: result.error.issues[0].message, }, }; } const { passwordConfirm: _passwordConfirm, ...registration } = result.data; // Use registration to register user void registration; return ctx.redirect("/sign-up", 303); }, }); export default define.page(function SignUpPage(ctx) { const { email, firstName, lastName, error } = ctx.data; return (
Sign up {error && }
); });