import { SettingsProvider } from '../settings/index.js'; import { useSession } from '../context/SessionContext.jsx'; import { useSpectatorMode } from '../hooks/useSpectatorMode.js'; import { useTelemetryFrames } from '../context/TelemetryContext.jsx'; import { useVideoRequests } from '../hooks/useVideoRequests.js'; import { useRoverSnapshots } from '../hooks/useRoverSnapshots.js'; import VideoTile from '../components/VideoTile.jsx'; import RoomCameraPanel from '../components/RoomCameraPanel.jsx'; import ChatPanel from '../components/ChatPanel.jsx'; import LogPanel from '../components/LogPanel.jsx'; import AlertFeed from '../components/AlertFeed.jsx'; import useDefaultNickname from '../hooks/useDefaultNickname.js'; import CommunityGoalBanner from '../components/CommunityGoalBanner.jsx'; import RoverQueuesPanel from '../components/RoverQueuesPanel.jsx'; import RawUserPilePanel from '../components/RawUserPilePanel.jsx'; function formatDriverLabel({ roverId, session }) { const activeDriverId = session?.activeDrivers?.[roverId] || null; const user = (session?.users || []).find((entry) => entry.socketId === activeDriverId); const label = user?.nickname || (activeDriverId ? activeDriverId.slice(0, 6) : 'No driver'); const mode = session?.mode; const turnInfo = session?.turnQueues?.[roverId]; const driverText = mode === 'turns' && turnInfo?.current ? `${label} (turns)` : label; return driverText; } function RoverSpectatorCard({ rover, frame, snapshotFeed, audioInfo, session }) { const driverLabel = formatDriverLabel({ roverId: rover.id, session }); return (
); } function RoverRow({ roster, frames, snapshotFeeds, audioSources, session }) { if (roster.length === 0) { return

No rovers registered.

; } return (
{roster.map((rover) => ( ))}
); } function SecondaryRow() { return (
); } function LogsRow({ className = '' }) { return (
); } function SpectatorContent() { const { session } = useSession(); const inLockdown = session?.mode === 'lockdown'; useDefaultNickname(); useSpectatorMode(); const frames = useTelemetryFrames(); const roster = session?.roster ?? []; const snapshotFeeds = useRoverSnapshots( roster.map((rover) => rover.id), { enabled: !inLockdown, version: session?.mode }, ); const audioEntries = roster.flatMap((rover) => rover.media?.audioPublishUrl ? [{ type: 'rover', id: `${rover.id}-audio`, key: `${rover.id}-audio` }] : [], ); const audioSources = useVideoRequests(audioEntries, { enabled: !inLockdown, version: session?.mode }); if (inLockdown) { return (

Spectate disabled during lockdown.

Please wait until the server leaves lockdown to view streams.

); } return (
); } export default function SpectatorApp() { return ( ); }