UNPKG

@navikt/ds-react

Version:

React components from the Norwegian Labour and Welfare Administration.

103 lines 3.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useMergeRefs = useMergeRefs; exports.useMergeRefsN = useMergeRefsN; const useRefWithInit_1 = require("./useRefWithInit"); function useMergeRefs(a, b, c, d) { const forkRef = (0, useRefWithInit_1.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. */ function useMergeRefsN(refs) { const forkRef = (0, useRefWithInit_1.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