aboutsummaryrefslogtreecommitdiff
path: root/src/client/react/reducers.js
diff options
context:
space:
mode:
authorNoah Loomans <noahloomans@gmail.com>2018-02-19 22:49:26 +0100
committerNoah Loomans <noahloomans@gmail.com>2018-02-19 22:49:26 +0100
commit5be066cc2714ca6cbd75d8786c859d8767df0ccb (patch)
tree4b9b66e68612eb9df03a73453907031c03420415 /src/client/react/reducers.js
parent50671ed027f874992ac50cfb21e123f579440737 (diff)
Merge reducers into single file
Diffstat (limited to 'src/client/react/reducers.js')
-rw-r--r--src/client/react/reducers.js126
1 files changed, 118 insertions, 8 deletions
diff --git a/src/client/react/reducers.js b/src/client/react/reducers.js
index 13795f7..accf464 100644
--- a/src/client/react/reducers.js
+++ b/src/client/react/reducers.js
@@ -18,13 +18,123 @@
*
*/
-import { combineReducers } from 'redux';
-import search from './reducers/search';
-import view from './reducers/view';
+import getSearchResults from './lib/getSearchResults';
+import users from './users';
-const rootReducer = combineReducers({
- search,
- view,
-});
+const DEFAULT_STATE = {
+ // results: [
+ // 's/18562',
+ // ],
+ search: {
+ results: [],
+ text: '',
+ selected: null,
+ },
+ schedules: {},
+};
-export default rootReducer;
+const schedule = (state = {}, action) => {
+ switch (action.type) {
+ case 'VIEW/FETCH_SCHEDULE_REQUEST':
+ return {
+ ...state,
+ state: 'FETCHING',
+ };
+ case 'VIEW/FETCH_SCHEDULE_SUCCESS':
+ return {
+ ...state,
+ state: 'FINISHED',
+ htmlStr: action.htmlStr,
+ };
+ default:
+ return state;
+ }
+};
+
+function reducer(state = DEFAULT_STATE, action) {
+ switch (action.type) {
+ case 'SEARCH/SET_USER': {
+ const { user } = action;
+
+ if (user == null) {
+ return {
+ ...state,
+ search: DEFAULT_STATE.search,
+ };
+ }
+
+ return {
+ ...state,
+ search: {
+ results: [],
+ text: users.byId[user].value,
+ selected: user,
+ },
+ };
+ }
+
+ case 'SEARCH/INPUT_CHANGE':
+ return {
+ ...state,
+ search: {
+ results: getSearchResults(action.searchText),
+ text: action.searchText,
+ selected: null,
+ },
+ };
+
+ case 'SEARCH/CHANGE_SELECTED_RESULT': {
+ const prevSelectedResult = state.search.selected;
+ const prevSelectedResultIndex = state.search.results.indexOf(prevSelectedResult);
+ let nextSelectedResultIndex =
+ prevSelectedResultIndex + action.relativeChange;
+
+ if (nextSelectedResultIndex < -1) {
+ nextSelectedResultIndex = state.search.results.length - 1;
+ } else if (nextSelectedResultIndex > state.search.results.length - 1) {
+ nextSelectedResultIndex = -1;
+ }
+
+ const nextSelectedResult =
+ nextSelectedResultIndex === -1
+ ? null
+ : state.search.results[nextSelectedResultIndex];
+
+ return {
+ ...state,
+ search: {
+ ...state.search,
+ selected: nextSelectedResult,
+ },
+ };
+ }
+
+ case 'VIEW/FETCH_SCHEDULE_REQUEST':
+ case 'VIEW/FETCH_SCHEDULE_SUCCESS':
+ return {
+ ...state,
+ schedules: {
+ ...state.schedules,
+ [action.user]:
+ state.schedules[action.user]
+ ? {
+ // This user already exists in our state, extend it.
+ ...state.schedules[action.user],
+ [action.week]: schedule(state.schedules[action.user][action.week], action),
+ }
+ : {
+ // This user does not already exist in our state.
+ [action.week]: schedule(undefined, action),
+ },
+ },
+ };
+
+ default:
+ return state;
+ }
+}
+
+export default reducer;
+export const _test = {
+ DEFAULT_STATE,
+};