@snugdesk/avaya-ipo-widget 0.2.2 → 0.2.4
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.
- package/fesm2022/snugdesk-avaya-ipo-widget.mjs +965 -353
- package/fesm2022/snugdesk-avaya-ipo-widget.mjs.map +1 -1
- package/index.d.ts +174 -43
- package/package.json +1 -1
- package/src/assets/css/intl-tel-input-dropdown.css +0 -0
- package/src/assets/images/bg-app_color_line.gif +0 -0
- package/src/assets/images/icons/sd-backspace.png +0 -0
- package/src/assets/images/icons/sd-call_failed.gif +0 -0
- package/src/assets/images/logo-avaya_small_color.svg +0 -20
- package/src/assets/images/logo-avaya_small_gray.svg +0 -16
|
@@ -1 +1 @@
|
|
|
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_WS_URL: 'ws://localhost:3000/ws/transcribe',\n TRANSCRIPTION_WS_MIME_TYPE: 'audio/pcm;rate=16000;encoding=s16le',\n TRANSCRIPTION_LANGUAGE_CODE: 'hi-IN',\n TRANSCRIPTION_ALT_LANGUAGE_CODES: ['en-IN'],\n TRANSCRIPTION_MODEL: 'latest_short',\n POSTCALL_TRANSCRIBE_API_URL: 'http://localhost:3000/api/transcribe-call-gemini',\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 { SnugdeskAuthenticationService } from '@snugdesk/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthenticationService {\n tenant$: BehaviorSubject<any>;\n user$: BehaviorSubject<any>;\n isAuthenticated$: BehaviorSubject<boolean>;\n\n constructor(private snugdeskAuthService: SnugdeskAuthenticationService) {\n this.tenant$ = this.snugdeskAuthService.tenant$;\n this.user$ = this.snugdeskAuthService.user$;\n this.isAuthenticated$ = this.snugdeskAuthService.isAuthenticated$;\n }\n\n isAuthenticated(): boolean {\n return this.snugdeskAuthService.isAuthenticated();\n }\n\n getAuthSessionToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n\n getAuthDomainToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n getDecodedAuthDomainToken(): any {\n return this.snugdeskAuthService.getDecodedToken();\n }\n \n getTenantId(): string {\n // return this.getDecodedAuthSessionToken().tenantId;\n return this.snugdeskAuthService.getTenantId();\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.snugdeskAuthService.getDecodedToken();\n }\n \n\n getUserId(): string {\n return this.snugdeskAuthService.getUserId();\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';\nimport { HttpClient } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\nimport { APP_CONFIG } from '../../../config/app-config';\n\ntype TranscriptLine = {\n speaker?: string;\n text?: string;\n};\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 transcriptLines: TranscriptLine[] = [];\n summaryText = '';\n customerSentiment = '';\n isTranscribing = false;\n transcriptionError = '';\n isTranscriptFullscreen = false;\n hasGeneratedTranscript = false;\n private readonly ANALYZE_CALL_API = APP_CONFIG.POSTCALL_TRANSCRIBE_API_URL;\n\n constructor(private http: HttpClient) {}\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 getTranscriptSpeaker(line: TranscriptLine): string {\n const raw = (line?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'customer') {\n const name = this.getDisplayName();\n return name && name !== 'Unknown' ? name : 'Unknown';\n }\n if (normalized === 'agent') {\n return 'Agent';\n }\n return raw || 'Unknown';\n }\n\n async runTranscription(): Promise<void> {\n if (!this.call?.fullCallRecordingUrl || this.isTranscribing) {\n return;\n }\n this.isTranscribing = true;\n this.transcriptionError = '';\n try {\n const recordingBlob = await lastValueFrom(\n this.http.get(this.call.fullCallRecordingUrl, { responseType: 'blob' })\n );\n const formData = new FormData();\n formData.append('file', recordingBlob, this.getRecordingFilename());\n const res: any = await lastValueFrom(\n this.http.post(this.ANALYZE_CALL_API, formData)\n );\n this.transcriptLines = this.normalizeTranscript(res?.transcript);\n this.summaryText = typeof res?.summary === 'string' ? res.summary : '';\n this.customerSentiment = typeof res?.customerSentiment === 'string' ? res.customerSentiment : '';\n this.hasGeneratedTranscript = true;\n } catch (err) {\n console.error('[CallDetails] Transcription failed', err);\n this.transcriptionError = 'Failed to analyze call. Please try again.';\n } finally {\n this.isTranscribing = false;\n }\n }\n\n private normalizeTranscript(input: any): TranscriptLine[] {\n if (!input) {\n return [];\n }\n if (typeof input === 'string') {\n return input\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const parsed = this.parseSpeakerLine(line);\n return { speaker: parsed.speaker, text: parsed.text };\n });\n }\n if (Array.isArray(input)) {\n return input\n .map((entry) => {\n if (typeof entry === 'string') {\n const parsed = this.parseSpeakerLine(entry);\n return { speaker: parsed.speaker, text: parsed.text };\n }\n if (entry && typeof entry === 'object') {\n return {\n speaker: entry.speaker,\n text: entry.text,\n };\n }\n return null;\n })\n .filter(Boolean) as TranscriptLine[];\n }\n return [];\n }\n\n getSentimentEmoji(): string {\n const value = (this.customerSentiment || '').toLowerCase();\n if (value.includes('positive')) return '🙂';\n if (value.includes('negative')) return '☹️';\n if (value.includes('neutral')) return '😐';\n return '';\n }\n\n private parseSpeakerLine(line: string): { speaker?: string; text: string } {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n toggleTranscriptFullscreen(): void {\n this.isTranscriptFullscreen = !this.isTranscriptFullscreen;\n }\n\n private getRecordingFilename(): string {\n const url = this.call?.fullCallRecordingUrl;\n if (typeof url === 'string') {\n try {\n const parsed = new URL(url);\n const name = parsed.pathname.split('/').pop();\n if (name) {\n return name;\n }\n } catch {\n const parts = url.split('/').filter(Boolean);\n const name = parts[parts.length - 1];\n if (name) {\n return name;\n }\n }\n }\n return 'call-recording.wav';\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 summary-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 transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\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 @if (!hasGeneratedTranscript) {\n <div class=\"transcription-actions outside\">\n <button class=\"action-btn\" type=\"button\" [disabled]=\"isTranscribing\" (click)=\"runTranscription()\">\n <span class=\"btn-content\">\n @if (isTranscribing) {\n <span class=\"btn-spinner\" aria-hidden=\"true\"></span>\n }\n <span>{{ isTranscribing ? 'Generating...' : 'Run AI Call Analysis' }}</span>\n </span>\n </button>\n @if (transcriptionError) {\n <div class=\"status-error\">{{ transcriptionError }}</div>\n }\n </div>\n }\n\n <div class=\"detail-card\">\n <div class=\"detail-title\">Call Summary</div>\n @if (customerSentiment) {\n <div class=\"summary-sentiment\">\n Customer Sentiment: {{ customerSentiment }}\n @if (getSentimentEmoji()) {\n <span class=\"summary-emoji\">{{ getSentimentEmoji() }}</span>\n }\n </div>\n }\n @if (summaryText) {\n <div class=\"summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"placeholder\">No summary available.</div>\n }\n </div>\n\n <div class=\"detail-card transcription-card\" [class.fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"detail-title-row\">\n <div class=\"detail-title\">AI Call Transcription</div>\n @if (transcriptLines?.length) {\n <button\n class=\"chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (call?.fullCallRecordingUrl) {\n @if (transcriptLines?.length) {\n <div class=\"chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"chat-bubble\" [class.agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isTranscribing) {\n <div class=\"transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"placeholder\">No transcription available.</div>\n }\n\n } @else {\n <div class=\"placeholder\">No recording available for transcription.</div>\n }\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' | 'missedCall' = '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: 'recentCall' | 'missedCall'): 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 const termDigits = this.searchTerm.replace(/\\D/g, '');\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 const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\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 filteredMissed(): any[] {\n if (!this.searchTerm.trim()) return this.callerDropped;\n const term = this.searchTerm.toLowerCase();\n const termDigits = this.searchTerm.replace(/\\D/g, '');\n return this.callerDropped.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 const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\n phone.toString().toLowerCase().includes(term) ||\n name.toString().toLowerCase().includes(term)\n );\n });\n }\n\n get groupedMissed(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.filteredMissed);\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 (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 @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(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]=\"$any(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 <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 <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 @if (!selectedCall) {\n <div class=\"recent_options_header\">\n <div class=\"recent_inner\">\n <button class=\"recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.active]=\"$any(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]=\"$any(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 <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 <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-load-more\">\n <div class=\"contacts-spinner\" aria-hidden=\"true\"></div>\n </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 { 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 speaker?: string;\n};\n\ntype StreamSession = {\n label: 'agent' | 'customer';\n ws: WebSocket;\n processor: ScriptProcessorNode;\n sourceNode: MediaStreamAudioSourceNode;\n closed: boolean;\n chunkTimer?: ReturnType<typeof setInterval>;\n pendingChunks: Uint8Array[];\n pendingBytes: number;\n lastChunkSentAt: number;\n noiseFloor: number;\n readyForBinary: boolean;\n allowSendBinary: boolean;\n muted: boolean;\n lastAudioSentAt: number;\n};\n\ntype TranscriptionSession = {\n callId: string;\n audioContext: AudioContext;\n zeroGain: GainNode;\n streams: StreamSession[];\n closed: boolean;\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 VOICE_RMS_THRESHOLD = 0.006;\n private readonly NOISE_FLOOR_MULTIPLIER = 2.5;\n private readonly NOISE_FLOOR_SMOOTHING = 0.05;\n private readonly CHUNK_INTERVAL_MS = 50;\n private readonly CUSTOM_WS_URL = APP_CONFIG.TRANSCRIPTION_WS_URL;\n private readonly CUSTOM_WS_MIME_TYPE = APP_CONFIG.TRANSCRIPTION_WS_MIME_TYPE;\n private readonly LANGUAGE_CODE = APP_CONFIG.TRANSCRIPTION_LANGUAGE_CODE;\n private readonly ALT_LANGUAGE_CODES = APP_CONFIG.TRANSCRIPTION_ALT_LANGUAGE_CODES;\n private readonly TRANSCRIPTION_MODEL = APP_CONFIG.TRANSCRIPTION_MODEL;\n\n constructor() {}\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 allowSendBinary = false\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 customUrl =\n typeof this.CUSTOM_WS_URL === 'string' ? this.CUSTOM_WS_URL.trim() : '';\n if (!customUrl) {\n throw new Error('TRANSCRIPTION_WS_URL is not configured');\n }\n const audioContext = new AudioContext({ sampleRate: this.SAMPLE_RATE });\n const zeroGain = audioContext.createGain();\n zeroGain.gain.value = 0;\n\n zeroGain.connect(audioContext.destination);\n\n const session: TranscriptionSession = {\n callId,\n audioContext,\n zeroGain,\n streams: [],\n closed: false,\n };\n\n this.session = session;\n\n const localSource = audioContext.createMediaStreamSource(localStream);\n const remoteSource = audioContext.createMediaStreamSource(remoteStream);\n session.streams.push(\n this.createStreamSession({\n callId,\n label: 'agent',\n sourceNode: localSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n }),\n this.createStreamSession({\n callId,\n label: 'customer',\n sourceNode: remoteSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n })\n );\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.zeroGain.disconnect();\n } catch {}\n for (const stream of session.streams) {\n stream.closed = true;\n try {\n stream.processor.disconnect();\n stream.sourceNode.disconnect();\n } catch {}\n if (stream.chunkTimer) {\n clearInterval(stream.chunkTimer);\n stream.chunkTimer = undefined;\n }\n try {\n if (stream.ws.readyState === WebSocket.OPEN) {\n this.flushPendingAudio(stream);\n stream.ws.send(JSON.stringify({ type: 'end', source: stream.label }));\n stream.ws.close();\n }\n } catch {}\n }\n try {\n session.audioContext.close();\n } catch {}\n this.session = null;\n }\n\n enableBinary(callId: string): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n stream.allowSendBinary = true;\n }\n }\n\n setStreamMuted(callId: string, label: 'agent' | 'customer', muted: boolean): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n if (stream.label === label) {\n stream.muted = muted;\n }\n }\n }\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 queueAudio(stream: StreamSession, chunk: Uint8Array): void {\n stream.pendingChunks.push(chunk);\n stream.pendingBytes += chunk.byteLength;\n this.flushPendingAudio(stream);\n }\n\n private flushPendingAudio(stream: StreamSession): void {\n if (stream.pendingBytes === 0 || stream.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n const merged = this.mergeChunks(stream.pendingChunks, stream.pendingBytes);\n stream.pendingChunks = [];\n stream.pendingBytes = 0;\n stream.ws.send(merged);\n stream.lastAudioSentAt = Date.now();\n stream.lastChunkSentAt = stream.lastAudioSentAt;\n }\n\n private mergeChunks(chunks: Uint8Array[], totalBytes: number): Uint8Array {\n if (chunks.length === 1) {\n return chunks[0];\n }\n const out = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return out;\n }\n\n private handleTranscriptPayload(callId: string, text: string): void {\n if (!text) return;\n try {\n const data = JSON.parse(text);\n if (typeof data?.text === 'string') {\n this.transcriptSubject.next({\n callId,\n text: data.text,\n isFinal: Boolean(data?.isFinal ?? data?.final ?? true),\n ts: typeof data?.ts === 'number' ? data.ts : Date.now(),\n speaker: data?.speaker || data?.source,\n });\n return;\n }\n if (typeof data?.transcript === 'string') {\n const ts = typeof data?.ts === 'number' ? data.ts : Date.now();\n const isFinal = Boolean(data?.isFinal ?? data?.final ?? true);\n const lines = data.transcript\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .filter(Boolean);\n if (lines.length > 1) {\n for (const line of lines) {\n const parsed = this.parseSpeakerLine(line);\n this.transcriptSubject.next({\n callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n } else {\n const parsed = this.parseSpeakerLine(data.transcript.trim());\n this.transcriptSubject.next({\n callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n return;\n }\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 this.transcriptSubject.next({\n callId,\n text,\n isFinal: true,\n ts: Date.now(),\n });\n }\n }\n\n private parseSpeakerLine(line: string): { speaker?: string; text: string } {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n private createStreamSession(opts: {\n callId: string;\n label: 'agent' | 'customer';\n sourceNode: MediaStreamAudioSourceNode;\n audioContext: AudioContext;\n zeroGain: GainNode;\n url: string;\n allowSendBinary: boolean;\n }): StreamSession {\n const ws = new WebSocket(opts.url);\n ws.binaryType = 'arraybuffer';\n console.debug('[Transcription] Opening WebSocket', {\n url: ws.url,\n source: opts.label,\n });\n\n const processor = opts.audioContext.createScriptProcessor(\n this.BUFFER_SIZE,\n 1,\n 1\n );\n opts.sourceNode.connect(processor);\n processor.connect(opts.zeroGain);\n\n const stream: StreamSession = {\n label: opts.label,\n ws,\n processor,\n sourceNode: opts.sourceNode,\n closed: false,\n pendingChunks: [],\n pendingBytes: 0,\n lastChunkSentAt: Date.now(),\n noiseFloor: this.SILENCE_RMS_THRESHOLD,\n readyForBinary: false,\n allowSendBinary: opts.allowSendBinary,\n muted: false,\n lastAudioSentAt: Date.now(),\n };\n\n ws.onopen = () => {\n opts.audioContext.resume().catch(() => {});\n const payload = {\n type: 'start',\n mimeType:\n this.CUSTOM_WS_MIME_TYPE || 'audio/pcm;rate=16000;encoding=s16le',\n sampleRate: this.SAMPLE_RATE,\n encoding: 's16le',\n channels: 1,\n callId: opts.callId,\n source: opts.label,\n languageCode: this.LANGUAGE_CODE,\n alternativeLanguageCodes: this.ALT_LANGUAGE_CODES,\n model: this.TRANSCRIPTION_MODEL,\n };\n ws.send(JSON.stringify(payload));\n stream.readyForBinary = false;\n console.debug('[Transcription] WebSocket open', { source: opts.label });\n processor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (stream.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n if (stream.muted && opts.label === 'agent') {\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 stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n return;\n }\n const adaptiveThreshold = Math.max(\n this.VOICE_RMS_THRESHOLD,\n stream.noiseFloor * this.NOISE_FLOOR_MULTIPLIER\n );\n if (rms < adaptiveThreshold) {\n stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n return;\n }\n const pcmBytes = this.encodePcm16(\n input,\n opts.audioContext.sampleRate\n );\n if (pcmBytes.byteLength === 0) {\n return;\n }\n if (!stream.readyForBinary || !stream.allowSendBinary) {\n return;\n }\n this.queueAudio(stream, pcmBytes);\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 source: opts.label,\n });\n };\n\n ws.onmessage = (evt) => {\n if (!evt?.data) return;\n if (typeof evt.data === 'string') {\n try {\n const maybeAck = JSON.parse(evt.data);\n if (\n maybeAck &&\n maybeAck.type === 'ack' &&\n maybeAck.message === 'stream-started'\n ) {\n stream.readyForBinary = true;\n return;\n }\n } catch {\n // ignore parse failures; handled below\n }\n this.handleTranscriptPayload(opts.callId, evt.data);\n return;\n }\n if (evt.data instanceof Blob) {\n evt.data.text().then((text) => this.handleTranscriptPayload(opts.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 source: opts.label,\n });\n this.stopSession(opts.callId);\n };\n\n stream.chunkTimer = setInterval(() => {\n if (stream.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n if (stream.readyForBinary && stream.allowSendBinary) {\n this.flushPendingAudio(stream);\n }\n }, this.CHUNK_INTERVAL_MS);\n\n return stream;\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\"> </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\"> </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\"> </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 \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, OnChanges, SimpleChanges, 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, OnChanges, 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 private pendingTranscriptionAllowBinary = false;\n private lastPartialIndex: Record<string, number> = {};\n private pendingIncomingCall = false;\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 transcriptSegments: Array<{ ts: number; text: string; speaker?: 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, evt.speaker);\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.pendingIncomingCall = 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, true);\n }\n this.emitCallScreenState();\n }\n if (evt.state === CallState.INCOMING || evt.state === CallState.RINGING) {\n if (evt.callId) {\n this.startTranscriptionForCall(evt.callId, false);\n }\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 this.pendingTranscriptionAllowBinary = false;\n }\n this.isRinging = false;\n this.pendingIncomingCall = 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(\n this.pendingTranscriptionCallId,\n this.pendingTranscriptionAllowBinary\n );\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 this.pendingTranscriptionAllowBinary = false;\n }\n this.isRinging = false;\n this.pendingIncomingCall = 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 ngOnChanges(changes: SimpleChanges): void {\n if (changes['incomingNameResolved'] && this.pendingIncomingCall) {\n if (this.incomingNameResolved) {\n this.isRinging = true;\n this.pendingIncomingCall = false;\n this.emitCallScreenState();\n this.cdr.detectChanges();\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.pendingIncomingCall = 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.pendingIncomingCall = 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 = this.incomingNameResolved;\n this.pendingIncomingCall = !this.incomingNameResolved;\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(\n callId: string,\n allowSendBinary = false\n ): void {\n if (!callId) {\n return;\n }\n if (this.transcriptionActiveCallId === callId) {\n if (allowSendBinary) {\n this.transcriptionStreamService.enableBinary(callId);\n }\n return;\n }\n if (!this.lastLocalStream || !this.lastRemoteStream) {\n this.pendingTranscriptionCallId = callId;\n this.pendingTranscriptionAllowBinary = allowSendBinary;\n return;\n }\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n this.transcriptSegments = [];\n this.transcriptText = '';\n this.lastPartialIndex = {};\n this.transcriptStartedAt = Date.now();\n this.transcriptEndedAt = 0;\n this.transcriptionStreamService\n .startSession(callId, this.lastLocalStream, this.lastRemoteStream, allowSendBinary)\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(\n text: string,\n isFinal: boolean,\n ts: number,\n speaker?: string\n ): void {\n const trimmed = (text || '').trim();\n if (!trimmed) {\n return;\n }\n const key = (speaker || 'unknown').toString().toLowerCase();\n if (!isFinal) {\n const existingIndex = this.lastPartialIndex[key];\n if (existingIndex !== undefined && this.transcriptSegments[existingIndex]) {\n this.transcriptSegments[existingIndex] = { ts, text: trimmed, speaker };\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n this.lastPartialIndex[key] = this.transcriptSegments.length - 1;\n }\n this.cdr.detectChanges();\n return;\n }\n\n const pendingIndex = this.lastPartialIndex[key];\n if (pendingIndex !== undefined && this.transcriptSegments[pendingIndex]) {\n this.transcriptSegments[pendingIndex] = { ts, text: trimmed, speaker };\n delete this.lastPartialIndex[key];\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n }\n this.cdr.detectChanges();\n }\n\n getTranscriptSpeakerLabel(segment: { speaker?: string }): string {\n const raw = (segment?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'agent') {\n return 'Agent';\n }\n if (normalized === 'customer') {\n return this.activeCallName || this.incomingCallName || 'Unknown';\n }\n return raw || 'Unknown';\n }\n\n getTranscriptBubbleClass(segment: { speaker?: string }): string {\n const normalized = (segment?.speaker || '').toString().trim().toLowerCase();\n if (normalized === 'agent') {\n return 'agent';\n }\n if (normalized === 'customer') {\n return 'customer';\n }\n return '';\n }\n\n get customerTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'customer')\n .map(({ ts, text }) => ({ ts, text }));\n }\n\n get agentTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'agent')\n .map(({ ts, text }) => ({ ts, text }));\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 this.pendingTranscriptionAllowBinary = false;\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.transcriptSegments = [];\n this.lastPartialIndex = {};\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 if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.setStreamMuted(\n this.transcriptionActiveCallId,\n 'agent',\n this.isMuted\n );\n }\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 (transcriptSegments?.length) {\n <div class=\"transcription-split\">\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Customer\n </div>\n <div class=\"transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"transcription-panel\">\n <div class=\"transcription-panel-title\">\n Agent\n </div>\n <div class=\"transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </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';\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\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() token?: string;\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 authErrorMessage = '';\n authLoading = true;\n private hasInitialized = false;\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 private snugdeskAuthService: SnugdeskAuthenticationService\n ) { }\n\n async ngOnInit(): Promise<void> {\n this.restoreThemePreference();\n if (await this.authenticateWithToken()) {\n this.authLoading = false;\n this.initAfterAuth();\n }\n }\n\n private initAfterAuth(): void {\n if (this.hasInitialized) {\n return;\n }\n this.authLoading = false;\n this.hasInitialized = true;\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 private async authenticateWithToken(): Promise<boolean> {\n this.authLoading = true;\n const token = (this.token || '').trim();\n\n if (token) {\n try {\n const ok = this.snugdeskAuthService.checkToken(token);\n if (!ok) {\n this.authErrorMessage = 'Authentication token invalid.';\n return false;\n }\n this.snugdeskAuthService.setToken(token);\n sessionStorage.setItem('auth_sessionToken', token);\n if (!this.tenantId) {\n this.tenantId = this.snugdeskAuthService.getTenantId();\n }\n if (!this.userId) {\n this.userId = this.snugdeskAuthService.getUserId();\n }\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Token validation failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n if (this.tenantId && this.userId) {\n try {\n const loginOk = await this.snugdeskAuthService.login(\n this.tenantId,\n this.userId\n );\n if (!loginOk) {\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n const newToken = this.snugdeskAuthService.getToken();\n if (!newToken) {\n this.authErrorMessage = 'Authentication token missing.';\n return false;\n }\n this.snugdeskAuthService.setToken(newToken);\n this.token = newToken;\n sessionStorage.setItem('auth_sessionToken', newToken);\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Login failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n this.authErrorMessage = 'Authentication token missing.';\n this.authLoading = false;\n return false;\n }\n\n async onAuthLoginClick(): Promise<void> {\n if (await this.authenticateWithToken()) {\n this.authErrorMessage = '';\n this.initAfterAuth();\n }\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 const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!digits) {\n return '';\n }\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n if (countryCode && local.startsWith(countryCode)) {\n local = local.slice(countryCode.length);\n }\n return 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 (authLoading) {\n <div class=\"auth-loading-screen\">\n <div class=\"auth-loading-card\">\n <div class=\"spinner\" aria-hidden=\"true\"></div>\n <div class=\"auth-loading-title\">Checking authentication</div>\n <div class=\"auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"auth-error-screen\">\n <div class=\"auth-error-card\">\n <div class=\"auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"auth-error-title\">Authentication Required</div>\n <div class=\"auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\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}\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":["i1","i2.AuthenticationService","i3","i4","i5.CallDetailsComponent","i1.EntitiesSearchService","i2.ContactCardComponent","i3.ContactDetailsComponent","i2","i6","i2.AvayaIPOService","i3.AuthenticationService","i4.RecordingManagerService","i5.TranscriptionStreamService","i7.PhoneIdleComponent","i8.PhoneIncomingComponent","i9.PhoneActiveComponent","i10","i3.CountryService","i4.PhoneNumberLookupService","i5.EntitiesSearchService","i7.CallHistoryComponent","i8.ContactsComponent","i9.SettingsComponent","i10.AvayaIpoLoginComponent","i11.PhoneComponent"],"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 // Widget build version — shown in the footer so you can confirm which build is loaded.\n // Keep this in sync with the \"version\" field in projects/avaya-ipo-widget/package.json.\n WIDGET_VERSION: '0.2.4',\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 // Snugdesk backend (SnugdeskApiV1) endpoint that upserts a call as a real Interaction so it shows\n // up in the same call history as every other channel in snugdesk-app.\n INTERACTION_CALL_LOG_API_URL: 'https://api.snugdesk.com/avaya-ipo/call-log',\n // Stores the full call recording in the backend and links it to the Interaction, triggering the\n // server-side Gemini transcription/summary pipeline.\n INTERACTION_CALL_RECORDING_API_URL: 'https://api.snugdesk.com/avaya-ipo/call-recording',\n // How recordings reach the backend:\n // 'complete' — one upload at call end via INTERACTION_CALL_RECORDING_API_URL (original flow)\n // 'chunked' — stream 5s chunks over RECORDING_SOCKET_WS_URL during the call; the backend\n // (avaya-ipo-recording-socket Lambda) stitches on every socket close, so a dead tab\n // loses at most the last few seconds. Overridable per-embed via the\n // [recordingUploadMode] input on the widget tag.\n RECORDING_UPLOAD_MODE: 'complete' as 'complete' | 'chunked',\n // API Gateway WebSocket fronting the avaya-ipo-recording-socket Lambda ($connect/$disconnect/$default).\n // From the snugdesk-backend-api stack output: AvayaIpoRecordingSocketUrl.\n RECORDING_SOCKET_WS_URL: 'wss://lmarx4fzy3.execute-api.ap-south-1.amazonaws.com/production',\n // Live in-call transcription (UI kept; backend integration planned — dev endpoint for now).\n TRANSCRIPTION_WS_URL: 'ws://localhost:3100/live-stt/stream',\n TRANSCRIPTION_LANGUAGE: 'auto',\n TRANSCRIPTION_MODEL: 'nova-2',\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 OPENSEARCH_ENTITIES_URL: 'https://api.snugdesk.com/opensearch/entities',\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 // Autoplay blocked — the page has had no user gesture yet (common with auto-login).\n // Ring as soon as the user interacts, if the call is still ringing by then.\n console.warn('[avaya-ipo] Ring tone blocked by autoplay policy; will ring on first user gesture');\n this.armRingRetryOnGesture();\n });\n } catch {\n // ignore play errors\n }\n }\n\n private ringRetryHandler: (() => void) | null = null;\n\n private armRingRetryOnGesture(): void {\n if (this.ringRetryHandler || typeof document === 'undefined') {\n return;\n }\n const handler = () => {\n this.disarmRingRetry();\n // Only ring if the incoming call is still pending.\n if (this.lastIncomingCall && this.ringAudio) {\n this.ringAudio.play().catch(() => { /* still blocked — give up quietly */ });\n }\n };\n this.ringRetryHandler = handler;\n ['click', 'keydown', 'touchstart'].forEach((type) =>\n document.addEventListener(type, handler, { once: true, capture: true })\n );\n }\n\n private disarmRingRetry(): void {\n if (!this.ringRetryHandler || typeof document === 'undefined') {\n return;\n }\n const handler = this.ringRetryHandler;\n this.ringRetryHandler = null;\n ['click', 'keydown', 'touchstart'].forEach((type) =>\n document.removeEventListener(type, handler, { capture: true } as EventListenerOptions)\n );\n }\n\n private stopRingTone(): void {\n this.disarmRingRetry();\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 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 // Push the call into the Snugdesk backend as a real Interaction. The backend (avaya-ipo/call-log)\n // resolves the entity/endpoint and creates-or-updates the Interaction keyed by callId, so the call\n // shows up in the same call history snugdesk-app reads. Authenticated with the Snugdesk session JWT.\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const token =\n (typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('auth_sessionToken')) ||\n '';\n if (token) {\n headers = headers.set('Authorization', `Bearer ${token}`);\n }\n return this.http.post(APP_CONFIG.INTERACTION_CALL_LOG_API_URL, callData, {\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 { SnugdeskAuthenticationService } from '@snugdesk/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthenticationService {\n tenant$: BehaviorSubject<any>;\n user$: BehaviorSubject<any>;\n isAuthenticated$: BehaviorSubject<boolean>;\n\n constructor(private snugdeskAuthService: SnugdeskAuthenticationService) {\n this.tenant$ = this.snugdeskAuthService.tenant$;\n this.user$ = this.snugdeskAuthService.user$;\n this.isAuthenticated$ = this.snugdeskAuthService.isAuthenticated$;\n }\n\n isAuthenticated(): boolean {\n return this.snugdeskAuthService.isAuthenticated();\n }\n\n getAuthSessionToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n\n getAuthDomainToken(): string | null {\n return this.snugdeskAuthService.getToken();\n }\n getDecodedAuthDomainToken(): any {\n return this.snugdeskAuthService.getDecodedToken();\n }\n \n getTenantId(): string {\n // return this.getDecodedAuthSessionToken().tenantId;\n return this.snugdeskAuthService.getTenantId();\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.snugdeskAuthService.getDecodedToken();\n }\n \n\n getUserId(): string {\n return this.snugdeskAuthService.getUserId();\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 private entityIdCache = 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: [{ term: { tenant_id: tenantId } }],\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 return (await this.lookupEntityByPhone(tenantId, phoneNumber, size)).name;\n }\n\n /** Resolve the entity (id + name) matching a phone number; both are cached per tenant+number. */\n async lookupEntityByPhone(\n tenantId: string,\n phoneNumber: string,\n size = 25\n ): Promise<{ id: string | null; name: string | null }> {\n const key = this.cacheKey(tenantId, phoneNumber);\n const cachedName = this.nameCache.get(key) || null;\n const cachedId = this.entityIdCache.get(key) || null;\n if (cachedName || cachedId) {\n return { id: cachedId, name: cachedName };\n }\n const res: any = await this.searchByPhone(tenantId, phoneNumber, size);\n const hit = res?.hits?.hits?.[0];\n const source = hit?._source || {};\n const name = typeof source.name === 'string' ? source.name.trim() : '';\n const id = (source.id || hit?._id || '').toString().trim();\n if (name) {\n this.nameCache.set(key, name);\n }\n if (id) {\n this.entityIdCache.set(key, id);\n }\n return { id: id || null, name: name || 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, OnChanges, SimpleChanges } from '@angular/core';\nimport { AppSyncHelperService } from '@snugdesk/core';\n\ntype TranscriptLine = {\n speaker?: string;\n text?: string;\n};\n\n/**\n * Shows the same AI call analysis as snugdesk-app's conversation view: the data is read\n * from the Interaction record (metadata.aiAnalysis), which the server-side pipeline fills\n * after the recording is uploaded — no client-side transcription is run here.\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 implements OnChanges {\n @Input() call: any;\n\n transcriptLines: TranscriptLine[] = [];\n conversationSummary: string[] = [];\n nextActions: string[] = [];\n keyConcerns: string[] = [];\n callType = '';\n customerIntent = '';\n customerSentiment = '';\n aiConfidenceScore: number | null = null;\n summaryText = '';\n aiProcessingStatus = '';\n hasAnalysis = false;\n isRefreshing = false;\n refreshError = '';\n isTranscriptFullscreen = false;\n\n private readonly GET_INTERACTION_QUERY = `query GetInteraction($id: ID!) {\n getInteraction(id: $id) {\n id\n metadata\n summary\n aiProcessingStatus\n recording { location }\n }\n }`;\n\n constructor(private appSync: AppSyncHelperService) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['call']) {\n this.parseAnalysisFromCall();\n }\n }\n\n get isAnalysisPending(): boolean {\n return ['PENDING', 'IN_PROGRESS'].includes(\n (this.aiProcessingStatus || '').toUpperCase()\n );\n }\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 getTranscriptSpeaker(line: TranscriptLine): string {\n const raw = (line?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'customer') {\n const name = this.getDisplayName();\n return name && name !== 'Unknown' ? name : 'Customer';\n }\n if (normalized === 'agent') {\n return 'Agent';\n }\n return raw || 'Unknown';\n }\n\n getSentimentEmoji(): string {\n const value = (this.customerSentiment || '').toLowerCase();\n if (value.includes('angry') || value.includes('frustrat')) return '😠';\n if (value.includes('calm')) return '😌';\n if (value.includes('happy') || value.includes('positive') || value.includes('satisf')) return '😄';\n if (value.includes('confus')) return '😕';\n if (value.includes('neutral')) return '😐';\n if (value.includes('negative') || value.includes('upset')) return '🙁';\n return '';\n }\n\n /** Re-read the Interaction record (the AI pipeline fills metadata.aiAnalysis asynchronously). */\n async refreshAnalysis(): Promise<void> {\n const id = this.call?.id;\n if (!id || this.isRefreshing) {\n return;\n }\n this.isRefreshing = true;\n this.refreshError = '';\n try {\n const res: any = await this.appSync.query(this.GET_INTERACTION_QUERY, { id });\n const interaction = res?.data?.getInteraction;\n if (interaction) {\n this.call = {\n ...this.call,\n summary: interaction.summary || this.call?.summary || '',\n metadata: this.safeParse(interaction.metadata) || this.call?.metadata,\n aiProcessingStatus: interaction.aiProcessingStatus || '',\n fullCallRecordingUrl:\n interaction.recording?.location || this.call?.fullCallRecordingUrl || '',\n };\n this.parseAnalysisFromCall();\n }\n } catch (err) {\n console.error('[CallDetails] Failed to refresh interaction', err);\n this.refreshError = 'Failed to refresh analysis. Please try again.';\n } finally {\n this.isRefreshing = false;\n }\n }\n\n toggleTranscriptFullscreen(): void {\n this.isTranscriptFullscreen = !this.isTranscriptFullscreen;\n }\n\n /** Pull the structured AI analysis off the interaction's metadata — same shape snugdesk-app reads. */\n private parseAnalysisFromCall(): void {\n const metadata = this.safeParse(this.call?.metadata) || {};\n const ai = metadata.aiAnalysis || {};\n\n this.summaryText = this.normalizeText(this.call?.summary);\n this.aiProcessingStatus = (this.call?.aiProcessingStatus || '').toString();\n this.conversationSummary = this.normalizeBulletItems(ai.conversationSummary);\n this.nextActions = this.normalizeBulletItems(ai.nextAction);\n this.keyConcerns = this.normalizeBulletItems(ai.keyConcerns);\n this.callType = this.normalizeText(ai.callType);\n this.customerIntent = this.normalizeText(ai.customerIntent);\n this.customerSentiment = this.normalizeText(ai.customerSentiment);\n const score = Number(ai.aiConfidenceScore);\n this.aiConfidenceScore = Number.isFinite(score) ? Math.round(score) : null;\n this.transcriptLines = this.normalizeTranscript(ai.transcript);\n\n this.hasAnalysis =\n this.transcriptLines.length > 0 ||\n this.conversationSummary.length > 0 ||\n !!this.callType ||\n !!this.customerIntent ||\n !!this.customerSentiment ||\n this.keyConcerns.length > 0 ||\n this.nextActions.length > 0;\n }\n\n private normalizeText(value: any): string {\n if (value === null || value === undefined) return '';\n return value.toString().trim();\n }\n\n private normalizeBulletItems(input: any): string[] {\n if (!input) return [];\n if (Array.isArray(input)) {\n return input\n .map((item) =>\n typeof item === 'string' ? item.trim() : this.normalizeText(item?.text ?? item)\n )\n .filter(Boolean);\n }\n if (typeof input === 'string') {\n return input\n .split(/\\r?\\n|•/)\n .map((line) => line.replace(/^\\s*[-*\\d.)]+\\s*/, '').trim())\n .filter(Boolean);\n }\n return [];\n }\n\n private normalizeTranscript(input: any): TranscriptLine[] {\n if (!input) {\n return [];\n }\n if (typeof input === 'string') {\n return input\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => this.parseSpeakerLine(line));\n }\n if (Array.isArray(input)) {\n return input\n .map((entry) => {\n if (typeof entry === 'string') {\n return this.parseSpeakerLine(entry);\n }\n if (entry && typeof entry === 'object') {\n return {\n speaker: entry.speaker || entry.role,\n text: entry.text ?? entry.message ?? entry.utterance ?? entry.content,\n };\n }\n return null;\n })\n .filter((line): line is TranscriptLine => !!line && !!line.text);\n }\n return [];\n }\n\n private parseSpeakerLine(line: string): TranscriptLine {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n private safeParse(value: any): any {\n if (!value) return null;\n if (typeof value === 'object') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\n }\n }\n}\n","<div class=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-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=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">\n {{ getDisplayName() }}\n </div>\n <div class=\"avaya-ipo-secondary-info\">\n {{ getPhone() || 'Unknown' }}\n </div>\n <div class=\"avaya-ipo-meta-line\">\n <span>{{ call?.timestamp | date : 'medium' }}</span>\n <span class=\"avaya-ipo-divider\">|</span>\n @if (call?.disconnectSide === 'CALLER' && (call?.duration ?? 0) === 0) {\n <span class=\"avaya-ipo-divider\">|</span>\n <span class=\"avaya-ipo-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=\"avaya-ipo-detail-card avaya-ipo-summary-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Duration</div>\n <div class=\"avaya-ipo-value\">{{ call?.duration ?? 0 }}s</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Disconnect Side</div>\n <div class=\"avaya-ipo-value\">{{ call?.disconnectSide || 'N/A' }}</div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-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=\"avaya-ipo-disabled-btn\" disabled>Processing</button>\n } @else {\n <button class=\"avaya-ipo-disabled-btn\" disabled>Recording not available</button>\n }\n </ng-template>\n </div>\n\n <!-- AI Call Analysis — read from the Interaction record (metadata.aiAnalysis), like snugdesk-app -->\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-title-row\">\n <div class=\"avaya-ipo-detail-title\">AI Call Analysis</div>\n <button\n class=\"avaya-ipo-chat-thread-btn\"\n type=\"button\"\n (click)=\"refreshAnalysis()\"\n [disabled]=\"isRefreshing\"\n aria-label=\"Refresh analysis\"\n title=\"Refresh analysis\"\n >\n @if (isRefreshing) {\n <span class=\"avaya-ipo-btn-spinner\" aria-hidden=\"true\"></span>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path fill=\"currentColor\"\n d=\"M17.65 6.35A7.96 7.96 0 0 0 12 4a8 8 0 1 0 7.73 10h-2.08A6 6 0 1 1 12 6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\" />\n </svg>\n }\n </button>\n </div>\n\n @if (hasAnalysis) {\n @if (aiConfidenceScore !== null) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">AI Confidence</div>\n <div class=\"avaya-ipo-value\">{{ aiConfidenceScore }}%</div>\n </div>\n }\n @if (callType) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Call Type</div>\n <div class=\"avaya-ipo-value\">{{ callType }}</div>\n </div>\n }\n @if (customerSentiment) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Sentiment</div>\n <div class=\"avaya-ipo-value\">\n {{ customerSentiment }}\n @if (getSentimentEmoji()) {\n <span class=\"avaya-ipo-summary-emoji\">{{ getSentimentEmoji() }}</span>\n }\n </div>\n </div>\n }\n @if (customerIntent) {\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Customer Intent</div>\n <div class=\"avaya-ipo-value\">{{ customerIntent }}</div>\n </div>\n }\n @if (conversationSummary.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Conversation Summary</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of conversationSummary; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n @if (keyConcerns.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Key Concerns</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of keyConcerns; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n @if (nextActions.length) {\n <div class=\"avaya-ipo-analysis-section\">\n <div class=\"avaya-ipo-analysis-heading\">Next Actions</div>\n <ul class=\"avaya-ipo-analysis-list\">\n @for (item of nextActions; track $index) {\n <li>{{ item }}</li>\n }\n </ul>\n </div>\n }\n } @else if (isAnalysisPending || isRefreshing) {\n <div class=\"avaya-ipo-transcription-skeleton\">\n @for (item of [1,2,3]; track item) {\n <div class=\"avaya-ipo-transcription-skeleton-line\"></div>\n }\n </div>\n <div class=\"avaya-ipo-placeholder\">AI analysis is being generated… use refresh to check again.</div>\n } @else if (summaryText) {\n <div class=\"avaya-ipo-summary-text\">{{ summaryText }}</div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No AI analysis available for this call yet.</div>\n }\n @if (refreshError) {\n <div class=\"avaya-ipo-status-error\">{{ refreshError }}</div>\n }\n </div>\n\n <div class=\"avaya-ipo-detail-card avaya-ipo-transcription-card\" [class.avaya-ipo-fullscreen]=\"isTranscriptFullscreen\">\n <div class=\"avaya-ipo-detail-title-row\">\n <div class=\"avaya-ipo-detail-title\">Transcript</div>\n @if (transcriptLines.length) {\n <button\n class=\"avaya-ipo-chat-thread-btn\"\n type=\"button\"\n (click)=\"toggleTranscriptFullscreen()\"\n [attr.aria-label]=\"isTranscriptFullscreen ? 'Exit full screen' : 'Enter full screen'\"\n >\n @if (isTranscriptFullscreen) {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\"\n />\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\"\n />\n </svg>\n }\n </button>\n }\n </div>\n @if (transcriptLines.length) {\n <div class=\"avaya-ipo-chat-thread\">\n @for (line of transcriptLines; track $index) {\n <div class=\"avaya-ipo-chat-bubble\" [class.avaya-ipo-agent]=\"(line.speaker || '').toLowerCase() === 'agent'\">\n <div class=\"avaya-ipo-chat-speaker\">{{ getTranscriptSpeaker(line) }}</div>\n <div class=\"avaya-ipo-chat-text\">{{ line.text || '' }}</div>\n </div>\n }\n </div>\n } @else if (isAnalysisPending || isRefreshing) {\n <div class=\"avaya-ipo-transcription-skeleton\">\n @for (item of [1,2,3,4,5]; track item) {\n <div class=\"avaya-ipo-transcription-skeleton-line\"></div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-placeholder\">No transcript available.</div>\n }\n </div>\n</div>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { AppSyncHelperService, SnugdeskAuthenticationService } from '@snugdesk/core';\nimport { 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 showHistoryLoader: boolean = false;\n\n callHistory: any[] = [];\n searchTerm = '';\n recentCallactiveTab: 'recentCall' | 'missedCall' = 'recentCall';\n selectedCall: any = null;\n\n // Same backend call history snugdesk-app reads: all PHONE-channel Interactions for the tenant,\n // newest first. Run through @snugdesk/core's AppSync helper so auth + Amplify config are shared\n // with the host app.\n private readonly LIST_PHONE_INTERACTIONS_QUERY = `query ListPhoneInteractionsByTenantId($tenantId: ID!, $sortDirection: ModelSortDirection, $filter: ModelInteractionFilterInput, $limit: Int, $nextToken: String) {\n listInteractionsByTenantId(tenantId: $tenantId, sortDirection: $sortDirection, filter: $filter, limit: $limit, nextToken: $nextToken) {\n items {\n id\n providerInteractionId\n channel\n provider\n direction\n status\n last_status\n metadata\n summary\n aiProcessingStatus\n startedAt\n completedAt\n duration\n createdAt\n recording { key bucket location }\n entityConversation { id entityAddress }\n entity { id name phoneNumberE164 }\n endpoint { id address }\n }\n nextToken\n }\n }`;\n\n constructor(\n private cdr: ChangeDetectorRef,\n private appSync: AppSyncHelperService,\n private auth: SnugdeskAuthenticationService\n ) {}\n\n async ngOnInit(): Promise<void> {\n await this.loadCallHistory();\n }\n\n recentSelectTab(tab: 'recentCall' | 'missedCall'): void {\n this.recentCallactiveTab = tab;\n }\n\n async loadCallHistory(): Promise<void> {\n this.showHistoryLoader = true;\n try {\n const tenantId = this.tenantId || this.auth.getTenantId();\n if (!tenantId) {\n console.warn('Missing tenantId for call history');\n return;\n }\n\n const items = await this.fetchPhoneInteractions(tenantId);\n this.callHistory = items\n .map((interaction) => this.mapInteractionToHistoryItem(interaction))\n .filter((item) => !!item)\n .sort(\n (a: any, b: any) =>\n new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()\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 private async fetchPhoneInteractions(tenantId: string): Promise<any[]> {\n const interactions: any[] = [];\n let nextToken: string | undefined;\n let pages = 0;\n // Scope to the logged-in agent: Avaya interactions are tagged with hostId = the agent's user id.\n const userId = this.auth.getUserId();\n const andFilters: any[] = [\n { channel: { eq: 'PHONE' } },\n { deletedAt: { attributeExists: false } },\n ];\n if (userId) {\n andFilters.push({ hostId: { eq: userId } });\n }\n do {\n const variables: any = {\n tenantId,\n sortDirection: 'DESC',\n filter: { and: andFilters },\n limit: 100,\n };\n if (nextToken) {\n variables.nextToken = nextToken;\n }\n const res: any = await this.appSync.query(this.LIST_PHONE_INTERACTIONS_QUERY, variables);\n const data = res?.data?.listInteractionsByTenantId;\n if (Array.isArray(data?.items)) {\n interactions.push(...data.items.filter((i: any) => !!i));\n }\n nextToken = data?.nextToken || undefined;\n pages++;\n } while (nextToken && interactions.length < 200 && pages < 5);\n return interactions;\n }\n\n private mapInteractionToHistoryItem(interaction: any): any {\n if (!interaction) {\n return null;\n }\n const metadata = this.safeParse(interaction.metadata) || {};\n const phoneData = metadata.phoneData || {};\n const direction = (interaction.direction || '').toUpperCase() === 'OUT' ? 'outbound' : 'inbound';\n const status = interaction.status || '';\n const duration = Number(interaction.duration) || 0;\n const missed = ['MISSED', 'NO_ANSWER'].includes(status);\n const customerNumber =\n interaction.entity?.phoneNumberE164 ||\n interaction.entityConversation?.entityAddress ||\n phoneData.CallerID ||\n phoneData.CustomerNumber ||\n '';\n const entityName = (interaction.entity?.name || '').toString();\n const isJustNumber = !entityName || /^\\+?[\\d\\s-]+$/.test(entityName);\n const name = !isJustNumber ? entityName : metadata.callerName || '';\n const tsSec = interaction.startedAt || interaction.createdAt || 0;\n const disconnectSide =\n missed && direction === 'inbound' ? 'CALLER' : metadata.disconnectSide || 'AGENT';\n\n return {\n id: interaction.id,\n callId: interaction.providerInteractionId,\n direction,\n status,\n duration: missed ? 0 : duration,\n disconnectSide,\n timestamp: tsSec ? new Date(tsSec * 1000).toISOString() : new Date().toISOString(),\n summary: interaction.summary || '',\n metadata,\n aiProcessingStatus: interaction.aiProcessingStatus || '',\n fullCallRecordingUrl: interaction.recording?.location || metadata.phoneData?.AudioFile || '',\n phoneNumber: {\n normalizedPhoneNumber: customerNumber,\n name: name || undefined,\n lookupPhoneNumber: name ? { name } : undefined,\n },\n };\n }\n\n private safeParse(value: any): any {\n if (!value) return null;\n if (typeof value === 'object') return value;\n try {\n return JSON.parse(value);\n } catch {\n return null;\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 const termDigits = this.searchTerm.replace(/\\D/g, '');\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 const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\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 filteredMissed(): any[] {\n if (!this.searchTerm.trim()) return this.callerDropped;\n const term = this.searchTerm.toLowerCase();\n const termDigits = this.searchTerm.replace(/\\D/g, '');\n return this.callerDropped.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 const phoneDigits = phone.toString().replace(/\\D/g, '');\n return (\n (termDigits ? phoneDigits.includes(termDigits) : false) ||\n phone.toString().toLowerCase().includes(term) ||\n name.toString().toLowerCase().includes(term)\n );\n });\n }\n\n get groupedMissed(): Array<{ label: string; items: any[] }> {\n return this.groupByDate(this.filteredMissed);\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 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=\"avaya-ipo-recent_container_outer\">\n @if (selectedCall) {\n <div class=\"avaya-ipo-history_details_panel\">\n <button class=\"avaya-ipo-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=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-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 <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-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 <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedRecent; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name\" [class.avaya-ipo-history_name_missed]=\"call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta\" [ngClass]=\"{\n 'avaya-ipo-missed': call.status === 'MISSED',\n 'avaya-ipo-caller_drop': call.disconnectSide === 'CALLER' && (call.duration ?? 0) <= 0\n }\">\n <span class=\"avaya-ipo-meta_label\" [ngClass]=\"{\n 'avaya-ipo-inbound': call.direction?.toLowerCase() === 'inbound',\n 'avaya-ipo-outbound': call.direction?.toLowerCase() === 'outbound',\n 'avaya-ipo-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=\"avaya-ipo-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=\"avaya-ipo-direction_text\">Outgoing</span>\n }\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n @if (mode === 'transfer') {\n <button class=\"avaya-ipo-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=\"avaya-ipo-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=\"avaya-ipo-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 }\n </div>\n </div>\n </div>\n </div>\n } @if (recentCallactiveTab === 'missedCall') {\n <div class=\"avaya-ipo-recent_tab_container\">\n <div class=\"avaya-ipo-container_recent_list\">\n @if (!selectedCall) {\n <div class=\"avaya-ipo-recent_options_header\">\n <div class=\"avaya-ipo-recent_inner\">\n <button class=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('recentCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'recentCall'\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-recent_btn\" (click)=\"recentSelectTab('missedCall')\"\n [class.avaya-ipo-active]=\"$any(recentCallactiveTab) === 'missedCall'\">\n <span class=\"avaya-ipo-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 <div class=\"avaya-ipo-container_recent_search\">\n <div class=\"avaya-ipo-search_wrap\">\n <svg class=\"avaya-ipo-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 <div class=\"avaya-ipo-container_recent_list_inner\">\n <div class=\"avaya-ipo-scrollbox\">\n @if (showHistoryLoader) {\n <div class=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"avaya-ipo-scrollbox-content\">\n @for (group of groupedMissed; track $index) {\n @if (group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n }\n @for (call of group.items; track $index) {\n <div class=\"avaya-ipo-outer_container_recent\">\n <div class=\"avaya-ipo-history_item\" (click)=\"onSelectCall(call)\">\n <div class=\"avaya-ipo-history_avatar avaya-ipo-grd1\">\n {{ getPhoneBadge(call) }}\n </div>\n <div class=\"avaya-ipo-history_body\">\n <div class=\"avaya-ipo-history_row\">\n <div class=\"avaya-ipo-history_name avaya-ipo-history_name_missed\">\n {{ getPhoneDisplay(call) }}\n </div>\n <div class=\"avaya-ipo-history_time\">{{ call.timestamp | date : \"hh:mm a\" }}</div>\n </div>\n <div class=\"avaya-ipo-history_meta avaya-ipo-caller_drop\">\n <span class=\"avaya-ipo-meta_label avaya-ipo-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=\"avaya-ipo-direction_text\">Missed call</span>\n </span>\n </div>\n </div>\n <div class=\"avaya-ipo-history_actions\">\n <button class=\"avaya-ipo-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=\"avaya-ipo-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 }\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=\"avaya-ipo-contact-card\">\n <div class=\"avaya-ipo-contact-avatar avaya-ipo-grd1\">{{ initials }}</div>\n <div class=\"avaya-ipo-contact-body\">\n <div class=\"avaya-ipo-contact-name\">{{ name }}</div>\n <div class=\"avaya-ipo-contact-phone\">{{ phone }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-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=\"avaya-ipo-call-profile\">\n <div class=\"avaya-ipo-profile-header\">\n <div class=\"avaya-ipo-avatar\">{{ getInitials() }}</div>\n <div class=\"avaya-ipo-profile-info\">\n <div class=\"avaya-ipo-primary-number\">{{ getDisplayName() }}</div>\n <div class=\"avaya-ipo-secondary-info\">{{ getPrimaryPhone() }}</div>\n <div class=\"avaya-ipo-meta-line\">\n @if (contact?.is_organization) {\n <span class=\"avaya-ipo-dir avaya-ipo-outbound\">Organization</span>\n } @else {\n <span class=\"avaya-ipo-dir avaya-ipo-inbound\">Individual</span>\n }\n <span class=\"avaya-ipo-divider\">|</span>\n <span>{{ contact?.is_blocked ? 'Blocked' : 'Active' }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Phones</div>\n <div class=\"avaya-ipo-value\">\n @if (getPhoneNumbers().length) {\n {{ getPhoneNumbers().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Emails</div>\n <div class=\"avaya-ipo-value\">\n @if (getEmails().length) {\n {{ getEmails().join(', ') }}\n } @else {\n N/A\n }\n </div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Call</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_call ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow Email</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_email ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow SMS</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_sms ? 'Yes' : 'No' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Allow WhatsApp</div>\n <div class=\"avaya-ipo-value\">{{ contact?.allow_whatsapp ? 'Yes' : 'No' }}</div>\n </div>\n </div>\n\n <div class=\"avaya-ipo-detail-card\">\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Created</div>\n <div class=\"avaya-ipo-value\">{{ contact?.created_at ? (contact.created_at * 1000 | date : 'medium') : 'N/A' }}</div>\n </div>\n <div class=\"avaya-ipo-detail-row\">\n <div class=\"avaya-ipo-label\">Updated</div>\n <div class=\"avaya-ipo-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 // Only auto-fill when the container is actually bounded (clientHeight > 0); guards against an\n // unbounded layout looping loadNextPage forever.\n if (el.clientHeight > 0 && 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 // Size pages to the ACTUAL scroll container, not the window — so a small popup box doesn't\n // over-fetch and a large/standalone layout doesn't loop. Fall back to window math, then a default.\n const el = this.listEl?.nativeElement;\n const available =\n el && el.clientHeight > 0\n ? el.clientHeight\n : Math.max(280, (typeof window !== 'undefined' ? window.innerHeight : 800) - 260);\n const rowHeight = 64;\n const rows = Math.ceil(available / rowHeight);\n return Math.max(10, rows);\n }\n\n}\n","<div class=\"avaya-ipo-contacts-panel\">\n @if (!selectedContact) {\n <div class=\"avaya-ipo-contacts-search\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-history_skeleton\">\n @for (item of [1,2,3,4]; track item) {\n <div class=\"avaya-ipo-skeleton_row\">\n <div class=\"avaya-ipo-skeleton_avatar avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_body\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-wide avaya-ipo-shine\"></div>\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-medium avaya-ipo-shine\"></div>\n </div>\n <div class=\"avaya-ipo-skeleton_meta\">\n <div class=\"avaya-ipo-skeleton_line avaya-ipo-short avaya-ipo-shine\"></div>\n </div>\n </div>\n }\n </div>\n } @else if (error) {\n <div class=\"avaya-ipo-contacts-state avaya-ipo-error\">{{ error }}</div>\n } @else if (selectedContact) {\n <div class=\"avaya-ipo-contact-details\">\n <div class=\"avaya-ipo-contact-details-actions\">\n <button type=\"button\" class=\"avaya-ipo-contact-back\" (click)=\"closeContact()\">← Back</button>\n <button type=\"button\" class=\"avaya-ipo-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=\"avaya-ipo-contacts-state\">No contacts found.</div>\n } @else {\n <div class=\"avaya-ipo-contacts-list\" (scroll)=\"onListScroll($event)\" #listEl>\n @for (group of groupedContacts; track group.label) {\n <div class=\"avaya-ipo-history_group_label\">{{ group.label }}</div>\n @for (contact of group.items; track contact.id) {\n <button type=\"button\" class=\"avaya-ipo-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=\"avaya-ipo-contacts-load-more\">\n <div class=\"avaya-ipo-contacts-spinner\" aria-hidden=\"true\"></div>\n </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';\nimport { APP_CONFIG } from '../../config/app-config';\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 readonly widgetVersion = APP_CONFIG.WIDGET_VERSION;\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=\"avaya-ipo-settings-wrapper\">\n <div class=\"avaya-ipo-settings-card\">\n <div class=\"avaya-ipo-settings-header\">\n <div>\n <div class=\"avaya-ipo-settings-title\">Account</div>\n <div class=\"avaya-ipo-settings-subtitle\">Extension ID: {{ extensionId || 'N/A' }}</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-logout-chip\" (click)=\"onLogout()\">\n Logout\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Audio Devices</div>\n\n <div class=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-microphone\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Microphone</div>\n <div class=\"avaya-ipo-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=\"avaya-ipo-device-item\">\n <div class=\"avaya-ipo-device-icon\">\n <i class=\"fa-solid fa-volume-high\"></i>\n </div>\n <div class=\"avaya-ipo-device-body\">\n <div class=\"avaya-ipo-device-title\">Speakers</div>\n <div class=\"avaya-ipo-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=\"avaya-ipo-settings-section\">\n <div class=\"avaya-ipo-section-heading\">Appearance</div>\n <button type=\"button\" class=\"avaya-ipo-theme-toggle\" (click)=\"onToggleDarkMode()\">\n <span class=\"avaya-ipo-theme-label\">Dark Mode</span>\n <span class=\"avaya-ipo-theme-pill\" [class.avaya-ipo-is-on]=\"darkMode\">\n <span class=\"avaya-ipo-theme-knob\"></span>\n </span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-settings-section avaya-ipo-about-section\">\n <div class=\"avaya-ipo-section-heading\">About</div>\n <div class=\"avaya-ipo-about-row\">\n <span class=\"avaya-ipo-about-label\">Version</span>\n <span class=\"avaya-ipo-about-value\">v{{ widgetVersion }}</span>\n </div>\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=\"avaya-ipo-login-background\">\n <div class=\"avaya-ipo-login-simple\">\n <div class=\"avaya-ipo-logo\">\n <div class=\"avaya-ipo-logo-img\"></div>\n <div class=\"avaya-ipo-logo-text\">IP Office<span>TM</span></div>\n </div>\n\n @if (hasAvayaSocketError || hasAvayaLoginError || hasAvayaLoginFailedGeneral || hasAvayaLoginConflictError || hasAvayaDeviceError) {\n <p class=\"avaya-ipo-alert avaya-ipo-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=\"avaya-ipo-form\" autocomplete=\"off\">\n <mat-form-field appearance=\"outline\" class=\"avaya-ipo-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=\"avaya-ipo-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=\"avaya-ipo-btn\" [disabled]=\"showLoginLoader\">\n @if (showLoginLoader) { <span class=\"avaya-ipo-spinner\"></span> } @else { <span>Login</span> }\n </button>\n </form>\n\n</div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } 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 type RecordingUploadMode = 'complete' | 'chunked';\n\nexport interface RecordingSession {\n audioContext: AudioContext;\n recordingStream: MediaStreamAudioDestinationNode;\n recorder?: MediaRecorder | null;\n metadata: CallMetadata;\n stopping: boolean;\n chunks: Blob[];\n mimeType: string;\n uploaded: boolean;\n // Chunked-mode state (unused in 'complete' mode)\n mode: RecordingUploadMode;\n socket?: WebSocket | null;\n seq: number;\n pendingChunks: string[];\n sentAny: boolean;\n reconnectTimer?: any;\n reconnectAttempts: number;\n sourceNodes: AudioNode[];\n /** Index into `chunks` up to which slices have been streamed (rewound to 0 on reconnect). */\n streamCursor: number;\n pumping: boolean;\n everConnected: boolean;\n completedSent: boolean;\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 // Record one continuous file for the whole call; a timeslice just flushes data periodically so the\n // final Blob is complete. In 'complete' mode the full recording is uploaded once at call end; in\n // 'chunked' mode each timeslice is also streamed live over the recording WebSocket so the backend\n // can stitch a file even if this tab dies mid-call.\n private readonly TIMESLICE_MS = 1000;\n // API Gateway WebSockets enforce a 32 KB FRAME limit — oversized frames kill the connection (1009).\n // Three-second slices at a capped bitrate stay comfortably under it; anything bigger is split into\n // frame-safe segments before sending (see MAX_WS_DATA_CHARS).\n private readonly CHUNKED_TIMESLICE_MS = 3000;\n // Opus voice at 32 kbps is transparent for calls and keeps a 3s slice ≈ 12 KB raw / 16 KB base64.\n private readonly CHUNKED_AUDIO_BPS = 32000;\n // Base64 payload cap per websocket message (multiple of 4 so each slice decodes independently);\n // leaves ample headroom inside the 32 KB frame limit including the JSON envelope.\n private readonly MAX_WS_DATA_CHARS = 24000;\n private readonly AUDIO_CONTEXT_CLOSE_DELAY_MS = 500;\n private readonly SOCKET_RECONNECT_DELAY_MS = 3000;\n // Pause between the last flushed chunk and the call-completed message: chunk messages invoke the\n // backend Lambda concurrently, so the final parts may still be mid-write to S3 when the stitch\n // would otherwise run. This settle window lets them land first.\n private readonly CALL_COMPLETED_DELAY_MS = 2000;\n // Stop redialing a broken socket after this many consecutive failures — the in-memory chunks and\n // the REST fallback still save the recording at call end, so endless connection spam buys nothing.\n private readonly SOCKET_MAX_RECONNECT_ATTEMPTS = 10;\n // Give the final flush + call-completed message a moment before force-closing the socket.\n private readonly SOCKET_FINALIZE_GRACE_MS = 1500;\n\n private readonly RECORDING_API_URL = APP_CONFIG.INTERACTION_CALL_RECORDING_API_URL;\n private readonly RECORDING_WS_URL = APP_CONFIG.RECORDING_SOCKET_WS_URL;\n\n constructor(private http: HttpClient) {}\n\n startRecording(\n localMediaStream: MediaStream,\n remoteMediaStream: MediaStream,\n metadata: CallMetadata,\n mode: RecordingUploadMode = APP_CONFIG.RECORDING_UPLOAD_MODE\n ): RecordingSession | undefined {\n // Restart for the SAME call in chunked mode (e.g. remote stream arrived late, or the call\n // re-fired CONNECTED): keep the session — one socket and one seq counter per call — and only\n // swap the audio plumbing. Tearing down would open a second socket and prematurely finalize.\n const existing = this.sessions.get(metadata.callId);\n if (existing && existing.mode === 'chunked' && mode === 'chunked' && !existing.stopping) {\n if (localMediaStream && remoteMediaStream) {\n return this.rebindMedia(existing, localMediaStream, remoteMediaStream);\n }\n return existing;\n }\n\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 const localSource = audioContext.createMediaStreamSource(localMediaStream);\n localSource.connect(recordingStream);\n const remoteSource = audioContext.createMediaStreamSource(remoteMediaStream);\n remoteSource.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 session: RecordingSession = {\n audioContext,\n recordingStream,\n metadata,\n stopping: false,\n chunks: [],\n recorder: null,\n mimeType,\n uploaded: false,\n mode,\n socket: null,\n seq: 0,\n pendingChunks: [],\n sentAny: false,\n reconnectAttempts: 0,\n sourceNodes: [localSource, remoteSource],\n streamCursor: 0,\n pumping: false,\n everConnected: false,\n completedSent: false,\n };\n this.sessions.set(metadata.callId, session);\n\n if (mode === 'chunked') {\n this.openRecordingSocket(session);\n }\n\n const recorder = new MediaRecorder(\n recordingStream.stream,\n mode === 'chunked'\n ? { mimeType, audioBitsPerSecond: this.CHUNKED_AUDIO_BPS }\n : { mimeType }\n );\n session.recorder = recorder;\n\n recorder.ondataavailable = (evt: BlobEvent) => {\n if (evt.data && evt.data.size > 0) {\n // Keep the local copy in BOTH modes: it's the upload source in 'complete' mode and the\n // fallback in 'chunked' mode if the socket never works.\n session.chunks.push(evt.data);\n if (session.mode === 'chunked') {\n // The pump streams chunks strictly in order from session.chunks — it also lets a\n // reconnect rewind and re-send the whole call (the backend deletes parts on every close).\n void this.pumpChunks(session);\n }\n }\n };\n recorder.onerror = (err) => {\n console.error(`[${metadata.callId}] MediaRecorder error:`, err);\n };\n recorder.onstop = () => {\n void this.finalizeRecording(session);\n };\n\n recorder.start(mode === 'chunked' ? this.CHUNKED_TIMESLICE_MS : this.TIMESLICE_MS);\n console.debug(`[${metadata.callId}] MediaRecorder started (${mode} mode)`);\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 const rec = session.recorder;\n if (rec && rec.state !== 'inactive') {\n try {\n rec.stop(); // flushes final data, then onstop -> finalizeRecording (uploads)\n console.debug(`[${callId}] MediaRecorder stopped`);\n } catch {\n void this.finalizeRecording(session);\n }\n } else {\n void this.finalizeRecording(session);\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 async finalizeRecording(session: RecordingSession): Promise<void> {\n if (session.uploaded) return;\n session.uploaded = true;\n\n if (session.mode === 'chunked') {\n await this.finalizeChunked(session);\n return;\n }\n\n if (!session.chunks.length) {\n console.warn(`[${session.metadata.callId}] No recording data captured`);\n return;\n }\n\n const blob = new Blob(session.chunks, { type: session.mimeType });\n session.chunks = [];\n const filename = this.generateFilename(\n session.metadata.callId,\n session.metadata.agentId,\n session.mimeType\n );\n\n try {\n await this.uploadCallRecording(session.metadata, blob, filename, session.mimeType);\n console.debug(`[${session.metadata.callId}] ✅ uploaded recording -> ${filename}`);\n } catch (err) {\n console.error(`[${session.metadata.callId}] ❌ recording upload failed`, err);\n }\n }\n\n // ── Chunked mode: stream slices over the recording WebSocket ─────────────────────────────────\n\n /**\n * Rewire fresh local/remote streams into the SAME recording destination. The MediaRecorder (and\n * therefore the single WebM byte stream, the socket and the seq counter) continue uninterrupted —\n * restarting the recorder would inject a second WebM header mid-file and break playback of the\n * stitched recording.\n */\n private rebindMedia(\n session: RecordingSession,\n localMediaStream: MediaStream,\n remoteMediaStream: MediaStream\n ): RecordingSession {\n const { callId } = session.metadata;\n console.debug(`[${callId}] Rewiring recording sources (recorder, socket and seq preserved)`);\n\n for (const node of session.sourceNodes) {\n try { node.disconnect(); } catch { /* already disconnected */ }\n }\n const ctx = session.audioContext;\n if (ctx.state === 'suspended') {\n void ctx.resume();\n }\n const localSource = ctx.createMediaStreamSource(localMediaStream);\n localSource.connect(session.recordingStream);\n const remoteSource = ctx.createMediaStreamSource(remoteMediaStream);\n remoteSource.connect(session.recordingStream);\n session.sourceNodes = [localSource, remoteSource];\n return session;\n }\n\n private openRecordingSocket(session: RecordingSession): void {\n const { metadata } = session;\n // One socket per call: never open a second connection while one is open or still connecting.\n if (\n session.socket &&\n (session.socket.readyState === WebSocket.OPEN ||\n session.socket.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n if (session.reconnectTimer) {\n clearTimeout(session.reconnectTimer);\n session.reconnectTimer = undefined;\n }\n const token =\n (typeof sessionStorage !== 'undefined' && sessionStorage.getItem('auth_sessionToken')) || '';\n const url =\n `${this.RECORDING_WS_URL}?` +\n `token=${encodeURIComponent(token)}` +\n `&callId=${encodeURIComponent(metadata.callId)}` +\n `&tenantId=${encodeURIComponent(metadata.tenantId)}` +\n (metadata.entityId ? `&entityId=${encodeURIComponent(metadata.entityId)}` : '') +\n `&contentType=${encodeURIComponent(session.mimeType)}`;\n\n console.debug(\n `[${metadata.callId}] Opening recording socket (entityId=${metadata.entityId || 'NONE — chunks will land under the NIL entity folder'})`\n );\n try {\n const socket = new WebSocket(url);\n session.socket = socket;\n socket.onopen = () => {\n session.reconnectAttempts = 0;\n if (session.everConnected) {\n // Reconnect after a drop: the backend stitched AND deleted the parts on $disconnect, so\n // rewind and re-stream the entire call from memory — the next stitch then has everything.\n console.debug(`[${metadata.callId}] Recording socket reconnected — re-streaming ${session.chunks.length} slices`);\n session.streamCursor = 0;\n session.seq = 0;\n session.pendingChunks = [];\n void this.pumpChunks(session);\n } else {\n console.debug(`[${metadata.callId}] Recording socket connected`);\n session.everConnected = true;\n this.flushPendingChunks(session);\n void this.pumpChunks(session);\n }\n };\n socket.onerror = (err) => {\n console.warn(`[${metadata.callId}] Recording socket error`, err);\n };\n socket.onclose = () => {\n // Ignore close events from sockets we've already replaced — only the current one counts.\n if (session.socket !== socket) {\n return;\n }\n session.socket = null;\n // Reconnect while the call is still recording — the backend stitches on every close, so a\n // blip costs nothing; the next close re-stitches the fuller file.\n if (!session.stopping && this.sessions.get(metadata.callId) === session) {\n session.reconnectAttempts += 1;\n if (session.reconnectAttempts > this.SOCKET_MAX_RECONNECT_ATTEMPTS) {\n console.warn(\n `[${metadata.callId}] Recording socket gave up after ${this.SOCKET_MAX_RECONNECT_ATTEMPTS} attempts; ` +\n `recording continues in memory and uploads at call end`\n );\n return;\n }\n if (session.reconnectTimer) {\n clearTimeout(session.reconnectTimer);\n }\n session.reconnectTimer = setTimeout(\n () => this.openRecordingSocket(session),\n this.SOCKET_RECONNECT_DELAY_MS\n );\n }\n };\n } catch (err) {\n console.warn(`[${metadata.callId}] Failed to open recording socket`, err);\n session.socket = null;\n }\n }\n\n /** Stream session.chunks in strict order; safe to call repeatedly (single active pump). */\n private async pumpChunks(session: RecordingSession): Promise<void> {\n if (session.pumping || session.completedSent) {\n return;\n }\n session.pumping = true;\n try {\n while (session.streamCursor < session.chunks.length && !session.completedSent) {\n const blob = session.chunks[session.streamCursor];\n session.streamCursor += 1;\n await this.streamChunk(session, blob);\n }\n } finally {\n session.pumping = false;\n }\n }\n\n private async streamChunk(session: RecordingSession, chunk: Blob): Promise<void> {\n if (session.completedSent) {\n // Never send chunks after call-completed: the backend has already stitched and retired the\n // connection; a straggler would just become an orphaned part.\n return;\n }\n try {\n const dataUrl = await this.convertBlobToBase64(chunk);\n const data = dataUrl.split(',')[1] || '';\n if (!data) return;\n // Split into frame-safe segments: API Gateway kills connections on frames > 32 KB. Slicing\n // base64 at 4-char boundaries keeps every segment independently decodable, and each segment\n // carries its own seq — server-side concatenation in seq order reproduces the exact bytes.\n for (let i = 0; i < data.length; i += this.MAX_WS_DATA_CHARS) {\n const segment = data.slice(i, i + this.MAX_WS_DATA_CHARS);\n session.seq += 1;\n const message = JSON.stringify({ action: 'chunk', seq: session.seq, data: segment });\n if (session.socket && session.socket.readyState === WebSocket.OPEN) {\n session.socket.send(message);\n session.sentAny = true;\n } else {\n // Socket down — keep the message (seq already assigned, so order survives a reconnect).\n session.pendingChunks.push(message);\n }\n }\n } catch (err) {\n console.warn(`[${session.metadata.callId}] Failed to stream recording chunk`, err);\n }\n }\n\n private flushPendingChunks(session: RecordingSession): void {\n if (!session.socket || session.socket.readyState !== WebSocket.OPEN) return;\n while (session.pendingChunks.length) {\n session.socket.send(session.pendingChunks.shift()!);\n session.sentAny = true;\n }\n }\n\n private async finalizeChunked(session: RecordingSession): Promise<void> {\n const { metadata } = session;\n if (session.reconnectTimer) {\n clearTimeout(session.reconnectTimer);\n session.reconnectTimer = undefined;\n }\n\n // Wait (briefly) for the pump to drain so the call's tail audio is part of the stitch.\n const drainDeadline = Date.now() + 2000;\n while (\n (session.pumping || session.streamCursor < session.chunks.length) &&\n Date.now() < drainDeadline\n ) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n const socket = session.socket;\n if (socket && socket.readyState === WebSocket.OPEN) {\n try {\n this.flushPendingChunks(session);\n session.completedSent = true; // no further chunks may be queued from here on\n // Let the already-sent chunk writes settle server-side before asking for the stitch.\n await new Promise((resolve) => setTimeout(resolve, this.CALL_COMPLETED_DELAY_MS));\n socket.send(JSON.stringify({ action: 'call-completed' }));\n console.debug(`[${metadata.callId}] ✅ recording finalized over socket (${session.seq} chunks)`);\n } catch (err) {\n console.warn(`[${metadata.callId}] Failed to send call-completed`, err);\n }\n setTimeout(() => {\n try { socket.close(); } catch { /* already closed */ }\n }, this.SOCKET_FINALIZE_GRACE_MS);\n session.chunks = [];\n return;\n }\n\n if (session.sentAny) {\n // Some chunks made it — the backend's $disconnect stitch already saved (or will save) those.\n // Don't double-upload; the lost tail is at most a few seconds.\n console.warn(`[${metadata.callId}] Socket down at finalize; backend stitches what was streamed`);\n session.chunks = [];\n return;\n }\n\n // Streaming never worked at all — fall back to the original complete upload so the recording\n // is not lost just because the socket couldn't connect.\n console.warn(`[${metadata.callId}] Recording socket never connected; falling back to complete upload`);\n if (!session.chunks.length) {\n console.warn(`[${metadata.callId}] No recording data captured`);\n return;\n }\n const blob = new Blob(session.chunks, { type: session.mimeType });\n session.chunks = [];\n const filename = this.generateFilename(metadata.callId, metadata.agentId, session.mimeType);\n try {\n await this.uploadCallRecording(metadata, blob, filename, session.mimeType);\n console.debug(`[${metadata.callId}] ✅ uploaded recording (fallback) -> ${filename}`);\n } catch (err) {\n console.error(`[${metadata.callId}] ❌ fallback recording upload failed`, err);\n }\n }\n\n private async uploadCallRecording(\n metadata: CallMetadata,\n file: Blob,\n filename: string,\n mimeType: string\n ): Promise<{ success: boolean; message: string; interactionId?: string }> {\n try {\n const base64 = await this.convertBlobToBase64(file);\n const body = base64.split(',')[1];\n\n const payload = {\n tenantId: metadata.tenantId,\n callId: metadata.callId,\n agentId: metadata.agentId,\n filename,\n contentType: mimeType,\n isBase64: true,\n body,\n };\n\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const token =\n (typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('auth_sessionToken')) ||\n '';\n if (token) {\n headers = headers.set('Authorization', `Bearer ${token}`);\n }\n\n const res: any = await lastValueFrom(\n this.http.post(this.RECORDING_API_URL, payload, {\n headers,\n responseType: 'json',\n })\n );\n\n return {\n success: true,\n message: res?.status || 'Upload successful',\n interactionId: res?.interactionId,\n };\n } catch (err: any) {\n console.error(`[${metadata.callId}] Recording 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, mimeType: string): string {\n const timestamp = new Date()\n .toISOString()\n .replace(/[:.]/g, '')\n .replace('T', '-')\n .slice(0, 15);\n const ext = mimeType.includes('webm') ? 'webm' : 'dat';\n return `${timestamp}-${agentId}-${callId}.${ext}`;\n }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { 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 speaker?: string;\n};\n\ntype StreamSession = {\n label: 'agent' | 'customer';\n ws: WebSocket;\n processor: ScriptProcessorNode;\n sourceNode: MediaStreamAudioSourceNode;\n closed: boolean;\n lastChunkSentAt: number;\n noiseFloor: number;\n readyForBinary: boolean;\n allowSendBinary: boolean;\n muted: boolean;\n lastAudioSentAt: number;\n voiceStreak: number;\n};\n\ntype TranscriptionSession = {\n callId: string;\n audioContext: AudioContext;\n zeroGain: GainNode;\n streams: StreamSession[];\n closed: boolean;\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 = 512;\n private readonly SILENCE_RMS_THRESHOLD = 0.002;\n private readonly VOICE_RMS_THRESHOLD = 0.006;\n private readonly CUSTOMER_SILENCE_RMS_THRESHOLD = 0.0006;\n private readonly CUSTOMER_VOICE_RMS_THRESHOLD = 0.0025;\n private readonly NOISE_FLOOR_MULTIPLIER = 2.5;\n private readonly NOISE_FLOOR_SMOOTHING = 0.05;\n private readonly MIN_VOICE_FRAMES = 2;\n private readonly CUSTOM_WS_URL = APP_CONFIG.TRANSCRIPTION_WS_URL;\n private readonly LANGUAGE = APP_CONFIG.TRANSCRIPTION_LANGUAGE;\n private readonly TRANSCRIPTION_MODEL = APP_CONFIG.TRANSCRIPTION_MODEL;\n\n constructor() {}\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 allowSendBinary = false\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 customUrl =\n typeof this.CUSTOM_WS_URL === 'string' ? this.CUSTOM_WS_URL.trim() : '';\n if (!customUrl) {\n throw new Error('TRANSCRIPTION_WS_URL is not configured');\n }\n const audioContext = new AudioContext({ sampleRate: this.SAMPLE_RATE });\n const zeroGain = audioContext.createGain();\n zeroGain.gain.value = 0;\n\n zeroGain.connect(audioContext.destination);\n\n const session: TranscriptionSession = {\n callId,\n audioContext,\n zeroGain,\n streams: [],\n closed: false,\n };\n\n this.session = session;\n\n const localSource = audioContext.createMediaStreamSource(localStream);\n const remoteSource = audioContext.createMediaStreamSource(remoteStream);\n session.streams.push(\n this.createStreamSession({\n callId,\n label: 'agent',\n sourceNode: localSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n }),\n this.createStreamSession({\n callId,\n label: 'customer',\n sourceNode: remoteSource,\n audioContext,\n zeroGain,\n url: customUrl,\n allowSendBinary,\n })\n );\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.zeroGain.disconnect();\n } catch {}\n for (const stream of session.streams) {\n stream.closed = true;\n try {\n stream.processor.disconnect();\n stream.sourceNode.disconnect();\n } catch {}\n try {\n if (stream.ws.readyState === WebSocket.OPEN) {\n stream.ws.send(JSON.stringify({ type: 'end' }));\n stream.ws.close();\n }\n } catch {}\n }\n try {\n session.audioContext.close();\n } catch {}\n this.session = null;\n }\n\n destroyAll(): void {\n if (!this.session) {\n return;\n }\n this.stopSession(this.session.callId);\n }\n\n enableBinary(callId: string): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n stream.allowSendBinary = true;\n }\n }\n\n setStreamMuted(callId: string, label: 'agent' | 'customer', muted: boolean): void {\n if (!this.session || this.session.callId !== callId) {\n return;\n }\n for (const stream of this.session.streams) {\n if (stream.label === label) {\n stream.muted = muted;\n }\n }\n }\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 queueAudio(stream: StreamSession, chunk: Uint8Array): void {\n if (stream.ws.readyState !== WebSocket.OPEN) {\n return;\n }\n stream.ws.send(chunk);\n stream.lastAudioSentAt = Date.now();\n stream.lastChunkSentAt = stream.lastAudioSentAt;\n }\n\n private handleTranscriptPayload(callId: string, text: string): void {\n if (!text) return;\n try {\n const data = JSON.parse(text);\n if (typeof data?.text === 'string') {\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: data.text,\n isFinal: Boolean(data?.isFinal ?? data?.final ?? true),\n ts: typeof data?.ts === 'number' ? data.ts : Date.now(),\n speaker: data?.speaker || data?.source,\n });\n return;\n }\n if (data?.type === 'Results' && typeof data?.transcript === 'string') {\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: data.transcript,\n isFinal: Boolean(\n data?.is_final ?? data?.speech_final ?? data?.isFinal ?? data?.final ?? true\n ),\n ts: typeof data?.ts === 'number' ? data.ts : Date.now(),\n speaker: data?.source,\n });\n return;\n }\n if (typeof data?.transcript === 'string') {\n const ts = typeof data?.ts === 'number' ? data.ts : Date.now();\n const isFinal = Boolean(\n data?.isFinal ?? data?.final ?? data?.is_final ?? data?.speech_final ?? true\n );\n const lines = data.transcript\n .split(/\\r?\\n/)\n .map((line: string) => line.trim())\n .filter(Boolean);\n if (lines.length > 1) {\n for (const line of lines) {\n const parsed = this.parseSpeakerLine(line);\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n } else {\n const parsed = this.parseSpeakerLine(data.transcript.trim());\n this.transcriptSubject.next({\n callId: data?.callId || callId,\n text: parsed.text,\n isFinal,\n ts,\n speaker: parsed.speaker,\n });\n }\n return;\n }\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 this.transcriptSubject.next({\n callId,\n text,\n isFinal: true,\n ts: Date.now(),\n });\n }\n }\n\n private parseSpeakerLine(line: string): { speaker?: string; text: string } {\n const match = line.match(/^\\s*(agent|customer)\\s*:\\s*(.*)$/i);\n if (match) {\n return { speaker: match[1].toLowerCase(), text: match[2].trim() };\n }\n return { text: line.trim() };\n }\n\n private createStreamSession(opts: {\n callId: string;\n label: 'agent' | 'customer';\n sourceNode: MediaStreamAudioSourceNode;\n audioContext: AudioContext;\n zeroGain: GainNode;\n url: string;\n allowSendBinary: boolean;\n }): StreamSession {\n const ws = new WebSocket(opts.url);\n ws.binaryType = 'arraybuffer';\n console.debug('[Transcription] Opening WebSocket', {\n url: ws.url,\n source: opts.label,\n });\n\n const processor = opts.audioContext.createScriptProcessor(\n this.BUFFER_SIZE,\n 1,\n 1\n );\n opts.sourceNode.connect(processor);\n processor.connect(opts.zeroGain);\n\n const stream: StreamSession = {\n label: opts.label,\n ws,\n processor,\n sourceNode: opts.sourceNode,\n closed: false,\n lastChunkSentAt: Date.now(),\n noiseFloor: this.SILENCE_RMS_THRESHOLD,\n readyForBinary: false,\n allowSendBinary: opts.allowSendBinary,\n muted: false,\n lastAudioSentAt: Date.now(),\n voiceStreak: 0,\n };\n\n ws.onopen = () => {\n opts.audioContext.resume().catch(() => {});\n const payload = {\n type: 'start',\n callId: opts.callId,\n source: opts.label,\n language: this.LANGUAGE,\n model: this.TRANSCRIPTION_MODEL,\n sampleRate: this.SAMPLE_RATE,\n channels: 1,\n };\n ws.send(JSON.stringify(payload));\n stream.readyForBinary = false;\n if (opts.label === 'customer') {\n setTimeout(() => {\n if (!stream.closed && ws.readyState === WebSocket.OPEN && !stream.readyForBinary) {\n console.debug('[Transcription] No ACK yet, enabling customer stream');\n stream.readyForBinary = true;\n }\n }, 1200);\n }\n console.debug('[Transcription] WebSocket open', { source: opts.label });\n processor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (stream.closed || ws.readyState !== WebSocket.OPEN) {\n return;\n }\n if (stream.muted && opts.label === 'agent') {\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 const silenceThreshold =\n opts.label === 'customer'\n ? this.CUSTOMER_SILENCE_RMS_THRESHOLD\n : this.SILENCE_RMS_THRESHOLD;\n const voiceThreshold =\n opts.label === 'customer'\n ? this.CUSTOMER_VOICE_RMS_THRESHOLD\n : this.VOICE_RMS_THRESHOLD;\n if (rms < silenceThreshold) {\n stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n return;\n }\n const adaptiveThreshold = Math.max(\n voiceThreshold,\n stream.noiseFloor * this.NOISE_FLOOR_MULTIPLIER\n );\n if (rms < adaptiveThreshold) {\n stream.noiseFloor =\n (1 - this.NOISE_FLOOR_SMOOTHING) * stream.noiseFloor +\n this.NOISE_FLOOR_SMOOTHING * rms;\n stream.voiceStreak = 0;\n return;\n }\n stream.voiceStreak += 1;\n if (stream.voiceStreak < this.MIN_VOICE_FRAMES) {\n return;\n }\n const pcmBytes = this.encodePcm16(\n input,\n opts.audioContext.sampleRate\n );\n if (pcmBytes.byteLength === 0) {\n return;\n }\n if (!stream.readyForBinary || !stream.allowSendBinary) {\n return;\n }\n this.queueAudio(stream, pcmBytes);\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 source: opts.label,\n });\n };\n\n ws.onmessage = (evt) => {\n if (!evt?.data) return;\n if (typeof evt.data === 'string') {\n try {\n const maybeAck = JSON.parse(evt.data);\n const ackType = (maybeAck?.type || '').toString().toLowerCase();\n const ackMessage = (maybeAck?.message || '').toString().toLowerCase();\n const isReady =\n (ackType === 'ack' && ackMessage === 'stream-started') ||\n (ackType === 'ready' && ackMessage.includes('ready'));\n if (isReady) {\n stream.readyForBinary = true;\n return;\n }\n } catch {\n // ignore parse failures; handled below\n }\n this.handleTranscriptPayload(opts.callId, evt.data);\n return;\n }\n if (evt.data instanceof Blob) {\n evt.data.text().then((text) => this.handleTranscriptPayload(opts.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 source: opts.label,\n });\n this.stopSession(opts.callId);\n };\n\n return stream;\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=\"avaya-ipo-phone-shell avaya-ipo-classic\" [formGroup]=\"dialForm\" (ngSubmit)=\"onMakeCall()\">\n <div class=\"avaya-ipo-input-row avaya-ipo-classic-input\">\n <ngx-intl-tel-input\n formControlName=\"phoneNumber\"\n name=\"phoneNumber\"\n [cssClass]=\"'avaya-ipo-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=\"avaya-ipo-clear-btn\" (click)=\"onClear()\" aria-label=\"Backspace\" title=\"Backspace\">\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M22 3H7c-.69 0-1.23.35-1.59.88L0 12l5.41 8.12c.36.53.9.88 1.59.88h15c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-3 12.59L17.59 17 14 13.41 10.41 17 9 15.59 12.59 12 9 8.41 10.41 7 14 10.59 17.59 7 19 8.41 15.41 12 19 15.59z\" />\n </svg>\n </button>\n </div>\n\n <div class=\"avaya-ipo-dial-cluster\">\n <div class=\"avaya-ipo-keypad avaya-ipo-classic-grid\">\n <button type=\"button\" (click)=\"onKeypadInput('1')\">\n <span class=\"avaya-ipo-digit\">1</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('2')\">\n <span class=\"avaya-ipo-digit\">2</span>\n <span class=\"avaya-ipo-letters\">ABC</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('3')\">\n <span class=\"avaya-ipo-digit\">3</span>\n <span class=\"avaya-ipo-letters\">DEF</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('4')\">\n <span class=\"avaya-ipo-digit\">4</span>\n <span class=\"avaya-ipo-letters\">GHI</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('5')\">\n <span class=\"avaya-ipo-digit\">5</span>\n <span class=\"avaya-ipo-letters\">JKL</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('6')\">\n <span class=\"avaya-ipo-digit\">6</span>\n <span class=\"avaya-ipo-letters\">MNO</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('7')\">\n <span class=\"avaya-ipo-digit\">7</span>\n <span class=\"avaya-ipo-letters\">PQRS</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('8')\">\n <span class=\"avaya-ipo-digit\">8</span>\n <span class=\"avaya-ipo-letters\">TUV</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('9')\">\n <span class=\"avaya-ipo-digit\">9</span>\n <span class=\"avaya-ipo-letters\">WXYZ</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('*')\">\n <span class=\"avaya-ipo-digit\">*</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('0')\">\n <span class=\"avaya-ipo-digit\">0</span>\n <span class=\"avaya-ipo-letters\">+</span>\n </button>\n <button type=\"button\" (click)=\"onKeypadInput('#')\">\n <span class=\"avaya-ipo-digit\">#</span>\n <span class=\"avaya-ipo-letters\"> </span>\n </button>\n </div>\n\n <div class=\"avaya-ipo-actions\">\n <button type=\"submit\" class=\"avaya-ipo-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 </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=\"avaya-ipo-incoming-screen\">\n <div class=\"avaya-ipo-incoming-avatar\">\n <img [src]=\"incomingAvatarUrl\" alt=\"Incoming call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-incoming-title\">\n @if (incomingCallName) {\n {{ incomingCallName }}\n } @else if (incomingNameResolved) {\n Unknown caller\n } @else {\n \n }\n </div>\n <div class=\"avaya-ipo-incoming-subtitle\">\n {{ incomingCallNumber || 'Unknown number' }}\n </div>\n <div class=\"avaya-ipo-incoming-status\">CALLING...</div>\n\n <div class=\"avaya-ipo-incoming-actions\">\n <button type=\"button\" class=\"avaya-ipo-incoming-btn avaya-ipo-accept\" (click)=\"accept.emit()\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-incoming-btn avaya-ipo-decline\" (click)=\"decline.emit()\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-active-screen\">\n <div class=\"avaya-ipo-active-avatar\">\n <img [src]=\"activeAvatarUrl\" alt=\"Active call avatar\" />\n </div>\n\n <div class=\"avaya-ipo-active-title\">{{ activeCallName || 'Unknown' }}</div>\n <div class=\"avaya-ipo-active-number\">{{ activeCallNumber || '' }}</div>\n <div class=\"avaya-ipo-active-duration\" [class.avaya-ipo-is-disconnected]=\"callStatusText === 'Disconnected'\">\n {{ callStatusText || formatDuration(activeCallDuration) }}\n </div>\n\n <div class=\"avaya-ipo-active-controls\">\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Add call\" [disabled]=\"isConnecting\" [class.avaya-ipo-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=\"avaya-ipo-control-label\">Add Call</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Transfer\" [disabled]=\"isConnecting\" [class.avaya-ipo-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=\"avaya-ipo-control-label\">Transfer</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isMuted\" aria-label=\"Mute\" [disabled]=\"isConnecting\" [class.avaya-ipo-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=\"avaya-ipo-control-label\">{{ isMuted ? 'Unmute' : 'Mute' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" [class.avaya-ipo-active]=\"isHeld\" aria-label=\"Hold\" [disabled]=\"isConnecting\" [class.avaya-ipo-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=\"avaya-ipo-control-label\">{{ isHeld ? 'Unhold' : 'Hold' }}</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-control-btn\" aria-label=\"Keypad\" [disabled]=\"isConnecting\" [class.avaya-ipo-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=\"avaya-ipo-control-label\">Keypad</span>\n </div>\n <div class=\"avaya-ipo-control-item\">\n <button type=\"button\" class=\"avaya-ipo-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=\"avaya-ipo-control-label\">Transcript</span>\n </div>\n </div>\n\n <div class=\"avaya-ipo-active-bottom\">\n <button type=\"button\" class=\"avaya-ipo-end-call-btn\" (click)=\"endCall.emit()\">\n <span class=\"avaya-ipo-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 @Input() recordingUploadMode?: 'complete' | 'chunked';\n /** Entity id of the call counterpart (resolved by the shell) — included in recording metadata. */\n @Input() entityId?: string | null;\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 private pendingTranscriptionAllowBinary = false;\n private lastPartialIndex: Record<string, number> = {};\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 transcriptSegments: Array<{ ts: number; text: string; speaker?: 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, evt.speaker);\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, true);\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 this.pendingTranscriptionAllowBinary = false;\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(\n this.pendingTranscriptionCallId,\n this.pendingTranscriptionAllowBinary\n );\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 this.pendingTranscriptionAllowBinary = false;\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 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.transcriptionStreamService.destroyAll();\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 // Show the ringing screen IMMEDIATELY — the caller-name lookups resolve in place (the template\n // shows the number first and fills the name when ready). Holding the screen until\n // incomingNameResolved meant two network round trips of blank UI while the phone was ringing.\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(\n callId: string,\n allowSendBinary = false\n ): void {\n if (!callId) {\n return;\n }\n if (this.transcriptionActiveCallId === callId) {\n if (allowSendBinary) {\n this.transcriptionStreamService.enableBinary(callId);\n }\n return;\n }\n if (!this.lastLocalStream || !this.lastRemoteStream) {\n this.pendingTranscriptionCallId = callId;\n this.pendingTranscriptionAllowBinary = allowSendBinary;\n return;\n }\n this.pendingTranscriptionCallId = null;\n this.pendingTranscriptionAllowBinary = false;\n this.transcriptSegments = [];\n this.transcriptText = '';\n this.lastPartialIndex = {};\n this.transcriptStartedAt = Date.now();\n this.transcriptEndedAt = 0;\n this.transcriptionStreamService\n .startSession(callId, this.lastLocalStream, this.lastRemoteStream, allowSendBinary)\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(\n text: string,\n isFinal: boolean,\n ts: number,\n speaker?: string\n ): void {\n const trimmed = (text || '').trim();\n if (!trimmed) {\n return;\n }\n const key = (speaker || 'unknown').toString().toLowerCase();\n if (!isFinal) {\n const existingIndex = this.lastPartialIndex[key];\n if (existingIndex !== undefined && this.transcriptSegments[existingIndex]) {\n this.transcriptSegments[existingIndex] = { ts, text: trimmed, speaker };\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n this.lastPartialIndex[key] = this.transcriptSegments.length - 1;\n }\n this.cdr.detectChanges();\n return;\n }\n\n const pendingIndex = this.lastPartialIndex[key];\n if (pendingIndex !== undefined && this.transcriptSegments[pendingIndex]) {\n this.transcriptSegments[pendingIndex] = { ts, text: trimmed, speaker };\n delete this.lastPartialIndex[key];\n } else {\n this.transcriptSegments.push({ ts, text: trimmed, speaker });\n }\n this.cdr.detectChanges();\n }\n\n getTranscriptSpeakerLabel(segment: { speaker?: string }): string {\n const raw = (segment?.speaker || '').toString().trim();\n const normalized = raw.toLowerCase();\n if (normalized === 'agent') {\n return 'Agent';\n }\n if (normalized === 'customer') {\n return this.activeCallName || this.incomingCallName || 'Unknown';\n }\n return raw || 'Unknown';\n }\n\n getTranscriptBubbleClass(segment: { speaker?: string }): string {\n const normalized = (segment?.speaker || '').toString().trim().toLowerCase();\n if (normalized === 'agent') {\n return 'agent';\n }\n if (normalized === 'customer') {\n return 'customer';\n }\n return '';\n }\n\n get customerTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'customer')\n .map(({ ts, text }) => ({ ts, text }));\n }\n\n get agentTranscriptSegments(): Array<{ ts: number; text: string }> {\n return this.transcriptSegments\n .filter((segment) => (segment.speaker || '').toString().toLowerCase() === 'agent')\n .map(({ ts, text }) => ({ ts, text }));\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 this.pendingTranscriptionAllowBinary = false;\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.transcriptSegments = [];\n this.lastPartialIndex = {};\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 if (this.transcriptionActiveCallId) {\n this.transcriptionStreamService.setStreamMuted(\n this.transcriptionActiveCallId,\n 'agent',\n this.isMuted\n );\n }\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 entityId: this.entityId || undefined,\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, this.resolvedRecordingMode());\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 this.resolvedRecordingMode()\n );\n remoteSub.unsubscribe();\n });\n }\n\n /** Per-embed [recordingUploadMode] wins; otherwise the APP_CONFIG default applies. */\n private resolvedRecordingMode(): 'complete' | 'chunked' {\n return this.recordingUploadMode === 'chunked' || this.recordingUploadMode === 'complete'\n ? this.recordingUploadMode\n : APP_CONFIG.RECORDING_UPLOAD_MODE;\n }\n}\n","<div class=\"avaya-ipo-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=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"onClosePhonebook()\">‹</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">{{ isTransferMode ? 'Transfer Call' : 'Add Call' }}</div>\n <div class=\"avaya-ipo-phonebook-title\">Directory</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>+</button>\n </div>\n @if (transferError) {\n <div class=\"avaya-ipo-phonebook-error\">{{ transferError }}</div>\n }\n @if (transferSuccess) {\n <div class=\"avaya-ipo-phonebook-success\">{{ transferSuccess }}</div>\n }\n\n <div class=\"avaya-ipo-phonebook-tabs\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'contacts'\"\n (click)=\"setDirectoryTab('contacts')\">\n Contacts\n </button>\n <button type=\"button\" class=\"avaya-ipo-phonebook-tab\" [class.avaya-ipo-active]=\"directoryTab === 'dialpad'\"\n (click)=\"setDirectoryTab('dialpad')\">\n Dialpad\n </button>\n </div>\n\n <div class=\"avaya-ipo-phonebook-list\">\n @if (directoryTab === 'contacts') {\n <div class=\"avaya-ipo-phonebook-search\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-phonebook-item\" (click)=\"onSelectContact(contact)\">\n <span class=\"avaya-ipo-phonebook-avatar\">{{ (contact.name || contact.phone || 'U') | slice:0:2 }}</span>\n <span class=\"avaya-ipo-phonebook-name\">{{ contact.name || 'Unknown' }}</span>\n <span class=\"avaya-ipo-phonebook-number\">{{ contact.phone || '' }}</span>\n </button>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-empty\">No contacts found</div>\n }\n } @else {\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-input\" [formGroup]=\"directoryForm\">\n <ngx-intl-tel-input formControlName=\"phoneNumber\" name=\"phoneNumber\" [cssClass]=\"'avaya-ipo-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=\"avaya-ipo-dialpad-backspace\" (click)=\"onDirectoryBackspace()\">⌫</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDirectoryKeypad(item.digit)\">\n <span class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</span>\n <span class=\"avaya-ipo-dialpad-letters\">{{ item.letters || '\\u00a0' }}</span>\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-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=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-keypad-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeKeypad()\">‹</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-kicker\">DTMF</div>\n <div class=\"avaya-ipo-phonebook-title\">Keypad</div>\n </div>\n <button type=\"button\" class=\"avaya-ipo-phonebook-add\" disabled>+</button>\n </div>\n\n <div class=\"avaya-ipo-dialpad-input avaya-ipo-dtmf-input\">\n <div class=\"avaya-ipo-dtmf-text\">{{ dtmfBuffer || ' ' }}</div>\n </div>\n\n <div class=\"avaya-ipo-phonebook-dialpad\">\n <div class=\"avaya-ipo-dialpad-grid\">\n @for (item of directoryDigits; track item.digit) {\n <button type=\"button\" class=\"avaya-ipo-dialpad-key\" (click)=\"onDtmfDigit(item.digit)\">\n <div class=\"avaya-ipo-dialpad-digit\">{{ item.digit }}</div>\n @if (item.letters) {\n <div class=\"avaya-ipo-dialpad-letters\">{{ item.letters }}</div>\n }\n </button>\n }\n </div>\n\n <button type=\"button\" class=\"avaya-ipo-dialpad-action\" (click)=\"closeKeypad()\">Done</button>\n </div>\n </div>\n</div>\n}\n\n@if (isTranscriptionOpen) {\n<div class=\"avaya-ipo-phonebook-overlay\">\n <div class=\"avaya-ipo-phonebook-sheet avaya-ipo-transcription-sheet\">\n <div class=\"avaya-ipo-phonebook-header\">\n <button type=\"button\" class=\"avaya-ipo-phonebook-back\" (click)=\"closeTranscription()\">‹</button>\n <div class=\"avaya-ipo-phonebook-titles\">\n <div class=\"avaya-ipo-phonebook-title\">Live Transcription</div>\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-body\">\n @if (transcriptSegments?.length) {\n <div class=\"avaya-ipo-transcription-split\">\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Customer\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (customerTranscriptSegments.length) {\n @for (segment of customerTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No customer speech yet.</div>\n }\n </div>\n </div>\n <div class=\"avaya-ipo-transcription-panel\">\n <div class=\"avaya-ipo-transcription-panel-title\">\n Agent\n </div>\n <div class=\"avaya-ipo-transcription-panel-body\">\n @if (agentTranscriptSegments.length) {\n @for (segment of agentTranscriptSegments; track segment.ts ?? $index) {\n <div class=\"avaya-ipo-transcription-line\">{{ segment.text }}</div>\n }\n } @else {\n <div class=\"avaya-ipo-transcription-placeholder\">No agent speech yet.</div>\n }\n </div>\n </div>\n </div>\n } @else {\n <div class=\"avaya-ipo-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, OnChanges, SimpleChanges, Output } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { AvayaIPOService, CallState, LoginState } from './services/avaya-ipo.service';\nimport { APP_CONFIG, 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';\nimport { SnugdeskAuthenticationService } from '@snugdesk/core';\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, OnChanges {\n @HostBinding('class.avaya-ipo-dark-mode') hostDarkMode = false;\n // Mirror displayMode onto the host element as a class (same pattern as dark-mode) so all layout\n // differences between the two views are pure :host-scoped CSS — the DOM tree is identical in both\n // modes, which keeps every media-element id / scroll-ref / public API invariant intact by construction.\n @HostBinding('class.avaya-ipo-mode-standalone') get hostModeStandalone(): boolean { return this.displayMode === 'standalone'; }\n @HostBinding('class.avaya-ipo-mode-popup') get hostModePopup(): boolean { return this.displayMode !== 'standalone'; }\n private readonly STORAGE_KEY = 'avayaIpoWidgetLogin';\n // Public API inputs (kept for compatibility with host apps)\n @Input() isVisible = true;\n /**\n * Render mode for the widget shell:\n * - 'popup' (default): owns no dimensions — fills whatever box the host gives it (e.g. the snugdesk-app\n * header popover), with a min-size guard and its own internal scroll. Preserves 100% of current behavior.\n * - 'standalone': provides its own full-page frame — a centered card on desktop, full-bleed on mobile —\n * for running the softphone independently.\n */\n @Input() displayMode: 'popup' | 'standalone' = 'popup';\n @Input() configurationMode?: string;\n /** Recording upload strategy: 'complete' (one upload at call end) or 'chunked' (live-streamed\n * over the recording WebSocket, survives a dead tab). Defaults to APP_CONFIG.RECORDING_UPLOAD_MODE. */\n @Input() recordingUploadMode?: 'complete' | 'chunked';\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() token?: string;\n @Input() tenantId!: string;\n @Input() userId!: string;\n /**\n * Optional Avaya IP Office credentials. When BOTH `extension` and `password` are supplied (via the\n * host binding), the widget patches the login form and auto-logs-in once — no manual login needed.\n * If they are not supplied, the widget falls back to any saved localStorage session, otherwise it\n * shows the login form as before.\n */\n @Input() extension?: string;\n @Input() password?: string;\n /** Show/hide the History tab. Default true keeps current behavior. */\n @Input() showHistory = true;\n /** Show/hide the Contacts tab. Default true keeps current behavior. */\n @Input() showContacts = true;\n /**\n * The bottom tab bar only earns its space when at least one of History/Contacts is visible.\n * With both hidden only Keypad (the default view) would remain, so the whole bar is hidden.\n */\n get showTabBar(): boolean {\n return this.showHistory || this.showContacts;\n }\n\n @Output() notificationEvent: EventEmitter<number> = new EventEmitter<number>();\n\n /**\n * Fires when an inbound call starts ringing, so the host app can open/focus the widget popover.\n * Payload: the call id, the caller's number, and the resolved caller name (null if not yet known).\n */\n @Output() incomingCall = new EventEmitter<{ callId: string; number: string; name: string | null }>();\n readonly widgetVersion = APP_CONFIG.WIDGET_VERSION;\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 previousTab: 'history' | 'contacts' | 'keypad' = '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 /** Entity id of the current call's counterpart (resolved via OpenSearch); sent with the\n * chunked-recording socket so chunks land under <tenantId>/<entityId>/avaya-ipo-chunks/. */\n activeCallEntityId: string | null = null;\n incomingCallName: string | null = null;\n incomingNameResolved = false;\n activeCallName: string | null = null;\n authErrorMessage = '';\n authLoading = true;\n private hasInitialized = false;\n private autoLoginAttempted = false;\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 private snugdeskAuthService: SnugdeskAuthenticationService\n ) { }\n\n async ngOnInit(): Promise<void> {\n this.restoreThemePreference();\n if (await this.authenticateWithToken()) {\n this.authLoading = false;\n this.initAfterAuth();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n // If the host supplies/updates credentials after init, attempt the input-based auto-login.\n if ((changes['extension'] || changes['password']) && this.hasInitialized) {\n this.tryAutoLoginFromInputs();\n }\n // If the currently-active tab gets hidden by the host, fall back to the keypad.\n if (changes['showHistory'] || changes['showContacts']) {\n this.ensureVisibleTab();\n }\n }\n\n private ensureVisibleTab(): void {\n if ((this.activeTab === 'history' && !this.showHistory) ||\n (this.activeTab === 'contacts' && !this.showContacts)) {\n this.activeTab = 'keypad';\n }\n }\n\n private initAfterAuth(): void {\n if (this.hasInitialized) {\n return;\n }\n this.authLoading = false;\n this.hasInitialized = true;\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.activeCallEntityId = null;\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 // Signal the host app immediately so it can open/focus the widget popover.\n this.incomingCall.emit({ callId, number: phoneNumber, name: this.incomingCallName });\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 userId: this.userId,\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 userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\n status: 'connected',\n connected: true,\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 userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration,\n status,\n connected: meta.connected,\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.activeCallEntityId = null;\n this.incomingCallName = null;\n }\n }\n }\n );\n\n // Prefer host-provided credentials (auto-login); otherwise fall back to a saved localStorage session.\n if (!this.tryAutoLoginFromInputs()) {\n this.restoreSession();\n }\n }\n\n private async authenticateWithToken(): Promise<boolean> {\n this.authLoading = true;\n const token = (this.token || '').trim();\n\n if (token) {\n try {\n const ok = this.snugdeskAuthService.checkToken(token);\n if (!ok) {\n this.authErrorMessage = 'Authentication token invalid.';\n return false;\n }\n this.snugdeskAuthService.setToken(token);\n sessionStorage.setItem('auth_sessionToken', token);\n if (!this.tenantId) {\n this.tenantId = this.snugdeskAuthService.getTenantId();\n }\n if (!this.userId) {\n this.userId = this.snugdeskAuthService.getUserId();\n }\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Token validation failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n if (this.tenantId && this.userId) {\n try {\n const loginOk = await this.snugdeskAuthService.login(\n this.tenantId,\n this.userId\n );\n if (!loginOk) {\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n const newToken = this.snugdeskAuthService.getToken();\n if (!newToken) {\n this.authErrorMessage = 'Authentication token missing.';\n return false;\n }\n this.snugdeskAuthService.setToken(newToken);\n this.token = newToken;\n sessionStorage.setItem('auth_sessionToken', newToken);\n this.authErrorMessage = '';\n return true;\n } catch (err) {\n console.error('[Auth] Login failed', err);\n this.authErrorMessage = 'Authentication failed.';\n return false;\n }\n finally {\n this.authLoading = false;\n }\n }\n\n this.authErrorMessage = 'Authentication token missing.';\n this.authLoading = false;\n return false;\n }\n\n async onAuthLoginClick(): Promise<void> {\n if (await this.authenticateWithToken()) {\n this.authErrorMessage = '';\n this.initAfterAuth();\n }\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 if (tab === 'settings' && this.activeTab !== 'settings') {\n this.previousTab = this.activeTab;\n }\n this.activeTab = tab;\n }\n\n /** Leave Settings and return to the screen the user came from (guards against a now-hidden tab). */\n closeSettings(): void {\n this.activeTab = this.previousTab;\n this.ensureVisibleTab();\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 /**\n * Public API — place an outbound call programmatically (e.g. click-to-call from the host app).\n * Switches to the keypad view and dials `number`. Requires the widget to be registered;\n * if it is still on the login screen the call is skipped with a warning.\n *\n * Usage from the host app (via @ViewChild(AvayaIPOWidgetComponent)):\n * this.avayaWidget?.makeCall('9876543210');\n */\n makeCall(number: string): void {\n const dial = (number ?? '').toString().trim();\n if (!dial) {\n console.warn('[avaya-ipo] makeCall: no number provided');\n return;\n }\n if (this.showLoginForm) {\n console.warn('[avaya-ipo] makeCall: widget is not registered yet; cannot place call');\n return;\n }\n this.activeTab = 'keypad';\n void this.triggerCall(dial);\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 userId: this.userId,\n agentId: this.loginForm.value.ipoExtensionNo ?? '',\n callId: targetCallId,\n phoneNumber: meta.phoneNumber,\n direction: meta.direction,\n duration: 0,\n status: 'disconnected',\n connected: false,\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.activeCallEntityId = null;\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 // Always run the entity lookup — even when the caller name is already known (contacts/history)\n // we still need the entity ID for the recording socket payload. The provided name keeps display\n // priority below.\n const [lookupResult, callerName] = await Promise.all([\n this.getLookupPhoneNumber(destination),\n 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 userId: this.userId,\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 const entity = await this.entitiesSearchService.lookupEntityByPhone(\n tenantId,\n phoneNumber\n );\n // Remember the entity for the recording socket payload (chunks live under its folder).\n this.activeCallEntityId = entity.id;\n console.debug(\n `[avaya-ipo] entity lookup for ${phoneNumber}: id=${entity.id || 'NONE'} name=${entity.name || 'NONE'}`\n );\n return entity.name;\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 const countryCode = (APP_CONFIG.PHONE_LOOKUP_COUNTRY_CODE || '')\n .toString()\n .replace(/\\D/g, '');\n const digits = normalized.replace(/\\D/g, '');\n if (!digits) {\n return '';\n }\n let local = digits;\n if (local.length >= 10 && local.startsWith('0')) {\n local = local.slice(1);\n }\n if (countryCode && local.startsWith(countryCode)) {\n local = local.slice(countryCode.length);\n }\n return 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 hasInputCredentials(): boolean {\n return !!(this.extension && this.extension.trim() && this.password && this.password.trim());\n }\n\n /**\n * Auto-login when both `extension` and `password` are supplied via @Input. Fires at most once for the\n * widget's lifetime (so a manual logout is respected and we never loop). Returns true if it kicked off\n * a login, so the caller can skip the localStorage fallback.\n */\n private tryAutoLoginFromInputs(): boolean {\n if (this.autoLoginAttempted || !this.loginForm || !this.showLoginForm || !this.hasInputCredentials()) {\n return false;\n }\n this.autoLoginAttempted = true;\n this.loginForm.patchValue({\n ipoExtensionNo: this.extension!.trim(),\n ipoPassword: this.password!.trim(),\n });\n this.showLoginForm = false;\n this.showLoginLoader = true;\n // Brief tick so the view/SDK are ready before we trigger the login.\n setTimeout(() => this.onLogin(), 0);\n return true;\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=\"avaya-ipo-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 (authLoading) {\n <div class=\"avaya-ipo-auth-loading-screen\">\n <div class=\"avaya-ipo-auth-loading-card\">\n <div class=\"avaya-ipo-spinner\" aria-hidden=\"true\"></div>\n <div class=\"avaya-ipo-auth-loading-title\">Checking authentication</div>\n <div class=\"avaya-ipo-auth-loading-message\">Please wait...</div>\n </div>\n </div>\n} @else if (authErrorMessage) {\n <div class=\"avaya-ipo-auth-error-screen\">\n <div class=\"avaya-ipo-auth-error-card\">\n <div class=\"avaya-ipo-auth-error-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M12 2a7 7 0 0 1 7 7v3a2 2 0 0 1 2 2v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-6a2 2 0 0 1 2-2V9a7 7 0 0 1 7-7zm5 10V9a5 5 0 0 0-10 0v3h10zm-5 3a2 2 0 0 0-1 3.732V20h2v-1.268A2 2 0 0 0 12 15z\"\n />\n </svg>\n </div>\n <div class=\"avaya-ipo-auth-error-title\">Authentication Required</div>\n <div class=\"avaya-ipo-auth-error-message\">{{ authErrorMessage }}</div>\n </div>\n </div>\n} @else {\n@if (isReconnectingInProgress || isFailoverInProgress || isFailbackInProgress) {\n <div class=\"avaya-ipo-container_connection_status_overlay\">\n <div class=\"avaya-ipo-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=\"avaya-ipo-widget-body\">\n <div class=\"avaya-ipo-widget-content\">\n @if (activeTab === 'history') {\n @if (!hideTabs) {\n <div class=\"avaya-ipo-page-heading avaya-ipo-heading-right\">\n <span>History</span>\n <button type=\"button\" class=\"avaya-ipo-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=\"avaya-ipo-page-heading\">\n <span>Contacts</span>\n <button type=\"button\" class=\"avaya-ipo-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=\"avaya-ipo-page-heading\">\n <span class=\"avaya-ipo-heading-with-back\">\n <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-back-btn\" (click)=\"closeSettings()\" aria-label=\"Go back\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M15 18l-6-6 6-6\" />\n </svg>\n </button>\n <span>Settings</span>\n </span>\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 <button type=\"button\" class=\"avaya-ipo-settings-btn avaya-ipo-settings-btn-floating\" (click)=\"selectTab('settings')\" aria-label=\"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 }\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 [recordingUploadMode]=\"recordingUploadMode\"\n [entityId]=\"activeCallEntityId\"\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=\"avaya-ipo-global-loader\">\n <div class=\"avaya-ipo-spinner\"></div>\n <div class=\"avaya-ipo-loader-text\">Connecting to phone service...</div>\n </div>\n }\n\n @if (!hideTabs && showTabBar) {\n <nav class=\"avaya-ipo-tabs\">\n @if (showHistory) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'history'\" (click)=\"selectTab('history')\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-tab-text\">History</span>\n </button>\n }\n @if (showContacts) {\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'contacts'\" (click)=\"selectTab('contacts')\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-tab-text\">Contacts</span>\n </button>\n }\n <button type=\"button\" class=\"avaya-ipo-tab-btn\" [class.avaya-ipo-active]=\"activeTab === 'keypad'\" (click)=\"selectTab('keypad')\">\n <span class=\"avaya-ipo-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=\"avaya-ipo-tab-text\">Keypad</span>\n </button>\n </nav>\n }\n\n @if (activeTab !== 'keypad') {\n <div class=\"avaya-ipo-widget-version-footer\">v{{ widgetVersion }}</div>\n }\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":["i1","i2.AuthenticationService","i3","i4","i5.CallDetailsComponent","i1.EntitiesSearchService","i2.ContactCardComponent","i3.ContactDetailsComponent","i2","i6","i2.AvayaIPOService","i3.AuthenticationService","i4.RecordingManagerService","i5.TranscriptionStreamService","i7.PhoneIdleComponent","i8.PhoneIncomingComponent","i9.PhoneActiveComponent","i10","i3.CountryService","i4.PhoneNumberLookupService","i5.EntitiesSearchService","i7.CallHistoryComponent","i8.ContactsComponent","i9.SettingsComponent","i10.AvayaIpoLoginComponent","i11.PhoneComponent"],"mappings":"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"}
|