1
1
import { API } from "api/api" ;
2
- import { getErrorMessage } from "api/errors" ;
2
+ import { type ApiError , getErrorMessage } from "api/errors" ;
3
+ import { isApiError } from "api/errors" ;
3
4
import { templateVersion } from "api/queries/templates" ;
4
5
import { workspaceBuildTimings } from "api/queries/workspaceBuilds" ;
5
6
import {
@@ -15,9 +16,10 @@ import {
15
16
ConfirmDialog ,
16
17
type ConfirmDialogProps ,
17
18
} from "components/Dialogs/ConfirmDialog/ConfirmDialog" ;
18
- import { EphemeralParametersDialog } from "components/EphemeralParametersDialog/EphemeralParametersDialog" ;
19
19
import { displayError } from "components/GlobalSnackbar/utils" ;
20
20
import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs" ;
21
+ import { EphemeralParametersDialog } from "modules/workspaces/EphemeralParametersDialog/EphemeralParametersDialog" ;
22
+ import { WorkspaceErrorDialog } from "modules/workspaces/ErrorDialog/WorkspaceErrorDialog" ;
21
23
import {
22
24
WorkspaceUpdateDialogs ,
23
25
useWorkspaceUpdate ,
@@ -55,15 +57,35 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
55
57
buildParameters ?: TypesGen . WorkspaceBuildParameter [ ] ;
56
58
} > ( { open : false } ) ;
57
59
60
+ const [ workspaceErrorDialog , setWorkspaceErrorDialog ] = useState < {
61
+ open : boolean ;
62
+ error ?: ApiError ;
63
+ } > ( { open : false } ) ;
64
+
65
+ const handleError = ( error : unknown ) => {
66
+ if ( isApiError ( error ) && error . code === "ERR_BAD_REQUEST" ) {
67
+ setWorkspaceErrorDialog ( {
68
+ open : true ,
69
+ error : error ,
70
+ } ) ;
71
+ } else {
72
+ displayError ( getErrorMessage ( error , "Failed to build workspace." ) ) ;
73
+ }
74
+ } ;
75
+
58
76
const [ ephemeralParametersDialog , setEphemeralParametersDialog ] = useState < {
59
77
open : boolean ;
60
78
action : "start" | "restart" ;
61
79
buildParameters ?: TypesGen . WorkspaceBuildParameter [ ] ;
62
80
ephemeralParameters : TypesGen . TemplateVersionParameter [ ] ;
63
81
} > ( { open : false , action : "start" , ephemeralParameters : [ ] } ) ;
82
+
64
83
const { mutate : mutateRestartWorkspace , isPending : isRestarting } =
65
84
useMutation ( {
66
85
mutationFn : API . restartWorkspace ,
86
+ onError : ( error : unknown ) => {
87
+ handleError ( error ) ;
88
+ } ,
67
89
} ) ;
68
90
69
91
// Favicon
@@ -92,32 +114,52 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
92
114
} ) ;
93
115
94
116
// Delete workspace
95
- const deleteWorkspaceMutation = useMutation (
96
- deleteWorkspace ( workspace , queryClient ) ,
97
- ) ;
117
+ const deleteWorkspaceMutation = useMutation ( {
118
+ ...deleteWorkspace ( workspace , queryClient ) ,
119
+ onError : ( error : unknown ) => {
120
+ handleError ( error ) ;
121
+ } ,
122
+ } ) ;
98
123
99
124
// Activate workspace
100
- const activateWorkspaceMutation = useMutation (
101
- activate ( workspace , queryClient ) ,
102
- ) ;
125
+ const activateWorkspaceMutation = useMutation ( {
126
+ ...activate ( workspace , queryClient ) ,
127
+ onError : ( error : unknown ) => {
128
+ handleError ( error ) ;
129
+ } ,
130
+ } ) ;
103
131
104
132
// Stop workspace
105
- const stopWorkspaceMutation = useMutation (
106
- stopWorkspace ( workspace , queryClient ) ,
107
- ) ;
133
+ const stopWorkspaceMutation = useMutation ( {
134
+ ...stopWorkspace ( workspace , queryClient ) ,
135
+ onError : ( error : unknown ) => {
136
+ handleError ( error ) ;
137
+ } ,
138
+ } ) ;
108
139
109
140
// Start workspace
110
- const startWorkspaceMutation = useMutation (
111
- startWorkspace ( workspace , queryClient ) ,
112
- ) ;
141
+ const startWorkspaceMutation = useMutation ( {
142
+ ...startWorkspace ( workspace , queryClient ) ,
143
+ onError : ( error : unknown ) => {
144
+ handleError ( error ) ;
145
+ } ,
146
+ } ) ;
113
147
114
148
// Toggle workspace favorite
115
- const toggleFavoriteMutation = useMutation (
116
- toggleFavorite ( workspace , queryClient ) ,
117
- ) ;
149
+ const toggleFavoriteMutation = useMutation ( {
150
+ ...toggleFavorite ( workspace , queryClient ) ,
151
+ onError : ( error : unknown ) => {
152
+ handleError ( error ) ;
153
+ } ,
154
+ } ) ;
118
155
119
156
// Cancel build
120
- const cancelBuildMutation = useMutation ( cancelBuild ( workspace , queryClient ) ) ;
157
+ const cancelBuildMutation = useMutation ( {
158
+ ...cancelBuild ( workspace , queryClient ) ,
159
+ onError : ( error : unknown ) => {
160
+ handleError ( error ) ;
161
+ } ,
162
+ } ) ;
121
163
122
164
// Workspace Timings.
123
165
const timingsQuery = useQuery ( {
@@ -341,6 +383,16 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
341
383
/>
342
384
343
385
< WorkspaceUpdateDialogs { ...workspaceUpdate . dialogs } />
386
+
387
+ < WorkspaceErrorDialog
388
+ open = { workspaceErrorDialog . open }
389
+ error = { workspaceErrorDialog . error }
390
+ onClose = { ( ) => setWorkspaceErrorDialog ( { open : false } ) }
391
+ showDetail = { workspace . template_use_classic_parameter_flow }
392
+ workspaceOwner = { workspace . owner_name }
393
+ workspaceName = { workspace . name }
394
+ templateVersionId = { workspace . latest_build . template_version_id }
395
+ />
344
396
</ >
345
397
) ;
346
398
} ;
0 commit comments