"use client"; import { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle } from "@app/components/Credenza"; import { Button } from "@app/components/ui/button"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { toast } from "@app/hooks/useToast"; import { createApiClient, formatAxiosError } from "@app/lib/api"; import { ListSitesResponse } from "@server/routers/site"; import { AxiosResponse } from "axios"; import { useTranslations } from "next-intl"; import { useState } from "react"; import { cleanForFQDN, InternalResourceForm, isHostname, type InternalResourceFormValues } from "./InternalResourceForm"; type Site = ListSitesResponse["sites"][0]; type CreateInternalResourceDialogProps = { open: boolean; setOpen: (val: boolean) => void; orgId: string; sites: Site[]; onSuccess?: () => void; }; export default function CreateInternalResourceDialog({ open, setOpen, orgId, sites, onSuccess }: CreateInternalResourceDialogProps) { const t = useTranslations(); const api = createApiClient(useEnvContext()); const [isSubmitting, setIsSubmitting] = useState(false); async function handleSubmit(values: InternalResourceFormValues) { setIsSubmitting(true); try { let data = { ...values }; if (data.mode === "host" && isHostname(data.destination)) { const currentAlias = data.alias?.trim() || ""; if (!currentAlias) { let aliasValue = data.destination; if (data.destination.toLowerCase() === "localhost") { aliasValue = `${cleanForFQDN(data.name)}.internal`; } data = { ...data, alias: aliasValue }; } } await api.put>( `/org/${orgId}/site-resource`, { name: data.name, siteId: data.siteId, mode: data.mode, destination: data.destination, enabled: true, alias: data.alias && typeof data.alias === "string" && data.alias.trim() ? data.alias : undefined, tcpPortRangeString: data.tcpPortRangeString, udpPortRangeString: data.udpPortRangeString, disableIcmp: data.disableIcmp ?? false, ...(data.authDaemonMode != null && { authDaemonMode: data.authDaemonMode }), ...(data.authDaemonMode === "remote" && data.authDaemonPort != null && { authDaemonPort: data.authDaemonPort }), roleIds: data.roles ? data.roles.map((r) => parseInt(r.id)) : [], userIds: data.users ? data.users.map((u) => u.id) : [], clientIds: data.clients ? data.clients.map((c) => parseInt(c.id)) : [] } ); toast({ title: t("createInternalResourceDialogSuccess"), description: t("createInternalResourceDialogInternalResourceCreatedSuccessfully"), variant: "default" }); setOpen(false); onSuccess?.(); } catch (error) { toast({ title: t("createInternalResourceDialogError"), description: formatAxiosError( error, t("createInternalResourceDialogFailedToCreateInternalResource") ), variant: "destructive" }); } finally { setIsSubmitting(false); } } return ( {t("createInternalResourceDialogCreateClientResource")} {t("createInternalResourceDialogCreateClientResourceDescription")} ); }