123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- import React, { useState } from 'react'
- import { useTranslation } from 'react-i18next'
- import {
- RiDeleteBinLine,
- RiEditLine,
- } from '@remixicon/react'
- import type { CreateExternalAPIReq } from '../declarations'
- import type { ExternalAPIItem } from '@/models/datasets'
- import { checkUsageExternalAPI, deleteExternalAPI, fetchExternalAPI, updateExternalAPI } from '@/service/datasets'
- import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development'
- import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context'
- import { useModalContext } from '@/context/modal-context'
- import ActionButton from '@/app/components/base/action-button'
- import Confirm from '@/app/components/base/confirm'
- type ExternalKnowledgeAPICardProps = {
- api: ExternalAPIItem
- }
- const ExternalKnowledgeAPICard: React.FC<ExternalKnowledgeAPICardProps> = ({ api }) => {
- const { setShowExternalKnowledgeAPIModal } = useModalContext()
- const [showConfirm, setShowConfirm] = useState(false)
- const [isHovered, setIsHovered] = useState(false)
- const [usageCount, setUsageCount] = useState(0)
- const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi()
- const { t } = useTranslation()
- const handleEditClick = async () => {
- 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,
- onSaveCallback: () => {
- mutateExternalKnowledgeApis()
- },
- onCancelCallback: () => {
- mutateExternalKnowledgeApis()
- },
- 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,
- },
- },
- })
- mutateExternalKnowledgeApis()
- }
- catch (error) {
- console.error('Error updating external knowledge API:', error)
- }
- },
- })
- }
- catch (error) {
- console.error('Error fetching external knowledge API data:', error)
- }
- }
- const handleDeleteClick = async () => {
- 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 () => {
- try {
- const response = await deleteExternalAPI({ apiTemplateId: api.id })
- if (response && response.result === 'success') {
- setShowConfirm(false)
- mutateExternalKnowledgeApis()
- }
- else {
- console.error('Failed to delete external API')
- }
- }
- catch (error) {
- console.error('Error deleting external knowledge API:', error)
- }
- }
- return (
- <>
- <div className={`flex p-2 pl-3 items-start self-stretch rounded-lg border-[0.5px]
- border-components-panel-border-subtle bg-components-panel-on-panel-item-bg
- shadows-shadow-xs ${isHovered ? 'bg-state-destructive-hover border-state-destructive-border' : ''}`}
- >
- <div className='flex py-1 flex-col justify-center items-start gap-1.5 flex-grow'>
- <div className='flex items-center gap-1 self-stretch text-text-secondary'>
- <ApiConnectionMod className='w-4 h-4' />
- <div className='system-sm-medium'>{api.name}</div>
- </div>
- <div className='self-stretch text-text-tertiary system-xs-regular'>{api.settings.endpoint}</div>
- </div>
- <div className='flex items-start gap-1'>
- <ActionButton onClick={handleEditClick}>
- <RiEditLine className='w-4 h-4 text-text-tertiary hover:text-text-secondary' />
- </ActionButton>
- <ActionButton
- className='hover:bg-state-destructive-hover'
- onClick={handleDeleteClick}
- onMouseEnter={() => setIsHovered(true)}
- onMouseLeave={() => setIsHovered(false)}
- >
- <RiDeleteBinLine className='w-4 h-4 text-text-tertiary hover:text-text-destructive' />
- </ActionButton>
- </div>
- </div>
- {showConfirm && (
- <Confirm
- isShow={showConfirm}
- title={`${t('dataset.deleteExternalAPIConfirmWarningContent.title.front')} ${api.name}${t('dataset.deleteExternalAPIConfirmWarningContent.title.end')}`}
- content={
- usageCount > 0
- ? `${t('dataset.deleteExternalAPIConfirmWarningContent.content.front')} ${usageCount} ${t('dataset.deleteExternalAPIConfirmWarningContent.content.end')}`
- : t('dataset.deleteExternalAPIConfirmWarningContent.noConnectionContent')
- }
- type='warning'
- onConfirm={handleConfirmDelete}
- onCancel={() => setShowConfirm(false)}
- />
- )}
- </>
- )
- }
- export default ExternalKnowledgeAPICard
|