/* eslint-disable react-hooks/exhaustive-deps */ import * as React from "react" type ReactRef = React.Ref | React.MutableRefObject export function assignRef(ref: ReactRef | undefined, value: T) { if (ref == null) return if (typeof ref === "function") { ref(value) return } try { // @ts-ignore ref.current = value } catch (error) { throw new Error(`Cannot assign value '${value}' to ref '${ref}'`) } } /** * React hook that merges react refs into a single memoized function * * @example * import React from "react"; * import { useMergeRefs } from `@hakuna-matata-ui/hooks`; * * const Component = React.forwardRef((props, ref) => { * const internalRef = React.useRef(); * return
; * }); */ export function useMergeRefs(...refs: (ReactRef | undefined)[]) { return React.useMemo(() => { if (refs.every((ref) => ref == null)) { return null } return (node: T) => { refs.forEach((ref) => { if (ref) assignRef(ref, node) }) } }, refs) }