+ Your New Personal Access Token
+
+
Token Name
Permissions
Expires
{tokens.map((t: PersonalAccessToken) => {
- return
;
+ return
;
})}
>
)}
diff --git a/components/dashboard/src/settings/TokenEntry.tsx b/components/dashboard/src/settings/TokenEntry.tsx
index 721c8b606aef96..2271ccf09287d1 100644
--- a/components/dashboard/src/settings/TokenEntry.tsx
+++ b/components/dashboard/src/settings/TokenEntry.tsx
@@ -5,47 +5,56 @@
*/
import { PersonalAccessToken } from "@gitpod/public-api/lib/gitpod/experimental/v1/tokens_pb";
+import { useState } from "react";
import { ContextMenuEntry } from "../components/ContextMenu";
import { ItemFieldContextMenu } from "../components/ItemsList";
+import { personalAccessTokensService } from "../service/public-api";
+import { ShowTokenModal } from "./PersonalAccessTokens";
+import { settingsPathPersonalAccessTokenEdit } from "./settings.routes";
-const menuEntries: ContextMenuEntry[] = [
- {
- title: "Edit",
- href: "",
- onClick: () => {},
- },
- {
- title: "Regenerate",
- href: "",
- onClick: () => {},
- },
- {
- title: "Delete",
- href: "",
- onClick: () => {},
- },
-];
+function TokenEntry(props: { token: PersonalAccessToken; onDelete: (tokenId: string) => void }) {
+ const [showDelModal, setShowDelModal] = useState
(false);
-function TokenEntry(t: { token: PersonalAccessToken }) {
- if (!t) {
- return <>>;
- }
+ const menuEntries: ContextMenuEntry[] = [
+ {
+ title: "Edit",
+ link: `${settingsPathPersonalAccessTokenEdit}/${props.token.id}`,
+ },
+ {
+ title: "Delete",
+ href: "",
+ customFontStyle: "text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-300",
+ onClick: () => {
+ setShowDelModal(true);
+ },
+ },
+ ];
+
+ const doDeletePAT = async () => {
+ try {
+ await personalAccessTokensService.deletePersonalAccessToken({ id: props.token.id });
+ setShowDelModal(false);
+ props.onDelete(props.token.id);
+ } catch (e) {
+ // TODO: show error
+ }
+ };
const getDate = () => {
- if (!t.token.expirationTime) {
+ if (!props.token.expirationTime) {
return "";
}
- const date = t.token.expirationTime?.toDate();
+ const date = props.token.expirationTime?.toDate();
return date.toDateString();
};
const defaultAllScope = ["function:*", "resource:default"];
const getScopes = () => {
- if (!t.token.scopes) {
+ if (!props.token.scopes) {
return "";
}
- if (t.token.scopes.every((v) => defaultAllScope.includes(v))) {
+ if (props.token.scopes.every((v) => defaultAllScope.includes(v))) {
return "Access the user's API";
} else {
return "No access";
@@ -56,7 +65,7 @@ function TokenEntry(t: { token: PersonalAccessToken }) {
<>
- {t.token.name || ""}
+ {props.token.name || ""}
{getScopes()}
@@ -68,6 +77,19 @@ function TokenEntry(t: { token: PersonalAccessToken }) {
+ {showDelModal && (
+ {
+ setShowDelModal(false);
+ }}
+ />
+ )}
>
);
}
diff --git a/components/dashboard/src/settings/settings-menu.ts b/components/dashboard/src/settings/settings-menu.ts
index 9ba76643c194a7..2666d920079dd4 100644
--- a/components/dashboard/src/settings/settings-menu.ts
+++ b/components/dashboard/src/settings/settings-menu.ts
@@ -18,6 +18,7 @@ import {
settingsPathSSHKeys,
settingsPathPersonalAccessTokens,
settingsPathPersonalAccessTokenCreate,
+ settingsPathPersonalAccessTokenEdit,
} from "./settings.routes";
export default function getSettingsMenu(params: {
@@ -38,7 +39,11 @@ export default function getSettingsMenu(params: {
? [
{
title: "Access Tokens",
- link: [settingsPathPersonalAccessTokens, settingsPathPersonalAccessTokenCreate],
+ link: [
+ settingsPathPersonalAccessTokens,
+ settingsPathPersonalAccessTokenCreate,
+ settingsPathPersonalAccessTokenEdit,
+ ],
},
]
: []),
diff --git a/components/dashboard/src/settings/settings.routes.ts b/components/dashboard/src/settings/settings.routes.ts
index f3e121c1536578..414fc65999db27 100644
--- a/components/dashboard/src/settings/settings.routes.ts
+++ b/components/dashboard/src/settings/settings.routes.ts
@@ -21,5 +21,6 @@ export const settingsPathTeamsNew = [settingsPathTeams, "new"].join("/");
export const settingsPathVariables = "/variables";
export const settingsPathPersonalAccessTokens = "/personal-tokens";
export const settingsPathPersonalAccessTokenCreate = "/personal-tokens/create";
+export const settingsPathPersonalAccessTokenEdit = "/personal-tokens/edit";
export const settingsPathSSHKeys = "/keys";