From c5bbb864f57421c3cd6318bcaf6ab233c8923067 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Mon, 7 Sep 2026 16:00:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B5=84=E6=BA=90=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E7=B1=BB=E5=88=AB=E7=BC=93=E5=AD=98=E5=9B=9E=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 资源分页复用完整资源签名以识别同数量类别变化 补充同长度类别变化回归测试 --- .../src/view/project-development/index.tsx | 5 +++-- .../resourceCanvasController.ts | 9 +++++++++ .../tests/appSurface/project-development.suite.ts | 4 ++-- .../tests/resourceCanvasController.test.ts | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/apps/ai-game-creator-shell/src/view/project-development/index.tsx b/apps/ai-game-creator-shell/src/view/project-development/index.tsx index 043f8f3cf..617f24059 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/index.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/index.tsx @@ -112,6 +112,7 @@ import { zoomResourceBookViewport, } from './resourceBookViewport'; import { + createResourceCanvasPageCategorySignature, createResourceCanvasPageWheelState, queueResourceCanvasPageWheel, resetResourceCanvasPageWheel, @@ -1826,11 +1827,11 @@ export default function ProjectDevelopmentView({ }); }, [resourceCategoryScopeKey]); const resourcePageCategoryKey = useMemo( - () => canvasResources.map((resource) => resource.category).join('|'), + () => createResourceCanvasPageCategorySignature(canvasResources), [canvasResources], ); const resourcePageCategories = useMemo( - () => (resourcePageCategoryKey ? visibleCategoryOrder : []), + () => (resourcePageCategoryKey ? [...visibleCategoryOrder] : []), [resourcePageCategoryKey], ); const activePageCategory = diff --git a/apps/ai-game-creator-shell/src/view/project-development/resourceCanvasController.ts b/apps/ai-game-creator-shell/src/view/project-development/resourceCanvasController.ts index 8a7432f3b..d2789348b 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/resourceCanvasController.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/resourceCanvasController.ts @@ -6,6 +6,15 @@ export type ResourceCanvasPageWheelState = { pendingTimerId: number | null; }; +export function createResourceCanvasPageCategorySignature< + TCategory extends string, +>(resources: readonly { category: TCategory }[]) { + return resources + .map((resource) => resource.category) + .sort() + .join('|'); +} + export function createResourceCanvasPageWheelState< TCategory, >(): ResourceCanvasPageWheelState { diff --git a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts index 0367f8af8..cacfa4d36 100644 --- a/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts +++ b/apps/ai-game-creator-shell/tests/appSurface/project-development.suite.ts @@ -1315,7 +1315,7 @@ export function registerProjectWorkbenchFoundationTests() { }); }); - it('renders an imported image as a resource-canvas card after manifest refresh', async () => { + it('refreshes resource pages when a same-count manifest update changes category', async () => { const manifest = createGameCreationAppManifest( 'workbench-imported-image-canvas', '导入图片资源画布测试', @@ -1385,7 +1385,6 @@ export function registerProjectWorkbenchFoundationTests() { const refreshedManifest = { ...manifest, assets: [ - ...manifest.assets, { id: 'imported-image', kind: 'ui', @@ -1398,6 +1397,7 @@ export function registerProjectWorkbenchFoundationTests() { }, ], }; + expect(refreshedManifest.assets).toHaveLength(manifest.assets.length); rendered.rerender( React.createElement(ProjectDevelopmentView, { ...viewProps, diff --git a/apps/ai-game-creator-shell/tests/resourceCanvasController.test.ts b/apps/ai-game-creator-shell/tests/resourceCanvasController.test.ts index 2a76877a0..213a94388 100644 --- a/apps/ai-game-creator-shell/tests/resourceCanvasController.test.ts +++ b/apps/ai-game-creator-shell/tests/resourceCanvasController.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest'; import { + createResourceCanvasPageCategorySignature, createResourceCanvasPageWheelState, queueResourceCanvasPageWheel, resetResourceCanvasPageWheel, @@ -8,6 +9,19 @@ import { } from '../src/view/project-development/resourceCanvasController'; describe('resource canvas page wheel controller', () => { + it('invalidates page categories for same-count category changes without reacting to resource order', () => { + const original = [{ category: 'document' }, { category: 'art' }]; + const reordered = [...original].reverse(); + const changed = [{ category: 'document' }, { category: 'audio' }]; + + expect(createResourceCanvasPageCategorySignature(reordered)).toBe( + createResourceCanvasPageCategorySignature(original), + ); + expect(createResourceCanvasPageCategorySignature(changed)).not.toBe( + createResourceCanvasPageCategorySignature(original), + ); + }); + it('keeps the 20px threshold and converts wheel deltas into page steps', () => { const state = createResourceCanvasPageWheelState<'document'>(); queueResourceCanvasPageWheel(state, {