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'));
Livechat.room = result.rid;
visitor.setConnected();
parentCall('callback', 'chat-started');
}
});

@ -17,7 +17,7 @@ this.Commands = {
if (Livechat.transcript) {
// @TODO get visitor email
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({
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) {
Livechat.room = result.room._id;
visitor.setConnected();
}
if (result.agentData) {

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

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

@ -7,6 +7,7 @@ export default {
room: new ReactiveVar(null),
roomToSubscribe: new ReactiveVar(null),
roomSubscribed: null,
connected: null,
register() {
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('server/startup.js', 'server');
api.addFiles('server/visitorStatus.js', 'server');
api.addFiles('permissions.js', 'server');
api.addFiles('messageTypes.js');
api.addFiles('roomType.js');

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

@ -198,16 +198,29 @@ RocketChat.Livechat = {
return ret;
},
closeRoom({ user, room, comment }) {
closeRoom({ user, visitor, room, comment }) {
const now = new Date();
RocketChat.models.Rooms.closeByRoomId(room._id, {
user: {
_id: user._id,
username: user.username
},
const closeData = {
closedAt: now,
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 = {
t: 'livechat-close',
@ -217,8 +230,8 @@ RocketChat.Livechat = {
RocketChat.sendMessage(user, message, room);
RocketChat.models.Subscriptions.hideByRoomIdAndUserId(room._id, user._id);
RocketChat.models.Messages.createCommandWithRoomIdAndUser('promptTranscript', room._id, user);
RocketChat.models.Subscriptions.hideByRoomIdAndUserId(room._id, room.servedBy._id);
RocketChat.models.Messages.createCommandWithRoomIdAndUser('promptTranscript', room._id, room.servedBy);
Meteor.defer(() => {
RocketChat.callbacks.run('livechat.closeRoom', room);

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

@ -1,21 +1,19 @@
Meteor.methods({
'livechat:closeByVisitor'(roomId) {
if (!Meteor.userId()) {
throw new Meteor.Error('error-not-authorized', 'Not authorized', { method: 'livechat:closeByVisitor' });
}
import LivechatVisitors from '../models/LivechatVisitors';
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) {
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({
user,
visitor,
room,
comment: TAPi18n.__('Closed_by_visitor', { lng: language })
});

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