Files
freeCodeCamp/common/app/routes/challenges/redux/reducer.js

151 lines
3.6 KiB
JavaScript
Raw Normal View History

import { handleActions } from 'redux-actions';
2016-05-11 18:38:08 -07:00
import { createPoly } from '../../../../utils/polyvinyl';
import types from './types';
2016-06-07 20:41:42 -07:00
import { bonfire, html, js } from '../../../utils/challengeTypes';
2016-05-20 12:42:26 -07:00
import {
arrayToString,
buildSeed,
createTests,
getPreFile,
getFileKey
} from '../utils';
const initialState = {
2016-05-27 22:07:10 -07:00
id: '',
challenge: '',
2016-05-27 22:07:10 -07:00
legacyKey: '',
2016-06-08 18:48:30 -07:00
// step
currentIndex: 0,
previousIndex: -1,
isActionCompleted: false,
// map
filter: '',
2016-06-01 15:52:08 -07:00
superBlocks: [],
2016-06-08 18:48:30 -07:00
// modern
files: {},
// misc
2016-06-01 15:52:08 -07:00
toast: 0
};
2016-05-11 18:38:08 -07:00
const mainReducer = handleActions(
{
2016-05-10 21:25:12 -07:00
[types.fetchChallengeCompleted]: (state, { payload = '' }) => ({
...state,
challenge: payload
}),
2016-05-10 21:25:12 -07:00
[types.updateCurrentChallenge]: (state, { payload: challenge }) => ({
...state,
2016-05-27 22:07:10 -07:00
id: challenge.id,
// used mainly to find code storage
legacyKey: challenge.name,
challenge: challenge.dashedName,
2016-05-20 12:42:26 -07:00
key: getFileKey(challenge),
2016-05-13 20:04:56 -07:00
tests: createTests(challenge)
}),
[types.updateTests]: (state, { payload: tests }) => ({
...state,
tests
}),
[types.executeChallenge]: state => ({
...state,
tests: state.tests.map(test => ({ ...test, err: false, pass: false }))
}),
2016-06-01 15:52:08 -07:00
[types.showChallengeComplete]: (state, { payload: toast }) => ({
...state,
toast
}),
2016-06-07 20:41:42 -07:00
[types.showProjectSubmit]: state => ({
...state,
isSubmitting: true
}),
// map
[types.updateFilter]: (state, { payload = ''}) => ({
...state,
filter: payload
}),
[types.clearFilter]: (state) => ({
...state,
filter: ''
}),
[types.fetchChallengesCompleted]: (state, { payload = [] }) => ({
...state,
superBlocks: payload
}),
// step
[types.resetStep]: () => initialState,
[types.goToStep]: (state, { payload: step = 0 }) => ({
...state,
2016-06-08 18:48:30 -07:00
currentIndex: step,
previousIndex: state.currentIndex,
isActionCompleted: false
}),
[types.completeAction]: state => ({
...state,
isActionCompleted: true
}),
2016-06-08 18:48:30 -07:00
// classic/modern
[types.initOutput]: (state, { payload: output }) => ({
...state,
output
}),
[types.updateOutput]: (state, { payload: output }) => ({
...state,
output: (state.output || '') + output
})
},
initialState
);
2016-05-11 18:38:08 -07:00
const filesReducer = handleActions(
{
[types.updateFile]: (state, { payload: file }) => ({
...state,
2016-05-20 12:42:26 -07:00
[file.key]: file
2016-05-11 18:38:08 -07:00
}),
[types.updateFiles]: (state, { payload: files }) => {
return files
.reduce((files, file) => {
2016-05-20 12:42:26 -07:00
files[file.key] = file;
2016-05-11 18:38:08 -07:00
return files;
}, { ...state });
},
2016-05-27 22:07:10 -07:00
[types.savedCodeFound]: (state, { payload: files }) => ({
...files
}),
2016-05-11 18:38:08 -07:00
[types.updateCurrentChallenge]: (state, { payload: challenge }) => {
if (challenge.type === 'mod') {
return challenge.files;
}
if (
2016-06-07 20:41:42 -07:00
challenge.challengeType !== html &&
challenge.challengeType !== js &&
challenge.challengeType !== bonfire
) {
return {};
}
2016-05-20 12:42:26 -07:00
const preFile = getPreFile(challenge);
2016-05-11 18:38:08 -07:00
return {
...state,
2016-05-20 12:42:26 -07:00
[preFile.key]: createPoly({
...preFile,
2016-05-14 16:46:20 -07:00
contents: buildSeed(challenge),
head: arrayToString(challenge.head),
tail: arrayToString(challenge.tail)
})
2016-05-11 18:38:08 -07:00
};
}
},
{}
);
export default function challengeReducers(state, action) {
const newState = mainReducer(state, action);
const files = filesReducer(state && state.files || {}, action);
return newState.files !== files ? { ...newState, files } : newState;
}