/**
* 模态框组件
*
* 统一的对话框 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 && (
)}
)
}