From 7c47b11ec7edee3904539f9e7a85210a6ebd441a Mon Sep 17 00:00:00 2001 From: Wenyan Date: Tue, 25 Nov 2025 18:17:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E6=B7=BB=E5=8A=A0=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=93=8D=E4=BD=9C=E5=BB=B6=E8=BF=9F=E7=A1=AE=E8=AE=A4?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增强用户体验,防止误删除操作: 1. MessageModal 组件增强 - 添加 confirmDelay 属性(秒) - 确认按钮倒计时功能 - 倒计时期间禁用确认按钮 - 按钮显示剩余秒数 (例如: "删除 (4s)") 2. 删除操作应用延迟确认(4秒) - ✅ 文档类型删除 (document-types._index.tsx) - ✅ 文档删除和批量删除 (documents.list.tsx) - ✅ 入口模块删除 (entry-modules._index.tsx) - ✅ 提示词删除 (prompts._index.tsx) - ✅ 规则组删除 (rule-groups._index.tsx) 技术实现: - 使用 useEffect + setInterval 实现倒计时 - 倒计时结束自动清理定时器 - 按钮禁用状态控制(disabled + opacity + cursor) 用户体验提升: - 防止误操作:4秒思考时间 - 视觉反馈:倒计时提示 - 操作可逆:倒计时期间可取消 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- app/components/ui/MessageModal.tsx | 44 ++++++++--- app/components/ui/index.ts | 2 +- app/routes/document-types._index.tsx | 61 ++++++++------- app/routes/documents.list.tsx | 24 +++--- app/routes/entry-modules._index.tsx | 53 +++++++------ app/routes/prompts._index.tsx | 22 ++++-- app/routes/rule-groups._index.tsx | 111 +++++++++++++++------------ 7 files changed, 192 insertions(+), 125 deletions(-) diff --git a/app/components/ui/MessageModal.tsx b/app/components/ui/MessageModal.tsx index 169c80b..af2c9c9 100644 --- a/app/components/ui/MessageModal.tsx +++ b/app/components/ui/MessageModal.tsx @@ -40,6 +40,8 @@ interface MessageModalProps { customIcon?: React.ReactNode; // 自定义内容 children?: React.ReactNode; + // 确认按钮延迟时间(秒)- 用于危险操作(如删除) + confirmDelay?: number; } // 默认自动关闭延迟 @@ -63,10 +65,12 @@ export function MessageModal({ cancelText = '取消', showCloseButton = true, customIcon, - children + children, + confirmDelay = 0 }: MessageModalProps) { const [isClosing, setIsClosing] = useState(false); const [portalElement, setPortalElement] = useState(null); + const [remainingSeconds, setRemainingSeconds] = useState(confirmDelay); // 在客户端渲染时获取 portal 容器 useEffect(() => { @@ -108,6 +112,23 @@ export function MessageModal({ } }, [isOpen, autoClose, autoCloseDelay, handleClose]); + // 确认延迟倒计时 + useEffect(() => { + if (isOpen && confirmDelay > 0) { + setRemainingSeconds(confirmDelay); + const timer = setInterval(() => { + setRemainingSeconds((prev) => { + if (prev <= 1) { + clearInterval(timer); + return 0; + } + return prev - 1; + }); + }, 1000); + return () => clearInterval(timer); + } + }, [isOpen, confirmDelay]); + // 关闭按钮键盘交互 const handleKeyDown = useCallback((e: React.KeyboardEvent) => { if (e.key === 'Escape') { @@ -194,15 +215,20 @@ export function MessageModal({
{onConfirm && ( <> - {cancelText && ( -