| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 | 'use client'import { useCallback, useState } from 'react'import { useRouter } from 'next/navigation'import { RiArrowLeftLine, RiArrowRightLine } from '@remixicon/react'import { useTranslation } from 'react-i18next'import KnowledgeBaseInfo from './KnowledgeBaseInfo'import ExternalApiSelection from './ExternalApiSelection'import RetrievalSettings from './RetrievalSettings'import InfoPanel from './InfoPanel'import type { CreateKnowledgeBaseReq } from './declarations'import Divider from '@/app/components/base/divider'import Button from '@/app/components/base/button'type ExternalKnowledgeBaseCreateProps = {  onConnect: (formValue: CreateKnowledgeBaseReq) => void  loading: boolean}const ExternalKnowledgeBaseCreate: React.FC<ExternalKnowledgeBaseCreateProps> = ({ onConnect, loading }) => {  const { t } = useTranslation()  const router = useRouter()  const [formData, setFormData] = useState<CreateKnowledgeBaseReq>({    name: '',    description: '',    external_knowledge_api_id: '',    external_knowledge_id: '',    external_retrieval_model: {      top_k: 2,      score_threshold: 0.5,      score_threshold_enabled: false,    },    provider: 'external',  })  const navBackHandle = useCallback(() => {    router.replace('/datasets')  }, [router])  const handleFormChange = (newData: CreateKnowledgeBaseReq) => {    setFormData(newData)  }  const isFormValid = formData.name.trim() !== ''    && formData.external_knowledge_api_id !== ''    && formData.external_knowledge_id !== ''    && formData.external_retrieval_model.top_k !== undefined    && formData.external_retrieval_model.score_threshold !== undefined  return (    <div className='flex flex-col flex-grow self-stretch rounded-t-2xl border-t border-effects-highlight bg-components-panel-bg'>      <div className='flex justify-center flex-grow self-stretch'>        <div className='flex w-full max-w-[960px] px-14 py-0 flex-col items-center'>          <div className='flex w-full max-w-[640px] pt-6 pb-8 flex-col grow items-center gap-4'>            <div className='relative flex flex-col py-2 items-center gap-[2px] self-stretch'>              <div className='flex-grow text-text-primary system-xl-semibold self-stretch'>{t('dataset.connectDataset')}</div>              <p className='text-text-tertiary system-sm-regular'>                <span>{t('dataset.connectHelper.helper1')}</span>                <span className='text-text-secondary system-sm-medium'>{t('dataset.connectHelper.helper2')}</span>                <span>{t('dataset.connectHelper.helper3')}</span>                <a className='self-stretch text-text-accent system-sm-regular' href='https://docs.dify.ai/guides/knowledge-base/connect-external-knowledge' target='_blank' rel="noopener noreferrer">                  {t('dataset.connectHelper.helper4')}                </a>                <span>{t('dataset.connectHelper.helper5')} </span>              </p>              <Button                className='flex w-8 h-8 p-2 items-center justify-center absolute left-[-44px] top-1 rounded-full'                variant='tertiary'                onClick={navBackHandle}              >                <RiArrowLeftLine className='w-4 h-4 text-text-tertiary' />              </Button>            </div>            <KnowledgeBaseInfo              name={formData.name}              description={formData.description ?? ''}              onChange={data => handleFormChange({                ...formData,                ...data,              })}            />            <Divider />            <ExternalApiSelection              external_knowledge_api_id={formData.external_knowledge_api_id}              external_knowledge_id={formData.external_knowledge_id}              onChange={data => handleFormChange({                ...formData,                ...data,              })}            />            <RetrievalSettings              topK={formData.external_retrieval_model.top_k}              scoreThreshold={formData.external_retrieval_model.score_threshold}              scoreThresholdEnabled={formData.external_retrieval_model.score_threshold_enabled}              onChange={data => handleFormChange({                ...formData,                external_retrieval_model: {                  ...formData.external_retrieval_model,                  ...data,                },              })}            />            <div className='flex py-2 justify-end items-center gap-2 self-stretch'>              <Button variant='secondary' onClick={navBackHandle}>                <div className='text-components-button-secondary-text system-sm-medium'>{t('dataset.externalKnowledgeForm.cancel')}</div>              </Button>              <Button                variant='primary'                onClick={() => {                  onConnect(formData)                }}                disabled={!isFormValid}                loading={loading}              >                <div className='text-components-button-primary-text system-sm-medium'>{t('dataset.externalKnowledgeForm.connect')}</div>                <RiArrowRightLine className='w-4 h-4 text-components-button-primary-text' />              </Button>            </div>          </div>        </div>        <InfoPanel />      </div>    </div>  )}export default ExternalKnowledgeBaseCreate
 |