@kcirtaptrick/framer-motion
Version:
A simple and powerful React animation library
53 lines (50 loc) • 1.92 kB
JavaScript
import { __rest, __assign } from 'tslib';
/**
* Map an IntersectionHandler callback to an element. We only ever make one handler for one
* element, so even though these handlers might all be triggered by different
* observers, we can keep them in the same map.
*/
var observerCallbacks = new WeakMap();
/**
* Multiple observers can be created for multiple element/document roots. Each with
* different settings. So here we store dictionaries of observers to each root,
* using serialised settings (threshold/margin) as lookup keys.
*/
var observers = new WeakMap();
var fireObserverCallback = function (entry) {
var _a;
(_a = observerCallbacks.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);
};
var fireAllObserverCallbacks = function (entries) {
entries.forEach(fireObserverCallback);
};
function initIntersectionObserver(_a) {
var root = _a.root, options = __rest(_a, ["root"]);
var lookupRoot = root || document;
/**
* If we don't have an observer lookup map for this root, create one.
*/
if (!observers.has(lookupRoot)) {
observers.set(lookupRoot, {});
}
var rootObservers = observers.get(lookupRoot);
var key = JSON.stringify(options);
/**
* If we don't have an observer for this combination of root and settings,
* create one.
*/
if (!rootObservers[key]) {
rootObservers[key] = new IntersectionObserver(fireAllObserverCallbacks, __assign({ root: root }, options));
}
return rootObservers[key];
}
function observeIntersection(element, options, callback) {
var rootInteresectionObserver = initIntersectionObserver(options);
observerCallbacks.set(element, callback);
rootInteresectionObserver.observe(element);
return function () {
observerCallbacks.delete(element);
rootInteresectionObserver.unobserve(element);
};
}
export { observeIntersection };