fix: keep latest map dataset context
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user