close menu when click outside
This commit is contained in:
@@ -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
68
src/components/Menu.js
Normal 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>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -36,7 +36,6 @@ export const languageIds = [
|
|||||||
'markup',
|
'markup',
|
||||||
'css',
|
'css',
|
||||||
'clike',
|
'clike',
|
||||||
'javascript',
|
|
||||||
'bash',
|
'bash',
|
||||||
'diff',
|
'diff',
|
||||||
'docker',
|
'docker',
|
||||||
|
|||||||
Reference in New Issue
Block a user