1
1
import { Theme } from "@material-ui/core/styles"
2
2
import dayjs from "dayjs"
3
+ import utc from "dayjs/plugin/utc"
3
4
import { WorkspaceBuildTransition } from "../api/types"
4
- import { Workspace , WorkspaceAgent , WorkspaceBuild } from "../api/typesGenerated"
5
+ import * as TypesGen from "../api/typesGenerated"
6
+
7
+ dayjs . extend ( utc )
5
8
6
9
export type WorkspaceStatus =
7
10
| "queued"
@@ -29,7 +32,7 @@ const succeededToStatus: Record<WorkspaceBuildTransition, WorkspaceStatus> = {
29
32
}
30
33
31
34
// Converts a workspaces status to a human-readable form.
32
- export const getWorkspaceStatus = ( workspaceBuild ?:WorkspaceBuild ) :WorkspaceStatus => {
35
+ export const getWorkspaceStatus = ( workspaceBuild ?:TypesGen . WorkspaceBuild ) :WorkspaceStatus => {
33
36
const transition = workspaceBuild ?. transition as WorkspaceBuildTransition
34
37
const jobStatus = workspaceBuild ?. job . status
35
38
switch ( jobStatus ) {
@@ -67,7 +70,7 @@ export const DisplayStatusLanguage = {
67
70
// Localize workspace status and provide corresponding color from theme
68
71
export const getDisplayStatus = (
69
72
theme :Theme ,
70
- build :WorkspaceBuild ,
73
+ build :TypesGen . WorkspaceBuild ,
71
74
) :{
72
75
color :string
73
76
status :string
@@ -133,7 +136,7 @@ export const getDisplayStatus = (
133
136
throw new Error ( "unknown status " + status )
134
137
}
135
138
136
- export const getWorkspaceBuildDurationInSeconds = ( build :WorkspaceBuild ) :number | undefined => {
139
+ export const getWorkspaceBuildDurationInSeconds = ( build :TypesGen . WorkspaceBuild ) :number | undefined => {
137
140
const isCompleted = build . job . started_at && build . job . completed_at
138
141
139
142
if ( ! isCompleted ) {
@@ -145,7 +148,10 @@ export const getWorkspaceBuildDurationInSeconds = (build: WorkspaceBuild): numbe
145
148
return completedAt . diff ( startedAt , "seconds" )
146
149
}
147
150
148
- export const displayWorkspaceBuildDuration = ( build :WorkspaceBuild , inProgressLabel = "In progress" ) :string => {
151
+ export const displayWorkspaceBuildDuration = (
152
+ build :TypesGen . WorkspaceBuild ,
153
+ inProgressLabel = "In progress" ,
154
+ ) :string => {
149
155
const duration = getWorkspaceBuildDurationInSeconds ( build )
150
156
return duration ?`${ duration } seconds` :inProgressLabel
151
157
}
@@ -158,7 +164,7 @@ export const DisplayAgentStatusLanguage = {
158
164
159
165
export const getDisplayAgentStatus = (
160
166
theme :Theme ,
161
- agent :WorkspaceAgent ,
167
+ agent :TypesGen . WorkspaceAgent ,
162
168
) :{
163
169
color :string
164
170
status :string
@@ -187,8 +193,17 @@ export const getDisplayAgentStatus = (
187
193
}
188
194
}
189
195
190
- export const isWorkspaceOn = ( workspace :Workspace ) :boolean => {
196
+ export const isWorkspaceOn = ( workspace :TypesGen . Workspace ) :boolean => {
191
197
const transition = workspace . latest_build . transition
192
198
const status = workspace . latest_build . job . status
193
199
return transition === "start" && status === "succeeded"
194
200
}
201
+
202
+ export const defaultWorkspaceExtension = ( __startDate ?:dayjs . Dayjs ) :TypesGen . PutExtendWorkspaceRequest => {
203
+ const now = __startDate ?dayjs ( __startDate ) :dayjs ( )
204
+ const NinetyMinutesFromNow = now . add ( 90 , "minutes" ) . utc ( )
205
+
206
+ return {
207
+ deadline :NinetyMinutesFromNow . format ( ) ,
208
+ }
209
+ }