From 9605fafe54fd0f72b820b48435c867533fb9aea4 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Sat, 11 Mar 2023 12:42:04 +0100 Subject: [PATCH] feat(api-key): Add delete functionality --- public/locales/en-US/common.json | 3 +- public/locales/en-US/settings-api-keys.json | 7 ++++ src/apis/delete-api-key.ts | 3 +- src/components/widgets/DeleteAPIButton.tsx | 35 +++++++++++++------ .../SettingsAPIKeysRoute/APIKeyListItem.tsx | 32 ++++++++++++++--- 5 files changed, 62 insertions(+), 18 deletions(-) diff --git a/public/locales/en-US/common.json b/public/locales/en-US/common.json index 3fb6c83..74f89d5 100644 --- a/public/locales/en-US/common.json +++ b/public/locales/en-US/common.json @@ -61,7 +61,8 @@ "deleted": "Report has been deleted!" }, "apiKey": { - "keyCopied": "API key has been copied to your clipboard!" + "keyCopied": "API key has been copied to your clipboard!", + "deleted": "API key has been deleted!" } }, "general": { diff --git a/public/locales/en-US/settings-api-keys.json b/public/locales/en-US/settings-api-keys.json index e2e5623..e909f35 100644 --- a/public/locales/en-US/settings-api-keys.json +++ b/public/locales/en-US/settings-api-keys.json @@ -31,5 +31,12 @@ "emptyState": { "title": "Welcome to your API Keys", "description": "Create an API Key to get started with the API." + }, + "actions": { + "delete": { + "label": "Delete API Key", + "description": "Are you sure you want to delete this API Key? Your existing integrations using this API Key will stop working. You can create a new API Key to replace it.", + "continueActionLabel": "Delete API Key" + } } } diff --git a/src/apis/delete-api-key.ts b/src/apis/delete-api-key.ts index bc2ba38..9280592 100644 --- a/src/apis/delete-api-key.ts +++ b/src/apis/delete-api-key.ts @@ -1,6 +1,7 @@ import {client} from "~/constants/axios-client" +import {SimpleDetailResponse} from "~/server-types" -export default async function deleteApiKey(id: string): Promise { +export default async function deleteAPIKey(id: string): Promise { const {data} = await client.delete(`${import.meta.env.VITE_SERVER_BASE_URL}/v1/api-key/${id}`, { withCredentials: true, }) diff --git a/src/components/widgets/DeleteAPIButton.tsx b/src/components/widgets/DeleteAPIButton.tsx index 5a8e30b..e6da96c 100644 --- a/src/components/widgets/DeleteAPIButton.tsx +++ b/src/components/widgets/DeleteAPIButton.tsx @@ -25,6 +25,8 @@ export interface DeleteAPIButtonProps { description?: string successMessage?: string navigateTo?: string + children?: (onDelete: () => void) => ReactElement + onDone?: () => void } export default function DeleteAPIButton({ @@ -33,7 +35,9 @@ export default function DeleteAPIButton({ label, continueLabel, description, - navigateTo = "/aliases", + navigateTo, + onDone, + children: render, }: DeleteAPIButtonProps): ReactElement { const {t} = useTranslation("common") const {showError, showSuccess} = useErrorSuccessSnacks() @@ -43,7 +47,12 @@ export default function DeleteAPIButton({ onError: showError, onSuccess: () => { showSuccess(successMessage || t("messages.deletedObject")) - navigate(navigateTo) + + if (navigateTo) { + navigate(navigateTo) + } else if (onDone) { + onDone() + } }, }) @@ -51,15 +60,19 @@ export default function DeleteAPIButton({ return ( <> - + {render ? ( + render(() => setShowDeleteDialog(true)) + ) : ( + + )} setShowDeleteDialog(false)}> {label} diff --git a/src/route-widgets/SettingsAPIKeysRoute/APIKeyListItem.tsx b/src/route-widgets/SettingsAPIKeysRoute/APIKeyListItem.tsx index c410a51..760346a 100644 --- a/src/route-widgets/SettingsAPIKeysRoute/APIKeyListItem.tsx +++ b/src/route-widgets/SettingsAPIKeysRoute/APIKeyListItem.tsx @@ -4,14 +4,21 @@ import {Alert, IconButton, ListItem, ListItemSecondaryAction, ListItemText} from import {useTranslation} from "react-i18next" import {MdContentCopy, MdDelete} from "react-icons/md" import {useCopyToClipboard} from "react-use" -import {ErrorSnack, SuccessSnack} from "~/components" +import {DeleteButton, ErrorSnack, SuccessSnack} from "~/components" +import {deleteAPIKey} from "~/apis" +import {queryClient} from "~/constants/react-query" export interface APIKeyListItemProps { apiKey: APIKey + queryKey: readonly string[] privateKey?: string } -export default function APIKeyListItem({apiKey, privateKey}: APIKeyListItemProps): ReactElement { +export default function APIKeyListItem({ + queryKey, + apiKey, + privateKey, +}: APIKeyListItemProps): ReactElement { const {t} = useTranslation(["settings-api-keys", "common"]) const [{value, error}, copy] = useCopyToClipboard() @@ -43,9 +50,24 @@ export default function APIKeyListItem({apiKey, privateKey}: APIKeyListItemProps <> - - - + deleteAPIKey(apiKey.id)} + onDone={() => + queryClient.invalidateQueries({ + queryKey, + }) + } + label={t("actions.delete.label")} + description={t("actions.delete.description")} + continueLabel={t("actions.delete.continueActionLabel")} + successMessage={t("messages.apiKey.deleted", {ns: "common"})} + > + {onDelete => ( + + + + )} +