fix: keep latest map dataset context
GeoIntel CI / docs-smoke (push) Canceled after 0s
GeoIntel CI / contract-smoke (push) Canceled after 0s

This commit is contained in:
Codex
2026-07-14 13:32:47 +02:00
parent b999c54e22
commit 50e7d0163b
4 changed files with 47 additions and 9 deletions
+29 -5
View File
@@ -1,4 +1,4 @@
import { FormEvent, useEffect, useMemo, useState } from 'react'
import { FormEvent, useEffect, useMemo, useRef, useState } from 'react'
import { datasetsApi, jobsApi } from '../services/api'
import type {
AreaRead,
@@ -99,6 +99,7 @@ export function useDatasetWorkflow({
const [ndbiNirBand, setNdbiNirBand] = useState(4)
const [loadingDatasetDetails, setLoadingDatasetDetails] = useState(false)
const [datasetDetailError, setDatasetDetailError] = useState<string | null>(null)
const datasetDetailRequestSequence = useRef(0)
const [datasetForm, setDatasetForm] = useState({
datasetType: 'vector',
source: 'user_upload',
@@ -139,8 +140,11 @@ export function useDatasetWorkflow({
}
}, [datasets, isVectorDatasetType, selectedDatasetId, selectedProjectId])
const loadDatasetJobs = async (projectId: string, datasetId: string) => {
const loadDatasetJobs = async (projectId: string, datasetId: string, detailRequestId?: number) => {
const response = await jobsApi.list(projectId, { dataset_id: datasetId, limit: 20, offset: 0 })
if (detailRequestId != null && detailRequestId !== datasetDetailRequestSequence.current) {
return
}
setJobs(response.items)
const latestRasterTileJob = response.items.find(
(job) => job.job_type === 'raster.tile' && extractRasterTileManifestPath(job),
@@ -152,6 +156,7 @@ export function useDatasetWorkflow({
}
const loadDatasetDetails = async (projectId: string, dataset: DatasetCreateResponse) => {
const detailRequestId = ++datasetDetailRequestSequence.current
setLoadingDatasetDetails(true)
setDatasetDetailError(null)
setSelectedDataset(dataset)
@@ -167,26 +172,42 @@ export function useDatasetWorkflow({
try {
if (isVectorDatasetType(dataset.dataset_type)) {
const summary = await datasetsApi.vectorSummary(projectId, dataset.id)
if (detailRequestId !== datasetDetailRequestSequence.current) {
return
}
setSelectedDatasetSummary(summary)
const featureCount = summary.feature_count ?? dataset.feature_count
if (featureCount == null || featureCount <= VECTOR_VIEWPORT_FEATURE_THRESHOLD) {
const content = await datasetsApi.getContent(projectId, dataset.id)
if (detailRequestId !== datasetDetailRequestSequence.current) {
return
}
setDatasetContent(content)
}
} else if (dataset.dataset_type === 'raster') {
try {
const rasterInspection = await datasetsApi.rasterInspect(projectId, dataset.id)
if (detailRequestId !== datasetDetailRequestSequence.current) {
return
}
setSelectedRasterMetadata(toRasterMetadata(rasterInspection.metadata))
} catch (error) {
if (detailRequestId !== datasetDetailRequestSequence.current) {
return
}
setSelectedRasterMetadata(null)
setDatasetDetailError(formatError(error, 'Raster metadata unavailable'))
}
}
await loadDatasetJobs(projectId, dataset.id)
await loadDatasetJobs(projectId, dataset.id, detailRequestId)
} catch (error) {
setDatasetDetailError(formatError(error, 'Unable to load dataset detail'))
if (detailRequestId === datasetDetailRequestSequence.current) {
setDatasetDetailError(formatError(error, 'Unable to load dataset detail'))
}
} finally {
setLoadingDatasetDetails(false)
if (detailRequestId === datasetDetailRequestSequence.current) {
setLoadingDatasetDetails(false)
}
}
}
@@ -497,6 +518,7 @@ export function useDatasetWorkflow({
}
const resetDatasetForProject = () => {
datasetDetailRequestSequence.current += 1
setSelectedDatasetId(null)
setSelectedDataset(null)
setSelectedDatasetSummary(null)
@@ -507,6 +529,8 @@ export function useDatasetWorkflow({
setLatestRasterTileManifestPath('')
setLatestRasterTileManifest(null)
setJobs([])
setLoadingDatasetDetails(false)
setDatasetDetailError(null)
}
return {