import { Helmet } from "react-helmet"; import { Controller, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { zodResolver } from "@hookform/resolvers/zod"; import { useNavigate } from "@tanstack/react-router"; import { AnimatePresence, motion } from "framer-motion"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; // TODO(akhilmhdh): rewrite this into module functions in lib import SecurityClient from "@app/components/utilities/SecurityClient"; import { Button, ContentLoader, FormControl, Input } from "@app/components/v2"; import { useServerConfig } from "@app/context"; import { useCreateAdminUser, useSelectOrganization } from "@app/hooks/api"; const formSchema = z .object({ email: z.string().email().trim(), firstName: z.string().trim(), lastName: z.string().trim().optional(), password: z.string().trim().min(14).max(100), confirmPassword: z.string().trim() }) .refine((data) => data.password === data.confirmPassword, { message: "Password don't match", path: ["confirmPassword"] }); type TFormSchema = z.infer; export const SignUpPage = () => { const { t } = useTranslation(); const navigate = useNavigate(); const { control, handleSubmit, formState: { isSubmitting } } = useForm({ resolver: zodResolver(formSchema) }); const { config } = useServerConfig(); const { mutateAsync: createAdminUser } = useCreateAdminUser(); const { mutateAsync: selectOrganization } = useSelectOrganization(); const handleFormSubmit = async ({ email, password, firstName, lastName }: TFormSchema) => { // avoid multi submission if (isSubmitting) return; try { const res = await createAdminUser({ email, password, firstName, lastName }); SecurityClient.setToken(res.token); await selectOrganization({ organizationId: res.organization.id }); // TODO(akhilmhdh): This is such a confusing pattern and too unreliable // Will be refactored in next iteration to make it url based rather than local storage ones // Part of migration to nextjs 14 localStorage.setItem("orgData.id", res.organization.id); navigate({ to: "/admin" }); } catch (err) { console.log(err); createNotification({ type: "error", text: "Failed to create admin" }); } }; if (config?.initialized) return ; return (
{t("common.head-title", { title: t("signup.title") })}
Infisical logo
Welcome to Infisical
Create your first Super Admin Account
( )} /> ( )} />
( )} /> ( )} /> ( )} />
); };