import { useCallback, useEffect, useRef, useState } from 'react'; import { Maximize2, Minimize2 } from 'lucide-react'; import type { Contact, RawPacket, RadioConfig } from '../types'; import { PacketVisualizer3D } from './PacketVisualizer3D'; import { RawPacketList } from './RawPacketList'; import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs'; import { cn } from '@/lib/utils'; import { getVisualizerSettings, saveVisualizerSettings } from '../utils/visualizerSettings'; interface VisualizerViewProps { packets: RawPacket[]; contacts: Contact[]; config: RadioConfig | null; } export function VisualizerView({ packets, contacts, config }: VisualizerViewProps) { const [fullScreen, setFullScreen] = useState(() => getVisualizerSettings().hidePacketFeed); const [paneFullScreen, setPaneFullScreen] = useState(false); const containerRef = useRef(null); // Persist packet feed visibility to localStorage useEffect(() => { const current = getVisualizerSettings(); if (current.hidePacketFeed !== fullScreen) { saveVisualizerSettings({ ...current, hidePacketFeed: fullScreen }); } }, [fullScreen]); // Sync state when browser exits fullscreen (Escape, F11, etc.) useEffect(() => { const handler = () => { if (!document.fullscreenElement) setPaneFullScreen(false); }; document.addEventListener('fullscreenchange', handler); return () => document.removeEventListener('fullscreenchange', handler); }, []); const toggleFullScreen = useCallback(() => { if (!document.fullscreenElement) { containerRef.current?.requestFullscreen(); setPaneFullScreen(true); } else { document.exitFullscreen(); // State synced via fullscreenchange handler } }, []); return (
{/* Header */}
{paneFullScreen ? 'RemoteTerm MeshCore Visualizer' : 'Mesh Visualizer'}
{/* Mobile: Tabbed interface */}
Visualizer Packet Feed
{/* Desktop: Split screen (or full screen if toggled) */}
{/* Visualizer panel */}
{/* Packet feed panel - hidden when full screen */}
Packet Feed
); }