fix(campaign-ui): make discard restore server state

This commit is contained in:
2026-07-20 20:08:00 +02:00
parent f755cdf48d
commit 7ea5bdb217
3 changed files with 24 additions and 8 deletions

View File

@@ -50,7 +50,7 @@ export default function CampaignDraftPageScaffold({
<VersionLine version={version} versions={versions} status={saveState} />
</div>
<div className="button-row compact-actions">
<Button onClick={onReload} disabled={loading}>i18n:govoplan-campaign.reload.cce71553</Button>
<Button onClick={onReload} disabled={loading}>Discard</Button>
<Button variant="primary" onClick={onSave} disabled={!dirty || locked || !draft}>i18n:govoplan-campaign.save.efc007a3</Button>
</div>
</div>

View File

@@ -12,7 +12,7 @@ type UseCampaignDraftEditorOptions = {
campaignId: string;
version: CampaignVersionDetail | null;
locked: boolean;
reload: () => Promise<void>;
reload: (options?: {force?: boolean;}) => Promise<void>;
setError: (message: string) => void;
currentStep: StepValue;
currentFlow?: string;
@@ -124,12 +124,25 @@ export function useCampaignDraftEditor({
}
}, [campaignId, currentFlow, currentStep, draft, extraPayload, isComplete, locked, onSaved, reload, setError, settings, version, workflowState]);
const discardDraft = useCallback(async () => {
if (version) {
const initialDraft = ensureCampaignDraft(version);
const loadedDraft = transformLoadedDraftRef.current?.(version, initialDraft) ?? initialDraft;
setDraft(loadedDraft);
setDirty(false);
setLocalError("");
setSaveState(loadedLabelRef.current(version));
onLoadedRef.current?.(version, loadedDraft);
}
await reload({ force: true });
}, [reload, version]);
const unsavedRegistration = useMemo(() => dirty && !locked ? {
title: unsavedTitle,
message: unsavedMessage,
onSave: () => saveDraft("manual"),
onDiscard: () => setDirty(false)
} : null, [dirty, locked, saveDraft, unsavedMessage, unsavedTitle]);
onDiscard: () => { void discardDraft(); }
} : null, [dirty, discardDraft, locked, saveDraft, unsavedMessage, unsavedTitle]);
useRegisterCampaignUnsavedChanges(unsavedRegistration);
@@ -145,6 +158,7 @@ export function useCampaignDraftEditor({
setLocalError,
patch,
markDirty,
discardDraft,
saveDraft
};
}
}

View File

@@ -52,14 +52,16 @@ export function useCampaignWorkspaceData(
[campaignId, selectedVersionId, includeCurrentVersion, includeSummary, includeVersions, settings.apiBaseUrl, settings.apiKey, settings.accessToken]
);
const reload = useCallback(async () => {
const reload = useCallback(async (options?: {force?: boolean;}) => {
if (!campaignId) return;
const force = options?.force === true;
setLoading(true);
setError("");
try {
const shouldLoadVersions = includeCurrentVersion || includeVersions;
let nextWatermark = getDeltaWatermark(queryKey);
let merged: CampaignWorkspaceData = dataRef.current;
if (force) resetDeltaWatermark(queryKey);
let nextWatermark = force ? null : getDeltaWatermark(queryKey);
let merged: CampaignWorkspaceData = force ? initialData : dataRef.current;
let hasMore = false;
do {
const response = await getCampaignWorkspaceDelta(settings, campaignId, {