Make Mol the primary operating 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-13 17:47:21 +02:00
parent e2ddf84c74
commit e8eecb2895
14 changed files with 179 additions and 21 deletions
+27 -8
View File
@@ -1,4 +1,11 @@
import { FormEvent, useMemo, useState } from 'react'
import {
PRIMARY_FOCUS_AREA_GEOJSON,
PRIMARY_FOCUS_AREA_NAME,
PRIMARY_FOCUS_REGION,
isPrimaryFocusProject,
isPrimaryFocusProjectData,
} from '../config/primaryFocus'
import { areasApi } from '../services/api/areas'
import { datasetsApi } from '../services/api/datasets'
import { projectsApi } from '../services/api/projects'
@@ -31,12 +38,11 @@ export function useProjectWorkspace() {
const [projectForm, setProjectForm] = useState<ProjectCreate>({
name: '',
description: '',
region: 'Kempen',
region: PRIMARY_FOCUS_REGION,
})
const [areaForm, setAreaForm] = useState({
name: 'Demo AOI',
geometry:
'{"type":"MultiPolygon","coordinates":[[[[4.35,51.28],[4.55,51.28],[4.55,51.46],[4.35,51.46],[4.35,51.28]]]]}',
name: PRIMARY_FOCUS_AREA_NAME,
geometry: PRIMARY_FOCUS_AREA_GEOJSON,
crs: 'EPSG:4326',
})
@@ -60,19 +66,32 @@ export function useProjectWorkspace() {
if (selectedProjectId && items.some((project) => project.id === selectedProjectId)) {
return selectedProjectId
}
const primaryProjects = items.filter(isPrimaryFocusProject)
const demoProjects = items.filter(isDemoProject)
const candidates = [...demoProjects, ...items.filter((project) => !isDemoProject(project))].slice(0, 8)
const candidates = Array.from(
new Map(
[...primaryProjects, ...demoProjects, ...items].map((project) => [project.id, project]),
).values(),
).slice(0, 12)
const inspectedCandidates: Array<{
project: ProjectRead
data: { areas: AreaRead[]; datasets: DatasetCreateResponse[] }
}> = []
for (const project of candidates) {
try {
const data = await fetchProjectData(project.id)
if (data.areas.length > 0 && data.datasets.length > 0) {
inspectedCandidates.push({ project, data })
if (data.datasets.length > 0 && isPrimaryFocusProjectData(project, data.datasets)) {
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 completeContext = inspectedCandidates.find(
({ data }) => data.areas.length > 0 && data.datasets.length > 0,
)
return completeContext?.project.id ?? primaryProjects[0]?.id ?? demoProjects[0]?.id ?? items[0]?.id ?? null
}
const loadProjects = async (preferredProjectId?: string | null) => {
@@ -120,7 +139,7 @@ export function useProjectWorkspace() {
const createdProject = await projectsApi.create({
name: projectForm.name.trim(),
description: projectForm.description?.trim() || undefined,
region: projectForm.region?.trim() || 'Kempen',
region: projectForm.region?.trim() || PRIMARY_FOCUS_REGION,
})
setProjectForm((previous) => ({ ...previous, name: '', description: '' }))
setSelectedProjectId(createdProject.id)