import type { MutableRefObject, Ref, RefCallback } from 'react'; import { useCallback } from 'react'; const isRefCallback = (x: unknown): x is RefCallback => typeof x === 'function'; const isMutableRefObject = (x: unknown): x is MutableRefObject => typeof x === 'object'; export const setRef = (ref: Ref | undefined, refValue: T) => { if (isRefCallback(ref)) { ref(refValue); return; } if (isMutableRefObject(ref)) { ref.current = refValue; } }; // TODO: backport to fuselage-hooks /** * Merges multiple refs into a single ref callback * * @param refs The refs to merge. * @returns The merged ref callback. */ export const useMergedRefsV2 = (...refs: (Ref | undefined)[]): RefCallback => { return useCallback((refValue: T) => { refs.forEach((ref) => setRef(ref, refValue)); // eslint-disable-next-line react-hooks/exhaustive-deps }, refs); };