github.com/stampzilla/stampzilla-go@v2.0.0-rc9+incompatible/nodes/stampzilla-server/web/src/ducks/connection.js (about) 1 import { List, Map } from 'immutable'; 2 import { defineAction } from 'redux-define'; 3 4 const c = defineAction( 5 'connection', 6 ['CONNECTED', 'DISCONNECTED', 'ERROR', 'RECEIVED'], 7 ); 8 9 const defaultState = Map({ 10 connected: null, 11 error: null, 12 messages: List(), 13 }); 14 15 // Actions 16 export function connected() { 17 return { type: c.CONNECTED }; 18 } 19 20 export function disconnected() { 21 return (dispatch, getState) => { 22 if (getState().getIn(['connection', 'connected']) !== false) { 23 dispatch({ type: c.DISCONNECTED }); 24 } 25 }; 26 } 27 28 export function error(err) { 29 return { type: c.ERROR, error: err }; 30 } 31 32 export function received(message) { 33 return { type: c.RECEIVED, message }; 34 } 35 36 // Reducer 37 let idCount = 0; 38 export default function reducer(state = defaultState, action) { 39 switch (action.type) { 40 case c.CONNECTED: { 41 return state 42 .set('error', null) 43 .set('connected', true); 44 } 45 case c.DISCONNECTED: { 46 return state 47 .set('connected', false); 48 } 49 case c.ERROR: { 50 return state 51 .set('error', action.error); 52 } 53 case c.RECEIVED: { 54 idCount += 1; 55 return state 56 .set('messages', state.get('messages').push({ 57 ...action.message, 58 id: idCount, 59 }).slice(-10)); 60 } 61 default: return state; 62 } 63 }