From 086ebd0248de53b335608a4c12e73bad45b42cf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 20 Aug 2026 16:00:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=20UI=20=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E7=8A=B6=E6=80=81=E5=AD=98=E5=82=A8=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 `UiDesignStateStore` 重命名为 `IUiDesignStateStore`,统一命名规范。 - 替换所有引用,移除 `mockUiDesignStateStore`,改用 `uiDesignStateStore`。 - 更新相关测试和技术文档以匹配重命名与实现更改。 --- .../src/features/ui-editor/uiDesignStateStore.ts | 14 +++++++------- .../src/view/ui-editor/index.tsx | 8 ++++---- .../src/view/ui-editor/useUiEditorPage.ts | 6 +++--- .../tests/uiDesignStateStore.test.ts | 10 +++++----- .../tests/uiEditorPage.test.ts | 13 +++++++------ 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/apps/ai-game-creator-shell/src/features/ui-editor/uiDesignStateStore.ts b/apps/ai-game-creator-shell/src/features/ui-editor/uiDesignStateStore.ts index 8484fc0e1..951d0911c 100644 --- a/apps/ai-game-creator-shell/src/features/ui-editor/uiDesignStateStore.ts +++ b/apps/ai-game-creator-shell/src/features/ui-editor/uiDesignStateStore.ts @@ -14,7 +14,7 @@ export type UiDesignStateSaveResult = } | { status: 'conflict'; current: UiDesignStateSnapshot }; -export type UiDesignStateStore = { +export type IUiDesignStateStore = { load(assetId: string): Promise; save( assetId: string, @@ -26,7 +26,7 @@ export type UiDesignStateStore = { export function createTauriUiDesignStateStore( projectPath: string, expectedProjectId: string, -): UiDesignStateStore { +): IUiDesignStateStore { return { load(assetId) { return invoke('load_ui_design_state', { @@ -47,17 +47,17 @@ export function createTauriUiDesignStateStore( }; } -const mockSnapshots = new Map(); +const snapshots = new Map(); -export const mockUiDesignStateStore: UiDesignStateStore = { +export const uiDesignStateStore: IUiDesignStateStore = { async load(assetId) { - const snapshot = mockSnapshots.get(assetId); + const snapshot = snapshots.get(assetId); return snapshot ? structuredClone(snapshot) : { revision: 0, state: structuredClone(EMPTY_UI_EDITOR_STATE) }; }, async save(assetId, expectedRevision, state) { - const current = mockSnapshots.get(assetId) ?? { + const current = snapshots.get(assetId) ?? { revision: 0, state: structuredClone(EMPTY_UI_EDITOR_STATE), }; @@ -68,7 +68,7 @@ export const mockUiDesignStateStore: UiDesignStateStore = { revision: current.revision + 1, state: structuredClone(state), }; - mockSnapshots.set(assetId, next); + snapshots.set(assetId, next); return { status: 'saved', state: structuredClone(next.state), diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx index 31ceb4524..9997a7ccd 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/index.tsx @@ -4,8 +4,8 @@ import { useMemo, useState } from 'react'; import { ThemedModal } from '../../components/modal/ThemedModal'; import { createTauriUiDesignStateStore, - mockUiDesignStateStore, - type UiDesignStateStore, + type IUiDesignStateStore, + uiDesignStateStore, } from '../../features/ui-editor/uiDesignStateStore'; import { BindingOverview } from './components/BindingOverview'; import { EditorDialogs } from './components/EditorDialogs'; @@ -35,14 +35,14 @@ export default function UiEditorPage({ projectId?: string; resourceLabel?: string; onBack?: () => void; - stateStore?: UiDesignStateStore; + stateStore?: IUiDesignStateStore; }) { const resolvedStore = useMemo( () => stateStore ?? (resourceId && projectId ? createTauriUiDesignStateStore(projectPath, projectId) - : mockUiDesignStateStore), + : uiDesignStateStore), [projectId, projectPath, resourceId, stateStore], ); const session = useUiEditorSession(projectPath, resourceId, resolvedStore); diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/useUiEditorPage.ts b/apps/ai-game-creator-shell/src/view/ui-editor/useUiEditorPage.ts index e25984e5b..ce2780de0 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/useUiEditorPage.ts +++ b/apps/ai-game-creator-shell/src/view/ui-editor/useUiEditorPage.ts @@ -29,8 +29,8 @@ import type { UIDesignImageRole } from '../../features/ui-editor/types/UIDesignI import type { UIDesignSuggestionTreeNode } from '../../features/ui-editor/types/UIDesignSuggestionTreeNode'; import type { UiNodeMoveRequest } from '../../features/ui-editor/types/UiNodeMoveRequest'; import { - mockUiDesignStateStore, - type UiDesignStateStore, + type IUiDesignStateStore, + uiDesignStateStore, } from '../../features/ui-editor/uiDesignStateStore'; import { applyUiDesignSuggestions } from '../../features/ui-editor/uiDesignSuggestions'; import { useUiEditorFontFaces } from '../../features/ui-editor/useUiEditorFontFaces'; @@ -170,7 +170,7 @@ export type PendingWorkflowStepChange = { export function useUiEditorSession( projectPath: string, resourceId?: string, - stateStore: UiDesignStateStore = mockUiDesignStateStore, + stateStore: IUiDesignStateStore = uiDesignStateStore, ) { const editor = useUiEditorState(EMPTY_UI_EDITOR_STATE); const replaceEditorState = editor.replaceState; diff --git a/apps/ai-game-creator-shell/tests/uiDesignStateStore.test.ts b/apps/ai-game-creator-shell/tests/uiDesignStateStore.test.ts index bd3c1813e..162155965 100644 --- a/apps/ai-game-creator-shell/tests/uiDesignStateStore.test.ts +++ b/apps/ai-game-creator-shell/tests/uiDesignStateStore.test.ts @@ -6,26 +6,26 @@ import { invoke } from '@tauri-apps/api/core'; import { createTauriUiDesignStateStore, - mockUiDesignStateStore, + uiDesignStateStore, } from '../src/features/ui-editor/uiDesignStateStore'; describe('UI 设计 State mock store', () => { it('按资源保留快照并拒绝过期 revision', async () => { - const first = await mockUiDesignStateStore.load('ui-1'); + const first = await uiDesignStateStore.load('ui-1'); first.state.ui_trees.push({} as never); await expect( - mockUiDesignStateStore.save('ui-1', first.revision, first.state), + uiDesignStateStore.save('ui-1', first.revision, first.state), ).resolves.toMatchObject({ status: 'saved', revision: 1, }); - await expect(mockUiDesignStateStore.load('ui-1')).resolves.toMatchObject({ + await expect(uiDesignStateStore.load('ui-1')).resolves.toMatchObject({ revision: 1, state: { ui_trees: [{}] }, }); await expect( - mockUiDesignStateStore.save('ui-1', first.revision, first.state), + uiDesignStateStore.save('ui-1', first.revision, first.state), ).resolves.toMatchObject({ status: 'conflict', current: { revision: 1 } }); }); diff --git a/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts b/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts index 667e030f0..d7510084e 100644 --- a/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts +++ b/apps/ai-game-creator-shell/tests/uiEditorPage.test.ts @@ -28,8 +28,8 @@ import { invoke } from '@tauri-apps/api/core'; import type { Node as UiNode } from '../src/features/ui-editor/types/Node'; import type { State } from '../src/features/ui-editor/types/State'; import type { + IUiDesignStateStore, UiDesignStateSnapshot, - UiDesignStateStore, } from '../src/features/ui-editor/uiDesignStateStore'; import UiEditorPage from '../src/view/ui-editor'; import { useUiEditorSession } from '../src/view/ui-editor/useUiEditorPage'; @@ -78,6 +78,7 @@ function node(id: string, children: UiNode[] = []): UiNode { source: 'System', }, components: [], + children_display_mode: undefined, children, }; } @@ -133,7 +134,7 @@ function stateWithPages(pageIds: string[]): State { } async function renderLoadedSession(state: State) { - const stateStore: UiDesignStateStore = { + const stateStore: IUiDesignStateStore = { load: vi.fn().mockResolvedValue({ revision: 0, state }), save: vi.fn(), }; @@ -158,7 +159,7 @@ describe('UiEditorPage', () => { configurable: true, value: { core: { invoke } }, }); - const stateStore: UiDesignStateStore = { + const stateStore: IUiDesignStateStore = { load: vi.fn().mockResolvedValue({ revision: 0, state: stateWithPages(['page']), @@ -216,7 +217,7 @@ describe('UiEditorPage', () => { it('does not cancel a preview scope before state loading creates one', () => { vi.mocked(invoke).mockClear(); - const stateStore: UiDesignStateStore = { + const stateStore: IUiDesignStateStore = { load: vi.fn(() => new Promise(() => undefined)), save: vi.fn(), }; @@ -533,7 +534,7 @@ describe('UiEditorPage', () => { }); it('shows a page-level save failure and allows a retry', async () => { - const stateStore: UiDesignStateStore = { + const stateStore: IUiDesignStateStore = { load: vi.fn().mockResolvedValue(structuredClone(EMPTY_SNAPSHOT)), save: vi.fn().mockRejectedValue(new Error('临时存储不可用')), }; @@ -563,7 +564,7 @@ describe('UiEditorPage', () => { }); it('keeps the dedicated message for a save conflict', async () => { - const stateStore: UiDesignStateStore = { + const stateStore: IUiDesignStateStore = { load: vi.fn().mockResolvedValue(structuredClone(EMPTY_SNAPSHOT)), save: vi.fn().mockResolvedValue({ status: 'conflict',