import { createElement, lazy, useCallback } from "react"; import { useParams } from "react-router-dom"; import { ResourceAccessBoundary, type ApiSettings, type AuthInfo, type PlatformWebModule } from "@govoplan/core-webui"; import { getCampaign } from "./api/campaigns"; import { generatedTranslations } from "./i18n/generatedTranslations"; import "./styles/campaign-workspace.css"; const CampaignListPage = lazy(() => import("./features/campaigns/CampaignListPage")); const CampaignWorkspace = lazy(() => import("./features/campaigns/CampaignWorkspace")); const OperatorQueuePage = lazy(() => import("./features/operator/OperatorQueuePage")); const AggregateReportsPage = lazy(() => import("./features/reports/AggregateReportsPage")); const TemplatesPage = lazy(() => import("./features/templates/TemplatesPage")); const campaignRead = ["campaigns:campaign:read"]; const operatorScopes = ["campaigns:campaign:queue", "campaigns:campaign:retry", "campaigns:campaign:reconcile", "campaigns:campaign:control"]; const translations = { en: generatedTranslations.en, de: generatedTranslations.de }; export const campaignModule: PlatformWebModule = { id: "campaigns", label: "i18n:govoplan-campaign.campaigns.01a23a28", version: "1.0.0", dependencies: ["access"], optionalDependencies: ["files", "mail"], translations, navItems: [ { to: "/campaigns", label: "i18n:govoplan-campaign.campaigns.01a23a28", iconName: "campaign", anyOf: campaignRead, order: 20 }, { to: "/operator", label: "i18n:govoplan-campaign.operator_queue.ddf23260", iconName: "radio-tower", anyOf: operatorScopes, allOf: campaignRead, order: 30 }, { to: "/reports", label: "i18n:govoplan-campaign.reports.88bc3fe3", iconName: "clipboard-pen-line", anyOf: ["campaigns:report:read"], order: 70 }, { to: "/templates", label: "i18n:govoplan-campaign.templates.f25b700e", iconName: "layout-template", order: 90 }], routes: [ { path: "/campaigns", anyOf: campaignRead, order: 20, render: ({ settings }) => createElement(CampaignListPage, { settings }) }, { path: "/campaigns/:campaignId/*", anyOf: campaignRead, order: 21, render: ({ settings, auth }) => createElement(CampaignResourceRoute, { settings, auth }) }, { path: "/operator", anyOf: operatorScopes, allOf: campaignRead, order: 30, render: ({ settings, auth }) => createElement(OperatorQueuePage, { settings, auth }) }, { path: "/reports", anyOf: ["campaigns:report:read"], order: 70, render: ({ settings }) => createElement(AggregateReportsPage, { settings }) }, { path: "/templates", order: 90, render: () => createElement(TemplatesPage) }] }; function CampaignResourceRoute({ settings, auth }: {settings: ApiSettings;auth: AuthInfo;}) { const { campaignId = "" } = useParams(); const tenantId = (auth.active_tenant ?? auth.tenant).id; const probe = useCallback(() => getCampaign(settings, campaignId), [settings.apiBaseUrl, settings.apiKey, settings.accessToken, campaignId, tenantId]); return createElement(ResourceAccessBoundary, { probe, resetKey: `${tenantId}:${campaignId}`, fallback: "/campaigns", children: createElement(CampaignWorkspace, { settings, auth }) }); } export default campaignModule;