Polish default demo project selection
GeoIntel CI / docs-smoke (push) Has been cancelled
GeoIntel CI / contract-smoke (push) Has been cancelled

This commit is contained in:
Codex
2026-06-17 18:17:05 +02:00
parent 7fa6c3c869
commit 95a978f01f
5 changed files with 93 additions and 14 deletions
+2 -2
View File
@@ -4,7 +4,7 @@ import type { DatasetCreateResponse, QualityCheckRead } from '../types'
import { formatError } from '../lib/formatError'
interface DemoWorkflowOptions {
loadProjects: () => Promise<void>
loadProjects: (preferredProjectId?: string | null) => Promise<void>
loadProjectData: (projectId: string) => Promise<{ datasets: DatasetCreateResponse[] } | null>
loadDatasetDetails: (projectId: string, dataset: DatasetCreateResponse) => Promise<void>
loadDetectionRuns: (projectId?: string | null) => Promise<void>
@@ -58,7 +58,7 @@ export function useDemoWorkflow({
setDetectionReferenceDatasetId(result.reference_dataset_id)
setSegmentationReferenceDatasetId(result.reference_dataset_id)
setDemoWorkflowMessage(result.message)
await loadProjects()
await loadProjects(result.project_id)
const [projectData] = await Promise.all([
loadProjectData(result.project_id),
loadDetectionRuns(result.project_id),
+47 -12
View File
@@ -12,6 +12,12 @@ import type {
ProjectRead,
} from '../types'
const DEMO_PROJECT_NAME = 'GeoIntel Demo - Building QA'
function isDemoProject(project: ProjectRead): boolean {
return project.name === DEMO_PROJECT_NAME
}
export function useProjectWorkspace() {
const [projects, setProjects] = useState<ProjectRead[]>([])
const [selectedProjectId, setSelectedProjectId] = useState<string | null>(null)
@@ -39,14 +45,45 @@ export function useProjectWorkspace() {
[projects, selectedProjectId],
)
const loadProjects = async () => {
const fetchProjectData = async (projectId: string): Promise<{ areas: AreaRead[]; datasets: DatasetCreateResponse[] }> => {
const [areaResponse, datasetResponse]: [AreaListResponse, DatasetListResponse] = await Promise.all([
areasApi.list(projectId),
datasetsApi.list(projectId),
])
return { areas: areaResponse.items, datasets: datasetResponse.items }
}
const pickInitialProjectId = async (items: ProjectRead[], preferredProjectId?: string | null) => {
if (preferredProjectId && items.some((project) => project.id === preferredProjectId)) {
return preferredProjectId
}
if (selectedProjectId && items.some((project) => project.id === selectedProjectId)) {
return selectedProjectId
}
const demoProjects = items.filter(isDemoProject)
const candidates = [...demoProjects, ...items.filter((project) => !isDemoProject(project))].slice(0, 8)
for (const project of candidates) {
try {
const data = await fetchProjectData(project.id)
if (data.areas.length > 0 && data.datasets.length > 0) {
return project.id
}
} catch {
// Project list should still render if a candidate's detail endpoints are temporarily unavailable.
}
}
return demoProjects[0]?.id ?? items[0]?.id ?? null
}
const loadProjects = async (preferredProjectId?: string | null) => {
setLoadingProjects(true)
setErrorMessage(null)
try {
const response = await projectsApi.list()
setProjects(response.items)
if (!selectedProjectId && response.items.length > 0) {
setSelectedProjectId(response.items[0].id)
const nextProjectId = await pickInitialProjectId(response.items, preferredProjectId)
if (nextProjectId && nextProjectId !== selectedProjectId) {
setSelectedProjectId(nextProjectId)
}
} catch (error) {
setErrorMessage(error instanceof Error ? error.message : 'Failed to load projects')
@@ -60,13 +97,10 @@ export function useProjectWorkspace() {
setLoadingDatasets(true)
setErrorMessage(null)
try {
const [areaResponse, datasetResponse]: [AreaListResponse, DatasetListResponse] = await Promise.all([
areasApi.list(projectId),
datasetsApi.list(projectId),
])
setAreas(areaResponse.items)
setDatasets(datasetResponse.items)
return { areas: areaResponse.items, datasets: datasetResponse.items }
const projectData = await fetchProjectData(projectId)
setAreas(projectData.areas)
setDatasets(projectData.datasets)
return projectData
} catch (error) {
setErrorMessage(error instanceof Error ? error.message : 'Failed to load project data')
return null
@@ -83,13 +117,14 @@ export function useProjectWorkspace() {
return
}
try {
await projectsApi.create({
const createdProject = await projectsApi.create({
name: projectForm.name.trim(),
description: projectForm.description?.trim() || undefined,
region: projectForm.region?.trim() || 'Kempen',
})
setProjectForm((previous) => ({ ...previous, name: '', description: '' }))
await loadProjects()
setSelectedProjectId(createdProject.id)
await loadProjects(createdProject.id)
} catch (error) {
setErrorMessage(error instanceof Error ? error.message : 'Failed to create project')
}