From 499beb4484031703f029511787163e3a5bb6e47a Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 7 Sep 2016 18:17:15 +0200
Subject: UI for uploading media attachments (and cancelling them) Mostly
 resolves #8, though attachments are still not displayed in public view

---
 .../javascripts/components/reducers/compose.jsx    | 26 +++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

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

diff --git a/app/assets/javascripts/components/reducers/compose.jsx b/app/assets/javascripts/components/reducers/compose.jsx
index 5dd093e9a..b4a21b874 100644
--- a/app/assets/javascripts/components/reducers/compose.jsx
+++ b/app/assets/javascripts/components/reducers/compose.jsx
@@ -5,7 +5,10 @@ import Immutable           from 'immutable';
 const initialState = Immutable.Map({
   text: '',
   in_reply_to: null,
-  is_submitting: false
+  is_submitting: false,
+  is_uploading: false,
+  progress: 0,
+  media_attachments: Immutable.List([])
 });
 
 export default function compose(state = initialState, action) {
@@ -19,16 +22,33 @@ export default function compose(state = initialState, action) {
       });
     case constants.COMPOSE_REPLY_CANCEL:
       return state.withMutations(map => {
-        map.set('in_reply_to', null).set('text', '');
+        map.set('in_reply_to', null);
+        map.set('text', '');
       });
     case constants.COMPOSE_SUBMIT_REQUEST:
       return state.set('is_submitting', true);
     case constants.COMPOSE_SUBMIT_SUCCESS:
       return state.withMutations(map => {
-        map.set('text', '').set('is_submitting', false).set('in_reply_to', null);
+        map.set('text', '');
+        map.set('is_submitting', false);
+        map.set('in_reply_to', null);
+        map.update('media_attachments', list => list.clear());
       });
     case constants.COMPOSE_SUBMIT_FAIL:
       return state.set('is_submitting', false);
+    case constants.COMPOSE_UPLOAD_REQUEST:
+      return state.set('is_uploading', true);
+    case constants.COMPOSE_UPLOAD_SUCCESS:
+      return state.withMutations(map => {
+        map.update('media_attachments', list => list.push(Immutable.fromJS(action.media)));
+        map.set('is_uploading', false);
+      });
+    case constants.COMPOSE_UPLOAD_FAIL:
+      return state.set('is_uploading', false);
+    case constants.COMPOSE_UPLOAD_UNDO:
+      return state.update('media_attachments', list => list.filterNot(item => item.get('id') === action.media_id));
+    case constants.COMPOSE_UPLOAD_PROGRESS:
+      return state.set('progress', Math.round((action.loaded / action.total) * 100));
     case TIMELINE_DELETE:
       if (action.id === state.get('in_reply_to')) {
         return state.set('in_reply_to', null);
-- 
cgit 

