收口危险操作确认弹窗
新增 PlatformDangerConfirmDialog 统一承接危险确认壳层 迁移平台入口删除作品确认复用共享危险确认弹窗 迁移 RPG 结果页重新生成确认复用共享危险确认弹窗 补充共享组件测试并更新 PlatformUiKit 收口文档与决策记录
This commit is contained in:
@@ -39,6 +39,7 @@
|
|||||||
- 2026-06-10 追加:推荐页运行态卡片底部的点赞 / 分享 / 改造入口,以及创作中心公开作品卡右上角分享入口统一迁移到 `PlatformIconButton`;这类和 swipe / drag 手势耦合的图标动作必须继续保留业务局部 class 与 `onPointerDown` / `onClick` 里的 `stopPropagation`,只把按钮语义、可访问名称和默认 `type="button"` 收口到共享组件,避免图标动作误触推荐卡切换、整卡打开或残留左滑状态。
|
- 2026-06-10 追加:推荐页运行态卡片底部的点赞 / 分享 / 改造入口,以及创作中心公开作品卡右上角分享入口统一迁移到 `PlatformIconButton`;这类和 swipe / drag 手势耦合的图标动作必须继续保留业务局部 class 与 `onPointerDown` / `onClick` 里的 `stopPropagation`,只把按钮语义、可访问名称和默认 `type="button"` 收口到共享组件,避免图标动作误触推荐卡切换、整卡打开或残留左滑状态。
|
||||||
- 2026-06-10 追加:标准泥点消耗确认弹窗统一收口到 `src/components/common/PlatformMudPointConfirmDialog.tsx`;该 Module 专门承接“确认消耗泥点 + 消耗 N 泥点”的同形态确认骨架,当前已覆盖 `PuzzleCreationWorkspace.tsx`、`Match3DCreationWorkspace.tsx`、`PuzzleResultView.tsx` 与 `Match3DResultView.tsx`。后续遇到同形态泥点确认时,业务页只传点数、补充说明和确认回调,不再重复拼接 `UnifiedConfirmDialog` 正文;`RpgCreationRoleAssetStudioModalImpl` 这类节奏和内容结构不同的泥点弹层继续单独评估,留作后续轮次处理。
|
- 2026-06-10 追加:标准泥点消耗确认弹窗统一收口到 `src/components/common/PlatformMudPointConfirmDialog.tsx`;该 Module 专门承接“确认消耗泥点 + 消耗 N 泥点”的同形态确认骨架,当前已覆盖 `PuzzleCreationWorkspace.tsx`、`Match3DCreationWorkspace.tsx`、`PuzzleResultView.tsx` 与 `Match3DResultView.tsx`。后续遇到同形态泥点确认时,业务页只传点数、补充说明和确认回调,不再重复拼接 `UnifiedConfirmDialog` 正文;`RpgCreationRoleAssetStudioModalImpl` 这类节奏和内容结构不同的泥点弹层继续单独评估,留作后续轮次处理。
|
||||||
- 2026-06-10 追加:`RpgCreationRoleAssetStudioModalImpl.tsx` 的角色形象生成 / 动作草稿生成确认也并入 `PlatformMudPointConfirmDialog`;共享组件通过自定义 title 与补充说明承接工坊语义,工坊页不再单独维护 `UnifiedConfirmDialog` 的标准泥点文案骨架。后续同类“确认消耗泥点 + 补充说明”场景继续优先复用该 Module。
|
- 2026-06-10 追加:`RpgCreationRoleAssetStudioModalImpl.tsx` 的角色形象生成 / 动作草稿生成确认也并入 `PlatformMudPointConfirmDialog`;共享组件通过自定义 title 与补充说明承接工坊语义,工坊页不再单独维护 `UnifiedConfirmDialog` 的标准泥点文案骨架。后续同类“确认消耗泥点 + 补充说明”场景继续优先复用该 Module。
|
||||||
|
- 2026-06-10 追加:平台危险确认统一收口到 `src/components/common/PlatformDangerConfirmDialog.tsx`;该 Module 专门承接“确认 / 取消 + 危险主动作”的标准骨架,当前已覆盖 `PlatformEntryFlowShellImpl.tsx` 的删除作品确认和 `RpgCreationResultViewImpl.tsx` 的重新生成确认。后续删除、覆盖、清空等危险动作优先复用该 Module,不再在业务页重复拼接 `UnifiedConfirmDialog` 的 `showCancel + confirmTone=\"danger\"` 组合。
|
||||||
- 2026-06-10 追加:RPG 首页个人中心里的统计卡、统计骨架、常用功能入口、设置行和法律信息入口统一抽到 `src/components/platform-entry/PlatformProfilePrimitives.tsx`;这组纯展示原子以后优先通过 props 接收图片资源、点击回调和展示文案,不再继续塞回 `RpgEntryHomeView` 的账户控制逻辑里。新建 `PlatformProfilePrimitives.test.tsx` 作为组件级护栏,页面级布局与法律入口继续由 `RpgEntryHomeView.recharge.test.tsx` 兜底。
|
- 2026-06-10 追加:RPG 首页个人中心里的统计卡、统计骨架、常用功能入口、设置行和法律信息入口统一抽到 `src/components/platform-entry/PlatformProfilePrimitives.tsx`;这组纯展示原子以后优先通过 props 接收图片资源、点击回调和展示文案,不再继续塞回 `RpgEntryHomeView` 的账户控制逻辑里。新建 `PlatformProfilePrimitives.test.tsx` 作为组件级护栏,页面级布局与法律入口继续由 `RpgEntryHomeView.recharge.test.tsx` 兜底。
|
||||||
- 2026-06-10 追加:RPG 首页个人中心的充值 / 钱包 / 每日任务 / 邀请 / 兑换码等商业与账户控制逻辑统一收口到 `src/components/platform-entry/usePlatformProfileCenterController.ts`;controller 负责账户动作分流、商业状态派生与相关面板控制,`RpgEntryHomeView` 只保留展示、昵称头像编辑、扫码入口和页面级交互编排,不在页面组件里继续堆叠账户控制分支。验证命令:`npm run test -- src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx`、`npm run typecheck`。
|
- 2026-06-10 追加:RPG 首页个人中心的充值 / 钱包 / 每日任务 / 邀请 / 兑换码等商业与账户控制逻辑统一收口到 `src/components/platform-entry/usePlatformProfileCenterController.ts`;controller 负责账户动作分流、商业状态派生与相关面板控制,`RpgEntryHomeView` 只保留展示、昵称头像编辑、扫码入口和页面级交互编排,不在页面组件里继续堆叠账户控制分支。验证命令:`npm run test -- src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx`、`npm run typecheck`。
|
||||||
- 2026-06-10 追加:RPG 首页个人中心的“玩过 / 可继续”历史弹层统一抽到 `src/components/platform-entry/PlatformProfilePlayedWorksModal.tsx`;`RpgEntryHomeView` 不再内联 `SaveArchiveCard`、`ProfilePlayedWorksModal` 和未连通的 `ProfileSaveArchivesModal`。当前产品语义已经把存档恢复并入“玩过”弹层的“可继续”分区,因此 controller 里的 `ProfilePopupPanel` 也去掉了没有真实入口的 `saveArchives` 分支。验证命令:`npm run test -- src/components/platform-entry/PlatformProfilePlayedWorksModal.test.tsx src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx`、`npm run typecheck`。
|
- 2026-06-10 追加:RPG 首页个人中心的“玩过 / 可继续”历史弹层统一抽到 `src/components/platform-entry/PlatformProfilePlayedWorksModal.tsx`;`RpgEntryHomeView` 不再内联 `SaveArchiveCard`、`ProfilePlayedWorksModal` 和未连通的 `ProfileSaveArchivesModal`。当前产品语义已经把存档恢复并入“玩过”弹层的“可继续”分区,因此 controller 里的 `ProfilePopupPanel` 也去掉了没有真实入口的 `saveArchives` 分支。验证命令:`npm run test -- src/components/platform-entry/PlatformProfilePlayedWorksModal.test.tsx src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx`、`npm run typecheck`。
|
||||||
|
|||||||
@@ -244,6 +244,7 @@
|
|||||||
19.3.20. `PlatformStatusDialog` 继续扩展到 notice 场景:组件新增 header notice 布局、body content、close button、backdrop / Escape 关闭路径以及动作按钮样式透传;`PlatformEntryFlowShellImpl` 里的 `draftGenerationPointNotice` / `workNotFoundRecoveryDialog` 和 `RpgCreationEntityEditorShared.tsx` 里的 `EditorNoticeDialog` 已接入。创作入口泥点不足、作品不可用恢复和 RPG 大编辑器规则阻断提示不再各自维护 `UnifiedConfirmDialog` 壳层,只保留标题、正文、辅助提示和关闭回调。验证命令:`npm run test -- src/components/common/PlatformStatusDialog.test.tsx`、`npm run test -- src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx -t "bark battle form checks mud points before creating a draft|puzzle form checks mud points before creating a draft|match3d form checks mud points before creating a draft|direct missing public work detail shows unified dialog before returning home"`、`npm run test -- src/components/CustomWorldEntityEditorModal.test.tsx -t "可扮演角色至少保留一个背景章节时使用统一提示弹窗|场景连接缺少可连接目标时使用统一提示弹窗|场景保存缺少主角色时使用统一提示弹窗"`、`npm run typecheck`。
|
19.3.20. `PlatformStatusDialog` 继续扩展到 notice 场景:组件新增 header notice 布局、body content、close button、backdrop / Escape 关闭路径以及动作按钮样式透传;`PlatformEntryFlowShellImpl` 里的 `draftGenerationPointNotice` / `workNotFoundRecoveryDialog` 和 `RpgCreationEntityEditorShared.tsx` 里的 `EditorNoticeDialog` 已接入。创作入口泥点不足、作品不可用恢复和 RPG 大编辑器规则阻断提示不再各自维护 `UnifiedConfirmDialog` 壳层,只保留标题、正文、辅助提示和关闭回调。验证命令:`npm run test -- src/components/common/PlatformStatusDialog.test.tsx`、`npm run test -- src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx -t "bark battle form checks mud points before creating a draft|puzzle form checks mud points before creating a draft|match3d form checks mud points before creating a draft|direct missing public work detail shows unified dialog before returning home"`、`npm run test -- src/components/CustomWorldEntityEditorModal.test.tsx -t "可扮演角色至少保留一个背景章节时使用统一提示弹窗|场景连接缺少可连接目标时使用统一提示弹窗|场景保存缺少主角色时使用统一提示弹窗"`、`npm run typecheck`。
|
||||||
19.3.21. `PlatformStatusDialog` 继续收口规则阻断和搜索未命中提示:`CustomWorldEntityCatalog.tsx` 的 `minimum-playable` 规则阻断从删除确认分支中拆出,改由独立 `PlatformStatusDialog` 承接;`PlatformEntryFlowShellImpl` 的公开编号搜索弹层拆成“命中用户继续走 `UnifiedModal + PlatformSubpanel`”与“未找到结果改走 `PlatformStatusDialog`”两条分支。业务页不再让规则阻断提示和危险删除确认共用同一套 confirm config,也不再在搜索结果 modal 内同时维护用户信息和错误态两套内容布局。验证命令:`npm run test -- src/components/CustomWorldEntityEditorModal.test.tsx -t "最后一个可扮演角色不可删除时使用平台状态弹窗"`、`npm run test -- src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx -t "searching unmatched public work code shows not-found search result dialog|public code search shows public user summary in shared search result modal and clears it on close"`、`npm run typecheck`。
|
19.3.21. `PlatformStatusDialog` 继续收口规则阻断和搜索未命中提示:`CustomWorldEntityCatalog.tsx` 的 `minimum-playable` 规则阻断从删除确认分支中拆出,改由独立 `PlatformStatusDialog` 承接;`PlatformEntryFlowShellImpl` 的公开编号搜索弹层拆成“命中用户继续走 `UnifiedModal + PlatformSubpanel`”与“未找到结果改走 `PlatformStatusDialog`”两条分支。业务页不再让规则阻断提示和危险删除确认共用同一套 confirm config,也不再在搜索结果 modal 内同时维护用户信息和错误态两套内容布局。验证命令:`npm run test -- src/components/CustomWorldEntityEditorModal.test.tsx -t "最后一个可扮演角色不可删除时使用平台状态弹窗"`、`npm run test -- src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx -t "searching unmatched public work code shows not-found search result dialog|public code search shows public user summary in shared search result modal and clears it on close"`、`npm run typecheck`。
|
||||||
19.3.22. 标准泥点消耗确认弹窗收口到 `src/components/common/PlatformMudPointConfirmDialog.tsx`;组件固定承接“确认消耗泥点 + 消耗 N 泥点”的同形态标题、正文骨架和确认 / 取消动作,业务页只保留点数、补充说明和确认回调。`PuzzleCreationWorkspace.tsx`、`Match3DCreationWorkspace.tsx`、`PuzzleResultView.tsx`、`Match3DResultView.tsx` 以及 `RpgCreationRoleAssetStudioModalImpl.tsx` 已迁移;其中角色形象生成 / 动作草稿生成继续通过自定义 title 和补充说明承接工坊语义,但不再各自拼接 `UnifiedConfirmDialog` 的相同文案和内容结构。后续同类泥点确认优先复用该 Module;像 runtime 道具确认、预计消耗区间确认这类节奏不同的弹层再单独评估是否扩展变体。
|
19.3.22. 标准泥点消耗确认弹窗收口到 `src/components/common/PlatformMudPointConfirmDialog.tsx`;组件固定承接“确认消耗泥点 + 消耗 N 泥点”的同形态标题、正文骨架和确认 / 取消动作,业务页只保留点数、补充说明和确认回调。`PuzzleCreationWorkspace.tsx`、`Match3DCreationWorkspace.tsx`、`PuzzleResultView.tsx`、`Match3DResultView.tsx` 以及 `RpgCreationRoleAssetStudioModalImpl.tsx` 已迁移;其中角色形象生成 / 动作草稿生成继续通过自定义 title 和补充说明承接工坊语义,但不再各自拼接 `UnifiedConfirmDialog` 的相同文案和内容结构。后续同类泥点确认优先复用该 Module;像 runtime 道具确认、预计消耗区间确认这类节奏不同的弹层再单独评估是否扩展变体。
|
||||||
|
19.3.23. 平台危险确认弹窗收口到 `src/components/common/PlatformDangerConfirmDialog.tsx`;组件固定承接“确认 / 取消 + 危险主动作”的标准骨架,并透传忙碌态、遮罩关闭策略、按钮文案和局部面板样式。`PlatformEntryFlowShellImpl.tsx` 的删除作品确认与 `RpgCreationResultViewImpl.tsx` 的重新生成确认已迁移;业务页继续保留标题、说明文案和确认回调,不再各自拼接 `UnifiedConfirmDialog` 的危险按钮配置。后续删除、覆盖、清空等危险动作优先复用该 Module,再按需要补充更窄的语义 wrapper。
|
||||||
19.3. creative-agent 首页的侧边栏菜单、账号入口、开启新对话、我的创作、首页激励 CTA 和 prompt suggestion 按钮迁移到 `PlatformIconButton` / `PlatformActionButton`;首页继续保留 `creative-agent-home__*` 本地 class 承接透明顶栏、抽屉和品牌化胶囊视觉,不把视觉回收和语义收口绑成一次大改。`Beta` 徽标和历史记录纯文本行暂保留本地实现,等出现更多同构轻量列表行后再评估是否抽新的共享 row primitive。
|
19.3. creative-agent 首页的侧边栏菜单、账号入口、开启新对话、我的创作、首页激励 CTA 和 prompt suggestion 按钮迁移到 `PlatformIconButton` / `PlatformActionButton`;首页继续保留 `creative-agent-home__*` 本地 class 承接透明顶栏、抽屉和品牌化胶囊视觉,不把视觉回收和语义收口绑成一次大改。`Beta` 徽标和历史记录纯文本行暂保留本地实现,等出现更多同构轻量列表行后再评估是否抽新的共享 row primitive。
|
||||||
19.4. 大鱼吃小鱼结果页 hero 的返回入口迁移到 `PlatformIconButton variant="darkMini"`,测试 / 发布动作迁移到 `PlatformActionButton surface="editorDark"`;结果页只保留测试运行、发布提交和文案状态语义,不再手写 hero 顶栏按钮壳。
|
19.4. 大鱼吃小鱼结果页 hero 的返回入口迁移到 `PlatformIconButton variant="darkMini"`,测试 / 发布动作迁移到 `PlatformActionButton surface="editorDark"`;结果页只保留测试运行、发布提交和文案状态语义,不再手写 hero 顶栏按钮壳。
|
||||||
19.4.1. 大鱼吃小鱼结果页的发布失败弹层迁移到 `src/components/common/PlatformStatusDialog.tsx`;`PlatformStatusDialog` 补充自定义图标、可访问标签和动作按钮样式透传后,`BigFishResultView` 不再保留 `BigFishResultErrorModal` 内联的 `UnifiedConfirmDialog + PlatformIconBadge` 组合。结果页只保留失败文案和关闭回调,发布失败的状态图标、遮罩、白底面板和“知道了”主动作统一由共享状态弹层承接。验证命令:`npm run test -- src/components/common/PlatformStatusDialog.test.tsx src/components/big-fish-result/BigFishResultView.test.tsx`、`npm run typecheck`。
|
19.4.1. 大鱼吃小鱼结果页的发布失败弹层迁移到 `src/components/common/PlatformStatusDialog.tsx`;`PlatformStatusDialog` 补充自定义图标、可访问标签和动作按钮样式透传后,`BigFishResultView` 不再保留 `BigFishResultErrorModal` 内联的 `UnifiedConfirmDialog + PlatformIconBadge` 组合。结果页只保留失败文案和关闭回调,发布失败的状态图标、遮罩、白底面板和“知道了”主动作统一由共享状态弹层承接。验证命令:`npm run test -- src/components/common/PlatformStatusDialog.test.tsx src/components/big-fish-result/BigFishResultView.test.tsx`、`npm run typecheck`。
|
||||||
|
|||||||
68
src/components/common/PlatformDangerConfirmDialog.test.tsx
Normal file
68
src/components/common/PlatformDangerConfirmDialog.test.tsx
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/* @vitest-environment jsdom */
|
||||||
|
|
||||||
|
import { fireEvent, render, screen, within } from '@testing-library/react';
|
||||||
|
import { expect, test, vi } from 'vitest';
|
||||||
|
|
||||||
|
import { PlatformDangerConfirmDialog } from './PlatformDangerConfirmDialog';
|
||||||
|
|
||||||
|
test('renders a standard danger confirmation with cancel and confirm actions', () => {
|
||||||
|
const onClose = vi.fn();
|
||||||
|
const onConfirm = vi.fn();
|
||||||
|
|
||||||
|
render(
|
||||||
|
<PlatformDangerConfirmDialog
|
||||||
|
open
|
||||||
|
title="删除作品"
|
||||||
|
description="确认删除《潮雾列岛》吗?"
|
||||||
|
onClose={onClose}
|
||||||
|
onConfirm={onConfirm}
|
||||||
|
confirmLabel="确认删除"
|
||||||
|
>
|
||||||
|
删除后不可恢复。
|
||||||
|
</PlatformDangerConfirmDialog>,
|
||||||
|
);
|
||||||
|
|
||||||
|
const dialog = screen.getByRole('dialog', { name: '删除作品' });
|
||||||
|
|
||||||
|
expect(within(dialog).getByText('确认删除《潮雾列岛》吗?')).toBeTruthy();
|
||||||
|
expect(within(dialog).getByText('删除后不可恢复。')).toBeTruthy();
|
||||||
|
|
||||||
|
fireEvent.click(within(dialog).getByRole('button', { name: '取消' }));
|
||||||
|
expect(onClose).toHaveBeenCalledTimes(1);
|
||||||
|
|
||||||
|
fireEvent.click(within(dialog).getByRole('button', { name: '确认删除' }));
|
||||||
|
expect(onConfirm).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('forwards busy state and custom busy label for destructive actions', () => {
|
||||||
|
const onClose = vi.fn();
|
||||||
|
const onConfirm = vi.fn();
|
||||||
|
|
||||||
|
render(
|
||||||
|
<PlatformDangerConfirmDialog
|
||||||
|
open
|
||||||
|
title="删除作品"
|
||||||
|
onClose={onClose}
|
||||||
|
onConfirm={onConfirm}
|
||||||
|
confirmLabel="确认删除"
|
||||||
|
busyConfirmLabel="删除中"
|
||||||
|
busy
|
||||||
|
closeOnBackdrop={false}
|
||||||
|
>
|
||||||
|
正在删除。
|
||||||
|
</PlatformDangerConfirmDialog>,
|
||||||
|
);
|
||||||
|
|
||||||
|
const dialog = screen.getByRole('dialog', { name: '删除作品' });
|
||||||
|
const confirmButton = within(dialog).getByRole('button', { name: '删除中' });
|
||||||
|
const cancelButton = within(dialog).getByRole('button', { name: '取消' });
|
||||||
|
|
||||||
|
expect((confirmButton as HTMLButtonElement).disabled).toBe(true);
|
||||||
|
expect((cancelButton as HTMLButtonElement).disabled).toBe(true);
|
||||||
|
|
||||||
|
fireEvent.click(confirmButton);
|
||||||
|
fireEvent.click(cancelButton);
|
||||||
|
|
||||||
|
expect(onClose).not.toHaveBeenCalled();
|
||||||
|
expect(onConfirm).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
78
src/components/common/PlatformDangerConfirmDialog.tsx
Normal file
78
src/components/common/PlatformDangerConfirmDialog.tsx
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import type { ReactNode } from 'react';
|
||||||
|
|
||||||
|
import { UnifiedConfirmDialog } from './UnifiedConfirmDialog';
|
||||||
|
|
||||||
|
type PlatformDangerConfirmDialogProps = {
|
||||||
|
open: boolean;
|
||||||
|
title: string;
|
||||||
|
onClose: () => void;
|
||||||
|
onConfirm?: () => void;
|
||||||
|
description?: ReactNode;
|
||||||
|
children?: ReactNode;
|
||||||
|
confirmLabel?: string;
|
||||||
|
busy?: boolean;
|
||||||
|
busyConfirmLabel?: string;
|
||||||
|
cancelLabel?: string;
|
||||||
|
closeOnBackdrop?: boolean;
|
||||||
|
showCloseButton?: boolean;
|
||||||
|
portal?: boolean;
|
||||||
|
size?: 'sm' | 'md';
|
||||||
|
variant?: 'platform' | 'pixel';
|
||||||
|
overlayClassName?: string;
|
||||||
|
panelClassName?: string;
|
||||||
|
footerClassName?: string;
|
||||||
|
confirmClassName?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 平台危险确认弹窗。
|
||||||
|
* 统一承接需要“确认 / 取消 + 危险主动作”语义的标准弹窗壳层。
|
||||||
|
*/
|
||||||
|
export function PlatformDangerConfirmDialog({
|
||||||
|
open,
|
||||||
|
title,
|
||||||
|
onClose,
|
||||||
|
onConfirm,
|
||||||
|
description,
|
||||||
|
children,
|
||||||
|
confirmLabel = '确认',
|
||||||
|
busy = false,
|
||||||
|
busyConfirmLabel,
|
||||||
|
cancelLabel = '取消',
|
||||||
|
closeOnBackdrop = true,
|
||||||
|
showCloseButton = true,
|
||||||
|
portal = true,
|
||||||
|
size = 'sm',
|
||||||
|
variant = 'platform',
|
||||||
|
overlayClassName,
|
||||||
|
panelClassName,
|
||||||
|
footerClassName,
|
||||||
|
confirmClassName,
|
||||||
|
}: PlatformDangerConfirmDialogProps) {
|
||||||
|
return (
|
||||||
|
<UnifiedConfirmDialog
|
||||||
|
open={open}
|
||||||
|
title={title}
|
||||||
|
description={description}
|
||||||
|
onClose={onClose}
|
||||||
|
onConfirm={onConfirm}
|
||||||
|
confirmLabel={confirmLabel}
|
||||||
|
busy={busy}
|
||||||
|
busyConfirmLabel={busyConfirmLabel}
|
||||||
|
cancelLabel={cancelLabel}
|
||||||
|
closeOnBackdrop={closeOnBackdrop}
|
||||||
|
showCloseButton={showCloseButton}
|
||||||
|
showCancel
|
||||||
|
confirmTone="danger"
|
||||||
|
portal={portal}
|
||||||
|
size={size}
|
||||||
|
variant={variant}
|
||||||
|
overlayClassName={overlayClassName}
|
||||||
|
panelClassName={panelClassName}
|
||||||
|
footerClassName={footerClassName}
|
||||||
|
confirmClassName={confirmClassName}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</UnifiedConfirmDialog>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -364,13 +364,13 @@ import {
|
|||||||
import type { CustomWorldProfile } from '../../types';
|
import type { CustomWorldProfile } from '../../types';
|
||||||
import { useAuthUi } from '../auth/AuthUiContext';
|
import { useAuthUi } from '../auth/AuthUiContext';
|
||||||
import { PlatformActionButton } from '../common/PlatformActionButton';
|
import { PlatformActionButton } from '../common/PlatformActionButton';
|
||||||
|
import { PlatformDangerConfirmDialog } from '../common/PlatformDangerConfirmDialog';
|
||||||
import { PlatformFieldLabel } from '../common/PlatformFieldLabel';
|
import { PlatformFieldLabel } from '../common/PlatformFieldLabel';
|
||||||
import { PlatformStatusDialog } from '../common/PlatformStatusDialog';
|
import { PlatformStatusDialog } from '../common/PlatformStatusDialog';
|
||||||
import { PlatformStatusMessage } from '../common/PlatformStatusMessage';
|
import { PlatformStatusMessage } from '../common/PlatformStatusMessage';
|
||||||
import { PlatformSubpanel } from '../common/PlatformSubpanel';
|
import { PlatformSubpanel } from '../common/PlatformSubpanel';
|
||||||
import { PublishShareModal } from '../common/PublishShareModal';
|
import { PublishShareModal } from '../common/PublishShareModal';
|
||||||
import type { PublishShareModalPayload } from '../common/publishShareModalModel';
|
import type { PublishShareModalPayload } from '../common/publishShareModalModel';
|
||||||
import { UnifiedConfirmDialog } from '../common/UnifiedConfirmDialog';
|
|
||||||
import { UnifiedModal } from '../common/UnifiedModal';
|
import { UnifiedModal } from '../common/UnifiedModal';
|
||||||
import { resolveCreativeAgentTargetSelectionStage } from '../creative-agent/creativeAgentViewModel';
|
import { resolveCreativeAgentTargetSelectionStage } from '../creative-agent/creativeAgentViewModel';
|
||||||
import {
|
import {
|
||||||
@@ -17056,7 +17056,7 @@ export function PlatformEntryFlowShellImpl({
|
|||||||
>
|
>
|
||||||
{workNotFoundRecoveryDialog?.message}
|
{workNotFoundRecoveryDialog?.message}
|
||||||
</PlatformStatusDialog>
|
</PlatformStatusDialog>
|
||||||
<UnifiedConfirmDialog
|
<PlatformDangerConfirmDialog
|
||||||
open={Boolean(pendingDeleteCreationWork)}
|
open={Boolean(pendingDeleteCreationWork)}
|
||||||
title="删除作品"
|
title="删除作品"
|
||||||
description={
|
description={
|
||||||
@@ -17070,14 +17070,12 @@ export function PlatformEntryFlowShellImpl({
|
|||||||
size="sm"
|
size="sm"
|
||||||
overlayClassName={`platform-theme ${platformThemeClass} !items-center`}
|
overlayClassName={`platform-theme ${platformThemeClass} !items-center`}
|
||||||
panelClassName="platform-remap-surface rounded-[1.75rem]"
|
panelClassName="platform-remap-surface rounded-[1.75rem]"
|
||||||
showCancel
|
|
||||||
confirmLabel="确认删除"
|
confirmLabel="确认删除"
|
||||||
busyConfirmLabel="删除中"
|
busyConfirmLabel="删除中"
|
||||||
confirmTone="danger"
|
|
||||||
onConfirm={confirmDeleteCreationWork}
|
onConfirm={confirmDeleteCreationWork}
|
||||||
>
|
>
|
||||||
{pendingDeleteCreationWork?.detail}
|
{pendingDeleteCreationWork?.detail}
|
||||||
</UnifiedConfirmDialog>
|
</PlatformDangerConfirmDialog>
|
||||||
<AnimatePresence>
|
<AnimatePresence>
|
||||||
{publicSearchError ? (
|
{publicSearchError ? (
|
||||||
<motion.div
|
<motion.div
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import { useEffect, useMemo, useRef, useState } from 'react';
|
|||||||
|
|
||||||
import { rpgCreationAssetClient } from '../../services/rpg-creation/rpgCreationAssetClient';
|
import { rpgCreationAssetClient } from '../../services/rpg-creation/rpgCreationAssetClient';
|
||||||
import type { Character, CustomWorldProfile } from '../../types';
|
import type { Character, CustomWorldProfile } from '../../types';
|
||||||
|
import { PlatformDangerConfirmDialog } from '../common/PlatformDangerConfirmDialog';
|
||||||
import { PlatformProgressBar } from '../common/PlatformProgressBar';
|
import { PlatformProgressBar } from '../common/PlatformProgressBar';
|
||||||
import { PlatformStatusMessage } from '../common/PlatformStatusMessage';
|
import { PlatformStatusMessage } from '../common/PlatformStatusMessage';
|
||||||
import { UnifiedConfirmDialog } from '../common/UnifiedConfirmDialog';
|
|
||||||
import {
|
import {
|
||||||
CustomWorldEntityCatalog,
|
CustomWorldEntityCatalog,
|
||||||
type ResultTab,
|
type ResultTab,
|
||||||
@@ -344,17 +344,15 @@ export function RpgCreationResultView({
|
|||||||
onProfileChange={onProfileChange}
|
onProfileChange={onProfileChange}
|
||||||
/>
|
/>
|
||||||
{regenerateConfirmOpen ? (
|
{regenerateConfirmOpen ? (
|
||||||
<UnifiedConfirmDialog
|
<PlatformDangerConfirmDialog
|
||||||
open
|
open
|
||||||
title="重新生成"
|
title="重新生成"
|
||||||
onClose={() => setRegenerateConfirmOpen(false)}
|
onClose={() => setRegenerateConfirmOpen(false)}
|
||||||
onConfirm={confirmRegenerate}
|
onConfirm={confirmRegenerate}
|
||||||
confirmLabel="确认重新生成"
|
confirmLabel="确认重新生成"
|
||||||
confirmTone="danger"
|
|
||||||
showCancel
|
|
||||||
>
|
>
|
||||||
{`确认重新生成“${profile.name}”吗?重新生成会覆盖当前世界中的所有信息,包括你修改和新增的内容。`}
|
{`确认重新生成“${profile.name}”吗?重新生成会覆盖当前世界中的所有信息,包括你修改和新增的内容。`}
|
||||||
</UnifiedConfirmDialog>
|
</PlatformDangerConfirmDialog>
|
||||||
) : null}
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user