1- import React , { useState , useEffect } from 'react'
1+ import React , { useState , useEffect , useRef } from 'react'
22import PropTypes from 'prop-types'
33import styled from 'styled-components'
44import { COMMON } from './constants'
@@ -18,29 +18,31 @@ function getRenderer(children) {
1818
1919function DetailsBase ( { children, overlay, render = getRenderer ( children ) , defaultOpen = false , ...rest } ) {
2020 const [ open , setOpen ] = useState ( defaultOpen )
21+ const ref = useRef ( null )
2122
22- useEffect (
23- ( ) => {
24- if ( overlay && open ) {
25- document . addEventListener ( 'click' , closeMenu )
26- return ( ) => {
27- document . removeEventListener ( 'click' , closeMenu )
28- }
23+ useEffect ( ( ) => {
24+ if ( overlay && open ) {
25+ document . addEventListener ( 'click' , closeMenu )
26+ return ( ) => {
27+ document . removeEventListener ( 'click' , closeMenu )
2928 }
30- } ,
31- [ open , overlay ]
32- )
29+ }
30+ } , [ open , overlay ] )
3331
3432 function toggle ( event ) {
3533 setOpen ( event . target . open )
3634 }
3735
3836 function closeMenu ( event ) {
39- setOpen ( false )
37+ // only close the menu if we're clicking outside
38+ if ( event && event . target . closest ( 'details' ) !== ref . current ) {
39+ setOpen ( false )
40+ document . removeEventListener ( 'click' , closeMenu )
41+ }
4042 }
4143
4244 return (
43- < DetailsReset { ...rest } open = { open } onToggle = { toggle } overlay = { overlay } >
45+ < DetailsReset { ...rest } ref = { ref } open = { open } onToggle = { toggle } overlay = { overlay } >
4446 { render ( { open} ) }
4547 </ DetailsReset >
4648 )
0 commit comments