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
});

var _regenerator = require('babel-runtime/regenerator');

var _regenerator2 = _interopRequireDefault(_regenerator);

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

exports.default = loadIntercomSaga;

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 }; }

var _marked = /*#__PURE__*/_regenerator2.default.mark(waitForUser),
    _marked2 = /*#__PURE__*/_regenerator2.default.mark(selectUserData),
    _marked3 = /*#__PURE__*/_regenerator2.default.mark(onBoot),
    _marked4 = /*#__PURE__*/_regenerator2.default.mark(onLogin),
    _marked5 = /*#__PURE__*/_regenerator2.default.mark(onLogout),
    _marked6 = /*#__PURE__*/_regenerator2.default.mark(onTrackEvent),
    _marked7 = /*#__PURE__*/_regenerator2.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 _ref, error, loading, data;

  return _regenerator2.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:
          _ref = _context.sent;
          error = _ref.error;
          loading = _ref.loading;
          data = _ref.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, this);
}

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

  return _regenerator2.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:
          _ref2 = _context2.sent;
          data = _ref2.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, this);
}

function onBoot(options) {
  var app_id, userData;
  return _regenerator2.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', _extends({
            app_id: app_id
          }, userData));

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

function onLogin(options) {
  var userData;
  return _regenerator2.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, this);
}

function onLogout() {
  return _regenerator2.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, this);
}

function onTrackEvent(options, _ref3) {
  var payload = _ref3.payload;

  var event, metadata, _ref4, booted;

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

        case 3:
          _ref4 = _context6.sent;
          booted = _ref4.booted;

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

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

        case 8:

          window.Intercom('trackEvent', event, _extends({}, metadata));

        case 9:
        case 'end':
          return _context6.stop();
      }
    }
  }, _marked6, this);
}

function onUpdate(options, _ref5) {
  var payload = _ref5.payload;

  window.Intercom('update', _extends({}, payload));
}

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

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

        case 4:
          _context7.next = 6;
          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 6:
          return _context7.abrupt('return', _context7.sent);

        case 7:
        case 'end':
          return _context7.stop();
      }
    }
  }, _marked7, this);
}