import { Ref, useMemo, RefObject } from "react"; type RefCallback = (instance: T | null) => void; /** * Merges an array of refs into a single memoized callback ref or `null`. * @see https://floating-ui.com/docs/react-utils#usemergerefs */ export function useMergeRefs( refs: Array | undefined>, ): RefCallback | null { return useMemo(() => { if (refs.every((ref) => ref == null)) { return null; } return (value) => { refs.forEach((ref) => { if (typeof ref === "function") { ref(value); } else if (ref != null) { (ref as RefObject).current = value; } }); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, refs); } export function useStrictMergeRefs( refs: Array | undefined>, ): RefCallback { return useMemo(() => { if (refs.every((ref) => ref == null)) { throw new Error("define at least one ref with useMergeRefs"); } return (value) => { refs.forEach((ref) => { if (typeof ref === "function") { ref(value); } else if (ref != null) { (ref as RefObject).current = value; } }); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, refs); }