From 97ec42382487b5dff683a3d69b7942d58c00f816 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Fri, 29 Apr 2016 18:40:48 -0300 Subject: [PATCH] Make livechat client app less reactive --- .../app/client/lib/_visitor.coffee | 13 ++++ .../app/client/lib/chatMessages.coffee | 3 +- .../app/client/lib/collections.coffee | 5 +- .../client/lib/fromApp/Notifications.coffee | 11 ---- .../app/client/lib/triggers.js | 24 ++++---- .../app/client/startup/room.coffee | 10 ---- .../app/client/startup/triggers.js | 5 -- .../app/client/views/livechatWindow.js | 59 +++++++++++-------- .../app/client/views/messages.js | 11 +--- .../app/client/views/register.js | 2 - packages/rocketchat-livechat/package.js | 4 +- .../server/methods/getInitialData.js | 56 ++++++++++++++++++ .../publications/availableDepartments.js | 3 - .../server/publications/trigger.js | 3 - .../server/publications/visitorRoom.js | 12 ---- 15 files changed, 120 insertions(+), 101 deletions(-) delete mode 100644 packages/rocketchat-livechat/app/client/startup/room.coffee delete mode 100644 packages/rocketchat-livechat/app/client/startup/triggers.js create mode 100644 packages/rocketchat-livechat/server/methods/getInitialData.js delete mode 100644 packages/rocketchat-livechat/server/publications/availableDepartments.js delete mode 100644 packages/rocketchat-livechat/server/publications/trigger.js delete mode 100644 packages/rocketchat-livechat/server/publications/visitorRoom.js diff --git a/packages/rocketchat-livechat/app/client/lib/_visitor.coffee b/packages/rocketchat-livechat/app/client/lib/_visitor.coffee index 9bb1e6ca7d1..c758998ea08 100644 --- a/packages/rocketchat-livechat/app/client/lib/_visitor.coffee +++ b/packages/rocketchat-livechat/app/client/lib/_visitor.coffee @@ -1,3 +1,5 @@ +msgStream = new Meteor.Streamer 'room-messages' + @visitor = new class token = new ReactiveVar null room = new ReactiveVar null @@ -30,9 +32,20 @@ room.set(rid) return roomToSubscribe.set(rid) + subscribeToRoom = (roomId) -> + msgStream.on roomId, (msg) -> + if msg.t is 'command' + if msg.msg is 'survey' + unless $('body #survey').length + Blaze.render(Template.survey, $('body').get(0)) + else + ChatMessage.upsert { _id: msg._id }, msg + register: register getToken: getToken setRoom: setRoom getRoom: getRoom setRoomToSubscribe: setRoomToSubscribe getRoomToSubscribe: getRoomToSubscribe + + subscribeToRoom: subscribeToRoom diff --git a/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee b/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee index 9ca165e660d..e46e519bc44 100644 --- a/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee +++ b/packages/rocketchat-livechat/app/client/lib/chatMessages.coffee @@ -106,7 +106,8 @@ class @ChatMessages sendMessage (message) -> ChatMessage.update message._id, _.omit(message, '_id') if message.rid? - visitor.setRoomToSubscribe(message.rid) + visitor.subscribeToRoom(message.rid) + visitor.setRoom(message.rid) else sendMessage() diff --git a/packages/rocketchat-livechat/app/client/lib/collections.coffee b/packages/rocketchat-livechat/app/client/lib/collections.coffee index c86ad59f9dd..12be8dafa56 100644 --- a/packages/rocketchat-livechat/app/client/lib/collections.coffee +++ b/packages/rocketchat-livechat/app/client/lib/collections.coffee @@ -1,5 +1,2 @@ @ChatMessage = new Meteor.Collection null -@ChatRoom = new Meteor.Collection 'rocketchat_room' -@Settings = new Meteor.Collection 'rocketchat_settings' -@Trigger = new Meteor.Collection 'rocketchat_livechat_trigger' -@Department = new Meteor.Collection 'rocketchat_livechat_department' +@Department = new Meteor.Collection null diff --git a/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee b/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee index 56a4585af5d..9fd588378e2 100644 --- a/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee +++ b/packages/rocketchat-livechat/app/client/lib/fromApp/Notifications.coffee @@ -22,17 +22,6 @@ args.unshift "#{userId}/#{eventName}" @streamUser.emit.apply @streamUser, args - notifyUsersOfRoom: (room, eventName, args...) -> - console.log "RocketChat.Notifications: notifyUsersOfRoom", arguments if @debug is true - - onlineUsers = RoomManager.onlineUsers.get() - room = ChatRoom.findOne(room) - for username in room?.usernames or [] - if onlineUsers[username]? - argsToSend = ["#{onlineUsers[username]._id}/#{eventName}"].concat args - @streamUser.emit.apply @streamUser, argsToSend - - onAll: (eventName, callback) -> @streamAll.on eventName, callback diff --git a/packages/rocketchat-livechat/app/client/lib/triggers.js b/packages/rocketchat-livechat/app/client/lib/triggers.js index 1ea4fcf9876..0e7eccde0b0 100644 --- a/packages/rocketchat-livechat/app/client/lib/triggers.js +++ b/packages/rocketchat-livechat/app/client/lib/triggers.js @@ -5,7 +5,7 @@ this.Triggers = (function() { var fire = function(actions) { if (Meteor.userId()) { - console.log('already logged user - does nothing'); + // console.log('already logged user - does nothing'); return; } actions.forEach(function(action) { @@ -57,23 +57,25 @@ this.Triggers = (function() { }); }; + var setTriggers = function(newTriggers) { + triggers = newTriggers; + }; + var init = function() { initiated = true; - Tracker.autorun(function() { - triggers = Trigger.find().fetch(); - if (requests.length > 0 && triggers.length > 0) { - requests.forEach(function(request) { - processRequest(request); - }); + if (requests.length > 0 && triggers.length > 0) { + requests.forEach(function(request) { + processRequest(request); + }); - requests = []; - } - }); + requests = []; + } }; return { init: init, - processRequest: processRequest + processRequest: processRequest, + setTriggers: setTriggers }; }()); diff --git a/packages/rocketchat-livechat/app/client/startup/room.coffee b/packages/rocketchat-livechat/app/client/startup/room.coffee deleted file mode 100644 index cc1e9bfddb3..00000000000 --- a/packages/rocketchat-livechat/app/client/startup/room.coffee +++ /dev/null @@ -1,10 +0,0 @@ -msgStream = new Meteor.Streamer 'room-messages' -Tracker.autorun -> - if visitor.getRoomToSubscribe()? - msgStream.on visitor.getRoomToSubscribe(), (msg) -> - if msg.t is 'command' - if msg.msg is 'survey' - unless $('body #survey').length - Blaze.render(Template.survey, $('body').get(0)) - else - ChatMessage.upsert { _id: msg._id }, msg diff --git a/packages/rocketchat-livechat/app/client/startup/triggers.js b/packages/rocketchat-livechat/app/client/startup/triggers.js deleted file mode 100644 index bb62aee1282..00000000000 --- a/packages/rocketchat-livechat/app/client/startup/triggers.js +++ /dev/null @@ -1,5 +0,0 @@ -Meteor.startup(function() { - Meteor.subscribe('livechat:trigger', function() { - Triggers.init(); - }); -}); diff --git a/packages/rocketchat-livechat/app/client/views/livechatWindow.js b/packages/rocketchat-livechat/app/client/views/livechatWindow.js index 3ee2fb5c661..4c397091e51 100644 --- a/packages/rocketchat-livechat/app/client/views/livechatWindow.js +++ b/packages/rocketchat-livechat/app/client/views/livechatWindow.js @@ -1,17 +1,10 @@ +/* globals Department */ Template.livechatWindow.helpers({ title() { - var ref; - if (!Template.instance().subscriptionsReady()) { - return ''; - } - return ((ref = Settings.findOne('Livechat_title')) != null ? ref.value : void 0) || 'Rocket.Chat'; + return Template.instance().title.get(); }, color() { - var ref; - if (!Template.instance().subscriptionsReady()) { - return 'transparent'; - } - return ((ref = Settings.findOne('Livechat_title_color')) != null ? ref.value : void 0) || '#C1272D'; + return Template.instance().color.get(); }, popoutActive() { return FlowRouter.getQueryParam('mode') === 'popout'; @@ -20,14 +13,13 @@ Template.livechatWindow.helpers({ if (Session.get('triggered') || Meteor.userId()) { return false; } - var form = Settings.findOne('Livechat_registration_form'); - return form.value; + return Template.instance().registrationForm.get(); }, livechatStartedEnabled() { - return Template.instance().startedEnabled.get() !== null; + return Template.instance().enabled.get() !== null; }, livechatEnabled() { - return Template.instance().startedEnabled.get(); + return Template.instance().enabled.get(); } }); @@ -42,22 +34,37 @@ Template.livechatWindow.events({ }); Template.livechatWindow.onCreated(function() { - this.startedEnabled = new ReactiveVar(null); + this.enabled = new ReactiveVar(null); - this.subscribe('settings', ['Livechat_title', 'Livechat_title_color', 'Livechat_enabled', 'Livechat_registration_form']); + this.title = new ReactiveVar('Rocket.Chat'); + this.color = new ReactiveVar('#C1272D'); + this.registrationForm = new ReactiveVar(true); - var initialCheck = true; + // get all needed live chat info for the user + Meteor.call('livechat:getInitialData', visitor.getToken(), (err, result) => { + if (err) { + console.error(err); + } else { + if (!result.enabled) { + return parentCall('removeWidget'); + } + this.enabled.set(result.enabled); + this.title.set(result.title); + this.color.set(result.color); + this.registrationForm.set(result.registrationForm); - this.autorun(() => { - if (this.subscriptionsReady()) { - var enabled = Settings.findOne('Livechat_enabled'); - if (enabled !== undefined) { - if (!enabled.value && initialCheck) { - parentCall('removeWidget'); - } - initialCheck = false; - this.startedEnabled.set(enabled.value); + if (result.room) { + RoomHistoryManager.getMoreIfIsEmpty(result.room._id); + visitor.subscribeToRoom(result.room._id); + visitor.setRoom(result.room._id); } + + Triggers.setTriggers(result.triggers); + Triggers.init(); + + result.departments.forEach((department) => { + Department.insert(department); + }); } }); }); diff --git a/packages/rocketchat-livechat/app/client/views/messages.js b/packages/rocketchat-livechat/app/client/views/messages.js index 3098953b8c7..e9d0312cc02 100644 --- a/packages/rocketchat-livechat/app/client/views/messages.js +++ b/packages/rocketchat-livechat/app/client/views/messages.js @@ -41,16 +41,7 @@ Template.messages.events({ Template.messages.onCreated(function() { var self; self = this; - self.autorun(function() { - self.subscribe('livechat:visitorRoom', visitor.getToken(), function() { - var room; - room = ChatRoom.findOne(); - if (room != null) { - visitor.setRoomToSubscribe(room._id); - RoomHistoryManager.getMoreIfIsEmpty(room._id); - } - }); - }); + self.atBottom = true; self.updateMessageInputHeight = function(input) { diff --git a/packages/rocketchat-livechat/app/client/views/register.js b/packages/rocketchat-livechat/app/client/views/register.js index b95bb854976..fea2092edc4 100644 --- a/packages/rocketchat-livechat/app/client/views/register.js +++ b/packages/rocketchat-livechat/app/client/views/register.js @@ -54,8 +54,6 @@ Template.register.events({ }); Template.register.onCreated(function() { - this.subscribe('livechat:availableDepartments'); - this.error = new ReactiveVar(); this.showError = (msg) => { $('.error').addClass('show'); diff --git a/packages/rocketchat-livechat/package.js b/packages/rocketchat-livechat/package.js index 62d9e33e611..f871ca392f4 100644 --- a/packages/rocketchat-livechat/package.js +++ b/packages/rocketchat-livechat/package.js @@ -99,6 +99,7 @@ Package.onUse(function(api) { api.addFiles('server/methods/addManager.js', 'server'); api.addFiles('server/methods/changeLivechatStatus.js', 'server'); api.addFiles('server/methods/getCustomFields.js', 'server'); + api.addFiles('server/methods/getInitialData.js', 'server'); api.addFiles('server/methods/pageVisited.js', 'server'); api.addFiles('server/methods/registerGuest.js', 'server'); api.addFiles('server/methods/removeAgent.js', 'server'); @@ -132,7 +133,6 @@ Package.onUse(function(api) { api.addFiles('server/externalMessageHook.js', 'server'); // publications - api.addFiles('server/publications/availableDepartments.js', 'server'); api.addFiles('server/publications/customFields.js', 'server'); api.addFiles('server/publications/departmentAgents.js', 'server'); api.addFiles('server/publications/externalMessages.js', 'server'); @@ -140,10 +140,8 @@ Package.onUse(function(api) { api.addFiles('server/publications/livechatDepartments.js', 'server'); api.addFiles('server/publications/livechatManagers.js', 'server'); api.addFiles('server/publications/livechatRooms.js', 'server'); - api.addFiles('server/publications/trigger.js', 'server'); api.addFiles('server/publications/visitorInfo.js', 'server'); api.addFiles('server/publications/visitorPageVisited.js', 'server'); - api.addFiles('server/publications/visitorRoom.js', 'server'); // api api.addFiles('server/api.js', 'server'); diff --git a/packages/rocketchat-livechat/server/methods/getInitialData.js b/packages/rocketchat-livechat/server/methods/getInitialData.js new file mode 100644 index 00000000000..85bfb1e4a48 --- /dev/null +++ b/packages/rocketchat-livechat/server/methods/getInitialData.js @@ -0,0 +1,56 @@ +Meteor.methods({ + 'livechat:getInitialData'(visitorToken) { + console.log('userId ->',Meteor.userId()); + var info = { + enabled: null, + title: null, + color: null, + registrationForm: null, + room: null, + triggers: [], + departments: [] + }; + + const room = RocketChat.models.Rooms.findByVisitorToken(visitorToken, { + fields: { + name: 1, + t: 1, + cl: 1, + u: 1, + usernames: 1, + v: 1 + } + }).fetch(); + + if (room && room.length > 0) { + info.room = room[0]; + } + + RocketChat.models.Settings.findNotHiddenPublic([ + 'Livechat_title', + 'Livechat_title_color', + 'Livechat_enabled', + 'Livechat_registration_form' + ]).forEach((setting) => { + if (setting._id === 'Livechat_title') { + info.title = setting.value; + } else if (setting._id === 'Livechat_title_color') { + info.color = setting.value; + } else if (setting._id === 'Livechat_enabled') { + info.enabled = setting.value; + } else if (setting._id === 'Livechat_registration_form') { + info.registrationForm = setting.value; + } + }); + + RocketChat.models.LivechatTrigger.find().forEach((trigger) => { + info.triggers.push(trigger); + }); + + RocketChat.models.LivechatDepartment.findEnabledWithAgents().forEach((department) => { + info.departments.push(department); + }); + + return info; + } +}); diff --git a/packages/rocketchat-livechat/server/publications/availableDepartments.js b/packages/rocketchat-livechat/server/publications/availableDepartments.js deleted file mode 100644 index 6ab277d73ce..00000000000 --- a/packages/rocketchat-livechat/server/publications/availableDepartments.js +++ /dev/null @@ -1,3 +0,0 @@ -Meteor.publish('livechat:availableDepartments', function() { - return RocketChat.models.LivechatDepartment.findEnabledWithAgents(); -}); diff --git a/packages/rocketchat-livechat/server/publications/trigger.js b/packages/rocketchat-livechat/server/publications/trigger.js deleted file mode 100644 index 61d7d6831f4..00000000000 --- a/packages/rocketchat-livechat/server/publications/trigger.js +++ /dev/null @@ -1,3 +0,0 @@ -Meteor.publish('livechat:trigger', function() { - return RocketChat.models.LivechatTrigger.find(); -}); diff --git a/packages/rocketchat-livechat/server/publications/visitorRoom.js b/packages/rocketchat-livechat/server/publications/visitorRoom.js deleted file mode 100644 index cb0570f7a7e..00000000000 --- a/packages/rocketchat-livechat/server/publications/visitorRoom.js +++ /dev/null @@ -1,12 +0,0 @@ -Meteor.publish('livechat:visitorRoom', function(visitorToken) { - return RocketChat.models.Rooms.findByVisitorToken(visitorToken, { - fields: { - name: 1, - t: 1, - cl: 1, - u: 1, - usernames: 1, - v: 1 - } - }); -});