From 2b5ec4a3c076bb1f18eeafbd96b0a80c6b8bfbaa Mon Sep 17 00:00:00 2001
From: JoramWilander <jwawilander@gmail.com>
Date: Thu, 15 Oct 2015 10:44:04 -0400
Subject: Small refactor of websocket code on client and server

---
 web/react/stores/socket_store.jsx | 188 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 181 insertions(+), 7 deletions(-)

(limited to 'web/react/stores/socket_store.jsx')

diff --git a/web/react/stores/socket_store.jsx b/web/react/stores/socket_store.jsx
index 77e7067ad..8645ef3b4 100644
--- a/web/react/stores/socket_store.jsx
+++ b/web/react/stores/socket_store.jsx
@@ -1,15 +1,22 @@
 // Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
 // See License.txt for license information.
 
-var AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
-var UserStore = require('./user_store.jsx');
-var ErrorStore = require('./error_store.jsx');
-var EventEmitter = require('events').EventEmitter;
+const AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
+const UserStore = require('./user_store.jsx');
+const PostStore = require('./post_store.jsx');
+const ChannelStore = require('./channel_store.jsx');
+const BrowserStore = require('./browser_store.jsx');
+const ErrorStore = require('./error_store.jsx');
+const EventEmitter = require('events').EventEmitter;
 
-var Constants = require('../utils/constants.jsx');
-var ActionTypes = Constants.ActionTypes;
+const Utils = require('../utils/utils.jsx');
+const AsyncClient = require('../utils/async_client.jsx');
 
-var CHANGE_EVENT = 'change';
+const Constants = require('../utils/constants.jsx');
+const ActionTypes = Constants.ActionTypes;
+const SocketEvents = Constants.SocketEvents;
+
+const CHANGE_EVENT = 'change';
 
 var conn;
 
@@ -21,6 +28,7 @@ class SocketStoreClass extends EventEmitter {
         this.emitChange = this.emitChange.bind(this);
         this.addChangeListener = this.addChangeListener.bind(this);
         this.removeChangeListener = this.removeChangeListener.bind(this);
+        this.handleMessage = this.handleMessage.bind(this);
         this.sendMessage = this.sendMessage.bind(this);
         this.failCount = 0;
 
@@ -94,6 +102,39 @@ class SocketStoreClass extends EventEmitter {
     removeChangeListener(callback) {
         this.removeListener(CHANGE_EVENT, callback);
     }
+    handleMessage(msg) {
+        switch (msg.action) {
+        case SocketEvents.POSTED:
+            handleNewPostEvent(msg);
+            break;
+
+        case SocketEvents.POST_EDITED:
+            handlePostEditEvent(msg);
+            break;
+
+        case SocketEvents.POST_DELETED:
+            handlePostDeleteEvent(msg);
+            break;
+
+        case SocketEvents.NEW_USER:
+            handleNewUserEvent();
+            break;
+
+        case SocketEvents.USER_ADDED:
+            handleUserAddedEvent(msg);
+            break;
+
+        case SocketEvents.USER_REMOVED:
+            handleUserRemovedEvent(msg);
+            break;
+
+        case SocketEvents.CHANNEL_VIEWED:
+            handleChannelViewedEvent(msg);
+            break;
+
+        default:
+        }
+    }
     sendMessage(msg) {
         if (conn && conn.readyState === WebSocket.OPEN) {
             conn.send(JSON.stringify(msg));
@@ -104,6 +145,138 @@ class SocketStoreClass extends EventEmitter {
     }
 }
 
+function handleNewPostEvent(msg) {
+    // Store post
+    const post = JSON.parse(msg.props.post);
+    PostStore.storePost(post);
+
+    // Update channel state
+    if (ChannelStore.getCurrentId() === msg.channel_id) {
+        if (window.isActive) {
+            AsyncClient.updateLastViewedAt();
+        }
+    } else {
+        AsyncClient.getChannel(msg.channel_id);
+    }
+
+    // Send desktop notification
+    if (UserStore.getCurrentId() !== msg.user_id) {
+        const msgProps = msg.props;
+
+        let mentions = [];
+        if (msgProps.mentions) {
+            mentions = JSON.parse(msg.props.mentions);
+        }
+
+        const channel = ChannelStore.get(msg.channel_id);
+        const user = UserStore.getCurrentUser();
+        const member = ChannelStore.getMember(msg.channel_id);
+
+        let notifyLevel = member && member.notify_props ? member.notify_props.desktop : 'default';
+        if (notifyLevel === 'default') {
+            notifyLevel = user.notify_props.desktop;
+        }
+
+        if (notifyLevel === 'none') {
+            return;
+        } else if (notifyLevel === 'mention' && mentions.indexOf(user.id) === -1 && channel.type !== 'D') {
+            return;
+        }
+
+        let username = 'Someone';
+        if (UserStore.hasProfile(msg.user_id)) {
+            username = UserStore.getProfile(msg.user_id).username;
+        }
+
+        let title = 'Posted';
+        if (channel) {
+            title = channel.display_name;
+        }
+
+        let notifyText = post.message.replace(/\n+/g, ' ');
+        if (notifyText.length > 50) {
+            notifyText = notifyText.substring(0, 49) + '...';
+        }
+
+        if (notifyText.length === 0) {
+            if (msgProps.image) {
+                Utils.notifyMe(title, username + ' uploaded an image', channel);
+            } else if (msgProps.otherFile) {
+                Utils.notifyMe(title, username + ' uploaded a file', channel);
+            } else {
+                Utils.notifyMe(title, username + ' did something new', channel);
+            }
+        } else {
+            Utils.notifyMe(title, username + ' wrote: ' + notifyText, channel);
+        }
+        if (!user.notify_props || user.notify_props.desktop_sound === 'true') {
+            Utils.ding();
+        }
+    }
+}
+
+function handlePostEditEvent(msg) {
+    // Store post
+    const post = JSON.parse(msg.props.post);
+    PostStore.storePost(post);
+
+    // Update channel state
+    if (ChannelStore.getCurrentId() === msg.channel_id) {
+        if (window.isActive) {
+            AsyncClient.updateLastViewedAt();
+        }
+    }
+}
+
+function handlePostDeleteEvent(msg) {
+    const post = JSON.parse(msg.props.post);
+
+    PostStore.storeUnseenDeletedPost(post);
+    PostStore.removePost(post, true);
+    PostStore.emitChange();
+}
+
+function handleNewUserEvent() {
+    AsyncClient.getProfiles();
+    AsyncClient.getChannelExtraInfo(true);
+}
+
+function handleUserAddedEvent(msg) {
+    if (ChannelStore.getCurrentId() === msg.channel_id) {
+        AsyncClient.getChannelExtraInfo(true);
+    }
+
+    if (UserStore.getCurrentId() === msg.user_id) {
+        AsyncClient.getChannel(msg.channel_id);
+    }
+}
+
+function handleUserRemovedEvent(msg) {
+    if (UserStore.getCurrentId() === msg.user_id) {
+        AsyncClient.getChannels();
+
+        if (msg.props.remover_id !== msg.user_id &&
+                msg.channel_id === ChannelStore.getCurrentId() &&
+                $('#removed_from_channel').length > 0) {
+            var sentState = {};
+            sentState.channelName = ChannelStore.getCurrent().display_name;
+            sentState.remover = UserStore.getProfile(msg.props.remover_id).username;
+
+            BrowserStore.setItem('channel-removed-state', sentState);
+            $('#removed_from_channel').modal('show');
+        }
+    } else if (ChannelStore.getCurrentId() === msg.channel_id) {
+        AsyncClient.getChannelExtraInfo(true);
+    }
+}
+
+function handleChannelViewedEvent(msg) {
+    // Useful for when multiple devices have the app open to different channels
+    if (ChannelStore.getCurrentId() !== msg.channel_id && UserStore.getCurrentId() === msg.user_id) {
+        AsyncClient.getChannel(msg.channel_id);
+    }
+}
+
 var SocketStore = new SocketStoreClass();
 
 SocketStore.dispatchToken = AppDispatcher.register((payload) => {
@@ -111,6 +284,7 @@ SocketStore.dispatchToken = AppDispatcher.register((payload) => {
 
     switch (action.type) {
     case ActionTypes.RECIEVED_MSG:
+        SocketStore.handleMessage(action.msg);
         SocketStore.emitChange(action.msg);
         break;
 
-- 
cgit v1.2.3-1-g7c22


From 93eaa80a3bfacbb0c4a350474ca3d81b28b5d7ab Mon Sep 17 00:00:00 2001
From: JoramWilander <jwawilander@gmail.com>
Date: Thu, 15 Oct 2015 11:12:09 -0400
Subject: Remove unnecessary bind

---
 web/react/stores/socket_store.jsx | 1 -
 1 file changed, 1 deletion(-)

(limited to 'web/react/stores/socket_store.jsx')

diff --git a/web/react/stores/socket_store.jsx b/web/react/stores/socket_store.jsx
index 8645ef3b4..77951f214 100644
--- a/web/react/stores/socket_store.jsx
+++ b/web/react/stores/socket_store.jsx
@@ -28,7 +28,6 @@ class SocketStoreClass extends EventEmitter {
         this.emitChange = this.emitChange.bind(this);
         this.addChangeListener = this.addChangeListener.bind(this);
         this.removeChangeListener = this.removeChangeListener.bind(this);
-        this.handleMessage = this.handleMessage.bind(this);
         this.sendMessage = this.sendMessage.bind(this);
         this.failCount = 0;
 
-- 
cgit v1.2.3-1-g7c22

