Add support for visitor status

pull/9135/head
Diego Sampaio 8 years ago
parent 6bc76dff1c
commit 6ec1172ae1
No known key found for this signature in database
GPG Key ID: E060152B30502562
  1. 2
      packages/rocketchat-livechat/.app/client/lib/chatMessages.js
  2. 2
      packages/rocketchat-livechat/.app/client/lib/commands.js
  3. 11
      packages/rocketchat-livechat/.app/client/startup/visitor.js
  4. 2
      packages/rocketchat-livechat/.app/client/views/livechatWindow.js
  5. 2
      packages/rocketchat-livechat/.app/client/views/options.js
  6. 2
      packages/rocketchat-livechat/.app/client/views/switchDepartment.js
  7. 9
      packages/rocketchat-livechat/.app/imports/client/visitor.js
  8. 1
      packages/rocketchat-livechat/package.js
  9. 11
      packages/rocketchat-livechat/roomType.js
  10. 31
      packages/rocketchat-livechat/server/lib/Livechat.js
  11. 6
      packages/rocketchat-livechat/server/lib/QueueMethods.js
  12. 16
      packages/rocketchat-livechat/server/methods/closeByVisitor.js
  13. 28
      packages/rocketchat-livechat/server/models/Rooms.js
  14. 8
      packages/rocketchat-livechat/server/visitorStatus.js

@ -121,6 +121,8 @@ this.ChatMessages = class ChatMessages {
ChatMessage.update(result._id, _.omit(result, '_id')); ChatMessage.update(result._id, _.omit(result, '_id'));
Livechat.room = result.rid; Livechat.room = result.rid;
visitor.setConnected();
parentCall('callback', 'chat-started'); parentCall('callback', 'chat-started');
} }
}); });

@ -17,7 +17,7 @@ this.Commands = {
if (Livechat.transcript) { if (Livechat.transcript) {
// @TODO get visitor email // @TODO get visitor email
const user = Meteor.user(); const user = Meteor.user();
const email = user.visitorEmails && user.visitorEmails.length > 0 ? user.visitorEmails[0].address : ''; const email = user && user.visitorEmails && user.visitorEmails.length > 0 ? user.visitorEmails[0].address : '';
swal({ swal({
title: t('Chat_ended'), title: t('Chat_ended'),

@ -16,3 +16,14 @@ Meteor.startup(() => {
}); });
} }
}); });
Meteor.startup(() => {
let connected = false;
Tracker.autorun(function() {
var connectionStatus = Meteor.status();
if (visitor.getRoom() && visitor.getToken() && connectionStatus.connected && !connected) {
connected = connectionStatus.connected;
visitor.setConnected();
}
});
});

@ -115,6 +115,8 @@ Template.livechatWindow.onCreated(function() {
if (result.room) { if (result.room) {
Livechat.room = result.room._id; Livechat.room = result.room._id;
visitor.setConnected();
} }
if (result.agentData) { if (result.agentData) {

@ -26,7 +26,7 @@ Template.options.events({
closeOnConfirm: true, closeOnConfirm: true,
html: false html: false
}, () => { }, () => {
Meteor.call('livechat:closeByVisitor', visitor.getRoom(), (error) => { Meteor.call('livechat:closeByVisitor', { roomId: visitor.getRoom(), token: visitor.getToken() }, (error) => {
if (error) { if (error) {
return console.log('Error ->', error); return console.log('Error ->', error);
} }

@ -45,7 +45,7 @@ Template.switchDepartment.events({
closeOnConfirm: true, closeOnConfirm: true,
html: false html: false
}, () => { }, () => {
Meteor.call('livechat:closeByVisitor', visitor.getRoom(), (error) => { Meteor.call('livechat:closeByVisitor', { roomId: visitor.getRoom(), token: visitor.getToken() }, (error) => {
if (error) { if (error) {
return console.log('Error ->', error); return console.log('Error ->', error);
} }

@ -7,6 +7,7 @@ export default {
room: new ReactiveVar(null), room: new ReactiveVar(null),
roomToSubscribe: new ReactiveVar(null), roomToSubscribe: new ReactiveVar(null),
roomSubscribed: null, roomSubscribed: null,
connected: null,
register() { register() {
if (!localStorage.getItem('visitorToken')) { if (!localStorage.getItem('visitorToken')) {
@ -70,5 +71,13 @@ export default {
} }
} }
}); });
},
setConnected() {
if (this.connected) {
return;
}
this.connected = true;
Meteor.call('UserPresence:connect', this.getToken(), { visitor: this.getToken() });
} }
}; };

@ -45,6 +45,7 @@ Package.onUse(function(api) {
api.addFiles('livechat.js', 'server'); api.addFiles('livechat.js', 'server');
api.addFiles('server/startup.js', 'server'); api.addFiles('server/startup.js', 'server');
api.addFiles('server/visitorStatus.js', 'server');
api.addFiles('permissions.js', 'server'); api.addFiles('permissions.js', 'server');
api.addFiles('messageTypes.js'); api.addFiles('messageTypes.js');
api.addFiles('roomType.js'); api.addFiles('roomType.js');

@ -38,19 +38,18 @@ RocketChat.roomTypes.add('l', 5, {
}, },
getUserStatus(roomId) { getUserStatus(roomId) {
let guestName;
const room = Session.get(`roomData${ roomId }`); const room = Session.get(`roomData${ roomId }`);
if (room) { if (room) {
guestName = room.v && room.v.username; return room.v && room.v.status;
} else { } else {
const inquiry = LivechatInquiry.findOne({ rid: roomId }); const inquiry = LivechatInquiry.findOne({ rid: roomId });
guestName = inquiry && inquiry.v && inquiry.v.username; return inquiry && inquiry.v && inquiry.v.status;
} }
if (guestName) { // if (guestName) {
return Session.get(`user_${ guestName }_status`); // return Session.get(`user_${ guestName }_status`);
} // }
}, },
notSubscribedTpl: { notSubscribedTpl: {

@ -198,16 +198,29 @@ RocketChat.Livechat = {
return ret; return ret;
}, },
closeRoom({ user, room, comment }) { closeRoom({ user, visitor, room, comment }) {
const now = new Date(); const now = new Date();
RocketChat.models.Rooms.closeByRoomId(room._id, {
user: { const closeData = {
_id: user._id,
username: user.username
},
closedAt: now, closedAt: now,
chatDuration: (now.getTime() - room.ts) / 1000 chatDuration: (now.getTime() - room.ts) / 1000
}); };
if (user) {
closeData.closer = 'user';
closeData.closedBy = {
_id: user._id,
username: user.username
};
} else if (visitor) {
closeData.closer = 'visitor';
closeData.closedBy = {
_id: visitor._id,
username: visitor.username
};
}
RocketChat.models.Rooms.closeByRoomId(room._id, closeData);
const message = { const message = {
t: 'livechat-close', t: 'livechat-close',
@ -217,8 +230,8 @@ RocketChat.Livechat = {
RocketChat.sendMessage(user, message, room); RocketChat.sendMessage(user, message, room);
RocketChat.models.Subscriptions.hideByRoomIdAndUserId(room._id, user._id); RocketChat.models.Subscriptions.hideByRoomIdAndUserId(room._id, room.servedBy._id);
RocketChat.models.Messages.createCommandWithRoomIdAndUser('promptTranscript', room._id, user); RocketChat.models.Messages.createCommandWithRoomIdAndUser('promptTranscript', room._id, room.servedBy);
Meteor.defer(() => { Meteor.defer(() => {
RocketChat.callbacks.run('livechat.closeRoom', room); RocketChat.callbacks.run('livechat.closeRoom', room);

@ -24,7 +24,8 @@ RocketChat.QueueMethods = {
v: { v: {
_id: guest._id, _id: guest._id,
username: guest.username, username: guest.username,
token: message.token token: message.token,
status: guest.status
}, },
servedBy: { servedBy: {
_id: agent.agentId, _id: agent.agentId,
@ -123,7 +124,8 @@ RocketChat.QueueMethods = {
v: { v: {
_id: guest._id, _id: guest._id,
username: guest.username, username: guest.username,
token: message.token token: message.token,
status: guest.status
}, },
cl: false, cl: false,
open: true, open: true,

@ -1,21 +1,19 @@
Meteor.methods({ import LivechatVisitors from '../models/LivechatVisitors';
'livechat:closeByVisitor'(roomId) {
if (!Meteor.userId()) {
throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'livechat:closeByVisitor' });
}
const room = RocketChat.models.Rooms.findOneOpenByVisitorId(Meteor.userId(), roomId); Meteor.methods({
'livechat:closeByVisitor'({ roomId, token }) {
const room = RocketChat.models.Rooms.findOneOpenByVisitorToken(token, roomId);
if (!room || !room.open) { if (!room || !room.open) {
return false; return false;
} }
const user = Meteor.user(); const visitor = LivechatVisitors.getVisitorByToken(token);
const language = (user && user.language) || RocketChat.settings.get('language') || 'en'; const language = (visitor && visitor.language) || RocketChat.settings.get('language') || 'en';
return RocketChat.Livechat.closeRoom({ return RocketChat.Livechat.closeRoom({
user, visitor,
room, room,
comment: TAPi18n.__('Closed_by_visitor', { lng: language }) comment: TAPi18n.__('Closed_by_visitor', { lng: language })
}); });

@ -115,11 +115,11 @@ RocketChat.models.Rooms.findByVisitorId = function(visitorId) {
return this.find(query); return this.find(query);
}; };
RocketChat.models.Rooms.findOneOpenByVisitorId = function(visitorId, roomId) { RocketChat.models.Rooms.findOneOpenByVisitorToken = function(token, roomId) {
const query = { const query = {
_id: roomId, _id: roomId,
open: true, open: true,
'v._id': visitorId 'v.token': token
}; };
return this.findOne(query); return this.findOne(query);
@ -148,12 +148,11 @@ RocketChat.models.Rooms.closeByRoomId = function(roomId, closeInfo) {
_id: roomId _id: roomId
}, { }, {
$set: { $set: {
closedBy: { closer: closeInfo.closer,
_id: closeInfo.user._id, closedBy: closeInfo.closedBy,
username: closeInfo.user.username
},
closedAt: closeInfo.closedAt, closedAt: closeInfo.closedAt,
chatDuration: closeInfo.chatDuration chatDuration: closeInfo.chatDuration,
'v.status': 'offline'
}, },
$unset: { $unset: {
open: 1 open: 1
@ -202,3 +201,18 @@ RocketChat.models.Rooms.saveCRMDataByRoomId = function(roomId, crmData) {
return this.update(query, update); return this.update(query, update);
}; };
RocketChat.models.Rooms.updateVisitorStatus = function(token, status) {
const query = {
'v.token': token,
open: true
};
const update = {
$set: {
'v.status': status
}
};
return this.update(query, update);
};

@ -0,0 +1,8 @@
/* globals UserPresenceEvents */
Meteor.startup(() => {
UserPresenceEvents.on('setStatus', (session, status) => {
if (session && session.metadata && session.metadata.visitor) {
RocketChat.models.Rooms.updateVisitorStatus(session.metadata.visitor, status);
}
});
});
Loading…
Cancel
Save