From 74ef968a45e147069d044fbfde814886d7275aa3 Mon Sep 17 00:00:00 2001
From: Noah Loomans <noahloomans@gmail.com>
Date: Fri, 6 Jul 2018 18:36:55 +0200
Subject: client/View: Move API call to action

---
 src/client/react/store/actions.js  | 42 ++++++++++++++++++++++++++++++++++++++
 src/client/react/store/reducers.js |  4 ++--
 2 files changed, 44 insertions(+), 2 deletions(-)

(limited to 'src/client/react/store')

diff --git a/src/client/react/store/actions.js b/src/client/react/store/actions.js
index e7ef91d..2157030 100644
--- a/src/client/react/store/actions.js
+++ b/src/client/react/store/actions.js
@@ -4,6 +4,7 @@ import users from '../users';
 import { selectUser, selectWeek, selectCurrentWeek } from './selectors';
 import purifyWeek from '../lib/purifyWeek';
 import withinRange from '../lib/withinRange';
+import extractSchedule from '../lib/extractSchedule';
 
 function updatePathname(pathname = '') {
   return (dispatch, getState) => {
@@ -83,3 +84,44 @@ export function showRoomFinder() {
     dispatch({ type: 'ROOM_FINDER/SHOW' });
   };
 }
+
+const fetchScheduleStart = (user, week) => ({
+  type: 'VIEW/FETCH_SCHEDULE_START', user, week,
+});
+
+const fetchScheduleSuccess = (user, week, htmlStr) => ({
+  type: 'VIEW/FETCH_SCHEDULE_SUCCESS', user, week, htmlStr,
+});
+
+const fetchScheduleError = (user, week) => ({
+  type: 'VIEW/FETCH_SCHEDULE_ERROR', user, week,
+});
+
+
+export function fetchScheduleIfNeeded(user, week) {
+  return (dispatch, getState) => {
+    const { schedules } = getState();
+    const schedule = extractSchedule(schedules, user, week);
+
+    if (schedule.state !== 'NOT_REQUESTED') {
+      return;
+    }
+
+    dispatch(fetchScheduleStart(user, week));
+
+    fetch(`/get/${user}?week=${week}`)
+      .then(r => r.text())
+      .then(
+      // success
+        (htmlStr) => {
+          dispatch(fetchScheduleSuccess(user, week, htmlStr));
+        },
+
+        // error
+        () => {
+          // TODO: Handle error status
+          dispatch(fetchScheduleError(user, week));
+        },
+      );
+  };
+}
diff --git a/src/client/react/store/reducers.js b/src/client/react/store/reducers.js
index cd68d96..3e39096 100644
--- a/src/client/react/store/reducers.js
+++ b/src/client/react/store/reducers.js
@@ -30,7 +30,7 @@ const DEFAULT_STATE = {
 
 const schedule = (state = {}, action) => {
   switch (action.type) {
-    case 'VIEW/FETCH_SCHEDULE_REQUEST':
+    case 'VIEW/FETCH_SCHEDULE_START':
       return {
         ...state,
         state: 'FETCHING',
@@ -103,7 +103,7 @@ function reducer(state = DEFAULT_STATE, action) {
         isRoomFinderVisible: false,
       };
 
-    case 'VIEW/FETCH_SCHEDULE_REQUEST':
+    case 'VIEW/FETCH_SCHEDULE_START':
     case 'VIEW/FETCH_SCHEDULE_SUCCESS':
       return {
         ...state,
-- 
cgit v1.1