Files
geointel/frontend/src/hooks/useMapSelectionQa.ts
T
JensandClaude Opus 5 596bbb0e8c Vertaal 56 Engelse foutteksten in de Nederlandse interface
Deze verschenen zodra de backend geen eigen melding meegaf: de terugvalteksten
van formatError en de controles vóór een handeling. Een operator kreeg dan
"Failed to load exports" of "Select a project first" te zien, midden in een
verder Nederlandse werkbank.

Dit is geen meertaligheidsvraagstuk maar inconsistentie binnen de taal die het
product al spreekt. De teksten volgen nu de bestaande toon: benoemen wat er
misging of wat er eerst nodig is, in actieve vorm, zonder excuus.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 15:10:07 +02:00

92 lines
3.4 KiB
TypeScript

import { useState } from 'react'
import type { DatasetCreateResponse, JobRead, QaComparisonRequest, QaComparisonResult, QualityCheckRead } from '../types'
import { formatError } from '../lib/formatError'
import { qaApi } from '../services/api'
interface UseMapSelectionQaOptions {
selectedProjectId: string | null
latestSelectionDataset: DatasetCreateResponse | null
loadQualityChecks: (projectId?: string | null) => Promise<QualityCheckRead[] | void>
loadProjectData: (projectId: string) => Promise<unknown>
}
export function useMapSelectionQa({
selectedProjectId,
latestSelectionDataset,
loadQualityChecks,
loadProjectData,
}: UseMapSelectionQaOptions) {
const [selectedMapQaReferenceDatasetId, setSelectedMapQaReferenceDatasetId] = useState('')
const [mapSelectionQaRunning, setMapSelectionQaRunning] = useState(false)
const [mapSelectionQaError, setMapSelectionQaError] = useState<string | null>(null)
const [mapSelectionQaResult, setMapQaResult] = useState<QaComparisonResult | null>(null)
const [latestMapSelectionQualityCheckId, setLatestMapSelectionQualityCheckId] = useState<string | null>(null)
const runMapSelectionQa = async (candidateDataset = latestSelectionDataset) => {
if (!selectedProjectId) {
setMapSelectionQaError('Kies eerst een werkruimte om een kwaliteitscontrole te draaien.')
return null
}
if (!candidateDataset) {
setMapSelectionQaError('Save the map selection as a dataset before running QA/QC.')
return null
}
if (!selectedMapQaReferenceDatasetId) {
setMapSelectionQaError('Kies eerst een referentiebron voor de kwaliteitscontrole.')
return null
}
if (candidateDataset.id === selectedMapQaReferenceDatasetId) {
setMapSelectionQaError('Candidate and reference datasets must be different.')
return null
}
setMapSelectionQaRunning(true)
setMapSelectionQaError(null)
setMapQaResult(null)
setLatestMapSelectionQualityCheckId(null)
try {
const request: QaComparisonRequest = {
candidate_dataset_id: candidateDataset.id,
reference_dataset_id: selectedMapQaReferenceDatasetId,
iou_threshold: 0.5,
area_id: candidateDataset.area_id ?? null,
}
const job: JobRead = await qaApi.runQa(selectedProjectId, request)
if (job.status === 'failed') {
setMapSelectionQaError(job.error_message || 'Map selection QA/QC failed')
return null
}
const payload = job.result_json
if (!payload || typeof payload !== 'object') {
setMapSelectionQaError('Map selection QA/QC result was not available')
return null
}
const parsed = payload as unknown as QaComparisonResult
if (!parsed || typeof parsed.status !== 'string') {
setMapSelectionQaError('Map selection QA/QC result format was unexpected')
return null
}
setMapQaResult(parsed)
setLatestMapSelectionQualityCheckId(parsed.quality_check_id ?? null)
await loadQualityChecks(selectedProjectId)
await loadProjectData(selectedProjectId)
return parsed
} catch (error) {
setMapSelectionQaError(formatError(error, 'Map selection QA/QC failed'))
return null
} finally {
setMapSelectionQaRunning(false)
}
}
return {
selectedMapQaReferenceDatasetId,
mapSelectionQaRunning,
mapSelectionQaError,
mapSelectionQaResult,
latestMapSelectionQualityCheckId,
runMapSelectionQa,
setSelectedMapQaReferenceDatasetId,
}
}