// Copyright 2017-2026 @pezkuwi/react-hooks authors & contributors // SPDX-License-Identifier: Apache-2.0 import type React from 'react'; import { useCallback, useEffect } from 'react'; import { createNamedHook } from './createNamedHook.js'; function isRefClicked (refs: React.RefObject[], e: MouseEvent): boolean { return refs.some((r) => r.current && r.current.contains(e.target as HTMLElement) ); } function useOutsideClickImpl (refs: React.RefObject[], callback: () => void): void { const handleClick = useCallback( (e: MouseEvent): void => { if (refs.length && !isRefClicked(refs, e)) { callback(); } }, [refs, callback] ); useEffect((): () => void => { document.addEventListener('click', handleClick, true); return (): void => { document.removeEventListener('click', handleClick, true); }; }, [handleClick, callback]); } export const useOutsideClick = createNamedHook('useOutsideClick', useOutsideClickImpl);