From 5dea8b58d0a1459bca9205379695be63a6e475a0 Mon Sep 17 00:00:00 2001 From: Stuart Taylor Date: Sat, 26 May 2018 21:38:19 +0100 Subject: [PATCH] Update users currentChallengeId when on a new challenge (#101) Closes #94 --- packages/learn/src/redux/app/index.js | 2 ++ .../redux/current-challenge-epic.js | 29 +++++++++++++++++++ .../src/templates/Challenges/redux/index.js | 4 ++- 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 packages/learn/src/templates/Challenges/redux/current-challenge-epic.js diff --git a/packages/learn/src/redux/app/index.js b/packages/learn/src/redux/app/index.js index 60bf90a44c..6ac2ef7fab 100644 --- a/packages/learn/src/redux/app/index.js +++ b/packages/learn/src/redux/app/index.js @@ -39,6 +39,8 @@ export const isSignedInSelector = state => state[ns].isSignedIn; export const userSelector = state => state[ns].user || {}; export const completedChallengesSelector = state => state[ns].user.completedChallenges || []; +export const currentChallengeIdSelector = state => + userSelector(state).currentChallengeId || ''; export const reducer = handleActions( { diff --git a/packages/learn/src/templates/Challenges/redux/current-challenge-epic.js b/packages/learn/src/templates/Challenges/redux/current-challenge-epic.js new file mode 100644 index 0000000000..a937290b35 --- /dev/null +++ b/packages/learn/src/templates/Challenges/redux/current-challenge-epic.js @@ -0,0 +1,29 @@ +import { ofType } from 'redux-observable'; + +import { types } from './'; +import { filter, switchMap, catchError, mapTo } from 'rxjs/operators'; +import { + isSignedInSelector, + currentChallengeIdSelector +} from '../../../redux/app'; +import { postJSON$ } from '../utils/ajax-stream'; +import { _csrf } from '../../../redux/cookieVaules'; +import { of } from 'rxjs/observable/of'; + +function currentChallengeEpic(action$, { getState }) { + return action$.pipe( + ofType(types.challengeMounted), + filter(() => isSignedInSelector(getState())), + filter(({ payload }) => payload !== currentChallengeIdSelector(getState())), + switchMap(({ payload }) => + postJSON$('/external/update-my-current-challenge', { + currentChallengeId: payload, + _csrf + }) + ), + mapTo({ type: 'currentChallengeUpdateComplete' }), + catchError(() => of({ type: 'current-challenge-update-error' })) + ); +} + +export default currentChallengeEpic; diff --git a/packages/learn/src/templates/Challenges/redux/index.js b/packages/learn/src/templates/Challenges/redux/index.js index 1de7ba068e..3da9527b63 100644 --- a/packages/learn/src/templates/Challenges/redux/index.js +++ b/packages/learn/src/templates/Challenges/redux/index.js @@ -8,6 +8,7 @@ import executeChallengeEpic from './execute-challenge-epic'; import codeLockEpic from './code-lock-epic'; import createQuestionEpic from './create-question-epic'; import codeStorageEpic from './code-storage-epic'; +import currentChallengeEpic from './current-challenge-epic'; const ns = 'challenge'; export const backendNS = 'backendChallenge'; @@ -37,7 +38,8 @@ export const epics = [ completionEpic, createQuestionEpic, executeChallengeEpic, - codeStorageEpic + codeStorageEpic, + currentChallengeEpic ]; export const types = createTypes(