feature: handle outside click

This commit is contained in:
Timothy Z. 2024-07-25 11:53:46 +03:00
parent d851e85151
commit 6fbb5837e1
2 changed files with 27 additions and 1 deletions

View file

@ -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) => {

View 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;