'use client' import { Button } from '@/components/ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { Maximize2, Minimize2, Monitor, Signal, SignalLow, SignalMedium, Keyboard, MousePointer2, Loader2, CheckCircle2, RefreshCw, X, Clipboard, FolderOpen, ChevronDown, MessageSquare, Zap, } from 'lucide-react' interface MonitorInfo { index: number width: number height: number primary: boolean } interface Session { id: string machineId: string | null machineName: string | null startedAt: string } type ConnectionState = 'connecting' | 'waiting' | 'connected' | 'disconnected' | 'error' interface ViewerToolbarProps { session: Session | null connectionState: ConnectionState isFullscreen: boolean quality: 'high' | 'medium' | 'low' isMuted: boolean monitors: MonitorInfo[] activeMonitor: number onToggleFullscreen: () => void onQualityChange: (quality: 'high' | 'medium' | 'low') => void onToggleMute: () => void onDisconnect: () => void onReconnect: () => void onCtrlAltDel: () => void onClipboardPaste: () => void onMonitorChange: (index: number) => void onToggleFileTransfer: () => void onToggleChat: () => void onWakeOnLan?: () => void machineName?: string } export function ViewerToolbar({ session, connectionState, isFullscreen, quality, monitors, activeMonitor, onToggleFullscreen, onQualityChange, onDisconnect, onReconnect, onCtrlAltDel, onClipboardPaste, onMonitorChange, onToggleFileTransfer, onToggleChat, onWakeOnLan, }: ViewerToolbarProps) { const connected = connectionState === 'connected' const getQualityIcon = () => { switch (quality) { case 'high': return Signal case 'medium': return SignalMedium case 'low': return SignalLow } } const getConnectionBadge = () => { switch (connectionState) { case 'connecting': return ( Connecting ) case 'waiting': return ( Waiting for agent ) case 'connected': return ( Connected ) case 'disconnected': return ( Disconnected ) case 'error': return ( Error ) } } const QualityIcon = getQualityIcon() return (
{/* Left: machine name + status */}
{session?.machineName || 'Remote Machine'}
{getConnectionBadge()}
{/* Right: controls */}
{/* Input indicators */}
{/* Monitor picker (only shown when multiple monitors) */} {connected && monitors.length > 1 && ( Select Monitor {monitors.map((m) => ( onMonitorChange(m.index)}> {m.primary ? 'Primary' : `Display ${m.index + 1}`} {m.width}×{m.height} {activeMonitor === m.index && } ))} )} {/* Ctrl+Alt+Del */} {connected && ( )} {/* Clipboard paste */} {connected && ( )} {/* File transfer */} {connected && ( )} {/* Chat */} {connected && ( )} {/* Wake-on-LAN (shown when agent is offline) */} {!connected && onWakeOnLan && ( )} {/* Quality selector */} Stream Quality onQualityChange('high')}> High {quality === 'high' && } onQualityChange('medium')}> Medium {quality === 'medium' && } onQualityChange('low')}> Low {quality === 'low' && } {/* Fullscreen toggle */} {/* Reconnect */} {(connectionState === 'disconnected' || connectionState === 'waiting') && ( )} {/* Disconnect */}
) }