mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 02:42:59 +00:00 
			
		
		
		
	
		
			
	
	
		
			97 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|   | '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 |