import type { ExternalKnowledgeApiResponse } from '@dify/contracts/api/console/datasets/types.gen' import type { CreateExternalAPIReq } from '../declarations' import { AlertDialog, AlertDialogActions, AlertDialogCancelButton, AlertDialogConfirmButton, AlertDialogContent, AlertDialogDescription, AlertDialogTitle, } from '@langgenius/dify-ui/alert-dialog' import { RiDeleteBinLine, RiEditLine } from '@remixicon/react' import { useQueryClient } from '@tanstack/react-query' import * as React from 'react' import { useState } from 'react' import { useTranslation } from 'react-i18next' import ActionButton from '@/app/components/base/action-button' import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development' import { useModalContext } from '@/context/modal-context' import { consoleQuery } from '@/service/client' import { checkUsageExternalAPI, deleteExternalAPI, fetchExternalAPI, updateExternalAPI, } from '@/service/datasets' type ExternalKnowledgeAPICardProps = { api: ExternalKnowledgeApiResponse canManageExternalKnowledgeApi: boolean } const ExternalKnowledgeAPICard: React.FC = ({ api, canManageExternalKnowledgeApi, }) => { const { setShowExternalKnowledgeAPIModal } = useModalContext() const [showConfirm, setShowConfirm] = useState(false) const [isHovered, setIsHovered] = useState(false) const [usageCount, setUsageCount] = useState(0) const queryClient = useQueryClient() const externalKnowledgeApiQueryKey = consoleQuery.datasets.externalKnowledgeApi.get.queryOptions({ input: {}, }).queryKey const endpoint = api.settings && typeof api.settings.endpoint === 'string' ? api.settings.endpoint : '' const { t } = useTranslation() const handleEditClick = async () => { if (!canManageExternalKnowledgeApi) return try { const response = await fetchExternalAPI({ apiTemplateId: api.id }) const formValue: CreateExternalAPIReq = { name: response.name, settings: { endpoint: response.settings.endpoint, api_key: response.settings.api_key, }, } setShowExternalKnowledgeAPIModal({ payload: formValue, isEditMode: true, datasetBindings: response.dataset_bindings, onEditCallback: async (updatedData: CreateExternalAPIReq) => { try { await updateExternalAPI({ apiTemplateId: api.id, body: { ...response, name: updatedData.name, settings: { ...response.settings, endpoint: updatedData.settings.endpoint, api_key: updatedData.settings.api_key, }, }, }) await queryClient.invalidateQueries({ queryKey: externalKnowledgeApiQueryKey }) } catch (error) { console.error('Error updating external knowledge API:', error) } }, }) } catch (error) { console.error('Error fetching external knowledge API data:', error) } } const handleDeleteClick = async () => { if (!canManageExternalKnowledgeApi) return try { const usage = await checkUsageExternalAPI({ apiTemplateId: api.id }) if (usage.is_using) setUsageCount(usage.count) setShowConfirm(true) } catch (error) { console.error('Error checking external API usage:', error) } } const handleConfirmDelete = async () => { if (!canManageExternalKnowledgeApi) return try { const response = await deleteExternalAPI({ apiTemplateId: api.id }) if (response && response.result === 'success') { setShowConfirm(false) await queryClient.invalidateQueries({ queryKey: externalKnowledgeApiQueryKey }) } else { console.error('Failed to delete external API') } } catch (error) { console.error('Error deleting external knowledge API:', error) } } return ( <>
{api.name}
{endpoint}
{canManageExternalKnowledgeApi && (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} >
)}
!open && setShowConfirm(false)}>
{`${t(($) => $['deleteExternalAPIConfirmWarningContent.title.front'], { ns: 'dataset' })} ${api.name}${t(($) => $['deleteExternalAPIConfirmWarningContent.title.end'], { ns: 'dataset' })}`} {usageCount > 0 ? `${t(($) => $['deleteExternalAPIConfirmWarningContent.content.front'], { ns: 'dataset' })} ${usageCount} ${t(($) => $['deleteExternalAPIConfirmWarningContent.content.end'], { ns: 'dataset' })}` : t(($) => $['deleteExternalAPIConfirmWarningContent.noConnectionContent'], { ns: 'dataset', })}
{t(($) => $['operation.cancel'], { ns: 'common' })} {t(($) => $['operation.confirm'], { ns: 'common' })}
) } export default ExternalKnowledgeAPICard