'use client'; // Host-rendered modal for plugin-requested confirm/alert dialogs. // Subscribes to the host-dialog queue and renders the head request, one at // a time. Closing the modal advances the queue. import React, { useEffect, useSyncExternalStore } from 'react'; import { head, resolveHead, subscribe } from '@/lib/plugin-sandbox/host-dialog'; export function PluginDialogHost(): React.JSX.Element | null { const current = useSyncExternalStore(subscribe, head, () => null); useEffect(() => { if (!current) return; function onKey(e: KeyboardEvent) { if (e.key === 'Escape') { e.preventDefault(); resolveHead(false); } else if (e.key === 'Enter') { e.preventDefault(); resolveHead(true); } } document.addEventListener('keydown', onKey, true); return () => document.removeEventListener('keydown', onKey, true); }, [current]); if (!current) return null; const confirmLabel = current.confirmLabel ?? (current.kind === 'alert' ? 'OK' : 'Confirm'); const cancelLabel = current.cancelLabel ?? 'Cancel'; return (
{current.message}