close menu when click outside

This commit is contained in:
Luck
2021-03-27 13:51:48 +00:00
parent e790c54b56
commit 8c1c228f82
3 changed files with 69 additions and 57 deletions

View File

@@ -4,6 +4,7 @@ import { gzip } from 'pako';
import history from 'history/browser'; import history from 'history/browser';
import copy from 'copy-to-clipboard'; import copy from 'copy-to-clipboard';
import { MenuButton, Button } from './Menu';
import { languageIds } from '../highlighting'; import { languageIds } from '../highlighting';
import themes from '../style/themes'; import themes from '../style/themes';
@@ -91,62 +92,6 @@ const Section = styled.div`
align-items: center; align-items: center;
`; `;
const Button = styled.div`
cursor: pointer;
height: 100%;
display: flex;
align-items: center;
padding: 0 .25em;
color: inherit;
text-decoration: none;
:hover {
background: ${props => props.theme.highlight};
}
`;
const Menu = styled.ul`
position: absolute;
top: 2em;
margin: 0;
padding: 0;
list-style: none;
background-color: ${props => props.theme.highlight};
> li {
padding: .15em .5em;
}
> li:hover {
background-color: ${props => props.theme.secondary};
}
`;
const MenuButton = ({ label, ids, value, setValue }) => {
const [open, setOpen] = useState(false);
function toggleOpen() {
setOpen(!open);
}
function select(e, id) {
e.stopPropagation();
setOpen(false);
setValue(id);
}
return (
<Button onClick={toggleOpen}>
[{label}: {value}]
{open && (
<Menu>
{ids.map(id => <li key={id} onClick={e => select(e, id)}>{id}</li>)}
</Menu>
)}
</Button>
)
}
function langaugeToContentType(language) { function langaugeToContentType(language) {
if (language === 'json') { if (language === 'json') {
return 'application/json'; return 'application/json';

68
src/components/Menu.js Normal file
View File

@@ -0,0 +1,68 @@
import { useState, useEffect } from 'react';
import styled from 'styled-components';
export const Button = styled.div`
cursor: pointer;
height: 100%;
display: flex;
align-items: center;
padding: 0 .25em;
color: inherit;
text-decoration: none;
:hover {
background: ${props => props.theme.highlight};
}
`;
const Menu = styled.ul`
position: absolute;
top: 2em;
margin: 0;
padding: 0;
list-style: none;
background-color: ${props => props.theme.highlight};
> li {
padding: .15em .5em;
}
> li:hover {
background-color: ${props => props.theme.secondary};
}
`;
export const MenuButton = ({ label, ids, value, setValue }) => {
const [open, setOpen] = useState(false);
useEffect(() => {
if (!open) {
return;
}
const listener = (e) => setOpen(false);
window.addEventListener('click', listener);
return () => window.removeEventListener('click', listener);
}, [open, setOpen]);
function toggleOpen() {
setOpen(!open);
}
function select(e, id) {
e.stopPropagation();
setOpen(false);
setValue(id);
}
return (
<Button onClick={toggleOpen}>
[{label}: {value}]
{open && (
<Menu>
{ids.map(id => <li key={id} onClick={e => select(e, id)}>{id}</li>)}
</Menu>
)}
</Button>
)
}

View File

@@ -36,7 +36,6 @@ export const languageIds = [
'markup', 'markup',
'css', 'css',
'clike', 'clike',
'javascript',
'bash', 'bash',
'diff', 'diff',
'docker', 'docker',