Repository URL to install this package:
|
Version:
3.7.1 ▾
|
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)]);
}