@@ -110,16 +110,6 @@ const MENU = [{
110
110
} ] ,
111
111
} ] ;
112
112
113
- function getMenuNode ( node ) {
114
- if ( ! node || ! node . dataset ) {
115
- return null ;
116
- }
117
- if ( node . dataset . menu ) {
118
- return node ;
119
- }
120
- return getMenuNode ( node . parentNode ) ;
121
- }
122
-
123
113
export default class TopcoderHeader extends React . Component {
124
114
constructor ( props ) {
125
115
super ( props ) ;
@@ -128,7 +118,7 @@ export default class TopcoderHeader extends React.Component {
128
118
this . addGlobalTouchListener = this . addGlobalTouchListener . bind ( this ) ;
129
119
this . removeGlobalTouchListener = this . removeGlobalTouchListener . bind ( this ) ;
130
120
this . closeSearch = this . closeSearch . bind ( this ) ;
131
- this . isChildNodeofHeader = this . isChildNodeofHeader . bind ( this ) ;
121
+ this . getMenuButton = this . getMenuButton . bind ( this ) ;
132
122
133
123
this . listenerRegistered = false ;
134
124
}
@@ -139,27 +129,32 @@ export default class TopcoderHeader extends React.Component {
139
129
this . removeGlobalTouchListener ( ) ;
140
130
}
141
131
142
- globalTouchListener ( event ) {
132
+ getMenuButton ( node ) {
133
+ if ( ! node || ! node . dataset || node === this . headerRoot ) {
134
+ return null ;
135
+ }
136
+ if ( node . dataset . menu ) {
137
+ return node ;
138
+ }
139
+ return this . getMenuButton ( node . parentNode ) ;
140
+ }
141
+
142
+ globalTouchListener ( { target } ) {
143
143
const { closeMenu, searchOpened, openedMenu } = this . props ;
144
144
const closeSearch = this . closeSearch ;
145
- const menuNode = getMenuNode ( event . target ) ;
145
+ const menuButton = this . getMenuButton ( target ) ;
146
146
147
- if ( ! this . isChildNodeofHeader ( event . target ) ) {
148
- closeMenu ( ) ;
147
+ if ( menuButton ) {
148
+ if ( menuButton . dataset . menu === 'search' && openedMenu ) {
149
+ closeMenu ( ) ;
150
+ } else if ( menuButton . dataset . menu !== 'search' && searchOpened ) {
151
+ closeSearch ( ) ;
152
+ }
153
+ } else if ( ! this . headerRoot . contains ( target ) || this . mainMenu . contains ( target ) ) {
149
154
closeSearch ( ) ;
150
- this . removeGlobalTouchListener ( ) ;
151
- } else if ( menuNode . dataset . menu === 'search' && openedMenu ) {
152
155
closeMenu ( ) ;
153
- } else if ( menuNode . dataset . menu !== 'search' && searchOpened ) {
154
- closeSearch ( ) ;
155
- }
156
- }
157
-
158
- isChildNodeofHeader ( node ) {
159
- if ( ! node ) {
160
- return false ;
156
+ this . removeGlobalTouchListener ( ) ;
161
157
}
162
- return node === this . rootNode || this . isChildNodeofHeader ( node . parentNode ) ;
163
158
}
164
159
165
160
addGlobalTouchListener ( ) {
@@ -181,7 +176,6 @@ export default class TopcoderHeader extends React.Component {
181
176
182
177
render ( ) {
183
178
const {
184
- activeNode,
185
179
isMobile,
186
180
activeTrigger,
187
181
closeMenu,
@@ -215,12 +209,11 @@ export default class TopcoderHeader extends React.Component {
215
209
1 + event . pageY < activeTrigger . bottom ) closeMenu ( ) ;
216
210
} }
217
211
onTouchStart = { ( event ) => {
218
- if ( openedMenu && isMobile &&
219
- getMenuNode ( event . target ) . dataset . menu === activeNode ) {
212
+ if ( isMobile && openedMenu && openedMenu . title === item . title ) {
220
213
closeMenu ( ) ;
221
214
this . removeGlobalTouchListener ( ) ;
222
215
} else {
223
- openMenu ( item , getMenuNode ( event . target ) , true ) ;
216
+ openMenu ( item , this . getMenuButton ( event . target ) , true ) ;
224
217
this . addGlobalTouchListener ( ) ;
225
218
}
226
219
} }
@@ -279,11 +272,11 @@ export default class TopcoderHeader extends React.Component {
279
272
1 + event . pageY < activeTrigger . bottom ) closeMenu ( ) ;
280
273
} }
281
274
onTouchStart = { ( event ) => {
282
- if ( openedMenu && isMobile && getMenuNode ( event . target ) . dataset . menu === activeNode ) {
275
+ if ( isMobile && openedMenu && openedMenu . title === userSubMenu . title ) {
283
276
closeMenu ( ) ;
284
277
this . removeGlobalTouchListener ( ) ;
285
278
} else {
286
- openMenu ( userSubMenu , getMenuNode ( event . target ) , true ) ;
279
+ openMenu ( userSubMenu , this . getMenuButton ( event . target ) , true ) ;
287
280
this . addGlobalTouchListener ( ) ;
288
281
}
289
282
} }
@@ -314,22 +307,24 @@ export default class TopcoderHeader extends React.Component {
314
307
< a
315
308
className = "tc-btn-sm tc-btn-primary"
316
309
href = { `${ config . URL . AUTH } /member/registration` }
310
+ onClick = { closeMenu }
317
311
> Join</ a >
318
312
< a
319
313
className = "tc-btn-sm tc-btn-default"
320
314
href = { `${ config . URL . AUTH } /member` }
315
+ onClick = { closeMenu }
321
316
> Log In</ a >
322
317
</ div >
323
318
) ;
324
319
}
325
320
326
321
return (
327
- < div styleName = "header" ref = { ( root ) => { this . rootNode = root ; } } >
322
+ < div styleName = "header" ref = { ( div ) => { this . headerRoot = div ; } } >
328
323
< div styleName = "main-desktop-header" >
329
324
< a href = { BASE_URL } styleName = "logo" >
330
325
< LogoTopcoderWithName height = { 53 } width = { 135 } />
331
326
</ a >
332
- < ul styleName = "main-menu" >
327
+ < ul styleName = "main-menu" ref = { ( ul ) => { this . mainMenu = ul ; } } >
333
328
{ mainMenu }
334
329
</ ul >
335
330
< div styleName = "right-menu" >
@@ -344,11 +339,11 @@ export default class TopcoderHeader extends React.Component {
344
339
1 + event . pageY < activeTrigger . bottom ) closeSearch ( ) ;
345
340
} }
346
341
onTouchStart = { ( event ) => {
347
- if ( searchOpened && isMobile ) {
342
+ if ( isMobile && searchOpened ) {
348
343
closeSearch ( ) ;
349
344
this . removeGlobalTouchListener ( ) ;
350
345
} else {
351
- openSearch ( getMenuNode ( event . target ) , true ) ;
346
+ openSearch ( this . getMenuButton ( event . target ) , true ) ;
352
347
this . addGlobalTouchListener ( ) ;
353
348
}
354
349
} }
@@ -407,12 +402,10 @@ TopcoderHeader.defaultProps = {
407
402
openedMenu : null ,
408
403
profile : null ,
409
404
searchOpened : false ,
410
- activeNode : null ,
411
405
isMobile : false ,
412
406
} ;
413
407
414
408
TopcoderHeader . propTypes = {
415
- activeNode : PT . string ,
416
409
isMobile : PT . bool ,
417
410
activeTrigger : PT . shape ( {
418
411
bottom : PT . number . isRequired ,
0 commit comments