Skip to content

Commit 33b8e19

Browse files
committed
feat: show version on login page
1 parent 7bd1b3b commit 33b8e19

File tree

12 files changed

+49
-27
lines changed

12 files changed

+49
-27
lines changed

site/src/api/queries/buildInfo.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,8 @@ export const buildInfo = (): UseQueryOptions<BuildInfoResponse> => {
1111
queryKey: buildInfoKey,
1212
initialData: initialBuildInfoData,
1313
queryFn: () => API.getBuildInfo(),
14+
// The version of the app can't change without reloading the page.
15+
cacheTime: Infinity,
16+
staleTime: Infinity,
1417
};
1518
};

site/src/modules/dashboard/DashboardProvider.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,10 @@ import {
77
} from "react";
88
import { useQuery } from "react-query";
99
import { appearance } from "api/queries/appearance";
10-
import { buildInfo } from "api/queries/buildInfo";
1110
import { entitlements } from "api/queries/entitlements";
1211
import { experiments } from "api/queries/experiments";
1312
import type {
1413
AppearanceConfig,
15-
BuildInfoResponse,
1614
Entitlements,
1715
Experiments,
1816
} from "api/typesGenerated";
@@ -27,7 +25,6 @@ interface Appearance {
2725
}
2826

2927
export interface DashboardValue {
30-
buildInfo: BuildInfoResponse;
3128
entitlements: Entitlements;
3229
experiments: Experiments;
3330
appearance: Appearance;
@@ -38,16 +35,12 @@ export const DashboardContext = createContext<DashboardValue | undefined>(
3835
);
3936

4037
export const DashboardProvider: FC<PropsWithChildren> = ({ children }) => {
41-
const buildInfoQuery = useQuery(buildInfo());
4238
const entitlementsQuery = useQuery(entitlements());
4339
const experimentsQuery = useQuery(experiments());
4440
const appearanceQuery = useQuery(appearance());
4541

4642
const isLoading =
47-
!buildInfoQuery.data ||
48-
!entitlementsQuery.data ||
49-
!appearanceQuery.data ||
50-
!experimentsQuery.data;
43+
!entitlementsQuery.data || !appearanceQuery.data || !experimentsQuery.data;
5144

5245
const [configPreview, setConfigPreview] = useState<AppearanceConfig>();
5346

@@ -84,7 +77,6 @@ export const DashboardProvider: FC<PropsWithChildren> = ({ children }) => {
8477
return (
8578
<DashboardContext.Provider
8679
value={{
87-
buildInfo: buildInfoQuery.data,
8880
entitlements: entitlementsQuery.data,
8981
experiments: experimentsQuery.data,
9082
appearance: {

site/src/modules/dashboard/Navbar/Navbar.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import type { FC } from "react";
2+
import { useQuery } from "react-query";
3+
import { buildInfo } from "api/queries/buildInfo";
24
import { useAuthenticated } from "contexts/auth/RequireAuth";
35
import { useProxy } from "contexts/ProxyContext";
46
import { useDashboard } from "modules/dashboard/useDashboard";
57
import { useFeatureVisibility } from "../useFeatureVisibility";
68
import { NavbarView } from "./NavbarView";
79

810
export const Navbar: FC = () => {
9-
const { appearance, buildInfo } = useDashboard();
11+
const { appearance } = useDashboard();
12+
const buildInfoQuery = useQuery(buildInfo());
1013
const { user: me, permissions, signOut } = useAuthenticated();
1114
const featureVisibility = useFeatureVisibility();
1215
const canViewAuditLog =
@@ -19,7 +22,7 @@ export const Navbar: FC = () => {
1922
<NavbarView
2023
user={me}
2124
logo_url={appearance.config.logo_url}
22-
buildInfo={buildInfo}
25+
buildInfo={buildInfoQuery.data}
2326
supportLinks={appearance.config.support_links}
2427
onSignOut={signOut}
2528
canViewAuditLog={canViewAuditLog}

site/src/modules/dashboard/Navbar/UserDropdown/UserDropdown.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { css, type Interpolation, type Theme, useTheme } from "@emotion/react";
22
import Badge from "@mui/material/Badge";
3-
import type { FC, ReactNode } from "react";
3+
import type { FC } from "react";
44
import type * as TypesGen from "api/typesGenerated";
55
import { DropdownArrow } from "components/DropdownArrow/DropdownArrow";
66
import {
@@ -17,7 +17,6 @@ export interface UserDropdownProps {
1717
buildInfo?: TypesGen.BuildInfoResponse;
1818
supportLinks?: readonly TypesGen.LinkConfig[];
1919
onSignOut: () => void;
20-
children?: ReactNode;
2120
}
2221

2322
export const UserDropdown: FC<UserDropdownProps> = ({

site/src/modules/resources/AgentVersion.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export const AgentVersion: FC<AgentVersionProps> = ({
2424
);
2525

2626
if (status === agentVersionStatus.Updated) {
27-
return <span>Updated</span>;
27+
return null;
2828
}
2929

3030
return (

site/src/modules/workspaces/WorkspaceStatusBadge/WorkspaceStatusBadge.stories.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import type { Meta, StoryObj } from "@storybook/react";
22
import { DashboardContext } from "modules/dashboard/DashboardProvider";
33
import {
4+
MockAppearanceConfig,
5+
MockBuildInfo,
46
MockCanceledWorkspace,
57
MockCancelingWorkspace,
68
MockDeletedWorkspace,
79
MockDeletingWorkspace,
10+
MockEntitlementsWithScheduling,
11+
MockExperiments,
812
MockFailedWorkspace,
913
MockPendingWorkspace,
1014
MockStartingWorkspace,
1115
MockStoppedWorkspace,
1216
MockStoppingWorkspace,
1317
MockWorkspace,
14-
MockBuildInfo,
15-
MockEntitlementsWithScheduling,
16-
MockExperiments,
17-
MockAppearanceConfig,
1818
} from "testHelpers/entities";
1919
import { WorkspaceStatusBadge } from "./WorkspaceStatusBadge";
2020

@@ -27,11 +27,18 @@ const MockedAppearance = {
2727
const meta: Meta<typeof WorkspaceStatusBadge> = {
2828
title: "modules/workspaces/WorkspaceStatusBadge",
2929
component: WorkspaceStatusBadge,
30+
parameters: {
31+
queries: [
32+
{
33+
key: ["buildInfo"],
34+
data: MockBuildInfo,
35+
},
36+
],
37+
},
3038
decorators: [
3139
(Story) => (
3240
<DashboardContext.Provider
3341
value={{
34-
buildInfo: MockBuildInfo,
3542
entitlements: MockEntitlementsWithScheduling,
3643
experiments: MockExperiments,
3744
appearance: MockedAppearance,

site/src/pages/LoginPage/LoginPage.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import type { FC } from "react";
22
import { Helmet } from "react-helmet-async";
3+
import { useQuery } from "react-query";
34
import { Navigate, useLocation, useNavigate } from "react-router-dom";
5+
import { buildInfo } from "api/queries/buildInfo";
46
import { useAuthContext } from "contexts/auth/AuthProvider";
57
import { getApplicationName } from "utils/appearance";
68
import { retrieveRedirect } from "utils/redirect";
@@ -20,6 +22,7 @@ export const LoginPage: FC = () => {
2022
const redirectTo = retrieveRedirect(location.search);
2123
const applicationName = getApplicationName();
2224
const navigate = useNavigate();
25+
const buildInfoQuery = useQuery(buildInfo());
2326

2427
if (isSignedIn) {
2528
// If the redirect is going to a workspace application, and we
@@ -63,6 +66,7 @@ export const LoginPage: FC = () => {
6366
authMethods={authMethods}
6467
error={signInError}
6568
isLoading={isLoading}
69+
buildInfo={buildInfoQuery.data}
6670
isSigningIn={isSigningIn}
6771
onSignIn={async ({ email, password }) => {
6872
await signIn(email, password);

site/src/pages/LoginPage/LoginPageView.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Interpolation, Theme } from "@emotion/react";
22
import type { FC } from "react";
33
import { useLocation } from "react-router-dom";
4-
import type { AuthMethods } from "api/typesGenerated";
4+
import type { AuthMethods, BuildInfoResponse } from "api/typesGenerated";
55
import { CoderIcon } from "components/Icons/CoderIcon";
66
import { Loader } from "components/Loader/Loader";
77
import { getApplicationName, getLogoURL } from "utils/appearance";
@@ -12,6 +12,7 @@ export interface LoginPageViewProps {
1212
authMethods: AuthMethods | undefined;
1313
error: unknown;
1414
isLoading: boolean;
15+
buildInfo?: BuildInfoResponse;
1516
isSigningIn: boolean;
1617
onSignIn: (credentials: { email: string; password: string }) => void;
1718
}
@@ -20,6 +21,7 @@ export const LoginPageView: FC<LoginPageViewProps> = ({
2021
authMethods,
2122
error,
2223
isLoading,
24+
buildInfo,
2325
isSigningIn,
2426
onSignIn,
2527
}) => {
@@ -64,7 +66,10 @@ export const LoginPageView: FC<LoginPageViewProps> = ({
6466
/>
6567
)}
6668
<footer css={styles.footer}>
67-
Copyright © {new Date().getFullYear()} Coder Technologies, Inc.
69+
<div>
70+
Copyright © {new Date().getFullYear()} Coder Technologies, Inc.
71+
</div>
72+
<div>{buildInfo?.version}</div>
6873
</footer>
6974
</div>
7075
</div>

site/src/pages/WorkspacePage/Workspace.stories.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ const meta: Meta<typeof Workspace> = {
2727
component: Workspace,
2828
parameters: {
2929
queries: [
30+
{
31+
key: ["buildInfo"],
32+
data: Mocks.MockBuildInfo,
33+
},
3034
{
3135
key: ["portForward", Mocks.MockWorkspaceAgent.id],
3236
data: Mocks.MockListeningPortsResponse,
@@ -37,7 +41,6 @@ const meta: Meta<typeof Workspace> = {
3741
(Story) => (
3842
<DashboardContext.Provider
3943
value={{
40-
buildInfo: Mocks.MockBuildInfo,
4144
entitlements: Mocks.MockEntitlementsWithScheduling,
4245
experiments: Mocks.MockExperiments,
4346
appearance: MockedAppearance,

site/src/pages/WorkspacePage/WorkspaceReadyPage.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { useMutation, useQuery, useQueryClient } from "react-query";
55
import { useNavigate } from "react-router-dom";
66
import { MissingBuildParameters, restartWorkspace } from "api/api";
77
import { getErrorMessage } from "api/errors";
8+
import { buildInfo } from "api/queries/buildInfo";
89
import { deploymentConfig, deploymentSSHConfig } from "api/queries/deployment";
910
import { templateVersion, templateVersions } from "api/queries/templates";
1011
import {
@@ -27,7 +28,6 @@ import { MemoizedInlineMarkdown } from "components/Markdown/Markdown";
2728
import { Stack } from "components/Stack/Stack";
2829
import { useAuthenticated } from "contexts/auth/RequireAuth";
2930
import { useWorkspaceBuildLogs } from "hooks/useWorkspaceBuildLogs";
30-
import { useDashboard } from "modules/dashboard/useDashboard";
3131
import { useFeatureVisibility } from "modules/dashboard/useFeatureVisibility";
3232
import { pageTitle } from "utils/page";
3333
import { ChangeVersionDialog } from "./ChangeVersionDialog";
@@ -50,7 +50,7 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
5050
}) => {
5151
const navigate = useNavigate();
5252
const queryClient = useQueryClient();
53-
const { buildInfo } = useDashboard();
53+
const buildInfoQuery = useQuery(buildInfo());
5454
const featureVisibility = useFeatureVisibility();
5555
if (workspace === undefined) {
5656
throw Error("Workspace is undefined");
@@ -248,7 +248,7 @@ export const WorkspaceReadyPage: FC<WorkspaceReadyPageProps> = ({
248248
canChangeVersions={canChangeVersions}
249249
hideSSHButton={featureVisibility["browser_only"]}
250250
hideVSCodeDesktopButton={featureVisibility["browser_only"]}
251-
buildInfo={buildInfo}
251+
buildInfo={buildInfoQuery.data}
252252
sshPrefix={sshPrefixQuery.data?.hostname_prefix}
253253
template={template}
254254
buildLogs={

site/src/pages/WorkspacesPage/WorkspacesPageView.stories.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,18 @@ const meta: Meta<typeof WorkspacesPageView> = {
139139
count: 13,
140140
page: 1,
141141
},
142+
parameters: {
143+
queries: [
144+
{
145+
key: ["buildInfo"],
146+
data: MockBuildInfo,
147+
},
148+
],
149+
},
142150
decorators: [
143151
(Story) => (
144152
<DashboardContext.Provider
145153
value={{
146-
buildInfo: MockBuildInfo,
147154
entitlements: MockEntitlementsWithScheduling,
148155
experiments: MockExperiments,
149156
appearance: MockedAppearance,

site/src/testHelpers/storybook.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export const withDashboardProvider = (
3030
return (
3131
<DashboardContext.Provider
3232
value={{
33-
buildInfo: MockBuildInfo,
3433
entitlements,
3534
experiments,
3635
appearance: {

0 commit comments

Comments
 (0)