import { useRef, useState, type ReactNode } from 'react'; import { Modal } from '@/components/interior/modal'; import { Button } from '@/components/ui/button'; import { actionErrorMessage, useActionFeedback, type ActionFeedbackOptions, } from '@/contexts/ActionFeedbackContext'; interface ConfirmDialogProps { open: boolean; onOpenChange: (open: boolean) => void; title: string; description?: ReactNode; confirmText?: string; cancelText?: string; destructive?: boolean; content?: ReactNode; confirmDisabled?: boolean; activity?: ActionFeedbackOptions; onConfirm: () => void | Promise; } export function ConfirmDialog({ open, onOpenChange, title, description, confirmText = '确认', cancelText = '取消', destructive = false, content, confirmDisabled = false, activity, onConfirm, }: ConfirmDialogProps) { const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const { runAction } = useActionFeedback(); const cancelRef = useRef(null); const handleConfirm = async () => { setBusy(true); setError(null); try { if (!activity) { await onConfirm(); } else { await runAction(activity, onConfirm); } onOpenChange(false); } catch (caught) { const message = actionErrorMessage(caught); setError(message); console.error('confirm action failed', caught); } finally { setBusy(false); } }; const handleOpenChange = (nextOpen: boolean) => { if (busy && !nextOpen) { return; } if (!nextOpen) { setError(null); } onOpenChange(nextOpen); }; return ( handleOpenChange(false)} title={title} description={description} showClose={false} closeOnBackdrop={!busy} closeOnEscape={!busy} initialFocusRef={cancelRef} maxWidth={512} footer={ <> } >
{error && (
{error}
)} {content}
); }