|
'use client' |
|
|
|
|
|
import { useEffect, useMemo, useRef, useState } from 'react' |
|
import { useRouter } from 'next/navigation' |
|
import { useTranslation } from 'react-i18next' |
|
import { useDebounceFn } from 'ahooks' |
|
import useSWR from 'swr' |
|
|
|
|
|
import ExternalAPIPanel from '../../components/datasets/external-api/external-api-panel' |
|
import Datasets from './Datasets' |
|
import DatasetFooter from './DatasetFooter' |
|
import ApiServer from './ApiServer' |
|
import Doc from './Doc' |
|
import TabSliderNew from '@/app/components/base/tab-slider-new' |
|
import TagManagementModal from '@/app/components/base/tag-management' |
|
import TagFilter from '@/app/components/base/tag-management/filter' |
|
import Button from '@/app/components/base/button' |
|
import { ApiConnectionMod } from '@/app/components/base/icons/src/vender/solid/development' |
|
import SearchInput from '@/app/components/base/search-input' |
|
|
|
|
|
import { fetchDatasetApiBaseUrl } from '@/service/datasets' |
|
|
|
|
|
import { useTabSearchParams } from '@/hooks/use-tab-searchparams' |
|
import { useStore as useTagStore } from '@/app/components/base/tag-management/store' |
|
import { useAppContext } from '@/context/app-context' |
|
import { useExternalApiPanel } from '@/context/external-api-panel-context' |
|
|
|
const Container = () => { |
|
const { t } = useTranslation() |
|
const router = useRouter() |
|
const { currentWorkspace } = useAppContext() |
|
const showTagManagementModal = useTagStore(s => s.showTagManagementModal) |
|
const { showExternalApiPanel, setShowExternalApiPanel } = useExternalApiPanel() |
|
|
|
const options = useMemo(() => { |
|
return [ |
|
{ value: 'dataset', text: t('dataset.datasets') }, |
|
...(currentWorkspace.role === 'dataset_operator' ? [] : [{ value: 'api', text: t('dataset.datasetsApi') }]), |
|
] |
|
}, [currentWorkspace.role, t]) |
|
|
|
const [activeTab, setActiveTab] = useTabSearchParams({ |
|
defaultTab: 'dataset', |
|
}) |
|
const containerRef = useRef<HTMLDivElement>(null) |
|
const { data } = useSWR(activeTab === 'dataset' ? null : '/datasets/api-base-info', fetchDatasetApiBaseUrl) |
|
|
|
const [keywords, setKeywords] = useState('') |
|
const [searchKeywords, setSearchKeywords] = useState('') |
|
const { run: handleSearch } = useDebounceFn(() => { |
|
setSearchKeywords(keywords) |
|
}, { wait: 500 }) |
|
const handleKeywordsChange = (value: string) => { |
|
setKeywords(value) |
|
handleSearch() |
|
} |
|
const [tagFilterValue, setTagFilterValue] = useState<string[]>([]) |
|
const [tagIDs, setTagIDs] = useState<string[]>([]) |
|
const { run: handleTagsUpdate } = useDebounceFn(() => { |
|
setTagIDs(tagFilterValue) |
|
}, { wait: 500 }) |
|
const handleTagsChange = (value: string[]) => { |
|
setTagFilterValue(value) |
|
handleTagsUpdate() |
|
} |
|
|
|
useEffect(() => { |
|
if (currentWorkspace.role === 'normal') |
|
return router.replace('/apps') |
|
}, [currentWorkspace, router]) |
|
|
|
return ( |
|
<div ref={containerRef} className='grow relative flex flex-col bg-gray-100 overflow-y-auto'> |
|
<div className='sticky top-0 flex justify-between pt-4 px-12 pb-2 leading-[56px] bg-gray-100 z-10 flex-wrap gap-y-2'> |
|
<TabSliderNew |
|
value={activeTab} |
|
onChange={newActiveTab => setActiveTab(newActiveTab)} |
|
options={options} |
|
/> |
|
{activeTab === 'dataset' && ( |
|
<div className='flex items-center gap-2'> |
|
<TagFilter type='knowledge' value={tagFilterValue} onChange={handleTagsChange} /> |
|
<SearchInput className='w-[200px]' value={keywords} onChange={handleKeywordsChange} /> |
|
<div className="w-[1px] h-4 bg-divider-regular" /> |
|
<Button |
|
className='gap-0.5 shadows-shadow-xs' |
|
onClick={() => setShowExternalApiPanel(true)} |
|
> |
|
<ApiConnectionMod className='w-4 h-4 text-components-button-secondary-text' /> |
|
<div className='flex px-0.5 justify-center items-center gap-1 text-components-button-secondary-text system-sm-medium'>{t('dataset.externalAPIPanelTitle')}</div> |
|
</Button> |
|
</div> |
|
)} |
|
{activeTab === 'api' && data && <ApiServer apiBaseUrl={data.api_base_url || ''} />} |
|
</div> |
|
{activeTab === 'dataset' && ( |
|
<> |
|
<Datasets containerRef={containerRef} tags={tagIDs} keywords={searchKeywords} /> |
|
<DatasetFooter /> |
|
{showTagManagementModal && ( |
|
<TagManagementModal type='knowledge' show={showTagManagementModal} /> |
|
)} |
|
</> |
|
)} |
|
{activeTab === 'api' && data && <Doc apiBaseUrl={data.api_base_url || ''} />} |
|
|
|
{showExternalApiPanel && <ExternalAPIPanel onClose={() => setShowExternalApiPanel(false)} />} |
|
</div> |
|
) |
|
} |
|
|
|
export default Container |
|
|