about summary refs log tree commit diff
path: root/app/assets/javascripts/components/reducers/notifications.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/components/reducers/notifications.jsx')
-rw-r--r--app/assets/javascripts/components/reducers/notifications.jsx60
1 files changed, 46 insertions, 14 deletions
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;
   }