kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
136 lines (133 loc) • 18.1 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
exports.observeDimensions = observeDimensions;
exports.unobserveDimensions = unobserveDimensions;
exports.useDimensions = useDimensions;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _lodash = _interopRequireDefault(require("lodash.throttle"));
var _react = require("react");
var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill"));
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
var DEFAULT_THROTTLE_DELAY = 100;
// Using a single ResizeObserver for all elements can be 10x
// more performant than using a separate ResizeObserver per element
// https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/z6ienONUb5A/F5-VcUZtBAAJ
var _observerRegistry;
function getObserverRegistry() {
if (_observerRegistry === undefined) {
var callbacks = new Map();
var resizeObserver = new _resizeObserverPolyfill["default"](function (entries, observer) {
var _iterator = _createForOfIteratorHelper(entries),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _callbacks$get;
var entry = _step.value;
(_callbacks$get = callbacks.get(entry.target)) === null || _callbacks$get === void 0 || _callbacks$get(entry, observer);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
});
_observerRegistry = {
subscribe: function subscribe(target, callback) {
if (target instanceof Element) {
resizeObserver.observe(target);
callbacks.set(target, callback);
}
},
unsubscribe: function unsubscribe(target) {
if (target instanceof Element) {
resizeObserver.unobserve(target);
callbacks["delete"](target);
}
}
};
}
return _observerRegistry;
}
function observeDimensions(target, handleResize) {
var throttleDelay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : DEFAULT_THROTTLE_DELAY;
var registry = getObserverRegistry();
var handler = throttleDelay > 0 ? (0, _lodash["default"])(handleResize, throttleDelay) : handleResize;
registry.subscribe(target, function (entry) {
return handler(getSize(target, entry));
});
}
function unobserveDimensions(target) {
var registry = getObserverRegistry();
registry.unsubscribe(target);
}
function getSize(node, entry) {
if (entry.contentRect) {
var _entry$contentRect = entry.contentRect,
width = _entry$contentRect.width,
height = _entry$contentRect.height;
return {
width: width,
height: height
};
}
if (node.getBoundingClientRect) {
var _node$getBoundingClie = node.getBoundingClientRect(),
_width = _node$getBoundingClie.width,
_height = _node$getBoundingClie.height;
return {
width: _width,
height: _height
};
}
return null;
}
/**
* Usage example:
* const [ref, dimensions] = useDimensions<HTMLDivElement>();
*
* @param throttleDelay
* @returns
*/
function useDimensions(nodeRef) {
var _ref2;
var throttleDelay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_THROTTLE_DELAY;
var ref = (0, _react.useRef)(null);
if (nodeRef) {
ref = nodeRef;
}
var _useState = (0, _react.useState)(null),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
size = _useState2[0],
setSize = _useState2[1];
(0, _react.useEffect)(function () {
var _ref = ref || {},
current = _ref.current;
if (!current) {
return;
}
var didUnobserve = false;
observeDimensions(current, function (entry) {
if (didUnobserve) return;
var newSize = getSize(current, entry);
if (newSize) {
// @ts-ignore
setSize(newSize);
}
}, throttleDelay);
return function () {
didUnobserve = true;
unobserveDimensions(current);
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [throttleDelay, (_ref2 = ref) === null || _ref2 === void 0 ? void 0 : _ref2.current]);
return [ref, size];
}
var _default = exports["default"] = useDimensions;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfcmVhY3QiLCJfcmVzaXplT2JzZXJ2ZXJQb2x5ZmlsbCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiciIsImUiLCJ0IiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJvIiwiYSIsInUiLCJjYWxsIiwibmV4dCIsIl9hcnJheUxpa2VUb0FycmF5IiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsImZyb20iLCJ0ZXN0IiwiREVGQVVMVF9USFJPVFRMRV9ERUxBWSIsIl9vYnNlcnZlclJlZ2lzdHJ5IiwiZ2V0T2JzZXJ2ZXJSZWdpc3RyeSIsInVuZGVmaW5lZCIsImNhbGxiYWNrcyIsIk1hcCIsInJlc2l6ZU9ic2VydmVyIiwiUmVzaXplT2JzZXJ2ZXIiLCJlbnRyaWVzIiwib2JzZXJ2ZXIiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIl9jYWxsYmFja3MkZ2V0IiwiZW50cnkiLCJnZXQiLCJ0YXJnZXQiLCJlcnIiLCJzdWJzY3JpYmUiLCJjYWxsYmFjayIsIkVsZW1lbnQiLCJvYnNlcnZlIiwic2V0IiwidW5zdWJzY3JpYmUiLCJ1bm9ic2VydmUiLCJvYnNlcnZlRGltZW5zaW9ucyIsImhhbmRsZVJlc2l6ZSIsInRocm90dGxlRGVsYXkiLCJhcmd1bWVudHMiLCJyZWdpc3RyeSIsImhhbmRsZXIiLCJ0aHJvdHRsZSIsImdldFNpemUiLCJ1bm9ic2VydmVEaW1lbnNpb25zIiwibm9kZSIsImNvbnRlbnRSZWN0IiwiX2VudHJ5JGNvbnRlbnRSZWN0Iiwid2lkdGgiLCJoZWlnaHQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfbm9kZSRnZXRCb3VuZGluZ0NsaWUiLCJ1c2VEaW1lbnNpb25zIiwibm9kZVJlZiIsIl9yZWYyIiwicmVmIiwidXNlUmVmIiwiX3VzZVN0YXRlIiwidXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkyIiwic2l6ZSIsInNldFNpemUiLCJ1c2VFZmZlY3QiLCJfcmVmIiwiY3VycmVudCIsImRpZFVub2JzZXJ2ZSIsIm5ld1NpemUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvb2JzZXJ2ZS1kaW1lbnNpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0aHJvdHRsZSBmcm9tICdsb2Rhc2gudGhyb3R0bGUnO1xuaW1wb3J0IHt1c2VFZmZlY3QsIHVzZVJlZiwgdXNlU3RhdGUsIFJlZk9iamVjdH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlc2l6ZU9ic2VydmVyIGZyb20gJ3Jlc2l6ZS1vYnNlcnZlci1wb2x5ZmlsbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGltZW5zaW9ucyB7XG4gIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyO1xuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xufVxuXG5jb25zdCBERUZBVUxUX1RIUk9UVExFX0RFTEFZID0gMTAwO1xuXG4vLyBVc2luZyBhIHNpbmdsZSBSZXNpemVPYnNlcnZlciBmb3IgYWxsIGVsZW1lbnRzIGNhbiBiZSAxMHhcbi8vIG1vcmUgcGVyZm9ybWFudCB0aGFuIHVzaW5nIGEgc2VwYXJhdGUgUmVzaXplT2JzZXJ2ZXIgcGVyIGVsZW1lbnRcbi8vIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vYS9jaHJvbWl1bS5vcmcvZm9ydW0vIyFtc2cvYmxpbmstZGV2L3o2aWVuT05VYjVBL0Y1LVZjVVp0QkFBSlxubGV0IF9vYnNlcnZlclJlZ2lzdHJ5O1xuXG5mdW5jdGlvbiBnZXRPYnNlcnZlclJlZ2lzdHJ5KCkge1xuICBpZiAoX29ic2VydmVyUmVnaXN0cnkgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcywgb2JzZXJ2ZXIpID0+IHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBjYWxsYmFja3MuZ2V0KGVudHJ5LnRhcmdldCk/LihlbnRyeSwgb2JzZXJ2ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF9vYnNlcnZlclJlZ2lzdHJ5ID0ge1xuICAgICAgc3Vic2NyaWJlKHRhcmdldCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKHRhcmdldCk7XG4gICAgICAgICAgY2FsbGJhY2tzLnNldCh0YXJnZXQsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVuc3Vic2NyaWJlKHRhcmdldCkge1xuICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZSh0YXJnZXQpO1xuICAgICAgICAgIGNhbGxiYWNrcy5kZWxldGUodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIF9vYnNlcnZlclJlZ2lzdHJ5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZURpbWVuc2lvbnMoXG4gIHRhcmdldDogRWxlbWVudCxcbiAgaGFuZGxlUmVzaXplOiAoc2l6ZTogRGltZW5zaW9ucyB8IG51bGwpID0+IHZvaWQsXG4gIHRocm90dGxlRGVsYXkgPSBERUZBVUxUX1RIUk9UVExFX0RFTEFZXG4pIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBnZXRPYnNlcnZlclJlZ2lzdHJ5KCk7XG4gIGNvbnN0IGhhbmRsZXIgPSB0aHJvdHRsZURlbGF5ID4gMCA/IHRocm90dGxlKGhhbmRsZVJlc2l6ZSwgdGhyb3R0bGVEZWxheSkgOiBoYW5kbGVSZXNpemU7XG4gIHJlZ2lzdHJ5LnN1YnNjcmliZSh0YXJnZXQsIGVudHJ5ID0+IGhhbmRsZXIoZ2V0U2l6ZSh0YXJnZXQsIGVudHJ5KSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5vYnNlcnZlRGltZW5zaW9ucyh0YXJnZXQ6IEVsZW1lbnQpIHtcbiAgY29uc3QgcmVnaXN0cnkgPSBnZXRPYnNlcnZlclJlZ2lzdHJ5KCk7XG4gIHJlZ2lzdHJ5LnVuc3Vic2NyaWJlKHRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIGdldFNpemUobm9kZSwgZW50cnkpOiBEaW1lbnNpb25zIHwgbnVsbCB7XG4gIGlmIChlbnRyeS5jb250ZW50UmVjdCkge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IGVudHJ5LmNvbnRlbnRSZWN0O1xuICAgIHJldHVybiB7d2lkdGgsIGhlaWdodH07XG4gIH1cbiAgaWYgKG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge3dpZHRoLCBoZWlnaHR9O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFVzYWdlIGV4YW1wbGU6XG4gKiBjb25zdCBbcmVmLCBkaW1lbnNpb25zXSA9IHVzZURpbWVuc2lvbnM8SFRNTERpdkVsZW1lbnQ+KCk7XG4gKlxuICogQHBhcmFtIHRocm90dGxlRGVsYXlcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VEaW1lbnNpb25zPFQgZXh0ZW5kcyBFbGVtZW50PihcbiAgbm9kZVJlZj86IFJlZk9iamVjdDxUPixcbiAgdGhyb3R0bGVEZWxheSA9IERFRkFVTFRfVEhST1RUTEVfREVMQVlcbik6IFtSZWZPYmplY3Q8VD4sIERpbWVuc2lvbnMgfCBudWxsXSB7XG4gIGxldCByZWYgPSB1c2VSZWY8VD4obnVsbCk7XG4gIGlmIChub2RlUmVmKSB7XG4gICAgcmVmID0gbm9kZVJlZjtcbiAgfVxuICBjb25zdCBbc2l6ZSwgc2V0U2l6ZV0gPSB1c2VTdGF0ZShudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHtjdXJyZW50fSA9IHJlZiB8fCB7fTtcbiAgICBpZiAoIWN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZGlkVW5vYnNlcnZlID0gZmFsc2U7XG4gICAgb2JzZXJ2ZURpbWVuc2lvbnMoXG4gICAgICBjdXJyZW50LFxuICAgICAgZW50cnkgPT4ge1xuICAgICAgICBpZiAoZGlkVW5vYnNlcnZlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IG5ld1NpemUgPSBnZXRTaXplKGN1cnJlbnQsIGVudHJ5KTtcbiAgICAgICAgaWYgKG5ld1NpemUpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgc2V0U2l6ZShuZXdTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRocm90dGxlRGVsYXlcbiAgICApO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkaWRVbm9ic2VydmUgPSB0cnVlO1xuICAgICAgdW5vYnNlcnZlRGltZW5zaW9ucyhjdXJyZW50KTtcbiAgICB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW3Rocm90dGxlRGVsYXksIHJlZj8uY3VycmVudF0pO1xuXG4gIHJldHVybiBbcmVmIGFzIFJlZk9iamVjdDxUPiwgc2l6ZV07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZURpbWVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBR0EsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxP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QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNHLGFBQWFBLENBQzNCQyxPQUFzQixFQUVhO0VBQUEsSUFBQUMsS0FBQTtFQUFBLElBRG5DaEIsYUFBYSxHQUFBQyxTQUFBLENBQUFoRCxNQUFBLFFBQUFnRCxTQUFBLFFBQUF4QixTQUFBLEdBQUF3QixTQUFBLE1BQUczQixzQkFBc0I7RUFFdEMsSUFBSTJDLEdBQUcsR0FBRyxJQUFBQyxhQUFNLEVBQUksSUFBSSxDQUFDO0VBQ3pCLElBQUlILE9BQU8sRUFBRTtJQUNYRSxHQUFHLEdBQUdGLE9BQU87RUFDZjtFQUNBLElBQUFJLFNBQUEsR0FBd0IsSUFBQUMsZUFBUSxFQUFDLElBQUksQ0FBQztJQUFBQyxVQUFBLE9BQUFDLGVBQUEsYUFBQUgsU0FBQTtJQUEvQkksSUFBSSxHQUFBRixVQUFBO0lBQUVHLE9BQU8sR0FBQUgsVUFBQTtFQUVwQixJQUFBSSxnQkFBUyxFQUFDLFlBQU07SUFDZCxJQUFBQyxJQUFBLEdBQWtCVCxHQUFHLElBQUksQ0FBQyxDQUFDO01BQXBCVSxPQUFPLEdBQUFELElBQUEsQ0FBUEMsT0FBTztJQUNkLElBQUksQ0FBQ0EsT0FBTyxFQUFFO01BQ1o7SUFDRjtJQUVBLElBQUlDLFlBQVksR0FBRyxLQUFLO0lBQ3hCOUIsaUJBQWlCLENBQ2Y2QixPQUFPLEVBQ1AsVUFBQXhDLEtBQUssRUFBSTtNQUNQLElBQUl5QyxZQUFZLEVBQUU7TUFDbEIsSUFBTUMsT0FBTyxHQUFHeEIsT0FBTyxDQUFDc0IsT0FBTyxFQUFFeEMsS0FBSyxDQUFDO01BQ3ZDLElBQUkwQyxPQUFPLEVBQUU7UUFDWDtRQUNBTCxPQUFPLENBQUNLLE9BQU8sQ0FBQztNQUNsQjtJQUNGLENBQUMsRUFDRDdCLGFBQ0YsQ0FBQztJQUNELE9BQU8sWUFBTTtNQUNYNEIsWUFBWSxHQUFHLElBQUk7TUFDbkJ0QixtQkFBbUIsQ0FBQ3FCLE9BQU8sQ0FBQztJQUM5QixDQUFDO0lBQ0Q7RUFDRixDQUFDLEVBQUUsQ0FBQzNCLGFBQWEsR0FBQWdCLEtBQUEsR0FBRUMsR0FBRyxjQUFBRCxLQUFBLHVCQUFIQSxLQUFBLENBQUtXLE9BQU8sQ0FBQyxDQUFDO0VBRWpDLE9BQU8sQ0FBQ1YsR0FBRyxFQUFrQk0sSUFBSSxDQUFDO0FBQ3BDO0FBQUMsSUFBQU8sUUFBQSxHQUFBQyxPQUFBLGNBRWNqQixhQUFhIiwiaWdub3JlTGlzdCI6W119
;