diff --git a/src/hooks/useNcId.ts b/src/hooks/useNcId.ts new file mode 100644 index 0000000..e9dfdf4 --- /dev/null +++ b/src/hooks/useNcId.ts @@ -0,0 +1,6 @@ +import { useId } from "react"; + +export default function useNcId(pre = "nc"): string { + const id = useId(); + return `${pre}_${id.replace(/:/g, "_")}`; +} diff --git a/src/hooks/useOutsideAlerter.ts b/src/hooks/useOutsideAlerter.ts new file mode 100644 index 0000000..35e3f2e --- /dev/null +++ b/src/hooks/useOutsideAlerter.ts @@ -0,0 +1,31 @@ +"use client"; +import "client-only"; + +import { useEffect } from "react"; + +/** + * Hook that alerts clicks outside of the passed ref + */ +function useOutsideAlerter( + ref: React.RefObject, + handleClickOutsideCallback: () => void +) { + useEffect(() => { + /** + * Alert if clicked on outside of element + */ + function handleClickOutside(event: MouseEvent) { + if (ref.current && !ref.current.contains(event.target as Node)) { + handleClickOutsideCallback(); + } + } + // Bind the event listener + document.addEventListener("mousedown", handleClickOutside); + return () => { + // Unbind the event listener on clean up + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [ref]); // eslint-disable-line react-hooks/exhaustive-deps +} + +export default useOutsideAlerter;