import { arktypeResolver } from "@hookform/resolvers/arktype"; import { useMutation } from "@tanstack/react-query"; import { type } from "arktype"; import { useForm } from "react-hook-form"; import { useNavigate } from "react-router"; import { toast } from "sonner"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "~/client/components/ui/form"; import { authMiddleware } from "~/middleware/auth"; import type { Route } from "./+types/onboarding"; import { AuthLayout } from "~/client/components/auth-layout"; import { Input } from "~/client/components/ui/input"; import { Button } from "~/client/components/ui/button"; import { registerMutation } from "~/client/api-client/@tanstack/react-query.gen"; export const clientMiddleware = [authMiddleware]; export function meta(_: Route.MetaArgs) { return [ { title: "Onboarding" }, { name: "description", content: "Welcome to Ironmount. Create your admin account to get started.", }, ]; } const onboardingSchema = type({ username: "2<=string<=50", password: "string>=8", confirmPassword: "string>=1", }); type OnboardingFormValues = typeof onboardingSchema.inferIn; export default function OnboardingPage() { const navigate = useNavigate(); const form = useForm({ resolver: arktypeResolver(onboardingSchema), defaultValues: { username: "", password: "", confirmPassword: "", }, }); const registerUser = useMutation({ ...registerMutation(), onSuccess: async () => { toast.success("Admin user created successfully!"); navigate("/download-recovery-key"); }, onError: (error) => { console.error(error); toast.error("Failed to create admin user", { description: error.message }); }, }); const onSubmit = (values: OnboardingFormValues) => { if (values.password !== values.confirmPassword) { form.setError("confirmPassword", { type: "manual", message: "Passwords do not match", }); return; } registerUser.mutate({ body: { username: values.username.trim(), password: values.password.trim(), }, }); }; return (
( Username Choose a username for the admin account )} /> ( Password Password must be at least 8 characters long. )} /> ( Confirm Password )} />
); }