fix(campaign-ui): make discard restore server state
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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, {
|
||||
|
||||
Reference in New Issue
Block a user