From 38dd85daab8e8342ec608d24cf81254c0dfde95c Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sun, 20 Nov 2016 19:39:18 +0100
Subject: Adding notifications column

---
 .../components/reducers/notifications.jsx          | 60 +++++++++++++++++-----
 1 file changed, 46 insertions(+), 14 deletions(-)

(limited to 'app/assets/javascripts/components/reducers/notifications.jsx')

diff --git a/app/assets/javascripts/components/reducers/notifications.jsx b/app/assets/javascripts/components/reducers/notifications.jsx
index efe8d9739..0e67e732a 100644
--- a/app/assets/javascripts/components/reducers/notifications.jsx
+++ b/app/assets/javascripts/components/reducers/notifications.jsx
@@ -1,24 +1,56 @@
 import {
-  NOTIFICATION_SHOW,
-  NOTIFICATION_DISMISS,
-  NOTIFICATION_CLEAR
+  NOTIFICATIONS_UPDATE,
+  NOTIFICATIONS_REFRESH_SUCCESS,
+  NOTIFICATIONS_EXPAND_SUCCESS
 } from '../actions/notifications';
 import Immutable from 'immutable';
 
-const initialState = Immutable.List([]);
+const initialState = Immutable.Map({
+  items: Immutable.List(),
+  next: null,
+  loaded: false
+});
+
+const notificationToMap = notification => Immutable.Map({
+  id: notification.id,
+  type: notification.type,
+  account: notification.account.id,
+  status: notification.status ? notification.status.id : null
+});
+
+const normalizeNotification = (state, notification) => {
+  return state.update('items', list => list.unshift(notificationToMap(notification)));
+};
+
+const normalizeNotifications = (state, notifications, next) => {
+  let items    = Immutable.List();
+  const loaded = state.get('loaded');
+
+  notifications.forEach((n, i) => {
+    items = items.set(i, notificationToMap(n));
+  });
+
+  return state.update('items', list => loaded ? list.unshift(...items) : list.push(...items)).set('next', next).set('loaded', true);
+};
+
+const appendNormalizedNotifications = (state, notifications, next) => {
+  let items = Immutable.List();
+
+  notifications.forEach((n, i) => {
+    items = items.set(i, notificationToMap(n));
+  });
+
+  return state.update('items', list => list.push(...items)).set('next', next);
+};
 
 export default function notifications(state = initialState, action) {
   switch(action.type) {
-    case NOTIFICATION_SHOW:
-      return state.push(Immutable.Map({
-        key: state.size > 0 ? state.last().get('key') + 1 : 0,
-        title: action.title,
-        message: action.message
-      }));
-    case NOTIFICATION_DISMISS:
-      return state.filterNot(item => item.get('key') === action.notification.key);
-    case NOTIFICATION_CLEAR:
-      return state.clear();
+    case NOTIFICATIONS_UPDATE:
+      return normalizeNotification(state, action.notification);
+    case NOTIFICATIONS_REFRESH_SUCCESS:
+      return normalizeNotifications(state, action.notifications, action.next);
+    case NOTIFICATIONS_EXPAND_SUCCESS:
+      return appendNormalizedNotifications(state, action.notifications, action.next);
     default:
       return state;
   }
-- 
cgit 

