76 lines
3.5 KiB
TypeScript
76 lines
3.5 KiB
TypeScript
import { createElement, lazy, useCallback } from "react";
|
|
import { useParams } from "react-router-dom";
|
|
import { Card, 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 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", "campaigns:campaign:send"];
|
|
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,
|
|
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, order: 30, render: ({ settings }) => createElement(OperatorQueuePage, { settings }) },
|
|
{ path: "/reports", anyOf: ["campaigns:report:read"], order: 70, render: () => createElement(ReportsPage) },
|
|
{ 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 })
|
|
});
|
|
}
|
|
|
|
function ReportsPage() {
|
|
return createElement(
|
|
"div",
|
|
{ className: "content-pad workspace-data-page" },
|
|
createElement(
|
|
"div",
|
|
{ className: "page-heading workspace-heading" },
|
|
createElement("h1", null, "i18n:govoplan-campaign.reports"),
|
|
createElement("p", null, "i18n:govoplan-campaign.reports_module_prepared")
|
|
),
|
|
createElement(Card, null, createElement("p", { className: "muted" }, "i18n:govoplan-campaign.next_passes_will_add_functionality_here"))
|
|
);
|
|
}
|
|
|
|
export default campaignModule;
|