@navikt/ds-react
Version:
React components from the Norwegian Labour and Welfare Administration.
99 lines • 3.26 kB
JavaScript
import { useRefWithInit } from "./useRefWithInit.js";
export function useMergeRefs(a, b, c, d) {
const forkRef = useRefWithInit((createForkRef)).current;
if (didChange(forkRef, a, b, c, d)) {
update(forkRef, [a, b, c, d]);
}
return forkRef.callback;
}
/**
* Merges an array of refs into a single memoized callback ref or `null`.
*
* If you need to merge a fixed number (up to four) of refs, use `useMergeRefs` instead for better performance.
*/
export function useMergeRefsN(refs) {
const forkRef = useRefWithInit((createForkRef)).current;
if (didChangeN(forkRef, refs)) {
update(forkRef, refs);
}
return forkRef.callback;
}
function createForkRef() {
return {
callback: null,
cleanup: null,
refs: [],
};
}
function didChange(forkRef, a, b, c, d) {
return (forkRef.refs[0] !== a ||
forkRef.refs[1] !== b ||
forkRef.refs[2] !== c ||
forkRef.refs[3] !== d);
}
function didChangeN(forkRef, newRefs) {
return (forkRef.refs.length !== newRefs.length ||
forkRef.refs.some((ref, index) => ref !== newRefs[index]));
}
function update(forkRef, refs) {
forkRef.refs = refs;
if (refs.every((ref) => ref == null)) {
forkRef.callback = null;
return;
}
forkRef.callback = (instance) => {
if (forkRef.cleanup) {
forkRef.cleanup();
forkRef.cleanup = null;
}
if (instance != null) {
const cleanupCallbacks = Array(refs.length).fill(null);
for (let i = 0; i < refs.length; i += 1) {
const ref = refs[i];
if (ref == null) {
continue;
}
switch (typeof ref) {
case "function": {
const refCleanup = ref(instance);
if (typeof refCleanup === "function") {
cleanupCallbacks[i] = refCleanup;
}
break;
}
case "object": {
ref.current = instance;
break;
}
default:
}
}
forkRef.cleanup = () => {
for (let i = 0; i < refs.length; i += 1) {
const ref = refs[i];
if (ref == null) {
continue;
}
switch (typeof ref) {
case "function": {
const cleanupCallback = cleanupCallbacks[i];
if (typeof cleanupCallback === "function") {
cleanupCallback();
}
else {
ref(null);
}
break;
}
case "object": {
ref.current = null;
break;
}
default:
}
}
};
}
};
}
//# sourceMappingURL=useMergeRefs.js.map