import { useState } from 'react' import { demoApi } from '../services/api' import type { DatasetCreateResponse, QualityCheckRead } from '../types' import { formatError } from '../lib/formatError' interface DemoWorkflowOptions { restrictedMode?: boolean loadProjects: (preferredProjectId?: string | null) => Promise loadProjectData: (projectId: string) => Promise<{ datasets: DatasetCreateResponse[] } | null> loadDatasetDetails: (projectId: string, dataset: DatasetCreateResponse) => Promise loadDetectionRuns: (projectId?: string | null) => Promise loadSegmentationRuns: (projectId?: string | null) => Promise loadQualityChecks: (projectId?: string | null) => Promise loadExports: (projectId?: string | null) => Promise setSelectedProjectId: (projectId: string) => void setSelectedDatasetId: (datasetId: string | null) => void setSelectedMapAreaId: (areaId: string) => void setQaCandidateDatasetId: (datasetId: string) => void setQaReferenceDatasetId: (datasetId: string) => void setQaAreaId: (areaId: string) => void setSelectedDetectionDatasetId: (datasetId: string) => void setDetectionReferenceDatasetId: (datasetId: string) => void setSelectedSegmentationDatasetId: (datasetId: string) => void setSegmentationReferenceDatasetId: (datasetId: string) => void setErrorMessage: (message: string | null) => void } export function useDemoWorkflow({ restrictedMode = false, loadProjects, loadProjectData, loadDatasetDetails, loadDetectionRuns, loadSegmentationRuns, loadQualityChecks, loadExports, setSelectedProjectId, setSelectedDatasetId, setSelectedMapAreaId, setQaCandidateDatasetId, setQaReferenceDatasetId, setQaAreaId, setSelectedDetectionDatasetId, setDetectionReferenceDatasetId, setSelectedSegmentationDatasetId, setSegmentationReferenceDatasetId, setErrorMessage, }: DemoWorkflowOptions) { const [loadingDemoWorkflow, setLoadingDemoWorkflow] = useState(false) const [demoWorkflowMessage, setDemoWorkflowMessage] = useState(null) const loadDemoWorkflow = async (): Promise => { setLoadingDemoWorkflow(true) setDemoWorkflowMessage(null) setErrorMessage(null) try { const result = await demoApi.seedWorkflow() setSelectedProjectId(result.project_id) setSelectedDatasetId(result.candidate_dataset_id) setSelectedMapAreaId(result.area_id) setQaCandidateDatasetId(result.candidate_dataset_id) setQaReferenceDatasetId(result.reference_dataset_id) setQaAreaId(result.area_id) setSelectedDetectionDatasetId(result.raster_dataset_id ?? '') setDetectionReferenceDatasetId(result.reference_dataset_id) setSelectedSegmentationDatasetId(result.raster_dataset_id ?? '') setSegmentationReferenceDatasetId(result.reference_dataset_id) setDemoWorkflowMessage(result.message) await loadProjects(result.project_id) const operatorOnlyLoads = restrictedMode ? Promise.resolve() : Promise.all([ loadDetectionRuns(result.project_id), loadSegmentationRuns(result.project_id), loadExports(result.project_id), ]).then(() => undefined) const [projectData] = await Promise.all([ loadProjectData(result.project_id), loadQualityChecks(result.project_id), operatorOnlyLoads, ]) const candidateDataset = projectData?.datasets.find((dataset) => dataset.id === result.candidate_dataset_id) const rasterDataset = projectData?.datasets.find((dataset) => dataset.id === result.raster_dataset_id) if (candidateDataset) { await loadDatasetDetails(result.project_id, candidateDataset) } else if (rasterDataset) { await loadDatasetDetails(result.project_id, rasterDataset) } return true } catch (error) { setErrorMessage(formatError(error, 'De demowerkruimte kon niet worden geladen.')) return false } finally { setLoadingDemoWorkflow(false) } } return { loadingDemoWorkflow, demoWorkflowMessage, loadDemoWorkflow, } }