UNPKG

@figliolia/react-hooks

Version:

A small collection of simple React Hooks you're probably rewriting on a regular basis

37 lines (36 loc) 1.25 kB
import { useCallback, useEffect, useRef } from "react"; export const useClickOutside = ({ callback, open = true, refCallback = false, }) => { const node = useRef(null); const nodeRef = useRef(null); const ref = useCallback((node) => { nodeRef.current = node; }, []); const getNode = useCallback(() => node.current || nodeRef.current, []); const onClickOutside = useCallback((e) => { const node = getNode(); if (!node) { return; } if (!node.contains(e.target)) { callback(e); } }, [callback, getNode]); useEffect(() => { if (open) { document.addEventListener("click", onClickOutside, { passive: true }); document.addEventListener("focusin", onClickOutside, { passive: true }); } else { document.removeEventListener("click", onClickOutside); document.removeEventListener("focusin", onClickOutside); } return () => { document.removeEventListener("click", onClickOutside); document.removeEventListener("focusin", onClickOutside); }; }, [onClickOutside, open]); if (refCallback) { return ref; } return node; };