import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; import { toast } from "sonner"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "~/client/components/ui/form"; import { AuthLayout } from "~/client/components/auth-layout"; import { Input } from "~/client/components/ui/input"; import { Button } from "~/client/components/ui/button"; import { authClient } from "~/client/lib/auth-client"; import { logger } from "~/client/lib/logger"; import { useState } from "react"; import { useNavigate } from "@tanstack/react-router"; import { normalizeUsername } from "~/lib/username"; import { z } from "zod"; import { inferDateTimePreferences } from "~/client/lib/datetime"; const onboardingSchema = z.object({ username: z.string().min(2).max(30).transform(normalizeUsername), email: z .string() .email() .transform((str) => str.trim().toLowerCase()), password: z.string().min(8), confirmPassword: z.string().min(1), }); type OnboardingFormValues = z.input; export function OnboardingPage() { const navigate = useNavigate(); const [submitting, setSubmitting] = useState(false); const form = useForm({ resolver: zodResolver(onboardingSchema), defaultValues: { username: "", password: "", confirmPassword: "", email: "", }, }); const onSubmit = async (values: OnboardingFormValues) => { if (values.password !== values.confirmPassword) { form.setError("confirmPassword", { type: "manual", message: "Passwords do not match", }); return; } const { dateFormat, timeFormat } = inferDateTimePreferences(navigator.language); const { data, error } = await authClient.signUp.email({ username: normalizeUsername(values.username), dateFormat, timeFormat, password: values.password, email: values.email.toLowerCase().trim(), name: values.username, displayUsername: values.username, hasDownloadedResticPassword: false, fetchOptions: { onRequest: () => { setSubmitting(true); }, onResponse: () => { setSubmitting(false); }, }, }); if (data?.token) { toast.success("Admin user created successfully!"); void navigate({ to: "/download-recovery-key" }); } else if (error) { logger.error(error); const errorMessage = error.message ?? "Unknown error"; toast.error("Failed to create admin user", { description: errorMessage }); } }; return (
( Email Enter your email address )} /> ( Username Choose a username for the admin account )} /> ( Password Password must be at least 8 characters long. )} /> ( Confirm Password )} />
); }