import { lazy, useEffect, useState } from "react"; import { Navigate, Route, Routes, useLocation, useNavigate, useParams } from "react-router"; import { ConcurrencyConflictProvider, WorkspaceLayout, useGuardedNavigate } from "@govoplan/core-webui"; import type { ApiSettings, AuthInfo, CampaignWorkspaceSection } from "../../types"; import SectionSidebar from "../../layout/SectionSidebar"; const CampaignOverviewPage = lazy(() => import("./CampaignOverviewPage")); const CampaignFieldsPage = lazy(() => import("./CampaignFieldsPage")); const GlobalSettingsPage = lazy(() => import("./GlobalSettingsPage")); const RecipientDataPage = lazy(() => import("./RecipientDataPage")); const TemplateDataPage = lazy(() => import("./TemplateDataPage")); const AttachmentsDataPage = lazy(() => import("./AttachmentsDataPage")); const MailSettingsPage = lazy(() => import("./MailSettingsPage")); const ReviewSendPage = lazy(() => import("./ReviewSendPage")); const CreateWizard = lazy(() => import("./wizard/CreateWizard")); const ReviewWizard = lazy(() => import("./wizard/ReviewWizard")); const SendWizard = lazy(() => import("./wizard/SendWizard")); const WizardDirectoryPage = lazy(() => import("./wizard/WizardDirectoryPage")); const CampaignJsonView = lazy(() => import("./CampaignJsonView")); const CampaignReportPage = lazy(() => import("./CampaignReportPage")); const CampaignAuditPage = lazy(() => import("./CampaignAuditPage")); const sectionPaths: Record = { overview: "", campaign: "recipients", "global-settings": "global-settings", policies: "policies", fields: "fields", recipients: "recipients", "recipient-data": "recipients", template: "template", files: "files", "mail-settings": "mail-settings", "mail-policy": "mail-policy", review: "review", report: "report", audit: "audit", json: "json" }; export default function CampaignWorkspace({ settings, auth }: { settings: ApiSettings; auth: AuthInfo }) { return ( ); } function CampaignWorkspaceInner({ settings, auth }: { settings: ApiSettings; auth: AuthInfo }) { const { campaignId } = useParams(); const navigate = useNavigate(); const guardedNavigate = useGuardedNavigate(); const location = useLocation(); const active = sectionFromPath(location.pathname); const urlVersionId = new URLSearchParams(location.search).get("version"); const [selectedVersionId, setSelectedVersionId] = useState(urlVersionId); useEffect(() => { if (urlVersionId) setSelectedVersionId(urlVersionId); }, [urlVersionId]); // Relative links inside the workspace historically dropped ?version=. Keep // the selected version stable for the lifetime of this campaign workspace, // while still opening the latest version on a fresh campaign entry. useEffect(() => { if (urlVersionId || !selectedVersionId) return; const params = new URLSearchParams(location.search); params.set("version", selectedVersionId); navigate(`${location.pathname}?${params.toString()}`, { replace: true }); }, [location.pathname, location.search, navigate, selectedVersionId, urlVersionId]); function select(section: CampaignWorkspaceSection) { const path = sectionPaths[section]; const pathname = path ? `/campaigns/${campaignId}/${path}` : `/campaigns/${campaignId}`; const params = new URLSearchParams(location.search); const versionId = urlVersionId ?? selectedVersionId; if (versionId) params.set("version", versionId); const query = params.toString(); const target = query ? `${pathname}?${query}` : pathname; if (`${location.pathname}${location.search}` === target) return; guardedNavigate(target); } return ( } primaryLabel="Campaign sections" contentLabel="Campaign workspace" interfaceId="campaign.workspace" helpModuleId="campaign" > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); } function sectionFromPath(pathname: string): CampaignWorkspaceSection { const segments = pathname.split("/").filter(Boolean); const section = segments[2]; if (!section || section === "wizard" || section === "create") return "overview"; if (section === "data" || section === "campaign") return "recipients"; if (section === "global-settings" || section === "settings") return "global-settings"; if (section === "policies" || section === "policy") return "policies"; if (section === "fields") return "fields"; if (section === "recipients") return "recipients"; if (section === "recipient-data" || section === "recipient-details") return "recipients"; if (section === "template") return "template"; if (section === "files" || section === "attachments") return "files"; if (section === "mail-settings" || section === "server-settings" || section === "mail") return "mail-settings"; if (section === "mail-policy" || section === "mail-policies") return "mail-policy"; if (section === "review") return "review"; if (section === "send") return "review"; if (section === "report" || section === "reports") return "report"; if (section === "audit") return "audit"; if (section === "json") return "json"; return "overview"; }