import { useMemo } from 'react' type ReactRef = | React.RefCallback | React.MutableRefObject type Ref = ReactRef | null | undefined type Refs = Array> function assignRef(ref: Ref, value: Node | null) { if (ref === null || ref === undefined) { return } if (typeof ref === 'function') { ref(value) return } try { ref.current = value // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { throw new Error(`Cannot assign value '${value}' to ref '${ref}'`) } } function mergeRefs(...refs: Refs) { return (node: Node | null) => { refs.forEach((ref) => { assignRef(ref, node) }) } } export default function useMergeRefs(...refs: Refs) { // eslint-disable-next-line react-hooks/exhaustive-deps return useMemo(() => mergeRefs(...refs), refs) }