mirror of
https://github.com/outline/outline.git
synced 2026-06-13 11:25:03 +03:00
69e8aac4f1
* Move 'Api Keys' listing to filterable table * Add context menu Allow copying new keys
80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
import copy from "copy-to-clipboard";
|
|
import { CopyIcon, PlusIcon, TrashIcon } from "outline-icons";
|
|
import { toast } from "sonner";
|
|
import stores from "~/stores";
|
|
import env from "~/env";
|
|
import type ApiKey from "~/models/ApiKey";
|
|
import ApiKeyNew from "~/scenes/ApiKeyNew";
|
|
import ApiKeyRevokeDialog from "~/scenes/Settings/components/ApiKeyRevokeDialog";
|
|
import { createAction } from "..";
|
|
import { SettingsSection } from "../sections";
|
|
|
|
export const createApiKey = createAction({
|
|
name: ({ t }) => t("New API key"),
|
|
analyticsName: "New API key",
|
|
section: SettingsSection,
|
|
icon: <PlusIcon />,
|
|
keywords: "create",
|
|
visible: () =>
|
|
stores.policies.abilities(stores.auth.team?.id || "").createApiKey,
|
|
perform: ({ t, event }) => {
|
|
event?.preventDefault();
|
|
event?.stopPropagation();
|
|
|
|
stores.dialogs.openModal({
|
|
title: t("New API key"),
|
|
content: <ApiKeyNew onSubmit={stores.dialogs.closeAllModals} />,
|
|
});
|
|
},
|
|
});
|
|
|
|
export const copyApiKeyFactory = ({ apiKey }: { apiKey: ApiKey }) =>
|
|
createAction({
|
|
name: ({ t }) => t("Copy"),
|
|
analyticsName: "Copy API key",
|
|
section: SettingsSection,
|
|
icon: <CopyIcon />,
|
|
visible: () => !!apiKey.value,
|
|
perform: ({ t }) => {
|
|
copy(apiKey.value, {
|
|
debug: env.ENVIRONMENT !== "production",
|
|
format: "text/plain",
|
|
});
|
|
toast.success(t("API key copied"));
|
|
},
|
|
});
|
|
|
|
export const revokeApiKeyFactory = ({ apiKey }: { apiKey: ApiKey }) =>
|
|
createAction({
|
|
name: ({ t, isMenu }) =>
|
|
isMenu
|
|
? apiKey.isExpired
|
|
? t("Delete")
|
|
: `${t("Revoke")}…`
|
|
: t("Revoke API key"),
|
|
analyticsName: "Revoke API key",
|
|
section: SettingsSection,
|
|
icon: <TrashIcon />,
|
|
keywords: "revoke delete remove",
|
|
dangerous: true,
|
|
perform: async ({ t, event }) => {
|
|
event?.preventDefault();
|
|
event?.stopPropagation();
|
|
|
|
if (apiKey.isExpired) {
|
|
await apiKey.delete();
|
|
return;
|
|
}
|
|
|
|
stores.dialogs.openModal({
|
|
title: t("Revoke token"),
|
|
content: (
|
|
<ApiKeyRevokeDialog
|
|
onSubmit={stores.dialogs.closeAllModals}
|
|
apiKey={apiKey}
|
|
/>
|
|
),
|
|
});
|
|
},
|
|
});
|