mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-08-08 20:17:31 +00:00
feature: handle outside click
This commit is contained in:
parent
d851e85151
commit
6fbb5837e1
2 changed files with 27 additions and 1 deletions
|
|
@ -7,6 +7,7 @@ import Dropdown from './Dropdown';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import Icon from '@stremio/stremio-icons/react';
|
import Icon from '@stremio/stremio-icons/react';
|
||||||
import styles from './MultiselectMenu.less';
|
import styles from './MultiselectMenu.less';
|
||||||
|
import useOutsideClick from 'stremio/common/useOutsideClick';
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
className?: string,
|
className?: string,
|
||||||
|
|
@ -18,7 +19,7 @@ type Props = {
|
||||||
|
|
||||||
const MultiselectMenu = ({ className, title, options, selectedOption, onSelect }: Props) => {
|
const MultiselectMenu = ({ className, title, options, selectedOption, onSelect }: Props) => {
|
||||||
const [menuOpen, , closeMenu, toggleMenu] = useBinaryState(false);
|
const [menuOpen, , closeMenu, toggleMenu] = useBinaryState(false);
|
||||||
const multiselectMenuRef = React.useRef<HTMLDivElement>(null);
|
const multiselectMenuRef = useOutsideClick(() => closeMenu());
|
||||||
const [level, setLevel] = React.useState<number>(0);
|
const [level, setLevel] = React.useState<number>(0);
|
||||||
|
|
||||||
const onOptionSelect = (event: any) => {
|
const onOptionSelect = (event: any) => {
|
||||||
|
|
|
||||||
25
src/common/useOutsideClick.ts
Normal file
25
src/common/useOutsideClick.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { useEffect, useRef } from 'react';
|
||||||
|
|
||||||
|
const useOutsideClick = (callback: () => void) => {
|
||||||
|
const ref = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleClickOutside = (event: MouseEvent | TouchEvent) => {
|
||||||
|
if (ref.current && !ref.current.contains(event.target as Node)) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener('mouseup', handleClickOutside);
|
||||||
|
document.addEventListener('touchend', handleClickOutside);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener('mouseup', handleClickOutside);
|
||||||
|
document.removeEventListener('touchend', handleClickOutside);
|
||||||
|
};
|
||||||
|
}, [callback]);
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default useOutsideClick;
|
||||||
Loading…
Reference in a new issue