Skip to content

Commit bf39d50

Browse files
committed
refactor workspace detail page
1 parent 9f2c181 commit bf39d50

File tree

3 files changed

+156
-6
lines changed

3 files changed

+156
-6
lines changed

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
import React, { useEffect, useState } from "react";
22
import { useParams, useHistory } from "react-router-dom";
33
import history from "@lowcoder-ee/util/history";
4-
import { useWorkspaceDetail } from "./hooks/useWorkspaceDetail";
54
import DataSourcesList from './components/DataSourcesList';
6-
7-
8-
95
import {
106
Spin,
117
Typography,
@@ -20,7 +16,6 @@ import {
2016
Breadcrumb
2117
} from "antd";
2218
import {
23-
ReloadOutlined,
2419
AppstoreOutlined,
2520
DatabaseOutlined,
2621
CodeOutlined,
@@ -32,7 +27,8 @@ import {
3227
import AppsList from './components/AppsList';
3328
import { useEnvironmentContext } from "./context/EnvironmentContext";
3429
import { useWorkspace } from "./hooks/useWorkspace";
35-
30+
import { useWorkspaceApps } from "./hooks/useWorkspaceApps";
31+
import { useWorkspaceDataSources } from "./hooks/useWorkspaceDataSources";
3632

3733

3834
const { Title, Text } = Typography;
@@ -59,6 +55,22 @@ const WorkspaceDetail: React.FC = () => {
5955
error: workspaceError,
6056
refresh: refreshWorkspace
6157
} = useWorkspace(environment, workspaceId);
58+
59+
const {
60+
apps,
61+
loading: appsLoading,
62+
error: appsError,
63+
refresh: refreshApps,
64+
appStats,
65+
} = useWorkspaceApps(environment, workspaceId);
66+
67+
const {
68+
dataSources,
69+
loading: dataSourcesLoading,
70+
error: dataSourcesError,
71+
refresh: refreshDataSources,
72+
dataSourceStats,
73+
} = useWorkspaceDataSources(environment, workspaceId);
6274

6375

6476

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { useState, useEffect, useCallback } from "react";
2+
import { getWorkspaceApps } from "../services/environments.service";
3+
import { Environment } from "../types/environment.types";
4+
import { App } from "../types/app.types";
5+
6+
interface AppStats {
7+
total: number;
8+
published: number;
9+
}
10+
11+
export const useWorkspaceApps = (
12+
environment: Environment | null,
13+
workspaceId: string
14+
) => {
15+
const [apps, setApps] = useState<App[]>([]);
16+
const [loading, setLoading] = useState<boolean>(false);
17+
const [error, setError] = useState<string | null>(null);
18+
19+
const fetchApps = useCallback(async () => {
20+
if (!environment || !workspaceId) return;
21+
22+
setLoading(true);
23+
setError(null);
24+
25+
try {
26+
const { environmentId, environmentApikey, environmentApiServiceUrl } = environment;
27+
28+
if (!environmentApikey || !environmentApiServiceUrl) {
29+
setError("Missing API key or service URL for this environment. Apps cannot be fetched.");
30+
setLoading(false);
31+
return;
32+
}
33+
34+
const data = await getWorkspaceApps(
35+
workspaceId,
36+
environmentApikey,
37+
environmentApiServiceUrl
38+
);
39+
40+
setApps(data);
41+
} catch (err) {
42+
setError(
43+
err instanceof Error ? err.message : "Failed to fetch apps"
44+
);
45+
} finally {
46+
setLoading(false);
47+
}
48+
}, [environment, workspaceId]);
49+
50+
useEffect(() => {
51+
if (environment) {
52+
fetchApps();
53+
}
54+
}, [environment, fetchApps]);
55+
56+
const appStats: AppStats = {
57+
total: apps.length,
58+
published: apps.filter(app => app.published).length,
59+
};
60+
61+
return {
62+
apps,
63+
loading,
64+
error,
65+
refresh: fetchApps,
66+
appStats,
67+
};
68+
};
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { useState, useEffect, useCallback } from "react";
2+
import { getWorkspaceDataSources } from "../services/environments.service";
3+
import { Environment } from "../types/environment.types";
4+
import { DataSourceWithMeta } from "../types/datasource.types";
5+
6+
interface DataSourceStats {
7+
total: number;
8+
types: number; // unique types
9+
}
10+
11+
export const useWorkspaceDataSources = (
12+
environment: Environment | null,
13+
workspaceId: string
14+
) => {
15+
const [dataSources, setDataSources] = useState<DataSourceWithMeta[]>([]);
16+
const [loading, setLoading] = useState<boolean>(false);
17+
const [error, setError] = useState<string | null>(null);
18+
19+
const fetchDataSources = useCallback(async () => {
20+
if (!environment || !workspaceId) return;
21+
22+
setLoading(true);
23+
setError(null);
24+
25+
try {
26+
const { environmentApikey, environmentApiServiceUrl } = environment;
27+
28+
if (!environmentApikey || !environmentApiServiceUrl) {
29+
setError("Missing API key or service URL. Data sources cannot be fetched.");
30+
setLoading(false);
31+
return;
32+
}
33+
34+
const data = await getWorkspaceDataSources(
35+
workspaceId,
36+
environmentApikey,
37+
environmentApiServiceUrl
38+
);
39+
40+
setDataSources(data);
41+
} catch (err) {
42+
setError(
43+
err instanceof Error ? err.message : "Failed to fetch data sources"
44+
);
45+
} finally {
46+
setLoading(false);
47+
}
48+
}, [environment, workspaceId]);
49+
50+
useEffect(() => {
51+
if (environment) {
52+
fetchDataSources();
53+
}
54+
}, [environment, fetchDataSources]);
55+
56+
const uniqueTypes = new Set(dataSources.map(ds => ds.datasource.type));
57+
58+
const dataSourceStats: DataSourceStats = {
59+
total: dataSources.length,
60+
types: uniqueTypes.size,
61+
};
62+
63+
return {
64+
dataSources,
65+
loading,
66+
error,
67+
refresh: fetchDataSources,
68+
dataSourceStats,
69+
};
70+
};

0 commit comments

Comments
 (0)