@@ -4,6 +4,7 @@ import {Popup, Portal} from '@gravity-ui/uikit';
44import { block } from '../../../utils' ;
55import Foldable from '../../../components/Foldable/Foldable' ;
66import { NavigationItemModel , NavigationDropdownItem , NavigationItemType } from '../../../models' ;
7+ import { ItemColumnName } from '../../constants' ;
78import NavigationItem from '../NavigationItem/NavigationItem' ;
89
910import './MobileNavigation.scss' ;
@@ -46,27 +47,33 @@ const MobileNavigationDropdown: React.FC<MobileNavigationDropdownProps> = ({
4647
4748interface MobileNavigationItemProps
4849 extends Pick < MobileNavigationProps , 'onActiveItemChange' | 'onClose' > {
49- link : NavigationItemModel ;
50+ item : NavigationItemModel ;
51+ column : ItemColumnName ;
5052 index : number ;
51- isActive ?: boolean ;
53+ isOpened ?: boolean ;
54+ activeItemId ?: string ;
5255}
5356
5457const MobileNavigationItem = ( {
55- link ,
58+ item ,
5659 index,
57- isActive,
60+ isOpened,
61+ activeItemId,
5862 onActiveItemChange,
63+ column,
5964 onClose,
6065} : MobileNavigationItemProps ) => {
66+ const id = `${ column } -${ index } ` ;
67+ const isActive = id === activeItemId && isOpened ;
6168 const toggleActive : MouseEventHandler = useCallback (
6269 ( e ) => {
6370 e . stopPropagation ( ) ;
6471
6572 if ( onActiveItemChange ) {
66- onActiveItemChange ( isActive ? - 1 : index ) ;
73+ onActiveItemChange ( isActive ? undefined : ` ${ column } - ${ index } ` ) ;
6774 }
6875 } ,
69- [ isActive , index , onActiveItemChange ] ,
76+ [ onActiveItemChange , isActive , column , index ] ,
7077 ) ;
7178
7279 const onItemClick : MouseEventHandler = useCallback (
@@ -78,16 +85,16 @@ const MobileNavigationItem = ({
7885 ) ;
7986
8087 return (
81- < li key = { index } className = { b ( 'links -item' ) } >
82- { link . type === NavigationItemType . Dropdown ? (
88+ < li key = { index } className = { b ( 'rows -item' ) } >
89+ { item . type === NavigationItemType . Dropdown ? (
8390 < MobileNavigationDropdown
84- data = { link }
91+ data = { item }
8592 onToggle = { toggleActive }
8693 isOpened = { isActive }
8794 onItemClick = { onItemClick }
8895 />
8996 ) : (
90- < NavigationItem data = { link } onClick = { onItemClick } />
97+ < NavigationItem data = { item } onClick = { onItemClick } />
9198 ) }
9299 </ li >
93100 ) ;
@@ -98,43 +105,52 @@ export interface MobileNavigationProps {
98105 isOpened ?: boolean ;
99106 topItems ?: NavigationItemModel [ ] ;
100107 bottomItems ?: NavigationItemModel [ ] ;
101- activeItemIndex : number ;
108+ activeItemId ?: string ;
102109 onClose : ( ) => void ;
103- onActiveItemChange : ( index : number ) => void ;
110+ onActiveItemChange : ( id ?: string ) => void ;
104111}
105112
106113const MobileNavigation : React . FC < MobileNavigationProps > = ( props ) => {
107114 if ( typeof window === 'undefined' ) {
108115 return null ;
109116 }
110117
111- const { isOpened, topItems, bottomItems, activeItemIndex , onActiveItemChange, onClose} = props ;
118+ const { isOpened, topItems, bottomItems, activeItemId , onActiveItemChange, onClose} = props ;
112119
113120 return (
114121 < Portal >
115122 < Foldable key = { topItems ?. length } className = { b ( ) } isOpened = { Boolean ( isOpened ) } >
116123 < div className = { b ( 'wrapper' ) } >
117- < nav >
118- < ul className = { b ( 'links' ) } >
119- { topItems ?. map ( ( link , index ) => {
120- const isActive = index === activeItemIndex ;
121-
122- return (
123- < MobileNavigationItem
124- key = { index }
125- link = { link }
126- index = { index }
127- isActive = { isOpened && isActive }
128- onClose = { onClose }
129- onActiveItemChange = { onActiveItemChange }
130- />
131- ) ;
132- } ) }
124+ < nav className = { b ( 'nav' ) } >
125+ < ul className = { b ( 'rows' ) } >
126+ { topItems ?. map ( ( link , index ) => (
127+ < MobileNavigationItem
128+ key = { index }
129+ item = { link }
130+ column = { ItemColumnName . Top }
131+ index = { index }
132+ isOpened = { isOpened }
133+ activeItemId = { activeItemId }
134+ onClose = { onClose }
135+ onActiveItemChange = { onActiveItemChange }
136+ />
137+ ) ) }
133138 </ ul >
134139 </ nav >
135- { bottomItems ?. map ( ( item ) => (
136- < NavigationItem key = { item . text } data = { item } className = { b ( 'button' ) } />
137- ) ) }
140+ < ul className = { b ( 'rows' ) } >
141+ { bottomItems ?. map ( ( item , index ) => (
142+ < MobileNavigationItem
143+ key = { index }
144+ item = { item }
145+ column = { ItemColumnName . Bottom }
146+ index = { index }
147+ isOpened = { isOpened }
148+ activeItemId = { activeItemId }
149+ onClose = { onClose }
150+ onActiveItemChange = { onActiveItemChange }
151+ />
152+ ) ) }
153+ </ ul >
138154 </ div >
139155 </ Foldable >
140156 </ Portal >
0 commit comments