import type { FC } from 'react' import { createContext, useCallback, useEffect, useRef } from 'react' import { createDatasetsDetailStore } from './store' import type { CommonNodeType, Node } from '../types' import { BlockEnum } from '../types' import type { KnowledgeRetrievalNodeType } from '../nodes/knowledge-retrieval/types' import { fetchDatasets } from '@/service/datasets' type DatasetsDetailStoreApi = ReturnType type DatasetsDetailContextType = DatasetsDetailStoreApi | undefined export const DatasetsDetailContext = createContext(undefined) type DatasetsDetailProviderProps = { nodes: Node[] children: React.ReactNode } const DatasetsDetailProvider: FC = ({ nodes, children, }) => { const storeRef = useRef() if (!storeRef.current) storeRef.current = createDatasetsDetailStore() const updateDatasetsDetail = useCallback(async (datasetIds: string[]) => { const { data: datasetsDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: datasetIds } }) if (datasetsDetail && datasetsDetail.length > 0) storeRef.current!.getState().updateDatasetsDetail(datasetsDetail) }, []) useEffect(() => { if (!storeRef.current) return const knowledgeRetrievalNodes = nodes.filter(node => node.data.type === BlockEnum.KnowledgeRetrieval) const allDatasetIds = knowledgeRetrievalNodes.reduce((acc, node) => { return Array.from(new Set([...acc, ...(node.data as CommonNodeType).dataset_ids])) }, []) if (allDatasetIds.length === 0) return updateDatasetsDetail(allDatasetIds) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return ( {children} ) } export default DatasetsDetailProvider