diff --git a/apps/ai-game-creator-shell/src/view/project-development/export/state/useXhsMinitoolExport.ts b/apps/ai-game-creator-shell/src/view/project-development/export/state/useXhsMinitoolExport.ts index 53169172e..b2808f513 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/export/state/useXhsMinitoolExport.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/export/state/useXhsMinitoolExport.ts @@ -84,6 +84,8 @@ export function useXhsMinitoolExport({ return; } setLoading(true); + // 刷新以磁盘为准:先撤掉还在等待触发的自动保存,否则读盘期间那一次保存会把旧值写回去。 + setDirty(false); try { const state = await readXhsMinitoolExport(invoke, projectPath); setForm(state.form); @@ -92,7 +94,6 @@ export function useXhsMinitoolExport({ setFieldError(null); setConflict(null); setFailure(null); - setDirty(false); } catch (error) { const structured = asXhsMinitoolFailure(error); if (structured) setFailure(failureState(structured)); diff --git a/apps/ai-game-creator-shell/tests/xhsMinitoolExport.test.tsx b/apps/ai-game-creator-shell/tests/xhsMinitoolExport.test.tsx index ca8922891..4c7877430 100644 --- a/apps/ai-game-creator-shell/tests/xhsMinitoolExport.test.tsx +++ b/apps/ai-game-creator-shell/tests/xhsMinitoolExport.test.tsx @@ -276,6 +276,43 @@ describe('状态 hook', () => { ); }); + it('刷新期间不再把待保存的旧值写回去', async () => { + let reads = 0; + const invoke = vi.fn(async (command: string) => { + if (command !== 'read_xhs_minitool_export') return {}; + reads += 1; + // 第二次读(点刷新那次)故意慢:让停止输入后的自动保存在读盘期间到点。 + if (reads > 1) { + await new Promise((resolve) => setTimeout(resolve, 1200)); + } + return { form: FORM, hasScript: true, contentHash: CONTENT_HASH }; + }); + installTauriRuntime({ core: { invoke } }); + const { result } = renderHook(() => + useXhsMinitoolExport({ + enabled: true, + projectPath: PROJECT_PATH, + submitTurn: vi.fn(async () => true), + }), + ); + await waitFor(() => expect(result.current.form).toEqual(FORM)); + + await act(async () => { + result.current.updateField('name', '新名字'); + void result.current.load(); + }); + // 越过自动保存的 600ms:刷新以磁盘为准,这份还没保存的输入不该再落盘。 + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 1500)); + }); + + expect(invoke).not.toHaveBeenCalledWith( + 'save_xhs_minitool_export_form', + expect.anything(), + ); + expect(result.current.form).toEqual(FORM); + }); + it('导出把打包脚本的输出尾部一并报给用户', async () => { const invoke = vi.fn(async (command: string) => { if (command === 'read_xhs_minitool_export') {