From 0ec0a13cbc46ff0dcda3e74daea96ab1cf5c13af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 13:29:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E9=97=AD=203D=20=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E6=97=B6=E6=B8=85=E6=8E=89=E6=9F=A5=E7=9C=8B?= =?UTF-8?q?=E5=99=A8=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/components/image-editor/model3d-preview/Model3dViewerModal.tsx:layer 变 null(面板关闭)时把 viewerStatus 复位,下一次打开从禁用的「重置视角」开始,不再继承上一轮实例的 ready;只处理关闭不处理换模型,避免 effect 晚于查看器上报而盖掉 loading - src/components/image-editor/model3d-preview/Model3dViewerModal.test.tsx:新增「关闭后重开不沿用 ready」的回归用例 验证:npx vitest run src/components/image-editor/model3d-preview(18 用例全绿) --- .../model3d-preview/Model3dViewerModal.test.tsx | 16 ++++++++++++++++ .../model3d-preview/Model3dViewerModal.tsx | 10 +++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/components/image-editor/model3d-preview/Model3dViewerModal.test.tsx b/src/components/image-editor/model3d-preview/Model3dViewerModal.test.tsx index b7dc2312c..bf75637e3 100644 --- a/src/components/image-editor/model3d-preview/Model3dViewerModal.test.tsx +++ b/src/components/image-editor/model3d-preview/Model3dViewerModal.test.tsx @@ -195,4 +195,20 @@ describe('Model3dViewerModal', () => { expect(screen.queryByRole('dialog', { name: '3D模型预览' })).toBeNull(); }); + + it('关闭面板后重开不沿用上一轮的 ready 状态', () => { + const layer = createLayer(); + const { rerender } = renderModal(layer); + const resetButton = () => + screen.getByRole('button', { name: '重置视角' }) as HTMLButtonElement; + + expect(resetButton().disabled).toBe(false); + + rerender(); + // 重开后的新查看器本轮不上报状态,按钮必须保持禁用,不能继承上一轮的 ready。 + reportedStatus.status = 'idle'; + rerender(); + + expect(resetButton().disabled).toBe(true); + }); }); diff --git a/src/components/image-editor/model3d-preview/Model3dViewerModal.tsx b/src/components/image-editor/model3d-preview/Model3dViewerModal.tsx index 67e2f8dfb..e33d1201b 100644 --- a/src/components/image-editor/model3d-preview/Model3dViewerModal.tsx +++ b/src/components/image-editor/model3d-preview/Model3dViewerModal.tsx @@ -5,7 +5,7 @@ import { type Model3dViewerStatus, type Model3dViewerStatusDetail, } from '@genarrative/model3d-viewer'; -import { useRef, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { useResolvedAssetReadUrl } from '../../../hooks/useResolvedAssetReadUrl'; import { PlatformActionButton } from '../../common/PlatformActionButton'; @@ -111,6 +111,14 @@ export function Model3dViewerModal({ MODEL3D_VIEWER_FAILURE_FALLBACK_TEXT, ); + // 面板关闭(layer 变 null)时清掉状态,让下一次打开从禁用的「重置视角」重新开始。 + // 只处理关闭、不处理换模型:换模型时查看器会立刻上报,effect 晚一步会把 loading 盖掉。 + useEffect(() => { + if (viewerIdentity === null) { + setViewerStatus(null); + } + }, [viewerIdentity]); + return (