Spaces:
Build error
Build error
Workflow-Engine
/
web
/app
/components
/datasets
/external-knowledge-base
/create
/ExternalApiSelection.tsx
'use client' | |
import React, { useEffect, useState } from 'react' | |
import { useTranslation } from 'react-i18next' | |
import { RiAddLine } from '@remixicon/react' | |
import { useRouter } from 'next/navigation' | |
import ExternalApiSelect from './ExternalApiSelect' | |
import Input from '@/app/components/base/input' | |
import Button from '@/app/components/base/button' | |
import { useModalContext } from '@/context/modal-context' | |
import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context' | |
type ExternalApiSelectionProps = { | |
external_knowledge_api_id: string | |
external_knowledge_id: string | |
onChange: (data: { external_knowledge_api_id?: string; external_knowledge_id?: string }) => void | |
} | |
const ExternalApiSelection: React.FC<ExternalApiSelectionProps> = ({ external_knowledge_api_id, external_knowledge_id, onChange }) => { | |
const { t } = useTranslation() | |
const router = useRouter() | |
const { externalKnowledgeApiList } = useExternalKnowledgeApi() | |
const [selectedApiId, setSelectedApiId] = useState(external_knowledge_api_id) | |
const { setShowExternalKnowledgeAPIModal } = useModalContext() | |
const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi() | |
const apiItems = externalKnowledgeApiList.map(api => ({ | |
value: api.id, | |
name: api.name, | |
url: api.settings.endpoint, | |
})) | |
useEffect(() => { | |
if (apiItems.length > 0) { | |
const newSelectedId = external_knowledge_api_id || apiItems[0].value | |
setSelectedApiId(newSelectedId) | |
if (newSelectedId !== external_knowledge_api_id) | |
onChange({ external_knowledge_api_id: newSelectedId, external_knowledge_id }) | |
} | |
}, [apiItems, external_knowledge_api_id, external_knowledge_id, onChange]) | |
const handleAddNewAPI = () => { | |
setShowExternalKnowledgeAPIModal({ | |
payload: { name: '', settings: { endpoint: '', api_key: '' } }, | |
onSaveCallback: async () => { | |
mutateExternalKnowledgeApis() | |
router.refresh() | |
}, | |
onCancelCallback: () => { | |
mutateExternalKnowledgeApis() | |
}, | |
isEditMode: false, | |
}) | |
} | |
useEffect(() => { | |
if (!external_knowledge_api_id && apiItems.length > 0) | |
onChange({ external_knowledge_api_id: apiItems[0].value, external_knowledge_id }) | |
}, []) | |
return ( | |
<form className='flex flex-col gap-4 self-stretch'> | |
<div className='flex flex-col gap-1 self-stretch'> | |
<div className='flex flex-col self-stretch'> | |
<label className='text-text-secondary system-sm-semibold'>{t('dataset.externalAPIPanelTitle')}</label> | |
</div> | |
{apiItems.length > 0 | |
? <ExternalApiSelect | |
items={apiItems} | |
value={selectedApiId} | |
onSelect={(e) => { | |
setSelectedApiId(e.value) | |
onChange({ external_knowledge_api_id: e.value, external_knowledge_id }) | |
}} | |
/> | |
: <Button variant={'tertiary'} onClick={handleAddNewAPI} className='justify-start gap-0.5'> | |
<RiAddLine className='w-4 h-4 text-text-tertiary' /> | |
<span className='text-text-tertiary system-sm-regular'>{t('dataset.noExternalKnowledge')}</span> | |
</Button> | |
} | |
</div> | |
<div className='flex flex-col gap-1 self-stretch'> | |
<div className='flex flex-col self-stretch'> | |
<label className='text-text-secondary system-sm-semibold'>{t('dataset.externalKnowledgeId')}</label> | |
</div> | |
<Input | |
value={external_knowledge_id} | |
onChange={e => onChange({ external_knowledge_id: e.target.value, external_knowledge_api_id })} | |
placeholder={t('dataset.externalKnowledgeIdPlaceholder') ?? ''} | |
/> | |
</div> | |
</form> | |
) | |
} | |
export default ExternalApiSelection | |