/** * 模态框组件 * * 统一的对话框 UI */ import { type ReactNode, useEffect } from 'react' import { X } from 'lucide-react' import Button from './Button' interface ModalProps { /** 是否显示 */ isOpen: boolean /** 标题 */ title: string /** 内容 */ children: ReactNode /** 确认按钮文本 */ confirmText?: string /** 取消按钮文本 */ cancelText?: string /** 确认回调 */ onConfirm?: () => void /** 关闭回调 */ onClose: () => void /** 是否显示确认按钮 */ showConfirm?: boolean /** 是否危险操作 */ isDanger?: boolean /** 加载状态 */ loading?: boolean } /** * 模态框组件 * * @example * setIsOpen(false)} * isDanger * > * 确定要删除此会话吗? * */ export default function Modal({ isOpen, title, children, confirmText = '确认', cancelText = '取消', onConfirm, onClose, showConfirm = true, isDanger = false, loading = false, }: ModalProps) { // ESC 键关闭 useEffect(() => { const handleEsc = (e: KeyboardEvent) => { if (e.key === 'Escape' && isOpen) { onClose() } } window.addEventListener('keydown', handleEsc) return () => window.removeEventListener('keydown', handleEsc) }, [isOpen, onClose]) if (!isOpen) return null return (
{/* 遮罩 */}
{/* 内容 */}
{/* 头部 */}

{title}

{/* 内容 */}
{children}
{/* 底部按钮 */}
{showConfirm && ( )}
) }