import React, { useState, useCallback } from "react"; import { TerminalComponent } from "./terminal"; import { MobileTerminalHeader } from "./mobile-terminal-header"; import { SpecialKeysStrip } from "./special-keys-strip"; import { SpecialKeysPanel } from "./special-keys-panel"; import { useMobileViewport } from "../hooks/use-mobile-viewport"; import { useVirtualKeyboard } from "../hooks/use-virtual-keyboard"; import { useAutoHide } from "../hooks/use-auto-hide"; import type { ModifierKey } from "../hooks/use-special-keys"; interface MobileTerminalWrapperProps { instanceId: string; instanceName?: string; onClose?: () => void; onBack?: () => void; onMenuToggle?: () => void; } export const MobileTerminalWrapper: React.FC = ({ instanceId, instanceName, onClose, onBack, onMenuToggle, }) => { const isMobile = useMobileViewport(); const { isOpen: isKeyboardOpen, height: keyboardHeight } = useVirtualKeyboard(); const [showPanel, setShowPanel] = useState(false); const [activeModifier, setActiveModifier] = useState(null); const [terminalRef, setTerminalRef] = useState<{ sendData: (data: string) => void; connectionStatus: "connecting" | "connected" | "disconnected" | "error" | "resetting"; focusInput: () => void; changeFontSize: (delta: number) => void; } | null>(null); const headerAutoHide = useAutoHide({ timeout: 3000, enabled: isMobile }); const handleTerminalTap = useCallback(() => { headerAutoHide.toggle(); }, [headerAutoHide]); const handleTerminalReady = useCallback( (sendData: (data: string) => void, connectionStatus: "connecting" | "connected" | "disconnected" | "error" | "resetting", focusInput: () => void, changeFontSize: (delta: number) => void) => { setTerminalRef({ sendData, connectionStatus, focusInput, changeFontSize }); }, [] ); const handleSendKey = useCallback( (data: string) => { terminalRef?.sendData(data); }, [terminalRef] ); if (!isMobile) { return ( ); } return (
terminalRef?.changeFontSize(delta)} isVisible={headerAutoHide.isVisible} connectionStatus={terminalRef?.connectionStatus} />
setShowPanel(true)} onKeepFocus={() => terminalRef?.focusInput()} activeModifier={activeModifier} onModifierChange={setActiveModifier} /> setShowPanel(false)} onKeepFocus={() => terminalRef?.focusInput()} activeModifier={activeModifier} onModifierChange={setActiveModifier} />
); };