6
6
7
7
import { Prebuild , PrebuildPhase_Phase , TaskLog } from "@gitpod/public-api/lib/gitpod/v1/prebuild_pb" ;
8
8
import { BreadcrumbNav } from "@podkit/breadcrumbs/BreadcrumbNav" ;
9
- import { Text } from "@podkit/typography/Text" ;
10
9
import { Button } from "@podkit/buttons/Button" ;
11
- import { FC , Suspense , useCallback , useEffect , useMemo , useState } from "react" ;
10
+ import { FC , useCallback , useEffect , useMemo , useState } from "react" ;
12
11
import { Redirect , useHistory , useParams } from "react-router" ;
13
12
import dayjs from "dayjs" ;
14
13
import { useToast } from "../../components/toasts/Toasts" ;
@@ -26,9 +25,10 @@ import Alert from "../../components/Alert";
26
25
import { PrebuildStatus } from "../../projects/prebuild-utils" ;
27
26
import { LoadingButton } from "@podkit/buttons/LoadingButton" ;
28
27
import { ApplicationError , ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error" ;
29
- import { Tabs , TabsContent , TabsList , TabsTrigger } from "@podkit/tabs/Tabs" ;
28
+ import { Tabs , TabsList , TabsTrigger } from "@podkit/tabs/Tabs" ;
30
29
import { PrebuildTaskTab } from "./PrebuildTaskTab" ;
31
30
import type { PlainMessage } from "@bufbuild/protobuf" ;
31
+ import { PrebuildTaskErrorTab } from "./PrebuildTaskErrorTab" ;
32
32
33
33
/**
34
34
* Formats a date. For today, it returns the time. For this year, it returns the month and day and time. Otherwise, it returns the full date and time.
@@ -52,29 +52,28 @@ interface Props {
52
52
export const PrebuildDetailPage : FC = ( ) => {
53
53
const { prebuildId } = useParams < Props > ( ) ;
54
54
55
- const { data : prebuild , isLoading : isInfoLoading , error, refetch } = usePrebuildQuery ( prebuildId ) ;
55
+ const { data : initialPrebuild , isLoading : isInfoLoading , error, refetch } = usePrebuildQuery ( prebuildId ) ;
56
+ const [ currentPrebuild , setCurrentPrebuild ] = useState < Prebuild | undefined > ( ) ;
57
+ const prebuild = currentPrebuild ?? initialPrebuild ;
56
58
57
59
const history = useHistory ( ) ;
58
60
const { toast, dismissToast } = useToast ( ) ;
59
- const [ currentPrebuild , setCurrentPrebuild ] = useState < Prebuild | undefined > ( ) ;
60
- const [ logNotFound , setLogNotFound ] = useState ( false ) ;
61
61
const [ selectedTaskId , actuallySetSelectedTaskId ] = useState < string | undefined > (
62
62
window . location . hash . slice ( 1 ) || undefined ,
63
63
) ;
64
64
65
65
const isImageBuild =
66
- currentPrebuild ?. status ?. phase ?. name === PrebuildPhase_Phase . QUEUED &&
67
- ! ! currentPrebuild . status . imageBuildLogUrl ;
66
+ prebuild ?. status ?. phase ?. name === PrebuildPhase_Phase . QUEUED && ! ! prebuild . status . imageBuildLogUrl ;
68
67
const taskId = useMemo ( ( ) => {
69
- if ( ! currentPrebuild ) {
68
+ if ( ! prebuild ) {
70
69
return undefined ;
71
70
}
72
71
if ( isImageBuild ) {
73
72
return "image-build" ;
74
73
}
75
74
76
- return selectedTaskId ?? currentPrebuild ?. status ?. taskLogs . filter ( ( f ) => f . logUrl ) [ 0 ] ?. taskId ?? undefined ;
77
- } , [ currentPrebuild , isImageBuild , selectedTaskId ] ) ;
75
+ return selectedTaskId ?? prebuild ?. status ?. taskLogs . filter ( ( f ) => f . logUrl ) [ 0 ] ?. taskId ?? undefined ;
76
+ } , [ isImageBuild , prebuild , selectedTaskId ] ) ;
78
77
79
78
const {
80
79
isFetching : isTriggeringPrebuild ,
@@ -101,11 +100,7 @@ export const PrebuildDetailPage: FC = () => {
101
100
) ;
102
101
103
102
useEffect ( ( ) => {
104
- setLogNotFound ( false ) ;
105
103
const disposable = watchPrebuild ( prebuildId , ( prebuild ) => {
106
- if ( currentPrebuild ?. status ?. phase ?. name === PrebuildPhase_Phase . ABORTED ) {
107
- return true ;
108
- }
109
104
setCurrentPrebuild ( prebuild ) ;
110
105
111
106
return isPrebuildDone ( prebuild ) ;
@@ -114,21 +109,21 @@ export const PrebuildDetailPage: FC = () => {
114
109
return ( ) => {
115
110
disposable . dispose ( ) ;
116
111
} ;
117
- } , [ prebuildId , currentPrebuild ?. status ?. phase ?. name ] ) ;
112
+ } , [ prebuildId ] ) ;
118
113
119
114
const prebuildTasks = useMemo ( ( ) => {
120
115
const validTasks : Omit < PlainMessage < TaskLog > , "taskJson" > [ ] =
121
- currentPrebuild ?. status ?. taskLogs . filter ( ( t ) => t . logUrl ) ?? [ ] ;
116
+ prebuild ?. status ?. taskLogs . filter ( ( t ) => t . logUrl ) ?? [ ] ;
122
117
if ( isImageBuild ) {
123
118
validTasks . unshift ( {
124
119
taskId : "image-build" ,
125
120
taskLabel : "Image Build" ,
126
- logUrl : currentPrebuild ?. status ?. imageBuildLogUrl ! , // we know this is defined because we're in the isImageBuild branch
121
+ logUrl : prebuild ?. status ?. imageBuildLogUrl ! , // we know this is defined because we're in the isImageBuild branch
127
122
} ) ;
128
123
}
129
124
130
125
return validTasks ;
131
- } , [ currentPrebuild ?. status , isImageBuild ] ) ;
126
+ } , [ isImageBuild , prebuild ?. status ?. imageBuildLogUrl , prebuild ?. status ?. taskLogs ] ) ;
132
127
133
128
useEffect ( ( ) => {
134
129
history . listen ( ( ) => {
@@ -157,9 +152,8 @@ export const PrebuildDetailPage: FC = () => {
157
152
}
158
153
} , [ prebuild , cancelPrebuildMutation ] ) ;
159
154
160
- const isError = logNotFound || prebuildTasks . length === 0 ;
161
-
162
- if ( newPrebuildID ) {
155
+ // For some reason, we sometimes hit a case where the newPrebuildID is actually set without us triggering the query.
156
+ if ( newPrebuildID && prebuild ?. id !== newPrebuildID ) {
163
157
return < Redirect to = { repositoriesRoutes . PrebuildDetail ( newPrebuildID ) } /> ;
164
158
}
165
159
@@ -201,8 +195,7 @@ export const PrebuildDetailPage: FC = () => {
201
195
) }
202
196
</ div >
203
197
) : (
204
- prebuild &&
205
- currentPrebuild && (
198
+ prebuild && (
206
199
< div className = { "border border-pk-border-base rounded-xl py-6 divide-y" } >
207
200
< div className = "px-6 pb-4" >
208
201
< div className = "flex flex-col gap-2" >
@@ -236,10 +229,10 @@ export const PrebuildDetailPage: FC = () => {
236
229
</ div >
237
230
< div className = "flex flex-col gap-1 border-pk-border-base" >
238
231
< div className = "py-4 px-6 flex flex-col gap-1" >
239
- < PrebuildStatus prebuild = { currentPrebuild } />
240
- { currentPrebuild ?. status ?. message && (
232
+ < PrebuildStatus prebuild = { prebuild } />
233
+ { prebuild ?. status ?. message && (
241
234
< div className = "text-pk-content-secondary truncate" >
242
- { currentPrebuild ?. status . message }
235
+ { prebuild ?. status . message }
243
236
</ div >
244
237
) }
245
238
</ div >
@@ -257,54 +250,20 @@ export const PrebuildDetailPage: FC = () => {
257
250
</ TabsTrigger >
258
251
) ) }
259
252
</ TabsList >
260
- { ! isError ? (
253
+ { prebuildTasks . length !== 0 ? (
261
254
prebuildTasks . map ( ( { taskId } ) => (
262
- < PrebuildTaskTab
263
- key = { taskId }
264
- taskId = { taskId }
265
- prebuild = { currentPrebuild }
266
- onLogNotFound = { ( ) => setLogNotFound ( true ) }
267
- />
255
+ < PrebuildTaskTab key = { taskId } taskId = { taskId } prebuild = { prebuild } />
268
256
) )
269
257
) : (
270
- < TabsContent
271
- value = { taskId ?? "empty-tab" }
272
- className = "h-112 mt-0 border-pk-border-base"
273
- >
274
- < Suspense fallback = { < div /> } >
275
- < div className = "px-6 py-4 h-full w-full bg-pk-surface-primary text-base flex items-center justify-center" >
276
- < Text className = "w-80 text-center" >
277
- { logNotFound ? (
278
- < >
279
- Logs of this prebuild are inaccessible. Use{ " " }
280
- < code > gp validate --prebuild --headless</ code > in a
281
- workspace to see logs and debug prebuild issues.{ " " }
282
- < a
283
- href = "https://www.gitpod.io/docs/configure/workspaces#validate-your-gitpod-configuration"
284
- target = "_blank"
285
- rel = "noreferrer noopener"
286
- className = "gp-link"
287
- >
288
- Learn more
289
- </ a >
290
- .
291
- </ >
292
- ) : (
293
- < >
294
- No prebuild tasks defined in < code > .gitpod.yml</ code > { " " }
295
- for this prebuild
296
- </ >
297
- ) }
298
- </ Text >
299
- </ div >
300
- </ Suspense >
301
- </ TabsContent >
258
+ < PrebuildTaskErrorTab >
259
+ No prebuild tasks defined in < code > .gitpod.yml</ code > for this prebuild
260
+ </ PrebuildTaskErrorTab >
302
261
) }
303
262
</ Tabs >
304
263
</ div >
305
264
< div className = "px-6 pt-6 flex justify-between border-pk-border-base" >
306
265
{ [ PrebuildPhase_Phase . BUILDING , PrebuildPhase_Phase . QUEUED ] . includes (
307
- currentPrebuild ?. status ?. phase ?. name ?? PrebuildPhase_Phase . UNSPECIFIED ,
266
+ prebuild ?. status ?. phase ?. name ?? PrebuildPhase_Phase . UNSPECIFIED ,
308
267
) ? (
309
268
< LoadingButton
310
269
loading = { cancelPrebuildMutation . isLoading }
0 commit comments