-
Notifications
You must be signed in to change notification settings - Fork 1
/
reducer.js
45 lines (39 loc) · 1.54 KB
/
reducer.js
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
import TYPES, {CALLS} from './types';
import {combineReducers} from 'redux';
import {extractCallFromType} from '../../util/Type';
import {byApiActionForCalls, doNothing, store } from '../../util/Redux';
const INITIAL_STATE = {
images: null,
loading: false,
errors: {},
};
const byApiAction = byApiActionForCalls(CALLS);
const startLoadingAndRemoveErrorForApiAction = combineReducers({
images: doNothing,
loading: (state = {}, action) =>
({...state, [extractCallFromType(action.type, CALLS)]: true }),
errors: doNothing,
});
const stopLoadingAndStoreErrorForApiAction = combineReducers({
images: doNothing,
loading: byApiAction(store(false)),
errors: (state = {}, action) =>
!action || !action.error ? state : {...state, [extractCallFromType(action.type, CALLS)]: action.error}
});
const HANDLERS = {
[TYPES.GET_DOGGOS_IMAGES]: startLoadingAndRemoveErrorForApiAction,
[TYPES.GET_DOGGOS_IMAGES_FAIL]: stopLoadingAndStoreErrorForApiAction,
[TYPES.GET_DOGGOS_IMAGES_SUCCESS]: combineReducers({
images: (state = [], action) =>
!action || !action.payload || !action.payload.results ? [] : action.payload.results,
loading: byApiAction(store(false)),
errors: doNothing,
}),
[TYPES.RESET_ERROR]: combineReducers({
images: doNothing,
loading: byApiAction(store(false)),
errors: (state = [], action) => null
})
};
export default (state = INITIAL_STATE, action = {}) =>
!HANDLERS[action.type] ? state : HANDLERS[action.type](state, action)