Skip to content

Commit 6a8d266

Browse files
author
Emily
authored
Merge pull request #555 from primer/details-polyfill
Details polyfill + useEffect linting
2 parents b583571 + 7320bf4 commit 6a8d266

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

package-lock.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@primer/components",
3-
"version": "14.0.0",
3+
"version": "14.1.0",
44
"description": "Primer react components",
55
"main": "dist/index.umd.js",
66
"module": "dist/index.esm.js",
@@ -41,6 +41,7 @@
4141
"@types/styled-system": "5.1.1",
4242
"babel-plugin-macros": "2.4.2",
4343
"classnames": "^2.2.5",
44+
"details-element-polyfill": "2.4.0",
4445
"nanoid": "2.0.0",
4546
"primer-colors": "1.0.1",
4647
"primer-markdown": "3.7.9",

src/Details.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import React, {useState, useEffect, useRef} from 'react'
1+
import React, {useState, useEffect, useCallback, useRef} from 'react'
22
import PropTypes from 'prop-types'
33
import styled from 'styled-components'
44
import {COMMON} from './constants'
55
import 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+
714
const 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

Comments
 (0)