import { useEffect, useRef, useState } from 'react'; export function ConfirmDialog({ title = 'Подтвердите действие', message = '', confirmLabel = 'Подтвердить', cancelLabel = 'Отмена', danger = false, onConfirm, onClose }) { const confirmRef = useRef(null); useEffect(() => { confirmRef.current?.focus(); }, []); useEffect(() => { const handleKeydown = event => { if (event.key === 'Escape') onClose(); }; document.addEventListener('keydown', handleKeydown); return () => { document.removeEventListener('keydown', handleKeydown); }; }, [onClose]); return (
{ if (event.target === event.currentTarget) onClose(); }} >

{title}

{message}

); } export function AlertDialog({ title, message, confirmLabel = 'Понятно', onClose }) { return ( ); } // Реплика legacy promptAction: диалог с обязательным текстовым полем. // onConfirm получает trimmed-значение; пустое обязательное поле показывает // ошибку внутри диалога, как в admin/js/dialog.js. export function PromptDialog({ title = 'Подтвердите действие', message = '', confirmLabel = 'Подтвердить', cancelLabel = 'Отмена', danger = false, input = {}, onConfirm, onClose }) { const [value, setValue] = useState(''); const [error, setError] = useState(''); const inputRef = useRef(null); useEffect(() => { inputRef.current?.focus(); }, []); useEffect(() => { const handleKeydown = event => { if (event.key === 'Escape') onClose(); }; document.addEventListener('keydown', handleKeydown); return () => { document.removeEventListener('keydown', handleKeydown); }; }, [onClose]); function confirm() { const trimmed = value.trim(); if (input.required && !trimmed) { setError(input.requiredMessage || 'Заполните поле'); inputRef.current?.focus(); return; } onConfirm(trimmed); } return (
{ if (event.target === event.currentTarget) onClose(); }} >

{title}

{message}