'use client' import type { CreateApiKeyResponse } from '@/models/app' import { AlertDialog, AlertDialogActions, AlertDialogCancelButton, AlertDialogConfirmButton, AlertDialogContent, AlertDialogDescription, AlertDialogTitle, } from '@langgenius/dify-ui/alert-dialog' import { Button } from '@langgenius/dify-ui/button' import { cn } from '@langgenius/dify-ui/cn' import { Dialog, DialogContent, DialogTitle } from '@langgenius/dify-ui/dialog' import { useAtomValue } from 'jotai' import { useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import CopyFeedback from '@/app/components/base/copy-feedback' import Loading from '@/app/components/base/loading' import { currentWorkspaceAtom } from '@/context/workspace-state' import useTimestamp from '@/hooks/use-timestamp' import { createApikey as createAppApikey, delApikey as delAppApikey } from '@/service/apps' import { createApikey as createDatasetApikey, delApikey as delDatasetApikey, } from '@/service/datasets' import { useDatasetApiKeys, useInvalidateDatasetApiKeys } from '@/service/knowledge/use-dataset' import { useAppApiKeys, useInvalidateAppApiKeys } from '@/service/use-apps' import SecretKeyGenerateModal from './secret-key-generate' import s from './style.module.css' type ISecretKeyModalProps = { isShow: boolean appId?: string canManage: boolean onClose: () => void } const SecretKeyModal = ({ isShow = false, appId, canManage, onClose }: ISecretKeyModalProps) => { const { t } = useTranslation() const { formatTime } = useTimestamp() const currentWorkspace = useAtomValue(currentWorkspaceAtom) const [showConfirmDelete, setShowConfirmDelete] = useState(false) const [isVisible, setIsVisible] = 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 (!canManage) return 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 () => { if (!currentWorkspace.id || !canManage) return const params = appId ? { url: `/apps/${appId}/api-keys`, body: {} } : { url: '/datasets/api-keys', body: {} } const createApikey = appId ? createAppApikey : createDatasetApikey const res = await createApikey(params) setIsVisible(true) setNewKey(res) if (appId) invalidateAppApiKeys(appId) else invalidateDatasetApiKeys() } const generateToken = (token: string) => { return `${token.slice(0, 3)}...${token.slice(-20)}` } const handleDeleteConfirmOpenChange = (open: boolean) => { if (open) return setDelKeyId('') setShowConfirmDelete(false) } const handleClose = () => { setIsVisible(false) onClose() } return ( <> { if (!open) handleClose() }} > {`${t(($) => $['apiKeyModal.apiSecretKey'], { ns: 'appApi' })}`}

{t(($) => $['apiKeyModal.apiSecretKeyTips'], { ns: 'appApi' })}

{isApiKeysLoading && (
)} {!!apiKeysList?.data?.length && (
{t(($) => $['apiKeyModal.secretKey'], { ns: 'appApi' })}
{t(($) => $['apiKeyModal.created'], { ns: 'appApi' })}
{t(($) => $['apiKeyModal.lastUsed'], { ns: 'appApi' })}
{apiKeysList.data.map((api) => (
{generateToken(api.token)}
{formatTime( Number(api.created_at), t(($) => $.dateTimeFormat, { ns: 'appLog' }) as string, )}
{api.last_used_at ? formatTime( Number(api.last_used_at), t(($) => $.dateTimeFormat, { ns: 'appLog' }) as string, ) : t(($) => $.never, { ns: 'appApi' })}
{canManage && ( { setDelKeyId(api.id) setShowConfirmDelete(true) }} > )}
))}
)}
{t(($) => $['actionMsg.deleteConfirmTitle'], { ns: 'appApi' })} {t(($) => $['actionMsg.deleteConfirmTips'], { ns: 'appApi' })}
{t(($) => $['operation.cancel'], { ns: 'common' })} {t(($) => $['operation.confirm'], { ns: 'common' })}
{isShow && ( setIsVisible(false)} newKey={newKey} /> )} ) } export default SecretKeyModal