github.com/stampzilla/stampzilla-go@v2.0.0-rc9+incompatible/nodes/stampzilla-server/web/src/ducks/rules.js (about) 1 import { Map, fromJS } from 'immutable'; 2 import { defineAction } from 'redux-define'; 3 import makeUUID from 'uuid/v4'; 4 5 const c = defineAction( 6 'rules', 7 ['ADD', 'SAVE', 'UPDATE', 'UPDATE_STATE'], 8 ); 9 10 const defaultState = Map({ 11 list: Map(), 12 state: Map(), 13 }); 14 15 // Actions 16 export function add(rule) { 17 return { type: c.ADD, rule }; 18 } 19 export function save(rule) { 20 return { type: c.SAVE, rule }; 21 } 22 export function update(rules) { 23 return { type: c.UPDATE, rules }; 24 } 25 export function updateState(rules) { 26 return { type: c.UPDATE_STATE, rules }; 27 } 28 29 // Subscribe to channels and register the action for the packages 30 export function subscribe(dispatch) { 31 return { 32 rules: rules => dispatch(update(rules)), 33 server: ({ rules }) => rules && dispatch(updateState(rules)), 34 }; 35 } 36 37 // Reducer 38 export default function reducer(state = defaultState, action) { 39 switch (action.type) { 40 case c.ADD: { 41 const rule = { 42 ...action.rule, 43 uuid: makeUUID(), 44 }; 45 return state 46 .setIn(['list', rule.uuid], fromJS(rule)); 47 } 48 case c.SAVE: { 49 return state 50 .mergeIn(['list', action.rule.uuid], fromJS(action.rule)); 51 } 52 case c.UPDATE: { 53 return state 54 .set('list', fromJS(action.rules)); 55 } 56 case c.UPDATE_STATE: { 57 return state 58 .set('state', fromJS(action.rules)); 59 } 60 default: return state; 61 } 62 }