@findify/mjs
Version:
Findify widgets
277 lines (228 loc) • 9.04 kB
JavaScript
"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);
});