/** * useConfirm — application-level confirm dialog replacing native browser confirm(). * * Usage: * const { confirm, ConfirmDialog } = useConfirm(); * const ok = await confirm('Wirklich löschen?', { confirmLabel: 'Löschen', variant: 'danger' }); * // Render once in the component tree. */ import React, { useState, useCallback, useRef, useMemo } from 'react'; import { useLanguage } from '../providers/language/LanguageContext'; export interface ConfirmOptions { title?: string; confirmLabel?: string; cancelLabel?: string; variant?: 'primary' | 'danger'; } interface ConfirmState { message: string; options: Required; resolve: (value: boolean) => void; } export function useConfirm() { const { t } = useLanguage(); const [state, setState] = useState(null); const resolveRef = useRef<((v: boolean) => void) | null>(null); const _defaults: Required = useMemo(() => ({ title: t('Bestätigung'), confirmLabel: t('Bestätigen'), cancelLabel: t('Abbrechen'), variant: 'primary' as const, }), [t]); const confirm = useCallback((message: string, options?: ConfirmOptions): Promise => { return new Promise((resolve) => { resolveRef.current = resolve; setState({ message, options: { ..._defaults, ...options }, resolve, }); }); }, [_defaults]); const _handleConfirm = useCallback(() => { resolveRef.current?.(true); resolveRef.current = null; setState(null); }, []); const _handleCancel = useCallback(() => { resolveRef.current?.(false); resolveRef.current = null; setState(null); }, []); const ConfirmDialog: React.FC = useCallback(() => { if (!state) return null; const { message, options } = state; const isDanger = options.variant === 'danger'; return ( { if (e.key === 'Escape') _handleCancel(); }} tabIndex={-1} > e.stopPropagation()} style={{ background: 'var(--surface-color, #1a1a2e)', border: '1px solid var(--color-border, #333)', borderRadius: '12px', padding: '1.5rem', minWidth: 340, maxWidth: 480, boxShadow: '0 8px 32px rgba(0,0,0,0.4)', display: 'flex', flexDirection: 'column', gap: '1.25rem', }} > {options.title} {message} {options.cancelLabel} {options.confirmLabel} ); }, [state, _handleConfirm, _handleCancel]); return { confirm, ConfirmDialog }; }
{message}