import { useState } from 'react' import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '@/components/ui/alert-dialog' interface ConfirmDialogProps { trigger: React.ReactNode title: string description?: string confirmLabel?: string destructive?: boolean onConfirm: () => Promise | void } export function ConfirmDialog({ trigger, title, description, confirmLabel = '确认', destructive = false, onConfirm, }: ConfirmDialogProps) { const [busy, setBusy] = useState(false) return ( {trigger} {title} {description && {description}} 取消 { event.preventDefault() setBusy(true) try { await onConfirm() // close via Escape-equivalent: AlertDialogAction default closes, // but we prevented it — dispatch close by clicking cancel sibling. ;(event.target as HTMLElement) .closest('[role="alertdialog"]') ?.querySelector('[data-slot="alert-dialog-cancel"]') ?.click() } finally { setBusy(false) } }} > {busy ? '处理中…' : confirmLabel} ) }