diff --git a/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx b/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx index a576f3d22d..5356a15059 100644 --- a/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx +++ b/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx @@ -1,6 +1,7 @@ 'use client' import type { FC } from 'react' -import React, { useEffect } from 'react' +import React, { useRef, useState } from 'react' +import { useGetState, useInfiniteScroll } from 'ahooks' import cn from 'classnames' import { useTranslation } from 'react-i18next' import Link from 'next/link' @@ -32,14 +33,33 @@ const SelectDataSet: FC = ({ const [datasets, setDataSets] = React.useState(null) const hasNoData = !datasets || datasets?.length === 0 const canSelectMulti = true - useEffect(() => { - (async () => { - const { data } = await fetchDatasets({ url: '/datasets', params: { page: 1 } }) - setDataSets(data) - setLoaded(true) - setSelected(data.filter(item => selectedIds.includes(item.id))) - })() - }, []) + + const listRef = useRef(null) + const [page, setPage, getPage] = useGetState(1) + const [isNoMore, setIsNoMore] = useState(false) + + useInfiniteScroll( + async () => { + if (!isNoMore) { + const { data, has_more } = await fetchDatasets({ url: '/datasets', params: { page } }) + setPage(getPage() + 1) + setIsNoMore(!has_more) + const newList = [...(datasets || []), ...data] + setDataSets(newList) + setLoaded(true) + setSelected(newList.filter(item => selectedIds.includes(item.id))) + } + return { list: [] } + }, + { + target: listRef, + isNoMore: () => { + return isNoMore + }, + reloadDeps: [isNoMore], + }, + ) + const toggleSelect = (dataSet: DataSet) => { const isSelected = selected.some(item => item.id === dataSet.id) if (isSelected) { @@ -83,7 +103,7 @@ const SelectDataSet: FC = ({ {datasets && datasets?.length > 0 && ( <> -
+
{datasets.map(item => (