mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
refactor: improve apps.ts readbility (#17741)
Apply PR comments from https://github.com/coder/coder/pull/17724
This commit is contained in:
8
site/migrate-icons.md
Normal file
8
site/migrate-icons.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
Look for all the @mui/icons-material icons below and replace them accordinlying with the Lucide icon:
|
||||||
|
|
||||||
|
MUI | Lucide
|
||||||
|
TaskAlt | CircleCheckBigIcon
|
||||||
|
InfoOutlined | InfoIcon
|
||||||
|
ErrorOutline | CircleAlertIcon
|
||||||
|
|
||||||
|
You should update the imports and usage.
|
@ -83,17 +83,11 @@ export const getAppHref = (
|
|||||||
: app.url;
|
: app.url;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The backend redirects if the trailing slash isn't included, so we add it
|
|
||||||
// here to avoid extra roundtrips.
|
|
||||||
let href = `${path}/@${workspace.owner_name}/${workspace.name}.${
|
|
||||||
agent.name
|
|
||||||
}/apps/${encodeURIComponent(app.slug)}/`;
|
|
||||||
|
|
||||||
if (app.command) {
|
if (app.command) {
|
||||||
// Terminal links are relative. The terminal page knows how
|
// Terminal links are relative. The terminal page knows how
|
||||||
// to select the correct workspace proxy for the websocket
|
// to select the correct workspace proxy for the websocket
|
||||||
// connection.
|
// connection.
|
||||||
href = `/@${workspace.owner_name}/${workspace.name}.${
|
return `/@${workspace.owner_name}/${workspace.name}.${
|
||||||
agent.name
|
agent.name
|
||||||
}/terminal?command=${encodeURIComponent(app.command)}`;
|
}/terminal?command=${encodeURIComponent(app.command)}`;
|
||||||
}
|
}
|
||||||
@ -102,23 +96,14 @@ export const getAppHref = (
|
|||||||
const baseUrl = `${window.location.protocol}//${host.replace(/\*/g, app.subdomain_name)}`;
|
const baseUrl = `${window.location.protocol}//${host.replace(/\*/g, app.subdomain_name)}`;
|
||||||
const url = new URL(baseUrl);
|
const url = new URL(baseUrl);
|
||||||
url.pathname = "/";
|
url.pathname = "/";
|
||||||
href = url.toString();
|
return url.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
return href;
|
// The backend redirects if the trailing slash isn't included, so we add it
|
||||||
};
|
// here to avoid extra roundtrips.
|
||||||
|
return `${path}/@${workspace.owner_name}/${workspace.name}.${
|
||||||
export const needsSessionToken = (app: WorkspaceApp) => {
|
agent.name
|
||||||
if (!isExternalApp(app)) {
|
}/apps/${encodeURIComponent(app.slug)}/`;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// HTTP links should never need the session token, since Cookies
|
|
||||||
// handle sharing it when you access the Coder Dashboard. We should
|
|
||||||
// never be forwarding the bare session token to other domains!
|
|
||||||
const isHttp = app.url.startsWith("http");
|
|
||||||
const requiresSessionToken = app.url.includes(SESSION_TOKEN_PLACEHOLDER);
|
|
||||||
return requiresSessionToken && !isHttp;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
type ExternalWorkspaceApp = WorkspaceApp & {
|
type ExternalWorkspaceApp = WorkspaceApp & {
|
||||||
@ -131,3 +116,12 @@ export const isExternalApp = (
|
|||||||
): app is ExternalWorkspaceApp => {
|
): app is ExternalWorkspaceApp => {
|
||||||
return app.external && app.url !== undefined;
|
return app.external && app.url !== undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const needsSessionToken = (app: ExternalWorkspaceApp) => {
|
||||||
|
// HTTP links should never need the session token, since Cookies
|
||||||
|
// handle sharing it when you access the Coder Dashboard. We should
|
||||||
|
// never be forwarding the bare session token to other domains!
|
||||||
|
const isHttp = app.url.startsWith("http");
|
||||||
|
const requiresSessionToken = app.url.includes(SESSION_TOKEN_PLACEHOLDER);
|
||||||
|
return requiresSessionToken && !isHttp;
|
||||||
|
};
|
||||||
|
@ -34,7 +34,7 @@ export const useAppLink = (
|
|||||||
const href = getAppHref(app, {
|
const href = getAppHref(app, {
|
||||||
agent,
|
agent,
|
||||||
workspace,
|
workspace,
|
||||||
token: apiKeyResponse?.key ?? "",
|
token: apiKeyResponse?.key,
|
||||||
path: proxy.preferredPathAppURL,
|
path: proxy.preferredPathAppURL,
|
||||||
host: proxy.preferredWildcardHostname,
|
host: proxy.preferredWildcardHostname,
|
||||||
});
|
});
|
||||||
|
@ -9,7 +9,7 @@ import {
|
|||||||
TooltipTrigger,
|
TooltipTrigger,
|
||||||
} from "components/Tooltip/Tooltip";
|
} from "components/Tooltip/Tooltip";
|
||||||
import { useProxy } from "contexts/ProxyContext";
|
import { useProxy } from "contexts/ProxyContext";
|
||||||
import { needsSessionToken } from "modules/apps/apps";
|
import { isExternalApp, needsSessionToken } from "modules/apps/apps";
|
||||||
import { useAppLink } from "modules/apps/useAppLink";
|
import { useAppLink } from "modules/apps/useAppLink";
|
||||||
import { type FC, useState } from "react";
|
import { type FC, useState } from "react";
|
||||||
import { AgentButton } from "../AgentButton";
|
import { AgentButton } from "../AgentButton";
|
||||||
@ -65,7 +65,7 @@ export const AppLink: FC<AppLinkProps> = ({ app, workspace, agent }) => {
|
|||||||
"Your admin has not configured subdomain application access";
|
"Your admin has not configured subdomain application access";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (needsSessionToken(app) && !link.hasToken) {
|
if (isExternalApp(app) && needsSessionToken(app) && !link.hasToken) {
|
||||||
canClick = false;
|
canClick = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user