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();
}}
>
{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();
}}
>
{message}
{error}
);
}