12345678910111213141516171819202122232425262728293031323334353637383940 |
- import React, { useEffect, useRef } from 'react';
- type Props = {
- onClick: (e: MouseEvent | TouchEvent) => void;
- children: React.ReactNode;
- };
- const ClickAwayListener: React.FC<Props> = ({
- onClick,
- children,
- ...rest
- }: Props) => {
- const node = useRef<HTMLDivElement>(null);
- useEffect(() => {
- const handleClick = (e: MouseEvent | TouchEvent) => {
- if (node.current && node.current.contains(e.target as HTMLElement)) {
- return;
- }
- onClick(e);
- };
- document.addEventListener('mousedown', handleClick);
- document.addEventListener('touchstart', handleClick);
- return () => {
- document.removeEventListener('mousedown', handleClick);
- document.removeEventListener('touchstart', handleClick);
- };
- }, [onClick]);
- return (
- <span ref={node} {...rest}>
- {children}
- </span>
- );
- };
- export default ClickAwayListener;
|