From cca4881e13e3c66f498281aac8b9cbc01d11a83a Mon Sep 17 00:00:00 2001 From: Suzumiya Date: Wed, 9 Sep 2026 17:11:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=94=BB=E5=B8=83=E4=B8=8D=E6=98=BE=E7=A4=BA=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原先只在「该栏目有可预览素材且一张都没落地」时转圈;版本、音频这类不请求预览的栏目既不转圈,卡片又要等依赖图就绪才渲染,表现为美术资源转完后项目版本才一起出现 判定改为:有资源且(卡片尚未渲染 或 需要预览但一张都没落地)就转圈,每个栏目各自独立结束 补充 resourceBookModel 用例覆盖卡片未渲染与无需预览两种情况 --- .../src/view/project-development/index.tsx | 6 ++++ .../project-development/resourceBookModel.ts | 14 +++++++-- .../tests/resourceBookModel.test.ts | 31 ++++++++++++++----- 3 files changed, 41 insertions(+), 10 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 493959669..ce3b2b25f 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 @@ -5783,6 +5783,12 @@ export default function ProjectDevelopmentView({ registerElement={registerResourceBookThumbnail} loading={resourceBookIsLoading({ resourceCount: + projectResourcesByCategory.get(category) + ?.length ?? 0, + cardsReady: + sortMode !== 'dependency' || + resourceGraphInitializationReady, + previewableCount: resourceBookCategorySettledPreviews.get(category) ?.previewable ?? 0, settledPreviewCount: 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 626e1edaa..1d7cd6b6a 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 @@ -80,15 +80,23 @@ export function resourceBookShowsChildCards(state: ResourceBookState) { } /** - * 每个功能画布框内各自显示加载态:该栏目还有资源、但一张预览都没落地时转圈。 - * 预览失败同样算落地,避免一直转圈;加载态不拦截点击,没加载出来也能进栏目。 + * 每个功能画布框内各自显示加载态。两种情况都要转圈: + * 1. 卡片本身还没渲染出来(依赖图/布局就绪之前整块画布是空的); + * 2. 卡片已渲染,但该栏目需要预览的素材一张都还没落地。 + * 预览失败同样算落地,避免一直转圈;加载态不拦截点击,没加载完也能进栏目。 */ export function resourceBookIsLoading({ resourceCount, + cardsReady, + previewableCount, settledPreviewCount, }: { resourceCount: number; + cardsReady: boolean; + previewableCount: number; settledPreviewCount: number; }) { - return resourceCount > 0 && settledPreviewCount <= 0; + 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 76563aa0e..586a28d3d 100644 --- a/apps/ai-game-creator-shell/tests/resourceBookModel.test.ts +++ b/apps/ai-game-creator-shell/tests/resourceBookModel.test.ts @@ -106,21 +106,38 @@ describe('resource book state machine', () => { }); describe('resource book loading state', () => { + const ready = { + resourceCount: 3, + cardsReady: true, + previewableCount: 3, + settledPreviewCount: 1, + }; + it('never spins for an empty section', () => { - expect( - resourceBookIsLoading({ resourceCount: 0, settledPreviewCount: 0 }), - ).toBe(false); + expect(resourceBookIsLoading({ ...ready, resourceCount: 0 })).toBe(false); }); - it('spins while a section still has no settled preview', () => { + 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({ resourceCount: 3, settledPreviewCount: 0 }), + resourceBookIsLoading({ ...ready, settledPreviewCount: 0 }), ).toBe(true); }); - it('stops as soon as one preview in that section settles', () => { + it('does not wait for previews on sections that never request them', () => { expect( - resourceBookIsLoading({ resourceCount: 3, settledPreviewCount: 1 }), + resourceBookIsLoading({ + ...ready, + previewableCount: 0, + settledPreviewCount: 0, + }), ).toBe(false); }); + + it('stops as soon as one preview in that section settles', () => { + expect(resourceBookIsLoading(ready)).toBe(false); + }); });