| | '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 |
| |
|