修复资源分页类别缓存回归

资源分页复用完整资源签名以识别同数量类别变化

补充同长度类别变化回归测试
This commit is contained in:
2026-09-07 16:00:11 +08:00
parent ccb3a3ab6a
commit c5bbb864f5
4 changed files with 28 additions and 4 deletions
@@ -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 =
@@ -6,6 +6,15 @@ export type ResourceCanvasPageWheelState<TCategory> = {
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<TCategory> {
@@ -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,
@@ -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, {