11'use client'
22
3- import { useEffect , useRef , useState } from 'react'
3+ import { useState } from 'react'
44import { ExternalLink , LoaderCircle , Plus , RefreshCw , TerminalSquare , X } from 'lucide-react'
55import { cn } from '@/lib/utils'
66import { getInstanceTerminalConnection } from '@/lib/terminal'
7+ import { usePolling } from '@/hooks/use-polling'
78import type { Instance } from '@/types/instance'
89
9- const LOAD_TIMEOUT_MS = 8000
10-
1110interface InstanceTerminalWorkspaceProps {
1211 instance : Instance
1312 className ?: string
@@ -24,26 +23,25 @@ function createSession(index: number): TerminalSession {
2423}
2524
2625export function InstanceTerminalWorkspace ( {
27- instance,
26+ instance : initial ,
2827 className,
2928} : InstanceTerminalWorkspaceProps ) {
29+ const { data : polledInstance } = usePolling < { instance : Instance } > (
30+ `/api/instances/${ initial . id } ` ,
31+ 10000 ,
32+ )
33+ const instance = polledInstance ?. instance ?? initial
34+
35+ usePolling < unknown > (
36+ instance . ip_address ? `/api/health/${ instance . id } ` : null ,
37+ 15000 ,
38+ )
39+
3040 const connection = getInstanceTerminalConnection ( instance )
3141 const [ sessions , setSessions ] = useState < TerminalSession [ ] > ( [ createSession ( 1 ) ] )
3242 const [ activeSessionId , setActiveSessionId ] = useState ( 'terminal-1' )
3343 const [ nextSessionNumber , setNextSessionNumber ] = useState ( 2 )
3444 const [ loadedSessions , setLoadedSessions ] = useState < Record < string , boolean > > ( { } )
35- const [ useFallback , setUseFallback ] = useState ( false )
36- const loadTimers = useRef < Record < string , ReturnType < typeof setTimeout > > > ( { } )
37-
38- const terminalUrl = useFallback && connection . directUrl
39- ? connection . directUrl
40- : connection . preferredUrl
41-
42- useEffect ( ( ) => {
43- return ( ) => {
44- Object . values ( loadTimers . current ) . forEach ( clearTimeout )
45- }
46- } , [ ] )
4745
4846 if ( instance . status !== 'running' ) {
4947 return (
@@ -63,7 +61,7 @@ export function InstanceTerminalWorkspace({
6361 )
6462 }
6563
66- if ( ! terminalUrl ) {
64+ if ( ! connection . preferredUrl ) {
6765 return (
6866 < div className = "flex min-h-[28rem] items-center justify-center rounded-xl border bg-card p-8 text-center" >
6967 < div className = "max-w-sm space-y-3" >
@@ -77,24 +75,9 @@ export function InstanceTerminalWorkspace({
7775 )
7876 }
7977
78+ const terminalUrl = connection . preferredUrl
8079 const activeSession = sessions . find ( ( s ) => s . id === activeSessionId ) ?? sessions [ 0 ]
8180
82- function startLoadTimer ( sessionId : string ) {
83- clearTimeout ( loadTimers . current [ sessionId ] )
84- if ( ! useFallback && connection . directUrl && connection . mode === 'proxied' ) {
85- loadTimers . current [ sessionId ] = setTimeout ( ( ) => {
86- setUseFallback ( true )
87- setLoadedSessions ( { } )
88- setSessions ( ( prev ) => prev . map ( ( s ) => ( { ...s , version : s . version + 1 } ) ) )
89- } , LOAD_TIMEOUT_MS )
90- }
91- }
92-
93- function handleLoad ( sessionId : string ) {
94- clearTimeout ( loadTimers . current [ sessionId ] )
95- setLoadedSessions ( ( prev ) => ( { ...prev , [ sessionId ] : true } ) )
96- }
97-
9881 function createNewSession ( ) {
9982 const session = createSession ( nextSessionNumber )
10083 setSessions ( ( prev ) => [ ...prev , session ] )
@@ -112,7 +95,6 @@ export function InstanceTerminalWorkspace({
11295
11396 function closeSession ( sessionId : string ) {
11497 if ( sessions . length === 1 ) return
115- clearTimeout ( loadTimers . current [ sessionId ] )
11698 const idx = sessions . findIndex ( ( s ) => s . id === sessionId )
11799 const remaining = sessions . filter ( ( s ) => s . id !== sessionId )
118100 setSessions ( remaining )
@@ -222,8 +204,7 @@ export function InstanceTerminalWorkspace({
222204 className = "block h-full w-full"
223205 style = { { colorScheme : 'dark' , background : '#0a0a0a' } }
224206 allow = "clipboard-read; clipboard-write; fullscreen"
225- ref = { ( el ) => { if ( el && isActive ) startLoadTimer ( session . id ) } }
226- onLoad = { ( ) => handleLoad ( session . id ) }
207+ onLoad = { ( ) => setLoadedSessions ( ( prev ) => ( { ...prev , [ session . id ] : true } ) ) }
227208 />
228209 </ div >
229210 )
0 commit comments