diff --git a/src/components/image-editor/ImageCanvasEditorView.test.tsx b/src/components/image-editor/ImageCanvasEditorView.test.tsx index a29a45263..9638e2504 100644 --- a/src/components/image-editor/ImageCanvasEditorView.test.tsx +++ b/src/components/image-editor/ImageCanvasEditorView.test.tsx @@ -708,6 +708,12 @@ describe('ImageCanvasEditorView', () => { getPlatformProfileRechargeCenterMock.mockRejectedValue( new Error('network down'), ); + // 真实链路里 AuthGate 挂载 usePlatformWalletLifecycle 时会触发首次余额读取;本用例独立渲染 + // ImageCanvasEditorView,需手动补上这一步。否则 store 停在 idle,入口把它当成 loading 而 + // 跳过 hover 触发的明细请求,弹层会永远停在「余额读取中」。 + await act(async () => { + await usePlatformWalletStore.getState().onWalletBalanceMayHaveChanged(); + }); render( { const details = await screen.findByRole('dialog', { name: '会员与泥点账户详情', }); - expect(within(details).getByText('泥点明细读取失败')).toBeTruthy(); + // 详情弹层打开即渲染 loading 态,读取失败的 rejection 在下一个微任务才提交; + // 必须等待错误文案出现,否则同步 getByText 会稳定命中的是「余额读取中」。 + expect(await within(details).findByText('泥点明细读取失败')).toBeTruthy(); expect(within(details).queryByText('充值中心响应缺少泥点余额')).toBeNull(); expect(within(details).queryByText('永久泥点')).toBeNull(); expect(within(details).queryByText('每日免费泥点')).toBeNull(); diff --git a/src/components/image-editor/ImageCanvasEditorView.tsx b/src/components/image-editor/ImageCanvasEditorView.tsx index e417b1dee..ff65cfe2b 100644 --- a/src/components/image-editor/ImageCanvasEditorView.tsx +++ b/src/components/image-editor/ImageCanvasEditorView.tsx @@ -2527,7 +2527,9 @@ export function ImageCanvasEditorView({ walletBreakdown: mudPointBalance, isWalletBalanceLoading, isWalletDetailsLoading: isLoadingRechargeCenter, - walletDetailsError: rechargeError || mudPointBalanceError || null, + // 明细弹层展示的正是钱包 store 的 breakdown;其读取失败文案优先于充值弹层的原始报错, + // 避免把「读详情」的原始错误串(如 network down)泄漏到顶栏明细里。 + walletDetailsError: mudPointBalanceError || rechargeError || null, currentUser: authUi?.user, assetExportStatus, isExportingAssets,