| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  | import React, { useEffect, useState } from 'react' | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   RiAddLine, | 
					
						
							|  |  |  |   RiArrowDownSLine, | 
					
						
							|  |  |  | } from '@remixicon/react' | 
					
						
							|  |  |  | import { useTranslation } from 'react-i18next' | 
					
						
							|  |  |  | import { useRouter } from 'next/navigation' | 
					
						
							|  |  |  | import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development' | 
					
						
							|  |  |  | import { useModalContext } from '@/context/modal-context' | 
					
						
							|  |  |  | import { useExternalKnowledgeApi } from '@/context/external-knowledge-api-context' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ApiItem = { | 
					
						
							|  |  |  |   value: string | 
					
						
							|  |  |  |   name: string | 
					
						
							|  |  |  |   url: string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type ExternalApiSelectProps = { | 
					
						
							|  |  |  |   items: ApiItem[] | 
					
						
							|  |  |  |   value?: string | 
					
						
							|  |  |  |   onSelect: (item: ApiItem) => void | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ExternalApiSelect: React.FC<ExternalApiSelectProps> = ({ items, value, onSelect }) => { | 
					
						
							|  |  |  |   const { t } = useTranslation() | 
					
						
							|  |  |  |   const [isOpen, setIsOpen] = useState(false) | 
					
						
							|  |  |  |   const [selectedItem, setSelectedItem] = useState<ApiItem | null>( | 
					
						
							|  |  |  |     items.find(item => item.value === value) || null, | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  |   const { setShowExternalKnowledgeAPIModal } = useModalContext() | 
					
						
							|  |  |  |   const { mutateExternalKnowledgeApis } = useExternalKnowledgeApi() | 
					
						
							|  |  |  |   const router = useRouter() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     const newSelectedItem = items.find(item => item.value === value) || null | 
					
						
							|  |  |  |     setSelectedItem(newSelectedItem) | 
					
						
							|  |  |  |   }, [value, items]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const handleAddNewAPI = () => { | 
					
						
							|  |  |  |     setShowExternalKnowledgeAPIModal({ | 
					
						
							|  |  |  |       payload: { name: '', settings: { endpoint: '', api_key: '' } }, | 
					
						
							|  |  |  |       onSaveCallback: async () => { | 
					
						
							|  |  |  |         mutateExternalKnowledgeApis() | 
					
						
							|  |  |  |         router.refresh() | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       onCancelCallback: () => { | 
					
						
							|  |  |  |         mutateExternalKnowledgeApis() | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       isEditMode: false, | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const handleSelect = (item: ApiItem) => { | 
					
						
							|  |  |  |     setSelectedItem(item) | 
					
						
							|  |  |  |     onSelect(item) | 
					
						
							|  |  |  |     setIsOpen(false) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <div className="relative w-full"> | 
					
						
							|  |  |  |       <div | 
					
						
							| 
									
										
										
										
											2025-04-29 18:04:33 +08:00
										 |  |  |         className={`flex cursor-pointer items-center justify-between gap-0.5 self-stretch rounded-lg bg-components-input-bg-normal px-2
 | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |         py-1 hover:bg-state-base-hover-alt ${isOpen && 'bg-state-base-hover-alt'}`}
 | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |         onClick={() => setIsOpen(!isOpen)} | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         {selectedItem | 
					
						
							|  |  |  |           ? ( | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |             <div className="flex items-center gap-2 self-stretch rounded-lg p-1"> | 
					
						
							|  |  |  |               <ApiConnectionMod className='h-4 w-4 text-text-secondary' /> | 
					
						
							|  |  |  |               <div className='flex grow items-center'> | 
					
						
							|  |  |  |                 <span className='system-sm-regular overflow-hidden text-ellipsis text-components-input-text-filled'>{selectedItem.name}</span> | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |               </div> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |           : ( | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |             <span className='system-sm-regular text-components-input-text-placeholder'>{t('dataset.selectExternalKnowledgeAPI.placeholder')}</span> | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |           )} | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |         <RiArrowDownSLine className={`h-4 w-4 text-text-quaternary transition-transform ${isOpen ? 'text-text-secondary' : ''}`} /> | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |       </div> | 
					
						
							|  |  |  |       {isOpen && ( | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |         <div className="absolute z-10 mt-1 w-full rounded-xl border bg-components-panel-bg-blur shadow-lg"> | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |           {items.map(item => ( | 
					
						
							|  |  |  |             <div | 
					
						
							|  |  |  |               key={item.value} | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |               className="flex cursor-pointer items-center p-1" | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |               onClick={() => handleSelect(item)} | 
					
						
							|  |  |  |             > | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |               <div className="flex w-full items-center gap-2 self-stretch rounded-lg p-2 hover:bg-state-base-hover"> | 
					
						
							|  |  |  |                 <ApiConnectionMod className='h-4 w-4 text-text-secondary' /> | 
					
						
							|  |  |  |                 <span className='system-sm-medium grow overflow-hidden text-ellipsis text-text-secondary'>{item.name}</span> | 
					
						
							|  |  |  |                 <span className='system-xs-regular overflow-hidden text-ellipsis text-right text-text-tertiary'>{item.url}</span> | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |               </div> | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           ))} | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |           <div className='flex flex-col items-start self-stretch p-1'> | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |             <div | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |               className='flex cursor-pointer items-center gap-2 self-stretch rounded-lg p-2 hover:bg-state-base-hover' | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |               onClick={handleAddNewAPI} | 
					
						
							|  |  |  |             > | 
					
						
							| 
									
										
										
										
											2025-03-21 17:41:03 +08:00
										 |  |  |               <RiAddLine className='h-4 w-4 text-text-secondary' /> | 
					
						
							|  |  |  |               <span className='system-sm-medium grow overflow-hidden text-ellipsis text-text-secondary'>{t('dataset.createNewExternalAPI')}</span> | 
					
						
							| 
									
										
										
										
											2024-09-30 15:38:43 +08:00
										 |  |  |             </div> | 
					
						
							|  |  |  |           </div> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |       )} | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default ExternalApiSelect |