"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 { useEnvContext } from "@app/hooks/useEnvContext"; import { toast } from "@app/hooks/useToast"; import { createApiClient, formatAxiosError } from "@app/lib/api"; import { UpdateSiteProvisioningKeyResponse } from "@server/routers/siteProvisioning/types"; import { AxiosResponse } from "axios"; 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 moment from "moment"; const FORM_ID = "edit-site-provisioning-key-form"; export type EditableSiteProvisioningKey = { id: string; name: string; maxBatchSize: number | null; validUntil: string | null; }; type EditSiteProvisioningKeyCredenzaProps = { open: boolean; setOpen: (open: boolean) => void; orgId: string; provisioningKey: EditableSiteProvisioningKey | null; }; export default function EditSiteProvisioningKeyCredenza({ open, setOpen, orgId, provisioningKey }: EditSiteProvisioningKeyCredenzaProps) { const t = useTranslations(); const router = useRouter(); const api = createApiClient(useEnvContext()); const [loading, setLoading] = useState(false); const editFormSchema = z .object({ name: z.string(), 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 EditFormValues = z.infer; const form = useForm({ resolver: zodResolver(editFormSchema), defaultValues: { name: "", unlimitedBatchSize: false, maxBatchSize: 100, validUntil: "" } }); useEffect(() => { if (!open || !provisioningKey) { return; } form.reset({ name: provisioningKey.name, unlimitedBatchSize: provisioningKey.maxBatchSize == null, maxBatchSize: provisioningKey.maxBatchSize ?? 100, validUntil: provisioningKey.validUntil ? moment(provisioningKey.validUntil).format("YYYY-MM-DDTHH:mm") : "" }); }, [open, provisioningKey, form]); async function onSubmit(data: EditFormValues) { if (!provisioningKey) { return; } setLoading(true); try { const res = await api .patch< AxiosResponse >( `/org/${orgId}/site-provisioning-key/${provisioningKey.id}`, { maxBatchSize: data.unlimitedBatchSize ? null : data.maxBatchSize, validUntil: data.validUntil == null || data.validUntil.trim() === "" ? "" : data.validUntil } ) .catch((e) => { toast({ variant: "destructive", title: t("provisioningKeysUpdateError"), description: formatAxiosError(e) }); }); if (res && res.status === 200) { toast({ title: t("provisioningKeysUpdated"), description: t("provisioningKeysUpdatedDescription") }); setOpen(false); router.refresh(); } } finally { setLoading(false); } } const unlimitedBatchSize = form.watch("unlimitedBatchSize"); if (!provisioningKey) { return null; } return ( {t("provisioningKeysEdit")} {t("provisioningKeysEditDescription")}
( {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")} )} />
); }