1- import React , { useState , useEffect , useRef } from 'react'
1+ import React , { useState , useEffect , useCallback , useRef } from 'react'
22import PropTypes from 'prop-types'
33import styled from 'styled-components'
44import { COMMON } from './constants'
55import theme from './theme'
66
7+ // The <details> element is not yet supported in Edge so we have to use a polyfill.
8+ // We have to check if window is defined before importing the polyfill
9+ // so the code doesn’t run while pages build
10+ if ( typeof window !== 'undefined' ) {
11+ import ( 'details-element-polyfill' )
12+ }
13+
714const DetailsReset = styled ( 'details' ) `
815 & > summary {
916 list-style: none;
@@ -20,27 +27,30 @@ function DetailsBase({children, overlay, render = getRenderer(children), default
2027 const [ open , setOpen ] = useState ( defaultOpen )
2128 const ref = useRef ( null )
2229
30+ const closeMenu = useCallback (
31+ event => {
32+ // only close the menu if we're clicking outside
33+ if ( event && event . target . closest ( 'details' ) !== ref . current ) {
34+ setOpen ( false )
35+ document . removeEventListener ( 'click' , closeMenu )
36+ }
37+ } ,
38+ [ ref ]
39+ )
40+
2341 useEffect ( ( ) => {
2442 if ( overlay && open ) {
2543 document . addEventListener ( 'click' , closeMenu )
2644 return ( ) => {
2745 document . removeEventListener ( 'click' , closeMenu )
2846 }
2947 }
30- } , [ open , overlay ] )
48+ } , [ open , overlay , closeMenu ] )
3149
3250 function toggle ( event ) {
3351 setOpen ( event . target . open )
3452 }
3553
36- function closeMenu ( event ) {
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- }
42- }
43-
4454 return (
4555 < DetailsReset { ...rest } ref = { ref } open = { open } onToggle = { toggle } overlay = { overlay } >
4656 { render ( { open} ) }
0 commit comments