You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

provider.tsx 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import type { FC } from 'react'
  2. import { createContext, useCallback, useEffect, useRef } from 'react'
  3. import { createDatasetsDetailStore } from './store'
  4. import type { CommonNodeType, Node } from '../types'
  5. import { BlockEnum } from '../types'
  6. import type { KnowledgeRetrievalNodeType } from '../nodes/knowledge-retrieval/types'
  7. import { fetchDatasets } from '@/service/datasets'
  8. type DatasetsDetailStoreApi = ReturnType<typeof createDatasetsDetailStore>
  9. type DatasetsDetailContextType = DatasetsDetailStoreApi | undefined
  10. export const DatasetsDetailContext = createContext<DatasetsDetailContextType>(undefined)
  11. type DatasetsDetailProviderProps = {
  12. nodes: Node[]
  13. children: React.ReactNode
  14. }
  15. const DatasetsDetailProvider: FC<DatasetsDetailProviderProps> = ({
  16. nodes,
  17. children,
  18. }) => {
  19. const storeRef = useRef<DatasetsDetailStoreApi>()
  20. if (!storeRef.current)
  21. storeRef.current = createDatasetsDetailStore()
  22. const updateDatasetsDetail = useCallback(async (datasetIds: string[]) => {
  23. const { data: datasetsDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: datasetIds } })
  24. if (datasetsDetail && datasetsDetail.length > 0)
  25. storeRef.current!.getState().updateDatasetsDetail(datasetsDetail)
  26. }, [])
  27. useEffect(() => {
  28. if (!storeRef.current) return
  29. const knowledgeRetrievalNodes = nodes.filter(node => node.data.type === BlockEnum.KnowledgeRetrieval)
  30. const allDatasetIds = knowledgeRetrievalNodes.reduce<string[]>((acc, node) => {
  31. return Array.from(new Set([...acc, ...(node.data as CommonNodeType<KnowledgeRetrievalNodeType>).dataset_ids]))
  32. }, [])
  33. if (allDatasetIds.length === 0) return
  34. updateDatasetsDetail(allDatasetIds)
  35. }, [])
  36. return (
  37. <DatasetsDetailContext.Provider value={storeRef.current!}>
  38. {children}
  39. </DatasetsDetailContext.Provider>
  40. )
  41. }
  42. export default DatasetsDetailProvider