UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

173 lines (164 loc) 17.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.wrapTo = exports.unwrap = exports.isForwardAction = exports.getActionForwardAddress = exports.forwardTo = exports._updateProperty = exports._actionFor = exports.FORWARD = exports.ADDRESS_PREFIX = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _lodash = _interopRequireDefault(require("lodash.curry")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project var FORWARD = exports.FORWARD = '@redux-forward/FORWARD'; var ADDRESS_PREFIX = exports.ADDRESS_PREFIX = '@@KG_'; var getActionForwardAddress = exports.getActionForwardAddress = function getActionForwardAddress(id) { return "".concat(ADDRESS_PREFIX).concat(id.toUpperCase()); }; /** * Wrap an action into a forward action that only modify the state of a specific * kepler.gl instance. kepler.gl reducer will look for signatures in the action to * determine whether it needs to be forwarded to a specific instance reducer. * * wrapTo can be curried. You can create a curried action wrapper by only supply the `id` argument * * A forward action looks like this * ```js * { * type: "@@kepler.gl/LAYER_CONFIG_CHANGE", * payload: { * type: '@@kepler.gl/LAYER_CONFIG_CHANGE', * payload: {}, * meta: { * // id of instance * _id_: id * // other meta * } * }, * meta: { * _forward_: '@redux-forward/FORWARD', * _addr_: '@@KG_id' * } * }; * ``` * * @memberof forwardActions * @param {string} id - The id to forward to * @param {Object} action - the action object {type: string, payload: *} * @returns {{type: string, payload: {type: string, payload: *, meta: {_id_: string}, meta: {_forward_: string, _addr_: string}}}} * @public * @example * * import {wrapTo, togglePerspective} from 'kepler.gl/actions'; * * // This action will only dispatch to the KeplerGl instance with `id: map_1` * this.props.dispatch(wrapTo('map_1', togglePerspective())); * * // You can also create a curried action for each instance * const wrapToMap1 = wrapTo('map_1'); * this.props.dispatch(wrapToMap1(togglePerspective())); */ var wrapTo = exports.wrapTo = (0, _lodash["default"])(function (id, action) { return { // keep original action.type type: action.type, // actual action payload: _objectSpread(_objectSpread({}, action), {}, { meta: _objectSpread(_objectSpread({}, action.meta), {}, { _id_: id }) }), // add forward signature to meta meta: _objectSpread(_objectSpread({}, action.meta || {}), {}, { _forward_: FORWARD, _addr_: getActionForwardAddress(id) }) }; }); /** * Whether an action is a forward action * @memberof forwardActions * @param {Object} action - the action object * @returns {boolean} boolean - whether the action is a forward action * @public */ var isForwardAction = exports.isForwardAction = function isForwardAction(action) { return Boolean(action && action.meta && action.meta._forward_ === FORWARD); }; /** * Unwrap an action * @memberof forwardActions * @param {Object} action - the action object * @returns {Object} - unwrapped action * @public */ var _unwrap = exports.unwrap = function unwrap(action) { return isForwardAction(action) ? _unwrap(action.payload) : action; }; /** * Given an id, returns the action for that id. * If the action is not a forward action, return the action * @memberof forwardActions * @param {String} id * @param {Object} action * @private */ var _actionFor = exports._actionFor = function _actionFor(id, action) { return isForwardAction(action) ? action.meta._addr_ === getActionForwardAddress(id) ? action.payload : {} : action; }; /** * Returns an action dispatcher that wraps and forwards the actions to a specific instance * @memberof forwardActions * @param {string} id - instance id * @param {Function} dispatch - action dispatcher * @public * @example * * // action and forward dispatcher * import {toggleSplitMap, forwardTo} from 'kepler.gl/actions'; * import {connect} from 'react-redux'; * * const MapContainer = props => ( * <div> * <button onClick={() => props.keplerGlDispatch(toggleSplitMap())}/> * </div> * ) * * const mapDispatchToProps = (dispatch, props) => ({ * dispatch, * keplerGlDispatch: forwardTo(‘foo’, dispatch) * }); * * export default connect( * state => state, * mapDispatchToProps * )(MapContainer); */ var forwardTo = exports.forwardTo = function forwardTo(id, dispatch) { return function (action) { return dispatch(wrapTo(id, action)); }; }; /** * Update the state of a kepler.gl instance * @memberof forwardActions * @param {Object} state * @param {string} id * @param {Object} nextState * @private */ var _updateProperty = exports._updateProperty = function _updateProperty(state, id, nextState) { return state[id] === nextState ? state : _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, id, nextState)); }; /** * This declaration is needed to group actions in docs */ /** * A set of helpers to forward dispatch actions to a specific instance reducer * @public */ /* eslint-disable @typescript-eslint/no-unused-vars */ // @ts-ignore var forwardActions = null; /* eslint-enable @typescript-eslint/no-unused-vars */ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkZPUldBUkQiLCJleHBvcnRzIiwiQUREUkVTU19QUkVGSVgiLCJnZXRBY3Rpb25Gb3J3YXJkQWRkcmVzcyIsImlkIiwiY29uY2F0IiwidG9VcHBlckNhc2UiLCJ3cmFwVG8iLCJjdXJyeSIsImFjdGlvbiIsInR5cGUiLCJwYXlsb2FkIiwibWV0YSIsIl9pZF8iLCJfZm9yd2FyZF8iLCJfYWRkcl8iLCJpc0ZvcndhcmRBY3Rpb24iLCJCb29sZWFuIiwidW53cmFwIiwiX2FjdGlvbkZvciIsImZvcndhcmRUbyIsImRpc3BhdGNoIiwiX3VwZGF0ZVByb3BlcnR5Iiwic3RhdGUiLCJuZXh0U3RhdGUiLCJmb3J3YXJkQWN0aW9ucyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9hY3Rpb24td3JhcHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5leHBvcnQgY29uc3QgRk9SV0FSRCA9ICdAcmVkdXgtZm9yd2FyZC9GT1JXQVJEJztcbmV4cG9ydCBjb25zdCBBRERSRVNTX1BSRUZJWCA9ICdAQEtHXyc7XG5cbmltcG9ydCBjdXJyeSBmcm9tICdsb2Rhc2guY3VycnknO1xuXG5leHBvcnQgY29uc3QgZ2V0QWN0aW9uRm9yd2FyZEFkZHJlc3MgPSBpZCA9PiBgJHtBRERSRVNTX1BSRUZJWH0ke2lkLnRvVXBwZXJDYXNlKCl9YDtcblxuLyoqXG4gKiBXcmFwIGFuIGFjdGlvbiBpbnRvIGEgZm9yd2FyZCBhY3Rpb24gdGhhdCBvbmx5IG1vZGlmeSB0aGUgc3RhdGUgb2YgYSBzcGVjaWZpY1xuICoga2VwbGVyLmdsIGluc3RhbmNlLiBrZXBsZXIuZ2wgcmVkdWNlciB3aWxsIGxvb2sgZm9yIHNpZ25hdHVyZXMgaW4gdGhlIGFjdGlvbiB0b1xuICogZGV0ZXJtaW5lIHdoZXRoZXIgaXQgbmVlZHMgdG8gYmUgZm9yd2FyZGVkIHRvIGEgc3BlY2lmaWMgaW5zdGFuY2UgcmVkdWNlci5cbiAqXG4gKiB3cmFwVG8gY2FuIGJlIGN1cnJpZWQuIFlvdSBjYW4gY3JlYXRlIGEgY3VycmllZCBhY3Rpb24gd3JhcHBlciBieSBvbmx5IHN1cHBseSB0aGUgYGlkYCBhcmd1bWVudFxuICpcbiAqIEEgZm9yd2FyZCBhY3Rpb24gbG9va3MgbGlrZSB0aGlzXG4gKiBgYGBqc1xuICogIHtcbiAqICAgIHR5cGU6IFwiQEBrZXBsZXIuZ2wvTEFZRVJfQ09ORklHX0NIQU5HRVwiLFxuICogICAgcGF5bG9hZDoge1xuICogICAgICB0eXBlOiAnQEBrZXBsZXIuZ2wvTEFZRVJfQ09ORklHX0NIQU5HRScsXG4gKiAgICAgIHBheWxvYWQ6IHt9LFxuICogICAgICBtZXRhOiB7XG4gKiAgICAgICAvLyBpZCBvZiBpbnN0YW5jZVxuICogICAgICAgIF9pZF86IGlkXG4gKiAgICAgICAvLyBvdGhlciBtZXRhXG4gKiAgICAgIH1cbiAqICAgIH0sXG4gKiAgICBtZXRhOiB7XG4gKiAgICAgIF9mb3J3YXJkXzogJ0ByZWR1eC1mb3J3YXJkL0ZPUldBUkQnLFxuICogICAgICBfYWRkcl86ICdAQEtHX2lkJ1xuICogICAgfVxuICogIH07XG4gKiBgYGBcbiAqXG4gKiBAbWVtYmVyb2YgZm9yd2FyZEFjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIFRoZSBpZCB0byBmb3J3YXJkIHRvXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIC0gdGhlIGFjdGlvbiBvYmplY3Qge3R5cGU6IHN0cmluZywgcGF5bG9hZDogKn1cbiAqIEByZXR1cm5zIHt7dHlwZTogc3RyaW5nLCBwYXlsb2FkOiB7dHlwZTogc3RyaW5nLCBwYXlsb2FkOiAqLCBtZXRhOiB7X2lkXzogc3RyaW5nfSwgbWV0YToge19mb3J3YXJkXzogc3RyaW5nLCBfYWRkcl86IHN0cmluZ319fX1cbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IHt3cmFwVG8sIHRvZ2dsZVBlcnNwZWN0aXZlfSBmcm9tICdrZXBsZXIuZ2wvYWN0aW9ucyc7XG4gKlxuICogLy8gVGhpcyBhY3Rpb24gd2lsbCBvbmx5IGRpc3BhdGNoIHRvIHRoZSBLZXBsZXJHbCBpbnN0YW5jZSB3aXRoIGBpZDogbWFwXzFgXG4gKiB0aGlzLnByb3BzLmRpc3BhdGNoKHdyYXBUbygnbWFwXzEnLCB0b2dnbGVQZXJzcGVjdGl2ZSgpKSk7XG4gKlxuICogLy8gWW91IGNhbiBhbHNvIGNyZWF0ZSBhIGN1cnJpZWQgYWN0aW9uIGZvciBlYWNoIGluc3RhbmNlXG4gKiBjb25zdCB3cmFwVG9NYXAxID0gd3JhcFRvKCdtYXBfMScpO1xuICogdGhpcy5wcm9wcy5kaXNwYXRjaCh3cmFwVG9NYXAxKHRvZ2dsZVBlcnNwZWN0aXZlKCkpKTtcbiAqL1xuZXhwb3J0IGNvbnN0IHdyYXBUbyA9IGN1cnJ5KChpZCwgYWN0aW9uKSA9PiAoe1xuICAvLyBrZWVwIG9yaWdpbmFsIGFjdGlvbi50eXBlXG4gIHR5cGU6IGFjdGlvbi50eXBlLFxuXG4gIC8vIGFjdHVhbCBhY3Rpb25cbiAgcGF5bG9hZDoge1xuICAgIC4uLmFjdGlvbixcbiAgICBtZXRhOiB7XG4gICAgICAuLi5hY3Rpb24ubWV0YSxcbiAgICAgIF9pZF86IGlkXG4gICAgfVxuICB9LFxuXG4gIC8vIGFkZCBmb3J3YXJkIHNpZ25hdHVyZSB0byBtZXRhXG4gIG1ldGE6IHtcbiAgICAuLi4oYWN0aW9uLm1ldGEgfHwge30pLFxuICAgIF9mb3J3YXJkXzogRk9SV0FSRCxcbiAgICBfYWRkcl86IGdldEFjdGlvbkZvcndhcmRBZGRyZXNzKGlkKVxuICB9XG59KSk7XG5cbi8qKlxuICogV2hldGhlciBhbiBhY3Rpb24gaXMgYSBmb3J3YXJkIGFjdGlvblxuICogQG1lbWJlcm9mIGZvcndhcmRBY3Rpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIC0gdGhlIGFjdGlvbiBvYmplY3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBib29sZWFuIC0gd2hldGhlciB0aGUgYWN0aW9uIGlzIGEgZm9yd2FyZCBhY3Rpb25cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRm9yd2FyZEFjdGlvbiA9IGFjdGlvbiA9PiB7XG4gIHJldHVybiBCb29sZWFuKGFjdGlvbiAmJiBhY3Rpb24ubWV0YSAmJiBhY3Rpb24ubWV0YS5fZm9yd2FyZF8gPT09IEZPUldBUkQpO1xufTtcblxuLyoqXG4gKiBVbndyYXAgYW4gYWN0aW9uXG4gKiBAbWVtYmVyb2YgZm9yd2FyZEFjdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBhY3Rpb24gLSB0aGUgYWN0aW9uIG9iamVjdFxuICogQHJldHVybnMge09iamVjdH0gLSB1bndyYXBwZWQgYWN0aW9uXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1bndyYXAgPSBhY3Rpb24gPT4gKGlzRm9yd2FyZEFjdGlvbihhY3Rpb24pID8gdW53cmFwKGFjdGlvbi5wYXlsb2FkKSA6IGFjdGlvbik7XG5cbi8qKlxuICogR2l2ZW4gYW4gaWQsIHJldHVybnMgdGhlIGFjdGlvbiBmb3IgdGhhdCBpZC5cbiAqIElmIHRoZSBhY3Rpb24gaXMgbm90IGEgZm9yd2FyZCBhY3Rpb24sIHJldHVybiB0aGUgYWN0aW9uXG4gKiBAbWVtYmVyb2YgZm9yd2FyZEFjdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBpZFxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IF9hY3Rpb25Gb3IgPSAoaWQsIGFjdGlvbikgPT5cbiAgaXNGb3J3YXJkQWN0aW9uKGFjdGlvbilcbiAgICA/IGFjdGlvbi5tZXRhLl9hZGRyXyA9PT0gZ2V0QWN0aW9uRm9yd2FyZEFkZHJlc3MoaWQpXG4gICAgICA/IGFjdGlvbi5wYXlsb2FkXG4gICAgICA6IHt9XG4gICAgOiBhY3Rpb247XG5cbi8qKlxuICogUmV0dXJucyBhbiBhY3Rpb24gZGlzcGF0Y2hlciB0aGF0IHdyYXBzIGFuZCBmb3J3YXJkcyB0aGUgYWN0aW9ucyB0byBhIHNwZWNpZmljIGluc3RhbmNlXG4gKiBAbWVtYmVyb2YgZm9yd2FyZEFjdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIGluc3RhbmNlIGlkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwYXRjaCAtIGFjdGlvbiBkaXNwYXRjaGVyXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIGFjdGlvbiBhbmQgZm9yd2FyZCBkaXNwYXRjaGVyXG4gKiBpbXBvcnQge3RvZ2dsZVNwbGl0TWFwLCBmb3J3YXJkVG99IGZyb20gJ2tlcGxlci5nbC9hY3Rpb25zJztcbiAqIGltcG9ydCB7Y29ubmVjdH0gZnJvbSAncmVhY3QtcmVkdXgnO1xuICpcbiAqIGNvbnN0IE1hcENvbnRhaW5lciA9IHByb3BzID0+IChcbiAqICA8ZGl2PlxuICogICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHByb3BzLmtlcGxlckdsRGlzcGF0Y2godG9nZ2xlU3BsaXRNYXAoKSl9Lz5cbiAqICA8L2Rpdj5cbiAqIClcbiAqXG4gKiBjb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gsIHByb3BzKSA9PiAoe1xuICogIGRpc3BhdGNoLFxuICogIGtlcGxlckdsRGlzcGF0Y2g6IGZvcndhcmRUbyjigJhmb2/igJksIGRpc3BhdGNoKVxuICogfSk7XG4gKlxuICogZXhwb3J0IGRlZmF1bHQgY29ubmVjdChcbiAqICBzdGF0ZSA9PiBzdGF0ZSxcbiAqICBtYXBEaXNwYXRjaFRvUHJvcHNcbiAqICkoTWFwQ29udGFpbmVyKTtcbiAqL1xuZXhwb3J0IGNvbnN0IGZvcndhcmRUbyA9IChpZCwgZGlzcGF0Y2gpID0+IGFjdGlvbiA9PiBkaXNwYXRjaCh3cmFwVG8oaWQsIGFjdGlvbikpO1xuXG4vKipcbiAqIFVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBrZXBsZXIuZ2wgaW5zdGFuY2VcbiAqIEBtZW1iZXJvZiBmb3J3YXJkQWN0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBfdXBkYXRlUHJvcGVydHkgPSAoc3RhdGUsIGlkLCBuZXh0U3RhdGUpID0+XG4gIHN0YXRlW2lkXSA9PT0gbmV4dFN0YXRlXG4gICAgPyBzdGF0ZVxuICAgIDoge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgW2lkXTogbmV4dFN0YXRlXG4gICAgICB9O1xuXG4vKipcbiAqIFRoaXMgZGVjbGFyYXRpb24gaXMgbmVlZGVkIHRvIGdyb3VwIGFjdGlvbnMgaW4gZG9jc1xuICovXG4vKipcbiAqIEEgc2V0IG9mIGhlbHBlcnMgdG8gZm9yd2FyZCBkaXNwYXRjaCBhY3Rpb25zIHRvIGEgc3BlY2lmaWMgaW5zdGFuY2UgcmVkdWNlclxuICogQHB1YmxpY1xuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IGZvcndhcmRBY3Rpb25zID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBTUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFB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