Skip to content

Commit 600d5bf

Browse files
committed
Add loading indicator
1 parent 5478411 commit 600d5bf

File tree

4 files changed

+26
-12
lines changed

4 files changed

+26
-12
lines changed

site/src/components/WorkspaceBuildLogs/WorkspaceBuildLogs.stories.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,9 @@ export const Example = Template.bind({})
1313
Example.args = {
1414
logs: MockWorkspaceBuildLogs,
1515
}
16+
17+
export const Loading = Template.bind({})
18+
Loading.args = {
19+
logs: MockWorkspaceBuildLogs,
20+
isLoading: true,
21+
}

site/src/components/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import CircularProgress from "@material-ui/core/CircularProgress"
12
import { makeStyles } from "@material-ui/core/styles"
23
import dayjs from "dayjs"
34
import { FC } from "react"
@@ -35,29 +36,34 @@ const getStageDurationInSeconds = (logs: ProvisionerJobLog[]) => {
3536

3637
export interface WorkspaceBuildLogsProps {
3738
logs: ProvisionerJobLog[]
39+
isLoading: boolean
3840
}
3941

40-
export const WorkspaceBuildLogs: FC<WorkspaceBuildLogsProps> = ({ logs }) => {
42+
export const WorkspaceBuildLogs: FC<WorkspaceBuildLogsProps> = ({ logs, isLoading }) => {
4143
const groupedLogsByStage = groupLogsByStage(logs)
4244
const stages = Object.keys(groupedLogsByStage)
4345
const styles = useStyles()
4446

4547
return (
4648
<div className={styles.logs}>
47-
{stages.map((stage) => {
49+
{stages.map((stage, stageIndex) => {
4850
const logs = groupedLogsByStage[stage]
4951
const isEmpty = logs.every((log) => log.output === "")
5052
const lines = logs.map((log) => ({
5153
time: log.created_at,
5254
output: log.output,
5355
}))
5456
const duration = getStageDurationInSeconds(logs)
57+
const isLastStage = stageIndex === stages.length - 1
58+
const shouldDisplaySpinner = isLoading && isLastStage
59+
const shouldDisplayDuration = !isLoading && duration
5560

5661
return (
5762
<div key={stage}>
5863
<div className={styles.header}>
5964
<div>{stage}</div>
60-
{duration && <div className={styles.duration}>{duration} seconds</div>}
65+
{shouldDisplaySpinner && <CircularProgress size={14} className={styles.spinner} />}
66+
{shouldDisplayDuration && <div className={styles.duration}>{duration} seconds</div>}
6167
</div>
6268
{!isEmpty && <Logs lines={lines} className={styles.codeBlock} />}
6369
</div>
@@ -78,6 +84,7 @@ const useStyles = makeStyles((theme) => ({
7884
fontSize: theme.typography.body1.fontSize,
7985
padding: theme.spacing(2),
8086
paddingLeft: theme.spacing(4),
87+
paddingRight: theme.spacing(4),
8188
borderBottom: `1px solid ${theme.palette.divider}`,
8289
backgroundColor: theme.palette.background.paper,
8390
display: "flex",
@@ -94,4 +101,8 @@ const useStyles = makeStyles((theme) => ({
94101
padding: theme.spacing(2),
95102
paddingLeft: theme.spacing(4),
96103
},
104+
105+
spinner: {
106+
marginLeft: "auto",
107+
},
97108
}))

site/src/pages/WorkspaceBuildPage/WorkspaceBuildPage.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { useMachine } from "@xstate/react"
44
import { FC } from "react"
55
import { useParams } from "react-router-dom"
66
import { ProvisionerJobLog } from "../../api/typesGenerated"
7-
import { Loader } from "../../components/Loader/Loader"
87
import { Margins } from "../../components/Margins/Margins"
98
import { Stack } from "../../components/Stack/Stack"
109
import { WorkspaceBuildLogs } from "../../components/WorkspaceBuildLogs/WorkspaceBuildLogs"
@@ -27,8 +26,10 @@ const useBuildId = () => {
2726

2827
export const WorkspaceBuildPage: FC = () => {
2928
const buildId = useBuildId()
30-
const [buildState] = useMachine(workspaceBuildMachine, { context: { buildId } })
29+
// We can initialize logs as an empty array because it will be a stream
30+
const [buildState] = useMachine(workspaceBuildMachine, { context: { buildId, logs: [] } })
3131
const { logs, build } = buildState.context
32+
const isLoading = !buildState.matches("loaded")
3233
const styles = useStyles()
3334

3435
return (
@@ -39,8 +40,7 @@ export const WorkspaceBuildPage: FC = () => {
3940
</Typography>
4041

4142
{build && <WorkspaceBuildStats build={build} />}
42-
{!logs && <Loader />}
43-
{logs && <WorkspaceBuildLogs logs={sortLogsByCreatedAt(logs)} />}
43+
<WorkspaceBuildLogs logs={sortLogsByCreatedAt(logs)} isLoading={isLoading} />
4444
</Stack>
4545
</Margins>
4646
)

site/src/xServices/workspaceBuild/workspaceBuildXService.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type LogsContext = {
88
build?: WorkspaceBuild
99
getBuildError?: Error | unknown
1010
// Logs
11-
logs?: ProvisionerJobLog[]
11+
logs: ProvisionerJobLog[]
1212
}
1313

1414
type LogsEvent =
@@ -110,10 +110,7 @@ export const workspaceBuildMachine = createMachine(
110110
logs: (_, event) => event.data,
111111
}),
112112
addLog: assign({
113-
logs: (context, event) => {
114-
const previousLogs = context.logs ?? []
115-
return [...previousLogs, event.log]
116-
},
113+
logs: (context, event) => [...context.logs, event.log],
117114
}),
118115
},
119116
services: {

0 commit comments

Comments
 (0)