1
- import React , { useContext , useState , useMemo , useEffect , useCallback } from 'react' ;
1
+ import React , { useContext , useState , useMemo , useEffect , useCallback , useRef } from 'react' ;
2
2
3
3
import Icon from '../../../common/icon/icon' ;
4
4
@@ -9,6 +9,7 @@ import { LoadedLocationsMapContext, MarkedLocationIdContext, GridActiveLocationI
9
9
10
10
const Breadcrumbs = ( ) => {
11
11
const Translator = getTranslator ( ) ;
12
+ const hiddenListWrapperRef = useRef ( ) ;
12
13
const [ , setMarkedLocationId ] = useContext ( MarkedLocationIdContext ) ;
13
14
const [ gridActiveLocationId , setGridActiveLocationId ] = useContext ( GridActiveLocationIdContext ) ;
14
15
const [ loadedLocationsFullMap , dispatchLoadedLocationsAction ] = useContext ( LoadedLocationsMapContext ) ;
@@ -41,6 +42,10 @@ const Breadcrumbs = () => {
41
42
const toggleHiddenListVisible = useCallback ( ( ) => {
42
43
setHiddenListVisible ( ! hiddenListVisible ) ;
43
44
} , [ setHiddenListVisible , hiddenListVisible ] ) ;
45
+ const handleTogglerClick = ( event ) => {
46
+ event . stopPropagation ( ) ;
47
+ toggleHiddenListVisible ( ) ;
48
+ } ;
44
49
const renderHiddenList = ( ) => {
45
50
if ( ! hiddenItems . length ) {
46
51
return null ;
@@ -56,8 +61,8 @@ const Breadcrumbs = () => {
56
61
} ) ;
57
62
58
63
return (
59
- < div className = "c-breadcrumbs__hidden-list-wrapper" >
60
- < button className = { toggleClassNames } onClick = { toggleHiddenListVisible } type = "button" >
64
+ < div ref = { hiddenListWrapperRef } className = "c-breadcrumbs__hidden-list-wrapper" >
65
+ < button className = { toggleClassNames } onClick = { handleTogglerClick } type = "button" >
61
66
< Icon name = "options" extraClasses = "ibexa-icon--small-medium" />
62
67
</ button >
63
68
< ul className = { hiddenListClassNames } >
@@ -88,14 +93,24 @@ const Breadcrumbs = () => {
88
93
} ;
89
94
90
95
useEffect ( ( ) => {
91
- if ( hiddenListVisible ) {
92
- window . document . body . addEventListener ( 'click' , toggleHiddenListVisible , false ) ;
93
- } else {
94
- window . document . body . removeEventListener ( 'click' , toggleHiddenListVisible , false ) ;
96
+ if ( ! hiddenListVisible ) {
97
+ return ;
95
98
}
96
99
97
- return ( ) => window . document . body . removeEventListener ( 'click' , toggleHiddenListVisible , false ) ;
98
- } , [ hiddenListVisible , toggleHiddenListVisible ] ) ;
100
+ const hideHiddenMenuOnClickOutside = ( event ) => {
101
+ const { target } = event ;
102
+
103
+ if ( hiddenListWrapperRef . current ?. contains ( target ) ?? false ) {
104
+ return ;
105
+ }
106
+
107
+ setHiddenListVisible ( false ) ;
108
+ } ;
109
+
110
+ window . document . body . addEventListener ( 'click' , hideHiddenMenuOnClickOutside , false ) ;
111
+
112
+ return ( ) => window . document . body . removeEventListener ( 'click' , hideHiddenMenuOnClickOutside , false ) ;
113
+ } , [ hiddenListVisible , setHiddenListVisible , hiddenListWrapperRef ] ) ;
99
114
100
115
if ( loadedLocationsMap . some ( ( loadedLocation ) => loadedLocation . parentLocationId !== 1 && ! loadedLocation . location ) ) {
101
116
return null ;
0 commit comments