import { LegacyRef, MutableRefObject, useMemo } from "react";
/*
* const Component = React.forwardRef((props, ref) => {
* const internalRef = React.useRef();
* const mergedRef = useMergeRefs({ refs: [ref, internalRef] });
* return
;
* });
*/
// TODO deprecate / replace with useMergeRef in next major version - https://monday.monday.com/boards/3532714909/pulses/5657904659
/**
* Returns a single ref callback that merges multiple ref callbacks
* @deprecated - for internal usage - use `useMergeRef` hook instead
* @param refs
*/
export default function useMergeRefs({ refs = [] }: { refs: Array | LegacyRef> }) {
return useMemo(() => {
if (refs.every(ref => ref === null)) return null;
return (node: HTMLElement) => {
refs.forEach(ref => {
if (ref) assignRef(ref, node);
});
};
}, [refs]);
}
function assignRef(ref: MutableRefObject | LegacyRef, value: HTMLElement) {
if (ref === null) return;
if (typeof ref === "function") {
ref(value);
return;
}
try {
// eslint-disable-next-line no-param-reassign
(ref as MutableRefObject).current = value;
} catch (error) {
console.error(error);
throw new Error(`Cannot assign value '${value}' to ref '${ref}'`);
}
}