1
1
import { makeStyles } from "@material-ui/core/styles"
2
- import { useActor , useMachine , useSelector } from "@xstate/react"
3
- import { FeatureNames } from "api/types"
4
- import dayjs from "dayjs"
5
- import minMax from "dayjs/plugin/minMax"
6
- import { FC , useContext , useEffect } from "react"
7
- import { Helmet } from "react-helmet-async"
8
- import { useTranslation } from "react-i18next"
2
+ import { useMachine } from "@xstate/react"
3
+ import { ChooseOne , Cond } from "components/Conditionals/ChooseOne"
4
+ import { FC , useEffect } from "react"
9
5
import { useParams } from "react-router-dom"
10
- import { selectFeatureVisibility } from "xServices/entitlements/entitlementsSelectors"
11
- import { DeleteDialog } from "../../components/Dialogs/DeleteDialog/DeleteDialog"
12
6
import { ErrorSummary } from "../../components/ErrorSummary/ErrorSummary"
13
7
import { FullScreenLoader } from "../../components/Loader/FullScreenLoader"
14
- import { Workspace , WorkspaceErrors } from "../../components/Workspace/Workspace"
15
8
import { firstOrItem } from "../../util/array"
16
- import { pageTitle } from "../../util/page"
17
- import { canExtendDeadline , canReduceDeadline , maxDeadline , minDeadline } from "../../util/schedule"
18
- import { getFaviconByStatus } from "../../util/workspace"
19
- import { XServiceContext } from "../../xServices/StateContext"
20
9
import { workspaceMachine } from "../../xServices/workspace/workspaceXService"
21
- import { workspaceScheduleBannerMachine } from "../../xServices/workspaceSchedule/workspaceScheduleBannerXService"
22
-
23
- dayjs . extend ( minMax )
10
+ import { WorkspaceReadyPage } from "./WorkspaceReadyPage"
24
11
25
12
export const WorkspacePage : FC = ( ) => {
26
13
const { username : usernameQueryParam , workspace : workspaceQueryParam } = useParams ( )
27
14
const username = firstOrItem ( usernameQueryParam , null )
28
15
const workspaceName = firstOrItem ( workspaceQueryParam , null )
29
- const { t } = useTranslation ( "workspacePage" )
30
- const xServices = useContext ( XServiceContext )
31
- const featureVisibility = useSelector ( xServices . entitlementsXService , selectFeatureVisibility )
32
16
const [ workspaceState , workspaceSend ] = useMachine ( workspaceMachine )
33
- const {
34
- workspace,
35
- getWorkspaceError,
36
- template,
37
- getTemplateWarning,
38
- refreshWorkspaceWarning,
39
- builds,
40
- getBuildsError,
41
- permissions,
42
- checkPermissionsError,
43
- buildError,
44
- cancellationError,
45
- applicationsHost,
46
- } = workspaceState . context
47
- const canUpdateWorkspace = Boolean ( permissions ?. updateWorkspace )
48
- const [ bannerState , bannerSend ] = useMachine ( workspaceScheduleBannerMachine )
49
- const [ buildInfoState ] = useActor ( xServices . buildInfoXService )
17
+ const { workspace, getWorkspaceError, getTemplateWarning, checkPermissionsError } =
18
+ workspaceState . context
50
19
const styles = useStyles ( )
51
20
52
21
/**
@@ -57,95 +26,23 @@ export const WorkspacePage: FC = () => {
57
26
username && workspaceName && workspaceSend ( { type : "GET_WORKSPACE" , username, workspaceName } )
58
27
} , [ username , workspaceName , workspaceSend ] )
59
28
60
- if ( workspaceState . matches ( "error" ) ) {
61
- return (
62
- < div className = { styles . error } >
63
- { Boolean ( getWorkspaceError ) && < ErrorSummary error = { getWorkspaceError } /> }
64
- { Boolean ( getTemplateWarning ) && < ErrorSummary error = { getTemplateWarning } /> }
65
- { Boolean ( checkPermissionsError ) && < ErrorSummary error = { checkPermissionsError } /> }
66
- </ div >
67
- )
68
- } else if ( ! workspace || ! permissions ) {
69
- return < FullScreenLoader />
70
- } else if ( ! template ) {
71
- return < FullScreenLoader />
72
- } else {
73
- const deadline = dayjs ( workspace . latest_build . deadline ) . utc ( )
74
- const favicon = getFaviconByStatus ( workspace . latest_build )
75
- return (
76
- < >
77
- < Helmet >
78
- < title > { pageTitle ( `${ workspace . owner_name } /${ workspace . name } ` ) } </ title >
79
- < link rel = "alternate icon" type = "image/png" href = { `/favicons/${ favicon } .png` } />
80
- < link rel = "icon" type = "image/svg+xml" href = { `/favicons/${ favicon } .svg` } />
81
- </ Helmet >
82
-
83
- < Workspace
84
- bannerProps = { {
85
- isLoading : bannerState . hasTag ( "loading" ) ,
86
- onExtend : ( ) => {
87
- bannerSend ( {
88
- type : "UPDATE_DEADLINE" ,
89
- workspaceId : workspace . id ,
90
- newDeadline : dayjs . min ( deadline . add ( 4 , "hours" ) , maxDeadline ( workspace , template ) ) ,
91
- } )
92
- } ,
93
- } }
94
- scheduleProps = { {
95
- onDeadlineMinus : ( ) => {
96
- bannerSend ( {
97
- type : "UPDATE_DEADLINE" ,
98
- workspaceId : workspace . id ,
99
- newDeadline : dayjs . max ( deadline . add ( - 1 , "hours" ) , minDeadline ( ) ) ,
100
- } )
101
- } ,
102
- onDeadlinePlus : ( ) => {
103
- bannerSend ( {
104
- type : "UPDATE_DEADLINE" ,
105
- workspaceId : workspace . id ,
106
- newDeadline : dayjs . min ( deadline . add ( 1 , "hours" ) , maxDeadline ( workspace , template ) ) ,
107
- } )
108
- } ,
109
- deadlineMinusEnabled : ( ) => {
110
- return canReduceDeadline ( deadline )
111
- } ,
112
- deadlinePlusEnabled : ( ) => {
113
- return canExtendDeadline ( deadline , workspace , template )
114
- } ,
115
- } }
116
- isUpdating = { workspaceState . hasTag ( "updating" ) }
117
- workspace = { workspace }
118
- handleStart = { ( ) => workspaceSend ( "START" ) }
119
- handleStop = { ( ) => workspaceSend ( "STOP" ) }
120
- handleDelete = { ( ) => workspaceSend ( "ASK_DELETE" ) }
121
- handleUpdate = { ( ) => workspaceSend ( "UPDATE" ) }
122
- handleCancel = { ( ) => workspaceSend ( "CANCEL" ) }
123
- resources = { workspace . latest_build . resources }
124
- builds = { builds }
125
- canUpdateWorkspace = { canUpdateWorkspace }
126
- hideSSHButton = { featureVisibility [ FeatureNames . BrowserOnly ] }
127
- workspaceErrors = { {
128
- [ WorkspaceErrors . GET_RESOURCES_ERROR ] : refreshWorkspaceWarning ,
129
- [ WorkspaceErrors . GET_BUILDS_ERROR ] : getBuildsError ,
130
- [ WorkspaceErrors . BUILD_ERROR ] : buildError ,
131
- [ WorkspaceErrors . CANCELLATION_ERROR ] : cancellationError ,
132
- } }
133
- buildInfo = { buildInfoState . context . buildInfo }
134
- applicationsHost = { applicationsHost }
135
- />
136
- < DeleteDialog
137
- entity = "workspace"
138
- name = { workspace . name }
139
- info = { t ( "deleteDialog.info" , { timeAgo : dayjs ( workspace . created_at ) . fromNow ( ) } ) }
140
- isOpen = { workspaceState . matches ( { ready : { build : "askingDelete" } } ) }
141
- onCancel = { ( ) => workspaceSend ( "CANCEL_DELETE" ) }
142
- onConfirm = { ( ) => {
143
- workspaceSend ( "DELETE" )
144
- } }
145
- />
146
- </ >
147
- )
148
- }
29
+ return (
30
+ < ChooseOne >
31
+ < Cond condition = { workspaceState . matches ( "error" ) } >
32
+ < div className = { styles . error } >
33
+ { Boolean ( getWorkspaceError ) && < ErrorSummary error = { getWorkspaceError } /> }
34
+ { Boolean ( getTemplateWarning ) && < ErrorSummary error = { getTemplateWarning } /> }
35
+ { Boolean ( checkPermissionsError ) && < ErrorSummary error = { checkPermissionsError } /> }
36
+ </ div >
37
+ </ Cond >
38
+ < Cond condition = { Boolean ( workspace ) && workspaceState . matches ( "ready" ) } >
39
+ < WorkspaceReadyPage workspaceState = { workspaceState } workspaceSend = { workspaceSend } />
40
+ </ Cond >
41
+ < Cond >
42
+ < FullScreenLoader />
43
+ </ Cond >
44
+ </ ChooseOne >
45
+ )
149
46
}
150
47
151
48
const useStyles = makeStyles ( ( theme ) => ( {
0 commit comments