import { zodResolver } from "@hookform/resolvers/zod" import { Button, Heading, Input, Prompt, Text, toast } from "@medusajs/ui" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import * as zod from "zod" import { Eye, EyeSlash } from "@medusajs/icons" import { AdminApiKeyResponse } from "@medusajs/types" import { Fragment, useState } from "react" import { Form } from "../../../../../components/common/form" import { RouteFocusModal, useRouteModal, } from "../../../../../components/modals" import { KeyboundForm } from "../../../../../components/utilities/keybound-form" import { useCreateApiKey } from "../../../../../hooks/api/api-keys" import { ApiKeyType } from "../../../common/constants" const ApiKeyCreateSchema = zod.object({ title: zod.string().min(1), }) type ApiKeyCreateFormProps = { keyType: ApiKeyType } function getRedactedKey(key?: string) { if (!key) { return "" } // Replace all characters except the first four and last two with bullets const firstThree = key.slice(0, 4) const lastTwo = key.slice(-2) return `${firstThree}${"•".repeat(key.length - 6)}${lastTwo}` } export const ApiKeyCreateForm = ({ keyType }: ApiKeyCreateFormProps) => { const [createdKey, setCreatedKey] = useState< AdminApiKeyResponse["api_key"] | null >(null) const [showRedactedKey, setShowRedactedKey] = useState(true) const { t } = useTranslation() const { handleSuccess } = useRouteModal() const form = useForm>({ defaultValues: { title: "", }, resolver: zodResolver(ApiKeyCreateSchema), }) const { mutateAsync, isPending } = useCreateApiKey() const handleSubmit = form.handleSubmit(async (values) => { await mutateAsync( // @ts-ignore { title: values.title, type: keyType }, { onSuccess: ({ api_key }) => { toast.success(t("apiKeyManagement.create.successToast")) switch (keyType) { case ApiKeyType.PUBLISHABLE: handleSuccess(`/settings/publishable-api-keys/${api_key.id}`) break case ApiKeyType.SECRET: setCreatedKey(api_key) break } }, onError: (err) => { toast.error(err.message) }, } ) }) const handleCopyToken = () => { if (!createdKey) { toast.error(t("apiKeyManagement.create.copySecretTokenFailure")) } navigator.clipboard.writeText(createdKey?.token ?? "") toast.success(t("apiKeyManagement.create.copySecretTokenSuccess")) } const handleGoToSecretKey = () => { if (!createdKey) { return } handleSuccess(`/settings/secret-api-keys/${createdKey.id}`) } return (
{keyType === ApiKeyType.PUBLISHABLE ? t("apiKeyManagement.create.createPublishableHeader") : t("apiKeyManagement.create.createSecretHeader")} {keyType === ApiKeyType.PUBLISHABLE ? t("apiKeyManagement.create.createPublishableHint") : t("apiKeyManagement.create.createSecretHint")}
{ return ( {t("fields.title")} ) }} />
{t("apiKeyManagement.create.secretKeyCreatedHeader")} {t("apiKeyManagement.create.secretKeyCreatedHint")}
{showRedactedKey ? getRedactedKey(createdKey?.token) : createdKey?.token}
{t("actions.continue")}
) }