@@ -14,7 +14,7 @@ import { StateFrom } from "xstate";
14
14
import { DeleteDialog } from "components/Dialogs/DeleteDialog/DeleteDialog" ;
15
15
import { Workspace , WorkspaceErrors } from "./Workspace" ;
16
16
import { pageTitle } from "utils/page" ;
17
- import { getFaviconByStatus , hasJobError } from "utils/workspace" ;
17
+ import { hasJobError } from "utils/workspace" ;
18
18
import {
19
19
WorkspaceEvent ,
20
20
workspaceMachine ,
@@ -68,14 +68,14 @@ export const WorkspaceReadyPage = ({
68
68
isLoadingMoreBuilds,
69
69
hasMoreBuilds,
70
70
} : WorkspaceReadyPageProps ) : JSX . Element => {
71
+ const navigate = useNavigate ( ) ;
71
72
const { buildInfo } = useDashboard ( ) ;
72
73
const featureVisibility = useFeatureVisibility ( ) ;
73
74
const { buildError, cancellationError, missedParameters } =
74
75
workspaceState . context ;
75
76
if ( workspace === undefined ) {
76
77
throw Error ( "Workspace is undefined" ) ;
77
78
}
78
- const deadline = getDeadline ( workspace ) ;
79
79
const canUpdateWorkspace = Boolean ( permissions ?. updateWorkspace ) ;
80
80
const canUpdateTemplate = Boolean ( permissions ?. updateTemplate ) ;
81
81
const { data : deploymentValues } = useQuery ( {
@@ -85,15 +85,10 @@ export const WorkspaceReadyPage = ({
85
85
const canRetryDebugMode = Boolean (
86
86
deploymentValues ?. config . enable_terraform_debug_mode ,
87
87
) ;
88
- const favicon = getFaviconByStatus ( workspace . latest_build ) ;
89
- const navigate = useNavigate ( ) ;
90
88
const [ changeVersionDialogOpen , setChangeVersionDialogOpen ] = useState ( false ) ;
91
89
const [ isConfirmingUpdate , setIsConfirmingUpdate ] = useState ( false ) ;
92
- const [ confirmingRestart , setConfirmingRestart ] = useState < {
93
- open : boolean ;
94
- buildParameters ?: TypesGen . WorkspaceBuildParameter [ ] ;
95
- } > ( { open : false } ) ;
96
90
91
+ // Versions
97
92
const { data : allVersions } = useQuery ( {
98
93
...templateVersions ( workspace . template_id ) ,
99
94
enabled : changeVersionDialogOpen ,
@@ -102,22 +97,20 @@ export const WorkspaceReadyPage = ({
102
97
...templateVersion ( workspace . template_active_version_id ) ,
103
98
enabled : workspace . outdated ,
104
99
} ) ;
105
- const [ faviconTheme , setFaviconTheme ] = useState < "light" | "dark" > ( "dark" ) ;
106
- useEffect ( ( ) => {
107
- if ( typeof window === "undefined" || ! window . matchMedia ) {
108
- return ;
109
- }
110
100
111
- const isDark = window . matchMedia ( "(prefers-color-scheme: dark)" ) ;
112
- // We want the favicon the opposite of the theme.
113
- setFaviconTheme ( isDark . matches ? "light" : "dark" ) ;
114
- } , [ ] ) ;
101
+ // Build logs
115
102
const buildLogs = useWorkspaceBuildLogs ( workspace . latest_build . id ) ;
116
103
const shouldDisplayBuildLogs =
117
104
hasJobError ( workspace ) ||
118
105
[ "canceling" , "deleting" , "pending" , "starting" , "stopping" ] . includes (
119
106
workspace . latest_build . status ,
120
107
) ;
108
+
109
+ // Restart
110
+ const [ confirmingRestart , setConfirmingRestart ] = useState < {
111
+ open : boolean ;
112
+ buildParameters ?: TypesGen . WorkspaceBuildParameter [ ] ;
113
+ } > ( { open : false } ) ;
121
114
const {
122
115
mutate : mutateRestartWorkspace ,
123
116
error : restartBuildError ,
@@ -126,6 +119,8 @@ export const WorkspaceReadyPage = ({
126
119
mutationFn : restartWorkspace ,
127
120
} ) ;
128
121
122
+ // Schedule controls
123
+ const deadline = getDeadline ( workspace ) ;
129
124
const onDeadlineChangeSuccess = ( ) => {
130
125
displaySuccess ( "Updated workspace shutdown time." ) ;
131
126
} ;
@@ -145,13 +140,28 @@ export const WorkspaceReadyPage = ({
145
140
onError : onDeadlineChangeFails ,
146
141
} ) ;
147
142
143
+ // Auto start
148
144
const canAutostartResponse = useQuery (
149
145
workspaceResolveAutostart ( workspace . id ) ,
150
146
) ;
151
147
const canAutostart = ! canAutostartResponse . data ?. parameter_mismatch ?? false ;
152
148
149
+ // SSH Prefix
153
150
const sshPrefixQuery = useQuery ( deploymentSSHConfig ( ) ) ;
154
151
152
+ // Favicon
153
+ const favicon = getFaviconByStatus ( workspace . latest_build ) ;
154
+ const [ faviconTheme , setFaviconTheme ] = useState < "light" | "dark" > ( "dark" ) ;
155
+ useEffect ( ( ) => {
156
+ if ( typeof window === "undefined" || ! window . matchMedia ) {
157
+ return ;
158
+ }
159
+
160
+ const isDark = window . matchMedia ( "(prefers-color-scheme: dark)" ) ;
161
+ // We want the favicon the opposite of the theme.
162
+ setFaviconTheme ( isDark . matches ? "light" : "dark" ) ;
163
+ } , [ ] ) ;
164
+
155
165
return (
156
166
< >
157
167
< Helmet >
@@ -320,3 +330,38 @@ const WarningDialog: FC<
320
330
> = ( props ) => {
321
331
return < ConfirmDialog type = "info" hideCancel = { false } { ...props } /> ;
322
332
} ;
333
+
334
+ // You can see the favicon designs here: https://www.figma.com/file/YIGBkXUcnRGz2ZKNmLaJQf/Coder-v2-Design?node-id=560%3A620
335
+ type FaviconType =
336
+ | "favicon"
337
+ | "favicon-success"
338
+ | "favicon-error"
339
+ | "favicon-warning"
340
+ | "favicon-running" ;
341
+
342
+ const getFaviconByStatus = ( build : TypesGen . WorkspaceBuild ) : FaviconType => {
343
+ switch ( build . status ) {
344
+ case undefined :
345
+ return "favicon" ;
346
+ case "running" :
347
+ return "favicon-success" ;
348
+ case "starting" :
349
+ return "favicon-running" ;
350
+ case "stopping" :
351
+ return "favicon-running" ;
352
+ case "stopped" :
353
+ return "favicon" ;
354
+ case "deleting" :
355
+ return "favicon" ;
356
+ case "deleted" :
357
+ return "favicon" ;
358
+ case "canceling" :
359
+ return "favicon-warning" ;
360
+ case "canceled" :
361
+ return "favicon" ;
362
+ case "failed" :
363
+ return "favicon-error" ;
364
+ case "pending" :
365
+ return "favicon" ;
366
+ }
367
+ } ;
0 commit comments