diff --git a/docs/samples/contact-center/app.js b/docs/samples/contact-center/app.js index eaa97ffb53c..19736d496be 100644 --- a/docs/samples/contact-center/app.js +++ b/docs/samples/contact-center/app.js @@ -52,6 +52,7 @@ const endConsultBtn = document.querySelector('#end-consult'); const consultTabBtn = document.querySelector('#consult'); const initiateConsultControlsElm = document.querySelector('#initiate-consult-controls'); const initiateConsultDialog = document.querySelector('#initiate-consult-dialog'); +const agentMultiLoginAlert = document.querySelector('#agentMultiLoginAlert'); const consultTransferBtn = document.querySelector('#consult-transfer'); const transferElm = document.getElementById('transfer'); @@ -574,6 +575,14 @@ function register() { idleCodesDropdown.value = data.auxCodeId?.trim() !== '' ? data.auxCodeId : DEFAULT_CODE; } }); + + webex.cc.on('agent:multiLogin', (data) => { + if (data && typeof data === 'object' && data.type === 'AgentMultiLoginCloseSession') { + agentMultiLoginAlert.innerHTML = 'Multiple Agent Login Session Detected!'; + agentMultiLoginAlert.style.color = 'red';`` + } + }); + } function populateWrapupCodesDropdown() { diff --git a/docs/samples/contact-center/index.html b/docs/samples/contact-center/index.html index 688bdc316f5..7cb43a8e3f5 100644 --- a/docs/samples/contact-center/index.html +++ b/docs/samples/contact-center/index.html @@ -102,6 +102,7 @@

Agent +

NOTE: Teams are fetched automatically for the Agent Login.

diff --git a/packages/@webex/plugin-cc/src/cc.ts b/packages/@webex/plugin-cc/src/cc.ts index dbca2a85952..31ecb8e9bf8 100644 --- a/packages/@webex/plugin-cc/src/cc.ts +++ b/packages/@webex/plugin-cc/src/cc.ts @@ -14,7 +14,7 @@ import { BuddyAgents, SubscribeRequest, } from './types'; -import {READY, CC_FILE, EMPTY_STRING, AGENT_STATE_CHANGE} from './constants'; +import {READY, CC_FILE, EMPTY_STRING, AGENT_STATE_CHANGE, AGENT_MULTI_LOGIN} from './constants'; import {AGENT, WEB_RTC_PREFIX} from './services/constants'; import Services from './services'; import HttpRequest from './services/core/HttpRequest'; @@ -289,6 +289,11 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter // @ts-ignore this.emit(AGENT_STATE_CHANGE, eventData.data); } + + if (eventData.type === CC_EVENTS.AGENT_MULTI_LOGIN) { + // @ts-ignore + this.emit(AGENT_MULTI_LOGIN, eventData.data); + } }; /** @@ -311,7 +316,7 @@ export default class ContactCenter extends WebexPlugin implements IContactCenter } /** - * Called when we reconnection has been completed + * Called when the reconnection has been completed */ private async handleConnectionLost(msg: ConnectionLostDetails): Promise { if (msg.isConnectionLost) { diff --git a/packages/@webex/plugin-cc/src/config.ts b/packages/@webex/plugin-cc/src/config.ts index 49fc9e6d461..0a20ce13fca 100644 --- a/packages/@webex/plugin-cc/src/config.ts +++ b/packages/@webex/plugin-cc/src/config.ts @@ -2,7 +2,7 @@ import {LOGGER} from '@webex/calling'; export default { cc: { - allowMultiLogin: true, + allowMultiLogin: false, allowAutomatedRelogin: true, clientType: 'WebexCCSDK', isKeepAliveEnabled: false, diff --git a/packages/@webex/plugin-cc/src/constants.ts b/packages/@webex/plugin-cc/src/constants.ts index b25f28a53be..98631af9215 100644 --- a/packages/@webex/plugin-cc/src/constants.ts +++ b/packages/@webex/plugin-cc/src/constants.ts @@ -12,3 +12,4 @@ export const WEB_SOCKET_MANAGER_FILE = 'WebSocketManager'; export const AQM_REQS_FILE = 'aqm-reqs'; export const TASK_MANAGER_FILE = 'TaskManager'; export const AGENT_STATE_CHANGE = 'agent:stateChange'; +export const AGENT_MULTI_LOGIN = 'agent:multiLogin'; diff --git a/packages/@webex/plugin-cc/src/services/config/types.ts b/packages/@webex/plugin-cc/src/services/config/types.ts index 62926fc0008..41d13554104 100644 --- a/packages/@webex/plugin-cc/src/services/config/types.ts +++ b/packages/@webex/plugin-cc/src/services/config/types.ts @@ -14,6 +14,7 @@ export const CC_EVENTS = { AGENT_STATION_LOGIN_SUCCESS: 'AgentStationLoginSuccess', AGENT_STATION_LOGIN_FAILED: 'AgentStationLoginFailed', AGENT_STATE_CHANGE: 'AgentStateChange', + AGENT_MULTI_LOGIN: 'AGENT_MULTI_LOGIN', AGENT_STATE_CHANGE_SUCCESS: 'AgentStateChangeSuccess', AGENT_STATE_CHANGE_FAILED: 'AgentStateChangeFailed', AGENT_BUDDY_AGENTS: 'BuddyAgents', diff --git a/packages/@webex/plugin-cc/test/unit/spec/cc.ts b/packages/@webex/plugin-cc/test/unit/spec/cc.ts index 94218d4e3e3..321a4f1433c 100644 --- a/packages/@webex/plugin-cc/test/unit/spec/cc.ts +++ b/packages/@webex/plugin-cc/test/unit/spec/cc.ts @@ -15,7 +15,7 @@ import Services from '../../../src/services'; import config from '../../../src/config'; import {CC_EVENTS} from '../../../src/services/config/types'; import LoggerProxy from '../../../src/logger-proxy'; -import {CC_FILE, AGENT_STATE_CHANGE} from '../../../src/constants'; +import {CC_FILE, AGENT_STATE_CHANGE, AGENT_MULTI_LOGIN} from '../../../src/constants'; // Mock the Worker API import '../../../__mocks__/workerMock'; @@ -246,7 +246,7 @@ describe('webex.cc', () => { force: true, isKeepAliveEnabled: false, clientType: 'WebexCCSDK', - allowMultiLogin: true, + allowMultiLogin: false, }, }); expect(configSpy).toHaveBeenCalled(); @@ -411,18 +411,31 @@ describe('webex.cc', () => { expect(emitSpy).toHaveBeenCalledWith(TASK_EVENTS.TASK_INCOMING, mockTask); // Verify message event listener const messageCallback = mockWebSocketManager.on.mock.calls.find(call => call[0] === 'message')[1]; - const eventData = { + const agentStateChangeEventData = { type: CC_EVENTS.AGENT_STATE_CHANGE, data: { some: 'data' }, }; + const agentMultiLoginEventData = { + type: CC_EVENTS.AGENT_MULTI_LOGIN, + data: {some: 'data'}, + } + // Simulate receiving a message event - messageCallback(JSON.stringify(eventData)); + messageCallback(JSON.stringify(agentStateChangeEventData)); expect(ccEmitSpy).toHaveBeenCalledWith( AGENT_STATE_CHANGE, - eventData.data + agentStateChangeEventData.data ); + + // Simulate receiving a message event + messageCallback(JSON.stringify(agentMultiLoginEventData)); + + expect(ccEmitSpy).toHaveBeenCalledWith( + AGENT_MULTI_LOGIN, + agentMultiLoginEventData.data + ) }); it('should login successfully with other LoginOption', async () => { @@ -871,4 +884,5 @@ describe('webex.cc', () => { ); }); }); + });