about summary refs log tree commit diff
path: root/app/assets/javascripts/components/reducers/timelines.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/components/reducers/timelines.jsx')
-rw-r--r--app/assets/javascripts/components/reducers/timelines.jsx24
1 files changed, 19 insertions, 5 deletions
diff --git a/app/assets/javascripts/components/reducers/timelines.jsx b/app/assets/javascripts/components/reducers/timelines.jsx
index 2e0f70c24..983518df7 100644
--- a/app/assets/javascripts/components/reducers/timelines.jsx
+++ b/app/assets/javascripts/components/reducers/timelines.jsx
@@ -1,16 +1,30 @@
-import { TIMELINE_SET, TIMELINE_UPDATE } from '../actions/timelines';
-import Immutable                         from 'immutable';
+import { TIMELINE_SET, TIMELINE_UPDATE }    from '../actions/timelines';
+import { REBLOG_SUCCESS, FAVOURITE_SUCCESS } from '../actions/interactions';
+import Immutable                            from 'immutable';
 
 const initialState = Immutable.Map();
 
+function updateMatchingStatuses(state, needle, callback) {
+  return state.map(function (list) {
+    return list.map(function (status) {
+      if (status.get('id') === needle.get('id')) {
+        return callback(status);
+      }
+
+      return status;
+    });
+  });
+};
+
 export default function timelines(state = initialState, action) {
   switch(action.type) {
     case TIMELINE_SET:
       return state.set(action.timeline, Immutable.fromJS(action.statuses));
     case TIMELINE_UPDATE:
-      return state.update(action.timeline, function (list) {
-        return list.unshift(Immutable.fromJS(action.status));
-      });
+      return state.update(action.timeline, list => list.unshift(Immutable.fromJS(action.status)));
+    case REBLOG_SUCCESS:
+    case FAVOURITE_SUCCESS:
+      return updateMatchingStatuses(state, action.status, () => Immutable.fromJS(action.response));
     default:
       return state;
   }