Add map selection QA shortcut
GeoIntel CI / docs-smoke (push) Has been cancelled
GeoIntel CI / contract-smoke (push) Has been cancelled

This commit is contained in:
Codex
2026-06-25 02:35:21 +02:00
parent f712272b72
commit e189a2881d
9 changed files with 265 additions and 1 deletions
+85
View File
@@ -0,0 +1,85 @@
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 runMapSelectionQa = async () => {
if (!selectedProjectId) {
setMapSelectionQaError('Select a project before running QA/QC.')
return
}
if (!latestSelectionDataset) {
setMapSelectionQaError('Save the map selection as a dataset before running QA/QC.')
return
}
if (!selectedMapQaReferenceDatasetId) {
setMapSelectionQaError('Select a reference dataset for QA/QC.')
return
}
if (latestSelectionDataset.id === selectedMapQaReferenceDatasetId) {
setMapSelectionQaError('Candidate and reference datasets must be different.')
return
}
setMapSelectionQaRunning(true)
setMapSelectionQaError(null)
setMapQaResult(null)
try {
const request: QaComparisonRequest = {
candidate_dataset_id: latestSelectionDataset.id,
reference_dataset_id: selectedMapQaReferenceDatasetId,
iou_threshold: 0.5,
area_id: latestSelectionDataset.area_id ?? null,
}
const job: JobRead = await qaApi.runQa(request)
if (job.status === 'failed') {
setMapSelectionQaError(job.error_message || 'Map selection QA/QC failed')
return
}
const payload = job.result_json
if (!payload || typeof payload !== 'object') {
setMapSelectionQaError('Map selection QA/QC result was not available')
return
}
const parsed = payload as unknown as QaComparisonResult
if (!parsed || typeof parsed.status !== 'string') {
setMapSelectionQaError('Map selection QA/QC result format was unexpected')
return
}
setMapQaResult(parsed)
await loadQualityChecks(selectedProjectId)
await loadProjectData(selectedProjectId)
} catch (error) {
setMapSelectionQaError(formatError(error, 'Map selection QA/QC failed'))
} finally {
setMapSelectionQaRunning(false)
}
}
return {
selectedMapQaReferenceDatasetId,
mapSelectionQaRunning,
mapSelectionQaError,
mapSelectionQaResult,
runMapSelectionQa,
setSelectedMapQaReferenceDatasetId,
}
}