From b460fea02cfed129d884b476adb636db37d34c07 Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Wed, 9 Sep 2026 17:29:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E8=B5=84=E6=BA=90=E7=94=BB?= =?UTF-8?q?=E5=B8=83=E5=8A=A0=E8=BD=BD=E8=BD=AC=E5=9C=88=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 转圈的判定与状态联动引入了多处副作用,按要求整体移除 删除 ResourceBookThumbnail 的 loading 属性与框内转圈、resourceBookIsLoading 判定函数、对应样式和用例 资源画布恢复为不显示加载态 --- apps/ai-game-creator-shell/src/styles.css | 11 ---- .../src/view/project-development/index.tsx | 62 ------------------- .../project-development/resourceBookModel.ts | 22 ------- .../tests/resourceBookModel.test.ts | 38 ------------ 4 files changed, 133 deletions(-) diff --git a/apps/ai-game-creator-shell/src/styles.css b/apps/ai-game-creator-shell/src/styles.css index 9103e5587..8017ff63c 100644 --- a/apps/ai-game-creator-shell/src/styles.css +++ b/apps/ai-game-creator-shell/src/styles.css @@ -5634,17 +5634,6 @@ iframe.preview-frame { pointer-events: none; } -.game-resource-book-thumbnail-loading { - position: absolute; - inset: 42px 0 0; - z-index: 3; - display: flex; - align-items: center; - justify-content: center; - color: #c46a40; - pointer-events: none; -} - .game-resource-book-manager[data-book-motion='running'] .game-resource-book-scene-world { opacity: 0; 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 370ecd372..38b1a3563 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 @@ -10,7 +10,6 @@ import { Image, Info, ListFilter, - Loader2, Maximize2, Minus, Music2, @@ -99,7 +98,6 @@ import { } from './resourceBookLayout'; import { initialResourceBookState, - resourceBookIsLoading, resourceBookReducer, resourceBookSceneCategory, resourceBookShowsChildCards, @@ -912,7 +910,6 @@ function ResourceBookThumbnail({ resources, onOpen, registerElement, - loading = false, }: { category: ResourceCategory; resources: ProjectResource[]; @@ -921,7 +918,6 @@ function ResourceBookThumbnail({ category: ResourceCategory, element: HTMLElement | null, ) => void; - loading?: boolean; }) { const stacks = Array.from( resources.reduce((groups, resource) => { @@ -980,15 +976,6 @@ function ResourceBookThumbnail({ 打开{categoryLabels[category]} - {loading ? ( - - - ) : null} ); } @@ -2202,40 +2189,6 @@ export default function ProjectDevelopmentView({ sortMode, visibleCategoryOrder, ]); - // 每个功能画布框内各自判断加载态:该栏目一张预览都没落地时转圈。 - const resourceBookCategorySettledPreviews = useMemo(() => { - const counts = new Map< - ResourceCategory, - { previewable: number; settled: number } - >(); - for (const resource of visibleResources) { - const kind = projectResourceCardPreviewKind(resource); - // 版本、占位和音频卡片本来就不请求卡片预览,不能计入加载等待。 - if (kind === 'version' || kind === 'placeholder' || kind === 'audio') { - continue; - } - const entry = counts.get(resource.category) ?? { - previewable: 0, - settled: 0, - }; - entry.previewable += 1; - const identity = resourceCardPreviews.identityByResourceId.get( - resource.id, - ); - const status = identity - ? resourceCardPreviews.previews.get(identity)?.status - : undefined; - if (status === 'loaded' || status === 'failed') { - entry.settled += 1; - } - counts.set(resource.category, entry); - } - return counts; - }, [ - resourceCardPreviews.identityByResourceId, - resourceCardPreviews.previews, - visibleResources, - ]); const setResourceCanvasViewport = useCallback( ( category: ResourceCategory, @@ -5791,21 +5744,6 @@ export default function ProjectDevelopmentView({ } onOpen={openResourceBookChild} registerElement={registerResourceBookThumbnail} - loading={resourceBookIsLoading({ - resourceCount: - projectResourcesByCategory.get(category) - ?.length ?? 0, - cardsReady: - sortMode !== 'dependency' || - resourceGraphInitializationReady, - previewableCount: - resourceBookCategorySettledPreviews.get(category) - ?.previewable ?? 0, - settledPreviewCount: - resourceBookCategorySettledPreviews.get( - category, - )?.settled ?? 0, - })} /> ))} diff --git a/apps/ai-game-creator-shell/src/view/project-development/resourceBookModel.ts b/apps/ai-game-creator-shell/src/view/project-development/resourceBookModel.ts index 1d7cd6b6a..63fdfb40d 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/resourceBookModel.ts +++ b/apps/ai-game-creator-shell/src/view/project-development/resourceBookModel.ts @@ -78,25 +78,3 @@ export function resourceBookShowsOverviewCards(state: ResourceBookState) { export function resourceBookShowsChildCards(state: ResourceBookState) { return state.view === 'child'; } - -/** - * 每个功能画布框内各自显示加载态。两种情况都要转圈: - * 1. 卡片本身还没渲染出来(依赖图/布局就绪之前整块画布是空的); - * 2. 卡片已渲染,但该栏目需要预览的素材一张都还没落地。 - * 预览失败同样算落地,避免一直转圈;加载态不拦截点击,没加载完也能进栏目。 - */ -export function resourceBookIsLoading({ - resourceCount, - cardsReady, - previewableCount, - settledPreviewCount, -}: { - resourceCount: number; - cardsReady: boolean; - previewableCount: number; - settledPreviewCount: number; -}) { - if (resourceCount <= 0) return false; - if (!cardsReady) return true; - return previewableCount > 0 && settledPreviewCount <= 0; -} diff --git a/apps/ai-game-creator-shell/tests/resourceBookModel.test.ts b/apps/ai-game-creator-shell/tests/resourceBookModel.test.ts index 586a28d3d..46ff789db 100644 --- a/apps/ai-game-creator-shell/tests/resourceBookModel.test.ts +++ b/apps/ai-game-creator-shell/tests/resourceBookModel.test.ts @@ -2,7 +2,6 @@ import { describe, expect, it } from 'vitest'; import { initialResourceBookState, - resourceBookIsLoading, resourceBookReducer, resourceBookSceneCategory, resourceBookShowsOverviewCards, @@ -104,40 +103,3 @@ describe('resource book state machine', () => { ).toEqual(switched); }); }); - -describe('resource book loading state', () => { - const ready = { - resourceCount: 3, - cardsReady: true, - previewableCount: 3, - settledPreviewCount: 1, - }; - - it('never spins for an empty section', () => { - expect(resourceBookIsLoading({ ...ready, resourceCount: 0 })).toBe(false); - }); - - it('spins while the section cards are not rendered yet', () => { - expect(resourceBookIsLoading({ ...ready, cardsReady: false })).toBe(true); - }); - - it('spins while the section still has no settled preview', () => { - expect( - resourceBookIsLoading({ ...ready, settledPreviewCount: 0 }), - ).toBe(true); - }); - - it('does not wait for previews on sections that never request them', () => { - expect( - resourceBookIsLoading({ - ...ready, - previewableCount: 0, - settledPreviewCount: 0, - }), - ).toBe(false); - }); - - it('stops as soon as one preview in that section settles', () => { - expect(resourceBookIsLoading(ready)).toBe(false); - }); -});