UNPKG

@findify/mjs

Version:
277 lines (228 loc) 9.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _once2 = require("lodash/once"); var _once3 = _interopRequireDefault(_once2); var _memoize2 = require("lodash/memoize"); var _memoize3 = _interopRequireDefault(_memoize2); var _isFunction2 = require("lodash/isFunction"); var _isFunction3 = _interopRequireDefault(_isFunction2); var _identity2 = require("lodash/identity"); var _identity3 = _interopRequireDefault(_identity2); var _isEqual2 = require("lodash/isEqual"); var _isEqual3 = _interopRequireDefault(_isEqual2); var _createBrowserHistory = require("history/createBrowserHistory"); var _createBrowserHistory2 = _interopRequireDefault(_createBrowserHistory); var _qs = require("qs"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var history = (0, _createBrowserHistory2.default)(); var emptyObject = {}; var toString = function toString(state) { return (0, _qs.stringify)(state, { encode: encodeURIComponent }); }; var fromString = function fromString(str) { var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var elements = (0, _qs.parse)(str, { decoder: decodeURIComponent }); var res = Object.keys(elements).reduce(function (acc, key) { var _key = prefix ? key.replace("".concat(prefix, "_"), '') : key; return _objectSpread({}, acc, _defineProperty({}, _key, ['limit', 'offset'].includes(_key) ? Number(elements[key]) : elements[key])); }, {}); console.log(res); return res; }; var reduceState = function reduceState(state, keyFn) { var valueFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _identity3.default; return Object.keys(state).reduce(function (acc, key) { var computedKey = keyFn(key); if (!computedKey) return acc; return _objectSpread({}, acc, _defineProperty({}, computedKey, valueFn(state[key]))); }, emptyObject); }; var parseOldQuery = function parseOldQuery(string) { var query = /search\=\{(.*?)\}/g.exec(string); var _ref = query && query[1] && fromString(decodeURIComponent(query[1])) || emptyObject, facets = _ref.facets, rest = _objectWithoutProperties(_ref, ["facets"]); var filters = facets && facets.reduce(function (acc, facet) { var f = _objectSpread({}, facet, { type: facet.type === 'terms' ? 'text' : facet.type, values: facet.type === 'range' ? facet.values : facet.values.map(function (value) { return { value: value }; }) }); acc.push(f); return acc; }, []); return _objectSpread({}, rest, { filters: filters }); }; /** * Send google analytics events if url was changed */ if (!!global.ga || !!global._gaq) { var sendEventToGoogle = function sendEventToGoogle() { var url = document.location.href; if ((0, _isFunction3.default)(global.ga)) return global.ga('send', 'findify::page-view', url); if ((0, _isFunction3.default)(global._gaq)) return global._gaq.push(['_trackPageview', url]); }; history.listen(sendEventToGoogle); } var Location = /*#__PURE__*/ function () { _createClass(Location, [{ key: "_getter", value: function _getter(string) { if (/search=\{.*?\}/.test(string)) return parseOldQuery(string); return fromString(string, this.prefix); } }, { key: "setter", value: function setter(state) { if (!this.prefix) return toString(state); var prefix = this.prefix + '_'; return toString(reduceState(state, function (key) { return prefix + key; })); } }]); function Location(config, hooks) { var _this = this; _classCallCheck(this, Location); Object.defineProperty(this, "collection", { configurable: true, enumerable: true, writable: true, value: null }); Object.defineProperty(this, "listen", { configurable: true, enumerable: true, writable: true, value: history.listen }); Object.defineProperty(this, "initialMeta", { configurable: true, enumerable: true, writable: true, value: { offset: 0, limit: 24 } }); Object.defineProperty(this, "prefix", { configurable: true, enumerable: true, writable: true, value: void 0 }); Object.defineProperty(this, "searchUrl", { configurable: true, enumerable: true, writable: true, value: '/' }); Object.defineProperty(this, "getter", { configurable: true, enumerable: true, writable: true, value: void 0 }); if (!config) return; if (hooks.location) { history.listen(function () { return hooks.location.onChange(_this.state); }); } if (config.features.search && config.features.search.meta) this.initialMeta = config.features.search.meta; if (config.collections) { var normalizedPath = history.location.pathname.replace(/^\/|\/$/g, '').toLowerCase(); this.collection = config.collections.find(function (path) { return normalizedPath === path; }); } this.getter = config.location && config.location.getter || (0, _memoize3.default)(this._getter); if (config.location) { if (config.location.setter) { this.setter = config.location.setter; } if (config.location.searchUrl) { this.searchUrl = config.location.searchUrl; } if (config.location.prefix) { this.prefix = config.location.prefix; } } } _createClass(Location, [{ key: "searchFor", value: function searchFor(q) { if (this.isSearchPage) { this.state = _objectSpread({}, this.initialMeta, { q: q }); } else { var state = this.setter(_objectSpread({}, this.initialMeta, { q: q })); this.navigate("".concat(this.searchUrl, "?").concat(state)); } } }, { key: "navigate", value: function navigate(href, target) { if (target && target !== '_self') { var win = window.open(href, target); return win.focus(); } return window.location.href = href; } }, { key: "pathname", get: function get() { return history.location.pathname; } }, { key: "search", get: function get() { return history.location.search.replace('?', ''); } }, { key: "state", get: function get() { if (!this.search) return {}; return this.getter(this.search); }, set: function set(state) { var search = this.setter(state); if (!(0, _isEqual3.default)(state, this.state)) { history.push({ search: "?".concat(search) }); } } }, { key: "isSearchPage", get: function get() { return this.searchUrl === history.location.pathname; } }]); return Location; }(); exports.default = (0, _once3.default)(function (config, hooks) { return new Location(config, hooks); });