| import { MutableRefObject, useEffect, useRef } from "react"; | |
| export function generateUUID() { | |
| // Public Domain/MIT | |
| var d = new Date().getTime(); //Timestamp | |
| var d2 = | |
| (typeof performance !== "undefined" && | |
| performance.now && | |
| performance.now() * 1000) || | |
| 0; //Time in microseconds since page-load or 0 if unsupported | |
| return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { | |
| var r = Math.random() * 16; //random number between 0 and 16 | |
| if (d > 0) { | |
| //Use timestamp until depleted | |
| r = (d + r) % 16 | 0; | |
| d = Math.floor(d / 16); | |
| } else { | |
| //Use microseconds since page-load if supported | |
| r = (d2 + r) % 16 | 0; | |
| d2 = Math.floor(d2 / 16); | |
| } | |
| return (c === "x" ? r : (r & 0x3) | 0x8).toString(16); | |
| }); | |
| } | |
| export const useClickOutside = ( | |
| elementRefs: MutableRefObject<HTMLElement | null>[], | |
| callback: (event: Event) => void | |
| ): void => { | |
| const callbackRef = useRef(callback); | |
| callbackRef.current = callback; | |
| useEffect(() => { | |
| const handleClickOutside = (event: Event): void => { | |
| if ( | |
| elementRefs.every( | |
| (elementRef) => !elementRef.current?.contains(event.target as Node) | |
| ) | |
| ) { | |
| callbackRef.current?.(event); | |
| } | |
| }; | |
| document.addEventListener("click", handleClickOutside, true); | |
| return () => | |
| document.removeEventListener("click", handleClickOutside, true); | |
| }, [elementRefs]); | |
| }; | |