packages/react/src/hooks/useMergeRefs.ts
import * as React from 'react';
/**
* Merges an array of refs into a single memoized callback ref or `null`.
* @see https://floating-ui.com/docs/react-utils#usemergerefs
*/
export function useMergeRefs<Instance>(
refs: Array<React.Ref<Instance> | undefined>,
): React.RefCallback<Instance> | null {
return React.useMemo(() => {
if (refs.every((ref) => ref == null)) {
return null;
}
return (value) => {
refs.forEach((ref) => {
if (typeof ref === 'function') {
ref(value);
} else if (ref != null) {
(ref as React.MutableRefObject<Instance | null>).current = value;
}
});
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, refs);
}