import React, { createContext, useContext, useState, useRef, useCallback, useMemo } from 'react' interface DialogContextType { showAlert: (message: string, title?: string, confirmText?: string) => Promise showConfirm: (message: string, title?: string, confirmText?: string, cancelText?: string) => Promise } const DialogContext = createContext(undefined) export function useDialog() { const context = useContext(DialogContext) if (!context) { throw new Error('useDialog must be used within a DialogProvider') } return context } export function DialogProvider({ children }: { children: React.ReactNode }) { const [isOpen, setIsOpen] = useState(false) const [title, setTitle] = useState('') const [message, setMessage] = useState('') const [type, setType] = useState<'alert' | 'confirm'>('alert') const [confirmLabel, setConfirmLabel] = useState('OK') const [cancelLabel, setCancelLabel] = useState('Cancel') const resolveRef = useRef<((val: any) => void) | null>(null) const showAlert = useCallback((msg: string, headerTitle?: string, btnText?: string): Promise => { setMessage(msg) setTitle(headerTitle || '') setType('alert') setConfirmLabel(btnText || 'OK') setIsOpen(true) return new Promise((resolve) => { resolveRef.current = resolve }) }, []) const showConfirm = useCallback(( msg: string, headerTitle?: string, btnConfirm?: string, btnCancel?: string ): Promise => { setMessage(msg) setTitle(headerTitle || '') setType('confirm') setConfirmLabel(btnConfirm || 'Yes') setCancelLabel(btnCancel || 'No') setIsOpen(true) return new Promise((resolve) => { resolveRef.current = resolve }) }, []) const handleConfirm = useCallback(() => { setIsOpen(false) if (resolveRef.current) { resolveRef.current(type === 'confirm' ? true : undefined) resolveRef.current = null } }, [type]) const handleCancel = useCallback(() => { setIsOpen(false) if (resolveRef.current) { resolveRef.current(false) resolveRef.current = null } }, []) const contextValue = useMemo( () => ({ showAlert, showConfirm }), [showAlert, showConfirm] ) return ( {children} {isOpen && (
e.stopPropagation()}> {title &&

{title}

}

{message}

{type === 'confirm' && ( )}
)}
) }