fix: Submenu auto close

This commit is contained in:
Tom Moor
2020-05-20 23:40:54 -07:00
parent 87020348ce
commit 3487eb7857
2 changed files with 24 additions and 2 deletions

View File

@ -31,6 +31,7 @@ type Props = {
@observer @observer
class DropdownMenu extends React.Component<Props> { class DropdownMenu extends React.Component<Props> {
id: string = `menu${counter++}`; id: string = `menu${counter++}`;
closeTimeout: TimeoutID;
@observable top: ?number; @observable top: ?number;
@observable bottom: ?number; @observable bottom: ?number;
@ -134,6 +135,19 @@ class DropdownMenu extends React.Component<Props> {
this.forceUpdate(); this.forceUpdate();
} }
closeAfterTimeout = (closePortal: () => void) => () => {
if (this.closeTimeout) {
clearTimeout(this.closeTimeout);
}
this.closeTimeout = setTimeout(closePortal, 500);
};
clearCloseTimeout = () => {
if (this.closeTimeout) {
clearTimeout(this.closeTimeout);
}
};
render() { render() {
const { className, hover, label, children } = this.props; const { className, hover, label, children } = this.props;
@ -148,7 +162,11 @@ class DropdownMenu extends React.Component<Props> {
{({ closePortal, openPortal, isOpen, portal }) => ( {({ closePortal, openPortal, isOpen, portal }) => (
<React.Fragment> <React.Fragment>
<Label <Label
onMouseOver={ onMouseMove={hover ? this.clearCloseTimeout : undefined}
onMouseOut={
hover ? this.closeAfterTimeout(closePortal) : undefined
}
onMouseEnter={
hover ? this.handleOpen(openPortal, closePortal) : undefined hover ? this.handleOpen(openPortal, closePortal) : undefined
} }
onClick={ onClick={
@ -178,6 +196,10 @@ class DropdownMenu extends React.Component<Props> {
> >
<Menu <Menu
ref={this.menuRef} ref={this.menuRef}
onMouseMove={hover ? this.clearCloseTimeout : undefined}
onMouseOut={
hover ? this.closeAfterTimeout(closePortal) : undefined
}
onClick={ onClick={
typeof children === 'function' typeof children === 'function'
? undefined ? undefined

View File

@ -82,7 +82,6 @@ class AccountMenu extends React.Component<Props> {
</DropdownMenuItem> </DropdownMenuItem>
<hr /> <hr />
<DropdownMenu <DropdownMenu
hover
position="right" position="right"
style={{ style={{
left: 170, left: 170,
@ -97,6 +96,7 @@ class AccountMenu extends React.Component<Props> {
</ChangeTheme> </ChangeTheme>
</DropdownMenuItem> </DropdownMenuItem>
} }
hover
> >
<DropdownMenuItem <DropdownMenuItem
onClick={() => ui.setTheme('system')} onClick={() => ui.setTheme('system')}