* useOnClickRef hook * * This hook runs a callback for both clicks and tap events when the element is clicked or tapped. * * @param {Function} onClick The callback function to run on click or tap * @returns {Function} A callback ref which can be attached to an element
(onClick: () => void)
| 11 | * @returns {Function} A callback ref which can be attached to an element |
| 12 | */ |
| 13 | function useOnClickRef(onClick: () => void) { |
| 14 | const [node, setNode] = useState<HTMLElement | null>(null); |
| 15 | const handleEvent = useCallback( |
| 16 | (event: MouseEvent | TouchEvent) => { |
| 17 | event.preventDefault(); |
| 18 | onClick(); |
| 19 | }, |
| 20 | [onClick] |
| 21 | ); |
| 22 | |
| 23 | const freshCallback = useFreshCallback(handleEvent); |
| 24 | |
| 25 | useEffect(() => { |
| 26 | if (node) { |
| 27 | node.addEventListener("click", freshCallback); |
| 28 | node.addEventListener("touchend", freshCallback); |
| 29 | |
| 30 | return () => { |
| 31 | node.removeEventListener("click", freshCallback); |
| 32 | node.removeEventListener("touchend", freshCallback); |
| 33 | }; |
| 34 | } |
| 35 | return noop; |
| 36 | }, [node, freshCallback]); |
| 37 | |
| 38 | const ref = useCallback((element: HTMLElement) => { |
| 39 | if (element) { |
| 40 | setNode(element); |
| 41 | } |
| 42 | }, []); |
| 43 | |
| 44 | return ref; |
| 45 | } |
| 46 | |
| 47 | export { useOnClickRef }; |
no test coverage detected
searching dependent graphs…