* fix(files): CreateFiles shouldn't preserve previous state * fix(Challenges): Use fileSpec when pulling from storage
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
        }, {});
 | 
						|
      }
 | 
						|
    }
 | 
						|
    return state;
 | 
						|
  }
 | 
						|
);
 |