1
1
import { makeStyles } from "@material-ui/core/styles"
2
2
import { useMachine } from "@xstate/react"
3
+ import { Stack } from "components/Stack/Stack"
3
4
import { FC , useEffect , useRef , useState } from "react"
4
5
import { Helmet } from "react-helmet-async"
5
6
import { useNavigate , useParams , useSearchParams } from "react-router-dom"
@@ -19,6 +20,34 @@ export const Language = {
19
20
websocketErrorMessagePrefix : "WebSocket failed: " ,
20
21
}
21
22
23
+ const useReloading = ( isDisconnected : boolean ) => {
24
+ const [ status , setStatus ] = useState < "reloading" | "notReloading" > (
25
+ "notReloading" ,
26
+ )
27
+
28
+ // Retry connection on key press when it is disconnected
29
+ useEffect ( ( ) => {
30
+ if ( ! isDisconnected ) {
31
+ return
32
+ }
33
+
34
+ const keyDownHandler = ( ) => {
35
+ setStatus ( "reloading" )
36
+ window . location . reload ( )
37
+ }
38
+
39
+ document . addEventListener ( "keydown" , keyDownHandler )
40
+
41
+ return ( ) => {
42
+ document . removeEventListener ( "keydown" , keyDownHandler )
43
+ }
44
+ } , [ isDisconnected ] )
45
+
46
+ return {
47
+ status,
48
+ }
49
+ }
50
+
22
51
const TerminalPage : FC <
23
52
React . PropsWithChildren < {
24
53
readonly renderer ?: XTerm . RendererType
@@ -67,6 +96,7 @@ const TerminalPage: FC<
67
96
workspaceAgent,
68
97
websocketError,
69
98
} = terminalState . context
99
+ const reloading = useReloading ( isDisconnected )
70
100
71
101
// Create the terminal!
72
102
useEffect ( ( ) => {
@@ -216,7 +246,16 @@ const TerminalPage: FC<
216
246
{ /* This overlay makes it more obvious that the terminal is disconnected. */ }
217
247
{ /* It's nice for situations where Coder restarts, and they are temporarily disconnected. */ }
218
248
< div className = { `${ styles . overlay } ${ isDisconnected ? "" : "connected" } ` } >
219
- < span className = { styles . overlayText } > Disconnected</ span >
249
+ { reloading . status === "reloading" ? (
250
+ < span className = { styles . overlayText } > Reloading...</ span >
251
+ ) : (
252
+ < Stack spacing = { 0.5 } alignItems = "center" >
253
+ < span className = { styles . overlayText } > Disconnected</ span >
254
+ < span className = { styles . overlaySubtext } >
255
+ Press any key to retry
256
+ </ span >
257
+ </ Stack >
258
+ ) }
220
259
</ div >
221
260
< div className = { styles . terminal } ref = { xtermRef } data-testid = "terminal" />
222
261
</ >
@@ -225,7 +264,7 @@ const TerminalPage: FC<
225
264
226
265
export default TerminalPage
227
266
228
- const useStyles = makeStyles ( ( ) => ( {
267
+ const useStyles = makeStyles ( ( theme ) => ( {
229
268
overlay : {
230
269
position : "absolute" ,
231
270
pointerEvents : "none" ,
@@ -238,17 +277,20 @@ const useStyles = makeStyles(() => ({
238
277
justifyContent : "center" ,
239
278
display : "flex" ,
240
279
color : "white" ,
241
- fontFamily : MONOSPACE_FONT_FAMILY ,
242
- fontSize : 18 ,
280
+ fontSize : 16 ,
243
281
backgroundColor : "rgba(0, 0, 0, 0.6)" ,
282
+ backdropFilter : "blur(4px)" ,
244
283
"&.connected" : {
245
284
opacity : 0 ,
246
285
} ,
247
286
} ,
248
287
overlayText : {
249
- padding : 32 ,
250
- fontSize : 24 ,
251
- backgroundColor : "#000" ,
288
+ fontSize : 16 ,
289
+ fontWeight : 600 ,
290
+ } ,
291
+ overlaySubtext : {
292
+ fontSize : 14 ,
293
+ color : theme . palette . text . secondary ,
252
294
} ,
253
295
terminal : {
254
296
width : "100vw" ,
0 commit comments