import { useEffect, useRef, useState } from 'react'; import logo from './assets/ridebus-logo.svg?raw'; import { NumericText } from './NumericText'; import { Fullscreen, Refresh, Shield } from './Icons'; import type { ManagedState } from './useDeviceControl'; export function DeviceSetup({ control, failed, onRetry }: { control: { state: string; code?: string; expiresAt?: string; adminUrl?: string }; failed: boolean; onRetry: () => void }) { const [now, setNow] = useState(Date.now()); useEffect(() => { document.title = 'Подключение · RideBus Board'; const interval = setInterval(() => setNow(Date.now()), 1000); return () => clearInterval(interval); }, []); const remaining = Math.max(0, Math.min(300, Math.ceil((Date.parse(control.expiresAt || '') - now) / 1000))); const pending = control.state === 'pending' && remaining > 0; return
ridebus
RIDEBUS BOARD

{control.state === 'revoked' ? 'Устройство отвязано' : 'Подключите табло'}

{pending ? 'Введите этот код в админке: Устройства → Добавить устройство' : control.state === 'revoked' ? 'Для повторной настройки подключите устройство по новому коду' : control.state === 'storage-error' ? 'Разрешите браузеру сохранять cookies и данные сайта' : control.state === 'loading' ? 'Получаем код подключения…' : 'Для подключения нужен доступ к серверу'}

{pending && <>
Код действует ещё
} {control.adminUrl && Открыть админку} {failed &&
{control.state === 'storage-error' ? 'Не удалось сохранить привязку устройства' : 'Нет связи с сервером. Повторяем подключение'}
} {!pending && control.state !== 'loading' && }
; } export function ManagedPanel({ state, failed, onClose, onFullscreen }: { state: ManagedState; failed: boolean; onClose: () => void; onFullscreen: () => void }) { const dialog = useRef(null); useEffect(() => { dialog.current?.showModal(); }, []); return { event.preventDefault(); onClose(); }}>

Управляется из админки

{state.device.name}

Изменяйте остановку, оформление и экраны в разделе «Устройства».

Настройки
Версия {state.device.revision}
Соединение
{failed ? 'Нет связи · сохранённые настройки' : 'Подключено'}
; }