Skip to content

Commit 424baa6

Browse files
committed
fix: move query from redux to url
1 parent b06dfdf commit 424baa6

File tree

5 files changed

+60
-59
lines changed

5 files changed

+60
-59
lines changed

src/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TenantCpu.tsx

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,16 @@ import React from 'react';
22

33
import {ArrowRight} from '@gravity-ui/icons';
44
import {Flex, Icon, SegmentedRadioGroup, Tab, TabList, TabProvider} from '@gravity-ui/uikit';
5-
import {useLocation} from 'react-router-dom';
65

76
import {InternalLink} from '../../../../../components/InternalLink';
8-
import {parseQuery} from '../../../../../routes';
97
import {
108
TENANT_CPU_NODES_MODE_IDS,
119
TENANT_CPU_TABS_IDS,
1210
TENANT_DIAGNOSTICS_TABS_IDS,
1311
} from '../../../../../store/reducers/tenant/constants';
14-
import {setNodesMode} from '../../../../../store/reducers/tenant/tenant';
1512
import type {AdditionalNodesProps} from '../../../../../types/additionalProps';
1613
import {cn} from '../../../../../utils/cn';
17-
import {useTypedDispatch, useTypedSelector} from '../../../../../utils/hooks';
1814
import {useDiagnosticsPageLinkGetter} from '../../../Diagnostics/DiagnosticsPages';
19-
import {TenantTabsGroups, getTenantPath} from '../../../TenantPages';
2015
import {TenantDashboard} from '../TenantDashboard/TenantDashboard';
2116
import i18n from '../i18n';
2217

@@ -25,6 +20,7 @@ import {TopNodesByLoad} from './TopNodesByLoad';
2520
import {TopQueries} from './TopQueries';
2621
import {TopShards} from './TopShards';
2722
import {cpuDashboardConfig} from './cpuDashboardConfig';
23+
import {useTenantCpuQueryParams} from './useTenantCpuQueryParams';
2824

2925
import './TenantCpu.scss';
3026

@@ -42,20 +38,13 @@ interface TenantCpuProps {
4238
}
4339

4440
export function TenantCpu({tenantName, additionalNodesProps}: TenantCpuProps) {
45-
const dispatch = useTypedDispatch();
46-
const location = useLocation();
47-
const {cpuTab = TENANT_CPU_TABS_IDS.nodes, nodesMode = TENANT_CPU_NODES_MODE_IDS.load} =
48-
useTypedSelector((state) => state.tenant);
41+
const {cpuTab, nodesMode, handleCpuTabChange, handleNodesModeChange} =
42+
useTenantCpuQueryParams();
4943
const getDiagnosticsPageLink = useDiagnosticsPageLinkGetter();
5044

51-
const queryParams = parseQuery(location);
52-
5345
const renderNodesContent = () => {
5446
const nodesModeControl = (
55-
<SegmentedRadioGroup
56-
value={nodesMode}
57-
onUpdate={(mode) => dispatch(setNodesMode(mode))}
58-
>
47+
<SegmentedRadioGroup value={nodesMode} onUpdate={handleNodesModeChange}>
5948
<SegmentedRadioGroup.Option value={TENANT_CPU_NODES_MODE_IDS.load}>
6049
{i18n('action_by-load')}
6150
</SegmentedRadioGroup.Option>
@@ -120,15 +109,9 @@ export function TenantCpu({tenantName, additionalNodesProps}: TenantCpuProps) {
120109
<TabProvider value={cpuTab}>
121110
<TabList size="m">
122111
{cpuTabs.map(({id, title}) => {
123-
const path = getTenantPath({
124-
...queryParams,
125-
[TenantTabsGroups.cpuTab]: id,
126-
});
127112
return (
128-
<Tab key={id} value={id}>
129-
<InternalLink to={path} as="tab">
130-
{title}
131-
</InternalLink>
113+
<Tab key={id} value={id} onClick={() => handleCpuTabChange(id)}>
114+
{title}
132115
</Tab>
133116
);
134117
})}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import {StringParam, useQueryParams} from 'use-query-params';
2+
3+
import {
4+
TENANT_CPU_NODES_MODE_IDS,
5+
TENANT_CPU_TABS_IDS,
6+
} from '../../../../../store/reducers/tenant/constants';
7+
import type {TenantCpuTab, TenantNodesMode} from '../../../../../store/reducers/tenant/types';
8+
9+
export function useTenantCpuQueryParams() {
10+
const [queryParams, setQueryParams] = useQueryParams({
11+
cpuTab: StringParam,
12+
nodesMode: StringParam,
13+
});
14+
15+
// Parse and validate cpuTab with fallback to nodes
16+
const cpuTab: TenantCpuTab = (() => {
17+
if (!queryParams.cpuTab) {
18+
return TENANT_CPU_TABS_IDS.nodes;
19+
}
20+
const validTabs = Object.values(TENANT_CPU_TABS_IDS) as string[];
21+
return validTabs.includes(queryParams.cpuTab)
22+
? (queryParams.cpuTab as TenantCpuTab)
23+
: TENANT_CPU_TABS_IDS.nodes;
24+
})();
25+
26+
// Parse and validate nodesMode with fallback to load
27+
const nodesMode: TenantNodesMode = (() => {
28+
if (!queryParams.nodesMode) {
29+
return TENANT_CPU_NODES_MODE_IDS.load;
30+
}
31+
const validModes = Object.values(TENANT_CPU_NODES_MODE_IDS) as string[];
32+
return validModes.includes(queryParams.nodesMode)
33+
? (queryParams.nodesMode as TenantNodesMode)
34+
: TENANT_CPU_NODES_MODE_IDS.load;
35+
})();
36+
37+
const handleCpuTabChange = (value: TenantCpuTab) => {
38+
setQueryParams({cpuTab: value}, 'replaceIn');
39+
};
40+
41+
const handleNodesModeChange = (value: TenantNodesMode) => {
42+
setQueryParams({nodesMode: value}, 'replaceIn');
43+
};
44+
45+
return {
46+
cpuTab,
47+
nodesMode,
48+
handleCpuTabChange,
49+
handleNodesModeChange,
50+
};
51+
}

src/store/reducers/tenant/tenant.ts

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@ import type {TTenantInfo} from '../../../types/api/tenant';
66
import {TENANT_INITIAL_PAGE_KEY} from '../../../utils/constants';
77
import {api} from '../api';
88

9-
import {TENANT_CPU_NODES_MODE_IDS, TENANT_CPU_TABS_IDS, TENANT_METRICS_TABS_IDS} from './constants';
9+
import {TENANT_METRICS_TABS_IDS} from './constants';
1010
import {tenantPageSchema} from './types';
1111
import type {
12-
TenantCpuTab,
1312
TenantDiagnosticsTab,
1413
TenantMetricsTab,
15-
TenantNodesMode,
1614
TenantPage,
1715
TenantQueryTab,
1816
TenantState,
@@ -26,8 +24,6 @@ const tenantPage = tenantPageSchema
2624
export const initialState: TenantState = {
2725
tenantPage,
2826
metricsTab: TENANT_METRICS_TABS_IDS.cpu,
29-
cpuTab: TENANT_CPU_TABS_IDS.nodes,
30-
nodesMode: TENANT_CPU_NODES_MODE_IDS.load,
3127
};
3228

3329
const slice = createSlice({
@@ -52,31 +48,12 @@ const slice = createSlice({
5248
const isValidTab = action.payload && validTabs.includes(action.payload as any);
5349
state.metricsTab = isValidTab ? action.payload : TENANT_METRICS_TABS_IDS.cpu;
5450
},
55-
setCpuTab: (state, action: PayloadAction<TenantCpuTab>) => {
56-
// Ensure we always have a valid cpu tab - fallback to nodes if empty/invalid
57-
const validTabs = Object.values(TENANT_CPU_TABS_IDS);
58-
const isValidTab = action.payload && validTabs.includes(action.payload as any);
59-
state.cpuTab = isValidTab ? action.payload : TENANT_CPU_TABS_IDS.nodes;
60-
},
61-
setNodesMode: (state, action: PayloadAction<TenantNodesMode>) => {
62-
// Ensure we always have a valid nodes mode - fallback to load if empty/invalid
63-
const validModes = Object.values(TENANT_CPU_NODES_MODE_IDS);
64-
const isValidMode = action.payload && validModes.includes(action.payload as any);
65-
state.nodesMode = isValidMode ? action.payload : TENANT_CPU_NODES_MODE_IDS.load;
66-
},
6751
},
6852
});
6953

7054
export default slice.reducer;
71-
export const {
72-
setTenantPage,
73-
setQueryTab,
74-
setDiagnosticsTab,
75-
setSummaryTab,
76-
setMetricsTab,
77-
setCpuTab,
78-
setNodesMode,
79-
} = slice.actions;
55+
export const {setTenantPage, setQueryTab, setDiagnosticsTab, setSummaryTab, setMetricsTab} =
56+
slice.actions;
8057

8158
export const tenantApi = api.injectEndpoints({
8259
endpoints: (builder) => ({

src/store/reducers/tenant/types.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,4 @@ export interface TenantState {
2828
diagnosticsTab?: TenantDiagnosticsTab;
2929
summaryTab?: TenantSummaryTab;
3030
metricsTab: TenantMetricsTab;
31-
cpuTab?: TenantCpuTab;
32-
nodesMode?: TenantNodesMode;
3331
}

src/store/state-url-mapping.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,6 @@ export const paramSetup = {
5353
stateKey: 'tenant.metricsTab',
5454
initialState: initialTenantState.metricsTab,
5555
},
56-
cpuTab: {
57-
stateKey: 'tenant.cpuTab',
58-
initialState: initialTenantState.cpuTab,
59-
},
60-
nodesMode: {
61-
stateKey: 'tenant.nodesMode',
62-
initialState: initialTenantState.nodesMode,
63-
},
6456
shardsMode: {
6557
stateKey: 'shardsWorkload.mode',
6658
},

0 commit comments

Comments
 (0)