Skip to content

Commit 1ec2700

Browse files
committed
Merge branch 'main' into for-sure
2 parents aad7a9d + 726a4da commit 1ec2700

File tree

11 files changed

+60
-30
lines changed

11 files changed

+60
-30
lines changed

site/src/components/Resources/AppLink/AppLink.tsx

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import { makeStyles } from "@mui/styles";
44
import Tooltip from "@mui/material/Tooltip";
55
import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
66
import { PrimaryAgentButton } from "components/Resources/AgentButton";
7-
import { FC } from "react";
7+
import { FC, useState } from "react";
88
import { combineClasses } from "utils/combineClasses";
99
import * as TypesGen from "../../../api/typesGenerated";
1010
import { generateRandomString } from "../../../utils/random";
1111
import { BaseIcon } from "./BaseIcon";
1212
import { ShareIcon } from "./ShareIcon";
1313
import { useProxy } from "contexts/ProxyContext";
1414
import { createAppLinkHref } from "utils/apps";
15+
import { getApiKey } from "api/api";
1516

1617
const Language = {
1718
appTitle: (appName: string, identifier: string): string =>
@@ -28,6 +29,7 @@ export const AppLink: FC<AppLinkProps> = ({ app, workspace, agent }) => {
2829
const { proxy } = useProxy();
2930
const preferredPathBase = proxy.preferredPathAppURL;
3031
const appsHost = proxy.preferredWildcardHostname;
32+
const [fetchingSessionToken, setFetchingSessionToken] = useState(false);
3133

3234
const styles = useStyles();
3335
const username = workspace.owner_name;
@@ -72,6 +74,9 @@ export const AppLink: FC<AppLinkProps> = ({ app, workspace, agent }) => {
7274
primaryTooltip =
7375
"Your admin has not configured subdomain application access";
7476
}
77+
if (fetchingSessionToken) {
78+
canClick = false;
79+
}
7580

7681
const isPrivateApp = app.sharing_level === "owner";
7782

@@ -96,13 +101,38 @@ export const AppLink: FC<AppLinkProps> = ({ app, workspace, agent }) => {
96101
className={canClick ? styles.link : styles.disabledLink}
97102
onClick={
98103
canClick
99-
? (event) => {
104+
? async (event) => {
100105
event.preventDefault();
101-
window.open(
102-
href,
103-
Language.appTitle(appDisplayName, generateRandomString(12)),
104-
"width=900,height=600",
105-
);
106+
// This is an external URI like "vscode://", so
107+
// it needs to be opened with the browser protocol handler.
108+
if (app.external && !app.url.startsWith("http")) {
109+
// If the protocol is external the browser does not
110+
// redirect the user from the page.
111+
112+
// This is a magic undocumented string that is replaced
113+
// with a brand-new session token from the backend.
114+
// This only exists for external URLs, and should only
115+
// be used internally, and is highly subject to break.
116+
const magicTokenString = "$SESSION_TOKEN";
117+
const hasMagicToken = href.indexOf(magicTokenString);
118+
let url = href;
119+
if (hasMagicToken !== -1) {
120+
setFetchingSessionToken(true);
121+
const key = await getApiKey();
122+
url = href.replaceAll(magicTokenString, key.key);
123+
setFetchingSessionToken(false);
124+
}
125+
window.location.href = url;
126+
} else {
127+
window.open(
128+
href,
129+
Language.appTitle(
130+
appDisplayName,
131+
generateRandomString(12),
132+
),
133+
"width=900,height=600",
134+
);
135+
}
106136
}
107137
: undefined
108138
}

site/src/components/WorkspaceDeletion/ImpendingDeletionStat.tsx renamed to site/src/components/WorkspaceDeletion/DormantDeletionStat.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import Link from "@mui/material/Link";
33
import { Link as RouterLink } from "react-router-dom";
44
import styled from "@emotion/styled";
55
import { Workspace } from "api/typesGenerated";
6-
import { displayImpendingDeletion } from "./utils";
6+
import { displayDormantDeletion } from "./utils";
77
import { useDashboard } from "components/Dashboard/DashboardProvider";
88
import { type FC } from "react";
99

10-
interface ImpendingDeletionStatProps {
10+
interface DormantDeletionStatProps {
1111
workspace: Workspace;
1212
}
1313

14-
export const ImpendingDeletionStat: FC<ImpendingDeletionStatProps> = ({
14+
export const DormantDeletionStat: FC<DormantDeletionStatProps> = ({
1515
workspace,
1616
}) => {
1717
const { entitlements, experiments } = useDashboard();
@@ -22,7 +22,7 @@ export const ImpendingDeletionStat: FC<ImpendingDeletionStatProps> = ({
2222
const allowWorkspaceActions = experiments.includes("workspace_actions");
2323

2424
if (
25-
!displayImpendingDeletion(
25+
!displayDormantDeletion(
2626
workspace,
2727
allowAdvancedScheduling,
2828
allowWorkspaceActions,
@@ -42,7 +42,7 @@ export const ImpendingDeletionStat: FC<ImpendingDeletionStatProps> = ({
4242
title="Schedule settings"
4343
>
4444
{/* We check for string existence in the conditional */}
45-
{new Date(workspace.deleting_at as string).toLocaleString()}
45+
{new Date(workspace.deleting_at!).toLocaleString()}
4646
</Link>
4747
}
4848
/>

site/src/components/WorkspaceDeletion/ImpendingDeletionText.tsx renamed to site/src/components/WorkspaceDeletion/DormantDeletionText.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Workspace } from "api/typesGenerated";
2-
import { displayImpendingDeletion } from "./utils";
2+
import { displayDormantDeletion } from "./utils";
33
import { useDashboard } from "components/Dashboard/DashboardProvider";
44
import styled from "@emotion/styled";
55
import { Theme as MaterialUITheme } from "@mui/material/styles";
66

7-
export const ImpendingDeletionText = ({
7+
export const DormantDeletionText = ({
88
workspace,
99
}: {
1010
workspace: Workspace;
@@ -17,7 +17,7 @@ export const ImpendingDeletionText = ({
1717
const allowWorkspaceActions = experiments.includes("workspace_actions");
1818

1919
if (
20-
!displayImpendingDeletion(
20+
!displayDormantDeletion(
2121
workspace,
2222
allowAdvancedScheduling,
2323
allowWorkspaceActions,
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export * from "./ImpendingDeletionStat";
2-
export * from "./ImpendingDeletionText";
3-
export * from "./ImpendingDeletionBanner";
1+
export * from "./DormantDeletionStat";
2+
export * from "./DormantDeletionText";
3+
export * from "./DormantWorkspaceBanner";

site/src/components/WorkspaceDeletion/utils.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import * as TypesGen from "api/typesGenerated";
22
import * as Mocks from "testHelpers/entities";
3-
import { displayImpendingDeletion } from "./utils";
3+
import { displayDormantDeletion } from "./utils";
44

5-
describe("displayImpendingDeletion", () => {
5+
describe("displayDormantDeletion", () => {
66
const today = new Date();
77
it.each<[string, boolean, boolean, boolean]>([
88
[
@@ -45,7 +45,7 @@ describe("displayImpendingDeletion", () => {
4545
deleting_at,
4646
};
4747
expect(
48-
displayImpendingDeletion(
48+
displayDormantDeletion(
4949
workspace,
5050
allowAdvancedScheduling,
5151
allowWorkspaceActions,

site/src/components/WorkspaceDeletion/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const IMPENDING_DELETION_DISPLAY_THRESHOLD = 14; // 14 days
1111
* @param {TypesGen.Workspace} workspace
1212
* @returns {boolean}
1313
*/
14-
export const displayImpendingDeletion = (
14+
export const displayDormantDeletion = (
1515
workspace: Workspace,
1616
allowAdvancedScheduling: boolean,
1717
allowWorkspaceActions: boolean,

site/src/components/WorkspaceStatusBadge/WorkspaceStatusBadge.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { FC, PropsWithChildren } from "react";
44
import { makeStyles } from "@mui/styles";
55
import { combineClasses } from "utils/combineClasses";
66
import { ChooseOne, Cond } from "components/Conditionals/ChooseOne";
7-
import { ImpendingDeletionText } from "components/WorkspaceDeletion";
7+
import { DormantDeletionText } from "components/WorkspaceDeletion";
88
import { getDisplayWorkspaceStatus } from "utils/workspace";
99
import Tooltip, { TooltipProps, tooltipClasses } from "@mui/material/Tooltip";
1010
import { styled } from "@mui/material/styles";
@@ -63,9 +63,9 @@ export const WorkspaceStatusText: FC<
6363

6464
return (
6565
<ChooseOne>
66-
{/* <ImpendingDeletionText/> determines its own visibility */}
67-
<Cond condition={Boolean(ImpendingDeletionText({ workspace }))}>
68-
<ImpendingDeletionText workspace={workspace} />
66+
{/* <DormantDeletionText/> determines its own visibility */}
67+
<Cond condition={Boolean(DormantDeletionText({ workspace }))}>
68+
<DormantDeletionText workspace={workspace} />
6969
</Cond>
7070
<Cond>
7171
<span

site/src/pages/WorkspacePage/Workspace.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
264264
/>
265265
</Cond>
266266
<Cond>
267-
{/* <ImpendingDeletionBanner/> determines its own visibility */}
267+
{/* <DormantWorkspaceBanner/> determines its own visibility */}
268268
<DormantWorkspaceBanner
269269
workspaces={[workspace]}
270270
shouldRedisplayBanner={

site/src/pages/WorkspacePage/WorkspaceStats.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Popover from "@mui/material/Popover";
2020
import TextField from "@mui/material/TextField";
2121
import Button from "@mui/material/Button";
2222
import { WorkspaceStatusText } from "components/WorkspaceStatusBadge/WorkspaceStatusBadge";
23-
import { ImpendingDeletionStat } from "components/WorkspaceDeletion";
23+
import { DormantDeletionStat } from "components/WorkspaceDeletion";
2424

2525
const Language = {
2626
workspaceDetails: "Workspace Details",
@@ -75,7 +75,7 @@ export const WorkspaceStats: FC<WorkspaceStatsProps> = ({
7575
label="Status"
7676
value={<WorkspaceStatusText workspace={workspace} />}
7777
/>
78-
<ImpendingDeletionStat workspace={workspace} />
78+
<DormantDeletionStat workspace={workspace} />
7979
<StatsItem
8080
className={styles.statsItem}
8181
label={Language.templateLabel}

site/src/pages/WorkspacesPage/WorkspacesPageView.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export const WorkspacesPageView: FC<
9999
{hasError(error) && !isApiValidationError(error) && (
100100
<ErrorAlert error={error} />
101101
)}
102-
{/* <ImpendingDeletionBanner/> determines its own visibility */}
102+
{/* <DormantWorkspaceBanner/> determines its own visibility */}
103103
<DormantWorkspaceBanner
104104
workspaces={dormantWorkspaces}
105105
shouldRedisplayBanner={hasDormantWorkspace}

0 commit comments

Comments
 (0)