2016-05-09 13:42:39 -07:00
|
|
|
import { Observable } from 'rx';
|
2016-09-09 14:52:34 -07:00
|
|
|
import debug from 'debug';
|
2016-10-17 21:38:16 +01:00
|
|
|
|
2016-06-13 21:08:22 -07:00
|
|
|
import { challengeSelector } from './selectors';
|
2016-06-23 20:05:30 -07:00
|
|
|
import types from './types';
|
2016-06-09 16:02:51 -07:00
|
|
|
import {
|
2016-05-09 13:42:39 -07:00
|
|
|
fetchChallengeCompleted,
|
|
|
|
fetchChallengesCompleted,
|
2016-06-21 16:28:13 -07:00
|
|
|
updateCurrentChallenge,
|
|
|
|
initMap
|
2016-05-09 13:42:39 -07:00
|
|
|
} from './actions';
|
2016-09-09 14:52:34 -07:00
|
|
|
import {
|
|
|
|
createMapUi,
|
|
|
|
filterComingSoonBetaFromEntities
|
|
|
|
} from '../utils';
|
2016-06-21 16:28:13 -07:00
|
|
|
import {
|
|
|
|
delayedRedirect,
|
2016-06-23 20:05:30 -07:00
|
|
|
createErrorObservable
|
2016-06-21 16:28:13 -07:00
|
|
|
} from '../../../redux/actions';
|
2016-08-01 16:54:33 -07:00
|
|
|
import createNameIdMap from '../../../../utils/create-name-id-map';
|
2016-03-21 15:39:45 -07:00
|
|
|
|
2016-09-09 14:52:34 -07:00
|
|
|
const isDev = debug.enabled('fcc:*');
|
|
|
|
|
2016-06-23 20:05:30 -07:00
|
|
|
const { fetchChallenge, fetchChallenges, replaceChallenge } = types;
|
|
|
|
|
2016-04-24 21:54:48 -07:00
|
|
|
export default function fetchChallengesSaga(action$, getState, { services }) {
|
|
|
|
return action$
|
2016-06-01 15:52:08 -07:00
|
|
|
.filter(({ type }) => (
|
|
|
|
type === fetchChallenges ||
|
2016-06-13 21:08:22 -07:00
|
|
|
type === fetchChallenge ||
|
|
|
|
type === replaceChallenge
|
2016-06-01 15:52:08 -07:00
|
|
|
))
|
2016-06-09 16:02:51 -07:00
|
|
|
.flatMap(({ type, payload: { dashedName, block } = {} }) => {
|
2016-06-13 21:08:22 -07:00
|
|
|
const state = getState();
|
2016-08-12 17:19:34 -07:00
|
|
|
const lang = state.app.lang;
|
2016-06-13 21:08:22 -07:00
|
|
|
if (type === replaceChallenge) {
|
|
|
|
const { challenge: newChallenge } = challengeSelector({
|
|
|
|
...state,
|
|
|
|
challengesApp: {
|
|
|
|
...state.challengesApp,
|
|
|
|
challenge: dashedName
|
|
|
|
}
|
|
|
|
});
|
|
|
|
if (state.challengesApp.challenge !== newChallenge.dashedName) {
|
|
|
|
return Observable.just(updateCurrentChallenge(newChallenge));
|
|
|
|
}
|
|
|
|
return Observable.just(null);
|
|
|
|
}
|
2016-05-09 13:42:39 -07:00
|
|
|
const options = { service: 'map' };
|
2016-06-17 12:35:10 -07:00
|
|
|
options.params = { lang };
|
2016-05-09 13:42:39 -07:00
|
|
|
if (type === fetchChallenge) {
|
2016-06-17 12:35:10 -07:00
|
|
|
options.params.dashedName = dashedName;
|
|
|
|
options.params.block = block;
|
2016-05-09 13:42:39 -07:00
|
|
|
}
|
|
|
|
return services.readService$(options)
|
2016-08-12 17:19:34 -07:00
|
|
|
.retry(3)
|
2016-06-09 16:02:51 -07:00
|
|
|
.flatMap(({ entities, result, redirect } = {}) => {
|
2016-05-09 13:42:39 -07:00
|
|
|
if (type === fetchChallenge) {
|
|
|
|
return Observable.of(
|
2016-06-20 11:35:19 -07:00
|
|
|
fetchChallengeCompleted(
|
|
|
|
createNameIdMap(entities),
|
|
|
|
result
|
|
|
|
),
|
2016-06-09 16:02:51 -07:00
|
|
|
updateCurrentChallenge(entities.challenge[result.challenge]),
|
|
|
|
redirect ? delayedRedirect(redirect) : null
|
2016-05-09 13:42:39 -07:00
|
|
|
);
|
|
|
|
}
|
2016-09-09 14:52:34 -07:00
|
|
|
const filteredEntities = filterComingSoonBetaFromEntities(
|
|
|
|
entities,
|
|
|
|
isDev
|
|
|
|
);
|
2016-06-21 16:28:13 -07:00
|
|
|
return Observable.of(
|
2016-06-20 11:35:19 -07:00
|
|
|
fetchChallengesCompleted(
|
2016-09-09 14:52:34 -07:00
|
|
|
createNameIdMap(filteredEntities),
|
2016-06-20 11:35:19 -07:00
|
|
|
result
|
2016-06-21 16:28:13 -07:00
|
|
|
),
|
2016-09-09 14:52:34 -07:00
|
|
|
initMap(createMapUi(filteredEntities, result)),
|
2016-06-20 11:35:19 -07:00
|
|
|
);
|
2016-04-24 21:54:48 -07:00
|
|
|
})
|
2016-06-23 20:05:30 -07:00
|
|
|
.catch(createErrorObservable);
|
2016-04-24 21:54:48 -07:00
|
|
|
});
|
|
|
|
}
|