2017-07-31 20:04:01 -07:00
|
|
|
import debug from 'debug';
|
2016-06-09 16:02:51 -07:00
|
|
|
import { Observable } from 'rx';
|
2017-07-31 20:04:01 -07:00
|
|
|
import { combineEpics, ofType } from 'redux-epic';
|
2016-06-09 16:02:51 -07:00
|
|
|
import { push } from 'react-router-redux';
|
2017-07-31 20:04:01 -07:00
|
|
|
|
|
|
|
import {
|
|
|
|
types,
|
|
|
|
|
|
|
|
updateMain,
|
|
|
|
challengeUpdated
|
|
|
|
} from './';
|
|
|
|
import { getNS as entitiesSelector } from '../../../entities';
|
2016-06-10 14:01:13 -07:00
|
|
|
import {
|
|
|
|
getNextChallenge,
|
|
|
|
getFirstChallengeOfNextBlock,
|
|
|
|
getFirstChallengeOfNextSuperBlock
|
|
|
|
} from '../utils';
|
2017-07-31 20:04:01 -07:00
|
|
|
import {
|
|
|
|
types as app,
|
|
|
|
|
|
|
|
createErrorObservable,
|
|
|
|
updateCurrentChallenge,
|
|
|
|
|
|
|
|
currentChallengeSelector,
|
|
|
|
challengeSelector,
|
|
|
|
superBlocksSelector
|
|
|
|
} from '../../../redux';
|
|
|
|
import { makeToast } from '../../../Toasts/redux';
|
2016-06-09 16:02:51 -07:00
|
|
|
|
2016-07-01 19:05:50 -07:00
|
|
|
const isDev = debug.enabled('fcc:*');
|
2016-06-23 20:05:30 -07:00
|
|
|
|
2017-07-31 20:04:01 -07:00
|
|
|
export function challengeUpdatedEpic(actions, { getState }) {
|
|
|
|
return actions::ofType(app.updateCurrentChallenge)
|
|
|
|
.flatMap(() => {
|
|
|
|
const challenge = challengeSelector(getState());
|
|
|
|
return Observable.of(
|
|
|
|
challengeUpdated(challenge),
|
|
|
|
push(`/challenges/${challenge.block}/${challenge.dashedName}`)
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// used to reset users code on request
|
|
|
|
export function resetChallengeEpic(actions, { getState }) {
|
|
|
|
return actions::ofType(types.resetChallenge)
|
|
|
|
.flatMap(() => {
|
|
|
|
const currentChallenge = currentChallengeSelector(getState());
|
|
|
|
return Observable.of(
|
|
|
|
updateCurrentChallenge(currentChallenge),
|
|
|
|
updateMain()
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function nextChallengeEpic(actions, { getState }) {
|
|
|
|
return actions::ofType(types.moveToNextChallenge)
|
2016-06-09 16:02:51 -07:00
|
|
|
.flatMap(() => {
|
2016-06-10 14:01:13 -07:00
|
|
|
let nextChallenge;
|
|
|
|
// let message = '';
|
|
|
|
// let isNewBlock = false;
|
|
|
|
// let isNewSuperBlock = false;
|
|
|
|
try {
|
|
|
|
const state = getState();
|
2017-07-31 20:04:01 -07:00
|
|
|
const superBlocks = superBlocksSelector(state);
|
|
|
|
const challenge = currentChallengeSelector(state);
|
|
|
|
const entities = entitiesSelector(state);
|
2016-07-01 19:05:50 -07:00
|
|
|
nextChallenge = getNextChallenge(challenge, entities, { isDev });
|
2016-06-10 14:01:13 -07:00
|
|
|
// block completed.
|
|
|
|
if (!nextChallenge) {
|
|
|
|
// isNewBlock = true;
|
2016-07-01 19:05:50 -07:00
|
|
|
nextChallenge = getFirstChallengeOfNextBlock(
|
|
|
|
challenge,
|
|
|
|
entities,
|
|
|
|
{ isDev }
|
|
|
|
);
|
2016-06-10 14:01:13 -07:00
|
|
|
}
|
|
|
|
// superBlock completed
|
|
|
|
if (!nextChallenge) {
|
|
|
|
// isNewSuperBlock = true;
|
|
|
|
nextChallenge = getFirstChallengeOfNextSuperBlock(
|
|
|
|
challenge,
|
|
|
|
entities,
|
2016-07-01 19:05:50 -07:00
|
|
|
superBlocks,
|
|
|
|
{ isDev }
|
2016-06-10 14:01:13 -07:00
|
|
|
);
|
|
|
|
}
|
|
|
|
/* this requires user data not available yet
|
|
|
|
if (isNewSuperBlock || isNewBlock) {
|
|
|
|
const getName = isNewSuperBlock ?
|
|
|
|
getCurrentSuperBlockName :
|
|
|
|
getCurrentBlockName;
|
|
|
|
const blockType = isNewSuperBlock ? 'SuperBlock' : 'Block';
|
|
|
|
message =
|
|
|
|
`You've competed the ${getName(challenge, entities)} ${blockType}!`;
|
|
|
|
}
|
|
|
|
message += ' Your next challenge has arrived.';
|
|
|
|
const toast = {
|
2016-06-13 12:26:30 -07:00
|
|
|
// title: isNewSuperBlock || isNewBlock ? randomVerb() : null,
|
2016-06-10 14:01:13 -07:00
|
|
|
message
|
|
|
|
};
|
|
|
|
*/
|
2016-10-31 14:47:31 +00:00
|
|
|
if (nextChallenge.isLocked) {
|
|
|
|
return Observable.of(
|
|
|
|
makeToast({
|
|
|
|
message: 'The next challenge has not been unlocked. ' +
|
|
|
|
'Please revisit the required (*) challenges ' +
|
|
|
|
'that have not been passed yet. ',
|
|
|
|
timeout: 15000
|
|
|
|
}),
|
|
|
|
push('/map')
|
|
|
|
);
|
|
|
|
}
|
2016-06-10 14:01:13 -07:00
|
|
|
return Observable.of(
|
2017-07-31 20:04:01 -07:00
|
|
|
updateCurrentChallenge(nextChallenge.dashedName),
|
|
|
|
makeToast({ message: 'Your next challenge has arrived.' })
|
2016-06-10 14:01:13 -07:00
|
|
|
);
|
|
|
|
} catch (err) {
|
|
|
|
return createErrorObservable(err);
|
|
|
|
}
|
2016-06-09 16:02:51 -07:00
|
|
|
});
|
|
|
|
}
|
2017-07-31 20:04:01 -07:00
|
|
|
|
|
|
|
export default combineEpics(
|
|
|
|
challengeUpdatedEpic,
|
|
|
|
nextChallengeEpic,
|
|
|
|
resetChallengeEpic
|
|
|
|
);
|