@snugdesk/avaya-ipo-widget 0.0.0-watch

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @snugdesk/avaya-ipo-widget might be problematic. Click here for more details.

@@ -0,0 +1 @@
1
+ {"version":3,"file":"snugdesk-avaya-ipo-widget.mjs","sources":["../../../projects/avaya-ipo-widget/src/lib/services/avaya-ipo.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/country.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/phone-number-lookup.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/recording-manager.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/call-session-socket.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-history.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-history.component.html","../../../projects/avaya-ipo-widget/src/lib/services/authentication.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/dialpad/dialpad.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/dialpad/dialpad.component.html","../../../projects/avaya-ipo-widget/src/lib/components/device-selector/device-selector.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/device-selector/device-selector.component.html","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.component.ts","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.component.html","../../../projects/avaya-ipo-widget/src/lib/avaya-ipo-widget.module.ts","../../../projects/avaya-ipo-widget/src/public-api.ts","../../../projects/avaya-ipo-widget/src/snugdesk-avaya-ipo-widget.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\ndeclare var AWL: any;\n\nexport enum LoginState {\n LOGIN_SUCCESS = 'AWL_MSG_LOGIN_SUCCESS',\n LOGIN_FAILED = 'AWL_MSG_LOGIN_FAILED',\n LOGIN_EMPTYUSERNAME = 'AWL_MSG_LOGIN_EMPTYUSERNAME',\n LOGIN_EMPTYPASSWORD = 'AWL_MSG_LOGIN_EMPTYPASSWORD',\n LOGIN_GW_NOTCONFIGURED = 'AWL_MSG_LOGIN_GW_NOTCONFIGURED',\n LOGGEDOUT = 'AWL_MSG_LOGGEDOUT',\n WEBSOCKET_FAILURE = 'AWL_MSG_LOGIN_WEBSOCKET_FAILURE',\n DEVICEACCESS_FAILURE = 'AWL_MSG_DEVICEACCESS_FAILURE',\n RELOGGED_IN = 'AWL_MSG_RELOGGED_IN',\n RECONNECTING = 'AWL_MSG_RECONNECTING',\n FAILING_OVER = 'AWL_MSG_FAILING_OVER',\n FAILOVER_SUCCESS = 'AWL_MSG_FAIL_OVER_SUCCESS',\n FAILOVER_FAILED = 'AWL_MSG_FAIL_OVER_FAILED',\n FAILING_BACK = 'AWL_MSG_FAILING_BACK',\n FAILBACK_SUCCESS = 'AWL_MSG_FAIL_BACK_SUCCESS',\n FAILBACK_FAILED = 'AWL_MSG_FAIL_BACK_FAILED',\n}\n\nexport enum CallState {\n IDLE = 'AWL_MSG_CALL_IDLE',\n PROGRESSING = 'AWL_MSG_CALL_PROGRESSING',\n RINGING = 'AWL_MSG_CALL_RINGING',\n CONNECTED = 'AWL_MSG_CALL_CONNECTED',\n DISCONNECTED = 'AWL_MSG_CALL_DISCONNECTED',\n FAILED = 'AWL_MSG_CALL_FAILED',\n INCOMING = 'AWL_MSG_CALL_INCOMING',\n HELD = 'AWL_MSG_CALL_HELD',\n TRANSFERRED = 'AWL_MSG_CALL_TRANSFERRED',\n FAREND_UPDATE = 'AWL_MSG_CALL_FAREND_UPDATE',\n}\n\nexport interface RemoteMedia {\n callId: string;\n stream: MediaStream;\n}\n\nexport class AvayaIPOCallListener {\n constructor(private service: AvayaIPOService) { }\n\n onNewIncomingCall = (callId: any, callObj: any, autoAnswer: any): void => {\n const farEndNumber = callObj.getFarEndNumber();\n this.service.zone.run(() => {\n this.service.incomingCallSubject.next({\n callId,\n farEndNumber,\n });\n });\n\n if (!this.service.activeCallsMap.has(callId)) {\n this.service.assignToFirstAvailableSlot(callId, callObj);\n }\n };\n onCallStateChange = (callId: any, callObj: any, event: any): void => {\n // Raw callback from AWL (WebSocket JSON-RPC). Useful to see the original event.\n console.debug('[AWL] onCallStateChange raw →', { callId, event });\n const state = callObj.getCallState();\n this.service.zone.run(() => {\n this.service.callStateSubject.next({ callId, state });\n });\n\n if (event === 'CallTransferSuccessful') {\n console.debug('Call transfer successful');\n }\n\n this.service.handleCallState(callObj);\n\n try {\n const remote = callObj?.getRemoteStream?.();\n\n // if (remote instanceof MediaStream) {\n // console.log('Remote stream found', remote);\n // this.service.remoteStream = remote;\n // this.service.remoteStream$.next(remote);\n // }\n if (remote instanceof MediaStream) {\n const payload: RemoteMedia = { callId, stream: remote };\n this.service.remoteStream = payload;\n this.service.remoteStream$.next(payload);\n }\n } catch (err) {\n console.warn('Failed to extract media streams', err);\n }\n };\n\n onCallTerminate = (callId: any, reason: any): void => {\n this.service.releaseCallById(callId);\n console.debug('Call terminated: ', reason);\n };\n}\n\n@Injectable({ providedIn: 'root' })\nexport class AvayaIPOService {\n private cli!: any; // This should be the type of your Avaya IPO CLI instance\n\n public remoteStream: RemoteMedia | null = null;\n readonly remoteStream$ = new BehaviorSubject<RemoteMedia | null>(null);\n public localStream: MediaStream | null = null;\n public incomingCallSubject = new Subject<{\n callId: string;\n farEndNumber: string;\n }>();\n public callStateSubject = new Subject<{ callId: string; state: string }>();\n\n private callSlots: Record<'1' | '2' | '3', any | null> = {\n '1': null,\n '2': null,\n '3': null,\n };\n public activeCallsMap = new Map<string, any>();\n public activeCallId: string | null = null;\n public currentcallId: string | null = null;\n\n private agentId = '';\n private loginStatusSubject = new BehaviorSubject<boolean>(false);\n public loginStatus$ = this.loginStatusSubject.asObservable();\n\n private readonly DOM_TAGS = {\n localVideo: 'lclVideo',\n remoteVideo: 'rmtVideo',\n remoteAudio: 'rmtAudio',\n localAudio: 'lclAudio',\n };\n\n private readonly CONFIG_TEMPLATE = {\n serviceType: 'phone', // value can be 'phone' or 'agent'\n enableVideo: false,\n Gateway: { ip: 'snugipose.avayalab.in', port: '9443' },\n Stunserver: { ip: '', port: '3478' },\n Turnserver: { ip: '', port: '3478', user: '', pwd: '' },\n AppData: { applicationID: '', applicationUA: '', appInstanceID: '' },\n disableResiliency: false,\n };\n\n private readonly agentStatusApiUrl =\n 'https://v2xla9n0t6.execute-api.us-west-2.amazonaws.com/dev';\n\n private readonly CALL_HISTORY_API_URL =\n 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';\n\n private prewarmedStream?: MediaStream;\n\n private isSafari(): boolean {\n return /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n }\n\n private _rpcPatched = false;\n\n constructor(public zone: NgZone, private http: HttpClient) { }\n\n init() {\n if (typeof AWL !== 'undefined') {\n this.cli = new AWL.client();\n const cliAny = this.cli as any;\n Object.defineProperty(cliAny, 'jsonRpc', {\n configurable: true,\n set: (rpcClient: any) => {\n console.log('[RPC-PATCH] jsonRpc assigned:', rpcClient);\n // restore the real property\n delete cliAny.jsonRpc;\n cliAny.jsonRpc = rpcClient;\n // now do the patch\n this._doPatch();\n },\n });\n } else {\n console.warn('AWL is not yet loaded');\n }\n }\n\n logIn(username: string, password: string): void {\n this.cli.enableLogging();\n // this.cli.disableLogging();\n\n const appInstanceId = this.cli.generateAppInstanceID();\n const config = {\n ...this.CONFIG_TEMPLATE,\n AppData: {\n ...this.CONFIG_TEMPLATE.AppData,\n appInstanceID: appInstanceId,\n },\n };\n console.debug('Parsed config: ', config);\n\n const res_setConfiguration = this.cli.setConfiguration(\n config,\n this.handleConfigChange,\n this.handleRegistrationChange,\n new AvayaIPOCallListener(this),\n this.handleTokenRenewal\n );\n console.debug('res_setConfiguration: ', res_setConfiguration);\n\n if (res_setConfiguration === 'AWL_MSG_SETCONFIG_SUCCESS') {\n console.debug('SET CONFIG SUCCESS');\n }\n\n const res_setDomElements = this.cli.setDomElements(this.DOM_TAGS);\n console.debug('res_setDomElements: ', res_setDomElements);\n\n if (res_setDomElements === 'AWL_MSG_SETDOM_FAILED') {\n console.debug('SET DOM FAILED');\n } else {\n console.debug('SET DOM PASS');\n }\n\n const bumbConnection = 'true';\n this.cli.logIn(username, password, bumbConnection);\n this.setAgentId(username);\n }\n\n logOut(): void {\n this.cli.logOut();\n }\n\n getAlternateServerConfig(): any {\n return this.cli.getAlternateServerConfig();\n }\n\n getDeviceList(): void {\n this.cli.getDeviceList((deviceList: any[]) => {\n console.debug('Device List: ', deviceList);\n });\n }\n\n setDeviceIds(deviceIds: any): void {\n console.debug('setDeviceIds: ', deviceIds);\n this.cli.setDeviceIds(deviceIds);\n }\n\n public async makeCall(destination: string): Promise<'1' | '2' | '3' | null> {\n\n await this.prewarmMic();\n console.debug('makeCall devicelist: ', this.getDeviceList());\n const freeSlot = (['1', '2', '3'] as const).find(\n (s) => this.callSlots[s] === null\n );\n if (!freeSlot) {\n console.warn('All call slots are currently occupied.');\n return null;\n }\n\n // const callObj = this.cli.makeCall(destination, 'audio');\n const callObj = this.cli.makeCall(destination, 'video', {\n headers: { 'X-Original-Caller': 'asees' },\n });\n\n if (!callObj) {\n console.error('Error! Cannot make call.');\n return null;\n }\n\n const callId = callObj.getCallId();\n this.activeCallsMap.set(callId, callObj);\n this.callSlots[freeSlot] = callObj;\n this.activeCallId = callId;\n\n return freeSlot;\n }\n\n dropCall(): void {\n if (!this.activeCallId) {\n console.warn('No active call to drop.');\n return;\n }\n\n // Find the slot that contains the active call using activeCallId\n let targetSlot: '1' | '2' | '3' | null = null;\n for (const [slot, callObj] of Object.entries(this.callSlots)) {\n if (callObj && callObj.getCallId() === this.activeCallId) {\n targetSlot = slot as '1' | '2' | '3';\n break;\n }\n }\n\n if (!targetSlot) {\n console.error(\n 'Active call slot not found for activeCallId:',\n this.activeCallId\n );\n return;\n }\n\n // Drop the active call from the identified slot\n const callId = this.callSlots[targetSlot].getCallId();\n const res_dropCall = this.cli.dropCall(callId);\n console.debug('res_dropCall: ', res_dropCall);\n\n // Remove the call from the activeCalls map and the slot\n this.activeCallsMap.delete(callId);\n this.callSlots[targetSlot] = null;\n\n // Reset activeCallId\n this.activeCallId = null;\n }\n\n doMute(): void {\n const res_doMute = this.cli.doMute(this.activeCallId);\n console.debug('res_doMute: ', res_doMute);\n }\n\n doUnMute(): void {\n const res_doUnMute = this.cli.doUnMute(this.activeCallId);\n console.debug('res_doUnMute: ', res_doUnMute);\n }\n\n doHold(): void {\n const res_doHold = this.cli.doHold(this.activeCallId);\n console.debug('res_doHold: ', res_doHold);\n }\n\n doUnHold(): void {\n const res_doUnHold = this.cli.doUnHold(this.activeCallId);\n console.debug('res_doUnHold: ', res_doUnHold);\n }\n\n pauseVideo(): void {\n const res_pauseVideo = this.cli.pauseVideo(this.activeCallId);\n console.debug('res_pauseVideo: ', res_pauseVideo);\n }\n\n playVideo(): void {\n const res_playVideo = this.cli.playVideo(this.activeCallId);\n console.debug('res_playVideo: ', res_playVideo);\n }\n\n transferCall(target: string, type: string): void {\n const res_transferCall = this.cli.transferCall(\n target,\n this.activeCallId,\n type\n );\n console.debug('res_transferCall: ', res_transferCall);\n }\n\n sendDTMF(digit: string | number): void {\n const res_sendDTMF = this.cli.sendDTMF(this.activeCallId, digit);\n console.debug('res_sendDTMF: ', res_sendDTMF);\n }\n\n answerCall(): void {\n if (this.callSlots['1']) {\n this.activeCallId = this.callSlots['1'].getCallId();\n const res_answerCall = this.cli.answerCall(this.activeCallId);\n console.debug('res_answerCall: ', res_answerCall);\n }\n }\n\n addVideo(): void {\n const res_addVideo = this.cli.addVideo(this.activeCallId);\n console.debug('res_addVideo: ', res_addVideo);\n }\n\n removeVideo(): void {\n const res_removeVideo = this.cli.removeVideo(this.activeCallId);\n console.debug('res_removeVideo: ', res_removeVideo);\n }\n\n clearCallSlot(): void {\n this.callSlots['1'] = null;\n }\n\n setAgentId(id: string): void {\n this.agentId = id;\n }\n\n agentIdle(): void {\n const params = new HttpParams()\n .set('action', 'release')\n .set('agentId', this.agentId);\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe(\n (response) => console.debug('Agent marked as idle: ', response),\n (error) => console.error('Error updating agent status: ', error)\n );\n }\n\n agentBusy(): void {\n const params = new HttpParams()\n .set('action', 'confirm')\n .set('agentId', this.agentId);\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.post(this.agentStatusApiUrl, {}, { params, headers }).subscribe(\n (response) => console.debug('Agent marked as busy: ', response),\n (error) => console.error('Error updating agent status: ', error)\n );\n }\n\n agentAutoRelease(): void {\n setInterval(() => {\n const params = new HttpParams().set('action', 'auto-release');\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n this.http.get(this.agentStatusApiUrl, { params, headers }).subscribe(\n (response) => console.debug('Auto-release triggered: ', response),\n (error) => console.error('Auto-release failed: ', error)\n );\n }, 2 * 60 * 1000);\n }\n\n handleConfigChange = (res_configChange: any): void => {\n console.debug('res_configChange: ', res_configChange);\n };\n\n handleRegistrationChange = (res_registrationChange: any): void => {\n // console.debug('res_registrationChange: ', res_registrationChange);\n this.zone.run(() => {\n this.loginStatusSubject.next(res_registrationChange);\n });\n console.debug('res_registrationChange: ', res_registrationChange);\n if (res_registrationChange?.result === LoginState.LOGIN_SUCCESS) {\n const rpc: any = (this.cli as any).jsonRpc;\n if (rpc && rpc.ws) {\n rpc.ws.evtConnectionOpen.attach(() => {\n console.log('[RPC-PATCH] WebSocket open — JSON-RPC ready');\n this.patchRpcForTransfers(this.agentId);\n });\n }\n }\n };\n\n handleTokenRenewal = (res_tokenRenewal: any): void => {\n console.debug('res_tokenRenewal: ', res_tokenRenewal);\n if (res_tokenRenewal.result == 'AWL_MSG_TOKEN_RENEW_SUCCESS') {\n console.debug('Token is successfully renewed');\n } else {\n console.debug('Token renewal failed. reason: ', res_tokenRenewal.reason);\n }\n };\n\n assignToFirstAvailableSlot(callId: string, callObj: any): void {\n const freeSlot = Object.entries(this.callSlots).find(\n ([_, obj]) => obj === null\n );\n if (freeSlot) {\n this.callSlots[freeSlot[0] as '1' | '2' | '3'] = callObj;\n this.activeCallsMap.set(callId, callObj);\n // If we don't already have an active call tracked, set this incoming call as active.\n if (!this.activeCallId) {\n this.activeCallId = callId;\n }\n } else {\n console.warn('All call slots are occupied');\n }\n }\n\n getSlotForCallId(callId: string): '1' | '2' | '3' | null {\n for (const [slot, callObj] of Object.entries(this.callSlots)) {\n if (callObj && callObj.getCallId() === callId) {\n return slot as '1' | '2' | '3';\n }\n }\n return null;\n }\n\n releaseCallById(callId: string): void {\n for (const [slot, obj] of Object.entries(this.callSlots)) {\n if (obj?.getCallId() === callId) {\n this.callSlots[slot as '1' | '2' | '3'] = null;\n this.activeCallsMap.delete(callId);\n break;\n }\n }\n }\n\n handleCallState(callObj: any): void {\n console.debug(\n `Call state updated for Call ID: ${callObj?.getCallId()}`,\n callObj\n );\n console.debug(\n `Call state updated for Call ID: ${callObj?.getSipUri()}`,\n callObj\n );\n this.currentcallId = callObj.getCallId();\n const state = callObj.getCallState();\n if (!this.activeCallId) {\n this.activeCallId = callObj.getCallId();\n }\n switch (state) {\n case CallState.FAILED:\n case CallState.DISCONNECTED:\n console.debug('Call Failed or DISCONNECTED! Releasing call...');\n this.releaseCallById(callObj.getCallId());\n // Signal UI to reset to dialpad (ensure change detection runs)\n this.zone.run(() => {\n this.callStateSubject.next({\n callId: callObj.getCallId(),\n state: CallState.DISCONNECTED,\n });\n });\n break;\n case CallState.FAREND_UPDATE:\n console.debug(\n 'FarEnd Updated:',\n callObj.getFarEndNumber(),\n callObj.getFarEndName(),\n callObj.getSipUri()\n );\n break;\n default:\n console.debug('Call state: ', state);\n }\n }\n\n swapLines(): void {\n let currentSlotKey: string | null = null;\n\n // Find the slot key of the current active call\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (call && call.getCallId() === this.activeCallId) {\n currentSlotKey = key;\n break;\n }\n }\n\n if (!currentSlotKey) {\n console.warn('Active call slot not found.');\n return;\n }\n\n // Find another active call to swap to\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (key === currentSlotKey) continue;\n if (call) {\n const currentCall = this.callSlots[currentSlotKey as '1' | '2' | '3'];\n\n console.log(`Holding call in slot ${currentSlotKey}`);\n this.cli.doHold(currentCall?.getCallId());\n\n console.log(`Unholding call in slot ${key}`);\n this.cli.doUnHold(call.getCallId());\n\n this.activeCallId = call.getCallId();\n return;\n }\n }\n\n console.warn('No other active calls to swap to.');\n }\n\n public swapToSlot(targetSlot: '1' | '2' | '3'): void {\n // 1) Find the current slot\n let currentSlotKey: '1' | '2' | '3' | null = null;\n for (const [key, call] of Object.entries(this.callSlots)) {\n if (call && call.getCallId() === this.activeCallId) {\n currentSlotKey = key as '1' | '2' | '3';\n break;\n }\n }\n\n if (!currentSlotKey) {\n console.warn(\"Active call slot not found, can't swap.\");\n return;\n }\n\n // 2) If targetSlot is the same as currentSlotKey, do nothing\n if (targetSlot === currentSlotKey) {\n console.log(`Already on slot ${targetSlot}, no swap needed.`);\n return;\n }\n\n // 3) If the target slot has a call\n const targetCall = this.callSlots[targetSlot];\n if (!targetCall) {\n console.warn(`No call in slot ${targetSlot}, can't unhold that slot.`);\n return;\n }\n\n // 4) Hold the old slot\n const currentCall = this.callSlots[currentSlotKey];\n console.log(`Holding call in slot ${currentSlotKey}`);\n this.cli.doHold(currentCall?.getCallId());\n\n // 5) Unhold the target slot\n console.log(`Unholding call in slot ${targetSlot}`);\n this.cli.doUnHold(targetCall.getCallId());\n\n // 6) Update activeCallId\n this.activeCallId = targetCall.getCallId();\n console.log(`Swapped from slot ${currentSlotKey} to slot ${targetSlot}.`);\n }\n\n public dropCallBySlot(targetSlot: '1' | '2' | '3'): void {\n // Check if there is a call in the requested slot.\n const targetCall = this.callSlots[targetSlot];\n if (!targetCall) {\n console.warn(`No active call in slot ${targetSlot} to drop.`);\n return;\n }\n\n // Retrieve the call ID from the target call.\n const callId = targetCall.getCallId();\n console.log(`Dropping call in slot ${targetSlot}, callId: ${callId}`);\n\n // Issue the drop command through Avaya's CLI.\n const res_dropCall = this.cli.dropCall(callId);\n console.debug('dropCallBySlot response:', res_dropCall);\n\n // Clean up: remove the call from the slot and from the activeCallsMap.\n this.activeCallsMap.delete(callId);\n this.callSlots[targetSlot] = null;\n\n // If the activeCallId matches the dropped call, reset it.\n if (this.activeCallId === callId) {\n this.activeCallId = null;\n }\n }\n\n mergeCall(): void {\n const activeCallObjs = Object.entries(this.callSlots)\n .filter(([_, callObj]) => callObj !== null)\n .map(([_, callObj]) => callObj as any);\n\n if (activeCallObjs.length < 2) {\n console.warn('At least two active calls are required to perform merge.');\n return;\n }\n\n const [sourceCall, targetCall] = activeCallObjs;\n\n try {\n const sourceCallId = sourceCall.getCallId();\n const targetCallId = targetCall.getCallId();\n\n console.log(`Merging calls: from ${sourceCallId} to ${targetCallId}`);\n\n this.cli.transferCall(targetCallId, sourceCallId, 'Attended');\n } catch (error) {\n console.error('Merge call failed:', error);\n }\n }\n\n public logCall(callData: any) {\n // 1) Build the HttpParams with \"action=log\"\n const params = new HttpParams().set('action', 'log');\n\n // 2) Set headers to JSON\n const headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n // 3) Make a POST request, passing callData in the body, and use params + headers\n return this.http.post(this.CALL_HISTORY_API_URL, callData, {\n params,\n headers,\n });\n }\n\n public getActiveCallId(): string | null {\n if (!this.activeCallId) {\n return null;\n }\n\n const callObj = this.activeCallsMap.get(this.activeCallId);\n if (!callObj) {\n return null;\n }\n\n return callObj.getCallId();\n }\n\n public async initLocalMic(): Promise<void> {\n try {\n const micStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n console.log('Captured mic stream:', micStream);\n this.localStream = micStream;\n } catch (err) {\n console.error('Failed to capture microphone:', err);\n }\n }\n /////////////////////////////////////////////////////////////\n private patchRpcForTransfers(agentId: string) {\n if (this._rpcPatched) {\n console.debug('[RPC-PATCH] already patched');\n return;\n }\n const jsonRpc = (this.cli as any).jsonRpc;\n if (!jsonRpc || !jsonRpc.ws) {\n console.warn('[RPC-PATCH] JSON-RPC not ready yet');\n return;\n }\n\n console.debug('[RPC-PATCH] patching ws.send now');\n this._rpcPatched = true;\n\n const ws = jsonRpc.ws as WebSocket;\n const origSend = ws.send.bind(ws);\n\n ws.send = (raw: string | ArrayBuffer) => {\n // log every outbound frame so you can see your injection happen\n try {\n const msg = JSON.parse(raw as string);\n if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {\n console.debug(`[RPC-PATCH] sending ${msg.msgname} →`, msg.params);\n }\n } catch (_) {\n /* not JSON, ignore */\n }\n\n return origSend(raw);\n };\n }\n\n public async makeCallWithCustomData(\n destination: string,\n dataToSend: string\n ): Promise<'1' | '2' | '3' | null> {\n // 0) Safari race fix\n await this.prewarmMic();\n\n this.patchRpcForTransfers(dataToSend);\n\n // 2) find a free slot\n const freeSlot = (['1', '2', '3'] as const).find(\n (s) => this.callSlots[s] === null\n );\n if (!freeSlot) {\n console.warn('All call slots are occupied.');\n return null;\n }\n\n // 3) kick off the call via AWL\n const callObj = this.cli.makeCall(destination, 'audio');\n if (!callObj) {\n console.error('Error! Cannot make call.');\n return null;\n }\n\n // 4) book-keep exactly as you do today\n const callId = callObj.getCallId();\n this.activeCallsMap.set(callId, callObj);\n this.callSlots[freeSlot] = callObj;\n this.activeCallId = callId;\n\n console.log(\n `📡 Started call in slot ${freeSlot} with customData=\"${dataToSend}\"`\n );\n return freeSlot;\n }\n\n public transferCallWithTag(target: string, type: 'Attended' | 'Blind'): void {\n // 1) patch the JSON-RPC so the next transferCall has our tag\n this.patchRpcForTransfers(this.agentId);\n\n // 2) do the normal AWL transfer\n const res = this.cli.transferCall(target, this.activeCallId, type);\n console.debug('res_transferCall:', res);\n }\n\n private _doPatch() {\n // if (this._rpcPatched) return;\n this._rpcPatched = true;\n console.log('[RPC-PATCH] patching WebSocket now');\n\n const jsonRpc = (this.cli as any).jsonRpc;\n const ws: WebSocket = jsonRpc.ws;\n const origSend = ws.send.bind(ws);\n\n ws.send = (data: string | ArrayBuffer) => {\n console.log('[RPC-PATCH] raw ws.send →', data);\n try {\n const msg = JSON.parse(data as string);\n if (msg.msgname === 'makeCall' || msg.msgname === 'transferCall') {\n // inject your field\n msg.params.transferingAgent = this.agentId;\n const patched = JSON.stringify(msg);\n console.log(\n `[RPC-PATCH] sending ${msg.msgname} with params →`,\n msg.params\n );\n return origSend(patched);\n }\n } catch {\n // non-JSON or other messages\n }\n return origSend(data);\n };\n }\n\n\n /** Pre-warm microphone so AWL always has a local stream when it tries addStream() */\n public async prewarmMic(): Promise<MediaStream> {\n // Reuse if we already have a healthy stream\n if (this.prewarmedStream && this.prewarmedStream.getTracks().length) {\n return this.prewarmedStream;\n }\n\n // On Safari, first call should be simple (no exact device constraints)\n const audio: MediaStreamConstraints['audio'] =\n this.isSafari() ? true : { echoCancellation: false, noiseSuppression: false, autoGainControl: false };\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio });\n\n this.prewarmedStream = stream;\n this.localStream = stream;\n\n // Hand it to the polyfill fallback so addStream(undefined) still works\n (window as any).__LAST_LOCAL_STREAM = stream;\n\n // (Optional) Nudge autoplay policy: attach to a muted hidden <audio> once\n try {\n const a = document.createElement('audio');\n a.muted = true;\n a.autoplay = true;\n a.style.display = 'none';\n a.srcObject = stream;\n document.body.appendChild(a);\n await a.play().catch(() => { });\n // keep element for lifetime of the page to avoid GC issues\n } catch { }\n\n return stream;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CountryService {\n private countriesData!: any[];\n\n // private static readonly COUNTRY_ENDPOINT = `https://assets.snugdesk.com/metadata/countries.json`;\n private static readonly COUNTRY_ENDPOINT = `https://snugdesk-assets.s3.amazonaws.com/metadata/countries.json`;\n\n constructor(private httpClient: HttpClient) {}\n\n public async getAllCountries(): Promise<any[]> {\n if (!this.countriesData) {\n this.countriesData = await lastValueFrom(\n this.httpClient.get<any[]>(CountryService.COUNTRY_ENDPOINT)\n );\n }\n return this.countriesData;\n }\n\n async getCountryFromCallingCode(\n countryCallingCode: string\n ): Promise<any | undefined> {\n await this.getAllCountries();\n return this.countriesData?.find(\n (c: any) => c.callingCode === countryCallingCode\n );\n }\n\n async getCountryFromCountryCode(\n countryCode: string\n ): Promise<any | undefined> {\n await this.getAllCountries();\n return this.countriesData?.find((c: any) => c.code === countryCode);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { lastValueFrom } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class PhoneNumberLookupService {\n constructor(private httpClient: HttpClient) {}\n\n async lookupPhoneNumber(phoneNumber: string, hlr?: boolean): Promise<Object> {\n const apiEndpoint = hlr\n ? `https://api.snugdesk.com/phone-numbers/hlr/${encodeURIComponent(\n phoneNumber\n )}`\n : `https://api.snugdesk.com/phone-numbers/${encodeURIComponent(\n phoneNumber\n )}`;\n\n const res_lookupPhoneNumber = await lastValueFrom(\n this.httpClient.get(apiEndpoint)\n );\n // console.debug('res_lookupPhoneNumber: ', res_lookupPhoneNumber);\n\n return res_lookupPhoneNumber;\n }\n}\n","// import { Injectable } from '@angular/core';\n// import { HttpClient } from '@angular/common/http';\n// import { lastValueFrom } from 'rxjs';\n\n// import { CallMetadata } from '../models/active-call.model';\n\n// export interface RecordingSession {\n// audioContext: AudioContext;\n// recordingStream: MediaStreamAudioDestinationNode;\n// recorder: MediaRecorder;\n// metadata: CallMetadata;\n// }\n\n// @Injectable({ providedIn: 'root' })\n// export class RecordingManagerService {\n// private sessions = new Map<string, RecordingSession>();\n\n// private readonly MIME_TYPE_PREFERRED = 'audio/webm;codecs=opus';\n// private readonly MIME_TYPE_FALLBACK = 'audio/webm';\n// private readonly CHUNK_DURATION_MS = 5000;\n// private readonly AUDIO_CONTEXT_CLOSE_DELAY_MS = 200;\n\n// private readonly CALL_HISTORY_API_URL =\n// 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';\n\n// constructor(private http: HttpClient) {}\n\n// // prettier-ignore\n// startRecording(localMediaStream: MediaStream, remoteMediaStream: MediaStream, metadata: RecordingSession['metadata']): RecordingSession | undefined {\n// // Stop any existing recording session for this callId\n// this.stopRecording(metadata.callId);\n\n// if (!localMediaStream || !remoteMediaStream) {\n// console.warn(`[${metadata.callId}] Skipped start recording: missing remote or local stream`);\n// return undefined;\n// }\n\n// const audioContext = new AudioContext();\n// const recordingStream = audioContext.createMediaStreamDestination();\n\n// // console.debug(`[${metadata.callId}] Connecting local and remote audio streams to recording context`);\n// audioContext.createMediaStreamSource(localMediaStream).connect(recordingStream);\n// audioContext.createMediaStreamSource(remoteMediaStream).connect(recordingStream);\n\n// const mimeType = MediaRecorder.isTypeSupported(this.MIME_TYPE_PREFERRED)\n// ? this.MIME_TYPE_PREFERRED\n// : this.MIME_TYPE_FALLBACK;\n\n// const recorder = new MediaRecorder(recordingStream.stream, { mimeType });\n\n// recorder.ondataavailable = (evt: BlobEvent) => this.handleDataAvailable(evt, metadata);\n// recorder.onerror = (err) => console.error(`[${metadata.callId}] MediaRecorder error:`, err);\n\n// recorder.start(this.CHUNK_DURATION_MS);\n// console.debug(`[${metadata.callId}] MediaRecorder started (chunk size: ${this.CHUNK_DURATION_MS / 1000}s)`);\n\n// const session: RecordingSession = {\n// audioContext,\n// recordingStream,\n// recorder,\n// metadata,\n// };\n\n// this.sessions.set(metadata.callId, session);\n// return session;\n// }\n\n// getSession(callId: string): RecordingSession | undefined {\n// return this.sessions.get(callId);\n// }\n\n// stopRecording(callId: string): void {\n// const session = this.sessions.get(callId);\n// if (!session) return;\n\n// const { recorder, audioContext } = session;\n\n// if (recorder?.state === 'recording') {\n// recorder.stop();\n// console.debug(`[${callId}] MediaRecorder stopped`);\n// }\n\n// setTimeout(() => {\n// if (audioContext.state !== 'closed') {\n// audioContext.close();\n// console.debug(`[${callId}] AudioContext closed`);\n// }\n// }, this.AUDIO_CONTEXT_CLOSE_DELAY_MS);\n\n// this.sessions.delete(callId);\n// }\n\n// // prettier-ignore\n// private async handleDataAvailable(evt: BlobEvent, metadata: RecordingSession['metadata']): Promise<void> {\n// if (!evt.data || evt.data.size === 0) return;\n\n// const filename = this.generateFilename(metadata.callId);\n// // console.debug(`[${metadata.callId}] Recording chunk ready → preparing to upload as \"${filename}\"`);\n\n// try {\n// await this.uploadCallRecording(metadata, evt.data, filename);\n// console.debug(`[${metadata.callId}] Upload successful → \"${filename}\"`);\n// } catch (err) {\n// console.error(`[${metadata.callId}] Upload failed → \"${filename}\"`, err);\n// }\n// }\n\n// // prettier-ignore\n// private async uploadCallRecording(metadata: RecordingSession['metadata'], file: Blob, filename?: string): Promise<{ success: boolean; message: string; s3Key?: string }> {\n// try {\n// if (!filename) {\n// const timestamp = new Date()\n// .toISOString()\n// .replace(/[:.]/g, '')\n// .replace('T', '-')\n// .slice(0, 15);\n// filename = `${timestamp}-${metadata.agentId}.webm`;\n// console.debug(`[${metadata.callId}] filename generated: \"${filename}\"`);\n// }\n\n// // console.debug(`[${metadata.callId}] Converting Blob to Base64 for upload`);\n// const base64 = await this.convertBlobToBase64(file);\n// const body = base64.split(',')[1];\n\n// const payload = {\n// ...metadata,\n// filename,\n// isBase64: true,\n// body,\n// };\n\n// const url = `${this.CALL_HISTORY_API_URL}?action=uploadRecording`;\n// console.debug(`[${metadata.callId}] Sending recording chunk to ${url}`);\n// console.debug(`[${metadata.callId}] Payload: `, payload);\n\n// const res: any = await lastValueFrom(\n// this.http.post(url, payload, {\n// headers: { 'Content-Type': 'application/json' },\n// responseType: 'json',\n// })\n// );\n// console.debug(`[${metadata.callId}] Upload response: `, res);\n\n// return {\n// success: true,\n// message: res?.message || 'Upload successful',\n// s3Key: res?.s3Key,\n// };\n// } catch (err: any) {\n// console.error(`[${metadata.callId}] Upload failed: `, err);\n// return {\n// success: false,\n// message: err?.message || 'Upload failed',\n// };\n// }\n// }\n\n// private convertBlobToBase64(blob: Blob): Promise<string> {\n// return new Promise((resolve, reject) => {\n// const reader = new FileReader();\n// reader.onerror = reject;\n// reader.onload = () => resolve(reader.result as string);\n// reader.readAsDataURL(blob);\n// });\n// }\n\n// private generateFilename(callId: string): string {\n// const now = new Date();\n// const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');\n// const timeStr = now.toTimeString().slice(0, 8).replace(/:/g, '');\n// const msStr = now.getMilliseconds().toString().padStart(3, '0');\n// const filename = `${callId}-${dateStr}-${timeStr}${msStr}.webm`;\n// console.debug(`[${callId}] Generated filename: \"${filename}\"`);\n// return filename;\n// }\n// }\nimport { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { CallMetadata } from '../models/active-call.model';\n\nexport interface RecordingSession {\n audioContext: AudioContext;\n recordingStream: MediaStreamAudioDestinationNode;\n // we rotate a fresh recorder per chunk:\n recorder?: MediaRecorder | null;\n metadata: CallMetadata;\n stopping: boolean;\n chunkIndex: number;\n chunkTimer?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class RecordingManagerService {\n private sessions = new Map<string, RecordingSession>();\n\n private readonly MIME_TYPE_PREFERRED = 'audio/webm;codecs=opus';\n private readonly MIME_TYPE_FALLBACK = 'audio/webm';\n private readonly CHUNK_DURATION_MS = 5000;\n private readonly AUDIO_CONTEXT_CLOSE_DELAY_MS = 200;\n\n private readonly CALL_HISTORY_API_URL =\n 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';\n\n constructor(private http: HttpClient) {}\n\n // ---- Public API ----------------------------------------------------------\n\n startRecording(\n localMediaStream: MediaStream,\n remoteMediaStream: MediaStream,\n metadata: CallMetadata\n ): RecordingSession | undefined {\n // stop any previous session for this call\n this.stopRecording(metadata.callId);\n\n if (!localMediaStream || !remoteMediaStream) {\n console.warn(`[${metadata.callId}] Skipped start recording: missing remote or local stream`);\n return undefined;\n }\n\n const audioContext = new AudioContext();\n const recordingStream = audioContext.createMediaStreamDestination();\n\n audioContext.createMediaStreamSource(localMediaStream).connect(recordingStream);\n audioContext.createMediaStreamSource(remoteMediaStream).connect(recordingStream);\n\n const session: RecordingSession = {\n audioContext,\n recordingStream,\n metadata,\n stopping: false,\n chunkIndex: 0,\n recorder: null,\n chunkTimer: undefined\n };\n\n this.sessions.set(metadata.callId, session);\n\n // kick off the chunk loop\n this.startNextChunk(session);\n\n return session;\n }\n\n getSession(callId: string): RecordingSession | undefined {\n return this.sessions.get(callId);\n }\n\n stopRecording(callId: string): void {\n const session = this.sessions.get(callId);\n if (!session) return;\n\n session.stopping = true;\n\n if (session.chunkTimer) {\n clearTimeout(session.chunkTimer);\n session.chunkTimer = undefined;\n }\n\n const rec = session.recorder;\n if (rec && rec.state === 'recording') {\n try {\n rec.stop(); // this will still produce the final (playable) chunk\n } catch {}\n }\n\n // close audio context a bit later\n setTimeout(() => {\n if (session.audioContext.state !== 'closed') {\n session.audioContext.close();\n console.debug(`[${session.metadata.callId}] AudioContext closed`);\n }\n }, this.AUDIO_CONTEXT_CLOSE_DELAY_MS);\n\n this.sessions.delete(callId);\n }\n\n // ---- Internals -----------------------------------------------------------\n\n /** Start a new MediaRecorder for the next chunk so the blob has its own headers */\n private startNextChunk(session: RecordingSession): void {\n if (session.stopping) return;\n\n const mimeType = MediaRecorder.isTypeSupported(this.MIME_TYPE_PREFERRED)\n ? this.MIME_TYPE_PREFERRED\n : this.MIME_TYPE_FALLBACK;\n\n const recorder = new MediaRecorder(session.recordingStream.stream, { mimeType });\n session.recorder = recorder;\n\n const myChunkIdx = session.chunkIndex++;\n\n recorder.ondataavailable = async (evt: BlobEvent) => {\n if (!evt.data || evt.data.size === 0) return;\n\n // give each chunk its own unique filename (includes index)\n const filename = this.generateChunkFilename(session.metadata.callId, myChunkIdx);\n\n try {\n await this.uploadCallRecording(session.metadata, evt.data, filename);\n console.debug(`[${session.metadata.callId}] ✅ uploaded chunk → ${filename}`);\n } catch (err) {\n console.error(`[${session.metadata.callId}] ❌ upload failed → ${filename}`, err);\n }\n };\n\n recorder.onerror = (err) => {\n console.error(`[${session.metadata.callId}] MediaRecorder error:`, err);\n };\n\n // when this recorder is stopped, immediately start the next one (unless stopping)\n recorder.onstop = () => {\n if (session.stopping) return;\n // start the next chunk on the next tick to avoid overlap\n setTimeout(() => this.startNextChunk(session), 0);\n };\n\n // Start recording this chunk (no timeslice!) and schedule a stop after N ms.\n recorder.start();\n console.debug(\n `[${session.metadata.callId}] MediaRecorder started for chunk #${myChunkIdx}`\n );\n\n session.chunkTimer = window.setTimeout(() => {\n if (!session.stopping && recorder.state === 'recording') {\n // ensure we flush a complete, headered WebM\n recorder.stop();\n console.debug(\n `[${session.metadata.callId}] MediaRecorder stopped for chunk #${myChunkIdx}`\n );\n }\n }, this.CHUNK_DURATION_MS) as unknown as number;\n }\n\n // Upload a single chunk (Blob) as base64 payload\n private async uploadCallRecording(\n metadata: RecordingSession['metadata'],\n file: Blob,\n filename?: string\n ): Promise<{ success: boolean; message: string; s3Key?: string }> {\n try {\n if (!filename) {\n filename = this.generateFilename(metadata.callId, metadata.agentId);\n }\n\n const base64 = await this.convertBlobToBase64(file);\n const body = base64.split(',')[1];\n\n const payload = {\n ...metadata,\n filename,\n isBase64: true,\n body,\n };\n\n const url = `${this.CALL_HISTORY_API_URL}?action=uploadRecording`;\n const res: any = await lastValueFrom(\n this.http.post(url, payload, {\n headers: { 'Content-Type': 'application/json' },\n responseType: 'json',\n })\n );\n\n return {\n success: true,\n message: res?.message || 'Upload successful',\n s3Key: res?.s3Key,\n };\n } catch (err: any) {\n return {\n success: false,\n message: err?.message || 'Upload failed',\n };\n }\n }\n\n private convertBlobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onload = () => resolve(reader.result as string);\n reader.readAsDataURL(blob);\n });\n }\n\n private generateFilename(callId: string, agentId: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '').replace('T', '-').slice(0, 15);\n return `${timestamp}-${agentId}-${callId}.webm`;\n }\n\n private generateChunkFilename(callId: string, chunkIndex: number): string {\n const now = new Date();\n const dateStr = now.toISOString().slice(0, 10).replace(/-/g, '');\n const timeStr = now.toTimeString().slice(0, 8).replace(/:/g, '');\n const msStr = now.getMilliseconds().toString().padStart(3, '0');\n const part = String(chunkIndex).padStart(4, '0');\n return `${callId}-${dateStr}-${timeStr}${msStr}-part${part}.webm`;\n }\n}\n\n","// import { Injectable } from '@angular/core';\n// import { BehaviorSubject } from 'rxjs';\n\n// import { CallMetadata } from '../models/active-call.model';\n\n// @Injectable({ providedIn: 'root' })\n// export class CallSocketService {\n// private socket: WebSocket | null = null;\n\n// readonly message$ = new BehaviorSubject<any>(null);\n\n// open(metadata: CallMetadata): void {\n// if (this.socket?.readyState === WebSocket.OPEN) return;\n// if (this.socket?.readyState === WebSocket.CONNECTING) return;\n\n// this.socket = new WebSocket(\n// 'wss://hymtqh7k82.execute-api.us-west-2.amazonaws.com/callSession'\n// );\n\n// this.socket.onopen = () => {\n// console.warn('[WS] open----------------------------------------------');\n// this.socket!.send(JSON.stringify(metadata));\n// };\n\n// this.socket.onmessage = (ev) => {\n// try {\n// this.message$.next(JSON.parse(ev.data));\n// } catch {\n// this.message$.next(ev.data);\n// }\n// };\n\n// this.socket.onerror = (ev) => {\n// console.error('[WS] error', ev);\n// };\n\n// this.socket.onclose = () => {\n// console.warn('[WS] closed');\n// this.socket = null;\n// };\n// }\n\n// send(payload: object): void {\n// if (this.socket?.readyState === WebSocket.OPEN) {\n// this.socket.send(JSON.stringify(payload));\n// } else {\n// console.warn('[WS] not open; dropping', payload);\n// }\n// }\n\n// close(): void {\n// this.socket?.close();\n// this.socket = null;\n// }\n// }\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { CallMetadata } from '../models/active-call.model';\n\n@Injectable({ providedIn: 'root' })\nexport class CallSocketService {\n private sockets = new Map<string, WebSocket>();\n private subjects = new Map<string, BehaviorSubject<any>>();\n\n open(metadata: CallMetadata): void {\n const { callId } = metadata;\n const existing = this.sockets.get(callId);\n if (existing && (existing.readyState === WebSocket.OPEN || existing.readyState === WebSocket.CONNECTING)) {\n return;\n }\n\n const ws = new WebSocket('wss://hymtqh7k82.execute-api.us-west-2.amazonaws.com/callSession');\n this.sockets.set(callId, ws);\n if (!this.subjects.has(callId)) this.subjects.set(callId, new BehaviorSubject<any>(null));\n\n ws.onopen = () => {\n console.warn('[WS Open ]', { callId });\n ws.send(JSON.stringify(metadata));\n };\n\n ws.onmessage = (ev) => {\n const subj = this.subjects.get(callId);\n if (!subj) return;\n try {\n subj.next(JSON.parse(ev.data));\n } catch {\n subj.next(ev.data);\n }\n };\n\n ws.onerror = (ev) => {\n console.warn('[WS Error]', { callId, ev });\n };\n\n ws.onclose = () => {\n console.warn('[WS Closed]', { callId });\n this.sockets.delete(callId);\n // keep subject around if you want late subscribers to see last value.\n // If you want to free it too, uncomment the next line:\n // this.subjects.delete(callId);\n };\n }\n\n messages$(callId: string): BehaviorSubject<any> | undefined {\n return this.subjects.get(callId);\n }\n\n send(callId: string, payload: object): void {\n const ws = this.sockets.get(callId);\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(payload));\n } else {\n console.warn('[WS NotOpen ]', { callId, dropping: payload });\n }\n }\n\n close(callId: string): void {\n const ws = this.sockets.get(callId);\n if (ws) {\n ws.close();\n this.sockets.delete(callId);\n // optional: also remove the subject\n // this.subjects.delete(callId);\n }\n }\n\n closeAll(): void {\n for (const [callId, ws] of this.sockets.entries()) {\n try { ws.close(); } catch {}\n console.warn('[WS Closed]', { callId });\n }\n this.sockets.clear();\n // optional: also clear subjects\n // this.subjects.clear();\n }\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\n\n@Component({\n selector: 'app-call-history',\n templateUrl: './call-history.component.html',\n styleUrls: ['./call-history.component.css'],\n standalone: false,\n})\nexport class CallHistoryComponent implements OnInit {\n @Input() mode: 'dial' | 'transfer' = 'dial';\n @Output() makeCallEv = new EventEmitter<string>();\n @Output() transferEv = new EventEmitter<any>();\n\n private readonly CALL_HISTORY_API_URL =\n 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory';\n\n showHistoryLoader: boolean = false;\n\n callHistory: any[] = [];\n recentCallactiveTab = 'recentCall';\n\n constructor(\n private http: HttpClient,\n private authenticationService: SnugdeskAuthenticationService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit(): Promise<void> {\n await this.loadCallHistory();\n }\n\n recentSelectTab(tab: string): void {\n this.recentCallactiveTab = tab;\n }\n\n async loadCallHistory(): Promise<void> {\n this.showHistoryLoader = true;\n try {\n // console.log('tennat id fetched ',this.authenticationService.tenant$.getValue());\n const tenantId = this.authenticationService.getTenantId();\n console.log('tennat id fetched ',tenantId);\n // const userId = this.authenticationService.getUserId();\n // console.log('tennat id fetched ',userId);\n const userId='5001';\n\n const response: any = await this.getCallHistory(tenantId, userId);\n const items = response.items || [];\n\n this.callHistory = items.sort(\n (a: any, b: any) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\n );\n\n console.log('Fetched call history: ', this.callHistory);\n } catch (error) {\n console.error('Failed to load call history:', error);\n } finally {\n this.showHistoryLoader = false;\n this.cdr.detectChanges();\n }\n }\n\n getCallHistory(tenantId: string, agentId: string): Promise<any> {\n // GET /avayaCallHistory?action=history&tenantId=xxx&agentId=yyy\n return lastValueFrom(\n this.http.get(\n `${this.CALL_HISTORY_API_URL}?action=history&tenantId=${tenantId}&agentId=${agentId}`\n )\n );\n }\n\n makeCall(phoneNumber: string): void {\n this.makeCallEv.emit(phoneNumber);\n }\n\n get callerDropped(): any[] {\n return this.callHistory.filter((item) => {\n const duration = Number(item?.duration ?? 0);\n return item.disconnectSide === 'CALLER' && duration <= 0;\n });\n }\n\n selectFromHistory(item: any): void {\n if (this.mode === 'transfer') {\n \n this.transferEv.emit(item);\n return;\n }\n\n \n const dialable = this.resolveDialable(item) || (item?.phoneNumber ?? '').toString().replace(/\\s+/g, '');\n if (!dialable) {\n console.warn('No dialable number found in history item:', item);\n return;\n }\n this.makeCallEv.emit(dialable);\n }\n\n\n private resolveDialable(item: any): string | null {\n const clean = (v: any) => (v ?? '').toString().replace(/\\s+/g, '');\n return (\n clean(item?.resolvedDialable) ||\n clean(item?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.normalizedPhoneNumber) ||\n null\n );\n }\n}\n","@if (showHistoryLoader) {\n<div class=\"history_loader\">\n <div class=\"spinner\"></div>\n <div class=\"loader_text\">Fetching call history...</div>\n</div>\n} @else {\n\n<div class=\"recent_container_outer\">\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"recentCallactiveTab === 'recentCall'\">\n Recent\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"recentCallactiveTab === 'missedCall'\">\n Missed Call\n </button>\n </div>\n </div>\n\n <h2 class=\"recent_heading\">Recent</h2>\n\n <div class=\"container_recent_search\">\n <input type=\"search\" placeholder=\"Type to search\" />\n </div>\n\n @if (recentCallactiveTab === 'recentCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (call of callHistory; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"container_recent_item\">\n <!-- avatar -->\n <div class=\"container_recent_item_image\">\n <div class=\"container_recent_item_image_inner grd1\">\n {{ call.phoneNumber?.country?.code | uppercase }}\n </div>\n </div>\n\n <!-- middle -->\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">\n {{ call.phoneNumber?.normalizedPhoneNumber }}\n </div>\n\n <div class=\"recent_time_back\" [ngClass]=\"{\n missed_call_color: call.status === 'MISSED',\n caller_drop: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <!-- Direction icon (generic handset) -->\n <svg viewBox=\"0 0 512 512\" width=\"12px\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n &nbsp; {{ call.direction }}\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <span class=\"disconnect_badge\">Caller hung up</span>\n }\n </div>\n </div>\n\n <!-- right time -->\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">\n {{ call.timestamp | date : \"dd/MM/yyyy\" }}\n </span>\n </div>\n </div>\n\n <!-- call button -->\n <div class=\"calling_btn\">\n <div class=\"calling_btn_inner\">\n <!-- <button\n class=\"button_recent_call\"\n (click)=\"makeCall(call.phoneNumber?.normalizedPhoneNumber)\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button> -->\n\n @if (mode === 'transfer') {\n <button class=\"button_recent_call\" (click)=\"transferEv.emit(call)\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button class=\"button_recent_call\" (click)=\"\n makeCall(call.phoneNumber?.normalizedPhoneNumber)\n \">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n <!-- /middle -->\n </div>\n </div>\n } @if (callHistory.length === 0) {\n <div class=\"container_call_history_not_found\">\n <div class=\"icon_round_area_call_history\"></div>\n <h2>No Call History</h2>\n <p>Your call history is empty</p>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"recent_tab_container\">\n <div class=\"container_recent_list\">\n <div class=\"container_recent_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (call of callerDropped; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"container_recent_item\">\n <div class=\"container_recent_item_image\">\n <div class=\"container_recent_item_image_inner grd1\">\n {{ call.phoneNumber?.country?.code | uppercase }}\n </div>\n </div>\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">\n {{ call.phoneNumber?.normalizedPhoneNumber }}\n </div>\n <div class=\"recent_time_back caller_drop\">\n <svg fill=\"currentColor\" viewBox=\"0 0 640 512\" width=\"12px\">\n <path\n d=\"M232 0c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-39 39 58.7 58.7C282.3 152.4 300.8 160 320 160s37.7-7.6 51.3-21.3L503 7c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9L405.3 172.7C382.6 195.3 352 208 320 208s-62.6-12.7-85.3-35.3L176 113.9l-39 39c-6.9 6.9-17.2 8.9-26.2 5.2s-14.8-12.5-14.8-22.2L96 24c0-13.3 10.7-24 24-24L232 0zM51.4 489.9l-35.4-62c-9.7-16.9-8.3-38.1 5.5-51.7C72.6 325.9 178.1 256 320 256s247.4 69.9 298.5 120.2c13.9 13.6 15.2 34.8 5.5 51.7l-35.4 62c-7.4 12.9-22.7 19.1-37 14.8L438.8 470.8c-13.5-4.1-22.8-16.5-22.8-30.6l0-56.2c-62.3-20.8-129.7-20.8-192 0l0 56.2c0 14.1-9.3 26.6-22.8 30.6L88.4 504.7c-14.3 4.3-29.6-1.8-37-14.8z\" />\n </svg>\n &nbsp; Caller hung up\n </div>\n </div>\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">\n {{ call.timestamp | date : \"dd/MM/yyyy\" }}\n </span>\n </div>\n </div>\n <div class=\"calling_btn\">\n <div class=\"calling_btn_inner\">\n <button class=\"button_recent_call\" (click)=\"selectFromHistory(call)\">\n <svg viewBox=\"0 0 512 512\" height=\"15px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n } @if (callerDropped.length === 0) {\n <div class=\"container_call_history_not_found\">\n <div class=\"icon_round_area_call_history\"></div>\n <h2>No Caller-Hangup Calls</h2>\n <p>No inbound calls ended by caller.</p>\n </div>\n }\n </div>\n <!-- /.scrollbox-content -->\n </div>\n <!-- /.scrollbox -->\n </div>\n <!-- /.container_recent_list_inner -->\n </div>\n <!-- /.container_recent_list -->\n </div>\n <!-- /.recent_tab_container -->\n }\n</div>\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { JwtHelperService } from '@auth0/angular-jwt';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthenticationService {\n private readonly jwtHelper: JwtHelperService = new JwtHelperService();\n tenant$ = new BehaviorSubject<any>(null);\n user$ = new BehaviorSubject<any>(null);\n isAuthenticated$ = new BehaviorSubject<boolean>(false);\n\n\n isAuthenticated(): boolean {\n try {\n const mySessionToken = this.getAuthSessionToken();\n // console.log(`Got sessionToken: ${sessionToken}`);\n\n if (!mySessionToken) {\n throw new Error('Session token not found');\n } else if (this.jwtHelper.isTokenExpired(mySessionToken)) {\n throw new Error('Session token expired');\n }\n\n this.isAuthenticated$.next(true);\n return true;\n } catch (err) {\n console.warn(err);\n this.isAuthenticated$.next(false);\n return false;\n }\n }\n\n getAuthSessionToken(): string | null {\n return sessionStorage.getItem('auth_sessionToken');\n }\n\n getAuthDomainToken(): string | null {\n return sessionStorage.getItem('auth_domainToken');\n }\n getDecodedAuthDomainToken(): any {\n const token = this.getAuthDomainToken();\n return token ? this.jwtHelper.decodeToken(token) : null;\n }\n \n getTenantId(): string {\n // return this.getDecodedAuthSessionToken().tenantId;\n return this.getDecodedAuthDomainToken()?.tenantId;\n }\n\n getDecodedAuthSessionToken(): any {\n if (!this.isAuthenticated()) {\n const err: any = new Error(`User not authenticated`);\n err.status = 403;\n throw err;\n }\n \n const token = this.getAuthSessionToken();\n if (!token) {\n const err: any = new Error(`Token missing`);\n err.status = 401;\n throw err;\n }\n \n return this.jwtHelper.decodeToken(token);\n }\n \n\n getUserId(): string {\n return this.getDecodedAuthSessionToken()?.userId;\n }\n}\n","import { Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { ChangeDetectorRef, EventEmitter, Input, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\n\nimport { CountryISO, SearchCountryField } from 'ngx-intl-tel-input';\nimport { AvayaIPOService, CallState } from '../../services/avaya-ipo.service';\nimport { PhoneNumberUtil, PhoneNumberFormat } from 'google-libphonenumber';\nimport { AuthenticationService } from '../../services/authentication.service';\n\n@Component({\n selector: 'app-dialpad',\n templateUrl: './dialpad.component.html',\n styleUrls: ['./dialpad.component.css'],\n standalone: false,\n})\nexport class DialpadComponent implements OnInit, OnDestroy {\n @Input() contacts: any[] = [];\n @Output() makeCallEv = new EventEmitter<string>(); \n @ViewChild('audioElement') audioElement: any;\n private callStateSub?: any;\n\n dialForm!: FormGroup;\n showDirectoryPhonebook = false;\n incomingCallSubscription: any;\n incomingCallNumber: string | undefined;\n\n CountryISO = CountryISO;\n SearchCountryField = SearchCountryField;\n isRinging = false;\n audio: any;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private formBuilder: FormBuilder,\n private avayaIpoService: AvayaIPOService,\n private authenticationService : AuthenticationService\n ) {\n this.dialForm = this.formBuilder.group({\n phoneNumber: ['', Validators.required],\n });\n }\n\n ngOnInit(): void {\n window.addEventListener('keydown', this.handleKeyboardInput);\n\n const phoneUtil = PhoneNumberUtil.getInstance();\n this.incomingCallSubscription =\n this.avayaIpoService.incomingCallSubject.subscribe((data) => {\n try {\n let normalizedNumber = data.farEndNumber.trim();\n\n // Convert numbers with \"00XX\" to \"+XX\"\n if (normalizedNumber.startsWith('00')) {\n normalizedNumber = '+' + normalizedNumber.substring(2);\n }\n\n let parsedNumber;\n if (\n normalizedNumber.startsWith('+') ||\n /^\\d{1,4}/.test(normalizedNumber)\n ) {\n parsedNumber = phoneUtil.parse(normalizedNumber);\n } else {\n parsedNumber = phoneUtil.parse(\n normalizedNumber,\n this.authenticationService.tenant$\n .getValue()\n .contactInformation.country.code.toUpperCase()\n );\n }\n\n this.incomingCallNumber = phoneUtil.format(\n parsedNumber,\n PhoneNumberFormat.INTERNATIONAL\n );\n } catch (error) {\n console.warn('Invalid phone number:', data.farEndNumber);\n this.incomingCallNumber = data.farEndNumber; // Fallback\n }\n // this.incomingCallNumber = data.farEndNumber;\n this.isRinging = true;\n this.audio = this.audioElement.nativeElement;\n this.audio.src = '../../../assets/sounds/ringback_tone.mp3';\n this.audio.loop = true;\n this.audio.currentTime = 0;\n this.audio.play();\n // this.playRingtone();\n });\n\n this.callStateSub = this.avayaIpoService.callStateSubject.subscribe(\n (evt) => {\n if (evt?.state === CallState.DISCONNECTED) {\n this.isRinging = false;\n this.audio?.pause?.();\n this.cdr.detectChanges();\n }\n }\n );\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('keydown', this.handleKeyboardInput);\n this.callStateSub?.unsubscribe?.();\n }\n\n makeCall(): void {\n if (this.dialForm.invalid) {\n console.warn('Dial form is invalid:', this.dialForm.value);\n return;\n }\n\n const phone = this.dialForm.value.phoneNumber;\n console.log('phone =======',phone);\n this.makeCallEv.emit(phone?.internationalNumber);\n this.dialForm.reset();\n this.showDirectoryPhonebook = false;\n }\n\n onClear(): void {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n if (!current) return control?.reset();\n\n const updated = current.slice(0, -1);\n updated ? this.updatePhoneControl(updated) : control?.reset();\n }\n\n handleKeyboardInput = (event: KeyboardEvent): void => {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n\n let updated = current;\n if (event.key === 'Enter') {\n this.makeCall();\n return;\n } else if (event.key === 'Backspace') {\n if (!current) return control?.reset();\n updated = current.slice(0, -1);\n } else if (/^[0-9]$/.test(event.key)) {\n updated += event.key;\n } else {\n return;\n }\n\n updated ? this.updatePhoneControl(updated) : control?.reset();\n };\n\n handleKeypadInput(digit: string): void {\n const control = this.dialForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n this.updatePhoneControl(current + digit);\n }\n\n private updatePhoneControl(value: string): void {\n setTimeout(() => {\n this.dialForm.get('phoneNumber')?.setValue(value);\n this.cdr.detectChanges();\n });\n }\n\n\n declineAvayaCall() {\n this.avayaIpoService.dropCall();\n this.isRinging = false;\n this.audio?.pause?.();\n this.avayaIpoService.agentIdle();\n this.cdr.detectChanges();\n }\n\n acceptAvayaCAll() {\n this.avayaIpoService.answerCall();\n // this.headerComponent.showAvayaIpo = true;\n this.isRinging = false;\n this.audio.pause();\n }\n}\n","<div class=\"container_pd_sd\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <div class=\"incoming_wrapper\">\n <div class=\"incoming_strip slide-right\">\n <div class=\"incoming_avatar\">\n <img\n src=\"../../../assets/images/incomingCall_avatar.gif\"\n alt=\"Incoming call avatar\"\n />\n </div>\n <div class=\"incoming_details\">\n <div class=\"incoming_label\">Incoming call</div>\n <div class=\"incoming_number\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"incoming_subtext\">Web call is ringing</div>\n </div>\n <div class=\"call_action_buttons incoming_actions\">\n <button\n type=\"button\"\n class=\"call_action_button decline\"\n (click)=\"declineAvayaCall()\"\n >\n <span class=\"icon_pill\">\n <svg height=\"18\" viewBox=\"0 0 640 512\">\n <path\n class=\"icon_color\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\"\n />\n </svg>\n </span>\n <span class=\"label\">Decline</span>\n </button>\n <button\n type=\"button\"\n class=\"call_action_button accept\"\n (click)=\"acceptAvayaCAll()\"\n >\n <span class=\"icon_pill\">\n <svg height=\"18\" viewBox=\"0 0 512 512\">\n <path\n class=\"icon_color\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </span>\n <span class=\"label\">Answer</span>\n </button>\n </div>\n </div>\n </div>\n } @else {\n <div\n class=\"container_phone_number_input\"\n [formGroup]=\"dialForm\"\n (ngSubmit)=\"makeCall()\"\n >\n @if (contacts?.length > 0) {\n <button\n class=\"button_phonebook\"\n (click)=\"showDirectoryPhonebook = !showDirectoryPhonebook\"\n >\n <svg\n fill=\"currentColor\"\n height=\"22px\"\n style=\"enable-background: new 0 0 611.985 611.986\"\n version=\"1.1\"\n viewBox=\"0 0 611.985 611.986\"\n width=\"40.985px\"\n routerLinkActive=\"active\"\n xml:space=\"preserve\"\n >\n <g>\n <path\n d=\"M143.021,158.99c42.525,0,79.456-36.931,79.456-79.456S185.546,0.078,143.021,0.078\n S63.565,37.009,63.565,79.534S100.496,158.99,143.021,158.99z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M278.097,381.467c0-127.13-65.98-190.695-139.048-190.695S0,254.338,0,381.467\n C0,468.583,278.097,468.583,278.097,381.467z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M373.444,220.807c42.525,0,79.456-36.931,79.456-79.456s-36.931-79.456-79.456-79.456\n s-79.456,36.931-79.456,79.456S330.919,220.807,373.444,220.807z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M369.471,252.59c-21.962,0-43.033,6.452-62.071,17.957c11.537,31.051,18.37,67.792,18.37,110.921\n c0,42.843-28.541,76.151-77.517,95.22c60.768,51.424,260.267,40.459,260.267-33.403\n C508.52,316.155,442.539,252.59,369.471,252.59z\"\n fill=\"currentColor\"\n />\n </g>\n </svg>\n </button>\n }\n\n\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\"\n [customPlaceholder]=\"'Phone Number'\"\n [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\"\n [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\"\n [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\"\n [maxLength]=\"15\"\n [phoneValidation]=\"true\"\n [separateDialCode]=\"true\"\n (keydown)=\"handleKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <!-- <input type=\"text\" class=\"phone_number_sd\"> -->\n <button class=\"button_backspace\" (click)=\"onClear()\"></button>\n </div>\n }\n</div>\n\n@if (!isRinging && showDirectoryPhonebook) {\n <div class=\"container_phonebook\">\n <div class=\"container_phonebook_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (contact of contacts; track contact.id ?? contact.phone ?? $index) {\n <div class=\"container_contact_item\">\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg\n viewBox=\"0 0 212 212\"\n height=\"49px\"\n width=\"49px\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n enable-background=\"new 0 0 212 212\"\n >\n <path\n fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"\n ></path>\n <g>\n <path\n fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\"\n ></path>\n <path\n fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\"\n ></path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ contact.name }}</div>\n <div class=\"contact_field\">{{ contact.phone }}</div>\n </div>\n </div>\n\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">\n <div class=\"container_rating\">\n @for (star of [1,2,3,4,5]; track star) {\n <span [class.filled]=\"star <= (contact.rating || 0)\">★</span>\n }\n </div>\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n\n@if (!isRinging) {\n <div class=\"container_dialpad\">\n <div class=\"container_dialpad_content\">\n <div class=\"container_dialpad_digits\">\n <!-- <div class=\"active-calls-container\"></div> -->\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('1')\">\n 1\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('2')\">\n 2\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('3')\">\n 3\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('4')\">\n 4\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('5')\">\n 5\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('6')\">\n 6\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('7')\">\n 7\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('8')\">\n 8\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('9')\">\n 9\n </button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path\n fill=\"currentColor\"\n d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86 102.4l122 70.4L208 32z\"\n />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('0')\">\n 0\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"handleKeypadInput('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path\n fill=\"currentColor\"\n d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3 36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4 26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2 384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64 192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\"\n />\n </svg>\n </button>\n </div>\n </div>\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n <button\n class=\"button_dialpad_digit button_call_green\"\n (click)=\"makeCall()\"\n [disabled]=\"!this.dialForm.valid\"\n [ngClass]=\"{ button_call_disabled: !this.dialForm.valid }\"\n >\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path\n fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\"\n />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n OnInit,\n} from '@angular/core';\n\n@Component({\n selector: 'app-device-selector',\n templateUrl: './device-selector.component.html',\n styleUrls: ['./device-selector.component.css'],\n standalone: false,\n})\nexport class DeviceSelectorComponent implements OnInit, OnDestroy {\n @Input() selectedAudioInputId?: string;\n @Input() selectedAudioOutputId?: string;\n\n @Output() change = new EventEmitter<{\n audioInputId: string;\n audioOutputId: string;\n videoInputId?: string;\n }>();\n\n audioInputs: MediaDeviceInfo[] = [];\n audioOutputs: MediaDeviceInfo[] = [];\n\n ngOnInit(): void {\n if (navigator?.mediaDevices) {\n navigator.mediaDevices.addEventListener(\n 'devicechange',\n this.handleDeviceChange\n );\n this.refreshDeviceList();\n } else {\n console.warn('MediaDevices API not supported');\n }\n }\n\n ngOnDestroy(): void {\n navigator.mediaDevices.removeEventListener(\n 'devicechange',\n this.handleDeviceChange\n );\n }\n\n private handleDeviceChange = async (): Promise<void> => {\n await this.refreshDeviceList();\n };\n\n private async refreshDeviceList(): Promise<void> {\n const devices = await navigator.mediaDevices.enumerateDevices();\n this.audioInputs = devices.filter((d) => d.kind === 'audioinput');\n this.audioOutputs = devices.filter((d) => d.kind === 'audiooutput');\n\n // Fallback to first device if previous selection is no longer available\n if (\n !this.audioInputs.some((d) => d.deviceId === this.selectedAudioInputId)\n ) {\n this.selectedAudioInputId = this.audioInputs[0]?.deviceId ?? '';\n }\n\n if (\n !this.audioOutputs.some((d) => d.deviceId === this.selectedAudioOutputId)\n ) {\n this.selectedAudioOutputId = this.audioOutputs[0]?.deviceId ?? '';\n }\n\n this.emitDeviceChange();\n }\n\n onMicChange(deviceId: string | undefined): void {\n this.selectedAudioInputId = deviceId;\n this.emitDeviceChange();\n }\n\n onSpeakerChange(deviceId: string | undefined): void {\n this.selectedAudioOutputId = deviceId;\n this.emitDeviceChange();\n }\n\n private emitDeviceChange(): void {\n this.change.emit({\n audioInputId: this.selectedAudioInputId ?? '',\n audioOutputId: this.selectedAudioOutputId ?? '',\n videoInputId: undefined,\n });\n }\n\n trackByDeviceId(index: number, device: MediaDeviceInfo): string {\n return device.deviceId;\n }\n}\n","<div class=\"sd_container_device_selector\">\n <h2 class=\"sd_tab_heading\">Preferences</h2>\n\n <div class=\"sd_tab_content\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"sd_tab_pd_sd\">\n <h3>Audio settings</h3>\n\n <div class=\"sd_container_selector_item\">\n <label for=\"audioInputSelect\">\n Microphone<br />\n <p>The device used to capture your voice</p>\n </label>\n\n <div class=\"sd_container_item_input\">\n <div class=\"sd_container_item_icon\">\n <svg width=\"14px\" viewBox=\"0 0 384 512\">\n <path\n d=\"M192 0C139 0 96 43 96 96l0 160c0 53 43 96 96 96s96-43 96-96l0-160c0-53-43-96-96-96zM64 216c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l144 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6c85.8-11.7 152-85.3 152-174.4l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 70.7-57.3 128-128 128S64 326.7 64 256l0-40z\"\n />\n </svg>\n </div>\n\n <select\n id=\"audioInputSelect\"\n [(ngModel)]=\"selectedAudioInputId\"\n (change)=\"onMicChange(selectedAudioInputId)\"\n >\n @for (mic of audioInputs; track mic.deviceId; let i = $index) {\n <option [value]=\"mic.deviceId\">\n {{ mic.label || \"Microphone \" + (i + 1) }}\n </option>\n } @empty {\n <option disabled>No microphones found</option>\n }\n </select>\n </div>\n </div>\n\n <div class=\"sd_container_selector_item\">\n <label for=\"audioOutputSelect\">\n Speakers<br />\n <p>The device that rings when you get a call.</p>\n </label>\n\n <div class=\"sd_container_item_input\">\n <div class=\"sd_container_item_icon\">\n <svg width=\"21px\" viewBox=\"0 0 576 512\">\n <path\n d=\"M333.1 34.8C344.6 40 352 51.4 352 64l0 384c0 12.6-7.4 24-18.9 29.2s-25 3.1-34.4-5.3L163.8 352 96 352c-35.3 0-64-28.7-64-64l0-64c0-35.3 28.7-64 64-64l67.8 0L298.7 40.1c9.4-8.4 22.9-10.4 34.4-5.3zm172 72.2c43.2 35.2 70.9 88.9 70.9 149s-27.7 113.8-70.9 149c-10.3 8.4-25.4 6.8-33.8-3.5s-6.8-25.4 3.5-33.8C507.3 341.3 528 301.1 528 256s-20.7-85.3-53.2-111.8c-10.3-8.4-11.8-23.5-3.5-33.8s23.5-11.8 33.8-3.5zm-60.5 74.5C466.1 199.1 480 225.9 480 256s-13.9 56.9-35.4 74.5c-10.3 8.4-25.4 6.8-33.8-3.5s-6.8-25.4 3.5-33.8C425.1 284.4 432 271 432 256s-6.9-28.4-17.7-37.3c-10.3-8.4-11.8-23.5-3.5-33.8s23.5-11.8 33.8-3.5z\"\n />\n </svg>\n </div>\n\n <select\n id=\"audioOutputSelect\"\n [(ngModel)]=\"selectedAudioOutputId\"\n (change)=\"onSpeakerChange(selectedAudioOutputId)\"\n >\n @for (spk of audioOutputs; track spk.deviceId; let i = $index) {\n <option [value]=\"spk.deviceId\">\n {{ spk.label || \"Speaker \" + (i + 1) }}\n </option>\n } @empty {\n <option disabled>No speakers found</option>\n }\n </select>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { AfterViewInit, OnDestroy, OnInit } from '@angular/core';\nimport { ChangeDetectorRef, NgZone } from '@angular/core';\nimport { trigger, transition, style, animate } from '@angular/animations';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, filter, lastValueFrom, Subscription } from 'rxjs';\n\nimport { ActiveCall } from './models/active-call.model';\nimport { RecordingManagerService } from './services/recording-manager.service';\nimport {\n AvayaIPOService,\n CallState,\n LoginState,\n RemoteMedia,\n} from './services/avaya-ipo.service';\nimport { CallSocketService } from './services/call-session-socket.service';\nimport { CountryService } from './services/country.service';\nimport { PhoneNumberLookupService } from './services/phone-number-lookup.service';\nimport { SnugdeskAuthenticationService, TenantService, UserService, Tenant, User } from '@snugdesk/core';\n@Component({\n selector: 'snugdesk-avaya-ipo-widget',\n templateUrl: './avaya-ipo-widget.component.html',\n styleUrls: ['./avaya-ipo-widget.component.css'],\n animations: [\n trigger('slideInOut', [\n transition(':enter', [\n style({ transform: 'translateX(100%)', opacity: 0 }),\n animate(\n '300ms ease-in',\n style({ transform: 'translateX(0)', opacity: 1 })\n ),\n ]),\n transition(':leave', [\n animate(\n '300ms ease-out',\n style({ transform: 'translateX(-100%)', opacity: 0 })\n ),\n ]),\n ]),\n ],\n standalone: false,\n})\nexport class AvayaIPOWidgetComponent\n implements OnInit, AfterViewInit, OnDestroy {\n @Input('tenantId')\n tenantId!: string;\n\n @Input('userId')\n userId!: string;\n\n @Input('isVisible')\n isVisible!: boolean;\n\n @Input('containerHeightObservable')\n containerHeightObservable!: BehaviorSubject<number>;\n\n @Input('containerWidthObservable')\n containerWidthObservable!: BehaviorSubject<number>;\n\n @Output()\n notificationEvent: EventEmitter<number> = new EventEmitter<number>();\n\n isRecording: boolean = false;\n\n loginForm: FormGroup;\n transferForm: FormGroup;\n dtmfForm: FormGroup;\n\n isRinging: boolean = false;\n showActiveCall: boolean = false;\n private loginSubscription!: Subscription;\n private incomingCallSubscription!: Subscription;\n\n callDuration: number = 0;\n private timer: any;\n\n isCalling = false;\n lookupPhoneNumber: any | null = null;\n\n private ringtone!: HTMLAudioElement;\n\n isReconnectingInProgress: boolean = false;\n isFailoverInProgress: boolean = false;\n isFailbackInProgress: boolean = false;\n\n showLoginForm: boolean = false;\n showLoginPassword: boolean = false;\n showLoginLoader: boolean = false;\n hasAvayaSocketError: boolean = false;\n hasAvayaLoginError: boolean = false;\n hasAvayaLoginConflictError: boolean = false;\n hasAvayaDeviceError: boolean = false;\n\n callStateSubscription!: Subscription;\n isMuted: boolean = false;\n isOnHold: boolean = false;\n isactiveCall: boolean = false;\n phoneNumber: string = '';\n isDailpadOpen = false;\n isCallTransferOpen = false;\n activeTab = 'tab1';\n contacts: any[] = [];\n searchText: string = '';\n extensionNumber: string = '';\n isDirectoryOpen = false;\n istransfer = false;\n rating = 4; // TODO: Remove thiss\n isConfereceList = false;\n conferenceParticipants: any[] | undefined;\n /* conferenceParticipants = [\n { name: 'Pankaj Kumar Singh', duration: '00:10' },\n { name: 'Saurabh Mehta', duration: '00:10' },\n { name: 'Rajat Verma', duration: '00:10' }\n ]; */\n currentView = 'transferListpage';\n\n redialTimeout: any;\n showCallDisconnected = false;\n lastDisconnectedCall: any = null;\n\n activeCalls: ActiveCall[] = [];\n\n currentActiveCallIndex: number = 0;\n isAddingNewCall: boolean = false;\n isredialling: boolean = false;\n\n wasInbound: boolean = false;\n showHistoryPopup: boolean = false;\n noOfCalls: number = 0;\n isCallingFromContact: boolean = false;\n bottomActiveTab = 'keypad_sd';\n disconnecttriggered: boolean = false;\n\n private lastRemoteStream: MediaStream | null = null;\n private lastLocalStream: MediaStream | null = null;\n showInitLoader: boolean = false;\n tenant!: any;\n user!: any;\n\n internalContacts = [\n { id: 1, name: 'Lovish Snug', phone: '6283675354', role: 'Agent', ext: '8002' },\n { id: 2, name: 'Rakesh Kumar', phone: '(888) 9876549', role: 'Administrator', ext: '3005' },\n { id: 3, name: 'Sohan Singh', phone: '(876) 8800965', role: 'Manager', ext: '3005' },\n { id: 4, name: 'Pardeep Mishra', phone: '(876) 8800965', role: 'Agent', ext: '3005' },\n { id: 5, name: 'Varun Ji', phone: '(876) 8800965', role: 'Manager', ext: '3005' }\n ];\n\n directoryContacts = [\n { id: 101, name: 'Rajeev Kumar Singh', phone: '(654) 9876549', rating: 4 },\n { id: 102, name: 'Amit Sharma', phone: '(987) 6543210', rating: 5 },\n { id: 103, name: 'Sunita Verma', phone: '(765) 4321987', rating: 3 }\n ];\n\n\n private recognition: any;\n transcriptText: string = '';\n\n showTranscriptionPopup = false;\n private recognitionKeepAlive: any;\n transcriptHistory: string[] = [];\n private recognitionActive = false;\n private transcriptSegments: Array<{ ts: number; text: string }> = []; // final lines w/ timestamps\n private transcriptStartedAt = 0;\n private transcriptEndedAt = 0;\n\n autoDownloadSummaryOnEnd = true; // toggle if you want auto-download\n summaryText = '';\n displayCallingNumber: string;\n redialnumber: string;\n public isTransferring = false;\n\n\n constructor(\n private http: HttpClient,\n private cdr: ChangeDetectorRef,\n private zone: NgZone,\n private formBuilder: FormBuilder,\n private countryService: CountryService,\n private phoneNumberLookupService: PhoneNumberLookupService,\n private avayaIPOService: AvayaIPOService,\n private recordingManagerService: RecordingManagerService,\n private callSocket: CallSocketService,\n private authenticationService: SnugdeskAuthenticationService,\n private tenantService: TenantService,\n private userService: UserService,\n ) {\n this.loginForm = this.formBuilder.group({\n ipoExtensionNo: ['', Validators.required],\n ipoPassword: ['', Validators.required],\n });\n\n this.transferForm = this.formBuilder.group({\n target: ['', Validators.required],\n });\n\n this.dtmfForm = this.formBuilder.group({\n dtmf: ['', Validators.required],\n });\n }\n\n async ngOnInit() {\n\n\n if (!('serviceWorker' in navigator)) {\n // Service Worker isn't supported on this browser, disable or hide UI.\n return;\n }\n\n if (!('PushManager' in window)) {\n // Push isn't supported on this browser, disable or hide UI.\n return;\n }\n\n this.loadScript(\n 'https://snugdesk-assets.s3.us-east-1.amazonaws.com/js/awl.min.js'\n ).then(() => {\n this.avayaIPOService.init();\n });\n\n this.showInitLoader = true;\n try {\n if (!this.authenticationService.isAuthenticated()) {\n const res_login = await this.authenticationService.login(\n this.tenantId,\n this.userId\n );\n console.debug('Login response:', res_login);\n }\n\n this.tenant = sessionStorage.getItem('sd-tenant');\n if (!this.tenant) {\n this.tenant = await this.tenantService.getTenantById(this.tenantId);\n console.debug('Fetched tenant:', this.tenant);\n sessionStorage.setItem('sd-tenant', JSON.stringify(this.tenant));\n }\n\n this.user = sessionStorage.getItem('sd-user');\n if (!this.user) {\n this.user = await this.userService.getUserById(this.userId);\n console.debug('Fetched user:', this.user);\n sessionStorage.setItem('sd-user', JSON.stringify(this.user));\n }\n }\n catch (error) {\n console.error(error);\n // this.hasInitConfigurationErrors = true;\n // this.snackBar.open(\n // `Oops! WhatsApp settings unavailable or invalid configuration detected`,\n // 'Close',\n // {\n // duration: 5000,\n // panelClass: ['snackbar-error'],\n // horizontalPosition: 'center',\n // verticalPosition: 'top',\n // }\n // );\n } finally {\n // Select the first WhatsApp phone number by default\n this.showInitLoader = false;\n this.cdr.detectChanges();\n }\n return;\n }\n\n loadScript(src: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = src;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject();\n document.body.appendChild(script);\n });\n }\n\n ngAfterViewInit(): void {\n this.loginSubscription = this.avayaIPOService.loginStatus$.subscribe(\n async (response: any) => {\n this.zone.run(async () => {\n console.debug('Got Avaya IPO Login response: ', response);\n\n if (!response) {\n this.showLoginForm = true;\n this.cdr.detectChanges();\n // this.hasAvayaDeviceError = true;\n return;\n }\n\n this.showLoginLoader = false;\n\n switch (response.result) {\n case LoginState.LOGIN_SUCCESS:\n console.debug('Login successful:', response);\n this.showLoginForm = false;\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginConflictError = false;\n this.avayaIPOService.agentIdle();\n await this.avayaIPOService.initLocalMic();\n await this.fetchContacts();\n // await this.loadCallHistory();\n break;\n\n case LoginState.LOGGEDOUT:\n this.loginForm.reset();\n this.showLoginForm = true;\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginConflictError = false;\n this.hasAvayaDeviceError = false;\n this.hasAvayaSocketError = false;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.LOGIN_EMPTYUSERNAME:\n case LoginState.LOGIN_EMPTYPASSWORD:\n this.showLoginForm = true;\n this.hasAvayaLoginError = true;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.LOGIN_FAILED:\n this.showLoginForm = true;\n if (response.reason === 'Invalid Credentials') {\n this.hasAvayaLoginError = true;\n } else this.hasAvayaLoginConflictError = true;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.LOGIN_GW_NOTCONFIGURED:\n case LoginState.WEBSOCKET_FAILURE:\n this.showLoginForm = true;\n this.hasAvayaSocketError = true;\n // this.loginForm.disable();\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.DEVICEACCESS_FAILURE:\n this.showLoginForm = true;\n this.hasAvayaDeviceError = true;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.RECONNECTING:\n this.isReconnectingInProgress = true;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.RELOGGED_IN:\n this.isReconnectingInProgress = false;\n this.avayaIPOService.agentIdle();\n break;\n\n case LoginState.FAILING_OVER:\n this.isFailoverInProgress = true;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.FAILOVER_SUCCESS:\n this.isFailoverInProgress = false;\n this.avayaIPOService.agentIdle();\n break;\n\n case LoginState.FAILOVER_FAILED:\n this.isFailoverInProgress = false;\n this.showLoginForm = true;\n this.hasAvayaSocketError = true;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.FAILING_BACK:\n this.isFailbackInProgress = true;\n this.avayaIPOService.agentBusy();\n break;\n\n case LoginState.FAILBACK_SUCCESS:\n this.isFailbackInProgress = false;\n this.avayaIPOService.agentIdle();\n break;\n\n case LoginState.FAILBACK_FAILED:\n this.isFailbackInProgress = false;\n this.showLoginForm = true;\n this.hasAvayaSocketError = true;\n this.avayaIPOService.agentBusy();\n break;\n\n default:\n console.warn('Unhandled Avaya IPO Login state:', response.result);\n }\n\n this.cdr.detectChanges();\n });\n }\n );\n\n this.avayaIPOService.remoteStream$\n .pipe(\n filter(\n (r): r is RemoteMedia => !!r && r.stream.getAudioTracks().length > 0\n )\n )\n .subscribe((r) => {\n this.lastRemoteStream = r.stream;\n this.lastLocalStream = this.avayaIPOService.localStream!;\n });\n\n this.callStateSubscription =\n this.avayaIPOService.callStateSubject.subscribe((evt) => {\n this.zone.run(() => {\n // 1) early‐exit on null/undefined\n if (!evt || !evt.callId) {\n console.debug('ignoring empty callState event', evt);\n return;\n }\n\n // 2) now it’s safe to destructure\n const { state, callId } = evt;\n\n const idx = this.activeCalls.findIndex((c) => c.callId === callId);\n if (idx === -1) {\n console.warn('Event for unknown call', { state, callId });\n return;\n }\n\n console.log('Call stateeeeeeeeeee', state);\n switch (state) {\n case CallState.CONNECTED:\n this.currentActiveCallIndex = idx;\n this.avayaIPOService.agentBusy();\n this.handleCallConnect();\n this.cdr.detectChanges();\n break;\n\n case CallState.DISCONNECTED:\n console.log(this.disconnecttriggered);\n this.avayaIPOService.agentIdle();\n if (!this.disconnecttriggered) {\n this.lastRemoteStream = null;\n this.lastLocalStream = null;\n this.handleCallDisconnect(idx, 'CALLER');\n }\n this.showActiveCall = false;\n this.bottomActiveTab = 'keypad_sd';\n this.avayaIPOService.activeCallId = null;\n this.isactiveCall = false;\n break;\n case CallState.INCOMING:\n console.log(this.disconnecttriggered);\n this.avayaIPOService.agentIdle();\n if (!this.disconnecttriggered) {\n this.lastRemoteStream = null;\n this.lastLocalStream = null;\n this.handleCallDisconnect(idx, 'AGENT');\n }\n this.showActiveCall = false;\n this.bottomActiveTab = 'keypad_sd';\n this.avayaIPOService.activeCallId = null;\n this.isactiveCall = false;\n\n break;\n\n case CallState.HELD:\n this.recordingManagerService.stopRecording(callId);\n this.lastRemoteStream = null;\n this.lastLocalStream = null;\n console.log('**************** HOLD HOLD HOLD *****************');\n break;\n\n case CallState.PROGRESSING:\n this.currentActiveCallIndex = idx;\n this.showActiveCall = true;\n break;\n\n default:\n console.warn('Unhandled call state:', state, 'idx=', idx);\n }\n\n this.cdr.detectChanges();\n });\n });\n\n this.incomingCallSubscription = this.avayaIPOService.incomingCallSubject\n .pipe(filter((evt) => !!evt && typeof evt.callId === 'string'))\n .subscribe(async (evt) => {\n this.zone.run(async () => {\n const { callId, farEndNumber } = evt;\n console.log('📞 Incoming call!', callId, farEndNumber);\n\n // TODO: rename displayInfo to this.lookupPhoneNumber\n const displayInfo = await this.getLookupPhoneNumber(farEndNumber);\n console.log(displayInfo);\n\n const slot = this.avayaIPOService.getSlotForCallId(callId);\n if (!slot) {\n console.warn('Couldn’t find slot for incoming callId', callId);\n return;\n }\n\n this.activeCalls.push({\n callId,\n phoneNumber: displayInfo.lookupPhoneNumber?.[\n 'local-number'\n ].replace(/\\s+/g, ''),\n lookupPhoneNumber: displayInfo,\n duration: 0,\n isMuted: false,\n isOnHold: false,\n startTime: Date.now(),\n slot,\n });\n\n this.phoneNumber = displayInfo.lookupPhoneNumber?.[\n 'local-number'\n ].replace(/\\s+/g, '');\n this.currentActiveCallIndex = this.activeCalls.length - 1;\n this.isactiveCall = true;\n this.wasInbound = true;\n // Ensure UI is on dialpad tab and active-call view when ringing\n this.bottomActiveTab = 'keypad_sd';\n this.showActiveCall = true;\n\n this.cdr.detectChanges();\n });\n });\n }\n\n ngOnDestroy(): void {\n this.loginSubscription?.unsubscribe();\n this.incomingCallSubscription?.unsubscribe();\n this.callStateSubscription?.unsubscribe();\n\n // this.clearTimer(); todo\n }\n\n // prettier-ignore\n async getLookupPhoneNumber(phoneNumber: string): Promise<any> {\n if (!phoneNumber || typeof phoneNumber !== 'string') {\n console.warn('lookupPhoneNumber called with an invalid phoneNumber: ', phoneNumber);\n return {\n phoneNumber: '',\n };\n }\n\n let normalizedPhoneNumber = phoneNumber.trim();\n if (normalizedPhoneNumber.startsWith('00')) {\n normalizedPhoneNumber = '+' + normalizedPhoneNumber.substring(2);\n }\n\n try {\n const res_lookupPhoneNumber: any = await this.phoneNumberLookupService.lookupPhoneNumber(normalizedPhoneNumber);\n\n if (!res_lookupPhoneNumber?.data?.valid) {\n throw new Error('Invalid res_lookupPhoneNumber: ', res_lookupPhoneNumber);\n }\n\n const countryCode = res_lookupPhoneNumber?.data\n ? res_lookupPhoneNumber.data['country-code']\n : null;\n const res_getCountryFromCountryCode = countryCode\n ? await this.countryService.getCountryFromCountryCode(countryCode)\n : null;\n // console.debug('res_getCountryFromCountryCode:', res_getCountryFromCountryCode);\n return {\n normalizedPhoneNumber: normalizedPhoneNumber,\n lookupPhoneNumber: res_lookupPhoneNumber?.data,\n country: res_getCountryFromCountryCode,\n };\n } catch (err) {\n console.warn(`Error looking up phone number ${phoneNumber}: `, err);\n return {\n normalizedPhoneNumber: normalizedPhoneNumber,\n };\n }\n }\n\n onLogin(): void {\n this.loginForm.markAllAsTouched();\n this.hasAvayaLoginError = false;\n this.hasAvayaDeviceError = false;\n this.hasAvayaSocketError = false;\n\n if (this.loginForm.invalid) {\n console.warn(`Invalid form data`);\n return;\n }\n\n this.showLoginLoader = true;\n const { ipoExtensionNo, ipoPassword } = this.loginForm.value;\n this.extensionNumber = ipoExtensionNo;\n try {\n this.avayaIPOService.logIn(ipoExtensionNo, ipoPassword);\n } catch (err) {\n console.error(err);\n this.showLoginLoader = false;\n }\n }\n\n onLogout(): void {\n this.avayaIPOService.logOut();\n }\n\n async makeCall(phoneNumber: string): Promise<void> {\n this.redialnumber = phoneNumber\n console.log('phone number passed', phoneNumber);\n this.isCalling = true;\n this.displayCallingNumber = phoneNumber;\n this.showActiveCall = true;\n this.cdr.detectChanges();\n\n if (!phoneNumber) {\n alert('Please enter a number to call.');\n this.isCalling = false;\n return;\n }\n\n const initPhoneNumber = phoneNumber.replace(/\\s+/g, '');\n\n this.lookupPhoneNumber = await this.getLookupPhoneNumber(phoneNumber);\n console.log('lookupPhoneNumber: ', this.lookupPhoneNumber);\n\n this.phoneNumber = this.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']?.replace(/\\s+/g, '');\n console.log('this.phoneNumber: ', this.phoneNumber);\n\n // hold the existing call if any\n if (this.activeCalls.length > 0) {\n const currentCall = this.activeCalls[this.currentActiveCallIndex];\n currentCall.isOnHold = true;\n this.avayaIPOService.doHold();\n }\n\n // don't duplicate the same number\n const alreadyExists = this.activeCalls.some((c) => c.phoneNumber === phoneNumber);\n if (alreadyExists) {\n console.warn('Call already in progress for this number.');\n this.isCalling = false;\n return;\n }\n\n const dataToSend = '*************custom data in sdp*************';\n\n try {\n // 🔴 FIX: await the Promise returned by the service\n const slot = await this.avayaIPOService.makeCallWithCustomData(this.phoneNumber, dataToSend);\n\n if (!slot) {\n console.warn('Could not place call: no free slot or call failed to start.');\n this.isCalling = false;\n return;\n }\n\n this.activeCalls.push({\n callId: this.avayaIPOService.activeCallId!,\n phoneNumber,\n lookupPhoneNumber: this.lookupPhoneNumber,\n duration: 0,\n isMuted: false,\n isOnHold: false,\n startTime: Date.now(),\n slot, // ✅ now a \"1\" | \"2\" | \"3\" value, not a Promise\n });\n\n this.currentActiveCallIndex = this.activeCalls.length - 1;\n this.noOfCalls = this.activeCalls.length;\n\n // Log call initiation so the same IDs are present before connect/disconnect logs\n const callId = this.avayaIPOService.activeCallId!;\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.extensionNumber,\n callId,\n phoneNumber: this.lookupPhoneNumber ?? phoneNumber,\n direction: 'outbound',\n duration: 0,\n status: 'initiated',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (initiated) failed', err),\n });\n\n this.avayaIPOService.agentBusy();\n this.isCallingFromContact = false;\n this.isAddingNewCall = false;\n } catch (err) {\n console.error('Failed to start call:', err);\n this.isCalling = false;\n }\n }\n\n\n async makeCallFromContact(phoneNumber: string): Promise<void> {\n this.isCallingFromContact = true;\n this.makeCall(phoneNumber);\n }\n\n async cancelCall(): Promise<void> {\n // Mirror manual disconnect button behavior\n this.disconnecttriggered = true;\n this.avayaIPOService.agentIdle();\n await this.dropCurrentCall();\n }\n\n public async dropCurrentCall(): Promise<void> {\n console.log('***************dropping call button triggered******************');\n this.disconnecttriggered = true;\n console.log(\n 'Cancelling active call. Active calls before:',\n this.activeCalls\n );\n console.log('Current active call index:', this.currentActiveCallIndex);\n\n const index = this.currentActiveCallIndex;\n\n if (index < 0 || index >= this.activeCalls.length) {\n console.warn('Active call index out of range:', index);\n return;\n }\n\n const activeCall = this.activeCalls[index];\n const targetSlot = activeCall.slot;\n if (!targetSlot) {\n console.warn(\n 'Active call at index',\n index,\n 'does not have a valid slot.'\n );\n return;\n }\n console.log(\n `Dropping active call from slot ${targetSlot} (index ${index}).`\n );\n\n await this.avayaIPOService.dropCallBySlot(targetSlot);\n\n // Log the manual drop so it shares the same IDs as other call logs\n const dropLog = {\n tenantId: this.tenantId,\n agentId: this.extensionNumber,\n callId: activeCall.callId,\n phoneNumber: activeCall.lookupPhoneNumber ?? activeCall.phoneNumber,\n duration: activeCall.duration,\n status: 'disconnected',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n disconnectSide: 'AGENT',\n };\n this.avayaIPOService.logCall(dropLog).subscribe({\n error: (err) => console.error('logCall (dropCurrentCall) failed', err),\n });\n\n this.handleCallDisconnect(index, 'CALLER');\n // Force UI back to dialpad after manual drop\n this.zone.run(() => {\n this.showActiveCall = this.activeCalls.length > 0;\n if (!this.showActiveCall) {\n this.bottomActiveTab = 'keypad_sd';\n this.avayaIPOService.activeCallId = null;\n }\n this.cdr.detectChanges();\n });\n }\n\n onMute(): void {\n try {\n this.avayaIPOService.doMute();\n this.isMuted = !this.isMuted;\n } catch {\n console.log(\"couldn't mute\");\n }\n }\n\n onUnmute(): void {\n try {\n this.avayaIPOService.doUnMute();\n this.isMuted = !this.isMuted;\n } catch {\n console.log(\"couldn't unmute\");\n }\n }\n\n toggleHold(): void {\n if (!this.activeCalls[this.currentActiveCallIndex]) return;\n\n if (this.activeCalls[this.currentActiveCallIndex].isOnHold) {\n this.avayaIPOService.doUnHold();\n this.activeCalls[this.currentActiveCallIndex].isOnHold = false;\n } else {\n this.avayaIPOService.doHold();\n this.activeCalls[this.currentActiveCallIndex].isOnHold = true;\n }\n }\n\n toggleMute(): void {\n if (!this.activeCalls[this.currentActiveCallIndex]) return;\n\n if (this.activeCalls[this.currentActiveCallIndex].isMuted) {\n this.avayaIPOService.doUnMute();\n this.activeCalls[this.currentActiveCallIndex].isMuted = false;\n } else {\n this.avayaIPOService.doMute();\n this.activeCalls[this.currentActiveCallIndex].isMuted = true;\n }\n }\n\n onPauseVideo(): void {\n this.avayaIPOService.pauseVideo();\n }\n\n onResumeVideo(): void {\n this.avayaIPOService.playVideo();\n }\n\n onDigitClick(digit: string): void {\n const currentValue = this.transferForm.get('target')?.value || '';\n this.transferForm.patchValue({ target: currentValue + digit });\n }\n\n onBackspace(): void {\n const currentValue = this.transferForm.get('target')?.value || '';\n if (currentValue.length > 0) {\n this.transferForm.patchValue({ target: currentValue.slice(0, -1) });\n }\n }\n\n onTransferCall(): void {\n this.istransfer = true;\n\n if (this.transferForm.valid) {\n const { target } = this.transferForm.value;\n console.log('Transfer Target:', target);\n\n const type = 'unAttended';\n this.avayaIPOService.transferCall(target, type);\n } else {\n console.error('Transfer form is invalid.');\n }\n }\n\n onSendDTMF(digit: string | number): void {\n this.avayaIPOService.sendDTMF(digit);\n const currentValue = this.dtmfForm.get('dtmf')?.value || '';\n this.dtmfForm.patchValue({ dtmf: currentValue + digit });\n }\n\n onAnswerCall(): void {\n this.avayaIPOService.answerCall();\n this.isRinging = false;\n // this.stopRingtone();\n this.showActiveCall = true;\n }\n\n onAddVideo(): void {\n this.avayaIPOService.addVideo();\n }\n\n onRemoveVideo(): void {\n this.avayaIPOService.removeVideo();\n }\n\n allowOnlyNumbers(event: Event): void {\n const input = event.target as HTMLInputElement;\n input.value = input.value.replace(/[^0-9]/g, '');\n }\n\n startTimer(index: number) {\n const call = this.activeCalls[index];\n if (!call || call.timer) return;\n\n call.timer = setInterval(() => {\n call.duration++;\n // this.cdr.detectChanges();\n this.cdr.markForCheck();\n }, 1000);\n }\n\n clearTimer(index: number) {\n const call = this.activeCalls[index];\n if (call?.timer) {\n clearInterval(call.timer);\n call.timer = null;\n }\n }\n\n formatTime(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return (\n String(minutes).padStart(2, '0') + ':' + String(seconds).padStart(2, '0')\n );\n }\n\n menuDailpad() {\n this.isDailpadOpen = !this.isDailpadOpen;\n this.cdr.detectChanges();\n }\n\n async selectTab(tab: string) {\n this.activeTab = tab;\n /* if (tab === 'tab1') {\n await this.loadCallHistory();\n } */\n }\n\n async fetchContacts(): Promise<void> {\n const size = 50;\n let start = 0;\n let allContacts: any[] = [];\n\n while (true) {\n const queryString = `q=(and (term field%3Dtenant_id '${this.tenantId}'))&size=${size}&start=${start}&q.parser=structured`;\n\n try {\n const res_searchEntities: any = await this.searchEntities(queryString);\n const hits = res_searchEntities?.hits?.hit;\n\n if (!Array.isArray(hits) || hits.length === 0) {\n break;\n }\n\n allContacts = [...allContacts, ...hits];\n start += size;\n } catch (error) {\n console.error('Error fetching contacts:', error);\n break;\n }\n }\n\n this.contacts = allContacts;\n }\n\n private searchEntities(queryString: string) {\n return lastValueFrom(\n this.http.get('https://search.snugdesk.com/entities?' + queryString)\n );\n }\n\n private handleCallConnect(): void {\n console.log(\"handle call connect ----------------------------\");\n\n const active = this.activeCalls[this.currentActiveCallIndex];\n if (!active) return;\n\n const { callId, phoneNumber } = active;\n const callMetadata = {\n tenantId: this.tenantId,\n agentId: this.extensionNumber,\n callId,\n phoneNumber,\n };\n\n this.callSocket.open(callMetadata);\n // Update UI and call state\n this.startTimer(this.currentActiveCallIndex);\n this.isRinging = false;\n this.isactiveCall = true;\n console.log(\"this.isactiveCall = \", this.isactiveCall);\n this.isCalling = false;\n this.showActiveCall = true;\n\n // Log call as answered/connected so the same ids can be updated later on disconnect\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.extensionNumber,\n callId,\n phoneNumber: active.lookupPhoneNumber ?? active.phoneNumber,\n direction: this.wasInbound ? 'inbound' : 'outbound',\n duration: active.duration,\n status: 'connected',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (connected) failed', err),\n });\n\n this.cdr.detectChanges();\n\n const local = this.lastLocalStream || undefined;\n const remote = this.lastRemoteStream || undefined;\n\n\n\n const hasAudio = (stream?: MediaStream) =>\n stream instanceof MediaStream && stream.getAudioTracks().length > 0;\n\n if (hasAudio(remote) && hasAudio(local)) {\n console.debug(\n `[${callId}] Starting recording with available local & remote streams`\n );\n this.recordingManagerService.startRecording(\n local!,\n remote!,\n callMetadata\n );\n this.initTranscription();\n this.recognition.start();\n this.showTranscriptionPopup = true;\n this.transcriptSegments = [];\n this.transcriptHistory = [];\n this.transcriptText = '';\n this.transcriptStartedAt = Date.now();\n\n return;\n }\n\n console.debug(`[${callId}] Waiting for remote stream...`);\n\n const remoteStreamSubscription = this.avayaIPOService.remoteStream$\n .pipe(\n filter((r): r is RemoteMedia => !!r && r.callId === callId),\n filter((r) => r.stream.getAudioTracks().length > 0)\n )\n .subscribe({\n next: ({ stream: freshRemote }) => {\n const freshLocal = this.avayaIPOService.localStream!;\n\n console.debug(\n `[${callId}] Remote stream received! Starting recording.`\n );\n this.recordingManagerService.startRecording(\n freshLocal!,\n freshRemote!,\n callMetadata\n );\n this.initTranscription();\n this.recognition.start();\n this.showTranscriptionPopup = true;\n this.transcriptSegments = [];\n this.transcriptHistory = [];\n this.transcriptText = '';\n this.transcriptStartedAt = Date.now();\n\n remoteStreamSubscription.unsubscribe(); // stop listening after the first hit\n },\n error: (err) => {\n console.error(`[${callId}] Error receiving remote stream:`, err);\n remoteStreamSubscription.unsubscribe();\n },\n });\n }\n\n private handleCallDisconnect(index: number, disconnectSide: string): void {\n console.log('+++++++++++++++++handle disconnect trigered++++++++++++++');\n this.disconnecttriggered = false;\n this.isAddingNewCall = false;\n this.isCalling = false;\n this.isRecording = false;\n console.log(\n `Disconnecting call at index ${index}. Active calls before:`,\n this.activeCalls\n );\n\n if (index < 0 || index >= this.activeCalls.length) {\n console.warn(\n `Invalid index ${index}, activeCalls.length = ${this.activeCalls.length}`\n );\n return;\n }\n\n const disconnectingCall = this.activeCalls[index];\n\n this.clearTimer(index);\n\n const callId = this.activeCalls[this.currentActiveCallIndex].callId;\n this.recordingManagerService.stopRecording(disconnectingCall.callId);\n console.log('***********stopping recording in disconnect***********');\n\n this.callSocket.close(callId);\n\n // const callData = {\n // tenantId: this.tenantId,\n // agentId: this.extensionNumber,\n // callId: this.avayaIPOService.currentcallId,\n // // phoneNumber: disconnectingCall.phoneNumber,\n // phoneNumber:\n // this.activeCalls[this.currentActiveCallIndex].lookupPhoneNumber,\n // direction: this.wasInbound ? 'inbound' : 'outbound',\n // duration: disconnectingCall.duration,\n // status: 'disconnected',\n // timestamp: new Date().toISOString(),\n // callinginfo: 'calling',\n // };\n\n\n const callData = {\n tenantId: this.tenantId,\n agentId: this.extensionNumber,\n callId: disconnectingCall.callId,\n phoneNumber: disconnectingCall.lookupPhoneNumber,\n direction: this.wasInbound ? 'inbound' : 'outbound',\n duration: disconnectingCall.duration,\n status: 'disconnected',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n disconnectSide: disconnectSide\n };\n\n this.avayaIPOService.logCall(callData).subscribe(\n () => { },\n (err) => console.error(err)\n );\n this.lastDisconnectedCall = {\n ...disconnectingCall,\n };\n this.activeCalls.splice(index, 1);\n console.log('Active calls after removal:', this.activeCalls);\n\n if (index === this.currentActiveCallIndex) {\n if (this.activeCalls.length > 0) {\n this.currentActiveCallIndex = 0;\n const newActive = this.activeCalls[0];\n this.lookupPhoneNumber = newActive.phoneNumber;\n // this.lookupPhoneNumber = newActive.lookupPhoneNumber; TODO to check whats happening here\n this.startTimer(0);\n\n this.isMuted = newActive.isMuted;\n this.isOnHold = false;\n this.showActiveCall = true;\n\n this.isactiveCall = true;\n\n this.avayaIPOService.activeCallId = newActive.callId;\n this.avayaIPOService.doUnHold();\n newActive.isOnHold = false;\n\n for (let i = 1; i < this.activeCalls.length; i++) {\n const other = this.activeCalls[i];\n this.avayaIPOService.activeCallId = other.callId;\n this.avayaIPOService.doHold();\n other.isOnHold = true;\n }\n\n console.log(`Switched active call to slot ${newActive.slot} (index=0)`);\n } else {\n this.showCallDisconnected = true;\n this.isactiveCall = false;\n this.isMuted = false;\n this.isOnHold = false;\n console.log('flag value for isCalling', this.isCalling);\n this.showActiveCall = false; // return to dialpad view when no calls remain\n this.bottomActiveTab = 'keypad_sd';\n this.avayaIPOService.activeCallId = null;\n if (!this.isCalling) {\n this.phoneNumber = '';\n this.lookupPhoneNumber = null;\n }\n this.istransfer = false;\n this.showCallDisconnected = false;\n this.cdr.detectChanges();\n }\n } else if (index < this.currentActiveCallIndex) {\n this.currentActiveCallIndex--;\n }\n\n this.transferForm.reset();\n this.dtmfForm.reset();\n this.isDailpadOpen = false;\n this.isCallTransferOpen = false;\n this.isRinging = false;\n\n setTimeout(() => {\n this.showActiveCall = this.activeCalls.length > 0;\n this.cdr.detectChanges();\n }, 3000);\n\n\n console.log(\n 'handleCallDisconnect() done. new active index =',\n this.currentActiveCallIndex\n );\n console.log('active call div decider ', this.showActiveCall);\n\n\n this.stopTranscription(disconnectingCall.callId);\n }\n\n goToDiv(div: string) {\n this.currentView = div;\n }\n\n restrictNumeric(e: KeyboardEvent): boolean {\n const allowedKeys = [\n 'Enter',\n 'Backspace',\n 'ArrowLeft',\n 'ArrowRight',\n 'Tab',\n 'Delete',\n ];\n return /^[0-9]$/.test(e.key) || allowedKeys.includes(e.key);\n }\n\n onRedial(): void {\n this.isredialling = true;\n if (!this.phoneNumber) {\n console.log('returninggggggg');\n return;\n }\n if (this.redialTimeout) {\n console.log('redialingggggggggggggggg');\n this.istransfer = false;\n this.showCallDisconnected = false;\n clearTimeout(this.redialTimeout);\n this.redialTimeout = null;\n }\n\n this.isCalling = true;\n this.makeCall(this.redialnumber);\n }\n\n public swapLinesToIndex(index: number): void {\n const slotMap = ['1', '2', '3'];\n if (index < 0 || index >= slotMap.length) {\n console.warn('Index out of range for slotMap');\n return;\n }\n\n const targetSlot = slotMap[index] as '1' | '2' | '3';\n\n this.avayaIPOService.swapToSlot(targetSlot);\n this.activeCalls.forEach((call, i) => {\n if (call.slot === targetSlot) {\n call.isOnHold = false;\n this.currentActiveCallIndex = i;\n } else {\n call.isOnHold = true;\n }\n });\n // this.currentActiveCallIndex = index;x\n }\n\n mergeCall() {\n console.log('******************* merging ******************');\n this.avayaIPOService.mergeCall();\n }\n\n onAddCall(): void {\n this.isCallTransferOpen = false;\n this.isAddingNewCall = true;\n // this.dialForm.reset();\n }\n\n public getDisplayStatus(call: any): string {\n if (\n call.direction === 'inbound' &&\n call.status === 'disconnected' &&\n call.duration === 0\n ) {\n return 'Missed';\n }\n\n // If status is \"connected\"\n if (call.status === 'connected') {\n return 'Connected';\n }\n\n // If status is \"disconnected\" but not missed\n if (call.status === 'disconnected') {\n return 'Disconnected';\n }\n\n // Otherwise show the raw status\n return call.status;\n }\n\n bottomSelectTab(tab: string) {\n this.bottomActiveTab = tab;\n }\n\n /** Central place to notify AvayaIPOService about current picks */\n handleDeviceSelection(event: any): void {\n this.avayaIPOService.setDeviceIds({\n defaultId: true,\n audioInputID: event.audioInputId || undefined,\n audioOutputID: event.audioOutputId || undefined,\n videoInputID: event.videoInputId || undefined,\n });\n }\n private createMixedStream(local: MediaStream, remote: MediaStream): MediaStream {\n const audioContext = new AudioContext();\n const destination = audioContext.createMediaStreamDestination();\n\n // Local stream\n if (local) {\n const localSource = audioContext.createMediaStreamSource(local);\n localSource.connect(destination);\n }\n\n // Remote stream\n if (remote) {\n const remoteSource = audioContext.createMediaStreamSource(remote);\n remoteSource.connect(destination);\n }\n\n return destination.stream;\n }\n\n\n private initTranscription() {\n const SpeechRecognition =\n (window as any).SpeechRecognition ||\n (window as any).webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n console.error('Web Speech API is not supported in this browser.');\n return;\n }\n\n this.recognition = new SpeechRecognition();\n this.recognition.lang = 'en-US'; // change as needed\n this.recognition.continuous = true;\n this.recognition.interimResults = true;\n\n this.recognition.onresult = (event: any) => {\n let interimTranscript = '';\n for (let i = event.resultIndex; i < event.results.length; ++i) {\n if (event.results[i].isFinal) {\n const text = event.results[i][0].transcript.trim();\n this.transcriptHistory.push(text);\n\n // ⬇️ ADD: store finals w/ timestamp for summary\n this.transcriptSegments.push({ ts: Date.now(), text });\n\n } else {\n interimTranscript += event.results[i][0].transcript;\n }\n }\n\n this.transcriptText = [...this.transcriptHistory, interimTranscript].join(' ');\n console.log('Live Transcription:', this.transcriptText, this.transcriptHistory);\n this.cdr.detectChanges();\n };\n\n this.recognition.onerror = (event: any) => {\n console.error('Transcription error:', event.error);\n };\n\n this.recognition.onend = () => {\n if (this.showTranscriptionPopup) {\n console.log('Recognition ended, restarting…');\n try {\n this.recognition.start();\n } catch (err) {\n console.warn('Error restarting recognition:', err);\n }\n }\n };\n\n // 👇 Manual keep-alive every 25s\n if (this.recognitionKeepAlive) {\n clearInterval(this.recognitionKeepAlive);\n }\n this.recognitionKeepAlive = setInterval(() => {\n if (this.showTranscriptionPopup && this.recognition) {\n console.log('Force restarting recognition (keep-alive)…');\n try {\n this.recognition.stop(); // will trigger onend → restart\n } catch (err) {\n console.warn('Error stopping recognition:', err);\n }\n }\n }, 10000);\n }\n\n private stopTranscription(callId?: string) {\n // mark end BEFORE clearing anything\n this.transcriptEndedAt = Date.now();\n\n if (this.recognitionKeepAlive) {\n clearInterval(this.recognitionKeepAlive);\n this.recognitionKeepAlive = null;\n }\n if (this.recognition) {\n try {\n this.recognition.onend = null; // prevent auto-restart during teardown\n this.recognition.stop();\n } catch { }\n }\n\n // ⬇️ NEW: build + download markdown summary (if there is content)\n if (this.autoDownloadSummaryOnEnd && this.transcriptSegments.length > 0) {\n this.generateAndDownloadSummary(callId);\n }\n\n // cleanup live state (leave segments cleared after download)\n this.transcriptText = '';\n this.transcriptHistory = [];\n this.transcriptSegments = [];\n this.transcriptStartedAt = 0;\n this.transcriptEndedAt = 0;\n this.showTranscriptionPopup = false;\n }\n\n // Build + download a Markdown summary using lightweight extractive heuristics\n private generateAndDownloadSummary(callId?: string) {\n const fullText = this.transcriptSegments.map(s => s.text).join(' ');\n if (!fullText.trim()) return;\n\n const bullets = this.buildExtractiveSummary(fullText, 5); // 5 highlight bullets\n const actions = this.extractActionItems(fullText);\n const keyInfo = this.extractKeyInfo(fullText);\n\n const mdLines: string[] = [];\n mdLines.push('# Call Summary');\n mdLines.push(`**Call ID:** ${callId ?? '-'}`);\n mdLines.push(`**Agent:** ${this.extensionNumber} `);\n mdLines.push(`**Tenant:** ${this.tenantId}`);\n mdLines.push(`**Start:** ${this.transcriptStartedAt ? new Date(this.transcriptStartedAt).toISOString() : '-'}`);\n mdLines.push(`**End:** ${this.transcriptEndedAt ? new Date(this.transcriptEndedAt).toISOString() : '-'}`);\n const durMs = (this.transcriptStartedAt && this.transcriptEndedAt)\n ? (this.transcriptEndedAt - this.transcriptStartedAt) : 0;\n mdLines.push(`**Duration:** ${this.fmtHMS(durMs)}`);\n mdLines.push('');\n\n mdLines.push('## Highlights');\n if (bullets.length) bullets.forEach(b => mdLines.push(`- ${b}`));\n else mdLines.push('- (no highlights)');\n\n if (actions.length) {\n mdLines.push('', '## Action Items');\n actions.forEach(a => mdLines.push(`- [ ] ${a}`));\n }\n\n if (keyInfo.length) {\n mdLines.push('', '## Key Info');\n keyInfo.forEach(k => mdLines.push(`- ${k}`));\n }\n\n // Optional appendix: full transcript with timestamps\n mdLines.push('', '## Transcript (final lines)');\n for (const seg of this.transcriptSegments) {\n const offset = seg.ts - (this.transcriptStartedAt || seg.ts);\n mdLines.push(`[${this.fmtHMS(offset)}] ${seg.text}`);\n }\n\n const mdBlob = new Blob([mdLines.join('\\n')], { type: 'text/markdown;charset=utf-8' });\n const name = `call-${callId || 'unknown'}-summary.md`;\n this.downloadBlobFile(mdBlob, name);\n\n // store in memory if you also want to show it somewhere\n this.summaryText = mdLines.join('\\n');\n }\n\n // === extractive “enough” summarizer ===\n private buildExtractiveSummary(text: string, maxBullets = 5): string[] {\n const sents = this.splitSentences(text);\n if (sents.length <= maxBullets) return sents;\n\n const stop = new Set(('i,me,my,myself,we,our,ours,ourselves,you,your,yours,' +\n 'he,him,his,she,her,hers,it,its,they,them,their,theirs,what,which,who,whom,' +\n 'this,that,these,those,am,is,are,was,were,be,been,being,have,has,had,do,does,' +\n 'did,doing,a,an,the,and,but,if,or,because,as,until,while,of,at,by,for,with,' +\n 'about,against,between,into,through,during,before,after,above,below,to,from,' +\n 'up,down,in,out,on,off,over,under,again,further,then,once,here,there,when,' +\n 'where,why,how,all,any,both,each,few,more,most,other,some,such,no,nor,not,' +\n 'only,own,same,so,than,too,very,can,will,just,don,should,now').split(','));\n\n const tokenize = (s: string) =>\n s.toLowerCase().replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/).filter(w => w && !stop.has(w));\n\n const freq = new Map<string, number>();\n for (const s of sents) for (const w of tokenize(s)) freq.set(w, (freq.get(w) || 0) + 1);\n\n const scored = sents.map((s, i) => {\n const words = tokenize(s);\n const score = words.reduce((acc, w) => acc + (freq.get(w) || 0), 0) / Math.max(1, words.length);\n return { i, s, score };\n });\n\n return scored\n .sort((a, b) => b.score - a.score)\n .slice(0, maxBullets)\n .sort((a, b) => a.i - b.i)\n .map(x => x.s.trim());\n }\n\n private splitSentences(text: string): string[] {\n return text\n .replace(/\\s+/g, ' ')\n .split(/(?<=[.!?])\\s+(?=[A-Z0-9])/g)\n .map(s => s.trim())\n .filter(Boolean);\n }\n\n private extractActionItems(text: string): string[] {\n const sents = this.splitSentences(text);\n const pat = /(need to|please|send|share|call|schedule|arrange|follow up|email|whatsapp|provide|confirm|deliver|prepare|create|set up|book|assign|remind)/i;\n return sents.filter(s => pat.test(s)).slice(0, 12);\n }\n\n private extractKeyInfo(text: string): string[] {\n const out: string[] = [];\n const phones = text.match(/(?:\\+?\\d[\\s-]?){8,15}\\d/g) || [];\n const emails = text.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi) || [];\n const amounts = text.match(/(?:₹|\\$|INR\\s?)\\s?\\d[\\d,]*(?:\\.\\d+)?/g) || [];\n const dates = text.match(/\\b(?:\\d{1,2}[-/]\\d{1,2}[-/]\\d{2,4}|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-z]*\\s+\\d{1,2}(?:,\\s*\\d{4})?)\\b/gi) || [];\n if (phones.length) out.push(`Phones: ${Array.from(new Set(phones)).join(', ')}`);\n if (emails.length) out.push(`Emails: ${Array.from(new Set(emails)).join(', ')}`);\n if (amounts.length) out.push(`Amounts: ${Array.from(new Set(amounts)).join(', ')}`);\n if (dates.length) out.push(`Dates: ${Array.from(new Set(dates)).join(', ')}`);\n return out;\n }\n\n private downloadBlobFile(blob: Blob, filename: string) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n URL.revokeObjectURL(url);\n }\n\n private fmtHMS(ms: number): string {\n const totalSec = Math.floor(ms / 1000);\n const h = Math.floor(totalSec / 3600);\n const m = Math.floor((totalSec % 3600) / 60);\n const s = totalSec % 60;\n return (h > 0 ? String(h).padStart(2, '0') + ':' : '') +\n String(m).padStart(2, '0') + ':' + String(s).padStart(2, '0');\n }\n\n\n // add this method in the component class\n transferToFromHistory(item: { phoneNumber?: any; lookupPhoneNumber?: any; resolvedDialable?: any }) {\n // prefer a previously-resolved dialable if you store one\n const prefer = (v: any) => (v ?? '').toString().replace(/\\s+/g, '');\n\n let target =\n prefer(item.resolvedDialable) ||\n prefer(item.lookupPhoneNumber?.['local-number']) ||\n prefer(item.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']) ||\n prefer(item.lookupPhoneNumber?.normalizedPhoneNumber) ||\n prefer(item.phoneNumber);\n\n if (!target) {\n console.warn('Transfer aborted: no dialable number found in recent item:', item);\n return;\n }\n\n // IMPORTANT: transfer, not makeCall\n this.avayaIPOService.transferCall(target, 'unAttended'); // or 'Blind'\n this.isCallTransferOpen = false; // close transfer UI if you want\n }\n\n\n\n\n}\n","@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"container_connection_status_overlay\">\n <div class=\"container_connection_status\">\n <i class=\"fa-solid fa-circle-dot\"></i>\n\n @if (isReconnectingInProgress) {\n <span>Reconnecting to the server...</span>\n }\n\n @if (isFailoverInProgress) {\n <span>Failover in progress...</span>\n }\n\n @if (isFailbackInProgress) {\n <span>Failback in progress...</span>\n }\n\n <div class=\"container_connection_status_loader\">\n <div class=\"container_three_dot_loader\">\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n <span class=\"dot\"></span>\n </div>\n </div>\n </div>\n </div>\n}\n\n\n\n@if (showLoginForm) {\n <!-- Login Form -->\n <div class=\"container_avaya_login\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"container_avaya_login_inner\">\n <div class=\"container_avaya_login_content\">\n\n <div class=\"container_avaya_logo\">\n <div class=\"container_avaya_logo_image\"></div>\n <h3>IP Office<span>TM</span></h3>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <div class=\"container_avaya_login_error\">\n <p class=\"message_label error_message\">\n @if (hasAvayaSocketError) {\n We're having trouble connecting to the server\n }\n @if (hasAvayaLoginError) {\n Invalid extension or password!\n }\n @if (hasAvayaLoginConflictError) {\n Another user is logged in with this extension\n }\n @if (hasAvayaDeviceError) {\n We're having trouble accessing your device\n }\n </p>\n </div>\n }\n\n <div class=\"container_avaya_login_form\">\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLogin()\">\n\n <!-- Extension -->\n <div class=\"form_field\">\n <mat-form-field class=\"properties_form_field mat-form-field-outline\">\n <mat-label class=\"mdc-floating-disabled\">Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"ipoExtensionNo\"\n (keypress)=\"restrictNumeric($event)\" />\n\n @if (loginForm.controls['ipoExtensionNo'].invalid && loginForm.controls['ipoExtensionNo'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoExtensionNo'].errors?.['required']) {\n <small>Extension is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- Password -->\n <div class=\"form_field\">\n <mat-form-field class=\"properties_form_field mat-form-field-outline\">\n <mat-label class=\"mdc-floating-disabled\">Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"avaya-ipo-password\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n\n <mat-icon matSuffix (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n @if (showLoginPassword) {\n <span class=\"container_icon_eye\">\n <i class=\"fa-solid fa-eye\"></i>\n </span>\n } @else {\n <span class=\"container_icon_eye\">\n <i class=\"fa-solid fa-eye-slash\"></i>\n </span>\n }\n </mat-icon>\n\n @if (loginForm.controls['ipoPassword'].invalid && loginForm.controls['ipoPassword'].touched) {\n <mat-error>\n @if (loginForm.controls['ipoPassword'].errors?.['required']) {\n <small>Password is required.</small>\n }\n </mat-error>\n }\n </mat-form-field>\n </div>\n\n <!-- Login button -->\n <div class=\"avaya_login_button_area\">\n <button type=\"submit\" class=\"button_submit_login\"\n [ngClass]=\"{ 'button_submit_login_loader': showLoginLoader }\"\n [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) {\n <span class=\"button_submit_loader\"></span>\n } @else {\n <span>Login</span>\n }\n </button>\n </div>\n\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n} @else {\n <!-- Softphone UI -->\n <ng-container *ngTemplateOutlet=\"showSoftphoneDiv\"></ng-container>\n}\n\n<!-- Footer (always visible) -->\n<div class=\"container_avaya_footer\">&copy; 2025 SNUG Technologies Pvt. Ltd.\n\n\n\n</div>\n\n\n\n\n\n<ng-template #showSoftphoneDiv>\n\n@if (!showActiveCall) {\n <div class=\"container_avaya_softphone_inner\">\n <!-- ------------------- Keypad work start ---------- -->\n @if (bottomActiveTab === 'keypad_sd') {\n <div class=\"tab-content_sd\">\n <div class=\"container_dialpad_header\">\n <div class=\"container_dialpad_header_inner2\">\n <div class=\"container_avaya_extension\">\n <div class=\"container_avaya_extension_left\">\n <div class=\"extension_label\">Extension</div>\n <div class=\"extension_number\">{{ extensionNumber }}</div>\n </div>\n <div class=\"container_avaya_extension_right\">\n <button title=\"Sign out\" (click)=\"onLogout()\">\n <svg width=\"16px\" fill=\"currentColor\" viewBox=\"0 0 512 512\">\n <path\n d=\"M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialpad_container_sd\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <app-dialpad [contacts]=\"contacts\" (makeCallEv)=\"makeCall($event)\"></app-dialpad>\n <!-- to do list -->\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- ------------------- Keypad work end ---------- -->\n\n @if (bottomActiveTab === 'recent_sd') {\n <div class=\"tab-content_sd\">\n <app-call-history (makeCallEv)=\"makeCallFromContact($event)\"></app-call-history>\n </div>\n }\n\n @if (bottomActiveTab === 'settings_sd') {\n <div class=\"tab-content_sd\">\n <app-device-selector (change)=\"handleDeviceSelection($event)\"></app-device-selector>\n </div>\n }\n </div>\n\n <div class=\"tabs_sd\">\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('recent_sd')\"\n [class.active]=\"bottomActiveTab === 'recent_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg>\n </span>\n <span class=\"nav_heading_sd\">Recent</span>\n </button>\n\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('keypad_sd')\"\n [class.active]=\"bottomActiveTab === 'keypad_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\"></path>\n </svg>\n </span>\n <span class=\"nav_heading_sd\">Keypad</span>\n </button>\n\n <button class=\"tab_heading_btn\" (click)=\"bottomSelectTab('settings_sd')\"\n [class.active]=\"bottomActiveTab === 'settings_sd'\">\n <span class=\"nav_icon\">\n <svg width=\"19px\" viewBox=\"-0.03 0 16.079 16.079\">\n <g>\n <path fill=\"currentColor\"\n d=\"M8.182 1.083a6.99 6.99 0 0 0-6.248 3.493c-1.929 3.342-.776 7.629 2.57 9.562 3.346 1.934 7.634.792 9.562-2.55 1.929-3.343.776-7.634-2.57-9.567a6.98 6.98 0 0 0-3.314-.938zM8 2.08a6 6 0 0 1 6 6 6 6 0 0 1-6 6 6 6 0 0 1-6-6 6 6 0 0 1 6-6z\" />\n <path fill=\"currentColor\"\n d=\"M9.322 0L6.69.393v1.354a6.49 6.477 43.146 0 1 2.632.005V0zM3.937 1.19L1.93 2.897l.988 1.177a6.49 6.477 43.146 0 1 2.017-1.69zm8.128.013l-.993 1.184a6.49 6.477 43.146 0 1 .17.09 6.49 6.477 43.146 0 1 1.845 1.603l1.006-1.197zM.455 5.42l-.44 2.596 1.515.267a6.49 6.477 43.146 0 1 .455-2.593zm15.086.003l-1.523.269a6.49 6.477 43.146 0 1 .464 2.59l1.533-.27zM1.858 10.118l-1.351.78 1.33 2.271 1.339-.772a6.49 6.477 43.146 0 1-1.317-2.28zm12.301.003a6.49 6.477 43.146 0 1-.534 1.215 6.49 6.477 43.146 0 1-.774 1.069l1.338.773 1.302-2.288zm-9.557 3.471l-.534 1.47 2.48.884.525-1.446a6.49 6.477 43.146 0 1-2.303-.8 6.49 6.477 43.146 0 1-.168-.108zm6.814.016a6.49 6.477 43.146 0 1-2.475.897l.53 1.457 2.468-.917z\" />\n <path fill=\"currentColor\"\n d=\"M7.648 3.093a4.989 4.989 0 0 0-3.982 2.483 5.013 5.013 0 0 0 1.836 6.834 5.002 5.002 0 0 0 6.83-1.827 5.01 5.01 0 0 0-1.836-6.832 4.976 4.976 0 0 0-2.848-.658zM8 4.08a4 4 0 0 1 4 4 4 4 0 0 1-4 4 4 4 0 0 1-4-4 4 4 0 0 1 4-4z\" />\n </g>\n </svg>\n </span>\n <span class=\"nav_heading_sd\">Preferences</span>\n </button>\n </div>\n} @else {\n <ng-container *ngTemplateOutlet=\"showActiveCallDiv\"></ng-container>\n}\n\n\n<!-- ////////////// -->\n\n <!-- Active Call Div -->\n \n <ng-template #showActiveCallDiv>\n\n\n @if (showTranscriptionPopup) {\n <div class=\"transcription-popup\">\n <div class=\"transcription-header\">\n <span>Live Transcription</span>\n <button class=\"close-btn\" (click)=\"showTranscriptionPopup = false\">×</button>\n </div>\n <div class=\"transcription-body\">\n <p>{{ transcriptText }}</p>\n </div>\n </div>\n}\n\n\n\n\n\n\n\n<div class=\"container_call\">\n <div class=\"container_call_header\">\n <div class=\"container_call_header_inner\">\n\n @if (!conferenceParticipants || conferenceParticipants.length <= 1) {\n <!-- ------------ add call list swap and merge area start ---------------- -->\n @if (activeCalls.length > 1) {\n <div class=\"container_swap_merge_list\">\n <div class=\"container_conference_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <div class=\"outer_container_swap_merge\">\n @for (call of activeCalls; track call.phoneNumber; let i = $index) {\n @if (i !== currentActiveCallIndex) {\n <div class=\"container_swap_merge_item\"\n (click)=\"swapLinesToIndex(i)\"\n [ngClass]=\"{ 'active-call': i === currentActiveCallIndex, 'other-call': i !== currentActiveCallIndex }\">\n\n <!-- Avatar -->\n <div class=\"container_recent_item_image\">\n <div class=\"container_swap_merge_item_image_inner\">\n <!-- svg avatar here -->\n </div>\n </div>\n\n <!-- Call Info -->\n <div class=\"container_recent_item_left\">\n <div class=\"container_recent_item_left_inner\">\n <div class=\"contact_field\">{{ call.phoneNumber }}</div>\n @if (call.isOnHold) {\n <div class=\"onhold_st\">On hold</div>\n }\n </div>\n\n <!-- Action Buttons -->\n <div class=\"container_recent_item_right\">\n <div class=\"right_field\">\n <button class=\"button_swap_merge\">\n <div class=\"button_icon\">\n <!-- merge svg -->\n </div>\n <div class=\"button_text\">Merge</div>\n </button>\n </div>\n <div class=\"right_field\">\n <button class=\"button_swap_merge\">\n <div class=\"button_icon\">\n <!-- swap svg -->\n </div>\n <div class=\"button_text\">Swap</div>\n </button>\n </div>\n </div>\n </div>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- ------------ add call list swap and merge area end ---------------- -->\n\n @if (isCalling) {\n <div class=\"container_call_info\">Calling...</div>\n } @else {\n @if (isactiveCall) {\n <div class=\"container_call_info\">\n {{ formatTime(activeCalls[currentActiveCallIndex].duration) }}\n </div>\n }\n @if (showCallDisconnected) {\n <div class=\"container_call_info_blinker\">\n <!-- disconnected svg -->\n {{ this.istransfer ? 'Call Transferred' : 'Call ended' }}\n </div>\n }\n }\n\n <div class=\"container_call_ani\">\n @if (isCalling && displayCallingNumber && activeCalls.length === 0) {\n <!-- show what the user dialed while call is spinning up -->\n <div class=\"container_call_ani_number\">\n {{ displayCallingNumber }}\n </div>} \n @else if (activeCalls.length > 0) {\n <div class=\"container_call_ani_number\">\n {{ activeCalls[currentActiveCallIndex].lookupPhoneNumber.country?.flag }}\n {{ activeCalls[currentActiveCallIndex].phoneNumber }}\n \n </div>\n <div class=\"container_call_ani_name\">\n {{ activeCalls[currentActiveCallIndex].lookupPhoneNumber.phoneNumber?.location }}\n </div>\n } @else {\n <div class=\"container_call_ani_number\">\n {{ lastDisconnectedCall?.lookupPhoneNumber?.country?.flag }}\n {{ lastDisconnectedCall?.phoneNumber }}\n </div>\n <div class=\"container_call_ani_name\">\n {{ lastDisconnectedCall?.lookupPhoneNumber?.phoneNumber?.location }}\n </div>\n }\n\n <div class=\"container_call_ani_image\">\n <div class=\"container_call_ani_image_inner\" [ngClass]=\"{ 'call_animation': isactiveCall }\">\n <!-- big avatar svg -->\n </div>\n </div>\n </div>\n\n } @else {\n <!-- Conference Call Placeholder -->\n <!-- @if block can render conference call template here -->\n }\n\n </div>\n </div>\n\n <div class=\"container_call_content\">\n <div class=\"container_call_dnis\">\n <span>Ext. {{ extensionNumber }}</span>\n </div>\n\n <div class=\"container_call_options\">\n <div class=\"container_dialpad_row margin_bottom_16\">\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall && activeCalls.length < 4 }\"\n (click)=\"onAddCall()\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"> \n <svg fill=\"#000000\" width=\"20\" viewBox=\"0 0 52 52\" enable-background=\"new 0 0 52 52\"\n xml:space=\"preserve\">\n <path fill=\"currentColor\" d=\"M30,29h16.5c0.8,0,1.5-0.7,1.5-1.5v-3c0-0.8-0.7-1.5-1.5-1.5H30c-0.6,0-1-0.4-1-1V5.5C29,4.7,28.3,4,27.5,4\n h-3C23.7,4,23,4.7,23,5.5V22c0,0.6-0.4,1-1,1H5.5C4.7,23,4,23.7,4,24.5v3C4,28.3,4.7,29,5.5,29H22c0.6,0,1,0.4,1,1v16.5\n c0,0.8,0.7,1.5,1.5,1.5h3c0.8,0,1.5-0.7,1.5-1.5V30C29,29.4,29.4,29,30,29z\" />\n </svg>\n </div>\n <div class=\"button_text\">Add</div>\n </button>\n\n @if (activeCalls.length > 0) {\n <button class=\"button_call_option\" (click)=\"onAddCall()\" type=\"button\">\n <div class=\"button_icon\"> <svg width=\"20\" viewBox=\"0 0 52 52\" aria-hidden=\"true\">\n <path fill=\"currentColor\"\n d=\"M30,29h16.5c0.8,0,1.5-0.7,1.5-1.5v-3c0-0.8-0.7-1.5-1.5-1.5H30c-0.6,0-1-0.4-1-1V5.5C29,4.7,28.3,4,27.5,4h-3\n C23.7,4,23,4.7,23,5.5V22c0,0.6-0.4,1-1,1H5.5C4.7,23,4,23.7,4,24.5v3C4,28.3,4.7,29,5.5,29H22c0.6,0,1,0.4,1,1v16.5\n c0,0.8,0.7,1.5,1.5,1.5h3c0.8,0,1.5-0.7,1.5-1.5V30C29,29.4,29.4,29,30,29z\"/>\n </svg></div>\n <div class=\"button_text\">Conference</div>\n </button>\n }\n\n @if (!isRecording) {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"> <svg width=\"22px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path fill=\"currentColor\" d=\"M3 10L3 14M7.5 6L7.5 18M12 3V21M16.5 6V18M21 10V14\" stroke=\"#000000\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n <div class=\"button_text\">Record</div>\n </button>\n } @else {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\">\n <div class=\"button_icon\"><svg width=\"22px\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path fill=\"currentColor\" d=\"M3 10L3 14M7.5 6L7.5 18M12 3V21M16.5 6V18M21 10V14\" stroke=\"#000000\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg></div>\n <div class=\"button_text\">Stop</div>\n </button>\n }\n\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\"\n (click)=\"isCallTransferOpen = !isCallTransferOpen\">\n <div class=\"button_icon\"> <svg width=\"25px\" height=\"25px\" viewBox=\"0 0 48 48\" version=\"1\" enable-background=\"new 0 0 48 48\">\n <path fill=\"currentColor\"\n d=\"M39.2,8.4l-1.8,1.8c-6.3,6.5-5.4,22,0,27.6l1.8,1.8c0.5,0.5,1.3,0.5,1.8,0l3.6-3.7c0.5-0.5,0.5-1.3,0-1.8 l-3.4-3.4h-4.8c-1.3-1.3-1.3-12.1,0-13.4h4.8l3.3-3.4c0.5-0.5,0.5-1.3,0-1.8L41,8.4C40.5,7.9,39.7,7.9,39.2,8.4z\" />\n <path fill=\"currentColor\"\n d=\"M11.2,8.4l-1.8,1.8c-6.3,6.5-5.4,22,0,27.6l1.8,1.8c0.5,0.5,1.3,0.5,1.8,0l3.6-3.7c0.5-0.5,0.5-1.3,0-1.8 l-3.4-3.4H8.5c-1.3-1.3-1.3-12.1,0-13.4h4.8l3.3-3.4c0.5-0.5,0.5-1.3,0-1.8L13,8.4C12.5,7.9,11.7,7.9,11.2,8.4z\" />\n <g fill=\"currentColor\">\n <polygon points=\"25.3,18.6 30.7,24 25.3,29.4\" />\n <rect x=\"16\" y=\"22\" width=\"11\" height=\"4\" />\n </g>\n </svg></div>\n <div class=\"button_text\">Transfer</div>\n </button>\n\n @if (isCallTransferOpen) {\n <ng-container *ngTemplateOutlet=\"callTransferTemplate\"></ng-container>\n }\n </div>\n\n <!-- Mute / Unmute -->\n <div class=\"container_dialpad_row\">\n @if (activeCalls.length > 0 && !this.activeCalls[this.currentActiveCallIndex].isMuted) {\n <button class=\"button_call_option button_elevated\"\n (click)=\"toggleMute()\"\n [ngClass]=\"{ 'button_disabled': showCallDisconnected }\">\n <div class=\"button_icon\"> <svg viewBox=\"0 0 384 512\" width=\"16\">\n <path fill=\"currentColor\"\n d=\"M192 0C139 0 96 43 96 96l0 160c0 53 43 96 96 96s96-43 96-96l0-160c0-53-43-96-96-96zM64 216c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l72 0 72 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6c85.8-11.7 152-85.3 152-174.4l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 70.7-57.3 128-128 128s-128-57.3-128-128l0-40z\" />\n </svg></div>\n <div class=\"button_text\">Mute</div>\n </button>\n } @else if (activeCalls.length > 0 && this.activeCalls[this.currentActiveCallIndex].isMuted) {\n <button class=\"button_call_option button_active button_elevated\" (click)=\"toggleMute()\">\n <div class=\"button_icon\"> <svg width=\"26\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L472.1 344.7c15.2-26 23.9-56.3 23.9-88.7l0-40c0-13.3-10.7-24-24-24s-24 10.7-24 24l0 40c0 21.2-5.1 41.1-14.2 58.7L416 300.8 416 96c0-53-43-96-96-96s-96 43-96 96l0 54.3L38.8 5.1zM344 430.4c20.4-2.8 39.7-9.1 57.3-18.2l-43.1-33.9C346.1 382 333.3 384 320 384c-70.7 0-128-57.3-128-128l0-8.7L144.7 210c-.5 1.9-.7 3.9-.7 6l0 40c0 89.1 66.2 162.7 152 174.4l0 33.6-48 0c-13.3 0-24 10.7-24 24s10.7 24 24 24l72 0 72 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-48 0 0-33.6z\" />\n </svg></div>\n <div class=\"button_text\">Unmute</div>\n </button>\n }\n\n <!-- Hold / Unhold -->\n @if (activeCalls.length > 0 && !this.activeCalls[this.currentActiveCallIndex].isOnHold) {\n <button class=\"button_call_option button_elevated\"\n [ngClass]=\"{ 'button_disabled': !isactiveCall }\"\n [disabled]=\"!isactiveCall\"\n (click)=\"toggleHold()\">\n <div class=\"button_icon\"> <svg viewBox=\"0 0 320 512\" width=\"14\">\n <path fill=\"currentColor\" d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\" />\n </svg></div>\n <div class=\"button_text\">Hold</div>\n </button>\n } @else if (activeCalls.length > 0 && this.activeCalls[this.currentActiveCallIndex].isOnHold) {\n <button class=\"button_call_option button_active button_elevated\" (click)=\"toggleHold()\">\n <div class=\"button_icon\">\n <svg viewBox=\"0 0 320 512\" width=\"14\">\n <path fill=\"currentColor\" d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\" />\n </svg></div>\n <div class=\"button_text\">Unhold</div>\n </button>\n \n }\n\n <!-- Keypad -->\n <button class=\"button_call_option button_elevated\"\n [class.button_active]=\"isDailpadOpen\"\n (click)=\"menuDailpad()\"\n [ngClass]=\"{ 'button_disabled': showCallDisconnected }\">\n <div class=\"button_icon\"> <svg width=\"22px\" height=\"22px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n </svg></div>\n <div class=\"button_text\">{{ isDailpadOpen ? 'Hide' : 'Keypad' }}</div>\n </button>\n\n @if (isDailpadOpen) {\n <div class=\"container_popup_dialpad\">\n <div class=\"container_popup_dialpad_inner\">\n <div [formGroup]=\"dtmfForm\">\n <div class=\"container_dtmf_input\">\n <input type=\"tel\" formControlName=\"dtmf\">\n </div>\n <div class=\"container_dialpad_digits\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('1')\">1</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('2')\">2</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('3')\">3</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('4')\">4</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('5')\">5</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('6')\">6</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('7')\">7</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('8')\">8</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('9')\">9</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path fill=\"currentColor\"\n d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86 102.4l122 70.4L208 32z\" />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('0')\">0</button>\n <button class=\"button_dialpad_digit\" (click)=\"onSendDTMF('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\"\n d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3 36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4 26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1 0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2 384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64 192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Call Control Buttons -->\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n @if (!showCallDisconnected || isCalling) {\n <button class=\"button_dialpad_digit button_call_red\" (click)=\"dropCurrentCall()\">\n <svg width=\"25\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\" />\n </svg>\n </button>\n } @else if (showCallDisconnected && !isCalling) {\n <button class=\"button_dialpad_digit button_call_green\"\n (click)=\"onRedial()\"\n [ngClass]=\"{ 'button_call_disabled': !phoneNumber }\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n }\n </div>\n </div>\n </div>\n</div>\n</ng-template>\n\n\n <!-- ////////////////// -->\n <!-- Conference Call Template -->\n <ng-template #conferenceCallTemplate>\n<div class=\"container_active_call_header\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">Conference call</div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_green\">\n <svg viewBox=\"0 0 512 512\" width=\"12\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </div>\n <div class=\"container_active_call_status_green\">\n with {{ conferenceParticipants?.length }} people\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"container_active_call_options\">\n <div class=\"button_active_call_options button_active_call_options_highlighted\">\n <span (click)=\"isConfereceList = !isConfereceList\" class=\"container_active_call_options_button\">\n <svg viewBox=\"0 0 448 512\" width=\"16px\">\n <path fill=\"currentColor\"\n d=\"M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z\" />\n </svg>\n </span>\n </div>\n </div>\n</div>\n\n<!-- Conference List -->\n@if (isConfereceList) {\n <div class=\"container_conference_contact_list\">\n <div class=\"container_conference_contact_list_inner\">\n <div class=\"scrollbox container_conference_contact_list_scrollbox\">\n <div class=\"scrollbox-content\">\n\n @for (person of conferenceParticipants; track person.id) {\n <div class=\"container_conference_contact_item\">\n <!-- Avatar -->\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"49px\" width=\"49px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n\n <!-- Name and Time -->\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ person.name }}</div>\n <div class=\"contact_field_green\">{{ person.duration }}</div>\n </div>\n </div>\n\n <!-- End Button -->\n <div class=\"container_contact_item_right\">\n <div class=\"right_field\">\n <button class=\"button_disconnect_call\">\n <svg width=\"22\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M11.7 266.3l41.9 94.3c6.1 13.7 20.8 21.3 35.5 18.4l109.2-21.8c15-3 25.7-16.1 25.7-31.4V240c62.3-20.8 129.7-20.8 192 0v85.8c0 15.3 10.8 28.4 25.7 31.4L550.9 379c14.7 2.9 29.4-4.7 35.5-18.4l41.9-94.3c7.2-16.2 5.1-35.1-7.4-47.7C570.8 168.1 464.2 96 320 96S69.2 168.1 19.1 218.6c-12.5 12.6-14.6 31.5-7.4 47.7z\">\n </path>\n </svg>\n </button>\n </div>\n </div>\n </div>\n\n @if (!$last) {\n <div class=\"container_separator\"></div>\n }\n }\n\n </div>\n </div>\n </div>\n </div>\n}\n\n</ng-template>\n\n\n <ng-template #callTransferTemplate>\n <div class=\"container_transfer_call\">\n <div class=\"container_transfer_call_inner\">\n <div class=\"container_button_close\">\n <span (click)=\"isCallTransferOpen = false\" title=\"Close\">\n <i class=\"fa-sharp fa-solid fa-xmark\"></i>\n </span>\n </div>\n\n <!-- First Div -->\n <div class=\"container_transfer_call_content\" @slideInOut>\n @if (currentView === 'transferListpage') {\n <div class=\"container_active_call_duration\">{{ formatTime(callDuration)}}</div>\n\n <div class=\"container_active_call_header margin_bottom_16 shadow_st\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">{{ lookupPhoneNumber?.country?.flag }}\n {{ lookupPhoneNumber?.phoneNumber }}</div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_green\">\n <svg viewBox=\"0 0 512 512\" width=\"12\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </div>\n <div class=\"container_active_call_status_green\">Active call</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">Ext. {{extensionNumber}}</span>\n </div>\n </div>\n </div>\n\n <!-- Tabs -->\n <div class=\"container_transfer_tab_buttons\">\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab1')\" [class.active]=\"activeTab === 'tab1'\">\n <svg width=\"18px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z\" />\n </svg> Recent</button>\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab2')\" [class.active]=\"activeTab === 'tab2'\">\n <svg width=\"20px\" viewBox=\"0 0 24 24\">\n <path fill=\"currentColor\"\n d=\"M15.71,12.71a6,6,0,1,0-7.42,0,10,10,0,0,0-6.22,8.18,1,1,0,0,0,2,.22,8,8,0,0,1,15.9,0,1,1,0,0,0,1,.89h.11a1,1,0,0,0,.88-1.1A10,10,0,0,0,15.71,12.71ZM12,12a4,4,0,1,1,4-4A4,4,0,0,1,12,12Z\" />\n </svg> Internal</button>\n <button class=\"button_transfer_tab\" (click)=\"selectTab('tab3')\" [class.active]=\"activeTab === 'tab3'\">\n <svg width=\"18px\" height=\"18px\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\" d=\"M256,400a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M256,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M384,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,272a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,144a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" />\n <path fill=\"currentColor\" d=\"M128,16a48,48,0,1,0,48,48,48,48,0,0,0-48-48Z\" /></svg>\n Dail</button>\n </div>\n\n <!-- Tab 1 -->\n @if (activeTab === 'tab1') {\n <!-- <div class=\"container_transfer_tab_content\">\n <app-call-history (makeCallEv)=\"makeCallFromContact($event)\"></app-call-history>\n </div> -->\n <div class=\"container_transfer_tab_content\">\n <app-call-history [mode]=\"'transfer'\" (transferEv)=\"transferToFromHistory($event)\"> </app-call-history>\n</div>\n }\n\n <!-- Tab 2 -->\n @if (activeTab === 'tab2') {\n <div class=\"container_transfer_tab_content\">\n <div class=\"container_transfer_internal_search\">\n <input type=\"search\" placeholder=\"Type to search\">\n </div>\n <div class=\"container_transfer_contact_list\">\n <div class=\"container_transfer_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n <!-- Instead of repeating static contacts, render via array -->\n @for (contact of internalContacts; track contact.ext) {\n <div class=\"container_contact_item\" (click)=\"goToDiv('transferDetails'); makeCallFromContact(contact.phone)\">\n <div class=\"container_contact_item_image\">\n <div class=\"container_contact_item_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"49px\" width=\"49px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\">\n </path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 c-0.964-1.144-2.024-2.326-3.184-3.527c-1.741-1.802-3.71-3.646-5.924-5.47c-2.952-2.431-6.339-4.824-10.204-7.026 c-1.877-1.07-3.873-2.092-5.98-3.055c-0.062-0.028-0.118-0.059-0.18-0.087c-9.792-4.44-22.106-7.529-37.416-7.529 s-27.624,3.089-37.416,7.529c-0.338,0.153-0.653,0.318-0.985,0.474c-1.431,0.674-2.806,1.376-4.128,2.101 c-0.716,0.393-1.417,0.792-2.101,1.197c-3.421,2.027-6.475,4.191-9.15,6.395c-2.213,1.823-4.182,3.668-5.924,5.47 c-1.161,1.201-2.22,2.384-3.184,3.527c-0.964,1.144-1.832,2.25-2.609,3.299c-0.778,1.049-1.464,2.04-2.065,2.955 c-0.557,0.848-1.033,1.622-1.447,2.324c-0.033,0.056-0.073,0.119-0.104,0.174c-0.435,0.744-0.79,1.392-1.07,1.926 c-0.559,1.068-0.818,1.678-0.818,1.678v0.398c18.285,17.927,43.322,28.985,70.945,28.985c27.678,0,52.761-11.103,71.055-29.095 v-0.289c0,0-0.619-1.45-1.992-3.778C174.594,173.238,174.117,172.463,173.561,171.615z\">\n </path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 c1.772-0.532,3.482-1.188,5.12-1.958c2.184-1.027,4.242-2.258,6.15-3.67c2.863-2.119,5.39-4.646,7.509-7.509 c0.706-0.954,1.367-1.945,1.98-2.971c0.919-1.539,1.729-3.155,2.422-4.84c0.462-1.123,0.872-2.277,1.226-3.458 c0.177-0.591,0.341-1.188,0.49-1.792c0.299-1.208,0.542-2.443,0.725-3.701c0.275-1.887,0.417-3.827,0.417-5.811 c0-1.984-0.142-3.925-0.417-5.811c-0.184-1.258-0.426-2.493-0.725-3.701c-0.15-0.604-0.313-1.202-0.49-1.793 c-0.354-1.181-0.764-2.335-1.226-3.458c-0.693-1.685-1.504-3.301-2.422-4.84c-0.613-1.026-1.274-2.017-1.98-2.971 c-2.119-2.863-4.646-5.39-7.509-7.509c-1.909-1.412-3.966-2.643-6.15-3.67c-1.638-0.77-3.348-1.426-5.12-1.958 c-1.181-0.355-2.39-0.655-3.624-0.896c-2.468-0.484-5.035-0.737-7.68-0.737c-21.162,0-37.345,16.183-37.345,37.345 C68.657,109.317,84.84,125.5,106.002,125.5z\">\n </path>\n </g>\n </svg>\n </div>\n </div>\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ contact.name }}</div>\n <div class=\"contact_field\">{{ contact.phone }}</div>\n @if (contact.role) {\n <div class=\"contact_field_grey\">\n <div class=\"contact_field_highlighted\"><span>{{ contact.role }}</span></div>\n </div>\n }\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field\">\n <span class=\"right_field_content\">Ext. {{ contact.ext }}</span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Tab 3 -->\n @if (activeTab === 'tab3') {\n <div class=\"container_transfer_tab_content\">\n <form [formGroup]=\"transferForm\">\n <div class=\"container_transfer_contact_list\">\n <div class=\"container_phone_number_input margin_bottom_16\">\n <button class=\"button_phonebook\" (click)=\"isDirectoryOpen = !isDirectoryOpen\">📖</button>\n <input placeholder=\"Phone Number\" type=\"tel\" formControlName=\"target\">\n <button class=\"button_backspace\" (click)=\"onBackspace()\"></button>\n </div>\n\n @if (isDirectoryOpen) {\n <div class=\"container_transfer_internal_contact_list\">\n <div class=\"container_transfer_contact_list_inner\">\n <div class=\"scrollbox\">\n <div class=\"scrollbox-content\">\n @for (directoryContact of directoryContacts; track directoryContact.id) {\n <div class=\"container_contact_item\">\n <div class=\"container_contact_item_left\">\n <div class=\"container_contact_item_left_inner\">\n <div class=\"contact_field\">{{ directoryContact.name }}</div>\n <div class=\"contact_field\">{{ directoryContact.phone }}</div>\n </div>\n </div>\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">\n <div class=\"container_rating\">\n @for (star of [1,2,3,4,5]; track $index) {\n <span [class.filled]=\"star <= directoryContact.rating\">★</span>\n }\n </div>\n </span>\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n <!-- Dialpad -->\n <div class=\"container_dialpad_digits\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('1')\">1</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('2')\">2</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('3')\">3</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('4')\">4</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('5')\">5</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('6')\">6</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('7')\">7</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('8')\">8</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('9')\">9</button>\n </div>\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('*')\">\n <svg viewBox=\"0 0 512 512\" height=\"17px\">\n <path fill=\"currentColor\" d=\"M208 32c0-17.7 14.3-32 32-32l32 0c17.7 0 32 14.3 32 32l0 140.9\n 122-70.4c15.3-8.8 34.9-3.6 43.7 11.7l16 27.7c8.8 15.3 3.6 34.9-11.7\n 43.7L352 256l122 70.4c15.3 8.8 20.6 28.4 11.7 43.7l-16 27.7c-8.8\n 15.3-28.4 20.6-43.7 11.7L304 339.1 304 480c0 17.7-14.3 32-32 32l-32\n 0c-17.7 0-32-14.3-32-32l0-140.9L86 409.6c-15.3 8.8-34.9\n 3.6-43.7-11.7l-16-27.7c-8.8-15.3-3.6-34.9 11.7-43.7L160 256 38\n 185.6c-15.3-8.8-20.5-28.4-11.7-43.7l16-27.7C51.1 98.8 70.7 93.6 86\n 102.4l122 70.4L208 32z\" />\n </svg>\n </button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('0')\">0</button>\n <button class=\"button_dialpad_digit\" (click)=\"onDigitClick('#')\">\n <svg height=\"19px\" viewBox=\"0 0 448 512\">\n <path fill=\"currentColor\" d=\"M181.3 32.4c17.4 2.9 29.2 19.4 26.3\n36.8L197.8 128l95.1 0 11.5-69.3c2.9-17.4 19.4-29.2 36.8-26.3s29.2 19.4\n26.3 36.8L357.8 128l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9\n0L325.8 320l58.2 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-68.9 0-11.5\n69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8l9.8-58.7-95.1\n0-11.5 69.3c-2.9 17.4-19.4 29.2-36.8 26.3s-29.2-19.4-26.3-36.8L90.2\n384 32 384c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 21.3-128L64\n192c-17.7 0-32-14.3-32-32s14.3-32 32-32l68.9 0 11.5-69.3c2.9-17.4\n19.4-29.2 36.8-26.3zM187.1 192L165.8 320l95.1 0 21.3-128-95.1 0z\" />\n </svg></button>\n </div>\n </div>\n\n <div class=\"container_dialpad_buttons\">\n <div class=\"container_dialpad_row\">\n @if (isAddingNewCall) {\n <button class=\"button_dialpad_digit button_call_green\"\n (click)=\"makeCall(transferForm.value.target)\"\n [disabled]=\"!phoneNumber\"\n [ngClass]=\"{ 'button_call_disabled': !phoneNumber }\">\n <svg viewBox=\"0 0 512 512\" height=\"18px\">\n <path fill=\"currentColor\"\n d=\"M164.9 24.6c-7.7-18.6-28-28.5-47.4-23.2l-88 24C12.1 30.2 0 46 0 64C0 311.4 200.6 512 448 512c18 0 33.8-12.1 38.6-29.5l24-88c5.3-19.4-4.6-39.7-23.2-47.4l-96-40c-16.3-6.8-35.2-2.1-46.3 11.6L304.7 368C234.3 334.7 177.3 277.7 144 207.3L193.3 167c13.7-11.2 18.4-30 11.6-46.3l-40-96z\" />\n </svg>\n </button>\n } @else {\n <button type=\"submit\" class=\"button_dialpad_digit button_call_green\" (click)=\"onTransferCall()\"> <svg height=\"20px\" viewBox=\"0 0 52 52\" enable-background=\"new 0 0 52 52\" xml:space=\"preserve\">\n <g>\n <path fill=\"currentColor\" d=\"M48.5,37.9L42.4,33c-1.4-1.1-3.4-1.2-4.8-0.1l-5.2,3.8c-0.6,0.5-1.5,0.4-2.1-0.2l-7.8-7l-7-7.8\n c-0.6-0.6-0.6-1.4-0.2-2.1l3.8-5.2c1.1-1.4,1-3.4-0.1-4.8l-4.9-6.1c-1.5-1.8-4.2-2-5.9-0.3L3,8.4c-0.8,0.8-1.2,1.9-1.2,3\n c0.5,10.2,5.1,19.9,11.9,26.7S30.2,49.5,40.4,50c1.1,0.1,2.2-0.4,3-1.2l5.2-5.2C50.5,42.1,50.4,39.3,48.5,37.9z\" />\n <path fill=\"currentColor\" d=\"M48.4,2H33c-1,0-1.3,1.1-0.5,1.9l4.9,5l-9,9.1c-0.5,0.5-0.5,1.4,0,1.9l3.7,3.7c0.5,0.5,1.3,0.5,1.9,0\n l9.1-9.1l5.1,4.9C48.9,20.3,50,20,50,19V3.7C50,3,49.1,2,48.4,2z\" />\n </g>\n </svg></button>\n }\n </div>\n </div>\n </div>\n </form>\n </div>\n }\n }\n</div>\n\n <!-- Second Div -->\n @if (currentView === 'transferDetails') {\n <div class=\"container_transfer_call_content\" @slideInOut>\n <div class=\"container_active_call_duration\">00:10</div>\n <div class=\"container_active_call_header shadow_st\">\n <div class=\"container_active_call_avatar\">\n <div class=\"container_active_call_avatar_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"45px\" width=\"45px\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 ...\"></path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 ...\"></path>\n </g>\n </svg>\n </div>\n </div>\n\n <div class=\"container_active_call_info\">\n <div class=\"container_active_call_info_inner\">\n <div class=\"container_active_call_number\">\n {{ lookupPhoneNumber?.country?.flag }} {{ lookupPhoneNumber?.phoneNumber }}\n </div>\n <div class=\"container_active_call_details\">\n <div class=\"container_active_call_details_inner\">\n <div class=\"container_active_call_icon_grey\">\n <svg viewBox=\"0 0 320 512\" width=\"12\">\n <path fill=\"currentColor\"\n d=\"M128 64L0 64 0 448l128 0 0-384zm192 0L192 64l0 384 128 0 0-384z\"></path>\n </svg>\n </div>\n <div class=\"container_active_call_status_grey\">On hold</div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"container_contact_item_right\">\n <div class=\"right_field right_field_highlighted\">\n <span class=\"right_field_content\">Ext. {{ extensionNumber }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"container_transfer_call_details\">\n <div class=\"container_call_ani_number padding_top_nt\">+91 (654) 9876549</div>\n <div class=\"container_call_ani_name\">Rajeev kumar singh</div>\n <div class=\"container_call_ani_image\">\n <div class=\"container_call_ani_image_inner\">\n <svg viewBox=\"0 0 212 212\" height=\"85\" width=\"85\" version=\"1.1\" x=\"0px\" y=\"0px\"\n enable-background=\"new 0 0 212 212\">\n <path fill=\"#DFE5E7\"\n d=\"M106.251,0.5C164.653,0.5,212,47.846,212,106.25S164.653,212,106.25,212C47.846,212,0.5,164.654,0.5,106.25 S47.846,0.5,106.251,0.5z\"></path>\n <g>\n <path fill=\"#FFFFFF\"\n d=\"M173.561,171.615c-0.601-0.915-1.287-1.907-2.065-2.955c-0.777-1.049-1.645-2.155-2.608-3.299 ...\"></path>\n <path fill=\"#FFFFFF\"\n d=\"M106.002,125.5c2.645,0,5.212-0.253,7.68-0.737c1.234-0.242,2.443-0.542,3.624-0.896 ...\"></path>\n </g>\n </svg>\n </div>\n </div>\n </div>\n\n <div class=\"container_call_dnis\">\n <span>Ext. {{ extensionNumber }}</span>\n </div>\n\n <div class=\"container_call_options margin_bottom_nt\">\n <div class=\"container_dialpad_row margin_bottom_16\">\n <button class=\"button_call_option\" (click)=\"mergeCall()\">\n <div class=\"button_icon\"><svg width=\"22\" viewBox=\"0 0 512 512\">\n <path fill=\"currentColor\"\n d=\"M32 64C14.3 64 0 78.3 0 96s14.3 32 32 32l97.2 0c9.7 0 18.9 4.4 25 12L247 256 154.2 372c-6.1 7.6-15.3 12-25 12L32 384c-17.7 0-32 14.3-32 32s14.3 32 32 32l97.2 0c29.2 0 56.7-13.3 75-36l99.2-124 80.6 0 0 32c0 12.9 7.8 24.6 19.8 29.6s25.7 2.2 34.9-6.9l64-64c6-6 9.4-14.1 9.4-22.6s-3.4-16.6-9.4-22.6l-64-64c-9.2-9.2-22.9-11.9-34.9-6.9s-19.8 16.6-19.8 29.6l0 32-80.6 0L204.2 100c-18.2-22.8-45.8-36-75-36L32 64z\"></path>\n </svg></div>\n <div class=\"button_text\">Merge</div>\n </button>\n\n <button class=\"button_call_option\">\n <div class=\"button_icon\"> <svg width=\"26px\" viewBox=\"0 0 640 512\">\n <path fill=\"currentColor\"\n d=\"M150.6 73.4c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L96 173.3 96 320c0 53 43 96 96 96l112 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-112 0c-17.7 0-32-14.3-32-32l0-146.7 41.4 41.4c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-96-96zM336 96c-17.7 0-32 14.3-32 32s14.3 32 32 32l112 0c17.7 0 32-14.3 32-32l0 146.7-41.4-41.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L544 338.7 544 192c0-53-43-96-96-96L336 96z\"></path>\n </svg></div>\n <div class=\"button_text\">Swap</div>\n </button>\n\n <button class=\"button_call_option\">\n <div class=\"button_icon\"><svg width=\"19px\" viewBox=\"0 0 52 52\">\n <path fill=\"currentColor\"\n d=\"M48.5,37.9L42.4,33c-1.4-1.1-3.4-1.2-4.8-0.1l-5.2,3.8c-0.6,0.5-1.5,0.4-2.1-0.2l-7.8-7l-7-7.8 c-0.6-0.6-0.6-1.4-0.2-2.1l3.8-5.2c1.1-1.4,1-3.4-0.1-4.8l-4.9-6.1c-1.5-1.8-4.2-2-5.9-0.3L3,8.4c-0.8,0.8-1.2,1.9-1.2,3 c0.5,10.2,5.1,19.9,11.9,26.7S30.2,49.5,40.4,50c1.1,0.1,2.2-0.4,3-1.2l5.2-5.2C50.5,42.1,50.4,39.3,48.5,37.9z\"></path>\n <path fill=\"currentColor\"\n d=\"M48.4,2H33c-1,0-1.3,1.1-0.5,1.9l4.9,5l-9,9.1c-0.5,0.5-0.5,1.4,0,1.9l3.7,3.7c0.5,0.5,1.3,0.5,1.9,0 l9.1-9.1l5.1,4.9C48.9,20.3,50,20,50,19V3.7C50,3,49.1,2,48.4,2z\"></path>\n </svg>\n</div>\n <div class=\"button_text\">Transfer</div>\n </button>\n </div>\n </div>\n\n <div class=\"container_transfer_disconnect\">\n <div class=\"container_dialpad_row\">\n <button class=\"button_dialpad_digit button_call_red\" (click)=\"goToDiv('transferListpage')\">\n <svg width=\"36px\" viewBox=\"0 0 76 76\">\n <path fill=\"currentColor\"\n d=\"M 16.2013,39.582L 15.4175,39.4096L 14.8094,38.9315L 14.4029,38.2193L 14.25,37.364L 14.25,34.9055C 14.25,33.184 14.6023,31.6057 15.3069,30.1704C 16.0116,28.7352 16.9698,27.4788 18.1818,26.4013C 19.3937,25.3237 20.8095,24.4424 22.429,23.7573C 24.0486,23.0722 25.7732,22.6277 27.6031,22.4239L 31.304,22.0792L 34.9918,21.8256L 39.109,21.715L 42.966,21.8451L 46.101,22.0987L 48.9628,22.489C 50.7276,22.7318 52.3883,23.199 53.945,23.8906C 55.5017,24.5822 56.8567,25.4625 58.0101,26.5313C 59.1635,27.6002 60.0752,28.8468 60.7451,30.2712C 61.4151,31.6956 61.75,33.2599 61.75,34.964L 61.75,37.4486L 61.5874,38.2681L 61.1386,38.9511L 60.4785,39.4096L 59.6752,39.582L 51.8897,39.582L 51.0994,39.4096L 50.4588,38.9413L 50.0327,38.2584L 49.8799,37.4226L 49.8799,32.1217L 49.7075,31.1656L 49.2295,30.3818L 48.5075,29.8452C 48.23,29.7108 47.9286,29.6436 47.6034,29.6436L 28.7413,29.6436C 28.4161,29.6436 28.0974,29.7108 27.7852,29.8452L 26.9722,30.3818L 26.4128,31.1851C 26.2697,31.4973 26.1982,31.8225 26.1982,32.1607L 26.1982,37.364L 26.0356,38.2193L 25.5803,38.9315L 24.9104,39.4096L 24.1038,39.582L 16.2013,39.582 Z M 34.8333,41.1667L 41.1666,41.1667L 41.1667,52.6458L 45.9167,47.8958L 45.9167,54.2292L 38,62.5417L 30.0833,54.2292L 30.0833,47.8958L 34.8333,52.6458L 34.8333,41.1667 Z \" />\n </svg>\n </button>\n </div>\n </div>\n </div>\n}\n\n\n\n\n\n\n\n\n\n\n\n </div>\n </div>\n </ng-template>\n\n \n\n\n</ng-template>\n\n<div id=\"videoPanel\" style=\"display: none\">\n <audio #rmtAudio id=\"rmtAudio\" autoplay></audio>\n <audio #lclAudio id=\"lclAudio\" autoplay muted></audio>\n <video #rmtVideo id=\"rmtVideo\" autoplay></video>\n <video #lclVideo id=\"lclVideo\" autoplay muted controls title=\"Local Video\"></video>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatError, MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\n\nimport { AvayaIPOWidgetComponent } from './avaya-ipo-widget.component';\nimport { CallHistoryComponent } from './components/call-history/call-history.component';\nimport { DialpadComponent } from './components/dialpad/dialpad.component';\nimport { DeviceSelectorComponent } from './components/device-selector/device-selector.component';\n\nimport { NgxIntlTelInputModule } from 'ngx-intl-tel-input';\n\n@NgModule({\n declarations: [\n AvayaIPOWidgetComponent,\n CallHistoryComponent,\n DialpadComponent,\n DeviceSelectorComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatError,\n MatFormField,\n MatLabel,\n NgxIntlTelInputModule,\n ],\n exports: [AvayaIPOWidgetComponent],\n})\nexport class AvayaIPOWidgetModule {}\n","/*\n * Public API Surface of avaya-ipo-widget\n */\n\nexport * from './lib/avaya-ipo-widget.component';\nexport * from './lib/avaya-ipo-widget.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i1","i2.AvayaIPOService","i3.AuthenticationService","i4","i3.CountryService","i4.PhoneNumberLookupService","i5.AvayaIPOService","i6.RecordingManagerService","i7.CallSocketService","i9","i12","i13.CallHistoryComponent","i14.DialpadComponent","i15.DeviceSelectorComponent"],"mappings":"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A;;;ACND;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;MAkBa,uBAAuB,CAAA;AAWd,IAAA,IAAA;AAVZ,IAAA,QAAQ,GAAG,IAAI,GAAG,EAA4B;IAErC,mBAAmB,GAAG,wBAAwB;IAC9C,kBAAkB,GAAG,YAAY;IACjC,iBAAiB,GAAG,IAAI;IACxB,4BAA4B,GAAG,GAAG;IAElC,oBAAoB,GACnC,yEAAyE;AAE3E,IAAA,WAAA,CAAoB,IAAgB,EAAA;QAAhB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAe;;AAIvC,IAAA,cAAc,CACZ,gBAA6B,EAC7B,iBAA8B,EAC9B,QAAsB,EAAA;;AAGtB,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;AAEnC,QAAA,IAAI,CAAC,gBAAgB,IAAI,CAAC,iBAAiB,EAAE;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAC,MAAM,CAAA,y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"}