Skip to content

Commit 4c45bf2

Browse files
committed
feat(msp): service list chart lazy load
1 parent 3b729d3 commit 4c45bf2

File tree

2 files changed

+49
-14
lines changed
  • shell/app

2 files changed

+49
-14
lines changed

shell/app/common/components/card-list/index.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ interface IProps<T = Record<string, any>> {
4545
onViewChange?: (data: T, flag?: boolean) => void;
4646
}
4747

48-
const renderChild = <T,>(record: T, columns: CardColumnsProps<T>[], index: number) => {
48+
const renderChild = <T extends unknown>(record: T, columns: CardColumnsProps<T>[], index: number) => {
4949
return columns.map((column) => {
5050
let nodes: React.ReactNode = get(record, column.dataIndex);
5151
if (column.render) {
@@ -76,7 +76,7 @@ interface IRowProps<T> {
7676
onViewChange?: (data: T, flag?: boolean) => void;
7777
}
7878

79-
const RowItem = <T,>({ rowClick, rowId, rowClass, record, columns, index, onViewChange }: IRowProps<T>) => {
79+
const RowItem = <T extends unknown>({ rowClick, rowId, rowClass, record, columns, index, onViewChange }: IRowProps<T>) => {
8080
const rowRef = React.useRef();
8181
const [isInView] = useInViewPort(rowRef);
8282
React.useEffect(() => {
@@ -89,7 +89,7 @@ const RowItem = <T,>({ rowClick, rowId, rowClass, record, columns, index, onView
8989
);
9090
};
9191

92-
const CardList = <T,>({
92+
const CardList = <T extends unknown>({
9393
loading,
9494
dataSource,
9595
rowKey,

shell/app/modules/msp/env-overview/service-list/pages/index.tsx

+46-11
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,11 @@ interface IState {
217217
const MicroServiceOverview = () => {
218218
const [data, dataLoading] = getServices.useState();
219219
const tenantId = routeInfoStore.useStore((s) => s.params.terminusKey);
220-
const overviewList = getAnalyzerOverview.useData();
220+
const [overviewList, setOverviewList] = React.useState<MSP_SERVICES.SERVICE_LIST_CHART[]>([]);
221221
const serViceCount = getServiceCount.useData();
222+
const charts = React.useRef<{
223+
[k: string]: { status: 'null' | 'pending' | 'success' | 'error'; data: MSP_SERVICES.SERVICE_LIST_CHART[] };
224+
}>({});
222225
const [{ pagination, searchValue, serviceStatus, startTime, endTime }, updater, update] = useUpdate<IState>({
223226
searchValue: '',
224227
startTime: moment().subtract(1, 'h').valueOf(),
@@ -248,14 +251,16 @@ const MicroServiceOverview = () => {
248251
}, [getServicesList]);
249252

250253
React.useEffect(() => {
251-
const serviceIdList = data?.list.map((item) => item?.id);
252-
if (serviceIdList?.length) {
253-
getAnalyzerOverview.fetch({
254-
view: 'service_overview',
255-
tenantId,
256-
serviceIds: serviceIdList,
257-
});
258-
}
254+
setOverviewList([]);
255+
charts.current = data?.list.reduce((prev, next) => {
256+
return {
257+
...prev,
258+
[next.id]: {
259+
status: 'null',
260+
data: [],
261+
},
262+
};
263+
}, {});
259264
}, [data]);
260265

261266
const onPageChange = (current: number, pageSize?: number) => {
@@ -280,6 +285,35 @@ const MicroServiceOverview = () => {
280285
getServicesList();
281286
getServiceCount({ tenantId });
282287
}, [getServicesList]);
288+
289+
const handleViewChange = React.useCallback(
290+
({ id }: IListItem, flag?: boolean) => {
291+
if (flag && ['null', 'error'].includes(charts.current[id].status)) {
292+
charts.current[id].status = 'pending';
293+
getAnalyzerOverview
294+
.fetch({
295+
startTime,
296+
endTime,
297+
serviceIds: [id],
298+
tenantId,
299+
view: 'service_overview',
300+
})
301+
.then((res) => {
302+
charts.current[id] = {
303+
status: res.success ? 'success' : 'error',
304+
data: res.data?.list || [],
305+
};
306+
const list = Object.keys(charts.current)
307+
.filter((serviceId) => charts.current[serviceId].status === 'success')
308+
.map((serviceId) => {
309+
return charts.current[serviceId].data[0];
310+
});
311+
setOverviewList(list);
312+
});
313+
}
314+
},
315+
[tenantId, endTime, startTime],
316+
);
283317

284318
const columns: Array<CardColumnsProps<IListItem>> = [
285319
{
@@ -389,7 +423,7 @@ const MicroServiceOverview = () => {
389423

390424
const list = React.useMemo(() => {
391425
return (data?.list ?? []).map((item) => {
392-
const views = overviewList?.list.find((t) => t.serviceId === item.id)?.views ?? [];
426+
const views = overviewList.find((t) => t.serviceId === item.id)?.views ?? [];
393427
return {
394428
...item,
395429
aggregateMetric: {
@@ -400,7 +434,7 @@ const MicroServiceOverview = () => {
400434
views,
401435
};
402436
});
403-
}, [data?.list, overviewList?.list]);
437+
}, [data?.list, overviewList]);
404438

405439
const tabsOptions = React.useMemo(
406440
() =>
@@ -459,6 +493,7 @@ const MicroServiceOverview = () => {
459493
size="small"
460494
columns={columns}
461495
dataSource={list}
496+
onViewChange={handleViewChange}
462497
rowClick={({ id, name }) => {
463498
listDetail(id, name);
464499
}}

0 commit comments

Comments
 (0)