/
reducer.js
52 lines (46 loc) · 1.41 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
46
47
48
49
50
51
52
const defaultState = {
resources: {},
};
export default function reducer( state = defaultState, action ) {
switch ( action.type ) {
case 'FRESH_DATA_REQUESTED':
return reduceRequested( state, action );
case 'FRESH_DATA_RECEIVED':
return reduceReceived( state, action );
default:
return state;
}
}
export function reduceRequested( state, action ) {
const newResources = action.resourceNames.reduce( ( resources, name ) => {
resources[ name ] = { lastRequested: action.time };
return resources;
}, {} );
return reduceResources( state, newResources );
}
export function reduceReceived( state, action ) {
const newResources = Object.keys( action.resources ).reduce( ( resources, name ) => {
const resource = { ...action.resources[ name ] };
if ( resource.data ) {
resource.lastReceived = action.time;
}
if ( resource.error ) {
resource.lastError = action.time;
}
resources[ name ] = resource;
return resources;
}, {} );
return reduceResources( state, newResources );
}
export function reduceResources( state, newResources ) {
const updatedResources = Object.keys( newResources ).reduce(
( resources, resourceName ) => {
const resource = resources[ resourceName ];
const newResource = newResources[ resourceName ];
resources[ resourceName ] = { ...resource, ...newResource };
return resources;
},
{ ...state.resources }
);
return { ...state, resources: updatedResources };
}