Spaces:
Build error
Build error
| import React, { useState } from "react"; | |
| import { useTranslation } from "react-i18next"; | |
| import { I18nKey } from "#/i18n/declaration"; | |
| import { BrandButton } from "#/components/features/settings/brand-button"; | |
| import { SettingsInput } from "#/components/features/settings/settings-input"; | |
| import { LoadingSpinner } from "#/components/shared/loading-spinner"; | |
| import { CreateApiKeyResponse } from "#/api/api-keys"; | |
| import { | |
| displayErrorToast, | |
| displaySuccessToast, | |
| } from "#/utils/custom-toast-handlers"; | |
| import { ApiKeyModalBase } from "./api-key-modal-base"; | |
| import { useCreateApiKey } from "#/hooks/mutation/use-create-api-key"; | |
| interface CreateApiKeyModalProps { | |
| isOpen: boolean; | |
| onClose: () => void; | |
| onKeyCreated: (newKey: CreateApiKeyResponse) => void; | |
| } | |
| export function CreateApiKeyModal({ | |
| isOpen, | |
| onClose, | |
| onKeyCreated, | |
| }: CreateApiKeyModalProps) { | |
| const { t } = useTranslation(); | |
| const [newKeyName, setNewKeyName] = useState(""); | |
| const createApiKeyMutation = useCreateApiKey(); | |
| const handleCreateKey = async () => { | |
| if (!newKeyName.trim()) { | |
| displayErrorToast(t(I18nKey.ERROR$REQUIRED_FIELD)); | |
| return; | |
| } | |
| try { | |
| const newKey = await createApiKeyMutation.mutateAsync(newKeyName); | |
| onKeyCreated(newKey); | |
| displaySuccessToast(t(I18nKey.SETTINGS$API_KEY_CREATED)); | |
| setNewKeyName(""); | |
| } catch (error) { | |
| displayErrorToast(t(I18nKey.ERROR$GENERIC)); | |
| } | |
| }; | |
| const handleCancel = () => { | |
| setNewKeyName(""); | |
| onClose(); | |
| }; | |
| const modalFooter = ( | |
| <> | |
| <BrandButton | |
| type="button" | |
| variant="primary" | |
| className="grow" | |
| onClick={handleCreateKey} | |
| isDisabled={createApiKeyMutation.isPending || !newKeyName.trim()} | |
| > | |
| {createApiKeyMutation.isPending ? ( | |
| <LoadingSpinner size="small" /> | |
| ) : ( | |
| t(I18nKey.BUTTON$CREATE) | |
| )} | |
| </BrandButton> | |
| <BrandButton | |
| type="button" | |
| variant="secondary" | |
| className="grow" | |
| onClick={handleCancel} | |
| isDisabled={createApiKeyMutation.isPending} | |
| > | |
| {t(I18nKey.BUTTON$CANCEL)} | |
| </BrandButton> | |
| </> | |
| ); | |
| return ( | |
| <ApiKeyModalBase | |
| isOpen={isOpen} | |
| title={t(I18nKey.SETTINGS$CREATE_API_KEY)} | |
| footer={modalFooter} | |
| > | |
| <div data-testid="create-api-key-modal"> | |
| <p className="text-sm text-gray-300"> | |
| {t(I18nKey.SETTINGS$CREATE_API_KEY_DESCRIPTION)} | |
| </p> | |
| <SettingsInput | |
| testId="api-key-name-input" | |
| label={t(I18nKey.SETTINGS$NAME)} | |
| placeholder={t(I18nKey.SETTINGS$API_KEY_NAME_PLACEHOLDER)} | |
| value={newKeyName} | |
| onChange={(value) => setNewKeyName(value)} | |
| className="w-full mt-4" | |
| type="text" | |
| /> | |
| </div> | |
| </ApiKeyModalBase> | |
| ); | |
| } | |