2016-05-09 13:42:39 -07:00
|
|
|
import { Observable } from 'rx';
|
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-07-14 17:13:48 -07:00
|
|
|
import { createMapUi } 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-03-21 15:39:45 -07:00
|
|
|
|
2016-06-23 20:05:30 -07:00
|
|
|
const { fetchChallenge, fetchChallenges, replaceChallenge } = types;
|
|
|
|
|
2016-06-20 11:35:19 -07:00
|
|
|
function createNameIdMap(entities) {
|
|
|
|
const { challenge } = entities;
|
|
|
|
return {
|
|
|
|
...entities,
|
|
|
|
challengeIdToName: Object.keys(challenge)
|
|
|
|
.reduce((map, challengeName) => {
|
|
|
|
map[challenge[challengeName].id] = challenge[challengeName].dashedName;
|
|
|
|
return map;
|
|
|
|
}, {})
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
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-06-17 12:35:10 -07:00
|
|
|
const lang = state.app.languageTag;
|
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-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-06-21 16:28:13 -07:00
|
|
|
return Observable.of(
|
2016-06-20 11:35:19 -07:00
|
|
|
fetchChallengesCompleted(
|
|
|
|
createNameIdMap(entities),
|
|
|
|
result
|
2016-06-21 16:28:13 -07:00
|
|
|
),
|
2016-07-14 17:13:48 -07:00
|
|
|
initMap(createMapUi(entities, 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
|
|
|
});
|
|
|
|
}
|