|
@@ -1,69 +1,86 @@
|
|
|
-const defaultState = {};
|
|
|
-
|
|
|
const defaultPageState = {
|
|
|
isFetching: false,
|
|
|
- isLoaded: true,
|
|
|
isError: false,
|
|
|
children: {
|
|
|
items: [],
|
|
|
count: 0,
|
|
|
- isFetching: false,
|
|
|
},
|
|
|
meta: {
|
|
|
children: {},
|
|
|
},
|
|
|
};
|
|
|
|
|
|
-export default function nodes(prevState = defaultState, { type, payload }) {
|
|
|
- const state = Object.assign({}, prevState);
|
|
|
-
|
|
|
+/**
|
|
|
+ * A single page node in the explorer.
|
|
|
+ */
|
|
|
+const node = (state = defaultPageState, { type, payload }) => {
|
|
|
switch (type) {
|
|
|
case 'OPEN_EXPLORER':
|
|
|
- state[payload.id] = Object.assign({}, defaultPageState, state[payload.id]);
|
|
|
- break;
|
|
|
+ return state || defaultPageState;
|
|
|
|
|
|
case 'GET_PAGE_SUCCESS':
|
|
|
- state[payload.id] = Object.assign({}, state[payload.id], payload.data);
|
|
|
- state[payload.id].isError = false;
|
|
|
- break;
|
|
|
+ return Object.assign({}, state, payload.data, {
|
|
|
+ isError: false,
|
|
|
+ });
|
|
|
|
|
|
case 'GET_CHILDREN_START':
|
|
|
- state[payload.id] = Object.assign({}, state[payload.id]);
|
|
|
- state[payload.id].isFetching = true;
|
|
|
- state[payload.id].children = Object.assign({}, state[payload.id].children);
|
|
|
- state[payload.id].children.isFetching = true;
|
|
|
- break;
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ isFetching: true,
|
|
|
+ });
|
|
|
|
|
|
case 'GET_CHILDREN_SUCCESS':
|
|
|
- state[payload.id] = Object.assign({}, state[payload.id]);
|
|
|
- state[payload.id].isFetching = false;
|
|
|
- state[payload.id].isError = false;
|
|
|
- state[payload.id].children = Object.assign({}, state[payload.id].children, {
|
|
|
- items: state[payload.id].children.items.slice(),
|
|
|
- count: payload.meta.total_count,
|
|
|
+ return Object.assign({}, state, {
|
|
|
isFetching: false,
|
|
|
- isLoaded: true,
|
|
|
isError: false,
|
|
|
+ children: {
|
|
|
+ items: state.children.items.slice().concat(payload.items.map(item => item.id)),
|
|
|
+ count: payload.meta.total_count,
|
|
|
+ },
|
|
|
});
|
|
|
|
|
|
- payload.items.forEach((item) => {
|
|
|
- state[item.id] = Object.assign({}, defaultPageState, state[item.id], item);
|
|
|
-
|
|
|
- state[payload.id].children.items.push(item.id);
|
|
|
+ case 'GET_PAGE_FAILURE':
|
|
|
+ case 'GET_CHILDREN_FAILURE':
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ isFetching: false,
|
|
|
+ isError: true,
|
|
|
});
|
|
|
- break;
|
|
|
|
|
|
+ default:
|
|
|
+ return state;
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const defaultState = {};
|
|
|
+
|
|
|
+/**
|
|
|
+ * Contains all of the page nodes in one object.
|
|
|
+ */
|
|
|
+export default function nodes(state = defaultState, { type, payload }) {
|
|
|
+ switch (type) {
|
|
|
+
|
|
|
+ case 'OPEN_EXPLORER':
|
|
|
+ case 'GET_PAGE_SUCCESS':
|
|
|
+ case 'GET_CHILDREN_START':
|
|
|
case 'GET_PAGE_FAILURE':
|
|
|
case 'GET_CHILDREN_FAILURE':
|
|
|
- state[payload.id] = Object.assign({}, state[payload.id]);
|
|
|
- state[payload.id].isFetching = false;
|
|
|
- state[payload.id].isError = true;
|
|
|
- state[payload.id].children.isFetching = false;
|
|
|
- break;
|
|
|
+ return Object.assign({}, state, {
|
|
|
+ // Delegate logic to single-node reducer.
|
|
|
+ [payload.id]: node(state[payload.id], { type, payload }),
|
|
|
+ });
|
|
|
+
|
|
|
+ // eslint-disable-next-line no-case-declarations
|
|
|
+ case 'GET_CHILDREN_SUCCESS':
|
|
|
+ const newState = Object.assign({}, state, {
|
|
|
+ [payload.id]: node(state[payload.id], { type, payload }),
|
|
|
+ });
|
|
|
+
|
|
|
+ payload.items.forEach((item) => {
|
|
|
+ newState[item.id] = Object.assign({}, defaultPageState, item);
|
|
|
+ });
|
|
|
+
|
|
|
+ return newState;
|
|
|
|
|
|
default:
|
|
|
- break;
|
|
|
+ return state;
|
|
|
}
|
|
|
-
|
|
|
- return state;
|
|
|
}
|