fix: Submenu auto close
This commit is contained in:
@ -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
|
||||||
|
@ -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')}
|
||||||
|
Reference in New Issue
Block a user