Implemented a Zustand-based project_id store, expanded project selection/switching to persist project_id,

and centralized backend requests via api/apiFetch (including data provider updates) to inject X-Project-ID.
This commit is contained in:
JIANG
2026-02-11 16:29:18 +08:00
parent a2e6c1f416
commit 9d06226cb4
25 changed files with 192 additions and 62 deletions
+26 -8
View File
@@ -19,24 +19,31 @@ import { useState } from "react";
interface ProjectSelectorProps {
open: boolean;
onSelect: (workspace: string, networkName: string, extent: number[]) => void;
onSelect: (
projectId: string,
workspace: string,
networkName: string,
extent: number[],
) => void;
onClose?: () => void;
}
const PROJECTS = [
{
id: "tjwater",
label: "默认",
workspace: "tjwater",
networkName: "tjwater",
extent: [13508802, 3608164, 13555651, 3633686],
},
// {
// label: "苏州河",
// workspace: "szh",
// networkName: "szh",
// extent: [13490131, 3630016, 13525879, 3666969],
// },
{
label: "苏州河",
workspace: "szh",
networkName: "szh",
extent: [13490131, 3630016, 13525879, 3666969],
},
{
id: "test",
label: "测试项目",
workspace: "test",
networkName: "test",
@@ -49,6 +56,7 @@ export const ProjectSelector: React.FC<ProjectSelectorProps> = ({
onSelect,
onClose,
}) => {
const [projectId, setProjectId] = useState(PROJECTS[0].id);
const [workspace, setWorkspace] = useState(PROJECTS[0].workspace);
const [networkName, setNetworkName] = useState(PROJECTS[0].networkName);
const [extent, setExtent] = useState<number[]>(
@@ -57,7 +65,8 @@ export const ProjectSelector: React.FC<ProjectSelectorProps> = ({
const [customMode, setCustomMode] = useState(false);
const handleConfirm = () => {
onSelect(workspace, networkName, extent);
const resolvedProjectId = projectId.trim() || workspace || networkName;
onSelect(resolvedProjectId, workspace, networkName, extent);
};
return (
@@ -123,9 +132,11 @@ export const ProjectSelector: React.FC<ProjectSelectorProps> = ({
const val = e.target.value;
if (val === "custom") {
setCustomMode(true);
setProjectId(workspace);
} else {
const p = PROJECTS.find((p) => p.workspace === val);
if (p) {
setProjectId(p.id);
setWorkspace(p.workspace);
setNetworkName(p.networkName);
setExtent(p.extent);
@@ -150,6 +161,13 @@ export const ProjectSelector: React.FC<ProjectSelectorProps> = ({
</FormControl>
) : (
<Box sx={{ display: "flex", flexDirection: "column", gap: 2 }}>
<TextField
label="项目 ID"
value={projectId}
onChange={(e) => setProjectId(e.target.value)}
fullWidth
helperText="例如: tjwater"
/>
<TextField
label="Geoserver 工作区"
value={workspace}