import { useState, useCallback, useRef } from 'react' import { Button } from '@/components/ui/button' import { Maximize2, Minimize2, Monitor, TerminalSquare, RotateCw, Loader2, AlertCircle, } from 'lucide-react' import { VNCConsole } from '@/components/console/VNCConsole' import { TerminalConsole } from '@/components/console/TerminalConsole' import type { ProxmoxVM } from '@/types/proxmox' interface ConsoleTabProps { vm: ProxmoxVM connectionId: string } type ConsoleStatus = 'idle' | 'connecting' | 'connected' | 'error' export function ConsoleTab({ vm, connectionId }: ConsoleTabProps) { const [isFullscreen, setIsFullscreen] = useState(false) const [status, setStatus] = useState('idle') const [errorMessage, setErrorMessage] = useState(null) const containerRef = useRef(null) const isVM = vm.type === 'qemu' const canConnect = vm.status === 'running' const handleConnect = useCallback(() => { setStatus('connecting') setErrorMessage(null) }, []) const handleError = useCallback((message: string) => { setStatus('error') setErrorMessage(message) }, []) const handleDisconnect = useCallback(() => { setStatus('idle') setErrorMessage(null) }, []) const handleRetry = useCallback(() => { setStatus('idle') setErrorMessage(null) // Short delay then reconnect setTimeout(() => { setStatus('connecting') }, 100) }, []) const toggleFullscreen = useCallback(async () => { if (!containerRef.current) return try { if (!document.fullscreenElement) { await containerRef.current.requestFullscreen() setIsFullscreen(true) } else { await document.exitFullscreen() setIsFullscreen(false) } } catch (err) { console.error('Fullscreen toggle failed:', err) } }, []) const sendCtrlAltDel = useCallback(() => { // Access the VNC RFB instance through the container const container = containerRef.current?.querySelector('[data-vnc]') if (container) { // Dispatch a custom event that VNCConsole can listen for container.dispatchEvent(new CustomEvent('vnc-ctrl-alt-del')) } }, []) return (
{/* Toolbar */}
{isVM ? ( ) : ( )} {isVM ? 'VNC Console' : 'Terminal Console'} ({vm.name} - {vm.type.toUpperCase()})
{status === 'connecting' && (
Connecting...
)} {status === 'connected' && isVM && ( )} {status === 'connected' ? ( ) : status === 'error' ? ( ) : ( )}
{/* Console Area */}
{/* Idle state - show placeholder */} {status === 'idle' && (
{isVM ? ( ) : ( )}

{isVM ? 'VNC Console' : 'Terminal Console'}

{!canConnect ? (

VM must be running to access console

) : (

Click Connect to start a console session

)}
)} {/* Error state - show error overlay */} {status === 'error' && (

Connection Failed

{errorMessage && (

{errorMessage}

)}
)} {/* Connecting state - show loading overlay */} {(status === 'connecting' || status === 'connected') && ( <> {isVM ? ( ) : ( )} )} {status === 'connecting' && (

Connecting...

Establishing console connection to {vm.node}

)}
) } export type { ConsoleTabProps }