Refactor(challenges): refactor challenge completion saga
This commit is contained in:
@ -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 = {
|
||||||
|
Reference in New Issue
Block a user