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 f2a81d7d8..f86ba9696 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 @@ -666,6 +666,12 @@ const ResourceCard = memo(function ResourceCard({ onPreviewDecodeError( previewIdentity, @@ -1299,10 +1305,6 @@ export default function ProjectDevelopmentView({ const [hiddenCommittedResourceId, setHiddenCommittedResourceId] = useState< string | null >(null); - const [ - resourcePreviewVersionByResourceId, - setResourcePreviewVersionByResourceId, - ] = useState>(() => new Map()); const [approvalMode, setApprovalMode] = useState('strict'); const [approvalDialogOpen, setApprovalDialogOpen] = useState(false); const [approvalNotice, setApprovalNotice] = useState(''); @@ -1819,16 +1821,50 @@ export default function ProjectDevelopmentView({ ), }; }, [resourceGraph.referenceEdges, resourceGraph.taskFlows, resources]); + // 栏目级资源分组必须早于卡片预览 Hook:当前分页栏目、以及热预取要喂的资源集合 + // 都由它派生。它只依赖 `canvasResources` 与 `categoryOrder`,上移不引入前向引用。 + const projectResourcesByCategory = useMemo( + () => + new Map( + categoryOrder.map((category) => [ + category, + canvasResources.filter((resource) => resource.category === category), + ]), + ), + [canvasResources], + ); + // 当前分页栏目必须早于卡片预览 Hook 求出:热预取只喂当前栏目。 + // 传全量投影时前 12 张可能落在别的栏目,用户看不到的卡片先占满读取槽, + // 看得见的卡片反而要排队。 + const resourcePageCategoryKey = useMemo( + () => createResourceCanvasPageCategorySignature(canvasResources), + [canvasResources], + ); + const resourcePageCategories = useMemo( + () => (resourcePageCategoryKey ? [...categoryOrder] : []), + [resourcePageCategoryKey], + ); + const activePageCategory = + resourcePageCategories.find( + (category) => category === activeResourceCategory, + ) ?? + resourcePageCategories.find( + (category) => (projectResourcesByCategory.get(category)?.length ?? 0) > 0, + ) ?? + resourcePageCategories[0] ?? + null; + const activePageResources = activePageCategory + ? (projectResourcesByCategory.get(activePageCategory) ?? []) + : []; const resourceCardPreviews = useProjectResourceCardPreviews({ projectPath, projectId: manifest.projectId, mode: sortMode, - resources: canvasResources, + resources: activePageResources, canvasRef: resourceCanvasRef, // 资源卡片渲染在资源画本场景里,可见性判定要用真正包含它们的容器。 intersectionRootRef: resourceBookManagerRef, eagerPreviewLimit: 12, - previewVersionByResourceId: resourcePreviewVersionByResourceId, }); const resourceCardSizeByResourceId = useMemo( () => @@ -1948,16 +1984,6 @@ export default function ProjectDevelopmentView({ ), [visibleResources], ); - const projectResourcesByCategory = useMemo( - () => - new Map( - categoryOrder.map((category) => [ - category, - canvasResources.filter((resource) => resource.category === category), - ]), - ), - [canvasResources], - ); const resourceIdsByCategory = useMemo( () => new Map( @@ -1986,23 +2012,6 @@ export default function ProjectDevelopmentView({ token: transitionToken, }); }, [resourceCategoryScopeKey]); - const resourcePageCategoryKey = useMemo( - () => createResourceCanvasPageCategorySignature(canvasResources), - [canvasResources], - ); - const resourcePageCategories = useMemo( - () => (resourcePageCategoryKey ? [...categoryOrder] : []), - [resourcePageCategoryKey], - ); - const activePageCategory = - resourcePageCategories.find( - (category) => category === activeResourceCategory, - ) ?? - resourcePageCategories.find( - (category) => (projectResourcesByCategory.get(category)?.length ?? 0) > 0, - ) ?? - resourcePageCategories[0] ?? - null; const registerResourceBookThumbnail = useCallback( (category: ResourceCategory, element: HTMLElement | null) => { @@ -2287,9 +2296,6 @@ export default function ProjectDevelopmentView({ activePageExtent.y, ], ); - const activePageResources = activePageCategory - ? (projectResourcesByCategory.get(activePageCategory) ?? []) - : []; const activePageLayoutReady = activePageResources.every((resource) => resourcePositionById.has(resource.id), ); @@ -3236,7 +3242,6 @@ export default function ProjectDevelopmentView({ setPendingResourceEditsError(''); setPendingResourceEditActionErrors(new Map()); setResourceEditServiceIdentityConfirmations(new Map()); - setResourcePreviewVersionByResourceId(new Map()); resourceRecoveryPanelEpochRef.current += 1; setResourceRecoveryPanelOpen(false); pendingResourceEditActionIdsRef.current = new Set();