11import React from 'react' ;
22
33import { Pulse , Terminal } from '@gravity-ui/icons' ;
4- import { useHistory , useLocation , useRouteMatch } from 'react-router-dom' ;
4+ import { useLocation , useRouteMatch } from 'react-router-dom' ;
5+ import { StringParam , useQueryParams } from 'use-query-params' ;
56
67import routes , { getTenantPath , parseQuery } from '../../../routes' ;
7- import { SETTING_KEYS } from '../../../store/reducers/settings/constants' ;
8+ import { DEFAULT_USER_SETTINGS , SETTING_KEYS } from '../../../store/reducers/settings/constants' ;
89import { TENANT_PAGE , TENANT_PAGES_IDS } from '../../../store/reducers/tenant/constants' ;
9- import { useSetting , useTypedSelector } from '../../../utils/hooks' ;
10+ import { tenantPageSchema } from '../../../store/reducers/tenant/types' ;
11+ import type { TenantPage } from '../../../store/reducers/tenant/types' ;
12+ import { useSetting } from '../../../utils/hooks' ;
1013import i18n from '../i18n' ;
1114
1215type TenantPages = keyof typeof TENANT_PAGES_IDS ;
@@ -19,14 +22,11 @@ const mapPageToIcon = {
1922} ;
2023
2124export function useTenantNavigation ( ) {
22- const history = useHistory ( ) ;
23-
2425 const location = useLocation ( ) ;
2526 const queryParams = parseQuery ( location ) ;
2627 const match = useRouteMatch ( routes . tenant ) ;
2728
28- const [ , setInitialTenantPage ] = useSetting < string > ( SETTING_KEYS . TENANT_INITIAL_PAGE ) ;
29- const { tenantPage} = useTypedSelector ( ( state ) => state . tenant ) ;
29+ const { tenantPage, handleTenantPageChange} = useTenantPage ( ) ;
3030
3131 const menuItems = React . useMemo ( ( ) => {
3232 if ( ! match ) {
@@ -44,16 +44,41 @@ export function useTenantNavigation() {
4444 path : pagePath ,
4545 current : tenantPage === pageId ,
4646 onForward : ( ) => {
47- setInitialTenantPage ( pageId ) ;
48- history . push ( pagePath ) ;
47+ handleTenantPageChange ( pageId ) ;
4948 } ,
5049 } ;
5150
5251 return nextItem ;
5352 } ) ;
5453
5554 return items ;
56- } , [ tenantPage , setInitialTenantPage , match , history , queryParams ] ) ;
55+ } , [ tenantPage , handleTenantPageChange , match , queryParams ] ) ;
5756
5857 return menuItems ;
5958}
59+
60+ export function useTenantPage ( ) {
61+ const [ { tenantPage : tenantPageFromQuery } , setQueryParams ] = useQueryParams ( {
62+ tenantPage : StringParam ,
63+ } ) ;
64+
65+ const [ initialTenantPage , setInitialTenantPage ] = useSetting < TenantPage | undefined > (
66+ SETTING_KEYS . TENANT_INITIAL_PAGE ,
67+ ) ;
68+
69+ const handleTenantPageChange = React . useCallback (
70+ ( value ?: TenantPage ) => {
71+ setInitialTenantPage ( value ) ;
72+ setQueryParams ( { tenantPage : value } ) ;
73+ } ,
74+ [ setInitialTenantPage , setQueryParams ] ,
75+ ) ;
76+
77+ const parsedInitialPage = tenantPageSchema
78+ . catch ( DEFAULT_USER_SETTINGS [ SETTING_KEYS . TENANT_INITIAL_PAGE ] )
79+ . parse ( initialTenantPage ) ;
80+
81+ const tenantPage = tenantPageSchema . catch ( parsedInitialPage ) . parse ( tenantPageFromQuery ) ;
82+
83+ return { tenantPage, handleTenantPageChange} as const ;
84+ }
0 commit comments