2016-10-02 20:57:00 +00:00
|
|
|
import * as db from '../../../backend/database';
|
2016-11-10 01:15:27 +00:00
|
|
|
import * as models from '../../../backend/models';
|
2016-09-02 05:45:12 +00:00
|
|
|
|
|
|
|
const ENTITY_BLACKLIST = {
|
2016-11-10 01:15:27 +00:00
|
|
|
[models.response.type]: 1,
|
|
|
|
[models.stats.type]: 1
|
2016-09-02 05:45:12 +00:00
|
|
|
};
|
2016-04-26 07:29:24 +00:00
|
|
|
|
2016-09-22 03:32:12 +00:00
|
|
|
const ENTITY_CHANGES = 'entities.changes';
|
2016-04-26 07:29:24 +00:00
|
|
|
|
|
|
|
// ~~~~~~~~ //
|
|
|
|
// REDUCERS //
|
|
|
|
// ~~~~~~~~ //
|
|
|
|
|
2016-09-22 03:32:12 +00:00
|
|
|
function getReducerName (type) {
|
|
|
|
const trailer = type.match(/s$/) ? '' : 's';
|
|
|
|
return `${type.slice(0, 1).toLowerCase()}${type.slice(1)}${trailer}`;
|
2016-04-26 07:29:24 +00:00
|
|
|
}
|
|
|
|
|
2016-09-22 03:32:12 +00:00
|
|
|
const initialState = {
|
|
|
|
doNotPersist: true
|
|
|
|
};
|
|
|
|
|
2016-11-10 01:15:27 +00:00
|
|
|
for (const type of models.types()) {
|
2016-09-22 03:32:12 +00:00
|
|
|
initialState[getReducerName(type)] = {};
|
2016-08-15 17:04:36 +00:00
|
|
|
}
|
|
|
|
|
2016-09-22 03:32:12 +00:00
|
|
|
export default function reducer (state = initialState, action) {
|
|
|
|
switch (action.type) {
|
|
|
|
case ENTITY_CHANGES:
|
|
|
|
const newState = {...state};
|
|
|
|
const {changes} = action;
|
|
|
|
for (const [event, doc] of changes) {
|
|
|
|
const referenceName = getReducerName(doc.type);
|
|
|
|
|
|
|
|
if (ENTITY_BLACKLIST[doc.type]) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (event) {
|
|
|
|
case db.CHANGE_INSERT:
|
|
|
|
case db.CHANGE_UPDATE:
|
|
|
|
newState[referenceName][doc._id] = doc;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case db.CHANGE_REMOVE:
|
|
|
|
delete newState[referenceName][doc._id];
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return newState;
|
|
|
|
default:
|
|
|
|
return state;
|
|
|
|
}
|
|
|
|
}
|
2016-04-26 07:29:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
// ~~~~~~~ //
|
|
|
|
// ACTIONS //
|
|
|
|
// ~~~~~~~ //
|
|
|
|
|
2016-09-22 03:32:12 +00:00
|
|
|
export function addChanges (changes) {
|
|
|
|
return {type: ENTITY_CHANGES, changes};
|
2016-04-26 07:29:24 +00:00
|
|
|
}
|