All files / src/action/pattern arrayPattern.js

100% Statements 21/21
100% Branches 20/20
100% Functions 10/10
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73                    10x       18x       1x         18x       1x         18x       2x 2x 2x           18x       5x 5x 5x           18x 18x       18x 18x 18x 18x 18x       11x      
// @flow
 
import type {Pattern, Action, ArrayActionType} from '../types';
 
type ArrayAction = Action<ArrayActionType>;
 
export default class ArrayPattern implements Pattern<ArrayAction> {
  actions: Array<ArrayAction>;
 
  constructor() {
    this.actions = [];
  }
 
  removeAllActionIfDeleteAfterCreate = () => {
    if (this.actions.length >= 2 &&
      this.actions[0].type === 'CREATE_ARRAY' && 
      this.actions.slice(-1)[0].type === 'DELETE_ARRAY'
    ) {
      this.actions = [];
    }
  }
 
  removeAllUpdateBeforeDelete = () => {
    if (this.actions.length >= 2 &&
      this.actions[0].type !== 'CREATE_ARRAY' &&
      this.actions.slice(-1)[0].type === 'DELETE_ARRAY'
    ) {
      this.actions = this.actions.slice(-1);
    }
  }
 
  mergeAllUpdate = () => {
    if (this.actions.length >= 2 &&
      this.actions[0].type === 'UPDATE_ARRAY' && 
      this.actions.slice(-1)[0].type === 'UPDATE_ARRAY'
    ) {
      this.actions = [this.actions.reduce((result: Object, action: ArrayAction) => {
        result.payload.value = {...result.payload.value, ...action.payload.value};
        return result;
      })];
    }
  }
 
  mergeUpdateAndCreate = () => {
    if (this.actions.length >= 2 &&
      this.actions[0].type === 'CREATE_ARRAY' &&
      this.actions.slice(-1)[0].type === 'UPDATE_ARRAY'
    ) {
      this.actions = [this.actions.reduce((result: Object, action: ArrayAction) => {
        result.payload.value = {...result.payload.value, ...action.payload.value};
        return result;
      })];
    }
  }
 
  addAction = (action: ArrayAction) => {
    this.actions.push(action);
    this.mergeAction();
  }
 
  mergeAction = (): Array<ArrayAction> => {
    this.removeAllActionIfDeleteAfterCreate();
    this.removeAllUpdateBeforeDelete();
    this.mergeAllUpdate();
    this.mergeUpdateAndCreate();
    return this.actions;
  }
 
  getActions = (): Array<ArrayAction> => {
    return this.actions;
  }
}