Skip to content

Commit 9c4baf3

Browse files
committed
refactor routing structure and fix loading / duplicate network requests
1 parent badf60f commit 9c4baf3

File tree

9 files changed

+99
-90
lines changed

9 files changed

+99
-90
lines changed

client/packages/lowcoder/src/pages/setting/environments/EnvironmentDetail.tsx

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import React, {useState} from "react";
2-
import { useParams } from "react-router-dom";
32
import {
43
Spin,
54
Typography,
@@ -8,25 +7,18 @@ import {
87
Tabs,
98
Alert,
109
Descriptions,
11-
Dropdown,
1210
Menu,
1311
Button,
1412
Breadcrumb,
1513
} from "antd";
1614
import {
17-
ReloadOutlined,
1815
LinkOutlined,
19-
ClusterOutlined,
2016
TeamOutlined,
21-
UserOutlined,
22-
SyncOutlined,
2317
EditOutlined,
24-
EllipsisOutlined,
25-
MoreOutlined,
2618
HomeOutlined
2719
} from "@ant-design/icons";
2820

29-
import { useEnvironmentContext } from "./context/EnvironmentContext";
21+
import { useSingleEnvironmentContext } from "./context/SingleEnvironmentContext";
3022
import { workspaceConfig } from "./config/workspace.config";
3123
import { userGroupsConfig } from "./config/usergroups.config";
3224
import DeployableItemsTab from "./components/DeployableItemsTab";
@@ -37,21 +29,18 @@ import history from "@lowcoder-ee/util/history";
3729
const { Title, Text } = Typography;
3830
const { TabPane } = Tabs;
3931

40-
4132
/**
4233
* Environment Detail Page Component
4334
* Shows detailed information about a specific environment
4435
*/
4536
const EnvironmentDetail: React.FC = () => {
46-
// Get environment ID from URL params
37+
// Use the SingleEnvironmentContext instead of EnvironmentContext
4738
const {
4839
environment,
49-
isLoadingEnvironment,
40+
isLoading,
5041
error,
5142
updateEnvironmentData
52-
} = useEnvironmentContext();
53-
54-
43+
} = useSingleEnvironmentContext();
5544

5645
const [isEditModalVisible, setIsEditModalVisible] = useState(false);
5746
const [isUpdating, setIsUpdating] = useState(false);
@@ -67,10 +56,12 @@ const EnvironmentDetail: React.FC = () => {
6756
};
6857

6958
// Handle save environment
70-
const handleSaveEnvironment = async (environmentId: string, data: Partial<Environment>) => {
59+
const handleSaveEnvironment = async (data: Partial<Environment>) => {
60+
if (!environment) return;
61+
7162
setIsUpdating(true);
7263
try {
73-
await updateEnvironmentData(environmentId, data);
64+
await updateEnvironmentData(data);
7465
handleCloseModal();
7566
} catch (error) {
7667
console.error('Failed to update environment:', error);
@@ -89,7 +80,7 @@ const EnvironmentDetail: React.FC = () => {
8980
</Menu>
9081
);
9182

92-
if (isLoadingEnvironment) {
83+
if (isLoading) {
9384
return (
9485
<div style={{ display: 'flex', justifyContent: 'center', padding: '50px' }}>
9586
<Spin size="large" tip="Loading environment..." />
@@ -107,6 +98,7 @@ const EnvironmentDetail: React.FC = () => {
10798
/>
10899
);
109100
}
101+
110102
return (
111103
<div
112104
className="environment-detail-container"
@@ -124,7 +116,6 @@ const EnvironmentDetail: React.FC = () => {
124116
<Breadcrumb.Item>{environment.environmentName}</Breadcrumb.Item>
125117
</Breadcrumb>
126118

127-
{/* Header with environment name and controls */}
128119
{/* Header with environment name and controls */}
129120
<div
130121
className="environment-header"
@@ -231,6 +222,7 @@ const EnvironmentDetail: React.FC = () => {
231222
/>
232223
</TabPane>
233224
</Tabs>
225+
234226
{/* Edit Environment Modal */}
235227
{environment && (
236228
<EditEnvironmentModal
@@ -245,4 +237,4 @@ const EnvironmentDetail: React.FC = () => {
245237
);
246238
};
247239

248-
export default EnvironmentDetail;
240+
export default EnvironmentDetail;

client/packages/lowcoder/src/pages/setting/environments/Environments.tsx

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,28 @@
1+
// client/packages/lowcoder/src/pages/setting/environments/Environments.tsx
12
import React from "react";
2-
import { Switch, Route } from "react-router-dom";
3+
import { Switch, Route, useRouteMatch } from "react-router-dom";
34
import { EnvironmentProvider } from "./context/EnvironmentContext";
5+
import EnvironmentRoutes from "./routes/EnvironmentRoutes";
46
import EnvironmentsList from "./EnvironmentsList";
5-
import EnvironmentScopedRoutes from "./components/EnvironmentScopedRoutes";
6-
7-
import {
8-
ENVIRONMENT_SETTING,
9-
ENVIRONMENT_DETAIL
10-
} from "@lowcoder-ee/constants/routesURL";
117

128
/**
13-
* Top-level Environments component that wraps all environment-related routes
14-
* with the EnvironmentProvider for shared state management
9+
* Top-level Environments component
10+
* Provides the EnvironmentProvider at the top level
1511
*/
1612
const Environments: React.FC = () => {
13+
const { path } = useRouteMatch();
14+
1715
return (
1816
<EnvironmentProvider>
1917
<Switch>
20-
{/* Route that shows the list of environments */}
21-
<Route exact path={ENVIRONMENT_SETTING}>
18+
{/* Environment list route */}
19+
<Route exact path={path}>
2220
<EnvironmentsList />
2321
</Route>
24-
25-
{/* All other routes under /environments/:envId */}
26-
<Route path={ENVIRONMENT_DETAIL}>
27-
<EnvironmentScopedRoutes />
22+
23+
{/* All routes that need a specific environment */}
24+
<Route path={`${path}/:envId`}>
25+
<EnvironmentRoutes />
2826
</Route>
2927
</Switch>
3028
</EnvironmentProvider>

client/packages/lowcoder/src/pages/setting/environments/EnvironmentsList.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const EnvironmentsList: React.FC = () => {
1818
// Use the shared context instead of a local hook
1919
const {
2020
environments,
21-
isLoadingEnvironments,
21+
isLoading,
2222
error,
2323
} = useEnvironmentContext();
2424

@@ -83,7 +83,7 @@ const EnvironmentsList: React.FC = () => {
8383
)}
8484

8585
{/* Empty state handling */}
86-
{!isLoadingEnvironments && environments.length === 0 && !error ? (
86+
{!isLoading && environments.length === 0 && !error ? (
8787
<Empty
8888
description="No environments found"
8989
image={Empty.PRESENTED_IMAGE_SIMPLE}
@@ -92,7 +92,7 @@ const EnvironmentsList: React.FC = () => {
9292
/* Table component */
9393
<EnvironmentsTable
9494
environments={filteredEnvironments}
95-
loading={isLoadingEnvironments}
95+
loading={isLoading}
9696
onRowClick={handleRowClick}
9797
/>
9898
)}

client/packages/lowcoder/src/pages/setting/environments/WorkspaceDetail.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { queryConfig } from "./config/query.config";
3434
import { useDeployableItems } from "./hooks/useDeployableItems";
3535
import { workspaceConfig } from "./config/workspace.config";
3636
import { useDeployModal } from "./context/DeployModalContext";
37-
37+
import { useSingleEnvironmentContext } from "./context/SingleEnvironmentContext";
3838
const { Title, Text } = Typography;
3939
const { TabPane } = Tabs;
4040

@@ -49,9 +49,9 @@ const WorkspaceDetail: React.FC = () => {
4949
}>();
5050
const {
5151
environment,
52-
isLoadingEnvironment: envLoading,
52+
isLoading: envLoading,
5353
error: envError,
54-
} = useEnvironmentContext();
54+
} = useSingleEnvironmentContext();
5555

5656
const {openDeployModal} = useDeployModal();
5757

client/packages/lowcoder/src/pages/setting/environments/components/DeployItemModal.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { Modal, Form, Select, Checkbox, Button, message, Spin, Input } from 'ant
44
import { Environment } from '../types/environment.types';
55
import { DeployableItem, BaseStats, DeployableItemConfig } from '../types/deployable-item.types';
66
import { useEnvironmentContext } from '../context/EnvironmentContext';
7-
87
interface DeployItemModalProps<T extends DeployableItem, S extends BaseStats> {
98
visible: boolean;
109
item: T | null;
@@ -23,7 +22,7 @@ function DeployItemModal<T extends DeployableItem, S extends BaseStats>({
2322
onSuccess
2423
}: DeployItemModalProps<T, S>) {
2524
const [form] = Form.useForm();
26-
const { environments, isLoadingEnvironments } = useEnvironmentContext();
25+
const { environments, isLoading } = useEnvironmentContext();
2726
const [deploying, setDeploying] = useState(false);
2827

2928
useEffect(() => {
@@ -34,7 +33,7 @@ function DeployItemModal<T extends DeployableItem, S extends BaseStats>({
3433

3534
// Filter out source environment from target list
3635
const targetEnvironments = environments.filter(
37-
env => env.environmentId !== sourceEnvironment.environmentId
36+
(env: Environment) => env.environmentId !== sourceEnvironment.environmentId
3837
);
3938

4039
const handleDeploy = async () => {
@@ -76,7 +75,7 @@ function DeployItemModal<T extends DeployableItem, S extends BaseStats>({
7675
footer={null}
7776
destroyOnClose
7877
>
79-
{isLoadingEnvironments ? (
78+
{isLoading ? (
8079
<div style={{ textAlign: 'center', padding: '20px' }}>
8180
<Spin tip="Loading environments..." />
8281
</div>

client/packages/lowcoder/src/pages/setting/environments/components/EditEnvironmentModal.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ interface EditEnvironmentModalProps {
88
visible: boolean;
99
environment: Environment | null;
1010
onClose: () => void;
11-
onSave: (environmentId: string, data: Partial<Environment>) => Promise<void>;
11+
onSave: (data: Partial<Environment>) => Promise<void>; // Updated signature
1212
loading?: boolean;
1313
}
1414

@@ -45,7 +45,7 @@ const EditEnvironmentModal: React.FC<EditEnvironmentModalProps> = ({
4545
const values = await form.validateFields();
4646
setSubmitLoading(true);
4747

48-
await onSave(environment.environmentId, values);
48+
await onSave(values); // Call with only the data parameter
4949
onClose();
5050
} catch (error) {
5151
if (error instanceof Error) {

client/packages/lowcoder/src/pages/setting/environments/components/EnvironmentScopedRoutes.tsx

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// client/packages/lowcoder/src/pages/setting/environments/routes/EnvironmentRoutes.tsx
2+
import React from "react";
3+
import { Switch, Route, useRouteMatch } from "react-router-dom";
4+
import { SingleEnvironmentProvider } from "../context/SingleEnvironmentContext";
5+
import { DeployModalProvider } from "../context/DeployModalContext";
6+
import EnvironmentDetail from "../EnvironmentDetail";
7+
import WorkspaceRoutes from "./WorkspaceRoutes";
8+
9+
/**
10+
* Routes that require a specific environment
11+
* Provides the SingleEnvironmentProvider for all child routes
12+
*/
13+
const EnvironmentRoutes: React.FC = () => {
14+
const { path } = useRouteMatch();
15+
16+
return (
17+
<SingleEnvironmentProvider>
18+
<DeployModalProvider>
19+
<Switch>
20+
{/* Environment detail route */}
21+
<Route exact path={path}>
22+
<EnvironmentDetail />
23+
</Route>
24+
25+
{/* All routes that need a specific workspace */}
26+
<Route path={`${path}/workspaces/:workspaceId`}>
27+
<WorkspaceRoutes />
28+
</Route>
29+
</Switch>
30+
</DeployModalProvider>
31+
</SingleEnvironmentProvider>
32+
);
33+
};
34+
35+
export default EnvironmentRoutes;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// client/packages/lowcoder/src/pages/setting/environments/routes/WorkspaceRoutes.tsx
2+
import React from "react";
3+
import { Switch, Route, useRouteMatch } from "react-router-dom";
4+
import { WorkspaceProvider } from "../context/WorkspaceContext";
5+
import WorkspaceDetail from "../WorkspaceDetail";
6+
7+
/**
8+
* Routes that require a specific workspace
9+
* Provides the WorkspaceProvider for all child routes
10+
*/
11+
const WorkspaceRoutes: React.FC = () => {
12+
const { path } = useRouteMatch();
13+
14+
return (
15+
<WorkspaceProvider>
16+
<Switch>
17+
{/* Workspace detail route */}
18+
<Route exact path={path}>
19+
<WorkspaceDetail />
20+
</Route>
21+
22+
{/* You can add more workspace-specific routes here */}
23+
</Switch>
24+
</WorkspaceProvider>
25+
);
26+
};
27+
28+
export default WorkspaceRoutes;

0 commit comments

Comments
 (0)