import React, { useEffect, useRef, useCallback } from 'react' interface ConfirmDialogProps { open: boolean title: string message: string confirmLabel?: string cancelLabel?: string variant?: 'danger' | 'warning' | 'info' onConfirm: () => void onCancel: () => void } export const ConfirmDialog = React.memo(function ConfirmDialog({ open, title, message, confirmLabel = '确定', cancelLabel = '取消', variant = 'warning', onConfirm, onCancel }: ConfirmDialogProps) { const confirmRef = useRef(null) const previousFocusRef = useRef(null) // 打开时保存焦点并聚焦确认按钮;关闭时恢复焦点 useEffect(() => { if (!open) { previousFocusRef.current?.focus() return } previousFocusRef.current = document.activeElement as HTMLElement const timer = setTimeout(() => confirmRef.current?.focus(), 50) return () => { clearTimeout(timer) } }, [open]) // ESC 键关闭 const handleKeyDown = useCallback((e: KeyboardEvent) => { if (e.key === 'Escape') { e.preventDefault() onCancel() } }, [onCancel]) useEffect(() => { if (!open) return document.addEventListener('keydown', handleKeyDown) return () => document.removeEventListener('keydown', handleKeyDown) }, [open, handleKeyDown]) // 防止背景滚动 useEffect(() => { if (!open) return const original = document.body.style.overflow document.body.style.overflow = 'hidden' return () => { document.body.style.overflow = original } }, [open]) if (!open) return null return (
e.stopPropagation()} >

{title}

{message}

) }) ConfirmDialog.displayName = 'ConfirmDialog'