"use client"; import { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle } from "@app/components/Credenza"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@app/components/ui/form"; import { Button } from "@app/components/ui/button"; import { Checkbox } from "@app/components/ui/checkbox"; import { Input } from "@app/components/ui/input"; import { Alert, AlertDescription, AlertTitle } from "@app/components/ui/alert"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { toast } from "@app/hooks/useToast"; import { createApiClient, formatAxiosError } from "@app/lib/api"; import { CreateSiteProvisioningKeyResponse } from "@server/routers/siteProvisioning/types"; import { AxiosResponse } from "axios"; import { InfoIcon } from "lucide-react"; import { useTranslations } from "next-intl"; import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import CopyTextBox from "@app/components/CopyTextBox"; const FORM_ID = "create-site-provisioning-key-form"; type CreateSiteProvisioningKeyCredenzaProps = { open: boolean; setOpen: (open: boolean) => void; orgId: string; }; export default function CreateSiteProvisioningKeyCredenza({ open, setOpen, orgId }: CreateSiteProvisioningKeyCredenzaProps) { const t = useTranslations(); const router = useRouter(); const api = createApiClient(useEnvContext()); const [loading, setLoading] = useState(false); const [created, setCreated] = useState(null); const createFormSchema = z .object({ name: z .string() .min(1, { message: t("nameMin", { len: 1 }) }) .max(255, { message: t("nameMax", { len: 255 }) }), unlimitedBatchSize: z.boolean(), maxBatchSize: z .number() .int() .min(1, { message: t("provisioningKeysMaxBatchSizeInvalid") }) .max(1_000_000, { message: t("provisioningKeysMaxBatchSizeInvalid") }), validUntil: z.string().optional() }) .superRefine((data, ctx) => { const v = data.validUntil; if (v == null || v.trim() === "") { return; } if (Number.isNaN(Date.parse(v))) { ctx.addIssue({ code: "custom", message: t("provisioningKeysValidUntilInvalid"), path: ["validUntil"] }); } }); type CreateFormValues = z.infer; const form = useForm({ resolver: zodResolver(createFormSchema), defaultValues: { name: "", unlimitedBatchSize: false, maxBatchSize: 100, validUntil: "" } }); useEffect(() => { if (!open) { setCreated(null); form.reset({ name: "", unlimitedBatchSize: false, maxBatchSize: 100, validUntil: "" }); } }, [open, form]); async function onSubmit(data: CreateFormValues) { setLoading(true); try { const res = await api .put< AxiosResponse >(`/org/${orgId}/site-provisioning-key`, { name: data.name, maxBatchSize: data.unlimitedBatchSize ? null : data.maxBatchSize, validUntil: data.validUntil == null || data.validUntil.trim() === "" ? undefined : data.validUntil }) .catch((e) => { toast({ variant: "destructive", title: t("provisioningKeysErrorCreate"), description: formatAxiosError(e) }); }); if (res && res.status === 201) { setCreated(res.data.data); router.refresh(); } } finally { setLoading(false); } } const credential = created && `${created.siteProvisioningKeyId}.${created.siteProvisioningKey}`; const unlimitedBatchSize = form.watch("unlimitedBatchSize"); return ( {created ? t("provisioningKeysList") : t("provisioningKeysCreate")} {!created && ( {t("provisioningKeysCreateDescription")} )} {!created && (
( {t("name")} )} /> ( {t( "provisioningKeysMaxBatchSize" )} { const v = e.target.value; field.onChange( v === "" ? 100 : Number(v) ); }} value={field.value} /> )} /> ( field.onChange( c === true ) } /> {t( "provisioningKeysUnlimitedBatchSize" )} )} /> ( {t( "provisioningKeysValidUntil" )} {t( "provisioningKeysValidUntilHint" )} )} /> )} {created && credential && (
{t("provisioningKeysSave")} {t("provisioningKeysSaveDescription")}
)}
{!created ? ( <> ) : ( )}
); }