import { useEffect, useState, type SyntheticEvent } from 'react'; import { createPortal } from 'react-dom'; import { useTranslation } from 'react-i18next'; import { useFocusTrap } from '../hooks/useFocusTrap'; import { usePromptStore } from '../store/promptDialog'; /** * Global host for usePrompt(). Mount once near the app root. * Renders an accessible text-input dialog (focus-trapped, Esc/Enter, scroll-locked) * as a cross-platform replacement for window.prompt, which the Telegram WebView ignores. */ export function PromptDialogHost() { const request = usePromptStore((s) => s.request); const submit = usePromptStore((s) => s.submit); const cancel = usePromptStore((s) => s.cancel); const { t } = useTranslation(); const [value, setValue] = useState(''); const open = request !== null; const dialogRef = useFocusTrap(open, { onEscape: cancel }); useEffect(() => { if (request) setValue(request.initialValue ?? ''); }, [request]); if (!request) return null; const handleSubmit = (e: SyntheticEvent) => { e.preventDefault(); const trimmed = value.trim(); if (!trimmed) { cancel(); return; } submit(trimmed); }; return createPortal(
, document.body, ); }