Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports["default"] = loadIntercomSaga;

var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));

var _effects = require("redux-saga/effects");

var _usersApiConnector = require("@doodle/users-api-connector");

var _intercomActions = require("../actions/intercomActions");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }

function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(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 _marked = /*#__PURE__*/_regenerator["default"].mark(waitForUser),
    _marked2 = /*#__PURE__*/_regenerator["default"].mark(selectUserData),
    _marked3 = /*#__PURE__*/_regenerator["default"].mark(onBoot),
    _marked4 = /*#__PURE__*/_regenerator["default"].mark(onLogin),
    _marked5 = /*#__PURE__*/_regenerator["default"].mark(onLogout),
    _marked6 = /*#__PURE__*/_regenerator["default"].mark(onTrackEvent),
    _marked7 = /*#__PURE__*/_regenerator["default"].mark(loadIntercomSaga);

/**
 * This saga waits until we have a valid user or we have attempted to load a user:
 * - if it's already loading -> wait on the outcome
 * - if not loading and no valid user -> attempt to load user & wait on outcome
 * - if user already loaded -> don't wait
 *
 * @param {*} options
 * @param {String} options.userDomain
 */
function waitForUser(options) {
  var _yield$select, error, loading, data;

  return _regenerator["default"].wrap(function waitForUser$(_context) {
    while (1) {
      switch (_context.prev = _context.next) {
        case 0:
          _context.next = 2;
          return (0, _effects.select)(function (state) {
            return state[options.userDomain || 'user'];
          });

        case 2:
          _yield$select = _context.sent;
          error = _yield$select.error;
          loading = _yield$select.loading;
          data = _yield$select.data;

          if (!(!loading && !data.accessToken && !error)) {
            _context.next = 13;
            break;
          }

          _context.next = 9;
          return (0, _effects.put)((0, _usersApiConnector.loadUser)());

        case 9:
          _context.next = 11;
          return (0, _effects.take)([_usersApiConnector.ActionTypes.USER_LOAD_FAILED, _usersApiConnector.ActionTypes.USER_LOADED]);

        case 11:
          _context.next = 16;
          break;

        case 13:
          if (!loading) {
            _context.next = 16;
            break;
          }

          _context.next = 16;
          return (0, _effects.take)([_usersApiConnector.ActionTypes.USER_LOAD_FAILED, _usersApiConnector.ActionTypes.USER_LOADED]);

        case 16:
        case "end":
          return _context.stop();
      }
    }
  }, _marked);
}

function selectUserData(options) {
  var _yield$select2, data, name, language, user_id, email, image_url, user_hash, userData;

  return _regenerator["default"].wrap(function selectUserData$(_context2) {
    while (1) {
      switch (_context2.prev = _context2.next) {
        case 0:
          _context2.next = 2;
          return (0, _effects.select)(function (state) {
            return state[options.userDomain || 'user'];
          });

        case 2:
          _yield$select2 = _context2.sent;
          data = _yield$select2.data;
          name = data.name, language = data.language, user_id = data.id, email = data.email, image_url = data.avatarLargeUrl, user_hash = data.intercom;
          userData = user_id // eslint-disable-line camelcase
          ? {
            user_id: user_id,
            user_hash: user_hash,
            email: email,
            name: name,
            language: language,
            avatar: {
              type: 'avatar',
              image_url: image_url
            }
          } : {};
          return _context2.abrupt("return", userData);

        case 7:
        case "end":
          return _context2.stop();
      }
    }
  }, _marked2);
}

function onBoot(options) {
  var app_id, userData;
  return _regenerator["default"].wrap(function onBoot$(_context3) {
    while (1) {
      switch (_context3.prev = _context3.next) {
        case 0:
          app_id = options.intercomAppId;
          _context3.next = 3;
          return (0, _effects.call)(selectUserData, options);

        case 3:
          userData = _context3.sent;
          window.Intercom('boot', _objectSpread({
            app_id: app_id
          }, userData));

        case 5:
        case "end":
          return _context3.stop();
      }
    }
  }, _marked3);
}

function onLogin(options) {
  var userData;
  return _regenerator["default"].wrap(function onLogin$(_context4) {
    while (1) {
      switch (_context4.prev = _context4.next) {
        case 0:
          _context4.next = 2;
          return (0, _effects.call)(selectUserData, options);

        case 2:
          userData = _context4.sent;
          _context4.next = 5;
          return (0, _effects.put)((0, _intercomActions.update)(userData));

        case 5:
        case "end":
          return _context4.stop();
      }
    }
  }, _marked4);
}

function onLogout() {
  return _regenerator["default"].wrap(function onLogout$(_context5) {
    while (1) {
      switch (_context5.prev = _context5.next) {
        case 0:
          window.Intercom('shutdown');
          _context5.next = 3;
          return (0, _effects.put)((0, _intercomActions.boot)());

        case 3:
        case "end":
          return _context5.stop();
      }
    }
  }, _marked5);
}

function onTrackEvent(options, _ref) {
  var payload, event, metadata, _yield$select3, booted;

  return _regenerator["default"].wrap(function onTrackEvent$(_context6) {
    while (1) {
      switch (_context6.prev = _context6.next) {
        case 0:
          payload = _ref.payload;
          event = payload.event, metadata = payload.metadata;
          _context6.next = 4;
          return (0, _effects.select)(function (state) {
            return state[options.intercomDomain || 'intercom'];
          });

        case 4:
          _yield$select3 = _context6.sent;
          booted = _yield$select3.booted;

          if (booted) {
            _context6.next = 9;
            break;
          }

          _context6.next = 9;
          return (0, _effects.take)(_intercomActions.ActionTypes.BOOT);

        case 9:
          window.Intercom('trackEvent', event, _objectSpread({}, metadata));

        case 10:
        case "end":
          return _context6.stop();
      }
    }
  }, _marked6);
}

function onUpdate(options, _ref2) {
  var payload = _ref2.payload;
  window.Intercom('update', _objectSpread({}, payload));
}

function loadIntercomSaga() {
  var options,
      _args7 = arguments;
  return _regenerator["default"].wrap(function loadIntercomSaga$(_context7) {
    while (1) {
      switch (_context7.prev = _context7.next) {
        case 0:
          options = _args7.length > 0 && _args7[0] !== undefined ? _args7[0] : {};
          _context7.next = 3;
          return (0, _effects.takeEvery)(_intercomActions.ActionTypes.TRACK_EVENT, onTrackEvent, options);

        case 3:
          _context7.next = 5;
          return (0, _effects.call)(waitForUser, options);

        case 5:
          _context7.next = 7;
          return (0, _effects.all)([(0, _effects.takeEvery)(_intercomActions.ActionTypes.BOOT, onBoot, options), (0, _effects.takeEvery)(_intercomActions.ActionTypes.UPDATE, onUpdate, options), (0, _effects.put)((0, _intercomActions.boot)()), (0, _effects.takeEvery)(_usersApiConnector.ActionTypes.USER_LOADED, onLogin, options), (0, _effects.takeEvery)(_usersApiConnector.ActionTypes.LOGOUT, onLogout, options)]);

        case 7:
          return _context7.abrupt("return", _context7.sent);

        case 8:
        case "end":
          return _context7.stop();
      }
    }
  }, _marked7);
}