'use client' import { useState, } from 'react' import { useTranslation } from 'react-i18next' import { RiDeleteBinLine } from '@remixicon/react' import { PlusIcon, XMarkIcon } from '@heroicons/react/20/solid' import SecretKeyGenerateModal from './secret-key-generate' import s from './style.module.css' import ActionButton from '@/app/components/base/action-button' import Modal from '@/app/components/base/modal' import Button from '@/app/components/base/button' import CopyFeedback from '@/app/components/base/copy-feedback' import { createApikey as createAppApikey, delApikey as delAppApikey, } from '@/service/apps' import { createApikey as createDatasetApikey, delApikey as delDatasetApikey, } from '@/service/datasets' import type { CreateApiKeyResponse } from '@/models/app' import Loading from '@/app/components/base/loading' import Confirm from '@/app/components/base/confirm' import useTimestamp from '@/hooks/use-timestamp' import { useAppContext } from '@/context/app-context' import { useAppApiKeys, useInvalidateAppApiKeys } from '@/service/use-apps' import { useDatasetApiKeys, useInvalidateDatasetApiKeys } from '@/service/knowledge/use-dataset' type ISecretKeyModalProps = { isShow: boolean appId?: string onClose: () => void } const SecretKeyModal = ({ isShow = false, appId, onClose, }: ISecretKeyModalProps) => { const { t } = useTranslation() const { formatTime } = useTimestamp() const { currentWorkspace, isCurrentWorkspaceManager, isCurrentWorkspaceEditor } = useAppContext() const [showConfirmDelete, setShowConfirmDelete] = useState(false) const [isVisible, setVisible] = useState(false) const [newKey, setNewKey] = useState(undefined) const invalidateAppApiKeys = useInvalidateAppApiKeys() const invalidateDatasetApiKeys = useInvalidateDatasetApiKeys() const { data: appApiKeys, isLoading: isAppApiKeysLoading } = useAppApiKeys(appId, { enabled: !!appId && isShow }) const { data: datasetApiKeys, isLoading: isDatasetApiKeysLoading } = useDatasetApiKeys({ enabled: !appId && isShow }) const apiKeysList = appId ? appApiKeys : datasetApiKeys const isApiKeysLoading = appId ? isAppApiKeysLoading : isDatasetApiKeysLoading const [delKeyID, setDelKeyId] = useState('') const onDel = async () => { setShowConfirmDelete(false) if (!delKeyID) return const delApikey = appId ? delAppApikey : delDatasetApikey const params = appId ? { url: `/apps/${appId}/api-keys/${delKeyID}`, params: {} } : { url: `/datasets/api-keys/${delKeyID}`, params: {} } await delApikey(params) if (appId) invalidateAppApiKeys(appId) else invalidateDatasetApiKeys() } const onCreate = async () => { const params = appId ? { url: `/apps/${appId}/api-keys`, body: {} } : { url: '/datasets/api-keys', body: {} } const createApikey = appId ? createAppApikey : createDatasetApikey const res = await createApikey(params) setVisible(true) setNewKey(res) if (appId) invalidateAppApiKeys(appId) else invalidateDatasetApiKeys() } const generateToken = (token: string) => { return `${token.slice(0, 3)}...${token.slice(-20)}` } return (

{t('appApi.apiKeyModal.apiSecretKeyTips')}

{isApiKeysLoading &&
} { !!apiKeysList?.data?.length && (
{t('appApi.apiKeyModal.secretKey')}
{t('appApi.apiKeyModal.created')}
{t('appApi.apiKeyModal.lastUsed')}
{apiKeysList.data.map(api => (
{generateToken(api.token)}
{formatTime(Number(api.created_at), t('appLog.dateTimeFormat') as string)}
{api.last_used_at ? formatTime(Number(api.last_used_at), t('appLog.dateTimeFormat') as string) : t('appApi.never')}
{isCurrentWorkspaceManager && ( { setDelKeyId(api.id) setShowConfirmDelete(true) }} > )}
))}
) }
setVisible(false)} newKey={newKey} /> {showConfirmDelete && ( { setDelKeyId('') setShowConfirmDelete(false) }} /> )}
) } export default SecretKeyModal