Я занимаюсь разработкой приложения поддержки чата, в котором сотрудник может оказывать поддержку нескольким клиентам одновременно. Я написал директиву chat-popup-box.directive.js, которая используется как персоналом, так и клиентом.
когда клиент нажимает на значок поддержки чата, запускается chat-popup-box.directive.js и открывается чат для клиента. Затем срабатывает API, который создает идентификатор сеанса, который является своего рода уникальным каналом для общения.
После этого клиент публикует следующую тему
mqtt.publish(`wrkspot/support/${scope.siteID}/${scope.sessionID}/newcall`, payload);
Персонал слушает этот новый вызов и получает sessionId и идентификатор клиента, который является родительским в полезной нагрузке. Затем клиент публикует тему по клику посетителя с таким же идентификатором сессии
mqtt.publish(`wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/attend`, payload);
Клиент слушает эту тему и получает supportId из полезной нагрузки.
После этого сотрудники прослушивают любой чат, отправленный клиентом на
wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/${scope.clientSelected.clientID}/chat
и публикует чат на
mqtt.publish(`wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/${scope.employeeID}/chat`, chatPayload);
employeeID является идентификатором поддержки. Таким образом, персонал публикует чат по теме с идентификатором поддержки и слушает тему с идентификатором клиента. Это наоборот на стороне клиента.
Проблема в том, что сотрудники открыли 2 окна чата, что означает, что директива была дважды активирована на стороне персонала. Клиент получает одно и то же сообщение дважды, хотя тема была опубликована только один раз.
Ниже приводится выдержка из директивы, которую я создал
element.on('click', function(event){
if(!scope.isClient) {
if(scope.clientSelected) {
register_popup(scope.clientSelected.clientID, scope.clientSelected.senderName);
}
/**
* publish attend topic on click of attend.
* After publishing attend staff will start listening to chat published by client
*/
publishAttendTopic(() => {
mqtt.message(`wrkspot/support/${scope.clientSelected.siteID}/${scope.clientSelected.sessionID}/${scope.clientSelected.clientID}/chat`, (topic, res) => {
var msg = JSON.parse(res) || {};
scope.chatMessages.push(msg);
});
});
} else {
/**
* open chat popup and Hits POST API to create sessionId when client click on chat support.
* On creating session publish newcall
*/
register_popup('support1', 'Chat Support');
var payload = {
"siteId": scope.siteID,
"clientId": scope.clientId,
"userId": scope.employeeID,
"message": ""
}
dataservice.createSupportChannel(payload).then(res => {
scope.sessionID = res.data.sessionId;
var payload = {
"clientID":scope.clientId,
"senderName": scope.senderName,
"sessionID":scope.sessionID,
"siteID":scope.siteID,
"state":"",
"supportID":""
}
mqtt.publish(`wrkspot/support/${scope.siteID}/${scope.sessionID}/newcall`, payload);
/**
* Listens to the attend topic published by staff after staff clicks on attend.
* subscribe to chat publihed by staff.
* subscirbe to ack published by staff.
*/
listenAttendTopic(staffRes => {
scope.supportID = staffRes.supportID;
mqtt.message(`wrkspot/support/${scope.siteID}/${scope.sessionID}/${staffRes.supportID}/chat`,(topic, res) => {
console.log('chat topic subscribe by client :', `wrkspot/support/${scope.siteID}/${scope.sessionID}/${staffRes.supportID}/chat`);
var msg = JSON.parse(res) || {};
scope.chatMessages.push(msg);
});
});
});
}});
Я подумал, что это может быть потому, что оба окна чата публикуют чат, так как директива была активирована дважды, но тема уникальна. и я проверил в консоли, что тема публикуется только один раз.