@@ -9,11 +9,16 @@ import {block} from '../utils/cn';
9
9
10
10
import { Burger } from './Burger/Burger' ;
11
11
import { BurgerMenu , BurgerMenuInnerProps } from './BurgerMenu/BurgerMenu' ;
12
+ import {
13
+ OverlapPanelProps as CommonOverlapPanelProps ,
14
+ OverlapPanel ,
15
+ } from './OverlapPanel/OverlapPanel' ;
12
16
import {
13
17
BURGER_PANEL_ITEM_ID ,
14
18
MOBILE_HEADER_COMPACT_HEIGHT ,
15
19
MOBILE_HEADER_EVENT_NAMES ,
16
20
MOBILE_HEADER_EXPANDED_HEIGHT ,
21
+ OVERLAP_PANEL_ITEM_ID ,
17
22
} from './constants' ;
18
23
import i18n from './i18n' ;
19
24
import { MobileHeaderEvent , MobileHeaderEventOptions , MobileMenuItem } from './types' ;
@@ -28,11 +33,14 @@ interface BurgerMenuProps extends Omit<BurgerMenuInnerProps, 'renderFooter'> {
28
33
renderFooter ?: ( data : { size : number ; isCompact : boolean } ) => React . ReactNode ;
29
34
}
30
35
36
+ type OverlapPanelProps = Omit < CommonOverlapPanelProps , 'onClose' | 'visible' > ;
37
+
31
38
interface PanelItem extends Omit < DrawerItemProps , 'visible' > { }
32
39
33
40
export interface MobileHeaderProps {
34
41
logo : LogoProps ;
35
42
burgerMenu : BurgerMenuProps ;
43
+ overlapPanel ?: OverlapPanelProps ;
36
44
burgerCloseTitle ?: string ;
37
45
burgerOpenTitle ?: string ;
38
46
panelItems ?: PanelItem [ ] ;
@@ -58,12 +66,14 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
58
66
onEvent,
59
67
className,
60
68
contentClassName,
69
+ overlapPanel,
61
70
} ,
62
71
ref ,
63
72
) : React . ReactElement => {
64
73
const targetRef = useForwardRef < HTMLDivElement > ( ref ) ;
65
74
const [ compact ] = useState ( true ) ;
66
75
const [ visiblePanel , setVisiblePanel ] = useState < PanelName > ( null ) ;
76
+ const [ overlapPanelVisible , setOverlapPanelVisible ] = useState ( false ) ;
67
77
68
78
// for expand top panel cases (i.e. switch service panel). Will be removed if not used in future design
69
79
const size = compact ? MOBILE_HEADER_COMPACT_HEIGHT : MOBILE_HEADER_EXPANDED_HEIGHT ;
@@ -84,6 +94,8 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
84
94
85
95
return panelOpen ? null : name ;
86
96
} ) ;
97
+
98
+ setOverlapPanelVisible ( false ) ;
87
99
} ,
88
100
[ onEvent ] ,
89
101
) ;
@@ -102,6 +114,7 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
102
114
if ( typeof detail ?. panelName === 'string' ) {
103
115
onEvent ?.( detail ?. panelName , MOBILE_HEADER_EVENT_NAMES . openEvent ) ;
104
116
setVisiblePanel ( detail ?. panelName ) ;
117
+ setOverlapPanelVisible ( false ) ;
105
118
}
106
119
} ,
107
120
[ onEvent ] ,
@@ -112,6 +125,7 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
112
125
if ( typeof detail ?. panelName === 'string' ) {
113
126
onEvent ?.( detail ?. panelName , MOBILE_HEADER_EVENT_NAMES . closeEvent ) ;
114
127
setVisiblePanel ( null ) ;
128
+ setOverlapPanelVisible ( false ) ;
115
129
}
116
130
} ,
117
131
[ onEvent ] ,
@@ -127,6 +141,16 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
127
141
setVisiblePanel ( null ) ;
128
142
} , [ onEvent ] ) ;
129
143
144
+ const onOverlapOpen = useCallback ( ( ) => {
145
+ onEvent ?.( OVERLAP_PANEL_ITEM_ID , MOBILE_HEADER_EVENT_NAMES . openEvent ) ;
146
+ setOverlapPanelVisible ( true ) ;
147
+ } , [ onEvent ] ) ;
148
+
149
+ const onOverlapClose = useCallback ( ( ) => {
150
+ onEvent ?.( OVERLAP_PANEL_ITEM_ID , MOBILE_HEADER_EVENT_NAMES . closeEvent ) ;
151
+ setOverlapPanelVisible ( false ) ;
152
+ } , [ onEvent ] ) ;
153
+
130
154
const onCloseDrawer = useCallback ( ( ) => {
131
155
if ( visiblePanel ) {
132
156
onEvent ?.( visiblePanel , MOBILE_HEADER_EVENT_NAMES . closeEvent ) ;
@@ -185,6 +209,9 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
185
209
node . addEventListener ( 'MOBILE_BURGER_OPEN' , onBurgerOpen ) ;
186
210
node . addEventListener ( 'MOBILE_BURGER_CLOSE' , onBurgerClose ) ;
187
211
212
+ node . addEventListener ( 'MOBILE_OVERLAP_PANEL_OPEN' , onOverlapOpen ) ;
213
+ node . addEventListener ( 'MOBILE_OVERLAP_PANEL_CLOSE' , onOverlapClose ) ;
214
+
188
215
node . addEventListener (
189
216
'MOBILE_PANEL_TOGGLE' ,
190
217
onMobilePanelToggle as unknown as EventListener ,
@@ -204,6 +231,9 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
204
231
node . removeEventListener ( 'MOBILE_BURGER_OPEN' , onBurgerOpen ) ;
205
232
node . removeEventListener ( 'MOBILE_BURGER_CLOSE' , onBurgerClose ) ;
206
233
234
+ node . removeEventListener ( 'MOBILE_OVERLAP_PANEL_OPEN' , onOverlapOpen ) ;
235
+ node . removeEventListener ( 'MOBILE_OVERLAP_PANEL_CLOSE' , onOverlapClose ) ;
236
+
207
237
node . removeEventListener (
208
238
'MOBILE_PANEL_TOGGLE' ,
209
239
onMobilePanelToggle as unknown as EventListener ,
@@ -225,6 +255,8 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
225
255
onMobilePanelToggle ,
226
256
onMobilePanelOpen ,
227
257
onMobilePanelClose ,
258
+ onOverlapOpen ,
259
+ onOverlapClose ,
228
260
] ) ;
229
261
230
262
return (
@@ -257,7 +289,17 @@ export const MobileHeader = React.forwardRef<HTMLDivElement, MobileHeaderProps>(
257
289
/>
258
290
) ) }
259
291
</ Drawer >
260
-
292
+ { overlapPanel && (
293
+ < OverlapPanel
294
+ topOffset = { size }
295
+ className = { b ( 'overlap-panel' ) }
296
+ title = { overlapPanel . title }
297
+ onClose = { onOverlapClose }
298
+ action = { overlapPanel . action }
299
+ visible = { overlapPanelVisible }
300
+ renderContent = { overlapPanel . renderContent }
301
+ />
302
+ ) }
261
303
< Content
262
304
size = { size }
263
305
renderContent = { renderContent }
0 commit comments