import { useState, useCallback, createContext, useContext } from 'react'; import type { ReactNode } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import i18n from '@/i18n'; interface ConfirmOptions { title?: string; description?: string; confirmText?: string; cancelText?: string; variant?: 'default' | 'destructive'; } interface ConfirmContextValue { confirm: (options: ConfirmOptions | string) => Promise; } const ConfirmContext = createContext(null); export function useConfirm() { const ctx = useContext(ConfirmContext); if (!ctx) throw new Error('useConfirm must be used within ConfirmProvider'); return ctx.confirm; } export function ConfirmProvider({ children }: { children: ReactNode }) { const [open, setOpen] = useState(false); const [options, setOptions] = useState>({ title: i18n.t('common.confirmOp'), description: '', confirmText: i18n.t('monitor.alertEvents.acknowledge'), cancelText: i18n.t('rbac.jobRole.cancel'), variant: 'default', }); const [resolver, setResolver] = useState<((v: boolean) => void) | null>(null); const confirm = useCallback((opts: ConfirmOptions | string) => { const normalized = typeof opts === 'string' ? { title: i18n.t('common.confirmOp'), description: opts } : opts; setOptions({ title: normalized.title || i18n.t('common.confirmOp'), description: normalized.description || '', confirmText: normalized.confirmText || i18n.t('monitor.alertEvents.acknowledge'), cancelText: normalized.cancelText || i18n.t('rbac.jobRole.cancel'), variant: (normalized.variant || 'default') as 'default' | 'destructive', }); setOpen(true); return new Promise((resolve) => setResolver(() => resolve)); }, []); const handleConfirm = () => { setOpen(false); resolver?.(true); setResolver(null); }; const handleCancel = () => { setOpen(false); resolver?.(false); setResolver(null); }; return ( {children} { if (!v) handleCancel(); }}> e.preventDefault()}> {options.title} {options.description && ( {options.description} )} ); }