import { createPortal } from 'react-dom'; import { Radio, X, Volume2, VolumeX, Play, Megaphone, ListChecks, Trash2, CheckSquare, Square, Volume1 } from 'lucide-react'; import { cn } from '@/lib/utils'; import { useRadio, speak, beep } from '@/core/radio'; const tm = (iso: string) => new Date(iso).toLocaleTimeString('ru-RU', { hour: '2-digit', minute: '2-digit', second: '2-digit' }); const DOT: Record = { critical: 'bg-crit', warning: 'bg-warn', info: 'bg-info', ok: 'bg-ok' }; // Мини-окно «Рация»: включение/отключение оповещения + эфир. Открывается кнопкой в шапке. export function RadioMiniWindow({ open, onClose }: { open: boolean; onClose: () => void }) { const { on, ether, toggle, board, readList, toggleTask, removeBoard, enqueueRead, removeRead, clearRead, readAll } = useRadio(); if (!open) return null; const openTasks = board.filter((b) => b.kind === 'task' && !b.done).length; const test = () => { beep(on ? 880 : 440, 0.14, 0.25); if (on) speak('Проверка связи. Рация в эфире.'); }; return createPortal(
Рация
{on ? 'оповещение включено' : 'оповещение выключено'}
{/* Вкл/выкл оповещение */}
{/* Эфир */}
Эфир · последние события
{ether.length === 0 &&
Пока тихо. События появятся здесь.
} {ether.map((e, i) => (
{e.callsign} {tm(e.ts)}
{e.text}
))}
{/* Доска объявлений */}
Доска объявлений {openTasks > 0 && {openTasks} задач}
{board.map((b) => (
{b.kind === 'task' ? ( ) : ( )}
{b.text}
))}
{/* Список чтения — голосовые уведомления */}
Список чтения · {readList.length}
{readList.length === 0 &&
Список пуст. Добавьте объявление кнопкой 🔈.
} {readList.map((t, i) => (
{t}
))}
, document.body, ); }