import { Ref, useCallback } from 'react' type PossibleRef = Ref | undefined /** * Set a given ref to a given value * This utility takes care of different types of refs: callback refs and RefObject(s) */ function setRef(ref: PossibleRef, value: T) { if (typeof ref === 'function') { ref(value) } else if (ref !== null && ref !== undefined) { ;(ref as React.MutableRefObject).current = value } } /** * A utility to compose multiple refs together * Accepts callback refs and RefObject(s) */ export function composeRefs(...refs: PossibleRef[]) { return (node: T) => refs.forEach((ref) => setRef(ref, node)) } /** * A custom hook that composes multiple refs * Accepts callback refs and RefObject(s) */ export function useComposedRefs(...refs: PossibleRef[]) { // eslint-disable-next-line react-hooks/exhaustive-deps return useCallback(composeRefs(...refs), refs) }