diff --git a/src/useMergedRefs.ts b/src/useMergedRefs.ts new file mode 100644 index 0000000..be42c28 --- /dev/null +++ b/src/useMergedRefs.ts @@ -0,0 +1,41 @@ +import { useMemo } from 'react' + +type CallbackRef = (ref: T | null) => void +type Ref = React.MutableRefObject | CallbackRef + +const toFnRef = (ref?: Ref | null) => + !ref || typeof ref === 'function' + ? ref + : (value: T) => { + ref.current = value + } + +export function mergeRefs(refA?: Ref | null, refB?: Ref | null) { + const a = toFnRef(refA) + const b = toFnRef(refB) + return (value: T | null) => { + if (a) a(value) + if (b) b(value) + } +} + +/** + * Create and returns a single callback ref composed from two other Refs. + * + * ```tsx + * const Button = React.forwardRef((props, ref) => { + * const [element, attachRef] = useCallbackRef(); + * const mergedRef = useMergedRefs(ref, attachRef); + * + * return