@snugdesk/avaya-ipo-widget 0.1.2 → 0.2.1

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.
@@ -1 +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 configTemplate = {\n serviceType: '', // expected: 'phone' or 'agent' (must be provided)\n enableVideo: false,\n Gateway: { ip: '', port: '' },\n Stunserver: { ip: '', port: '' },\n Turnserver: { ip: '', port: '', 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 setConfigValues(opts: {\n serviceType?: string;\n gatewayIp?: string;\n gatewayPort?: string;\n stunIp?: string;\n stunPort?: string;\n turnIp?: string;\n turnPort?: string;\n }): void {\n this.configTemplate = {\n ...this.configTemplate,\n serviceType: opts.serviceType ?? this.configTemplate.serviceType,\n Gateway: {\n ...this.configTemplate.Gateway,\n ip: opts.gatewayIp ?? this.configTemplate.Gateway.ip,\n port: opts.gatewayPort ?? this.configTemplate.Gateway.port,\n },\n Stunserver: {\n ...this.configTemplate.Stunserver,\n ip: opts.stunIp ?? this.configTemplate.Stunserver.ip,\n port: opts.stunPort ?? this.configTemplate.Stunserver.port,\n },\n Turnserver: {\n ...this.configTemplate.Turnserver,\n ip: opts.turnIp ?? this.configTemplate.Turnserver.ip,\n port: opts.turnPort ?? this.configTemplate.Turnserver.port,\n user: this.configTemplate.Turnserver.user,\n pwd: this.configTemplate.Turnserver.pwd,\n },\n };\n }\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.configTemplate,\n AppData: {\n ...this.configTemplate.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('configurationMode')\n configurationMode!: string;\n\n @Input('avayaIPOServerIP')\n avayaIPOServerIP!: string;\n\n @Input('avayaIPOServerPort')\n avayaIPOServerPort!: number | string;\n\n @Input('avayaIPOServerStunServerIP')\n avayaIPOServerStunServerIP!: string;\n\n @Input('avayaIPOServerStunServerPort')\n avayaIPOServerStunServerPort!: number | string;\n\n @Input('avayaIPOServerTurnServerIP')\n avayaIPOServerTurnServerIP!: string;\n\n @Input('avayaIPOServerTurnServerPort')\n avayaIPOServerTurnServerPort!: number | string;\n\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.setConfigValues({\n serviceType: (this.configurationMode as 'phone' | 'agent') || 'phone',\n gatewayIp: this.avayaIPOServerIP || undefined,\n gatewayPort: this.avayaIPOServerPort\n ? String(this.avayaIPOServerPort)\n : undefined,\n stunIp: this.avayaIPOServerStunServerIP || undefined,\n stunPort: this.avayaIPOServerStunServerPort\n ? String(this.avayaIPOServerStunServerPort)\n : undefined,\n turnIp: this.avayaIPOServerTurnServerIP || undefined,\n turnPort: this.avayaIPOServerTurnServerPort\n ? String(this.avayaIPOServerTurnServerPort)\n : undefined,\n });\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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"}
1
+ {"version":3,"file":"snugdesk-avaya-ipo-widget.mjs","sources":["../../../projects/avaya-ipo-widget/src/lib/config/app-config.ts","../../../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/authentication.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/entities-search.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-details/call-details.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/call-history/call-details/call-details.component.html","../../../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/components/contacts/contact-card/contact-card.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-card/contact-card.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-details/contact-details.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contact-details/contact-details.component.html","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contacts.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/contacts/contacts.component.html","../../../projects/avaya-ipo-widget/src/lib/components/settings/settings.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/settings/settings.component.html","../../../projects/avaya-ipo-widget/src/lib/components/login/login.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/login/login.component.html","../../../projects/avaya-ipo-widget/src/lib/services/recording-manager.service.ts","../../../projects/avaya-ipo-widget/src/lib/services/transcription-stream.service.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/idle/phone-idle.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/idle/phone-idle.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/incoming/phone-incoming.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/incoming/phone-incoming.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/active/phone-active.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/active/phone-active.component.html","../../../projects/avaya-ipo-widget/src/lib/components/phone/phone.component.ts","../../../projects/avaya-ipo-widget/src/lib/components/phone/phone.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":["export const APP_CONFIG = {\n ASSET_CDN_BASE_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget',\n AWL_SDK_URL: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/js/awl.min.js',\n AGENT_STATUS_API_URL: 'https://v2xla9n0t6.execute-api.us-west-2.amazonaws.com/dev',\n CALL_HISTORY_API_URL: 'https://ktgxyy2x2h.execute-api.us-west-2.amazonaws.com/avayaCallHistory',\n CALL_SESSION_WS_URL: 'wss://hymtqh7k82.execute-api.us-west-2.amazonaws.com/callSession',\n TRANSCRIPTION_SIGNED_URL_API: 'https://nqfo27pht1.execute-api.us-east-1.amazonaws.com/Stage/avaya-ipo/transcribe/signed-url',\n COUNTRY_ENDPOINT: 'https://d39qei1249155h.cloudfront.net/avaya-ipo-widget/assets/metadata/countries.json',\n PHONE_NUMBER_LOOKUP_BASE: 'https://api.snugdesk.com/phone-numbers',\n PHONE_NUMBER_HLR_BASE: 'https://api.snugdesk.com/phone-numbers/hlr',\n PHONE_LOOKUP_COUNTRY_CODE: '91',\n ENTITY_SEARCH_BASE: 'https://search.snugdesk.com/entities',\n OPENSEARCH_ENTITIES_URL: 'https://api.snugdesk.com/opensearch/entities',\n PUSH_API_BASE: 'https://<your-api-id>.execute-api.<region>.amazonaws.com',\n DIAL_OUT_PREFIX: '0',\n} as const;\n\nexport const assetUrl = (path: string): string => {\n const base = APP_CONFIG.ASSET_CDN_BASE_URL.replace(/\\/$/, '');\n const cleanPath = path.replace(/^\\//, '');\n return `${base}/${cleanPath}`;\n};\n\nexport const formatDialOutNumber = (value: any): string => {\n if (value === null || value === undefined) {\n return '';\n }\n const raw = value.toString().trim();\n if (!raw) {\n return '';\n }\n\n let digits = raw.replace(/\\D/g, '');\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n\n if (countryCode && digits.startsWith(countryCode) && digits.length > 10) {\n digits = digits.slice(countryCode.length);\n }\n\n if (digits.length === 10) {\n return `${APP_CONFIG.DIAL_OUT_PREFIX || ''}${digits}`;\n }\n\n return digits;\n};\n","import { Injectable, NgZone } from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { APP_CONFIG, assetUrl } from '../config/app-config';\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.setLastIncomingCall(callId, farEndNumber);\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 // 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 this.service.zone.run(() => {\n this.service.callTerminateSubject.next({ callId, reason });\n });\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 callTerminateSubject = new Subject<{ callId: string; reason: any }>();\n public outgoingDialSubject = new BehaviorSubject<{ dialed: string } | null>(\n null\n );\n private ringAudio: HTMLAudioElement | null = null;\n private lastIncomingCall: { callId: string; farEndNumber: string } | null =\n null;\n public callStateSubject = new Subject<{ callId: string; state: string }>();\n public transferStatusSubject = new Subject<{\n callId?: string;\n success: boolean;\n message: string;\n }>();\n private transferInProgressCallId: string | null = null;\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 public getLastIncomingCall():\n | { callId: string; farEndNumber: string }\n | null {\n return this.lastIncomingCall;\n }\n\n public clearLastIncomingCall(): void {\n this.lastIncomingCall = null;\n this.stopRingTone();\n }\n\n public notifyOutgoingDial(dialed: string): void {\n if (!dialed) {\n return;\n }\n this.outgoingDialSubject.next({ dialed });\n }\n\n public clearOutgoingDial(): void {\n this.outgoingDialSubject.next(null);\n }\n\n public getActiveCallCount(): number {\n return this.activeCallsMap.size;\n }\n\n public setLastIncomingCall(callId: string, farEndNumber: string): void {\n this.lastIncomingCall = { callId, farEndNumber };\n this.startRingTone();\n }\n\n private startRingTone(): void {\n try {\n if (!this.ringAudio) {\n this.ringAudio = new Audio();\n }\n this.ringAudio.src = assetUrl('assets/sounds/ringback_tone.mp3');\n this.ringAudio.loop = true;\n this.ringAudio.currentTime = 0;\n this.ringAudio.play().catch(() => {\n // Ignore autoplay failures.\n });\n } catch {\n // ignore play errors\n }\n }\n\n private stopRingTone(): void {\n if (!this.ringAudio) {\n return;\n }\n try {\n this.ringAudio.pause();\n this.ringAudio.currentTime = 0;\n this.ringAudio.src = '';\n } catch {\n // ignore teardown errors\n }\n }\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 configTemplate = {\n serviceType: '', // expected: 'phone' or 'agent' (must be provided)\n enableVideo: false,\n Gateway: { ip: '', port: '' },\n Stunserver: { ip: '', port: '' },\n Turnserver: { ip: '', port: '', user: '', pwd: '' },\n AppData: { applicationID: '', applicationUA: '', appInstanceID: '' },\n disableResiliency: false,\n };\n\n private readonly agentStatusApiUrl = APP_CONFIG.AGENT_STATUS_API_URL;\n\n private readonly CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;\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 private _rpcMessageListenerWs?: WebSocket;\n private isLoggedIn = false;\n private initAttempts = 0;\n\n constructor(public zone: NgZone, private http: HttpClient) { }\n\n setConfigValues(opts: {\n serviceType?: string;\n gatewayIp?: string;\n gatewayPort?: string;\n stunIp?: string;\n stunPort?: string;\n turnIp?: string;\n turnPort?: string;\n }): void {\n const clean = (value?: string) => {\n const trimmed = value?.toString().trim();\n return trimmed ? trimmed : undefined;\n };\n const stunIp = clean(opts.stunIp);\n const stunPort = clean(opts.stunPort);\n const turnIp = clean(opts.turnIp);\n const turnPort = clean(opts.turnPort);\n this.configTemplate = {\n ...this.configTemplate,\n serviceType: opts.serviceType ?? this.configTemplate.serviceType,\n Gateway: {\n ...this.configTemplate.Gateway,\n ip: clean(opts.gatewayIp) ?? this.configTemplate.Gateway.ip,\n port: clean(opts.gatewayPort) ?? this.configTemplate.Gateway.port,\n },\n Stunserver: {\n ...this.configTemplate.Stunserver,\n ip: stunIp ?? this.configTemplate.Stunserver.ip,\n port: stunPort ?? this.configTemplate.Stunserver.port,\n },\n Turnserver: {\n ...this.configTemplate.Turnserver,\n ip: turnIp ?? this.configTemplate.Turnserver.ip,\n port: turnPort ?? this.configTemplate.Turnserver.port,\n user: this.configTemplate.Turnserver.user,\n pwd: this.configTemplate.Turnserver.pwd,\n },\n };\n }\n\n init() {\n // AWL is exposed by the SDK script. In some builds it shows up as `AWL`,\n // in others as `awlGlobal`. Check every known slot before giving up.\n const awlRef: any =\n (typeof AWL !== 'undefined' ? (AWL as any) : undefined) ??\n (window as any)?.AWL ??\n (window as any)?.awlGlobal;\n if (awlRef) {\n this.cli = new awlRef.client();\n this.logCliCapabilities('init');\n const cliAny = this.cli as any;\n Object.defineProperty(cliAny, 'jsonRpc', {\n configurable: true,\n set: (rpcClient: any) => {\n // restore the real property\n delete cliAny.jsonRpc;\n cliAny.jsonRpc = rpcClient;\n // now do the patch\n this._doPatch();\n },\n });\n this.initAttempts = 0;\n } else {\n console.warn('AWL is not yet loaded');\n if (this.initAttempts < 5) {\n this.initAttempts++;\n setTimeout(() => this.init(), 400);\n }\n }\n }\n\n logIn(username: string, password: string, attempt = 0): void {\n if (!this.cli) {\n this.init();\n }\n if (!this.cli) {\n if (attempt < 5) {\n setTimeout(() => this.logIn(username, password, attempt + 1), 300);\n return;\n }\n console.error('AWL client not initialized; cannot log in.');\n return;\n }\n this.logCliCapabilities('login');\n this.cli.enableLogging?.();\n // this.cli.disableLogging();\n\n const appInstanceId = this.cli.generateAppInstanceID();\n const config = {\n ...this.configTemplate,\n AppData: {\n ...this.configTemplate.AppData,\n appInstanceID: appInstanceId,\n },\n };\n // Avoid sending invalid STUN/TURN configs when values are empty.\n if (!config.Stunserver?.ip || !config.Stunserver?.port) {\n delete (config as any).Stunserver;\n }\n if (!config.Turnserver?.ip || !config.Turnserver?.port) {\n delete (config as any).Turnserver;\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 private logCliCapabilities(label: string): void {\n if (!this.cli) {\n console.warn(`[AWL] ${label}: client not ready`);\n return;\n }\n const cliAny = this.cli as any;\n const ownMethods = Object.keys(cliAny).filter(\n (key) => typeof cliAny[key] === 'function'\n );\n const proto = Object.getPrototypeOf(cliAny);\n const protoMethods = proto\n ? Object.getOwnPropertyNames(proto).filter(\n (key) => key !== 'constructor' && typeof cliAny[key] === 'function'\n )\n : [];\n const methods = Array.from(new Set([...ownMethods, ...protoMethods])).sort();\n if (methods.length === 0) {\n console.warn(`[AWL] ${label}: no methods found on client`, {\n ownKeys: Object.keys(cliAny),\n protoKeys: proto ? Object.getOwnPropertyNames(proto) : [],\n });\n return;\n }\n }\n\n logOut(): void {\n if (!this.isLoggedIn) {\n console.debug('Logout skipped: client not logged in');\n return;\n }\n this.cli.logOut();\n }\n\n logout(): void {\n const jsonRpc = (this.cli as any)?.jsonRpc;\n const ws: WebSocket | undefined = jsonRpc?.ws;\n if (!ws || ws.readyState !== WebSocket.OPEN) {\n console.warn('Logout skipped: JSON-RPC websocket not ready; falling back to SDK logout');\n this.logOut();\n return;\n }\n const id =\n typeof crypto !== 'undefined' && 'randomUUID' in crypto\n ? crypto.randomUUID()\n : `logout-${Date.now()}`;\n ws.send(\n JSON.stringify({\n protocol: 'jsonrpc-3.0.0',\n id,\n service: 'phoneservice',\n msgname: 'logout',\n params: null,\n })\n );\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 if (res_transferCall) {\n this.transferInProgressCallId = this.activeCallId || null;\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: true,\n message: 'Transfer initiated',\n });\n } else {\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: false,\n message: 'Failed to transfer',\n });\n }\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 const incomingCallId = this.lastIncomingCall?.callId || null;\n let callId = incomingCallId || this.activeCallId || null;\n\n if (!callId) {\n for (const callObj of Object.values(this.callSlots)) {\n if (callObj) {\n callId = callObj.getCallId();\n break;\n }\n }\n }\n\n if (!callId) {\n console.warn('No callId available to answer.');\n return;\n }\n\n this.activeCallId = callId;\n this.stopRingTone();\n const res_answerCall = this.cli.answerCall(callId);\n console.debug('res_answerCall: ', res_answerCall);\n\n if (incomingCallId) {\n this.clearLastIncomingCall();\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 this.isLoggedIn = true;\n if (rpc && rpc.ws) {\n rpc.ws.evtConnectionOpen.attach(() => {\n this.patchRpcForTransfers(this.agentId);\n });\n }\n }\n\n if (res_registrationChange?.result === LoginState.LOGIN_FAILED) {\n // LOGIN_FAILED means the client is not authenticated yet; skip SDK logout to avoid\n // \"Logout denied as client not logged in yet\".\n this.isLoggedIn = false;\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.CONNECTED:\n this.stopRingTone();\n break;\n case CallState.FAILED:\n case CallState.DISCONNECTED:\n console.debug('Call Failed or DISCONNECTED! Releasing call...');\n this.stopRingTone();\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 this.cli.doHold(currentCall?.getCallId());\n\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 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 this.cli.doHold(currentCall?.getCallId());\n\n // 5) Unhold the target slot\n this.cli.doUnHold(targetCall.getCallId());\n\n // 6) Update activeCallId\n this.activeCallId = targetCall.getCallId();\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\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\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 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 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 if (res) {\n this.transferInProgressCallId = this.activeCallId || null;\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: true,\n message: 'Transfer initiated',\n });\n } else {\n this.transferStatusSubject.next({\n callId: this.activeCallId || undefined,\n success: false,\n message: 'Failed to transfer',\n });\n }\n }\n\n public consumeTransferInProgress(callId: string): boolean {\n if (this.transferInProgressCallId && this.transferInProgressCallId === callId) {\n this.transferInProgressCallId = null;\n return true;\n }\n return false;\n }\n\n private _doPatch() {\n // if (this._rpcPatched) return;\n this._rpcPatched = true;\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 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 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';\nimport { APP_CONFIG } from '../config/app-config';\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 = APP_CONFIG.COUNTRY_ENDPOINT;\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';\nimport { APP_CONFIG } from '../config/app-config';\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 normalizedPhoneNumber = this.normalizeForLookup(phoneNumber);\n const apiEndpoint = hlr\n ? `${APP_CONFIG.PHONE_NUMBER_HLR_BASE}/${encodeURIComponent(\n normalizedPhoneNumber\n )}`\n : `${APP_CONFIG.PHONE_NUMBER_LOOKUP_BASE}/${encodeURIComponent(\n normalizedPhoneNumber\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 private normalizeForLookup(phoneNumber: string): string {\n if (!phoneNumber || typeof phoneNumber !== 'string') {\n return '';\n }\n\n let normalized = phoneNumber.trim();\n if (normalized.startsWith('00')) {\n return `+${normalized.slice(2)}`;\n }\n if (normalized.startsWith('+')) {\n return normalized;\n }\n\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!countryCode) {\n return digits;\n }\n\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n\n if (local.startsWith(countryCode)) {\n return `+${local}`;\n }\n return `+${countryCode}${local}`;\n }\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\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 { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { APP_CONFIG } from '../config/app-config';\nimport { AuthenticationService } from './authentication.service';\n\n@Injectable({ providedIn: 'root' })\nexport class EntitiesSearchService {\n private nameCache = new Map<string, string>();\n\n constructor(\n private http: HttpClient,\n private authenticationService: AuthenticationService\n ) { }\n\n async fetchContacts(\n tenantId: string,\n size = 25,\n searchAfter?: [string, string]\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n {\n bool: {\n should: [\n { exists: { field: 'phone_numbers' } },\n { exists: { field: 'phone' } },\n { exists: { field: 'normalizedPhoneNumber' } },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n if (searchAfter && searchAfter.length === 2) {\n (body as any).search_after = searchAfter;\n }\n\n return this.postEntities(body);\n }\n\n async searchByPhone(\n tenantId: string,\n phoneNumber: string,\n size = 25\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n ],\n must: [\n {\n bool: {\n should: [\n {\n simple_query_string: {\n query: phoneNumber,\n fields: ['name', 'emails', 'phone_numbers'],\n default_operator: 'and',\n },\n },\n {\n wildcard: {\n 'emails.keyword': {\n value: this.ensureWildcard(phoneNumber),\n case_insensitive: true,\n },\n },\n },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n\n return this.postEntities(body);\n }\n\n async searchEntities(\n tenantId: string,\n query: string,\n size = 25,\n from = 0\n ): Promise<any> {\n const body = {\n size,\n track_total_hits: true,\n sort: [\n {\n 'name.keyword': {\n order: 'asc',\n missing: '_last',\n },\n },\n {\n _id: {\n order: 'asc',\n },\n },\n ],\n query: {\n bool: {\n filter: [\n { term: { is_blocked: false } },\n { term: { tenant_id: tenantId } },\n ],\n must: [\n {\n bool: {\n should: [\n {\n simple_query_string: {\n query,\n fields: ['name', 'emails', 'phone_numbers'],\n default_operator: 'and',\n },\n },\n {\n wildcard: {\n 'emails.keyword': {\n value: this.ensureWildcard(query),\n case_insensitive: true,\n },\n },\n },\n ],\n minimum_should_match: 1,\n },\n },\n ],\n },\n },\n };\n\n return this.postEntities(body);\n }\n\n getCachedName(tenantId: string, phoneNumber: string): string | null {\n const key = this.cacheKey(tenantId, phoneNumber);\n return this.nameCache.get(key) || null;\n }\n\n async lookupNameByPhone(\n tenantId: string,\n phoneNumber: string,\n size = 25\n ): Promise<string | null> {\n const cached = this.getCachedName(tenantId, phoneNumber);\n if (cached) {\n return cached;\n }\n const res: any = await this.searchByPhone(tenantId, phoneNumber, size);\n const hit = res?.hits?.hits?.[0];\n const name = hit?._source?.name;\n const trimmed = typeof name === 'string' ? name.trim() : '';\n if (trimmed) {\n this.nameCache.set(this.cacheKey(tenantId, phoneNumber), trimmed);\n return trimmed;\n }\n return null;\n }\n\n private postEntities(body: object): Promise<any> {\n const token = this.authenticationService.getAuthSessionToken();\n const headers = token ? { Authorization: `Bearer ${token}` } : undefined;\n return lastValueFrom(\n this.http.post(APP_CONFIG.OPENSEARCH_ENTITIES_URL, body, { headers })\n );\n }\n\n private cacheKey(tenantId: string, phoneNumber: string): string {\n return `${tenantId}:${phoneNumber}`;\n }\n\n private ensureWildcard(value: string): string {\n const trimmed = (value || '').toString().trim();\n if (!trimmed) {\n return '*';\n }\n return trimmed.includes('*') ? trimmed : `${trimmed}*`;\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-call-details',\n templateUrl: './call-details.component.html',\n styleUrls: ['./call-details.component.css'],\n standalone: false,\n})\nexport class CallDetailsComponent {\n @Input() call: any;\n\n getBadge(): string {\n const base =\n this.call?.phoneNumber?.country?.code ||\n this.call?.direction ||\n '--';\n return base.toString().slice(0, 2).toUpperCase();\n }\n\n getDisplayName(): string {\n return (\n this.call?.lookupPhoneNumber?.name ||\n this.call?.phoneNumber?.lookupPhoneNumber?.name ||\n this.call?.contactName ||\n 'Unknown'\n );\n }\n\n getPhone(): string {\n return (\n this.call?.phoneNumber?.normalizedPhoneNumber ||\n this.call?.phoneNumber?.lookupPhoneNumber?.['international-number'] ||\n this.call?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n this.call?.phoneNumber ||\n ''\n );\n }\n}\n","<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">\n <svg viewBox=\"0 0 448 512\" width=\"28\" height=\"28\" fill=\"currentColor\" aria-hidden=\"true\">\n <path\n d=\"M224 256A128 128 0 1 0 224 0a128 128 0 1 0 0 256zm-45.7 48C79.8 304 0 383.8 0 482.3C0 498.7 13.3 512 29.7 512H418.3c16.4 0 29.7-13.3 29.7-29.7C448 383.8 368.2 304 269.7 304H178.3z\" />\n </svg>\n </div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"divider\">|</span>\n <span class=\"missed-badge\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path 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 <span>Missed Call</span>\n </span>\n }\n </div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Duration</div>\n <div class=\"value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Disconnect Side</div>\n <div class=\"value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Country</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.country?.nameEn ||\n call?.phoneNumber?.lookupPhoneNumber?.country ||\n 'N/A'\n }}\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Provider</div>\n <div class=\"value\">\n {{\n call?.phoneNumber?.lookupPhoneNumber?.['prefix-network'] ||\n call?.phoneNumber?.lookupPhoneNumber?.provider ||\n 'N/A'\n }}\n </div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-title\">Call Recording</div>\n <audio\n *ngIf=\"call?.fullCallRecordingUrl; else noRecording\"\n controls\n [src]=\"call?.fullCallRecordingUrl\"\n ></audio>\n <ng-template #noRecording>\n @if ((call?.duration ?? 0) > 0) {\n <button class=\"disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-title\">Call Transcription</div>\n <div class=\"placeholder\">No transcription available.</div>\n </div>\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG, formatDialOutNumber } from '../../config/app-config';\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 @Input() tenantId?: string;\n @Input() agentId?: string;\n @Output() makeCallEv = new EventEmitter<{ dialOut: string; name?: string }>();\n @Output() transferEv = new EventEmitter<any>();\n\n private readonly CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;\n\n showHistoryLoader: boolean = false;\n\n callHistory: any[] = [];\n searchTerm = '';\n recentCallactiveTab = 'recentCall';\n selectedCall: any = null;\n\n constructor(private http: HttpClient, private cdr: ChangeDetectorRef) {}\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 const tenantId = this.tenantId || this.getTenantIdFromSession();\n const userId = this.agentId || this.getUserIdFromSession();\n\n if (!tenantId || !userId) {\n console.warn('Missing tenantId or agentId for call history', {\n tenantId,\n userId,\n });\n return;\n }\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 } 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, name?: string): void {\n const dialOut = formatDialOutNumber(phoneNumber);\n if (!dialOut) {\n console.warn('No dialable number for call history makeCall:', phoneNumber);\n return;\n }\n this.makeCallEv.emit({ dialOut, name });\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 get filteredRecent(): any[] {\n if (!this.searchTerm.trim()) return this.callHistory;\n const term = this.searchTerm.toLowerCase();\n return this.callHistory.filter((item) => {\n const phone =\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n item?.lookupPhoneNumber?.['local-number'] ||\n item?.lookupPhoneNumber?.normalizedPhoneNumber ||\n '';\n const name = item?.lookupPhoneNumber?.name || '';\n return (\n phone.toString().toLowerCase().includes(term) ||\n name.toString().toLowerCase().includes(term)\n );\n });\n }\n\n get groupedRecent(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.filteredRecent);\n }\n\n get groupedMissed(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.callerDropped);\n }\n\n onSelectCall(item: any): void {\n this.selectedCall = item;\n }\n\n closeDetails(): void {\n this.selectedCall = null;\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 =\n this.resolveDialable(item) ||\n (item?.phoneNumber ?? '').toString().replace(/\\s+/g, '');\n if (!dialable) {\n console.warn('No dialable number found in history item:', item);\n return;\n }\n const dialOut = formatDialOutNumber(dialable);\n if (!dialOut) {\n console.warn('No dialable number after formatting history item:', item);\n return;\n }\n const name = this.resolveName(item);\n this.makeCallEv.emit({ dialOut, name });\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?.phoneNumber?.normalizedPhoneNumber) ||\n clean(item?.phoneNumber?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.phoneNumber) ||\n clean(item?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.lookupPhoneNumber?.['local-number']) ||\n clean(item?.lookupPhoneNumber?.normalizedPhoneNumber) ||\n null\n );\n }\n\n private resolveName(item: any): string | undefined {\n const name =\n item?.phoneNumber?.name ||\n item?.lookupPhoneNumber?.name ||\n item?.name;\n if (typeof name === 'string' && name.trim()) {\n return name.trim();\n }\n return undefined;\n }\n\n private formatDialOutFromInput(value: any): string {\n return formatDialOutNumber(value);\n }\n\n private getTenantIdFromSession(): string | undefined {\n const raw = sessionStorage.getItem('sd-tenant');\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return parsed?.id || parsed?.tenantId || undefined;\n } catch {\n return undefined;\n }\n }\n\n private getUserIdFromSession(): string | undefined {\n const raw = sessionStorage.getItem('sd-user');\n if (!raw) return undefined;\n try {\n const parsed = JSON.parse(raw);\n return parsed?.id || parsed?.userId || undefined;\n } catch {\n return undefined;\n }\n }\n\n getPhoneDisplay(item: any): string {\n return (\n item?.phoneNumber?.name ||\n item?.lookupPhoneNumber?.name ||\n item?.phoneNumber?.normalizedPhoneNumber ||\n item?.phoneNumber?.lookupPhoneNumber?.['international-number'] ||\n item?.phoneNumber?.lookupPhoneNumber?.['local-number'] ||\n item?.phoneNumber ||\n ''\n ).toString();\n }\n\n getPhoneBadge(item: any): string {\n const displayName =\n item?.phoneNumber?.name || item?.lookupPhoneNumber?.name || '';\n if (displayName) {\n return this.getInitials(displayName);\n }\n const code =\n item?.phoneNumber?.country?.code ||\n item?.phoneNumber?.lookupPhoneNumber?.['country-code'] ||\n '';\n if (code) return code.toUpperCase();\n const display = this.getPhoneDisplay(item);\n return display ? display.slice(0, 2) : '--';\n }\n\n private getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '--';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n\n private groupByDate(items: any[]): Array<{ label: string; items: any[] }> {\n const groups: Array<{ label: string; items: any[] }> = [];\n let currentLabel = '';\n let currentGroup: { label: string; items: any[] } | null = null;\n\n for (const item of items) {\n const label = this.formatDateLabel(item?.timestamp);\n if (!currentGroup || label !== currentLabel) {\n currentLabel = label;\n currentGroup = { label, items: [] };\n groups.push(currentGroup);\n }\n currentGroup.items.push(item);\n }\n\n return groups;\n }\n\n private formatDateLabel(ts: string): string {\n const date = ts ? new Date(ts) : new Date();\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n\n const isSameDay = (a: Date, b: Date) =>\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate();\n\n if (isSameDay(date, today)) return 'Today';\n if (isSameDay(date, yesterday)) return 'Yesterday';\n return date.toLocaleDateString('en-US', {\n month: 'short',\n day: '2-digit',\n year: 'numeric',\n });\n }\n}\n","<div class=\"recent_container_outer\">\n @if (!selectedCall) {\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 <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path 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 </span>\n <span>Recent</span>\n </button>\n <button class=\"recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.active]=\"recentCallactiveTab === 'missedCall'\">\n <span class=\"tab_icon\">\n <svg viewBox=\"0 0 512 512\" width=\"14\" height=\"14\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M504.971 75.029l-68-68C430.182.241 423.6-1.547 417.6.758 411.7 3.067 408 8.798 408 15v72H248C111.033 87 0 198.033 0 335v48c0 13.255 10.745 24 24 24h64c13.255 0 24-10.745 24-24v-48c0-74.991 61.009-136 136-136h160v72c0 6.202 3.7 11.933 9.6 14.242 6 2.305 12.582.517 16.629-3.758l68-68c9.373-9.373 9.373-24.569 0-33.941z\" />\n </svg>\n </span>\n <span>Missed Call</span>\n </button>\n </div>\n </div>\n }\n\n @if (!selectedCall) {\n <div class=\"container_recent_search\">\n <div class=\"search_wrap\">\n <svg class=\"search_icon\" viewBox=\"0 0 512 512\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M208 48C111 48 32 127 32 224s79 176 176 176c43.2 0 82.7-15.3 113.7-40.6l81.4 81.4c9.4 9.4 24.6 9.4 33.9 0s9.4-24.6 0-33.9l-81.4-81.4C416.7 306.7 432 267.2 432 224 432 127 353 48 256 48zm-128 176c0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128S80 294.7 80 224z\"/>\n </svg>\n <input\n type=\"search\"\n placeholder=\"Search numbers or names\"\n [(ngModel)]=\"searchTerm\"\n />\n </div>\n </div>\n }\n\n @if (showHistoryLoader) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (selectedCall) {\n <div class=\"history_details_panel\">\n <button class=\"back_btn\" type=\"button\" (click)=\"closeDetails()\">← Back</button>\n <app-call-details [call]=\"selectedCall\"></app-call-details>\n </div>\n } @else {\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 (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name\" [class.history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta\" [ngClass]=\"{\n missed: call.status === 'MISSED',\n caller_drop: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"meta_label\" [ngClass]=\"{\n inbound: call.direction?.toLowerCase() === 'inbound',\n outbound: call.direction?.toLowerCase() === 'outbound',\n missed: call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n @if (call.direction?.toLowerCase() === 'inbound') {\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path 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 } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M17 7L7 17M7 17H17M7 17V7\" />\n </svg>\n }\n <span class=\"direction_text\">\n @if (call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0) {\n Missed call\n } @else {\n Incoming\n }\n </span>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M7 17L17 7M17 7H7M17 7V17\" />\n </svg>\n <span class=\"direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n @if (mode === 'transfer') {\n <button class=\"button_recent_call\" (click)=\"transferEv.emit(call); $event.stopPropagation()\">\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, call.phoneNumber?.name || call.lookupPhoneNumber?.name); $event.stopPropagation()\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 }\n }\n @if (callHistory.length === 0) {\n <div class=\"container_call_history_not_found\">\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 (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"outer_container_recent\">\n <div class=\"history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"history_avatar grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"history_body\">\n <div class=\"history_row\">\n <div class=\"history_name history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"history_meta caller_drop\">\n <span class=\"meta_label missed\">\n <svg viewBox=\"0 0 640 512\" width=\"12px\" aria-hidden=\"true\" style=\"fill: currentColor;\">\n <path 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 <span class=\"direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"history_actions\">\n <button class=\"button_recent_call\" (click)=\"selectFromHistory(call); $event.stopPropagation()\">\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 }\n }\n @if (callerDropped.length === 0) {\n <div class=\"container_call_history_not_found\">\n <h2>No missed 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 }\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\n\n@Component({\n selector: 'app-contact-card',\n templateUrl: './contact-card.component.html',\n styleUrls: ['./contact-card.component.css'],\n standalone: false,\n})\nexport class ContactCardComponent {\n @Input() name = '';\n @Input() phone = '';\n @Output() call = new EventEmitter<Event>();\n\n get initials(): string {\n const parts = (this.name || '').trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) {\n return (this.phone || '').slice(0, 2).toUpperCase() || '--';\n }\n if (parts.length === 1) {\n return parts[0].slice(0, 2).toUpperCase();\n }\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n\n onCall(ev: Event): void {\n ev.stopPropagation();\n this.call.emit(ev);\n }\n}\n","<div class=\"contact-card\">\n <div class=\"contact-avatar grd1\">{{ initials }}</div>\n <div class=\"contact-body\">\n <div class=\"contact-name\">{{ name }}</div>\n <div class=\"contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"contact-call-btn\" (click)=\"onCall($event)\">\n <svg viewBox=\"0 0 512 512\" height=\"18\" aria-hidden=\"true\" focusable=\"false\">\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","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'app-contact-details',\n templateUrl: './contact-details.component.html',\n styleUrls: ['./contact-details.component.css'],\n standalone: false,\n})\nexport class ContactDetailsComponent {\n @Input() contact: any;\n\n getDisplayName(): string {\n return (this.contact?.name || 'Unknown').toString();\n }\n\n getPrimaryPhone(): string {\n const phones = Array.isArray(this.contact?.phone_numbers)\n ? this.contact.phone_numbers\n : [];\n return (\n phones[0] ||\n this.contact?.phone ||\n this.contact?.normalizedPhoneNumber ||\n 'Unknown'\n ).toString();\n }\n\n getEmails(): string[] {\n const emails = Array.isArray(this.contact?.emails)\n ? this.contact.emails.filter((e: any) => typeof e === 'string' && e.trim())\n : [];\n return emails;\n }\n\n getPhoneNumbers(): string[] {\n const phones = Array.isArray(this.contact?.phone_numbers)\n ? this.contact.phone_numbers.filter((p: any) => typeof p === 'string' && p.trim())\n : [];\n return phones;\n }\n\n getInitials(): string {\n const parts = this.getDisplayName().trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '--';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();\n }\n}\n","<div class=\"call-profile\">\n <div class=\"profile-header\">\n <div class=\"avatar\">{{ getInitials() }}</div>\n <div class=\"profile-info\">\n <div class=\"primary-number\">{{ getDisplayName() }}</div>\n <div class=\"secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"meta-line\">\n @if (contact?.is_organization) {\n <span class=\"dir outbound\">Organization</span>\n } @else {\n <span class=\"dir inbound\">Individual</span>\n }\n <span class=\"divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Phones</div>\n <div class=\"value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Emails</div>\n <div class=\"value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Call</div>\n <div class=\"value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow Email</div>\n <div class=\"value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow SMS</div>\n <div class=\"value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Allow WhatsApp</div>\n <div class=\"value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"detail-card\">\n <div class=\"detail-row\">\n <div class=\"label\">Created</div>\n <div class=\"value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"detail-row\">\n <div class=\"label\">Updated</div>\n <div class=\"value\">{{ contact?.updated_at ? (contact.updated_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, OnInit, AfterViewInit, ElementRef, Output, ViewChild } from '@angular/core';\nimport { EntitiesSearchService } from '../../services/entities-search.service';\n\ntype ContactItem = {\n id: string;\n name: string;\n phone: string;\n entity: any;\n};\n\n@Component({\n selector: 'app-contacts',\n templateUrl: './contacts.component.html',\n styleUrls: ['./contacts.component.css'],\n standalone: false,\n})\nexport class ContactsComponent implements OnInit, AfterViewInit {\n @Input() tenantId?: string;\n @ViewChild('listEl') listEl?: ElementRef<HTMLElement>;\n @Output() makeCallEv = new EventEmitter<{ dialOut: string; name?: string }>();\n contacts: ContactItem[] = [];\n groupedContacts: Array<{ label: string; items: ContactItem[] }> = [];\n selectedContact: ContactItem | null = null;\n searchTerm = '';\n isLoading = false;\n error = '';\n private searchToken = 0;\n private pageSize = 25;\n private nextFrom = 0;\n private searchAfter?: [string, string];\n private hasMore = true;\n isLoadingMore = false;\n\n constructor(private entitiesSearchService: EntitiesSearchService) {}\n\n ngOnInit(): void {\n this.resetAndLoad();\n }\n\n ngAfterViewInit(): void {\n this.ensureFill();\n }\n\n private resetAndLoad(): void {\n this.contacts = [];\n this.groupedContacts = [];\n this.pageSize = this.getPageSize();\n this.nextFrom = 0;\n this.searchAfter = undefined;\n this.hasMore = true;\n this.loadNextPage();\n }\n\n async loadNextPage(): Promise<void> {\n if (!this.tenantId || this.isLoading) {\n return;\n }\n if (!this.hasMore || this.isLoadingMore) {\n return;\n }\n this.isLoading = this.contacts.length === 0;\n this.isLoadingMore = this.contacts.length > 0;\n this.error = '';\n const results: ContactItem[] = [];\n\n try {\n const res: any = await this.entitiesSearchService.fetchContacts(\n this.tenantId,\n this.pageSize,\n this.searchAfter\n );\n const hits = res?.hits?.hits;\n const totalHits =\n typeof res?.hits?.total?.value === 'number'\n ? res.hits.total.value\n : null;\n if (!Array.isArray(hits) || hits.length === 0) {\n this.hasMore = false;\n } else {\n for (const hit of hits) {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter(\n (p: any) => typeof p === 'string' && p.trim()\n )\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n continue;\n }\n const name = (source.name || '').toString().trim() || 'Unknown';\n results.push({\n id: source.id || hit?._id || phone,\n name,\n phone,\n entity: source,\n });\n }\n const lastHit = hits[hits.length - 1];\n const lastSort = Array.isArray(lastHit?.sort) ? lastHit.sort : null;\n if (lastSort && lastSort.length >= 2) {\n this.searchAfter = [String(lastSort[0]), String(lastSort[1])];\n }\n this.nextFrom += hits.length;\n if (totalHits !== null) {\n this.hasMore = this.nextFrom < totalHits;\n } else {\n this.hasMore = hits.length >= this.pageSize;\n }\n }\n } catch (err) {\n console.error('Failed to load contacts', err);\n this.error = 'Failed to load contacts';\n this.hasMore = false;\n }\n\n if (results.length > 0) {\n this.contacts = [...this.contacts, ...results];\n }\n this.applySearch();\n this.isLoading = false;\n this.isLoadingMore = false;\n this.ensureFill();\n }\n\n onSearchChange(value: string): void {\n this.searchTerm = value;\n const term = this.searchTerm.trim();\n if (!term) {\n this.applySearch();\n return;\n }\n this.selectedContact = null;\n this.searchContacts(term);\n }\n\n private groupContacts(\n contacts: ContactItem[]\n ): Array<{ label: string; items: ContactItem[] }> {\n const sorted = [...contacts].sort((a, b) => {\n const aName = (a.name || '').toLowerCase();\n const bName = (b.name || '').toLowerCase();\n return aName.localeCompare(bName);\n });\n\n const groups: Array<{ label: string; items: ContactItem[] }> = [];\n let currentLabel = '';\n let currentGroup: { label: string; items: ContactItem[] } | null = null;\n\n for (const contact of sorted) {\n const label = this.getGroupLabel(contact.name);\n if (!currentGroup || label !== currentLabel) {\n currentLabel = label;\n currentGroup = { label, items: [] };\n groups.push(currentGroup);\n }\n currentGroup.items.push(contact);\n }\n\n return groups;\n }\n\n private applySearch(): void {\n const term = this.searchTerm.trim().toLowerCase();\n const filtered = term\n ? this.contacts.filter((contact) => {\n const name = (contact.name || '').toLowerCase();\n const phone = (contact.phone || '').toLowerCase();\n return name.includes(term) || phone.includes(term);\n })\n : this.contacts;\n this.groupedContacts = this.groupContacts(filtered);\n this.ensureFill();\n }\n\n openContact(contact: ContactItem): void {\n this.selectedContact = contact;\n }\n\n closeContact(): void {\n this.selectedContact = null;\n }\n\n onCallContact(contact: ContactItem, ev?: Event): void {\n if (ev) {\n ev.stopPropagation();\n }\n this.makeCallEv.emit({ dialOut: contact.phone, name: contact.name });\n }\n\n private async searchContacts(term: string): Promise<void> {\n if (!this.tenantId) {\n return;\n }\n const token = ++this.searchToken;\n try {\n const res: any = await this.entitiesSearchService.searchEntities(\n this.tenantId,\n term,\n 25,\n 0\n );\n if (token !== this.searchToken) {\n return;\n }\n const hits = res?.hits?.hits;\n const results: ContactItem[] = [];\n if (Array.isArray(hits)) {\n for (const hit of hits) {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter(\n (p: any) => typeof p === 'string' && p.trim()\n )\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n continue;\n }\n const name = (source.name || '').toString().trim() || 'Unknown';\n results.push({\n id: source.id || hit?._id || phone,\n name,\n phone,\n entity: source,\n });\n }\n }\n this.groupedContacts = this.groupContacts(results);\n } catch (err) {\n console.error('Failed to search contacts', err);\n this.error = 'Failed to search contacts';\n }\n }\n\n onListScroll(event: Event): void {\n if (this.searchTerm.trim()) {\n return;\n }\n const target = event.target as HTMLElement;\n if (!target) {\n return;\n }\n const threshold = 60;\n const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;\n if (remaining <= threshold) {\n this.loadNextPage();\n }\n }\n\n private ensureFill(): void {\n if (this.searchTerm.trim()) {\n return;\n }\n if (!this.listEl || this.isLoading || this.isLoadingMore || !this.hasMore) {\n return;\n }\n setTimeout(() => {\n const el = this.listEl?.nativeElement;\n if (!el || this.isLoading || this.isLoadingMore || !this.hasMore) {\n return;\n }\n if (el.scrollHeight <= el.clientHeight + 4) {\n this.loadNextPage();\n }\n }, 0);\n }\n\n private getGroupLabel(name: string): string {\n const letter = (name || '').trim().charAt(0).toUpperCase();\n return letter >= 'A' && letter <= 'Z' ? letter : '#';\n }\n\n private getPageSize(): number {\n const viewport = typeof window !== 'undefined' ? window.innerHeight : 800;\n const available = Math.max(280, viewport - 260);\n const rowHeight = 64;\n const rows = Math.ceil(available / rowHeight);\n return Math.max(10, rows);\n }\n\n}\n","<div class=\"contacts-panel\">\n @if (!selectedContact) {\n <div class=\"contacts-search\">\n <span class=\"contacts-search-icon\">🔍</span>\n <input\n type=\"text\"\n placeholder=\"Search contacts\"\n [value]=\"searchTerm\"\n (input)=\"onSearchChange($any($event.target).value)\"\n />\n </div>\n }\n @if (isLoading) {\n <div class=\"history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"skeleton_row\">\n <div class=\"skeleton_avatar shine\"></div>\n <div class=\"skeleton_body\">\n <div class=\"skeleton_line wide shine\"></div>\n <div class=\"skeleton_line medium shine\"></div>\n </div>\n <div class=\"skeleton_meta\">\n <div class=\"skeleton_line short shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"contacts-state error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"contact-details\">\n <div class=\"contact-details-actions\">\n <button type=\"button\" class=\"contact-back\" (click)=\"closeContact()\">← Back</button>\n <button type=\"button\" class=\"contact-call\" (click)=\"onCallContact(selectedContact)\">Call</button>\n </div>\n <app-contact-details [contact]=\"selectedContact.entity\"></app-contact-details>\n </div>\n } @else if (contacts.length === 0) {\n <div class=\"contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"contact-item-btn\" (click)=\"openContact(contact)\">\n <app-contact-card [name]=\"contact.name\" [phone]=\"contact.phone\" (call)=\"onCallContact(contact, $event)\"></app-contact-card>\n </button>\n }\n }\n @if (isLoadingMore) {\n <div class=\"contacts-state\">Loading more...</div>\n }\n </div>\n }\n</div>\n","import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnDestroy,\n OnInit,\n} from '@angular/core';\n\n@Component({\n selector: 'app-settings',\n templateUrl: './settings.component.html',\n styleUrls: ['./settings.component.css'],\n standalone: false,\n})\nexport class SettingsComponent implements OnInit, OnDestroy {\n @Input() selectedAudioInputId?: string;\n @Input() selectedAudioOutputId?: string;\n @Input() extensionId?: string;\n @Input() darkMode = false;\n\n @Output() change = new EventEmitter<{\n audioInputId: string;\n audioOutputId: string;\n videoInputId?: string;\n }>();\n @Output() darkModeChange = new EventEmitter<boolean>();\n @Output() logout = new EventEmitter<void>();\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 onLogout(): void {\n this.logout.emit();\n }\n\n onToggleDarkMode(): void {\n this.darkMode = !this.darkMode;\n this.darkModeChange.emit(this.darkMode);\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=\"settings-wrapper\">\n <div class=\"settings-card\">\n <div class=\"settings-header\">\n <div>\n <div class=\"settings-title\">Account</div>\n <div class=\"settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"settings-section\">\n <div class=\"section-heading\">Audio Devices</div>\n\n <div class=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Microphone</div>\n <div class=\"device-subtitle\">Choose your input device</div>\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=\"device-item\">\n <div class=\"device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"device-body\">\n <div class=\"device-title\">Speakers</div>\n <div class=\"device-subtitle\">Choose your output device</div>\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\n <div class=\"settings-section\">\n <div class=\"section-heading\">Appearance</div>\n <button type=\"button\" class=\"theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"theme-label\">Dark Mode</span>\n <span class=\"theme-pill\" [class.is-on]=\"darkMode\">\n <span class=\"theme-knob\"></span>\n </span>\n </button>\n </div>\n </div>\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Component({\n selector: 'app-avaya-ipo-login',\n templateUrl: './login.component.html',\n styleUrls: ['./login.component.css'],\n standalone: false,\n})\nexport class AvayaIpoLoginComponent {\n @Input() loginForm!: FormGroup;\n @Input() showLoginLoader = false;\n @Input() hasAvayaSocketError = false;\n @Input() hasAvayaLoginError = false;\n @Input() hasAvayaLoginFailedGeneral = false;\n @Input() hasAvayaLoginConflictError = false;\n @Input() hasAvayaDeviceError = false;\n\n @Output() login = new EventEmitter<void>();\n\n showLoginPassword = false;\n\n onLoginClick(): void {\n this.login.emit();\n }\n\n restrictNumeric(evt: KeyboardEvent): boolean {\n const allowedKeys = [\n 'Enter',\n 'Backspace',\n 'ArrowLeft',\n 'ArrowRight',\n 'Tab',\n 'Delete',\n ];\n const isDigit = /^[0-9]$/.test(evt.key);\n if (!isDigit && !allowedKeys.includes(evt.key)) {\n evt.preventDefault();\n return false;\n }\n return true;\n }\n}\n","<div class=\"login-background\">\n <div class=\"login-simple\">\n <div class=\"logo\">\n <div class=\"logo-img\"></div>\n <div class=\"logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"alert error\">\n @if (hasAvayaSocketError) { Connection issue detected. }\n @if (hasAvayaLoginError) { Invalid extension or password. }\n @if (hasAvayaLoginFailedGeneral) { Something went wrong. Please try again. }\n @if (hasAvayaLoginConflictError) { Another user is logged in with this extension. }\n @if (hasAvayaDeviceError) { Device access error. }\n </p>\n }\n\n <form [formGroup]=\"loginForm\" (ngSubmit)=\"onLoginClick()\" class=\"form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Extension</mat-label>\n <input matInput formControlName=\"ipoExtensionNo\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\" (keypress)=\"restrictNumeric($event)\" />\n <mat-icon matPrefix>call</mat-icon>\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\n <mat-form-field appearance=\"outline\" class=\"field\">\n <mat-label>Password</mat-label>\n <input matInput formControlName=\"ipoPassword\" autocomplete=\"off\" autocapitalize=\"off\" autocorrect=\"off\"\n spellcheck=\"false\"\n (keypress)=\"restrictNumeric($event)\" [type]=\"showLoginPassword ? 'text' : 'password'\" />\n <mat-icon matPrefix>lock</mat-icon>\n <button mat-icon-button matSuffix type=\"button\"\n (click)=\"showLoginPassword = !showLoginPassword && !hasAvayaSocketError\">\n <mat-icon>{{ showLoginPassword ? 'visibility_off' : 'visibility' }}</mat-icon>\n </button>\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\n <button type=\"submit\" class=\"btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { CallMetadata } from '../models/active-call.model';\nimport { APP_CONFIG } from '../config/app-config';\n\nexport interface RecordingSession {\n audioContext: AudioContext;\n recordingStream: MediaStreamAudioDestinationNode;\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 = 3000;\n private readonly AUDIO_CONTEXT_CLOSE_DELAY_MS = 200;\n\n private readonly CALL_HISTORY_API_URL = APP_CONFIG.CALL_HISTORY_API_URL;\n\n constructor(private http: HttpClient) {}\n\n startRecording(\n localMediaStream: MediaStream,\n remoteMediaStream: MediaStream,\n metadata: CallMetadata\n ): RecordingSession | undefined {\n this.stopRecording(metadata.callId);\n\n if (!localMediaStream || !remoteMediaStream) {\n console.warn(\n `[${metadata.callId}] Skipped start recording: missing remote or local stream`\n );\n return undefined;\n }\n\n const localTracks = localMediaStream.getAudioTracks();\n const remoteTracks = remoteMediaStream.getAudioTracks();\n console.debug(\n `[${metadata.callId}] Recording tracks`,\n `local=${localTracks.length}`,\n `remote=${remoteTracks.length}`\n );\n if (localTracks.length === 0 || remoteTracks.length === 0) {\n console.warn(\n `[${metadata.callId}] Skipped start recording: missing audio tracks`\n );\n return undefined;\n }\n\n const audioContext = new AudioContext();\n const recordingStream = audioContext.createMediaStreamDestination();\n\n audioContext\n .createMediaStreamSource(localMediaStream)\n .connect(recordingStream);\n audioContext\n .createMediaStreamSource(remoteMediaStream)\n .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 this.startNextChunk(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 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();\n console.debug(`[${callId}] MediaRecorder stopped`);\n } catch {}\n }\n\n setTimeout(() => {\n if (session.audioContext.state !== 'closed') {\n session.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 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 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 recorder.onstop = () => {\n if (session.stopping) return;\n setTimeout(() => this.startNextChunk(session), 0);\n };\n\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 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 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 phoneNumber: this.normalizePhoneNumberForUpload(metadata.phoneNumber),\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 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, agentId: string): string {\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '')\n .replace('T', '-')\n .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 private normalizePhoneNumberForUpload(value: string): string {\n let digits = (value ?? '').toString().replace(/\\D/g, '');\n if (digits.startsWith('00')) {\n digits = digits.slice(2);\n }\n if (digits.startsWith('0')) {\n digits = digits.slice(1);\n }\n if (digits.length === 10 && !digits.startsWith('91')) {\n digits = `91${digits}`;\n }\n return digits;\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom, Subject } from 'rxjs';\n\nimport { APP_CONFIG } from '../config/app-config';\n\ntype TranscriptMessage = {\n callId: string;\n text: string;\n isFinal: boolean;\n ts: number;\n};\n\ntype TranscriptionSession = {\n callId: string;\n ws: WebSocket;\n audioContext: AudioContext;\n processor: ScriptProcessorNode;\n sources: MediaStreamAudioSourceNode[];\n zeroGain: GainNode;\n closed: boolean;\n keepAliveTimer?: ReturnType<typeof setInterval>;\n lastAudioSentAt: number;\n};\n\n@Injectable({ providedIn: 'root' })\nexport class TranscriptionStreamService implements OnDestroy {\n private session: TranscriptionSession | null = null;\n private transcriptSubject = new Subject<TranscriptMessage>();\n readonly transcript$ = this.transcriptSubject.asObservable();\n\n private readonly SAMPLE_RATE = 16000;\n private readonly BUFFER_SIZE = 1024;\n private readonly SILENCE_RMS_THRESHOLD = 0.002;\n private readonly KEEP_ALIVE_INTERVAL_MS = 2000;\n private readonly SILENCE_FRAME_SAMPLES = 320;\n private readonly SIGNED_URL_ENDPOINT = APP_CONFIG.TRANSCRIPTION_SIGNED_URL_API;\n\n constructor(private http: HttpClient) {}\n\n ngOnDestroy(): void {\n if (this.session) {\n this.stopSession(this.session.callId);\n }\n this.transcriptSubject.complete();\n }\n\n async startSession(\n callId: string,\n localStream: MediaStream,\n remoteStream: MediaStream,\n languageCode = 'hi-IN'\n ): Promise<void> {\n if (!callId || !localStream || !remoteStream) {\n throw new Error('Missing call or media stream for transcription');\n }\n if (this.session?.callId === callId) {\n return;\n }\n if (this.session) {\n this.stopSession(this.session.callId);\n }\n\n const signedUrl = await this.fetchSignedUrl(languageCode);\n const validationError = this.validateSignedUrl(signedUrl);\n if (validationError) {\n console.error('[Transcription] Signed URL invalid:', validationError);\n throw new Error(validationError);\n }\n const ws = new WebSocket(signedUrl, 'aws.transcribe');\n ws.binaryType = 'arraybuffer';\n console.debug('[Transcription] Opening WebSocket', signedUrl);\n\n const audioContext = new AudioContext({ sampleRate: this.SAMPLE_RATE });\n const processor = audioContext.createScriptProcessor(\n this.BUFFER_SIZE,\n 1,\n 1\n );\n const zeroGain = audioContext.createGain();\n zeroGain.gain.value = 0;\n\n const sources: MediaStreamAudioSourceNode[] = [];\n const localSource = audioContext.createMediaStreamSource(localStream);\n const remoteSource = audioContext.createMediaStreamSource(remoteStream);\n sources.push(localSource, remoteSource);\n\n for (const source of sources) {\n source.connect(processor);\n }\n processor.connect(zeroGain);\n zeroGain.connect(audioContext.destination);\n\n const session: TranscriptionSession = {\n callId,\n ws,\n audioContext,\n processor,\n sources,\n zeroGain,\n closed: false,\n lastAudioSentAt: Date.now(),\n };\n\n this.session = session;\n\n ws.onopen = () => {\n audioContext.resume().catch(() => {});\n this.sendSilenceFrame(ws);\n this.sendSilenceFrame(ws);\n console.debug('[Transcription] WebSocket open');\n processor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (!this.session || this.session.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const input = this.mixToMono(event.inputBuffer);\n if (!input || input.length === 0) {\n return;\n }\n const rms = this.calculateRms(input);\n if (rms < this.SILENCE_RMS_THRESHOLD) {\n return;\n }\n const pcmBytes = this.encodePcm16(input, audioContext.sampleRate);\n if (pcmBytes.byteLength === 0) {\n return;\n }\n ws.send(pcmBytes);\n session.lastAudioSentAt = Date.now();\n };\n };\n\n ws.onerror = (err) => {\n console.error('[Transcription] WebSocket error', {\n readyState: ws.readyState,\n url: ws.url,\n error: err,\n });\n };\n\n ws.onmessage = (evt) => {\n if (!evt?.data) return;\n if (typeof evt.data === 'string') {\n this.handleTranscriptPayload(callId, evt.data);\n return;\n }\n if (evt.data instanceof Blob) {\n evt.data.text().then((text) => this.handleTranscriptPayload(callId, text));\n }\n };\n\n ws.onclose = (evt) => {\n console.warn('[Transcription] WebSocket closed', {\n code: evt?.code,\n reason: evt?.reason,\n wasClean: evt?.wasClean,\n });\n this.stopSession(callId);\n };\n\n session.keepAliveTimer = setInterval(() => {\n if (session.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const idleMs = Date.now() - session.lastAudioSentAt;\n if (idleMs >= this.KEEP_ALIVE_INTERVAL_MS) {\n this.sendSilenceFrame(ws);\n session.lastAudioSentAt = Date.now();\n }\n }, this.KEEP_ALIVE_INTERVAL_MS);\n }\n\n stopSession(callId: string): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n const session = this.session;\n session.closed = true;\n try {\n session.processor.disconnect();\n session.zeroGain.disconnect();\n for (const source of session.sources) {\n source.disconnect();\n }\n } catch {}\n if (session.keepAliveTimer) {\n clearInterval(session.keepAliveTimer);\n session.keepAliveTimer = undefined;\n }\n try {\n session.audioContext.close();\n } catch {}\n try {\n if (session.ws.readyState === WebSocket.OPEN) {\n session.ws.close();\n }\n } catch {}\n this.session = null;\n }\n\n private async fetchSignedUrl(languageCode: string): Promise<string> {\n if (!this.SIGNED_URL_ENDPOINT || this.SIGNED_URL_ENDPOINT.includes('<')) {\n throw new Error('TRANSCRIPTION_SIGNED_URL_API is not configured');\n }\n const res: any = await lastValueFrom(\n this.http.post(\n this.SIGNED_URL_ENDPOINT,\n { languageCode },\n { headers: { 'Content-Type': 'application/json' } }\n )\n );\n const url = res?.signedUrl;\n if (!url) {\n throw new Error('Signed URL missing in response');\n }\n console.debug('[Transcription] Signed URL received', {\n host: url.split('?')[0],\n languageCode,\n });\n return url;\n }\n\n // Signed URL must be used exactly as generated by Lambda.\n\n private mixToMono(buffer: AudioBuffer): Float32Array {\n const channels = buffer.numberOfChannels;\n if (channels === 1) {\n return buffer.getChannelData(0);\n }\n const length = buffer.length;\n const output = new Float32Array(length);\n for (let c = 0; c < channels; c++) {\n const data = buffer.getChannelData(c);\n for (let i = 0; i < length; i++) {\n output[i] += data[i];\n }\n }\n for (let i = 0; i < length; i++) {\n output[i] = output[i] / channels;\n }\n return output;\n }\n\n private calculateRms(samples: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i];\n sum += value * value;\n }\n return Math.sqrt(sum / samples.length);\n }\n\n private encodePcm16(input: Float32Array, sourceRate: number): Uint8Array {\n const resampled =\n sourceRate === this.SAMPLE_RATE\n ? input\n : this.downsampleBuffer(input, sourceRate, this.SAMPLE_RATE);\n if (!resampled || resampled.length === 0) {\n return new Uint8Array();\n }\n const buffer = new ArrayBuffer(resampled.length * 2);\n const view = new DataView(buffer);\n for (let i = 0; i < resampled.length; i++) {\n let s = Math.max(-1, Math.min(1, resampled[i]));\n s = s < 0 ? s * 0x8000 : s * 0x7fff;\n view.setInt16(i * 2, s, true);\n }\n return new Uint8Array(buffer);\n }\n\n private downsampleBuffer(\n input: Float32Array,\n sourceRate: number,\n targetRate: number\n ): Float32Array {\n const ratio = sourceRate / targetRate;\n const length = Math.round(input.length / ratio);\n const output = new Float32Array(length);\n let offset = 0;\n for (let i = 0; i < length; i++) {\n const nextOffset = Math.round((i + 1) * ratio);\n let sum = 0;\n let count = 0;\n for (let j = offset; j < nextOffset && j < input.length; j++) {\n sum += input[j];\n count++;\n }\n output[i] = count ? sum / count : 0;\n offset = nextOffset;\n }\n return output;\n }\n\n private sendSilenceFrame(ws: WebSocket): void {\n if (ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const silence = new Uint8Array(this.SILENCE_FRAME_SAMPLES * 2);\n ws.send(silence);\n }\n\n private validateSignedUrl(url: string): string | null {\n try {\n const parsed = new URL(url);\n if (parsed.protocol !== 'wss:') {\n return 'Signed URL must use wss://';\n }\n if (!parsed.hostname.includes('transcribestreaming')) {\n return 'Signed URL host must be transcribestreaming.*.amazonaws.com';\n }\n const requiredParams = [\n 'language-code',\n 'media-encoding',\n 'sample-rate',\n 'X-Amz-Algorithm',\n 'X-Amz-Credential',\n 'X-Amz-Date',\n 'X-Amz-Expires',\n 'X-Amz-SignedHeaders',\n 'X-Amz-Signature',\n ];\n for (const key of requiredParams) {\n if (!parsed.searchParams.get(key)) {\n return `Signed URL missing query param: ${key}`;\n }\n }\n const encoding = parsed.searchParams.get('media-encoding');\n if (encoding && encoding.toLowerCase() !== 'pcm') {\n return `Signed URL media-encoding must be pcm (got ${encoding})`;\n }\n const sampleRate = parsed.searchParams.get('sample-rate');\n if (sampleRate && sampleRate !== '16000') {\n return `Signed URL sample-rate must be 16000 (got ${sampleRate})`;\n }\n const dateStr = parsed.searchParams.get('X-Amz-Date') || '';\n const expiresStr = parsed.searchParams.get('X-Amz-Expires') || '';\n const expiresSec = Number(expiresStr);\n if (dateStr.length < 8 || Number.isNaN(expiresSec)) {\n return 'Signed URL has invalid X-Amz-Date/X-Amz-Expires';\n }\n const year = Number(dateStr.slice(0, 4));\n const month = Number(dateStr.slice(4, 6)) - 1;\n const day = Number(dateStr.slice(6, 8));\n const hour = Number(dateStr.slice(9, 11));\n const minute = Number(dateStr.slice(11, 13));\n const second = Number(dateStr.slice(13, 15));\n const signedAt = Date.UTC(year, month, day, hour, minute, second);\n if (!Number.isNaN(signedAt) && expiresSec > 0) {\n const expiresAt = signedAt + expiresSec * 1000;\n if (Date.now() > expiresAt) {\n return 'Signed URL is expired';\n }\n }\n return null;\n } catch (err) {\n return 'Signed URL is not a valid URL';\n }\n }\n\n private handleTranscriptPayload(callId: string, text: string): void {\n if (!text) return;\n try {\n const data = JSON.parse(text);\n const results = data?.Transcript?.Results || data?.results;\n if (!Array.isArray(results)) return;\n for (const result of results) {\n const transcript =\n result?.Alternatives?.[0]?.Transcript ||\n result?.alternatives?.[0]?.transcript;\n if (!transcript) continue;\n this.transcriptSubject.next({\n callId,\n text: transcript,\n isFinal: !(result.IsPartial ?? result.isPartial),\n ts: Date.now(),\n });\n }\n } catch (err) {\n console.error('[Transcription] Failed to parse transcript event', err);\n }\n }\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { CountryISO, SearchCountryField } from 'ngx-intl-tel-input';\n\n@Component({\n selector: 'app-phone-idle',\n templateUrl: './phone-idle.component.html',\n styleUrls: ['./phone-idle.component.css'],\n standalone: false,\n})\nexport class PhoneIdleComponent {\n @Input() dialForm!: FormGroup;\n @Input() contacts: any[] = [];\n @Input() showDirectoryPhonebook = false;\n @Input() isRinging = false;\n @Input() CountryISO = CountryISO;\n @Input() SearchCountryField = SearchCountryField;\n\n @Output() toggleDirectory = new EventEmitter<void>();\n @Output() clear = new EventEmitter<void>();\n @Output() makeCall = new EventEmitter<void>();\n @Output() keypadInput = new EventEmitter<string>();\n @Output() keyboardInput = new EventEmitter<KeyboardEvent>();\n\n getContactBadge(contact: any): string {\n const base = contact?.name || contact?.phone || '--';\n return base.toString().slice(0, 2).toUpperCase();\n }\n\n onToggleDirectory(): void {\n this.toggleDirectory.emit();\n }\n onClear(): void {\n this.clear.emit();\n }\n onMakeCall(): void {\n this.makeCall.emit();\n }\n onKeypadInput(d: string): void {\n this.keypadInput.emit(d);\n }\n onKeyboardInput(ev: KeyboardEvent): void {\n this.keyboardInput.emit(ev);\n }\n}\n","<form class=\"phone-shell classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"input-row classic-input\">\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)=\"onKeyboardInput($event)\"\n >\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"clear-btn\" (click)=\"onClear()\">⌫</button>\n </div>\n\n <div class=\"keypad classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"digit\">1</span>\n <span class=\"letters\">&nbsp;</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"digit\">2</span>\n <span class=\"letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"digit\">3</span>\n <span class=\"letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"digit\">4</span>\n <span class=\"letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"digit\">5</span>\n <span class=\"letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"digit\">6</span>\n <span class=\"letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"digit\">7</span>\n <span class=\"letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"digit\">8</span>\n <span class=\"letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"digit\">9</span>\n <span class=\"letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"digit\">*</span>\n <span class=\"letters\">&nbsp;</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"digit\">0</span>\n <span class=\"letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"digit\">#</span>\n <span class=\"letters\">&nbsp;</span>\n </button>\n </div>\n\n <div class=\"actions\">\n <button type=\"submit\" class=\"call-btn-main\" [disabled]=\"!this.dialForm.valid\">\n <svg viewBox=\"0 0 512 512\" width=\"22px\" height=\"22px\" 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 </button>\n </div>\n</form>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { assetUrl } from '../../../config/app-config';\n\n@Component({\n selector: 'app-phone-incoming',\n templateUrl: './phone-incoming.component.html',\n styleUrls: ['./phone-incoming.component.css'],\n standalone: false,\n})\nexport class PhoneIncomingComponent {\n incomingAvatarUrl = assetUrl('assets/images/incomingCall_avatar.gif');\n @Input() incomingCallName?: string;\n @Input() incomingNameResolved = false;\n @Input() incomingCallNumber: string | undefined;\n @Output() accept = new EventEmitter<void>();\n @Output() decline = new EventEmitter<void>();\n}\n","<div class=\"incoming-screen\">\n <div class=\"incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n &nbsp;\n }\n </div>\n <div class=\"incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"incoming-status\">CALLING...</div>\n\n <div class=\"incoming-actions\">\n <button type=\"button\" class=\"incoming-btn accept\" (click)=\"accept.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\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 />\n </svg>\n </span>\n </button>\n <button type=\"button\" class=\"incoming-btn decline\" (click)=\"decline.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\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 </button>\n </div>\n\n</div>\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { assetUrl } from '../../../config/app-config';\nimport { EntitiesSearchService } from '../../../services/entities-search.service';\n\n@Component({\n selector: 'app-phone-active',\n templateUrl: './phone-active.component.html',\n styleUrls: ['./phone-active.component.css'],\n standalone: false,\n})\nexport class PhoneActiveComponent implements OnInit {\n @Input() tenantId?: string;\n activeAvatarUrl = assetUrl('assets/images/incomingCall_avatar.gif');\n @Input() activeCallName?: string;\n @Input() activeCallNumber: string | null = null;\n @Input() activeCallDuration = 0;\n @Input() callStatusText = '';\n @Input() isConnecting = false;\n @Input() isMuted = false;\n @Input() isHeld = false;\n @Output() endCall = new EventEmitter<void>();\n @Output() toggleMute = new EventEmitter<void>();\n @Output() toggleHold = new EventEmitter<void>();\n @Output() transfer = new EventEmitter<void>();\n @Output() openContacts = new EventEmitter<void>();\n @Output() openKeypad = new EventEmitter<void>();\n @Output() startTranscription = new EventEmitter<void>();\n @Output() contactsLoaded = new EventEmitter<any[]>();\n\n private isLoadingContacts = false;\n\n constructor(private entitiesSearchService: EntitiesSearchService) {}\n\n ngOnInit(): void {\n this.fetchContacts();\n }\n\n async fetchContacts(): Promise<void> {\n if (!this.tenantId || this.isLoadingContacts) {\n return;\n }\n this.isLoadingContacts = true;\n const size = 50;\n let searchAfter: [string, string] | undefined;\n let allContacts: any[] = [];\n\n while (true) {\n try {\n const res_searchEntities: any =\n await this.entitiesSearchService.fetchContacts(\n this.tenantId,\n size,\n searchAfter\n );\n const hits = res_searchEntities?.hits?.hits;\n\n if (!Array.isArray(hits) || hits.length === 0) {\n break;\n }\n\n const mapped = hits.map((hit: any) => {\n const source = hit?._source || {};\n const phones = Array.isArray(source.phone_numbers)\n ? source.phone_numbers.filter((p: any) => typeof p === 'string' && p.trim())\n : [];\n const phone =\n phones[0] ||\n source.phone ||\n source.normalizedPhoneNumber ||\n '';\n if (!phone) {\n return null;\n }\n return {\n ...source,\n id: source.id || hit?._id,\n phone,\n };\n }).filter(Boolean);\n allContacts = [...allContacts, ...mapped];\n if (hits.length < size) {\n break;\n }\n const lastHit = hits[hits.length - 1];\n const lastSort = Array.isArray(lastHit?.sort) ? lastHit.sort : null;\n if (lastSort && lastSort.length >= 2) {\n searchAfter = [String(lastSort[0]), String(lastSort[1])];\n } else {\n break;\n }\n } catch (error) {\n console.error('Error fetching contacts:', error);\n break;\n }\n }\n\n this.contactsLoaded.emit(allContacts);\n this.isLoadingContacts = false;\n }\n\n formatDuration(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(\n 2,\n '0'\n )}`;\n }\n}\n","<div class=\"active-screen\">\n <div class=\"active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"active-duration\" [class.is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"active-controls\">\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openContacts.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 48c13.3 0 24 10.7 24 24V200H408c13.3 0 24 10.7 24 24s-10.7 24-24 24H280V376c0 13.3-10.7 24-24 24s-24-10.7-24-24V248H104c-13.3 0-24-10.7-24-24s10.7-24 24-24H232V72c0-13.3 10.7-24 24-24z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Add Call</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"transfer.emit()\">\n <svg viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M352 64c0-17.7 14.3-32 32-32h80c26.5 0 48 21.5 48 48v80c0 17.7-14.3 32-32 32s-32-14.3-32-32V128h-32c-17.7 0-32-14.3-32-32zM32 224c0-26.5 21.5-48 48-48h128c17.7 0 32 14.3 32 32s-14.3 32-32 32H96v96h112c17.7 0 32 14.3 32 32s-14.3 32-32 32H80c-26.5 0-48-21.5-48-48V224zm260.7 14.1 96-96c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-41.4 41.4H448c17.7 0 32 14.3 32 32s-14.3 32-32 32h-55.4l41.4 41.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-96-96c-12.5-12.5-12.5-32.8 0-45.3z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transfer</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleMute.emit()\">\n @if (isMuted) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M19 11a7 7 0 0 1-1.4 4.2l-1.5-1.5A5 5 0 0 0 17 11h2zm-7 7a7 7 0 0 0 4.2-1.4l1.4 1.4A9 9 0 0 1 12 20a9 9 0 0 1-7.4-3.8l1.5-1.5A7 7 0 0 0 12 18zm0-14a3 3 0 0 1 3 3v3.6l-6-6V7a3 3 0 0 1 3-3zm7.7 16.3-16-16 1.4-1.4 16 16-1.4 1.4z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V5a3 3 0 0 1 3-3zm5 9a5 5 0 0 1-10 0H5a7 7 0 0 0 14 0h-2zm-5 9a7 7 0 0 0 4.9-2H7.1A7 7 0 0 0 12 20zm-1 2h2v2h-2v-2z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" [class.active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"toggleHold.emit()\">\n @if (isHeld) {\n <svg viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M73 39C60.6 31.7 45.1 31.7 32.7 39 20.4 46.3 12.7 60.3 12.7 75.5V436.5c0 15.2 7.7 29.2 20 36.5 12.3 7.3 27.9 7.3 40.3 0L329 292.5c12.3-7.3 20-21.3 20-36.5s-7.7-29.2-20-36.5L73 39z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M48 64c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48H96c-26.5 0-48-21.5-48-48V64zm144 0c0-26.5 21.5-48 48-48h32c26.5 0 48 21.5 48 48v384c0 26.5-21.5 48-48 48h-32c-26.5 0-48-21.5-48-48V64z\"\n />\n </svg>\n }\n </button>\n <span class=\"control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.is-disabled]=\"isConnecting\" (click)=\"openKeypad.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"7\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"7\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"12\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n <circle cx=\"17\" cy=\"17\" r=\"1.6\" fill=\"currentColor\" />\n </svg>\n </button>\n <span class=\"control-label\">Keypad</span>\n </div>\n <div class=\"control-item\">\n <button type=\"button\" class=\"control-btn\" aria-label=\"Live transcription\" (click)=\"startTranscription.emit()\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 4h14a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H9l-4 3v-3H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zm2 4h10v2H7V8zm0 4h10v2H7v-2z\"\n />\n </svg>\n </button>\n <span class=\"control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"active-bottom\">\n <button type=\"button\" class=\"end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"btn-icon\">\n <svg height=\"20\" viewBox=\"0 0 640 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n 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 />\n </svg>\n </span>\n </button>\n </div>\n\n</div>\n","import { Component, ElementRef, OnDestroy, OnInit, AfterViewInit, 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';\nimport { APP_CONFIG, assetUrl, formatDialOutNumber } from '../../config/app-config';\nimport { RecordingManagerService } from '../../services/recording-manager.service';\nimport { TranscriptionStreamService } from '../../services/transcription-stream.service';\n\n@Component({\n selector: 'app-phone',\n templateUrl: './phone.component.html',\n styleUrls: ['./phone.component.css'],\n standalone: false,\n})\nexport class PhoneComponent implements OnInit, AfterViewInit, OnDestroy {\n @Input() contacts: any[] = [];\n @Input() tenantId?: string;\n @Input() agentId?: string;\n @Output() callScreenChange = new EventEmitter<boolean>();\n private _isActiveCall = false;\n @Input()\n set isActiveCall(value: boolean) {\n this._isActiveCall = value;\n this.emitCallScreenState();\n }\n get isActiveCall(): boolean {\n return this._isActiveCall;\n }\n @Input() activeCallNumber: string | null = null;\n @Input() incomingCallName?: string | null;\n @Input() incomingNameResolved = false;\n @Input() activeCallName?: string | null;\n @Input() serverIp?: string;\n @Input() serverPort?: number;\n @Input() stunIp?: string;\n @Input() stunPort?: number;\n @Input() turnIp?: string;\n @Input() turnPort?: number;\n @Input() configurationMode?: string;\n @Output() makeCallEv = new EventEmitter<string>();\n @Output() endCallEv = new EventEmitter<void>();\n @ViewChild('audioElement') audioElement: any;\n private callStateSub?: any;\n private endToneTimeout?: ReturnType<typeof setTimeout>;\n private suppressHangupToneOnce = false;\n private transferStatusSub?: any;\n private remoteStreamSub?: any;\n private callTerminateSub?: any;\n private outgoingDialSub?: any;\n private transcriptionSub?: any;\n private lastRemoteStream: MediaStream | null = null;\n private lastLocalStream: MediaStream | null = null;\n private currentCallId: string | null = null;\n private pendingOutgoing = false;\n private transcriptionActiveCallId: string | null = null;\n private pendingTranscriptionCallId: string | null = null;\n\n dialForm!: FormGroup;\n directoryForm!: FormGroup;\n showDirectoryPhonebook = false;\n isTransferMode = false;\n isAddCallMode = false;\n directoryTab: 'contacts' | 'dialpad' = 'contacts';\n directoryNumber = '';\n contactSearch = '';\n directoryDigits = [\n { digit: '1', letters: '' },\n { digit: '2', letters: 'ABC' },\n { digit: '3', letters: 'DEF' },\n { digit: '4', letters: 'GHI' },\n { digit: '5', letters: 'JKL' },\n { digit: '6', letters: 'MNO' },\n { digit: '7', letters: 'PQRS' },\n { digit: '8', letters: 'TUV' },\n { digit: '9', letters: 'WXYZ' },\n { digit: '*', letters: '' },\n { digit: '0', letters: '+' },\n { digit: '#', letters: '' },\n ];\n incomingCallSubscription: any;\n incomingCallNumber: string | undefined;\n isMuted = false;\n isHeld = false;\n activeCallDuration = 0;\n callStatusText = '';\n transferError = '';\n transferSuccess = '';\n transferPending = false;\n private transferErrorTimeout?: ReturnType<typeof setTimeout>;\n private activeCallTimer?: ReturnType<typeof setInterval>;\n private muteToggleInProgress = false;\n private holdToggleInProgress = false;\n isKeypadOpen = false;\n isTranscriptionOpen = false;\n transcriptText = '';\n private transcriptHistory: string[] = [];\n private transcriptSegments: Array<{ ts: number; text: string }> = [];\n private transcriptStartedAt = 0;\n private transcriptEndedAt = 0;\n autoDownloadSummaryOnEnd = false;\n summaryText = '';\n dtmfBuffer = '';\n private phoneUtil = PhoneNumberUtil.getInstance();\n\n CountryISO = CountryISO;\n SearchCountryField = SearchCountryField;\n isRinging = false;\n audio: any;\n get isConnecting(): boolean {\n return this.callStatusText === 'Calling...';\n }\n\n constructor(\n private cdr: ChangeDetectorRef,\n private formBuilder: FormBuilder,\n private avayaIpoService: AvayaIPOService,\n private authenticationService: AuthenticationService,\n private recordingManagerService: RecordingManagerService,\n private transcriptionStreamService: TranscriptionStreamService\n ) {\n this.dialForm = this.formBuilder.group({\n phoneNumber: ['', Validators.required],\n });\n this.directoryForm = this.formBuilder.group({\n phoneNumber: ['', Validators.required],\n });\n }\n\n ngOnInit(): void {\n window.addEventListener('keydown', this.handleKeyboardInput);\n this.emitCallScreenState();\n\n const lastIncoming = this.avayaIpoService.getLastIncomingCall();\n if (lastIncoming) {\n this.handleIncomingCall(lastIncoming);\n }\n\n this.incomingCallSubscription =\n this.avayaIpoService.incomingCallSubject.subscribe((data) => {\n this.handleIncomingCall(data);\n });\n\n this.outgoingDialSub = this.avayaIpoService.outgoingDialSubject.subscribe(\n (payload) => {\n if (!payload?.dialed || this.isRinging) {\n return;\n }\n this.callStatusText = 'Calling...';\n this._isActiveCall = true;\n this.pendingOutgoing = true;\n this.currentCallId = null;\n this.stopCallTimer();\n this.startCallTimer(true);\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n );\n\n this.transcriptionSub =\n this.transcriptionStreamService.transcript$.subscribe((evt) => {\n if (!evt || !evt.text) {\n return;\n }\n if (\n this.transcriptionActiveCallId &&\n evt.callId !== this.transcriptionActiveCallId\n ) {\n return;\n }\n this.applyTranscriptUpdate(evt.text, evt.isFinal, evt.ts);\n });\n\n this.callStateSub = this.avayaIpoService.callStateSubject.subscribe(\n (evt) => {\n if (!evt?.state) {\n return;\n }\n if (\n evt.callId &&\n (evt.state === CallState.PROGRESSING ||\n evt.state === CallState.RINGING ||\n evt.state === CallState.CONNECTED ||\n evt.state === CallState.HELD)\n ) {\n if (!this.currentCallId || this.pendingOutgoing) {\n this.currentCallId = evt.callId;\n this.pendingOutgoing = false;\n }\n }\n if (evt.state === CallState.CONNECTED) {\n this.isRinging = false;\n this._isActiveCall = true;\n if (evt.callId) {\n this.currentCallId = evt.callId;\n }\n this.pendingOutgoing = false;\n this.callStatusText = '';\n this.startCallTimer(false);\n this.avayaIpoService.clearLastIncomingCall();\n console.debug('[Phone] Call connected, starting recording', evt.callId);\n this.startRecordingForCall(evt.callId);\n if (evt.callId) {\n this.startTranscriptionForCall(evt.callId);\n }\n this.emitCallScreenState();\n }\n if (evt.state === CallState.INCOMING || evt.state === CallState.RINGING) {\n // Ring tone is handled by AvayaIPOService.\n }\n if (evt.state === CallState.DISCONNECTED || evt.state === CallState.FAILED) {\n if (evt.callId && this.currentCallId && evt.callId !== this.currentCallId) {\n return;\n }\n if (evt.callId) {\n this.recordingManagerService.stopRecording(evt.callId);\n }\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n }\n this.isRinging = false;\n this._isActiveCall = false;\n this.isMuted = false;\n this.isHeld = false;\n this.isKeypadOpen = false;\n this.isTranscriptionOpen = false;\n this.stopTranscription(evt.callId);\n this.dtmfBuffer = '';\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.directoryForm.reset();\n this.stopCallTimer();\n this.callStatusText = 'Disconnected';\n this.incomingCallNumber = undefined;\n this.currentCallId = null;\n this.pendingOutgoing = false;\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.emitCallScreenState();\n if (this.suppressHangupToneOnce) {\n this.suppressHangupToneOnce = false;\n this.finishDisconnectWithoutTone();\n } else {\n this.playHangupToneAndThenIdle();\n }\n }\n if (evt.state === CallState.HELD) {\n if (evt.callId) {\n this.recordingManagerService.stopRecording(evt.callId);\n }\n }\n }\n );\n\n this.transferStatusSub = this.avayaIpoService.transferStatusSubject.subscribe(\n (status) => {\n if (status?.success) {\n this.transferError = '';\n this.transferSuccess = 'Transfer successful';\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n this.transferErrorTimeout = undefined;\n }\n if (this.transferPending) {\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.directoryForm.reset();\n }\n this.transferErrorTimeout = setTimeout(() => {\n this.transferSuccess = '';\n this.cdr.detectChanges();\n }, 2000);\n } else {\n this.transferSuccess = '';\n this.transferError = status?.message || 'Failed to transfer';\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n }\n this.transferErrorTimeout = setTimeout(() => {\n this.transferError = '';\n this.cdr.detectChanges();\n }, 2500);\n }\n this.transferPending = false;\n this.cdr.detectChanges();\n }\n );\n\n this.remoteStreamSub = this.avayaIpoService.remoteStream$.subscribe((r) => {\n if (r?.stream?.getAudioTracks?.().length) {\n this.lastRemoteStream = r.stream;\n this.lastLocalStream = this.avayaIpoService.localStream;\n if (this.pendingTranscriptionCallId) {\n this.startTranscriptionForCall(this.pendingTranscriptionCallId);\n }\n }\n });\n\n this.callTerminateSub = this.avayaIpoService.callTerminateSubject.subscribe(\n (evt) => {\n if (evt?.callId && this.currentCallId && evt.callId !== this.currentCallId) {\n return;\n }\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n }\n this.isRinging = false;\n this._isActiveCall = false;\n this.incomingCallNumber = undefined;\n this.currentCallId = null;\n this.pendingOutgoing = false;\n this.isTranscriptionOpen = false;\n this.stopTranscription(evt?.callId);\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }\n );\n }\n\n\n ngAfterViewInit(): void {\n this.audio = this.audioElement?.nativeElement;\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('keydown', this.handleKeyboardInput);\n this.callStateSub?.unsubscribe?.();\n this.transferStatusSub?.unsubscribe?.();\n this.remoteStreamSub?.unsubscribe?.();\n this.callTerminateSub?.unsubscribe?.();\n this.outgoingDialSub?.unsubscribe?.();\n this.transcriptionSub?.unsubscribe?.();\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n }\n this.stopCallTimer();\n this.stopTranscription();\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 const e164 = this.formatE164(\n phone?.internationalNumber || phone?.number || phone\n );\n if (!e164) {\n console.warn('Invalid phone number for dial:', phone);\n return;\n }\n const dialOut = this.formatDialOut(e164);\n this.callStatusText = 'Calling...';\n this.isRinging = false;\n this._isActiveCall = true;\n this.emitCallScreenState();\n this.makeCallEv.emit(dialOut);\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 private formatE164(value: string | undefined | null): string {\n if (!value || typeof value !== 'string') {\n return '';\n }\n const cleaned = value.replace(/\\s+/g, '');\n if (cleaned.startsWith('+')) {\n return cleaned;\n }\n if (cleaned.startsWith('00')) {\n return `+${cleaned.slice(2)}`;\n }\n try {\n const parsed = this.phoneUtil.parse(cleaned, 'IN');\n if (this.phoneUtil.isValidNumber(parsed)) {\n return this.phoneUtil.format(parsed, PhoneNumberFormat.E164);\n }\n } catch {\n // Fall back to cleaned value when parsing fails.\n }\n return cleaned;\n }\n\n private formatDialOut(e164: string): string {\n return formatDialOutNumber(e164);\n }\n\n\n declineAvayaCall() {\n this.suppressHangupToneOnce = true;\n this.isRinging = false;\n this._isActiveCall = false;\n this.pendingOutgoing = false;\n this.avayaIpoService.clearOutgoingDial();\n this.audio?.pause?.();\n if (this.audio) {\n this.audio.currentTime = 0;\n }\n this.emitCallScreenState();\n this.avayaIpoService.agentIdle();\n this.cdr.detectChanges();\n this.endCallEv.emit();\n }\n\n acceptAvayaCAll() {\n this.avayaIpoService.answerCall();\n // this.headerComponent.showAvayaIpo = true;\n this.isRinging = false;\n this._isActiveCall = true;\n this.callStatusText = '';\n this.startCallTimer();\n this.avayaIpoService.clearLastIncomingCall();\n this.emitCallScreenState();\n }\n\n onEndActiveCall(): void {\n this._isActiveCall = false;\n this.stopCallTimer();\n this.callStatusText = 'Disconnected';\n this.suppressHangupToneOnce = true;\n this.avayaIpoService.clearLastIncomingCall();\n this.avayaIpoService.clearOutgoingDial();\n this.isKeypadOpen = false;\n this.dtmfBuffer = '';\n this.emitCallScreenState();\n this.endCallEv.emit();\n }\n\n private playHangupToneAndThenIdle(): void {\n if (!this.audio) {\n return;\n }\n try {\n this.audio.pause();\n this.audio.currentTime = 0;\n this.audio.loop = false;\n this.audio.src = assetUrl('assets/sounds/hangup_tone.mp3');\n this.audio.loop = false;\n void this.audio.play().catch(() => {\n // Ignore aborts caused by immediate pause.\n });\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n }\n this.endToneTimeout = setTimeout(() => {\n this.audio?.pause?.();\n if (this.audio) {\n this.audio.currentTime = 0;\n }\n this._isActiveCall = false;\n this.callStatusText = '';\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }, 2000);\n } catch (err) {\n console.warn('Failed to play hangup tone', err);\n }\n }\n\n private finishDisconnectWithoutTone(): void {\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n }\n this.endToneTimeout = setTimeout(() => {\n this._isActiveCall = false;\n this.callStatusText = '';\n this.emitCallScreenState();\n this.cdr.detectChanges();\n }, 1000);\n }\n\n private handleIncomingCall(data: { callId: string; farEndNumber: string }): void {\n const phoneUtil = PhoneNumberUtil.getInstance();\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._isActiveCall = false;\n this.showDirectoryPhonebook = false;\n this.isKeypadOpen = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.contactSearch = '';\n this.directoryForm.reset();\n this.callStatusText = '';\n this.isRinging = true;\n if (this.endToneTimeout) {\n clearTimeout(this.endToneTimeout);\n this.endToneTimeout = undefined;\n }\n this.emitCallScreenState();\n }\n\n onActiveOpenContacts(): void {\n this.isTransferMode = false;\n this.isAddCallMode = true;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n this.showDirectoryPhonebook = true;\n }\n\n onActiveOpenKeypad(): void {\n this.isKeypadOpen = true;\n }\n\n closeKeypad(): void {\n this.isKeypadOpen = false;\n }\n\n private startTranscriptionForCall(callId: string): void {\n if (!callId) {\n return;\n }\n if (this.transcriptionActiveCallId === callId) {\n return;\n }\n if (!this.lastLocalStream || !this.lastRemoteStream) {\n this.pendingTranscriptionCallId = callId;\n return;\n }\n this.pendingTranscriptionCallId = null;\n this.transcriptSegments = [];\n this.transcriptHistory = [];\n this.transcriptText = '';\n this.transcriptStartedAt = Date.now();\n this.transcriptEndedAt = 0;\n this.transcriptionStreamService\n .startSession(callId, this.lastLocalStream, this.lastRemoteStream, 'hi-IN')\n .then(() => {\n this.transcriptionActiveCallId = callId;\n })\n .catch((err) => {\n console.error('[Phone] Failed to start transcription', err);\n });\n }\n\n private applyTranscriptUpdate(text: string, isFinal: boolean, ts: number): void {\n const trimmed = (text || '').trim();\n if (!trimmed) {\n return;\n }\n if (isFinal) {\n this.transcriptHistory.push(trimmed);\n this.transcriptSegments.push({ ts, text: trimmed });\n this.transcriptText = this.transcriptHistory.join(' ');\n } else {\n this.transcriptText = [...this.transcriptHistory, trimmed].join(' ');\n }\n this.cdr.detectChanges();\n }\n\n openTranscription(): void {\n this.isTranscriptionOpen = true;\n }\n\n closeTranscription(): void {\n this.isTranscriptionOpen = false;\n }\n\n private stopTranscription(callId?: string): void {\n if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.stopSession(this.transcriptionActiveCallId);\n this.transcriptionActiveCallId = null;\n this.pendingTranscriptionCallId = null;\n }\n this.transcriptEndedAt = Date.now();\n\n if (this.autoDownloadSummaryOnEnd && this.transcriptSegments.length > 0) {\n this.generateAndDownloadSummary(callId);\n }\n\n this.transcriptText = '';\n this.transcriptHistory = [];\n this.transcriptSegments = [];\n this.transcriptStartedAt = 0;\n this.transcriptEndedAt = 0;\n this.isTranscriptionOpen = false;\n }\n\n private generateAndDownloadSummary(callId?: string): void {\n const fullText = this.transcriptSegments.map((s) => s.text).join(' ');\n if (!fullText.trim()) return;\n\n const bullets = this.buildExtractiveSummary(fullText, 5);\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(`**Start:** ${this.transcriptStartedAt ? new Date(this.transcriptStartedAt).toISOString() : '-'}`);\n mdLines.push(`**End:** ${this.transcriptEndedAt ? new Date(this.transcriptEndedAt).toISOString() : '-'}`);\n const durMs =\n this.transcriptStartedAt && this.transcriptEndedAt\n ? this.transcriptEndedAt - this.transcriptStartedAt\n : 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 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')], {\n type: 'text/markdown;charset=utf-8',\n });\n const name = `call-${callId || 'unknown'}-summary.md`;\n this.downloadBlobFile(mdBlob, name);\n this.summaryText = mdLines.join('\\n');\n }\n\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(\n (\n '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'\n ).split(',')\n );\n\n const tokenize = (s: string) =>\n s\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w && !stop.has(w));\n\n const freq = new Map<string, number>();\n for (const s of sents) {\n for (const w of tokenize(s)) {\n freq.set(w, (freq.get(w) || 0) + 1);\n }\n }\n\n const scored = sents.map((s, i) => {\n const words = tokenize(s);\n const score =\n words.reduce((acc, w) => acc + (freq.get(w) || 0), 0) /\n 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 =\n /(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 =\n text.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi) || [];\n const amounts =\n text.match(/(?:₹|\\$|INR\\s?)\\s?\\d[\\d,]*(?:\\.\\d+)?/g) || [];\n const dates =\n text.match(\n /\\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 ) || [];\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): void {\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 onClosePhonebook(): void {\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.contactSearch = '';\n this.directoryForm.reset();\n this.transferError = '';\n this.transferSuccess = '';\n this.transferPending = false;\n if (this.transferErrorTimeout) {\n clearTimeout(this.transferErrorTimeout);\n this.transferErrorTimeout = undefined;\n }\n }\n\n onContactsLoaded(list: any[]): void {\n this.contacts = Array.isArray(list) ? list : [];\n }\n\n get filteredContacts(): any[] {\n const term = this.contactSearch.trim().toLowerCase();\n if (!term) {\n return this.contacts;\n }\n return this.contacts.filter((contact) => {\n const name = (contact?.name || '').toString().toLowerCase();\n const phone = (contact?.phone || '').toString().toLowerCase();\n return name.includes(term) || phone.includes(term);\n });\n }\n\n onSelectContact(contact: any): void {\n const value = contact?.phone || '';\n if (value) {\n const dialOut = this.formatDialOutFromInput(value);\n if (this.isTransferMode) {\n this.transferSuccess = '';\n this.avayaIpoService.transferCall(\n this.formatTransferTargetFromInput(value),\n 'unAttended'\n );\n this.transferPending = true;\n return;\n } else {\n if (this.isAddCallMode) {\n this.avayaIpoService.doHold();\n }\n this.makeCallEv.emit(dialOut);\n }\n }\n this.showDirectoryPhonebook = false;\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryForm.reset();\n this.transferError = '';\n this.transferPending = false;\n }\n\n toggleMute(): void {\n if (this.muteToggleInProgress) {\n return;\n }\n this.muteToggleInProgress = true;\n setTimeout(() => {\n this.muteToggleInProgress = false;\n }, 500);\n if (this.isMuted) {\n this.avayaIpoService.doUnMute();\n } else {\n this.avayaIpoService.doMute();\n }\n this.isMuted = !this.isMuted;\n }\n\n toggleHold(): void {\n if (this.holdToggleInProgress) {\n return;\n }\n this.holdToggleInProgress = true;\n setTimeout(() => {\n this.holdToggleInProgress = false;\n }, 800);\n if (this.isHeld) {\n this.avayaIpoService.doUnHold();\n } else {\n this.avayaIpoService.doHold();\n }\n this.isHeld = !this.isHeld;\n }\n\n onTransferCall(): void {\n this.isTransferMode = true;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n this.transferSuccess = '';\n this.showDirectoryPhonebook = true;\n }\n\n private emitCallScreenState(): void {\n this.callScreenChange.emit(this.isRinging || this.isActiveCall);\n }\n\n private startCallTimer(reset = true): void {\n if (this.activeCallTimer) {\n return;\n }\n if (reset) {\n this.activeCallDuration = 0;\n }\n this.activeCallTimer = setInterval(() => {\n this.activeCallDuration += 1;\n this.cdr.markForCheck();\n }, 1000);\n }\n\n private stopCallTimer(): void {\n if (this.activeCallTimer) {\n clearInterval(this.activeCallTimer);\n this.activeCallTimer = undefined;\n }\n this.activeCallDuration = 0;\n }\n\n // Idle handlers forwarded to existing logic\n onIdleToggleDirectory(): void {\n this.showDirectoryPhonebook = !this.showDirectoryPhonebook;\n if (this.showDirectoryPhonebook) {\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.transferError = '';\n }\n }\n onIdleClear(): void {\n this.onClear();\n }\n onIdleMakeCall(): void {\n this.makeCall();\n }\n onIdleKeypadInput(digit: string): void {\n this.handleKeypadInput(digit);\n }\n onIdleKeyboardInput(ev: KeyboardEvent): void {\n this.handleKeyboardInput(ev);\n }\n\n setDirectoryTab(tab: 'contacts' | 'dialpad'): void {\n this.directoryTab = tab;\n if (tab === 'dialpad') {\n this.contactSearch = '';\n }\n }\n\n onDirectoryKeypad(digit: string): void {\n const control = this.directoryForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n this.updateDirectoryControl(current + digit);\n }\n\n onDirectoryBackspace(): void {\n const control = this.directoryForm.get('phoneNumber');\n const current = control?.value?.number?.replace(/\\s/g, '') || '';\n if (!current) {\n return control?.reset();\n }\n const updated = current.slice(0, -1);\n updated ? this.updateDirectoryControl(updated) : control?.reset();\n }\n\n onDirectoryUseNumber(): void {\n const raw = this.directoryForm.value.phoneNumber;\n const value =\n raw?.internationalNumber ||\n raw?.number ||\n (typeof raw === 'string' ? raw : '') ||\n this.directoryNumber;\n if (!value) {\n return;\n }\n const dialOut = this.formatDialOutFromInput(value);\n if (this.isTransferMode) {\n this.transferSuccess = '';\n this.avayaIpoService.transferCall(\n this.formatTransferTargetFromInput(value),\n 'unAttended'\n );\n this.transferPending = true;\n return;\n } else {\n if (this.isAddCallMode) {\n this.avayaIpoService.doHold();\n }\n this.makeCallEv.emit(dialOut);\n }\n this.showDirectoryPhonebook = false;\n\n this.isTransferMode = false;\n this.isAddCallMode = false;\n this.directoryTab = 'contacts';\n this.directoryNumber = '';\n this.directoryForm.reset();\n this.transferError = '';\n this.transferPending = false;\n }\n\n onDirectoryClear(): void {\n this.directoryForm.reset();\n this.directoryNumber = '';\n }\n\n onDtmfDigit(digit: string): void {\n this.dtmfBuffer += digit;\n this.avayaIpoService.sendDTMF(digit);\n }\n\n onDtmfBackspace(): void {\n if (!this.dtmfBuffer) {\n return;\n }\n this.dtmfBuffer = this.dtmfBuffer.slice(0, -1);\n }\n\n private updateDirectoryControl(value: string): void {\n setTimeout(() => {\n this.directoryForm.get('phoneNumber')?.setValue(value);\n this.directoryNumber = value;\n this.cdr.detectChanges();\n });\n }\n\n private formatDialOutFromInput(value: string): string {\n const e164 = this.formatE164(value);\n return this.formatDialOut(e164 || value);\n }\n\n private formatTransferTargetFromInput(value: string): string {\n const e164 = this.formatE164(value);\n return formatDialOutNumber(e164 || value);\n }\n\n private async startRecordingForCall(callId: string): Promise<void> {\n if (!callId) {\n return;\n }\n console.debug('[Phone] startRecordingForCall', callId);\n let local = this.lastLocalStream || this.avayaIpoService.localStream;\n const hasAudio = (stream?: MediaStream | null) =>\n stream instanceof MediaStream && stream.getAudioTracks().length > 0;\n const metadata = {\n tenantId: this.tenantId || '',\n agentId: this.agentId || '',\n phoneNumber: this.activeCallNumber || '',\n callId,\n };\n\n if (!hasAudio(local)) {\n console.warn('[Phone] Missing local audio, requesting mic', callId);\n try {\n await this.avayaIpoService.initLocalMic();\n } catch (err) {\n console.warn('[Phone] initLocalMic failed', err);\n }\n local = this.lastLocalStream || this.avayaIpoService.localStream;\n if (!hasAudio(local)) {\n console.warn('[Phone] Still missing local audio for recording', callId);\n return;\n }\n }\n\n const remote = this.lastRemoteStream;\n if (hasAudio(remote)) {\n this.recordingManagerService.startRecording(local!, remote!, metadata);\n return;\n }\n\n const remoteSub = this.avayaIpoService.remoteStream$.subscribe((r) => {\n if (!r || r.callId !== callId) {\n return;\n }\n if (!hasAudio(r.stream)) {\n return;\n }\n const freshLocal = this.avayaIpoService.localStream;\n if (!hasAudio(freshLocal)) {\n return;\n }\n console.debug('[Phone] Remote audio ready, restarting recording', callId);\n this.recordingManagerService.startRecording(\n freshLocal!,\n r.stream,\n metadata\n );\n remoteSub.unsubscribe();\n });\n }\n}\n","<div class=\"phone-container\">\n <audio id=\"sd_call_ring\" #audioElement></audio>\n\n @if (isRinging) {\n <app-phone-incoming [incomingCallNumber]=\"incomingCallNumber\" [incomingCallName]=\"incomingCallName\" [incomingNameResolved]=\"incomingNameResolved\" (accept)=\"acceptAvayaCAll()\"\n (decline)=\"declineAvayaCall()\"></app-phone-incoming>\n } @else if (isActiveCall) {\n <app-phone-active [tenantId]=\"tenantId\" [activeCallNumber]=\"activeCallNumber\" [activeCallName]=\"activeCallName\"\n [activeCallDuration]=\"activeCallDuration\" [callStatusText]=\"callStatusText\" [isConnecting]=\"isConnecting\"\n [isMuted]=\"isMuted\" [isHeld]=\"isHeld\"\n (toggleMute)=\"toggleMute()\" (toggleHold)=\"toggleHold()\" (transfer)=\"onTransferCall()\"\n (openContacts)=\"onActiveOpenContacts()\" (openKeypad)=\"onActiveOpenKeypad()\"\n (startTranscription)=\"openTranscription()\" (contactsLoaded)=\"onContactsLoaded($event)\"\n (endCall)=\"onEndActiveCall()\"></app-phone-active>\n } @else {\n <app-phone-idle [dialForm]=\"dialForm\" [contacts]=\"contacts\" [showDirectoryPhonebook]=\"showDirectoryPhonebook\"\n [isRinging]=\"isRinging\" [CountryISO]=\"CountryISO\" [SearchCountryField]=\"SearchCountryField\"\n (toggleDirectory)=\"onIdleToggleDirectory()\" (clear)=\"onIdleClear()\" (makeCall)=\"onIdleMakeCall()\"\n (keypadInput)=\"onIdleKeypadInput($event)\" (keyboardInput)=\"onIdleKeyboardInput($event)\"></app-phone-idle>\n }\n</div>\n\n@if (showDirectoryPhonebook) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"onClosePhonebook()\">‹</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>+</button>\n </div>\n @if (transferError) {\n <div class=\"phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"phonebook-tabs\">\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"phonebook-tab\" [class.active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"phonebook-search\">\n <span class=\"search-icon\">🔍</span>\n <input type=\"text\" placeholder=\"Search\" [value]=\"contactSearch\"\n (input)=\"contactSearch = ($any($event.target).value)\" />\n </div>\n\n @if (filteredContacts?.length) {\n @for (contact of filteredContacts; track contact.id ?? contact.phone ?? $index) {\n <button type=\"button\" class=\"phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'phone_number_sd'\"\n [preferredCountries]=\"['in']\" [customPlaceholder]=\"'Phone Number'\" [enableAutoCountrySelect]=\"false\"\n [enablePlaceholder]=\"false\" [searchCountryFlag]=\"true\"\n [searchCountryField]=\"[SearchCountryField.Iso2, SearchCountryField.Name]\" [selectFirstCountry]=\"false\"\n [selectedCountryISO]=\"CountryISO.India\" [maxLength]=\"15\" [phoneValidation]=\"true\" [separateDialCode]=\"true\">\n </ngx-intl-tel-input>\n <button type=\"button\" class=\"dialpad-backspace\" (click)=\"onDirectoryBackspace()\">⌫</button>\n </div>\n\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"dialpad-digit\">{{ item.digit }}</span>\n <span class=\"dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" [disabled]=\"!(directoryForm.valid || directoryNumber)\"\n (click)=\"onDirectoryUseNumber()\">\n {{ isTransferMode ? 'Transfer' : 'Add Call' }}\n </button>\n </div>\n }\n </div>\n </div>\n</div>\n}\n\n@if (isKeypadOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet keypad-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeKeypad()\">‹</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-kicker\">DTMF</div>\n <div class=\"phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"phonebook-add\" disabled>+</button>\n </div>\n\n <div class=\"dialpad-input dtmf-input\">\n <div class=\"dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"phonebook-dialpad\">\n <div class=\"dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"phonebook-overlay\">\n <div class=\"phonebook-sheet transcription-sheet\">\n <div class=\"phonebook-header\">\n <button type=\"button\" class=\"phonebook-back\" (click)=\"closeTranscription()\">‹</button>\n <div class=\"phonebook-titles\">\n <div class=\"phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"transcription-body\">\n @if (transcriptText) {\n <div class=\"transcription-text\">{{ transcriptText }}</div>\n } @else {\n <div class=\"transcription-placeholder\">Live transcription will appear here.</div>\n }\n </div>\n </div>\n</div>\n}\n","import { ChangeDetectorRef, Component, EventEmitter, HostBinding, Input, OnInit, OnDestroy, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { AvayaIPOService, CallState, LoginState } from './services/avaya-ipo.service';\nimport { APP_CONFIG, assetUrl, formatDialOutNumber } from './config/app-config';\nimport { Subscription } from 'rxjs';\nimport { CountryService } from './services/country.service';\nimport { PhoneNumberLookupService } from './services/phone-number-lookup.service';\nimport { EntitiesSearchService } from './services/entities-search.service';\n\n@Component({\n selector: 'snugdesk-avaya-ipo-widget',\n templateUrl: './avaya-ipo-widget.component.html',\n styleUrls: ['./avaya-ipo-widget.component.css'],\n standalone: false,\n})\nexport class AvayaIPOWidgetComponent implements OnInit, OnDestroy {\n @HostBinding('class.dark-mode') hostDarkMode = false;\n private readonly STORAGE_KEY = 'avayaIpoWidgetLogin';\n // Public API inputs (kept for compatibility with host apps)\n @Input() isVisible = true;\n @Input() configurationMode?: string;\n @Input() avayaIPOServerIP?: string;\n @Input() avayaIPOServerPort?: number;\n @Input() avayaIPOServerStunServerIP?: string;\n @Input() avayaIPOServerStunServerPort?: number;\n @Input() avayaIPOServerTurnServerIP?: string;\n @Input() avayaIPOServerTurnServerPort?: number;\n @Input() tenantId!: string;\n @Input() userId!: string;\n\n @Output() notificationEvent: EventEmitter<number> = new EventEmitter<number>();\n readonly avayaLogoUrl = assetUrl('assets/images/logo-avaya_small_color.svg');\n\n isReconnectingInProgress = false;\n isFailoverInProgress = false;\n isFailbackInProgress = false;\n\n showLoginForm = true;\n showLoginLoader = false;\n hasAvayaSocketError = false;\n hasAvayaLoginError = false;\n hasAvayaLoginFailedGeneral = false;\n hasAvayaLoginConflictError = false;\n hasAvayaDeviceError = false;\n private awlScriptPromise?: Promise<void>;\n\n loginForm!: FormGroup;\n activeTab: 'history' | 'contacts' | 'keypad' | 'settings' = 'keypad';\n private loginSub?: Subscription;\n private incomingCallSub?: Subscription;\n private callStateSub?: Subscription;\n hideTabs = false;\n darkModeEnabled = false;\n activeCallNumber: string | null = null;\n incomingCallName: string | null = null;\n incomingNameResolved = false;\n activeCallName: string | null = null;\n private callLogIndex = new Map<\n string,\n { direction: 'inbound' | 'outbound'; phoneNumber: any; connected: boolean }\n >();\n private pendingDisconnectSide: 'AGENT' | 'CALLER' | null = null;\n private callStartTimes = new Map<string, number>();\n\n constructor(\n private formBuilder: FormBuilder,\n private avayaIPOService: AvayaIPOService,\n private cdr: ChangeDetectorRef,\n private countryService: CountryService,\n private phoneNumberLookupService: PhoneNumberLookupService,\n private entitiesSearchService: EntitiesSearchService\n ) {}\n\n ngOnInit(): void {\n this.restoreThemePreference();\n this.loginForm = this.formBuilder.group({\n ipoExtensionNo: ['', Validators.required],\n ipoPassword: ['', Validators.required],\n });\n\n this.loginSub = this.avayaIPOService.loginStatus$.subscribe((status) => {\n this.handleLoginStatus(status);\n });\n\n this.incomingCallSub = this.avayaIPOService.incomingCallSubject.subscribe(\n async ({ callId, farEndNumber }) => {\n if (!callId) {\n return;\n }\n this.activeTab = 'keypad';\n const phoneNumber = (farEndNumber ?? '').toString();\n this.activeCallNumber = phoneNumber;\n this.incomingCallName = null;\n this.incomingNameResolved = false;\n this.activeCallName = null;\n const normalizedSearch = this.normalizePhoneForSearch(phoneNumber);\n const cachedName = this.entitiesSearchService.getCachedName(\n this.tenantId,\n normalizedSearch\n );\n if (cachedName) {\n this.incomingCallName = cachedName;\n this.activeCallName = cachedName;\n this.incomingNameResolved = true;\n }\n\n const [lookupResult, callerName] = await Promise.all([\n this.getLookupPhoneNumber(phoneNumber),\n this.getOpenSearchCallerName(normalizedSearch),\n ]);\n const mapNumber =\n lookupResult?.lookupPhoneNumber?.['local-number']?.replace(/\\s+/g, '') ||\n lookupResult?.normalizedPhoneNumber ||\n phoneNumber;\n this.activeCallNumber = mapNumber;\n if (callerName) {\n this.incomingCallName = callerName;\n this.activeCallName = callerName;\n }\n this.incomingNameResolved = true;\n const phonePayload: any = {\n ...(lookupResult || { normalizedPhoneNumber: mapNumber }),\n };\n if (callerName) {\n phonePayload.name = callerName;\n }\n this.callLogIndex.set(callId, {\n direction: 'inbound',\n phoneNumber: phonePayload,\n connected: false,\n });\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: phonePayload,\n direction: 'inbound',\n duration: 0,\n status: 'incoming',\n timestamp: new Date().toISOString(),\n callinginfo: 'ringing',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (incoming) failed', err),\n });\n }\n );\n\n this.callStateSub = this.avayaIPOService.callStateSubject.subscribe(\n ({ callId, state }) => {\n if (!callId || !state) {\n return;\n }\n const meta = this.callLogIndex.get(callId);\n if (!meta) {\n return;\n }\n if (state === CallState.CONNECTED) {\n this.avayaIPOService.clearLastIncomingCall();\n meta.connected = true;\n this.callStartTimes.set(callId, Date.now());\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\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 return;\n }\n if (state === CallState.DISCONNECTED || state === CallState.FAILED) {\n this.avayaIPOService.clearLastIncomingCall();\n let disconnectSide: 'AGENT' | 'CALLER' | 'NA' =\n this.pendingDisconnectSide ?? 'CALLER';\n let disconnectReason: string | undefined;\n if (this.avayaIPOService.consumeTransferInProgress(callId)) {\n disconnectSide = 'NA';\n disconnectReason = 'Transfer';\n }\n const status = 'disconnected';\n const startedAt = this.callStartTimes.get(callId);\n const duration = startedAt\n ? Math.max(0, Math.floor((Date.now() - startedAt) / 1000))\n : 0;\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration,\n status,\n timestamp: new Date().toISOString(),\n callinginfo: 'disconnected',\n disconnectSide,\n disconnectReason,\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error(`logCall (${status}) failed`, err),\n });\n this.callLogIndex.delete(callId);\n this.callStartTimes.delete(callId);\n this.pendingDisconnectSide = null;\n if (this.avayaIPOService.activeCallId === callId) {\n this.activeCallNumber = null;\n this.activeCallName = null;\n this.incomingCallName = null;\n }\n }\n }\n );\n\n this.restoreSession();\n }\n\n onLogin(): void {\n this.loginForm.markAllAsTouched();\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = false;\n this.hasAvayaDeviceError = false;\n this.hasAvayaSocketError = false;\n\n if (this.loginForm.invalid) {\n return;\n }\n\n this.showLoginLoader = true;\n\n // Ensure AWL SDK is loaded, then configure and login.\n this.loadAwlScript(APP_CONFIG.AWL_SDK_URL)\n .then(() => {\n this.avayaIPOService.setConfigValues({\n serviceType: this.configurationMode || 'phone',\n gatewayIp: this.avayaIPOServerIP,\n gatewayPort: this.avayaIPOServerPort?.toString(),\n stunIp: this.avayaIPOServerStunServerIP,\n stunPort: this.avayaIPOServerStunServerPort?.toString(),\n turnIp: this.avayaIPOServerTurnServerIP,\n turnPort: this.avayaIPOServerTurnServerPort?.toString(),\n });\n\n this.avayaIPOService.init();\n this.avayaIPOService.logIn(\n this.loginForm.value.ipoExtensionNo,\n this.loginForm.value.ipoPassword\n );\n })\n .catch((err) => {\n console.error('Failed to load AWL SDK', err);\n this.showLoginLoader = false;\n this.hasAvayaSocketError = true;\n });\n }\n\n onLogout(): void {\n this.avayaIPOService.logout();\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.loginForm.reset();\n this.clearSession();\n }\n\n private handleLoginStatus(status: any): void {\n if (!status) {\n return;\n }\n\n if (typeof status === 'boolean') {\n if (status) {\n this.showLoginLoader = false;\n this.showLoginForm = false;\n this.avayaIPOService.initLocalMic().catch((err) => {\n console.warn('initLocalMic failed', err);\n });\n this.persistSession();\n }\n return;\n }\n\n const result = status.result ?? status.loginState;\n switch (result) {\n case LoginState.LOGIN_SUCCESS:\n this.showLoginLoader = false;\n this.showLoginForm = false;\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = false;\n this.hasAvayaLoginConflictError = false;\n this.hasAvayaSocketError = false;\n this.hasAvayaDeviceError = false;\n this.avayaIPOService.initLocalMic().catch((err) => {\n console.warn('initLocalMic failed', err);\n });\n this.persistSession();\n break;\n case LoginState.LOGGEDOUT:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.loginForm.reset();\n this.clearSession();\n break;\n case LoginState.LOGIN_FAILED:\n case LoginState.LOGIN_EMPTYUSERNAME:\n case LoginState.LOGIN_EMPTYPASSWORD:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n if (status?.reason === 'Invalid Credentials') {\n this.hasAvayaLoginError = true;\n this.hasAvayaLoginFailedGeneral = false;\n } else {\n this.hasAvayaLoginError = false;\n this.hasAvayaLoginFailedGeneral = true;\n }\n break;\n case LoginState.WEBSOCKET_FAILURE:\n case LoginState.LOGIN_GW_NOTCONFIGURED:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.hasAvayaSocketError = true;\n break;\n case LoginState.DEVICEACCESS_FAILURE:\n this.showLoginForm = true;\n this.showLoginLoader = false;\n this.hasAvayaDeviceError = true;\n break;\n default:\n break;\n }\n }\n\n selectTab(tab: 'history' | 'contacts' | 'keypad' | 'settings'): void {\n this.activeTab = tab;\n }\n\n onHistoryMakeCall(payload: { dialOut: string; name?: string }): void {\n this.triggerCall(payload);\n }\n\n onPhoneMakeCall(phoneNumber: string): void {\n this.triggerCall(phoneNumber);\n }\n\n onContactsMakeCall(payload: { dialOut: string; name?: string }): void {\n this.triggerCall(payload);\n }\n\n onPhoneEndCall(): void {\n try {\n this.pendingDisconnectSide = 'AGENT';\n const pendingIncoming = this.avayaIPOService.getLastIncomingCall();\n const activeCallId = this.avayaIPOService.activeCallId;\n const targetCallId =\n pendingIncoming?.callId || activeCallId || null;\n if (targetCallId) {\n const meta = this.callLogIndex.get(targetCallId);\n if (meta && !meta.connected) {\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId: targetCallId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\n status: 'disconnected',\n timestamp: new Date().toISOString(),\n callinginfo: 'calling',\n disconnectSide: 'AGENT',\n };\n this.avayaIPOService.logCall(callLogPayload).subscribe({\n error: (err) => console.error('logCall (agent disconnect) failed', err),\n });\n this.callLogIndex.delete(targetCallId);\n if (pendingIncoming?.callId) {\n this.avayaIPOService.clearLastIncomingCall();\n }\n this.pendingDisconnectSide = null;\n }\n }\n this.avayaIPOService.dropCall();\n } catch (err) {\n console.warn('Failed to end call', err);\n }\n }\n\n onDeviceChange(change: {\n audioInputId: string;\n audioOutputId: string;\n videoInputId?: string;\n }): void {\n console.debug('Device selection changed', change);\n }\n\n onThemeToggle(enabled: boolean): void {\n this.darkModeEnabled = enabled;\n this.hostDarkMode = enabled;\n try {\n localStorage.setItem('sd-dark-mode', JSON.stringify(enabled));\n } catch {}\n }\n\n onCallScreenChange(active: boolean): void {\n Promise.resolve().then(() => {\n this.hideTabs = active;\n this.cdr.detectChanges();\n });\n }\n\n private async triggerCall(raw: any): Promise<void> {\n const providedName =\n typeof raw === 'object' && raw !== null ? raw?.name : null;\n const destination = formatDialOutNumber(\n raw?.dialOut ??\n raw?.internationalNumber ??\n raw?.number ??\n (typeof raw === 'string' ? raw : '')\n );\n if (!destination) {\n console.warn('No destination to dial');\n return;\n }\n this.activeTab = 'keypad';\n this.activeCallNumber = destination;\n this.activeCallName = providedName || null;\n const normalizedSearch = this.normalizePhoneForSearch(destination);\n if (!providedName) {\n const cachedName = this.entitiesSearchService.getCachedName(\n this.tenantId,\n normalizedSearch\n );\n if (cachedName) {\n this.activeCallName = cachedName;\n }\n }\n this.avayaIPOService.notifyOutgoingDial(destination);\n try {\n const [lookupResult, callerName] = await Promise.all([\n this.getLookupPhoneNumber(destination),\n providedName ? Promise.resolve(null) : this.getOpenSearchCallerName(normalizedSearch),\n ]);\n const mapNumber =\n lookupResult?.lookupPhoneNumber?.['local-number']?.replace(/\\s+/g, '') ||\n lookupResult?.normalizedPhoneNumber ||\n destination;\n this.activeCallNumber = mapNumber;\n if (providedName) {\n this.activeCallName = providedName;\n } else if (callerName) {\n this.activeCallName = callerName;\n }\n const slot = await this.avayaIPOService.makeCall(destination);\n if (!slot) {\n return;\n }\n const callId = this.avayaIPOService.activeCallId;\n if (callId) {\n this.activeCallNumber = mapNumber;\n const phonePayload: any = lookupResult || { normalizedPhoneNumber: mapNumber };\n const resolvedName = providedName || callerName;\n if (resolvedName && !phonePayload.name) {\n phonePayload.name = resolvedName;\n }\n this.callLogIndex.set(callId, {\n direction: 'outbound',\n phoneNumber: phonePayload,\n connected: false,\n });\n const callLogPayload = {\n tenantId: this.tenantId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: phonePayload,\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 } catch (err) {\n console.error('Failed to place call', err);\n }\n }\n\n ngOnDestroy(): void {\n this.loginSub?.unsubscribe();\n this.incomingCallSub?.unsubscribe();\n this.callStateSub?.unsubscribe();\n }\n\n private async getLookupPhoneNumber(phoneNumber: string): Promise<any> {\n if (!phoneNumber || typeof phoneNumber !== 'string') {\n console.warn(\n 'lookupPhoneNumber called with an invalid phoneNumber: ',\n phoneNumber\n );\n return { phoneNumber: '' };\n }\n\n let normalizedPhoneNumber = phoneNumber.trim();\n if (normalizedPhoneNumber.startsWith('00')) {\n normalizedPhoneNumber = '+' + normalizedPhoneNumber.substring(2);\n }\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n if (\n countryCode &&\n !normalizedPhoneNumber.startsWith('+') &&\n !normalizedPhoneNumber.startsWith('00')\n ) {\n let digits = normalizedPhoneNumber.replace(/\\D/g, '');\n if (digits.length >= 10 && digits.startsWith('0')) {\n digits = digits.slice(1);\n }\n if (digits.startsWith(countryCode)) {\n normalizedPhoneNumber = `+${digits}`;\n } else {\n normalizedPhoneNumber = `+${countryCode}${digits}`;\n }\n }\n\n try {\n const res_lookupPhoneNumber: any =\n await this.phoneNumberLookupService.lookupPhoneNumber(\n normalizedPhoneNumber\n );\n\n if (!res_lookupPhoneNumber?.data?.valid) {\n throw new Error('Invalid 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 return {\n normalizedPhoneNumber: normalizedPhoneNumber,\n lookupPhoneNumber: res_lookupPhoneNumber?.data,\n country: res_getCountryFromCountryCode,\n };\n } catch (err) {\n console.warn(\n `Error looking up phone number ${phoneNumber}: `,\n err\n );\n return { normalizedPhoneNumber: normalizedPhoneNumber };\n }\n }\n\n private async getOpenSearchCallerName(\n phoneNumber: string\n ): Promise<string | null> {\n const tenantId = this.tenantId;\n if (!tenantId || !phoneNumber) {\n return null;\n }\n\n try {\n return await this.entitiesSearchService.lookupNameByPhone(\n tenantId,\n phoneNumber\n );\n } catch (err) {\n console.warn('OpenSearch lookup failed:', err);\n return null;\n }\n }\n\n private normalizePhoneForSearch(value: string): string {\n if (!value || typeof value !== 'string') {\n return '';\n }\n let normalized = value.trim();\n if (normalized.startsWith('00')) {\n normalized = '+' + normalized.slice(2);\n }\n if (normalized.startsWith('+')) {\n return normalized;\n }\n const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!countryCode) {\n return digits;\n }\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n if (local.startsWith(countryCode)) {\n return `+${local}`;\n }\n return `+${countryCode}${local}`;\n }\n\n private persistSession(): void {\n try {\n const payload = {\n loggedIn: true,\n extension: this.loginForm.value.ipoExtensionNo ?? '',\n password: this.loginForm.value.ipoPassword ?? '',\n };\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(payload));\n } catch (err) {\n console.warn('Unable to persist login session', err);\n }\n }\n\n private restoreSession(): void {\n try {\n const raw = localStorage.getItem(this.STORAGE_KEY);\n if (!raw) {\n return;\n }\n const parsed = JSON.parse(raw);\n if (parsed?.loggedIn) {\n this.showLoginForm = false;\n this.showLoginLoader = true;\n this.loginForm.patchValue({\n ipoExtensionNo: parsed.extension ?? '',\n ipoPassword: parsed.password ?? '',\n });\n if (parsed.extension && parsed.password) {\n // auto-login after brief tick to ensure view init\n setTimeout(() => this.onLogin(), 0);\n }\n }\n } catch (err) {\n console.warn('Unable to restore login session', err);\n }\n }\n\n private restoreThemePreference(): void {\n try {\n const stored = localStorage.getItem('sd-dark-mode');\n if (stored !== null) {\n this.darkModeEnabled = JSON.parse(stored) === true;\n this.hostDarkMode = this.darkModeEnabled;\n }\n } catch {}\n }\n\n private clearSession(): void {\n try {\n localStorage.removeItem(this.STORAGE_KEY);\n } catch (err) {\n console.warn('Unable to clear login session', err);\n }\n }\n\n private loadAwlScript(src: string): Promise<void> {\n if (!this.awlScriptPromise) {\n this.awlScriptPromise = new Promise<void>((resolve, reject) => {\n const existing = document.querySelector<HTMLScriptElement>(\n `script[src=\"${src}\"]`\n );\n if (existing) {\n if (existing.dataset['loaded'] === 'true') {\n resolve();\n return;\n }\n existing.addEventListener('load', () => resolve());\n existing.addEventListener('error', (e) => reject(e));\n return;\n }\n const script = document.createElement('script');\n script.src = src;\n script.async = true;\n script.defer = true;\n script.dataset['loaded'] = 'false';\n script.onload = () => {\n script.dataset['loaded'] = 'true';\n resolve();\n };\n script.onerror = (e) => reject(e);\n document.body.appendChild(script);\n });\n }\n return this.awlScriptPromise;\n }\n}\n","<div class=\"media-elements\">\n <audio id=\"rmtAudio\" autoplay></audio>\n <audio id=\"lclAudio\" autoplay></audio>\n <video id=\"rmtVideo\" autoplay playsinline></video>\n <video id=\"lclVideo\" autoplay playsinline muted></video>\n</div>\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 @if (isReconnectingInProgress) { <span>Reconnecting to the server...</span> }\n @if (isFailoverInProgress) { <span>Failover in progress...</span> }\n @if (isFailbackInProgress) { <span>Failback in progress...</span> }\n </div>\n </div>\n}\n\n@if (showLoginForm) {\n <app-avaya-ipo-login\n [loginForm]=\"loginForm\"\n [showLoginLoader]=\"showLoginLoader\"\n [hasAvayaSocketError]=\"hasAvayaSocketError\"\n [hasAvayaLoginError]=\"hasAvayaLoginError\"\n [hasAvayaLoginFailedGeneral]=\"hasAvayaLoginFailedGeneral\"\n [hasAvayaLoginConflictError]=\"hasAvayaLoginConflictError\"\n [hasAvayaDeviceError]=\"hasAvayaDeviceError\"\n (login)=\"onLogin()\"\n ></app-avaya-ipo-login>\n} @else {\n <div class=\"widget-body\">\n <div class=\"widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>History</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\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 </button>\n </div>\n }\n <app-call-history\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n (makeCallEv)=\"onHistoryMakeCall($event)\"\n ></app-call-history>\n } @else if (activeTab === 'contacts') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\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 </button>\n </div>\n }\n <app-contacts [tenantId]=\"tenantId\" (makeCallEv)=\"onContactsMakeCall($event)\"></app-contacts>\n } @else if (activeTab === 'settings') {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Settings</span>\n <button type=\"button\" class=\"settings-btn is-active\" disabled>\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\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 </button>\n </div>\n }\n <app-settings\n [extensionId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [darkMode]=\"darkModeEnabled\"\n (darkModeChange)=\"onThemeToggle($event)\"\n (change)=\"onDeviceChange($event)\"\n (logout)=\"onLogout()\"\n ></app-settings>\n } @else {\n @if (!hideTabs) {\n <div class=\"page-heading\">\n <span>Keypad</span>\n <button type=\"button\" class=\"settings-btn\" (click)=\"selectTab('settings')\">\n <svg width=\"18px\" viewBox=\"-0.03 0 16.079 16.079\" aria-hidden=\"true\" focusable=\"false\">\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 </button>\n </div>\n }\n <app-phone\n [tenantId]=\"tenantId\"\n [agentId]=\"loginForm?.value?.ipoExtensionNo || userId\"\n [activeCallNumber]=\"activeCallNumber\"\n [incomingCallName]=\"incomingCallName\"\n [incomingNameResolved]=\"incomingNameResolved\"\n [activeCallName]=\"activeCallName\"\n [serverIp]=\"avayaIPOServerIP\"\n [serverPort]=\"avayaIPOServerPort\"\n [stunIp]=\"avayaIPOServerStunServerIP\"\n [stunPort]=\"avayaIPOServerStunServerPort\"\n [turnIp]=\"avayaIPOServerTurnServerIP\"\n [turnPort]=\"avayaIPOServerTurnServerPort\"\n [configurationMode]=\"configurationMode\"\n (makeCallEv)=\"onPhoneMakeCall($event)\"\n (endCallEv)=\"onPhoneEndCall()\"\n (callScreenChange)=\"onCallScreenChange($event)\"\n ></app-phone>\n }\n </div>\n </div>\n\n @if (showLoginLoader) {\n <div class=\"global-loader\">\n <div class=\"spinner\"></div>\n <div class=\"loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs) {\n <nav class=\"tabs\">\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"tab-icon\">\n <svg width=\"19px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\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=\"tab-text\">History</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"tab-icon\">\n <svg width=\"18px\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M12 12a4 4 0 1 0-4-4 4 4 0 0 0 4 4zm0 2c-4.4 0-8 2.2-8 5v2h16v-2c0-2.8-3.6-5-8-5z\" />\n </svg>\n </span>\n <span class=\"tab-text\">Contacts</span>\n </button>\n <button type=\"button\" class=\"tab-btn\" [class.active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"tab-icon\">\n <svg width=\"20px\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\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=\"tab-text\">Keypad</span>\n </button>\n </nav>\n }\n}\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 { MatInputModule } from '@angular/material/input';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { NgxIntlTelInputModule } from 'ngx-intl-tel-input';\n\nimport { AvayaIPOWidgetComponent } from './avaya-ipo-widget.component';\nimport { CallHistoryComponent } from './components/call-history/call-history.component';\nimport { CallDetailsComponent } from './components/call-history/call-details/call-details.component';\nimport { ContactsComponent } from './components/contacts/contacts.component';\nimport { ContactCardComponent } from './components/contacts/contact-card/contact-card.component';\nimport { ContactDetailsComponent } from './components/contacts/contact-details/contact-details.component';\nimport { SettingsComponent } from './components/settings/settings.component';\nimport { AvayaIpoLoginComponent } from './components/login/login.component';\nimport { PhoneComponent } from './components/phone/phone.component';\nimport { PhoneIdleComponent } from './components/phone/idle/phone-idle.component';\nimport { PhoneIncomingComponent } from './components/phone/incoming/phone-incoming.component';\nimport { PhoneActiveComponent } from './components/phone/active/phone-active.component';\n\n@NgModule({\n declarations: [\n AvayaIPOWidgetComponent,\n CallHistoryComponent,\n CallDetailsComponent,\n ContactsComponent,\n ContactCardComponent,\n ContactDetailsComponent,\n SettingsComponent,\n AvayaIpoLoginComponent,\n PhoneComponent,\n PhoneIdleComponent,\n PhoneIncomingComponent,\n PhoneActiveComponent,\n ],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n MatIconModule,\n MatButtonModule,\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.AuthenticationService","i1","i2","i3","i4","i5.CallDetailsComponent","i1.EntitiesSearchService","i2.ContactCardComponent","i3.ContactDetailsComponent","i6","i2.AvayaIPOService","i3.AuthenticationService","i4.RecordingManagerService","i5.TranscriptionStreamService","i7.PhoneIdleComponent","i8.PhoneIncomingComponent","i9.PhoneActiveComponent","i10","i3.CountryService","i4.PhoneNumberLookupService","i5.EntitiesSearchService","i6.CallHistoryComponent","i7.ContactsComponent","i8.SettingsComponent","i9.AvayaIpoLoginComponent","i10.PhoneComponent"],"mappings":"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"}