Skip to content

Commit 66cbd6f

Browse files
authored
fix(Versions): loading state (#2050)
1 parent bc5d59d commit 66cbd6f

File tree

4 files changed

+47
-19
lines changed

4 files changed

+47
-19
lines changed

src/containers/Cluster/Cluster.scss

+4-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
.ydb-cluster {
44
position: relative;
55

6+
display: flex;
67
overflow: auto;
78
flex-grow: 1;
9+
flex-direction: column;
810

911
height: 100%;
1012
padding: 0 20px;
@@ -46,14 +48,14 @@
4648
&__sticky-wrapper {
4749
position: sticky;
4850
z-index: 4;
49-
top: 66px;
51+
top: 74px;
5052
left: 0;
5153
}
5254

5355
&__auto-refresh-control {
5456
float: right;
5557

56-
margin-top: -46px;
58+
margin-top: -54px;
5759

5860
background-color: var(--g-color-base-background);
5961
}

src/containers/Cluster/Cluster.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {Nodes} from '../Nodes/Nodes';
2929
import {PaginatedStorage} from '../Storage/PaginatedStorage';
3030
import {TabletsTable} from '../Tablets/TabletsTable';
3131
import {Tenants} from '../Tenants/Tenants';
32-
import {Versions} from '../Versions/Versions';
32+
import {VersionsContainer} from '../Versions/Versions';
3333

3434
import {ClusterDashboard} from './ClusterDashboard/ClusterDashboard';
3535
import {ClusterInfo} from './ClusterInfo/ClusterInfo';
@@ -193,7 +193,7 @@ export function Cluster({
193193
getLocationObjectFromHref(getClusterPath(clusterTabsIds.versions)).pathname
194194
}
195195
>
196-
{cluster && <Versions cluster={cluster} />}
196+
<VersionsContainer cluster={cluster} loading={infoLoading} />
197197
</Route>
198198
<Route
199199
render={() => (

src/containers/Versions/Versions.tsx

+29-13
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import React from 'react';
22

33
import {Checkbox, RadioButton} from '@gravity-ui/uikit';
44

5-
import {Loader} from '../../components/Loader';
5+
import {LoaderWrapper} from '../../components/LoaderWrapper/LoaderWrapper';
66
import {nodesApi} from '../../store/reducers/nodes/nodes';
7+
import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
78
import type {TClusterInfo} from '../../types/api/cluster';
9+
import type {VersionToColorMap, VersionValue} from '../../types/versions';
810
import {cn} from '../../utils/cn';
911
import {useAutoRefreshInterval} from '../../utils/hooks';
1012
import {VersionsBar} from '../Cluster/VersionsBar/VersionsBar';
@@ -19,21 +21,39 @@ import './Versions.scss';
1921

2022
const b = cn('ydb-versions');
2123

22-
interface VersionsProps {
23-
cluster: TClusterInfo;
24+
interface VersionsContainerProps {
25+
cluster?: TClusterInfo;
26+
loading?: boolean;
2427
}
2528

26-
export const Versions = ({cluster}: VersionsProps) => {
29+
export function VersionsContainer({cluster, loading}: VersionsContainerProps) {
2730
const [autoRefreshInterval] = useAutoRefreshInterval();
28-
const versionToColor = useVersionToColorMap();
29-
30-
const versionsValues = useGetVersionValues(cluster, versionToColor);
3131
const {currentData, isLoading: isNodesLoading} = nodesApi.useGetNodesQuery(
3232
{tablets: false, fieldsRequired: ['SystemState', 'SubDomainKey']},
3333
{pollingInterval: autoRefreshInterval},
3434
);
35+
const versionToColor = useVersionToColorMap();
36+
37+
const versionsValues = useGetVersionValues({cluster, versionToColor, clusterLoading: loading});
38+
39+
return (
40+
<LoaderWrapper loading={loading || isNodesLoading}>
41+
<Versions
42+
versionsValues={versionsValues}
43+
nodes={currentData?.Nodes}
44+
versionToColor={versionToColor}
45+
/>
46+
</LoaderWrapper>
47+
);
48+
}
3549

36-
const nodes = currentData?.Nodes;
50+
interface VersionsProps {
51+
nodes?: NodesPreparedEntity[];
52+
versionsValues: VersionValue[];
53+
versionToColor?: VersionToColorMap;
54+
}
55+
56+
function Versions({versionsValues, nodes, versionToColor}: VersionsProps) {
3757
const [groupByValue, setGroupByValue] = React.useState<GroupByValue>(GroupByValue.VERSION);
3858
const [expanded, setExpanded] = React.useState(false);
3959

@@ -71,10 +91,6 @@ export const Versions = ({cluster}: VersionsProps) => {
7191
);
7292
};
7393

74-
if (isNodesLoading) {
75-
return <Loader />;
76-
}
77-
7894
const tenantNodes = getGroupedTenantNodes(nodes, versionToColor, groupByValue);
7995
const storageNodes = getGroupedStorageNodes(nodes, versionToColor);
8096
const otherNodes = getOtherNodes(nodes, versionToColor);
@@ -146,4 +162,4 @@ export const Versions = ({cluster}: VersionsProps) => {
146162
{otherNodesContent}
147163
</div>
148164
);
149-
};
165+
}

src/containers/Versions/utils.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,19 @@ import {
1616
parseVersionsToVersionToColorMap,
1717
} from '../../utils/versions';
1818

19-
export const useGetVersionValues = (cluster?: TClusterInfo, versionToColor?: VersionToColorMap) => {
19+
interface UseGetVersionValuesProps {
20+
cluster?: TClusterInfo;
21+
versionToColor?: VersionToColorMap;
22+
clusterLoading?: boolean;
23+
}
24+
25+
export const useGetVersionValues = ({
26+
cluster,
27+
versionToColor,
28+
clusterLoading,
29+
}: UseGetVersionValuesProps) => {
2030
const {currentData} = nodesApi.useGetNodesQuery(
21-
isClusterInfoV2(cluster)
31+
isClusterInfoV2(cluster) || clusterLoading
2232
? skipToken
2333
: {
2434
tablets: false,

0 commit comments

Comments
 (0)