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    
@doodle/ab-connector / src / state / saga / abSaga.js
Size: Mime:
import { call, takeEvery, all, put, takeLatest } from 'redux-saga/effects';
import { eventChannel } from 'redux-saga';
import { pushDataLayer } from '@doodle/tagmanager';
import { ActionTypes, chooseExperiment, setOptimizeStatus } from '../actions/abActions';

export function* onMessage(event) {
  const { data } = event;
  if (data.experiment) {
    const experiment = {
      ...data.experiment,
    };
    yield put(chooseExperiment(experiment));
  } else if (data.optimize) {
    if (data.optimize.pending) {
      yield put(setOptimizeStatus(ActionTypes.OPTIMIZE_STATUS_PENDING));
    } else if (data.optimize.loaded) {
      yield put(setOptimizeStatus(ActionTypes.OPTIMIZE_STATUS_LOADED));
    }
  }
}

export function* onActivateOptimize() {
  const lang = navigator.language || navigator.userLanguage;
  yield put(
    pushDataLayer({
      language: lang,
      event: 'optimize.activate',
    })
  );
}

export function* watchPostMessage() {
  const postMessageChannel = eventChannel(emitter => {
    window.addEventListener('message', emitter);
    return () => {
      window.removeEventListener('message', emitter);
    };
  });
  yield takeEvery(postMessageChannel, onMessage);
}

export function* watchActivateOptimize(options) {
  yield takeLatest(ActionTypes.OPTIMIZE_ACTIVATE, onActivateOptimize, options);
}

export default function* abSaga(options = {}) {
  // In case optimize is loading faster then the abSaga we need to trigger the actions manually
  if (window.doodleABTest && window.doodleABTest.pending) {
    yield put(setOptimizeStatus(ActionTypes.OPTIMIZE_STATUS_PENDING));
  }
  if (window.doodleABTest && window.doodleABTest.loaded) {
    yield put(setOptimizeStatus(ActionTypes.OPTIMIZE_STATUS_LOADED));
  }

  yield all([call(watchPostMessage, options), call(watchActivateOptimize, options)]);
}