Skip to content

Commit c824fa7

Browse files
committed
fix: CSidebarNavDropdown: fix default closing mechanism
1 parent bcec1de commit c824fa7

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

src/template/CSidebarNavDropdown.js

+18-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import React, { useState, useContext, useMemo } from 'react'
1+
import React, {
2+
useState,
3+
useContext,
4+
useEffect,
5+
createRef
6+
} from 'react'
27
import PropTypes from 'prop-types'
38
import classNames from 'classnames'
49
import { CIconRaw } from '@coreui/icons-react'
@@ -22,7 +27,6 @@ export const iconProps = (icon) => {
2227
}
2328

2429
//component - CoreUI / CSidebarNavDropdown
25-
2630
const CSidebarNavDropdown = props => {
2731

2832
const {
@@ -38,21 +42,22 @@ const CSidebarNavDropdown = props => {
3842
...attributes
3943
} = props
4044

41-
const key = useState(Math.random().toString(36).substr(2))[0]
45+
const ref = createRef()
46+
innerRef && innerRef(ref)
4247

4348
const { dropdownMode, openDropdown, setOpenDropdown } = useContext(Context)
4449

4550
const [isOpen, setIsOpen] = useState(show)
46-
useMemo(() => {
51+
useEffect(() => {
4752
setIsOpen(show)
4853
}, [show])
4954

50-
useMemo(() => {
51-
!dropdownMode && openDropdown !== key && setIsOpen(false)
55+
useEffect(() => {
56+
!dropdownMode && (!openDropdown || !ref.current.contains(openDropdown)) && setIsOpen(false)
5257
}, [openDropdown])
5358

5459
const toggle = () => {
55-
!dropdownMode && setOpenDropdown(isOpen ? null : key)
60+
!dropdownMode && setOpenDropdown(isOpen ? null : ref.current)
5661
setIsOpen(!isOpen)
5762
}
5863

@@ -61,7 +66,7 @@ const CSidebarNavDropdown = props => {
6166
path = useLocation().pathname
6267
} catch (e) {}
6368

64-
useMemo(()=>{
69+
useEffect(() => {
6570
if (dropdownMode === 'close') {
6671
setIsOpen(false)
6772
} else if (dropdownMode === 'closeInactive' && route) {
@@ -73,7 +78,6 @@ const CSidebarNavDropdown = props => {
7378

7479

7580
//render
76-
7781
const classes = classNames(
7882
'c-sidebar-nav-dropdown',
7983
isOpen && 'c-show',
@@ -86,7 +90,11 @@ const CSidebarNavDropdown = props => {
8690
)
8791

8892
return (
89-
<li className={classes} {...attributes} ref={innerRef}>
93+
<li
94+
className={classes}
95+
{...attributes}
96+
ref={ref}
97+
>
9098
<a className="c-sidebar-nav-dropdown-toggle" onClick={toggle} >
9199
{ icon && <CIconRaw {...iconProps(icon)} /> }
92100
{ fontIcon && <i className={iconClasses}/> }

0 commit comments

Comments
 (0)