135 lines
4.5 KiB
TypeScript
135 lines
4.5 KiB
TypeScript
import { useEffect, useRef } from 'react'
|
|
|
|
type AsyncAction = () => Promise<unknown>
|
|
type ProjectAction = (projectId: string) => Promise<unknown>
|
|
|
|
interface WorkbenchBootstrapOptions {
|
|
restrictedMode?: boolean
|
|
/** Het werkblad dat nu open staat. Bepaalt wat er geladen mag worden. */
|
|
activeWorkspace?: string
|
|
/** Meldt een mislukte laadactie, zodat de gebruiker het verschil ziet tussen
|
|
"er is niets" en "het is niet gelukt". */
|
|
onLoadError?: (onderdeel: string, fout: unknown) => void
|
|
selectedProjectId: string | null
|
|
selectedDetectionRunId: string
|
|
detectionClassFilter: string
|
|
detectionMinConfidenceFilter: number
|
|
selectedSegmentationRunId: string
|
|
segmentationClassFilter: string
|
|
segmentationMinConfidenceFilter: number
|
|
loadProjects: AsyncAction
|
|
loadCapabilities: AsyncAction
|
|
loadDetectionModels: AsyncAction
|
|
loadSegmentationModels: AsyncAction
|
|
loadProjectData: ProjectAction
|
|
loadDetectionRuns: ProjectAction
|
|
loadSegmentationRuns: ProjectAction
|
|
loadQualityChecks: ProjectAction
|
|
loadExports: ProjectAction
|
|
loadDetectionResults: AsyncAction
|
|
loadSegmentationResults: AsyncAction
|
|
resetProjectData: () => void
|
|
resetDatasetForProject: () => void
|
|
resetDetectionForProject: () => void
|
|
resetSegmentationForProject: () => void
|
|
resetExportsForProject: () => void
|
|
}
|
|
|
|
export function useWorkbenchBootstrap({
|
|
restrictedMode = false,
|
|
activeWorkspace = 'map',
|
|
onLoadError,
|
|
selectedProjectId,
|
|
selectedDetectionRunId,
|
|
detectionClassFilter,
|
|
detectionMinConfidenceFilter,
|
|
selectedSegmentationRunId,
|
|
segmentationClassFilter,
|
|
segmentationMinConfidenceFilter,
|
|
loadProjects,
|
|
loadCapabilities,
|
|
loadDetectionModels,
|
|
loadSegmentationModels,
|
|
loadProjectData,
|
|
loadDetectionRuns,
|
|
loadSegmentationRuns,
|
|
loadQualityChecks,
|
|
loadExports,
|
|
loadDetectionResults,
|
|
loadSegmentationResults,
|
|
resetProjectData,
|
|
resetDatasetForProject,
|
|
resetDetectionForProject,
|
|
resetSegmentationForProject,
|
|
resetExportsForProject,
|
|
}: WorkbenchBootstrapOptions): void {
|
|
const foutMelder = useRef(onLoadError)
|
|
foutMelder.current = onLoadError
|
|
|
|
// Een mislukte laadactie werd overal met .catch(() => null) weggeslikt. De
|
|
// gebruiker zag dan "Nog geen bronnen beschikbaar", precies hetzelfde scherm
|
|
// als wanneer er echt niets is. Nu wordt de fout doorgegeven.
|
|
const meld = (onderdeel: string) => (fout: unknown) => {
|
|
foutMelder.current?.(onderdeel, fout)
|
|
return null
|
|
}
|
|
|
|
useEffect(() => {
|
|
loadProjects().catch(meld('werkruimtes'))
|
|
}, [restrictedMode])
|
|
|
|
useEffect(() => {
|
|
if (activeWorkspace !== 'system') return
|
|
loadCapabilities().catch(meld('bronkoppelingen'))
|
|
}, [restrictedMode, activeWorkspace])
|
|
|
|
useEffect(() => {
|
|
if (activeWorkspace !== 'ai') return
|
|
loadDetectionModels().catch(meld('detectiemodellen'))
|
|
loadSegmentationModels().catch(meld('segmentatiemodellen'))
|
|
}, [restrictedMode, activeWorkspace])
|
|
|
|
useEffect(() => {
|
|
if (!selectedProjectId) {
|
|
resetProjectData()
|
|
resetDatasetForProject()
|
|
resetDetectionForProject()
|
|
resetSegmentationForProject()
|
|
resetExportsForProject()
|
|
return
|
|
}
|
|
resetProjectData()
|
|
resetDatasetForProject()
|
|
resetDetectionForProject()
|
|
resetSegmentationForProject()
|
|
resetExportsForProject()
|
|
loadProjectData(selectedProjectId).catch(meld('gebieden en bronnen'))
|
|
}, [restrictedMode, selectedProjectId])
|
|
|
|
useEffect(() => {
|
|
if (!selectedProjectId || activeWorkspace !== 'analysis') return
|
|
loadQualityChecks(selectedProjectId).catch(meld('kwaliteitscontroles'))
|
|
}, [restrictedMode, selectedProjectId, activeWorkspace])
|
|
|
|
useEffect(() => {
|
|
if (!selectedProjectId || activeWorkspace !== 'ai') return
|
|
loadDetectionRuns(selectedProjectId).catch(meld('detectieruns'))
|
|
loadSegmentationRuns(selectedProjectId).catch(meld('segmentatieruns'))
|
|
}, [restrictedMode, selectedProjectId, activeWorkspace])
|
|
|
|
useEffect(() => {
|
|
if (!selectedProjectId || activeWorkspace !== 'exports') return
|
|
loadExports(selectedProjectId).catch(meld('downloads'))
|
|
}, [restrictedMode, selectedProjectId, activeWorkspace])
|
|
|
|
useEffect(() => {
|
|
if (activeWorkspace !== 'ai') return
|
|
loadDetectionResults().catch(meld('detectieresultaten'))
|
|
}, [restrictedMode, activeWorkspace, selectedDetectionRunId, detectionClassFilter, detectionMinConfidenceFilter])
|
|
|
|
useEffect(() => {
|
|
if (activeWorkspace !== 'ai') return
|
|
loadSegmentationResults().catch(meld('segmentatieresultaten'))
|
|
}, [restrictedMode, activeWorkspace, selectedSegmentationRunId, segmentationClassFilter, segmentationMinConfidenceFilter])
|
|
}
|