From ea58b70435b35afe090c1f4a313fe5327be5404f Mon Sep 17 00:00:00 2001 From: MacRimi Date: Sat, 6 Dec 2025 22:26:42 +0100 Subject: [PATCH] Update script-terminal-modal.tsx --- AppImage/components/script-terminal-modal.tsx | 79 +++++++++---------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/AppImage/components/script-terminal-modal.tsx b/AppImage/components/script-terminal-modal.tsx index 127ecee..1ce21b6 100644 --- a/AppImage/components/script-terminal-modal.tsx +++ b/AppImage/components/script-terminal-modal.tsx @@ -29,13 +29,6 @@ interface ScriptTerminalModalProps { description: string } -interface TerminalInstance { - term: any | null - ws: WebSocket | null - fitAddon: any | null - isConnected: boolean -} - export function ScriptTerminalModal({ open, onClose, @@ -45,14 +38,12 @@ export function ScriptTerminalModal({ title, description, }: ScriptTerminalModalProps) { - const [terminal, setTerminal] = useState({ - term: null, - ws: null, - fitAddon: null, - isConnected: false, - }) - + const termRef = useRef(null) + const wsRef = useRef(null) + const fitAddonRef = useRef(null) const sessionIdRef = useRef(Math.random().toString(36).substring(2, 8)) + + const [isConnected, setIsConnected] = useState(false) const [isComplete, setIsComplete] = useState(false) const [exitCode, setExitCode] = useState(null) const [currentInteraction, setCurrentInteraction] = useState(null) @@ -78,25 +69,27 @@ export function ScriptTerminalModal({ if (waitingTimeoutRef.current) { clearTimeout(waitingTimeoutRef.current) } - if (terminal.ws) { - terminal.ws.close() + if (wsRef.current) { + wsRef.current.close() + wsRef.current = null } - if (terminal.term) { - terminal.term.dispose() + if (termRef.current) { + termRef.current.dispose() + termRef.current = null } - setTerminal({ term: null, ws: null, fitAddon: null, isConnected: false }) sessionIdRef.current = Math.random().toString(36).substring(2, 8) setIsComplete(false) setExitCode(null) setInteractionInput("") setCurrentInteraction(null) setIsWaitingNextInteraction(false) + setIsConnected(false) } }, [open]) useEffect(() => { const container = terminalContainerRef.current - if (!open || !container || terminal.term) { + if (!open || !container || termRef.current) { return } @@ -148,6 +141,9 @@ export function ScriptTerminalModal({ term.loadAddon(fitAddon) term.open(container) + termRef.current = term + fitAddonRef.current = fitAddon + setTimeout(() => { try { fitAddon.fit() @@ -158,9 +154,10 @@ export function ScriptTerminalModal({ const wsUrl = getScriptWebSocketUrl(sessionIdRef.current) const ws = new WebSocket(wsUrl) + wsRef.current = ws ws.onopen = () => { - setTerminal((prev) => ({ ...prev, isConnected: true, term, ws, fitAddon })) + setIsConnected(true) const initMessage = { script_path: scriptPath, @@ -207,18 +204,18 @@ export function ScriptTerminalModal({ options: msg.interaction.options, default: msg.interaction.default, }) - return // Don't write JSON to terminal + return } if (msg.type === "error") { - terminal.term.writeln(`\x1b[31m${msg.message}\x1b[0m`) + term.writeln(`\x1b[31m${msg.message}\x1b[0m`) return } } catch { - // Not JSON, it's regular terminal output + // Not JSON, es output normal de terminal } - terminal.term.write(event.data) + term.write(event.data) setIsWaitingNextInteraction(false) if (waitingTimeoutRef.current) { @@ -227,13 +224,13 @@ export function ScriptTerminalModal({ } ws.onerror = (error) => { - setTerminal((prev) => ({ ...prev, isConnected: false })) - terminal.term.writeln("\x1b[31mWebSocket error occurred\x1b[0m") + setIsConnected(false) + term.writeln("\x1b[31mWebSocket error occurred\x1b[0m") } ws.onclose = (event) => { - setTerminal((prev) => ({ ...prev, isConnected: false })) - terminal.term.writeln("\x1b[33mConnection closed\x1b[0m") + setIsConnected(false) + term.writeln("\x1b[33mConnection closed\x1b[0m") if (!isComplete) { setIsComplete(true) @@ -249,7 +246,7 @@ export function ScriptTerminalModal({ checkConnectionInterval.current = setInterval(() => { if (ws) { - setTerminal((prev) => ({ ...prev, isConnected: ws.readyState === WebSocket.OPEN })) + setIsConnected(ws.readyState === WebSocket.OPEN) } }, 500) @@ -279,7 +276,7 @@ export function ScriptTerminalModal({ } initializeTerminal() - }, [open, terminal.term]) + }, [open]) const getScriptWebSocketUrl = (sid: string): string => { if (typeof window === "undefined") { @@ -292,7 +289,7 @@ export function ScriptTerminalModal({ } const handleInteractionResponse = (value: string) => { - if (!terminal.ws || !currentInteraction) { + if (!wsRef.current || !currentInteraction) { return } @@ -309,8 +306,8 @@ export function ScriptTerminalModal({ value: value, }) - if (terminal.ws.readyState === WebSocket.OPEN) { - terminal.ws.send(response) + if (wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.send(response) } setCurrentInteraction(null) @@ -322,14 +319,14 @@ export function ScriptTerminalModal({ } const handleCloseModal = () => { - if (terminal.ws && terminal.ws.readyState === WebSocket.OPEN) { - terminal.ws.close() + if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) { + wsRef.current.close() } if (checkConnectionInterval.current) { clearInterval(checkConnectionInterval.current) } - if (terminal.term) { - terminal.term.dispose() + if (termRef.current) { + termRef.current.dispose() } onClose() } @@ -413,10 +410,10 @@ export function ScriptTerminalModal({
- {terminal.isConnected ? "Online" : "Offline"} + {isConnected ? "Online" : "Offline"}