freeCodeCamp/common/app/files/index.js

54 lines
1.4 KiB
JavaScript

import _ from 'lodash';
import {
addNS,
createTypes
} from 'berkeleys-redux-utils';
import { createPoly, setContent } from '../../utils/polyvinyl.js';
const ns = 'files';
export const types = createTypes([
'updateFile',
'createFiles'
], ns);
export const updateFileMetaCreator = (key, content)=> ({
file: { type: types.updateFile, payload: { key, content } }
});
export const createFilesMetaCreator = payload => ({
file: { type: types.createFiles, payload }
});
export const filesSelector = state => state[ns];
export const createFileSelector = keySelector => (state, props) => {
const files = filesSelector(state);
return files[keySelector(state, props)] || {};
};
const getFileAction = _.property('meta.file.type');
const getFilePayload = _.property('meta.file.payload');
export default addNS(
ns,
function reducer(state = {}, action) {
if (getFileAction(action)) {
if (getFileAction(action) === types.updateFile) {
const { key, content } = getFilePayload(action);
return {
...state,
[key]: setContent(content, state[key])
};
}
if (getFileAction(action) === types.createFiles) {
const files = getFilePayload(action);
return _.reduce(files, (files, file) => {
files[file.key] = createPoly(file);
return files;
}, { ...state });
}
}
return state;
}
);