Refactor(challenges): refactor challenge completion saga

This commit is contained in:
Berkeley Martinez
2016-06-20 21:25:27 -07:00
parent 60cd5c76f8
commit adb7fa96cc

View File

@ -15,40 +15,24 @@ import { postJSON$ } from '../../../../utils/ajax-stream';
// NOTE(@BerkeleyTrue): this file could benefit from some refactoring. // NOTE(@BerkeleyTrue): this file could benefit from some refactoring.
// lots of repeat code // lots of repeat code
function completedChallenge(state) { function postChallenge(url, body, username) {
const { challenge: { id } } = challengeSelector(state); const saveChallenge$ = postJSON$(url, body)
const {
app: { user, csrfToken },
challengesApp: { files }
} = state;
const body = {
id,
_csrf: csrfToken,
files
};
const saveChallenge$ = postJSON$('/modern-challenge-completed', body)
.retry(3) .retry(3)
.flatMap(({ alreadyCompleted, points }) => { .flatMap(({ alreadyCompleted, points }) => {
return Observable.of( return Observable.of(
makeToast({ makeToast({
message: message: randomCompliment() +
'Challenge saved.' + (alreadyCompleted ? '!' : '! First time Completed!'),
(alreadyCompleted ? '' : ' First time Completed!'),
title: 'Saved',
type: 'info' type: 'info'
}), }),
updateUserPoints(user, points) updateUserPoints(username, points)
); );
}) })
.catch(createErrorObservable); .catch(createErrorObservable);
const challengeCompleted$ = Observable.of( const challengeCompleted$ = Observable.of(
moveToNextChallenge(), moveToNextChallenge(),
makeToast({ username ? makeToast({ message: ' Saving...', type: 'info' }) : null
title: 'Congratulations!',
message: user ? ' Saving...' : 'Moving on to next challenge.',
type: 'success'
})
); );
return Observable.merge(saveChallenge$, challengeCompleted$); return Observable.merge(saveChallenge$, challengeCompleted$);
} }
@ -63,7 +47,17 @@ function submitModern(type, state) {
} }
if (type === types.submitChallenge) { if (type === types.submitChallenge) {
return completedChallenge(state); const { challenge: { id } } = challengeSelector(state);
const {
app: { user, csrfToken },
challengesApp: { files }
} = state;
const body = {
id,
_csrf: csrfToken,
files
};
return postChallenge('/modern-challenge-completed', body, user);
} }
} }
return Observable.just(makeToast({ return Observable.just(makeToast({
@ -89,31 +83,7 @@ function submitProject(type, state, { solution, githubLink }) {
if (challengeType === backEndProject) { if (challengeType === backEndProject) {
body.githubLink = githubLink; body.githubLink = githubLink;
} }
const saveChallenge$ = postJSON$('/project-completed', body) return postChallenge('/project-completed', body, user);
.retry(3)
.flatMap(({ alreadyCompleted, points }) => {
return Observable.of(
makeToast({
message:
'Challenge saved.' +
(alreadyCompleted ? '' : ' First time Completed!'),
title: 'Saved',
type: 'info'
}),
updateUserPoints(user, points)
);
})
.catch(createErrorObservable);
const challengeCompleted$ = Observable.of(
makeToast({
title: randomCompliment(),
message: user ? ' Saving...' : 'Moving on to next challenge.',
type: 'success'
})
// moveToNextChallenge()
);
return Observable.merge(saveChallenge$, challengeCompleted$);
} }
function submitSimpleChallenge(type, state) { function submitSimpleChallenge(type, state) {
@ -127,31 +97,7 @@ function submitSimpleChallenge(type, state) {
id, id,
_csrf: csrfToken _csrf: csrfToken
}; };
const saveChallenge$ = postJSON$('/challenge-completed', body) return postChallenge('/challenge-completed', body, user);
.retry(3)
.flatMap(({ alreadyCompleted, points }) => {
return Observable.of(
makeToast({
message:
'Challenge saved.' +
(alreadyCompleted ? '' : ' First time Completed!'),
title: 'Saved',
type: 'info'
}),
updateUserPoints(user, points)
);
})
.catch(createErrorObservable);
const challengeCompleted$ = Observable.of(
makeToast({
title: randomCompliment(),
message: user ? ' Saving...' : 'Moving on to next challenge.',
type: 'success'
}),
moveToNextChallenge()
);
return Observable.merge(saveChallenge$, challengeCompleted$);
} }
const submitTypes = { const submitTypes = {