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} />
|
<VersionLine version={version} versions={versions} status={saveState} />
|
||||||
</div>
|
</div>
|
||||||
<div className="button-row compact-actions">
|
<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>
|
<Button variant="primary" onClick={onSave} disabled={!dirty || locked || !draft}>i18n:govoplan-campaign.save.efc007a3</Button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ type UseCampaignDraftEditorOptions = {
|
|||||||
campaignId: string;
|
campaignId: string;
|
||||||
version: CampaignVersionDetail | null;
|
version: CampaignVersionDetail | null;
|
||||||
locked: boolean;
|
locked: boolean;
|
||||||
reload: () => Promise<void>;
|
reload: (options?: {force?: boolean;}) => Promise<void>;
|
||||||
setError: (message: string) => void;
|
setError: (message: string) => void;
|
||||||
currentStep: StepValue;
|
currentStep: StepValue;
|
||||||
currentFlow?: string;
|
currentFlow?: string;
|
||||||
@@ -124,12 +124,25 @@ export function useCampaignDraftEditor({
|
|||||||
}
|
}
|
||||||
}, [campaignId, currentFlow, currentStep, draft, extraPayload, isComplete, locked, onSaved, reload, setError, settings, version, workflowState]);
|
}, [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 ? {
|
const unsavedRegistration = useMemo(() => dirty && !locked ? {
|
||||||
title: unsavedTitle,
|
title: unsavedTitle,
|
||||||
message: unsavedMessage,
|
message: unsavedMessage,
|
||||||
onSave: () => saveDraft("manual"),
|
onSave: () => saveDraft("manual"),
|
||||||
onDiscard: () => setDirty(false)
|
onDiscard: () => { void discardDraft(); }
|
||||||
} : null, [dirty, locked, saveDraft, unsavedMessage, unsavedTitle]);
|
} : null, [dirty, discardDraft, locked, saveDraft, unsavedMessage, unsavedTitle]);
|
||||||
|
|
||||||
useRegisterCampaignUnsavedChanges(unsavedRegistration);
|
useRegisterCampaignUnsavedChanges(unsavedRegistration);
|
||||||
|
|
||||||
@@ -145,6 +158,7 @@ export function useCampaignDraftEditor({
|
|||||||
setLocalError,
|
setLocalError,
|
||||||
patch,
|
patch,
|
||||||
markDirty,
|
markDirty,
|
||||||
|
discardDraft,
|
||||||
saveDraft
|
saveDraft
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,14 +52,16 @@ export function useCampaignWorkspaceData(
|
|||||||
[campaignId, selectedVersionId, includeCurrentVersion, includeSummary, includeVersions, settings.apiBaseUrl, settings.apiKey, settings.accessToken]
|
[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;
|
if (!campaignId) return;
|
||||||
|
const force = options?.force === true;
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
setError("");
|
setError("");
|
||||||
try {
|
try {
|
||||||
const shouldLoadVersions = includeCurrentVersion || includeVersions;
|
const shouldLoadVersions = includeCurrentVersion || includeVersions;
|
||||||
let nextWatermark = getDeltaWatermark(queryKey);
|
if (force) resetDeltaWatermark(queryKey);
|
||||||
let merged: CampaignWorkspaceData = dataRef.current;
|
let nextWatermark = force ? null : getDeltaWatermark(queryKey);
|
||||||
|
let merged: CampaignWorkspaceData = force ? initialData : dataRef.current;
|
||||||
let hasMore = false;
|
let hasMore = false;
|
||||||
do {
|
do {
|
||||||
const response = await getCampaignWorkspaceDelta(settings, campaignId, {
|
const response = await getCampaignWorkspaceDelta(settings, campaignId, {
|
||||||
|
|||||||
Reference in New Issue
Block a user