UNPKG

@mopinion/deploy

Version:

Deploy your Mopinion feedback forms with ease

529 lines (528 loc) 23.3 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = createRule; var _services = require("../services"); var _utils = require("../utils"); var _listeners = require("../listeners"); var _createRuleStore2 = _interopRequireDefault(require("./createRuleStore")); var conditionTests = _interopRequireWildcard(require("./ruleConditionTests")); var _utils2 = require("./utils"); var _constants = require("./constants"); function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } 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) { _defineProperty(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; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 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; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function createRule() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$rule = _ref.rule, rule = _ref$rule === void 0 ? {} : _ref$rule, globalListenerStore = _ref.globalListenerStore; var id = rule.id, ifRules = rule["if"], then = rule.then; var ruleChangeListeners = []; var _createRuleStore = (0, _createRuleStore2["default"])(rule), setState = _createRuleStore.setState, setConditionState = _createRuleStore.setConditionState, getState = _createRuleStore.getState, getConditionState = _createRuleStore.getConditionState, setValidState = _createRuleStore.setValidState, getValidState = _createRuleStore.getValidState, getValidConditions = _createRuleStore.getValidConditions, setTimeOnPageState = _createRuleStore.setTimeOnPageState, getTimeOnPageState = _createRuleStore.getTimeOnPageState; var _createListenerStore = (0, _listeners.createListenerStore)(), clearListeners = _createListenerStore.clearListeners, setListener = _createListenerStore.setListener, setIntervalListener = _createListenerStore.setIntervalListener; var preCheckEffects = { percentage: function percentage(_ref2) { var index = _ref2.index; if (getConditionState(index, function (state) { return state.percentage; }) === undefined) { setConditionState(index, function (state) { return state.percentage = (0, _utils2.randomPercentage)(); }); } }, time_in_session: function time_in_session(_ref3) { var index = _ref3.index, condition = _ref3.condition; var isValid = function isValid() { return getConditionState(index, function (state) { return state.sessionTime; }) >= Number(condition.time_in_session); }; if (isValid()) { return; } setIntervalListener(function () { setConditionState(index, function (conditionState) { conditionState.sessionTime = typeof conditionState.sessionTime !== 'undefined' ? conditionState.sessionTime + 1 : 1; }); if (isValid()) { checkConditions(); } }, 1000); }, number_of_pages: function number_of_pages() { setState(function (state) { if (state.lastPage !== document.location.href) { state.pageCount = typeof state.pageCount !== 'undefined' ? state.pageCount + 1 : 1; } state.lastPage = document.location.href; }); }, type: function type() { if (getState(function (state) { return state.returning; })) { return; } if ((0, _utils.timeInSeconds)() - globalListenerStore.getSession() < 120) { setState(function (state) { state.returning = true; }); } }, event_listeners: function event_listeners(_ref4) { var index = _ref4.index, value = _ref4.value; try { (0, _utils.flattenArray)(value).forEach(function (eventListener, eventListenerIndex) { var _getConditionState; var selector = eventListener.selector, event = eventListener.event; if (((_getConditionState = getConditionState(index, function (state) { var _state$domEvents; return (_state$domEvents = state.domEvents) === null || _state$domEvents === void 0 ? void 0 : _state$domEvents[selector]; })) === null || _getConditionState === void 0 ? void 0 : _getConditionState.indexOf(event)) > -1) { return; } setListener(function (listeners) { var listenerKey = event + selector + index + eventListenerIndex; listeners[listenerKey] = function (e) { setTimeout(function () { try { var _e$target; if ((_e$target = e.target) !== null && _e$target !== void 0 && _e$target.matches(selector)) { setConditionState(index, function (state) { if (!state.domEvents) { state.domEvents = {}; } if (!state.domEvents[selector]) { state.domEvents[selector] = []; } state.domEvents[selector].push(event); }); checkConditions(); } } catch (e) {} }); }; document.addEventListener(event, listeners[listenerKey]); return function () { return document.removeEventListener(event, listeners[listenerKey]); }; }); }); } catch (e) {} }, form_events: function form_events(_ref5) { var index = _ref5.index, value = _ref5.value, serviceName = _ref5.service; try { if (!(0, _services.getService)(serviceName)) { (0, _services.setService)(serviceName, (0, _services.createService)(serviceName)); } var service = (0, _services.getService)(serviceName); (0, _utils.flattenArray)(value).forEach(function (formListener, formListenerIndex) { var _getConditionState2; var formKey = formListener.formKey, event = formListener.event; if (((_getConditionState2 = getConditionState(index, function (state) { var _state$formEvents; return (_state$formEvents = state.formEvents) === null || _state$formEvents === void 0 ? void 0 : _state$formEvents[formKey]; })) === null || _getConditionState2 === void 0 ? void 0 : _getConditionState2.indexOf(event)) > -1) { return; } var applyListener = function applyListener() { setListener(function (listeners) { var listenerKey = formKey + event + index + formListenerIndex; listeners[listenerKey] = function (e) { setTimeout(function () { if (e.key === formKey) { setConditionState(index, function (state) { if (!state.formEvents[formKey]) { state.formEvents[formKey] = []; } state.formEvents[formKey].push(e.event); }); checkConditions(); } }); }; setTimeout(function () { service.addEventListener(event, listeners[listenerKey]); }); return function () { return service.removeEventListener(event, listeners[listenerKey]); }; }); }; if (service.isLoaded()) { applyListener(); } else { service.onLoaded(applyListener); } }); } catch (e) {} } }; function jsCookieCssSelectorEffect(_ref6) { var key = _ref6.key, value = _ref6.value, wasValid = _ref6.wasValid; setIntervalListener(function () { var conditionTestFn = conditionTests[key]; var isValid = conditionTestFn(value, rule); if (wasValid && !isValid) { checkConditions(); } if (!wasValid && isValid) { checkConditions(); } }); } var postCheckEffects = { js: jsCookieCssSelectorEffect, cookie: jsCookieCssSelectorEffect, css_selector: jsCookieCssSelectorEffect, scrollpos: function scrollpos(_ref7) { var key = _ref7.key, value = _ref7.value, wasValid = _ref7.wasValid; setListener(function (listeners) { listeners.scroll = (0, _utils.debounce)(function () { var conditionTestFn = conditionTests[key]; var isValid = conditionTestFn(value); if (wasValid && !isValid) { checkConditions(); } if (!wasValid && isValid) { checkConditions(); } }, 50); window.addEventListener('scroll', listeners.scroll); return function () { return window.removeEventListener('scroll', listeners.scroll); }; }); }, time: function time(_ref8) { var index = _ref8.index, value = _ref8.value; var isValid = function isValid() { return (0, _utils.timeInSeconds)() - getTimeOnPageState(index, 'time') >= Number(value); }; if (!getTimeOnPageState(index, 'time')) { setTimeOnPageState(index, 'time'); } if (isValid()) { return; } setIntervalListener(function () { if (isValid()) { checkConditions(); } }, 1000); }, time_after_valid: function time_after_valid(_ref9) { var index = _ref9.index, value = _ref9.value; var isValid = function isValid() { return (0, _utils.timeInSeconds)() - getTimeOnPageState(index, 'time_after_valid') >= Number(value); }; if (!getTimeOnPageState(index, 'time_after_valid')) { setTimeOnPageState(index, 'time_after_valid'); } if (isValid()) { return; } setIntervalListener(function () { if (isValid()) { checkConditions(); } }, 1000); } }; function validConditionsChanged() { var previous = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var previouslyValidConditions = previous.filter(function (_ref0) { var index = _ref0.index; return index; }); return getValidConditions().every(function () { var _ref1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, index = _ref1.index; return previouslyValidConditions.indexOf(index) === -1; }); } var conditionCheckOrder = ['pause', 'location', 'time', 'percentage', 'number_of_pages', 'referrer', 'date', 'clock', 'type', 'devices', 'css_selector', 'js', 'cookie', 'scrollpos', 'time_in_session', 'event_listeners', 'form_events', 'time_after_valid']; function checkConditions() { (0, _utils.schedule)(function () { clearListeners(); var previouslyValidConditions = getValidConditions(); var ruleConditionsValid = ifRules.filter(function (condition, index) { if (_constants.showOncePerSessionTriggers.indexOf(condition.trigger) > -1 && getConditionState(index, function (state) { return state.triggered; })) { return false; } Object.keys(preCheckEffects).forEach(function (conditionKey) { var conditionValue = condition[conditionKey]; var preCheckEffect = preCheckEffects[conditionKey]; if (!(0, _utils2.conditionValueIsEmpty)(conditionValue) && preCheckEffect) { var _then$; preCheckEffect({ index: index, condition: condition, value: conditionValue, service: then === null || then === void 0 || (_then$ = then[0]) === null || _then$ === void 0 ? void 0 : _then$.service }); } }); var isValid = conditionCheckOrder.every(function (conditionKey) { var conditionTestFn = conditionTests[conditionKey]; var conditionValue = condition[conditionKey]; var postCheckEffect = postCheckEffects[conditionKey]; if ((0, _utils2.conditionValueIsEmpty)(conditionValue)) { return true; } if (typeof conditionTestFn !== 'function') { return true; } var valid = conditionTestFn(conditionValue, { rule: rule, state: { pageCount: getState(function (state) { return state.pageCount; }), returning: getState(function (state) { return state.returning; }), percentage: getConditionState(index, function (state) { return state.percentage; }), timeOnPage: getTimeOnPageState(index, 'time'), timeAfterValid: getTimeOnPageState(index, 'time_after_valid'), sessionTime: getConditionState(index, function (state) { return state.sessionTime; }), eventListeners: getConditionState(index, function (state) { return state.domEvents; }), formEvents: getConditionState(index, function (state) { return state.formEvents; }), referrer: globalListenerStore.getPreviousLocation() } }); if (postCheckEffect) { var _then$2; postCheckEffect({ key: conditionKey, value: conditionValue, wasValid: valid, index: index, service: then === null || then === void 0 || (_then$2 = then[0]) === null || _then$2 === void 0 ? void 0 : _then$2.service }); } return valid; }); setValidState(index, isValid); return isValid; }).length > 0; var divPlacementValid = (0, _utils2.handleDivPlacement)(then, ruleConditionsValid); setIntervalListener(function () { if (divPlacementValid !== (0, _utils2.checkDivs)(then)) { if (ruleConditionsValid) { getValidConditions().forEach(function (_ref10) { var index = _ref10.index; setValidState(index, false); }); } checkConditions(); } }); var ruleIsCurrentlyValid = ruleConditionsValid && divPlacementValid; var conditionsChanged = validConditionsChanged(previouslyValidConditions); if (conditionsChanged && ruleIsCurrentlyValid) { return runThen(); } else if (previouslyValidConditions.length > 0 && !ruleIsCurrentlyValid) { return cleanupThen(); } if (ruleIsCurrentlyValid) {} if (!ruleIsCurrentlyValid) {} ruleChangeListeners.forEach(function (fn) { return fn({ ruleIsCurrentlyValid: ruleIsCurrentlyValid, conditionsChanged: conditionsChanged }); }); }); } function runThen() { then.forEach(function () { var thenCondition = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var _thenCondition$servic = thenCondition.service, serviceName = _thenCondition$servic === void 0 ? 'mopinion' : _thenCondition$servic, useQuerySelectorAll = thenCondition.useQuerySelectorAll, _thenCondition$args = thenCondition.args, args = _thenCondition$args === void 0 ? [] : _thenCondition$args; var _args = _slicedToArray(args, 3), key = _args[0], domain = _args[1], divName = _args[2]; if (!(0, _services.getService)(serviceName)) { (0, _services.setService)(serviceName, (0, _services.createService)(serviceName)); } var service = (0, _services.getService)(serviceName); var conditions = getValidConditions(); var open = function open(_ref11) { var index = _ref11.index, condition = _ref11.condition; (0, _utils2.tryService)(function () { if (!getValidState(index)) { return; } if (_constants.showAlwaysPerSessionTriggers.indexOf(condition.trigger) > -1 || !getConditionState(index, function (state) { return state.triggered; })) { service.handleTrigger(_objectSpread({ key: key, domain: domain, divName: divName, useQuerySelectorAll: useQuerySelectorAll }, condition)); setConditionState(index, function (state) { return state.triggered = true; }); } }); }; service.start(function () { handleTriggers({ conditions: conditions, id: id, open: open }); }); }); } function cleanupThen() { var cleanAll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; then.forEach(function () { var _ref12 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, serviceName = _ref12.service, _ref12$args = _ref12.args, args = _ref12$args === void 0 ? [] : _ref12$args; try { var service = (0, _services.getService)(serviceName); service.removeWhenClosed(args[0]); } catch (e) {} clearListeners(cleanAll); }); } function handleTriggers(_ref13) { var _ref13$conditions = _ref13.conditions, conditions = _ref13$conditions === void 0 ? [] : _ref13$conditions, id = _ref13.id, open = _ref13.open; conditions.forEach(function (_ref14) { var index = _ref14.index, condition = _ref14.condition; if (_constants.showOncePerSessionTriggers.indexOf(condition.trigger) > -1 && getConditionState(index, function (state) { return state.triggered; })) { return; } setTimeout(function () { var initTrigger = function initTrigger() { open({ index: index, condition: condition }); clearListeners(false); }; if (condition.trigger === 'exit') { return handleExit({ condition: condition, initTrigger: initTrigger }); } initTrigger(); }); }); } function handleExit(_ref15) { var condition = _ref15.condition, initTrigger = _ref15.initTrigger; var minY = 100; var mouseY = 0; setListener(function (listeners) { listeners.mousemove = function (e) { return mouseY = e.clientY; }; listeners.mouseleave = function (e) { if (mouseY <= minY) { var YonLeave = mouseY; setTimeout(function () { if (mouseY === YonLeave) { initTrigger(); clearListeners(false); } }, 200); } }; document.addEventListener('mousemove', listeners.mousemove); document.querySelector('html').addEventListener('mouseleave', listeners.mouseleave); return function () { document.removeEventListener('mousemove', listeners.mousemove); document.querySelector('html').removeEventListener('mouseleave', listeners.mouseleave); }; }); } function onRuleChange(fn) { if (typeof fn !== 'function') { return; } ruleChangeListeners.push(fn); } return { checkConditions: checkConditions, cleanupThen: cleanupThen, getState: getState, getConditionState: getConditionState, getValidState: getValidState, getValidConditions: getValidConditions, getTimeOnPageState: getTimeOnPageState, onRuleChange: onRuleChange, globalListenerStore: globalListenerStore }; } //# sourceMappingURL=createRule.js.map