Skip to content

Commit 80bc90b

Browse files
committed
make the UI stuff go
1 parent fa025f4 commit 80bc90b

File tree

4 files changed

+62
-4
lines changed

4 files changed

+62
-4
lines changed

site/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"react-i18next": "11.18.4",
5454
"react-markdown": "8.0.3",
5555
"react-router-dom": "6.3.0",
56+
"semver": "^7.3.7",
5657
"sourcemapped-stacktrace": "1.1.11",
5758
"swr": "1.3.0",
5859
"tzdata": "1.0.30",

site/src/components/Resources/Resources.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@ import TableRow from "@material-ui/core/TableRow"
88
import useTheme from "@material-ui/styles/useTheme"
99
import { ErrorSummary } from "components/ErrorSummary/ErrorSummary"
1010
import { FC } from "react"
11-
import { getDisplayAgentStatus, getWorkspaceStatus, WorkspaceStateEnum } from "util/workspace"
12-
import { Workspace, WorkspaceResource } from "../../api/typesGenerated"
11+
import {
12+
getDisplayAgentStatus,
13+
getDisplayVersionStatus,
14+
getWorkspaceStatus,
15+
WorkspaceStateEnum,
16+
} from "util/workspace"
17+
import { BuildInfoResponse, Workspace, WorkspaceResource } from "../../api/typesGenerated"
1318
import { AppLink } from "../AppLink/AppLink"
1419
import { SSHButton } from "../SSHButton/SSHButton"
1520
import { Stack } from "../Stack/Stack"
@@ -31,13 +36,15 @@ interface ResourcesProps {
3136
getResourcesError?: Error | unknown
3237
workspace: Workspace
3338
canUpdateWorkspace: boolean
39+
buildInfo?: BuildInfoResponse | undefined
3440
}
3541

3642
export const Resources: FC<React.PropsWithChildren<ResourcesProps>> = ({
3743
resources,
3844
getResourcesError,
3945
workspace,
4046
canUpdateWorkspace,
47+
buildInfo,
4148
}) => {
4249
const styles = useStyles()
4350
const theme: Theme = useTheme()
@@ -91,6 +98,11 @@ export const Resources: FC<React.PropsWithChildren<ResourcesProps>> = ({
9198
)
9299
}
93100

101+
const versionStatus = getDisplayVersionStatus(
102+
theme,
103+
agent.version,
104+
buildInfo?.version || "",
105+
)
94106
const agentStatus = getDisplayAgentStatus(theme, agent)
95107
return (
96108
<TableRow key={`${resource.id}-${agent.id}`}>
@@ -105,7 +117,14 @@ export const Resources: FC<React.PropsWithChildren<ResourcesProps>> = ({
105117
<TableCell className={styles.agentColumn}>
106118
{agent.name}
107119
<div className={styles.agentInfo}>
108-
<span className={styles.agentVersion}>{agent.version}</span>
120+
<span
121+
className={styles.agentVersion}
122+
style={{ color: versionStatus.color }}
123+
>
124+
{versionStatus.version}
125+
</span>
126+
</div>
127+
<div className={styles.agentInfo}>
109128
<span className={styles.operatingSystem}>{agent.operating_system}</span>
110129
{WorkspaceStateEnum[workspaceStatus] !==
111130
WorkspaceStateEnum["stopped"] && (

site/src/components/Workspace/Workspace.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { makeStyles } from "@material-ui/core/styles"
2+
import { useActor } from "@xstate/react"
23
import { ErrorSummary } from "components/ErrorSummary/ErrorSummary"
34
import { WorkspaceStatusBadge } from "components/WorkspaceStatusBadge/WorkspaceStatusBadge"
4-
import { FC } from "react"
5+
import { FC, useContext } from "react"
56
import { useNavigate } from "react-router-dom"
7+
import { XServiceContext } from "xServices/StateContext"
68
import * as TypesGen from "../../api/typesGenerated"
79
import { BuildsTable } from "../BuildsTable/BuildsTable"
810
import { Margins } from "../Margins/Margins"
@@ -65,6 +67,8 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
6567
}) => {
6668
const styles = useStyles()
6769
const navigate = useNavigate()
70+
const xServices = useContext(XServiceContext)
71+
const [buildInfoState] = useActor(xServices.buildInfoXService)
6872

6973
return (
7074
<Margins>
@@ -128,6 +132,7 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
128132
getResourcesError={workspaceErrors[WorkspaceErrors.GET_RESOURCES_ERROR]}
129133
workspace={workspace}
130134
canUpdateWorkspace={canUpdateWorkspace}
135+
buildinfo={buildInfoState.context.buildInfo}
131136
/>
132137
)}
133138

site/src/util/workspace.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import minMax from "dayjs/plugin/minMax"
55
import utc from "dayjs/plugin/utc"
66
import { WorkspaceBuildTransition } from "../api/types"
77
import * as TypesGen from "../api/typesGenerated"
8+
import semver from "semver"
89

910
dayjs.extend(duration)
1011
dayjs.extend(utc)
@@ -95,6 +96,10 @@ export const DisplayWorkspaceBuildStatusLanguage = {
9596
failed: "Failed",
9697
}
9798

99+
export const DisplayAgentVersionLanguage = {
100+
unknown: "(unknown)",
101+
}
102+
98103
export const getDisplayWorkspaceBuildStatus = (
99104
theme: Theme,
100105
build: TypesGen.WorkspaceBuild,
@@ -211,6 +216,34 @@ export const getDisplayAgentStatus = (
211216
}
212217
}
213218

219+
export const getDisplayVersionStatus = (
220+
theme: Theme,
221+
agentVersion: string,
222+
serverVersion: string,
223+
): {
224+
color: string,
225+
version: string,
226+
} => {
227+
if (!semver.valid(serverVersion) || semver.valid(agentVersion)) {
228+
return {
229+
color: theme.palette.primary.main,
230+
version: agentVersion || "(version unknown)",
231+
}
232+
}
233+
234+
if (semver.lt(agentVersion, serverVersion)) {
235+
return {
236+
color: theme.palette.text.secondary,
237+
version: `${agentVersion} (outdated)`,
238+
}
239+
}
240+
241+
return {
242+
color: theme.palette.success.main,
243+
version: agentVersion,
244+
}
245+
}
246+
214247
export const isWorkspaceOn = (workspace: TypesGen.Workspace): boolean => {
215248
const transition = workspace.latest_build.transition
216249
const status = workspace.latest_build.job.status

0 commit comments

Comments
 (0)