import { Label } from "@repo/shadcn-ui/components/label"; import { SelectWithAction } from "@repo/shadcn-ui/components/select-with-action"; import { useId } from "react"; import { useTranslation } from "react-i18next"; import type { CatalogItemDTO, ResourceInput, ResourceReferenceDTO } from "../common"; export function mailboxIntegration( items: readonly CatalogItemDTO[], previous?: ResourceInput["integration"] ) { if (previous?.kind === "mailbox") { return previous; } const addressFieldId = items.find((item) => item.builtinKey === "field:email")?.id; const contextFieldId = items.find((item) => item.builtinKey === "field:context")?.id; return addressFieldId && contextFieldId ? { kind: "mailbox" as const, addressFieldId, contextFieldId, mailboxKind: "corporate" as const, accountId: null, } : undefined; } export function ResourceIntegrationFields({ templateKey, integration, items, references, fixed, onChange, }: { templateKey: string | null | undefined; integration: ResourceInput["integration"]; items: readonly CatalogItemDTO[]; references: readonly ResourceReferenceDTO[]; fixed: boolean; onChange: (value: ResourceInput["integration"]) => void; }) { const { t } = useTranslation("resources"); const prefix = useId(); const mailbox = integration?.kind === "mailbox" ? integration : templateKey === "template:mailbox" ? mailboxIntegration(items) : undefined; if (mailbox) { return (
{ if (value === "corporate" || value === "external") { onChange({ ...mailbox, mailboxKind: value }); } }} options={["corporate", "external"].map((value) => ({ value, label: t(value) }))} placeholder={t("chooseValue")} value={mailbox.mailboxKind} />
onChange({ ...mailbox, accountId: value === "none" ? null : value }) } options={[ { value: "none", label: t("noValue") }, ...references .filter( (item) => item.kind === "account" && (item.active || item.id === mailbox.accountId) ) .map((item) => ({ value: item.id, label: item.name })), ]} placeholder={t("chooseValue")} value={mailbox.accountId ?? "none"} />
); } if (templateKey !== "template:access" && integration?.kind !== "access") { return null; } const referenceFieldId = integration?.kind === "access" ? integration.referenceFieldId : items.find((item) => item.builtinKey === "field:reference")?.id; if (!referenceFieldId) { return null; } const access = integration?.kind === "access" ? integration : undefined; const change = (key: "resourceTypeId" | "systemId" | "environmentId", value: string) => { const resourceTypeId = key === "resourceTypeId" ? value : access?.resourceTypeId; if (!resourceTypeId) { return; } const systemId = key === "systemId" ? optionalReference(value) : (access?.systemId ?? null); let environmentId = access?.environmentId ?? null; if (key === "systemId") { environmentId = null; } else if (key === "environmentId") { environmentId = optionalReference(value); } onChange({ kind: "access", referenceFieldId, resourceTypeId, systemId, environmentId }); }; return (
{(["resourceTypeId", "systemId", "environmentId"] as const).map((key) => { const kind = key === "resourceTypeId" ? "resource_type" : key === "systemId" ? "system" : "environment"; const selected = access?.[key] ?? "none"; const options = references .filter( (item) => item.kind === kind && (item.active || item.id === selected) && (kind !== "environment" || item.systemId === access?.systemId) ) .map((item) => ({ value: item.id, label: item.name })); return (
{ if (key !== "resourceTypeId" || value !== "none") { change(key, value); } }} options={[{ value: "none", label: t("noValue") }, ...options]} placeholder={t("chooseValue")} value={selected} />
); })}
); } function optionalReference(value: string) { return value === "none" ? null : value; }