import type { GraphData } from '@antv/g6'; import { isFunction } from '@antv/util'; import type { DefaultError } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query'; import { useCallback, useEffect, useState } from 'react'; import type { DatasetSchema } from '../spec'; import { DatasetStoreEvent } from '../state/constants'; import type { CallableValue } from '../types'; import type { Dataset } from '../types/dataset'; import { isRemoteDataset } from '../utils/dataset'; import { queryClient } from '../utils/service'; import { useRegistryManager } from './useRegistryManager'; import { useStateManager } from './useStateManager'; /** * 处理 remote dataset schema 并获取数据,写到 dataset 中 * @param dataset dataset schema */ const inferRemoteDataset = (dataset: DatasetSchema) => { const { datasetStore } = useStateManager(); const registryManager = useRegistryManager(); if (!isRemoteDataset(dataset)) return; const implServiceConfig = registryManager.getService(dataset.serviceType); const { data } = useQuery( { queryKey: [implServiceConfig.metadata.name, dataset.properties], queryFn: () => implServiceConfig.service({ properties: dataset.properties }), placeholderData: {}, }, queryClient, ); const newDataset = { ...dataset, data: data! }; const oldDataset = datasetStore.getDataset(); if (oldDataset.data !== newDataset.data) datasetStore.setDataset(newDataset); }; /** * Hook for dataset management. * @returns [dataset, updateDataset] * @internal */ export const useDataset = () => { const { datasetStore } = useStateManager(); const [dataset, setDataset] = useState(datasetStore.getDataset()); inferRemoteDataset(dataset); useEffect(() => { const updateInternalDataset = (dataset: Dataset) => { setDataset(dataset); }; datasetStore.on(DatasetStoreEvent.UPDATE, updateInternalDataset); return () => { datasetStore.off(DatasetStoreEvent.UPDATE, updateInternalDataset); }; }, [datasetStore]); const updateDataset = useCallback( (dataset: CallableValue) => { const newDataset = isFunction(dataset) ? dataset(datasetStore.getDataset()) : dataset; datasetStore.setDataset(newDataset); }, [datasetStore], ); return [dataset, updateDataset] as const; };