<!-- .github/pull_request_template.md --> ## Description <!-- Provide a clear description of the changes in this PR --> ## DCO Affirmation I affirm that all code in every commit of this pull request conforms to the terms of the Topoteretes Developer Certificate of Origin.
139 lines
3.7 KiB
TypeScript
139 lines
3.7 KiB
TypeScript
import { useCallback, useState } from 'react';
|
|
|
|
import { fetch } from '@/utils';
|
|
import { DataFile } from './useData';
|
|
import createDataset from "../datasets/createDataset";
|
|
|
|
export interface Dataset {
|
|
id: string;
|
|
name: string;
|
|
data: DataFile[];
|
|
status: string;
|
|
}
|
|
|
|
function useDatasets(useCloud = false) {
|
|
const [datasets, setDatasets] = useState<Dataset[]>([]);
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
// const statusTimeout = useRef<any>(null);
|
|
|
|
// const fetchDatasetStatuses = useCallback((datasets: Dataset[]) => {
|
|
// fetch(
|
|
// `/v1/datasets/status?dataset=${datasets.map(d => d.id).join('&dataset=')}`,
|
|
// {
|
|
// headers: {
|
|
// "Content-Type": "application/json",
|
|
// },
|
|
// },
|
|
// useCloud,
|
|
// )
|
|
// .then((response) => response.json())
|
|
// .then((statuses) => setDatasets(
|
|
// (datasets) => (
|
|
// datasets.map((dataset) => ({
|
|
// ...dataset,
|
|
// status: statuses[dataset.id]
|
|
// }))
|
|
// )));
|
|
// }, [useCloud]);
|
|
|
|
// const checkDatasetStatuses = useCallback((datasets: Dataset[]) => {
|
|
// fetchDatasetStatuses(datasets);
|
|
|
|
// if (statusTimeout.current !== null) {
|
|
// clearTimeout(statusTimeout.current);
|
|
// }
|
|
|
|
// statusTimeout.current = setTimeout(() => {
|
|
// checkDatasetStatuses(datasets);
|
|
// }, 50000);
|
|
// }, [fetchDatasetStatuses]);
|
|
|
|
// useEffect(() => {
|
|
// return () => {
|
|
// if (statusTimeout.current !== null) {
|
|
// clearTimeout(statusTimeout.current);
|
|
// statusTimeout.current = null;
|
|
// }
|
|
// };
|
|
// }, []);
|
|
|
|
const addDataset = useCallback((datasetName: string) => {
|
|
return createDataset({ name: datasetName }, useCloud)
|
|
.then((dataset) => {
|
|
setDatasets((datasets) => [
|
|
...datasets,
|
|
dataset,
|
|
]);
|
|
});
|
|
}, [useCloud]);
|
|
|
|
const removeDataset = useCallback((datasetId: string) => {
|
|
return fetch(`/v1/datasets/${datasetId}`, {
|
|
method: 'DELETE',
|
|
}, useCloud)
|
|
.then(() => {
|
|
setDatasets((datasets) =>
|
|
datasets.filter((dataset) => dataset.id !== datasetId)
|
|
);
|
|
});
|
|
}, [useCloud]);
|
|
|
|
const fetchDatasets = useCallback(() => {
|
|
return fetch('/v1/datasets', {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
}, useCloud)
|
|
.then((response) => response.json())
|
|
.then((datasets) => {
|
|
setDatasets(datasets);
|
|
|
|
// if (datasets.length > 0) {
|
|
// checkDatasetStatuses(datasets);
|
|
// }
|
|
|
|
return datasets;
|
|
})
|
|
.catch((error) => {
|
|
console.error('Error fetching datasets:', error);
|
|
});
|
|
}, [useCloud]);
|
|
|
|
const getDatasetData = useCallback((datasetId: string) => {
|
|
return fetch(`/v1/datasets/${datasetId}/data`, {}, useCloud)
|
|
.then((response) => response.json())
|
|
.then((data) => {
|
|
const datasetIndex = datasets.findIndex((dataset) => dataset.id === datasetId);
|
|
|
|
if (datasetIndex >= 0) {
|
|
setDatasets((datasets) => [
|
|
...datasets.slice(0, datasetIndex),
|
|
{
|
|
...datasets[datasetIndex],
|
|
data,
|
|
},
|
|
...datasets.slice(datasetIndex + 1),
|
|
]);
|
|
}
|
|
|
|
return data;
|
|
});
|
|
}, [datasets, useCloud]);
|
|
|
|
const removeDatasetData = useCallback((datasetId: string, dataId: string) => {
|
|
return fetch(`/v1/datasets/${datasetId}/data/${dataId}`, {
|
|
method: 'DELETE',
|
|
}, useCloud);
|
|
}, [useCloud]);
|
|
|
|
return {
|
|
datasets,
|
|
addDataset,
|
|
removeDataset,
|
|
getDatasetData,
|
|
removeDatasetData,
|
|
refreshDatasets: fetchDatasets,
|
|
};
|
|
};
|
|
|
|
export default useDatasets;
|