call-control-sdk 6.0.3 → 6.0.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../call-control-sdk/index.ts","../call-control-sdk/lib/hooks/sdk-state.ts","../call-control-sdk/lib/hooks/eventsTracker.ts","../call-control-sdk/lib/hooks/useLogout.ts","../call-control-sdk/lib/services/endPoint.ts","../call-control-sdk/lib/services/axios.ts","../call-control-sdk/lib/hooks/useEndCall.ts","../call-control-sdk/lib/hooks/useClickToCall.ts","../call-control-sdk/lib/components/callControlPanel.tsx","../call-control-sdk/lib/components/callControls.tsx","../call-control-sdk/lib/hooks/useDraggable.ts","../call-control-sdk/lib/hooks/useSDKState.ts","../call-control-sdk/lib/services/request.ts","../call-control-sdk/lib/services/toastMessage.tsx","../call-control-sdk/lib/components/dialog.tsx","../call-control-sdk/lib/components/styles.ts","../call-control-sdk/lib/components/SDKProvider.tsx"],"sourcesContent":["/**\r\n * @fileoverview Call Control SDK - Main Entry Point\r\n * @description Comprehensive CTI (Computer Telephony Integration) SDK for React applications.\r\n * Provides complete call control functionality including dialing, conferencing, transferring,\r\n * and real-time call management with WebSocket integration.\r\n *\r\n * @author Achala IT Solutions\r\n * @version 1.0.0\r\n * @since 2024\r\n */\r\n\r\nimport { eventTracker } from \"./lib/hooks/eventsTracker\";\r\nimport { sdkStateManager } from \"./lib/hooks/sdk-state\";\r\nimport { useLogout } from \"./lib/hooks/useLogout\";\r\nimport { BASE_URL } from \"./lib/services/endPoint\";\r\nimport { useEndCall } from \"./lib/hooks/useEndCall\";\r\nimport { SDKConfig } from \"./types\";\r\nimport { useClickToCall } from \"./lib/hooks/useClickToCall\";\r\n\r\n// Component exports\r\nexport { CallControlPanel } from \"./lib/components/callControlPanel\";\r\n\r\n// Type exports\r\nexport type {\r\n\tCallControlPanelProps,\r\n\tCallData,\r\n\tCallStatus,\r\n\tConferenceLineTypes,\r\n\tSDKConfig,\r\n\tSDKState,\r\n} from \"./types\";\r\n\r\n/**\r\n * @interface InitSDKParams\r\n * @description Parameters required for SDK initialization\r\n *\r\n * @declaration\r\n * ```typescript\r\n * interface InitSDKParams {\r\n * apiKey: string;\r\n * tenantId: string;\r\n * agentId: string;\r\n * sdkConfig?: SDKConfig;\r\n * }\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `apiKey: string` - Authentication key for SDK access\r\n * - `tenantId: string` - Tenant identifier for multi-tenancy support\r\n * - `agentId: string` - Agent identifier for call management\r\n *\r\n * @returnType Interface definition\r\n *\r\n * @example\r\n * ```typescript\r\n * const initParams: InitSDKParams = {\r\n * apiKey: \"your-api-key\",\r\n * tenantId: \"tenant-123\",\r\n * agentId: \"agent-456\",\r\n * sdkConfig: {\r\n * isDraggable: true,\r\n * disableSoftPhone: false\r\n * }\r\n * };\r\n * ```\r\n *\r\n * @return Interface definition for SDK initialization parameters\r\n *\r\n * @conclusion Essential interface for proper SDK initialization with all required parameters.\r\n */\r\ninterface InitSDKParams {\r\n\t/** Authentication key for SDK access */\r\n\tapiKey: string;\r\n\t/** Tenant identifier for multi-tenancy support */\r\n\ttenantId: string;\r\n\t/** Agent identifier for call management */\r\n\tagentId: string;\r\n\t/** Optional SDK configuration for customizing behavior */\r\n\tsdkConfig?: SDKConfig;\r\n}\r\n\r\n/**\r\n * @function initSDK\r\n * @description Initializes the Call Control SDK with authentication credentials and configuration.\r\n * Sets up event tracking, state management, and establishes connection to the CTI system.\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function initSDK(params: InitSDKParams): Promise<void>\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `params: InitSDKParams` - Object containing API key, tenant ID, agent ID, and optional config\r\n *\r\n * @returnType `Promise<void>`\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic initialization\r\n * await initSDK({\r\n * apiKey: \"your-api-key\",\r\n * tenantId: \"tenant-123\",\r\n * agentId: \"agent-456\"\r\n * });\r\n *\r\n * // With custom configuration\r\n * await initSDK({\r\n * apiKey: \"your-api-key\",\r\n * tenantId: \"tenant-123\",\r\n * agentId: \"agent-456\",\r\n * sdkConfig: {\r\n * isDraggable: true,\r\n * disableSoftPhone: false,\r\n * disableEndCallButton: false\r\n * }\r\n * });\r\n * ```\r\n *\r\n * @return Promise that resolves when initialization is complete\r\n *\r\n * @throws {Error} When API key is missing or invalid\r\n * @throws {Error} When tenant ID is missing or invalid\r\n * @throws {Error} When agent ID is missing or invalid\r\n * @throws {Error} When initialization fails due to network or authentication issues\r\n *\r\n * @conclusion Critical function that must be called before using any SDK functionality.\r\n */\r\nexport async function initSDK({\r\n\tapiKey,\r\n\ttenantId,\r\n\tagentId,\r\n\tsdkConfig,\r\n}: InitSDKParams): Promise<void> {\r\n\t// Input validation\r\n\tif (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n\t\tthrow new Error(\r\n\t\t\t\"SDK initialization failed: API key is required and must be a non-empty string\"\r\n\t\t);\r\n\t}\r\n\r\n\tif (!tenantId || typeof tenantId !== \"string\" || tenantId.trim().length === 0) {\r\n\t\tthrow new Error(\r\n\t\t\t\"SDK initialization failed: Tenant ID is required and must be a non-empty string\"\r\n\t\t);\r\n\t}\r\n\r\n\tif (!agentId || typeof agentId !== \"string\" || agentId.trim().length === 0) {\r\n\t\tthrow new Error(\r\n\t\t\t\"SDK initialization failed: Agent ID is required and must be a non-empty string\"\r\n\t\t);\r\n\t}\r\n\r\n\ttry {\r\n\t\t// Initialize event tracker\r\n\t\tconst initResult = await eventTracker.init({\r\n\t\t\tapiKey: apiKey.trim(),\r\n\t\t\ttenantId: tenantId.trim(),\r\n\t\t\tagentId: agentId.trim(),\r\n\t\t\tbaseUrl: BASE_URL,\r\n\t\t});\r\n\r\n\t\tif (initResult) {\r\n\t\t\tconsole.log(\"SDK initialized successfully\");\r\n\t\t\tsdkStateManager.initialize(apiKey.trim(), agentId.trim(), sdkConfig);\r\n\t\t} else {\r\n\t\t\tconsole.error(\"SDK initialization failed: Event tracker initialization returned false\");\r\n\t\t\tsdkStateManager.setInitCheck();\r\n\t\t\tthrow new Error(\r\n\t\t\t\t\"SDK initialization failed: Unable to establish connection with the CTI system\"\r\n\t\t\t);\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"SDK initialization error:\", error);\r\n\t\tsdkStateManager.setInitCheck();\r\n\r\n\t\tif (error instanceof Error) {\r\n\t\t\tthrow error;\r\n\t\t} else {\r\n\t\t\tthrow new Error(`SDK initialization failed: ${String(error)}`);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @function getSDKVersion\r\n * @description Returns the current version of the Call Control SDK\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function getSDKVersion(): string\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `string`\r\n *\r\n * @example\r\n * ```typescript\r\n * const version = getSDKVersion();\r\n * console.log(`Using Call Control SDK version: ${version}`);\r\n * ```\r\n *\r\n * @return Current SDK version string\r\n *\r\n * @conclusion Utility function for version checking and debugging purposes.\r\n */\r\nexport function getSDKVersion(): string {\r\n\treturn \"5.4.8\";\r\n}\r\n\r\n/**\r\n * @function isSDKInitialized\r\n * @description Checks if the SDK has been successfully initialized\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function isSDKInitialized(): boolean\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `boolean`\r\n *\r\n * @example\r\n * ```typescript\r\n * if (isSDKInitialized()) {\r\n * // SDK is ready to use\r\n * console.log(\"SDK is initialized and ready\");\r\n * } else {\r\n * console.log(\"SDK needs to be initialized first\");\r\n * }\r\n * ```\r\n *\r\n * @return True if SDK is initialized, false otherwise\r\n *\r\n * @conclusion Utility function for checking SDK initialization status before using features.\r\n */\r\nexport function isSDKInitialized(): boolean {\r\n\treturn sdkStateManager.getState().isInitialized;\r\n}\r\n\r\n// Hook exports\r\nexport { useLogout, useEndCall, useClickToCall };\r\n","import type { SDKState, CallData, CallStatus, ConferenceLineTypes, SDKConfig } from \"../../types\";\r\n\r\nclass SDKStateManager {\r\n\tprivate state: SDKState;\r\n\tprivate listeners: Array<() => void> = [];\r\n\tprivate readonly STORAGE_KEY = \"call-control-sdk-state\";\r\n\r\n\tconstructor() {\r\n\t\tthis.state = this.getInitialState();\r\n\t\tthis.loadFromStorage();\r\n\t}\r\n\r\n\tprivate getInitialState(): SDKState {\r\n\t\treturn {\r\n\t\t\tprocess: null,\r\n\t\t\tagentId: \"\",\r\n\t\t\topenConferenceDialog: false,\r\n\t\t\topenCallTransferDialog: false,\r\n\t\t\tisInitialized: false,\r\n\t\t\tsdkConfig: {\r\n\t\t\t\tdisableEndCallButton: false,\r\n\t\t\t\tdisabledDialButton: false,\r\n\t\t\t\tdisableCallTransferButton: false,\r\n\t\t\t\tisDraggable: true,\r\n\t\t\t\tdisableSoftPhone: false,\r\n\t\t\t\tdisableConferenceButton: false,\r\n\t\t\t\tdisabled: {},\r\n\t\t\t\tenabled: {},\r\n\t\t\t\toutlined: {},\r\n\t\t\t},\r\n\t\t\tisHolding: false,\r\n\t\t\tisMuted: false,\r\n\t\t\tstatus: \"idle\",\r\n\t\t\tcallStartTime: null,\r\n\t\t\tcontrolPanelPosition: { x: 10, y: 10 },\r\n\t\t\tiframePosition: { x: 10, y: 80 },\r\n\t\t\tcallData: {\r\n\t\t\t\tagent_id: \"\",\r\n\t\t\t\tstatus: \"\",\r\n\t\t\t\ttype: \"\",\r\n\t\t\t\tevent_time: \"\",\r\n\t\t\t\tphone_number: \"\",\r\n\t\t\t},\r\n\t\t\tconferenceLine: [\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 1,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 2,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 3,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 4,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 5,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t};\r\n\t}\r\n\r\n\tprivate loadFromStorage(): void {\r\n\t\ttry {\r\n\t\t\tconst stored = localStorage.getItem(this.STORAGE_KEY);\r\n\t\t\tif (stored) {\r\n\t\t\t\tconst parsedState = JSON.parse(stored);\r\n\t\t\t\t// Only restore persistent data, not initialization state\r\n\t\t\t\tthis.state = {\r\n\t\t\t\t\t...this.state,\r\n\t\t\t\t\tagentId: parsedState.agentId || \"\",\r\n\t\t\t\t\tprocess: parsedState.process || null,\r\n\t\t\t\t\topenConferenceDialog: parsedState?.openConferenceDialog || false,\r\n\t\t\t\t\topenCallTransferDialog: parsedState?.openCallTransferDialog || false,\r\n\t\t\t\t\tisInitialized: parsedState.isInitialized || false,\r\n\t\t\t\t\tsdkConfig: parsedState.sdkConfig || {\r\n\t\t\t\t\t\tdisableEndCallButton: false,\r\n\t\t\t\t\t\tdisabledDialButton: false,\r\n\t\t\t\t\t\tdisableCallTransferButton: false,\r\n\t\t\t\t\t\tisDraggable: true,\r\n\t\t\t\t\t\tdisableSoftPhone: false,\r\n\t\t\t\t\t\tdisableConferenceButton: false,\r\n\t\t\t\t\t\tdisabled: {},\r\n\t\t\t\t\t\tenabled: {},\r\n\t\t\t\t\t\toutlined: {},\r\n\t\t\t\t\t},\r\n\t\t\t\t\tisHolding: parsedState.isHolding || false,\r\n\t\t\t\t\tisMuted: parsedState.isMuted || false,\r\n\t\t\t\t\tstatus: parsedState.status || \"idle\",\r\n\t\t\t\t\tcallStartTime: parsedState.callStartTime || null,\r\n\t\t\t\t\tcontrolPanelPosition: parsedState.controlPanelPosition || {\r\n\t\t\t\t\t\tx: 10,\r\n\t\t\t\t\t\ty: 10,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tiframePosition: parsedState.iframePosition || { x: 10, y: 80 },\r\n\t\t\t\t\tcallData: parsedState.callData || {\r\n\t\t\t\t\t\tmobileNumber: \"\",\r\n\t\t\t\t\t\tcallReferenceId: \"\",\r\n\t\t\t\t\t\tagent_id: \"\",\r\n\t\t\t\t\t\tstatus: \"\",\r\n\t\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\t\tevent_time: \"\",\r\n\t\t\t\t\t\tphone_number: \"\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Fix: Properly handle conferenceLine with fallback to initial state\r\n\t\t\t\t\tconferenceLine:\r\n\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\tparsedState.conferenceLine &&\r\n\t\t\t\t\t\t\tArray.isArray(parsedState.conferenceLine) &&\r\n\t\t\t\t\t\t\tparsedState.conferenceLine.length > 0\r\n\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\tparsedState.conferenceLine\r\n\t\t\t\t\t\t:\tthis.state.conferenceLine,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn(\"Failed to load SDK state from localStorage:\", error);\r\n\t\t\t// If loading fails, keep the initial state\r\n\t\t}\r\n\t}\r\n\r\n\tprivate saveToStorage(): void {\r\n\t\ttry {\r\n\t\t\tconst persistentState = {\r\n\t\t\t\tagentId: this.state.agentId,\r\n\t\t\t\tprocess: this.state.process,\r\n\t\t\t\tisInitialized: this.state.isInitialized,\r\n\t\t\t\topenConferenceDialog: this.state.openConferenceDialog,\r\n\t\t\t\topenCallTransferDialog: this.state.openCallTransferDialog,\r\n\t\t\t\tsdkConfig: this.state.sdkConfig,\r\n\t\t\t\tisHolding: this.state.isHolding,\r\n\t\t\t\tisMuted: this.state.isMuted,\r\n\t\t\t\tstatus: this.state.status,\r\n\t\t\t\tcallStartTime: this.state.callStartTime,\r\n\t\t\t\tcontrolPanelPosition: this.state.controlPanelPosition,\r\n\t\t\t\tiframePosition: this.state.iframePosition,\r\n\t\t\t\tcallData: this.state.callData,\r\n\t\t\t\tconferenceLine: this.state.conferenceLine,\r\n\t\t\t};\r\n\t\t\tlocalStorage.setItem(this.STORAGE_KEY, JSON.stringify(persistentState));\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn(\"Failed to save SDK state to localStorage:\", error);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate notifyListeners(): void {\r\n\t\tthis.listeners.forEach((listener) => listener());\r\n\t}\r\n\r\n\tpublic initialize(apiKey: string, agentId: string, sdkConfig?: SDKConfig): void {\r\n\t\tif (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n\t\t\tthrow new Error(\"API key not available\");\r\n\t\t} else {\r\n\t\t\tthis.state.agentId = agentId;\r\n\t\t\tthis.state.openConferenceDialog = false;\r\n\t\t\tthis.state.openCallTransferDialog = false;\r\n\t\t\tthis.state.sdkConfig = {\r\n\t\t\t\tdisableEndCallButton: false,\r\n\t\t\t\tdisabledDialButton: false,\r\n\t\t\t\tdisableCallTransferButton: false,\r\n\t\t\t\tisDraggable: true,\r\n\t\t\t\tdisableSoftPhone: false,\r\n\t\t\t\tdisableConferenceButton: false,\r\n\t\t\t\tdisabled: {},\r\n\t\t\t\tenabled: {},\r\n\t\t\t\toutlined: {},\r\n\t\t\t\t...sdkConfig,\r\n\t\t\t};\r\n\t\t\tthis.state.isInitialized = true;\r\n\t\t\tthis.saveToStorage();\r\n\t\t\tthis.notifyListeners();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getState(): SDKState {\r\n\t\treturn { ...this.state };\r\n\t}\r\n\r\n\tpublic subscribe(listener: () => void): () => void {\r\n\t\tthis.listeners.push(listener);\r\n\t\treturn () => {\r\n\t\t\tconst index = this.listeners.indexOf(listener);\r\n\t\t\tif (index > -1) {\r\n\t\t\t\tthis.listeners.splice(index, 1);\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tpublic setHolding(isHolding: boolean): void {\r\n\t\tthis.state.isHolding = isHolding;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setMuted(isMuted: boolean): void {\r\n\t\tthis.state.isMuted = isMuted;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setStatus(status: CallStatus): void {\r\n\t\tthis.state.status = status;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setProcess(process: { process_id: number; process_name: string }): void {\r\n\t\tthis.state.process = process;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setControlPanelPosition(position: { x: number; y: number }): void {\r\n\t\tthis.state.controlPanelPosition = position;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setIframePosition(position: { x: number; y: number }): void {\r\n\t\tthis.state.iframePosition = position;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic startCall(): void {\r\n\t\tthis.state.callStartTime = Date.now();\r\n\t\tthis.state.status = \"on call\";\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic endCall(): void {\r\n\t\tthis.state.callStartTime = null;\r\n\t\tthis.state.status = \"idle\";\r\n\t\tthis.state.isHolding = false;\r\n\t\tthis.state.isMuted = false;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setInitCheck(): void {\r\n\t\tthis.state.isInitialized = false;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setOpenConferenceDialog(open: boolean): void {\r\n\t\tthis.state.openConferenceDialog = open;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setOpenCallTransferDialog(open: boolean): void {\r\n\t\tthis.state.openCallTransferDialog = open;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic updateCallData(data: Partial<CallData>): void {\r\n\t\tthis.state.callData = { ...this.state.callData, ...data };\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic updateConferenceData(data: ConferenceLineTypes[]): void {\r\n\t\tthis.state.conferenceLine = [...data];\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setConferenceLine(line: ConferenceLineTypes): void {\r\n\t\t// Fix: Check if conferenceLine is corrupted and reset if needed\r\n\t\tif (!this.state.conferenceLine || !Array.isArray(this.state.conferenceLine)) {\r\n\t\t\tconsole.warn(\"Conference line data corrupted, resetting to initial state\");\r\n\t\t\tthis.state.conferenceLine = this.getInitialState().conferenceLine;\r\n\t\t}\r\n\r\n\t\tconst conferenceLineData = this.state.conferenceLine?.map((each: ConferenceLineTypes) => {\r\n\t\t\tif (each.line === line.line) {\r\n\t\t\t\treturn line;\r\n\t\t\t}\r\n\t\t\treturn each;\r\n\t\t});\r\n\t\tthis.state.conferenceLine = conferenceLineData;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic resetConferenceLines(): void {\r\n\t\tthis.state.conferenceLine = this.getInitialState().conferenceLine;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic clearStorageAndReset(): void {\r\n\t\ttry {\r\n\t\t\tlocalStorage.removeItem(this.STORAGE_KEY);\r\n\t\t\tthis.state = this.getInitialState();\r\n\t\t\tthis.notifyListeners();\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn(\"Failed to clear localStorage:\", error);\r\n\t\t}\r\n\t}\r\n\r\n\t// Debug methods\r\n\tpublic debugStorage(): void {\r\n\t\ttry {\r\n\t\t\tconst stored = localStorage.getItem(this.STORAGE_KEY);\r\n\t\t\tconsole.log(\"Current localStorage data:\", stored);\r\n\t\t\tif (stored) {\r\n\t\t\t\tconsole.log(\"Parsed localStorage data:\", JSON.parse(stored));\r\n\t\t\t}\r\n\t\t\tconsole.log(\"Current state:\", this.state);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"Error debugging storage:\", error);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getConferenceLines(): ConferenceLineTypes[] {\r\n\t\treturn this.state.conferenceLine || [];\r\n\t}\r\n}\r\n\r\n// SDK State Manager Instance\r\nexport const sdkStateManager = new SDKStateManager();\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/**\r\n * EventTracker SDK - A plug-and-play event tracking system\r\n *\r\n * Usage:\r\n * import EventTracker from '@eventtracker/et';\r\n *\r\n * EventTracker.init({\r\n * apiKey: 'your-api-key',\r\n * tenantId: 'tenant_001',\r\n * agentId: 'agent_123',\r\n * sessionId: 'session_456'\r\n * });\r\n *\r\n * EventTracker.logEvent('appointmentBooked', { patientId: 'p123' });\r\n */\r\n\r\nimport { sdkStateManager } from \"./sdk-state\";\r\n\r\nexport interface EventTrackerConfig {\r\n\tapiKey: string;\r\n\ttenantId: string;\r\n\tagentId: string;\r\n\tsessionId?: string;\r\n\tbaseUrl?: string;\r\n\tautoTrack?:\r\n\t\t| boolean\r\n\t\t| {\r\n\t\t\t\tpageVisits?: boolean;\r\n\t\t\t\tclicks?: boolean;\r\n\t\t\t\tforms?: boolean;\r\n\t\t\t\tinputs?: boolean;\r\n\t\t\t\tscrolling?: boolean;\r\n\t\t\t\tperformance?: boolean;\r\n\t\t\t\terrors?: boolean;\r\n\t\t\t\tvisibility?: boolean;\r\n\t\t };\r\n\tretryAttempts?: number;\r\n\tqueueSize?: number;\r\n\tflushInterval?: number;\r\n}\r\n\r\nexport interface EventData {\r\n\t[key: string]: any;\r\n}\r\n\r\nexport interface EventTrackerInstance {\r\n\tinit(config: EventTrackerConfig): Promise<string | null>;\r\n\tlogEvent(eventType: string, eventData?: EventData): Promise<void>;\r\n\tcloseTicket(): Promise<void>;\r\n\tisInitialized(): boolean;\r\n\tgetConfig(): EventTrackerConfig | null;\r\n\tgetTicketId(): string | null;\r\n\tflush(): Promise<void>;\r\n}\r\n\r\nclass EventTrackerSDK implements EventTrackerInstance {\r\n\tprivate config: EventTrackerConfig | null = null;\r\n\tprivate ticketId: string | null = null;\r\n\tprivate baseUrl: string = \"\";\r\n\tprivate eventQueue: Array<{\r\n\t\teventType: string;\r\n\t\teventData?: EventData;\r\n\t\ttimestamp: number;\r\n\t}> = [];\r\n\tprivate isOnline: boolean = true;\r\n\tprivate retryQueue: Array<() => Promise<void>> = [];\r\n\tprivate flushTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n\t/**\r\n\t * Initialize the EventTracker SDK\r\n\t * @param config Configuration object\r\n\t */\r\n\tasync init(config: EventTrackerConfig): Promise<string | null> {\r\n\t\tthis.config = {\r\n\t\t\tautoTrack: true,\r\n\t\t\tretryAttempts: 3,\r\n\t\t\tqueueSize: 100,\r\n\t\t\tflushInterval: 5000,\r\n\t\t\t...config,\r\n\t\t};\r\n\r\n\t\tthis.baseUrl = config.baseUrl || (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n\t\t// Set up online/offline detection\r\n\t\tthis.setupNetworkDetection();\r\n\r\n\t\t// Create ticket and set up auto-tracking\r\n\t\tconst ticket = await this.createTicket();\r\n\r\n\t\t// Start periodic flush\r\n\t\tthis.startPeriodicFlush();\r\n\r\n\t\tconsole.log(\"EventTracker SDK initialized successfully\");\r\n\t\treturn ticket;\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the SDK is initialized\r\n\t */\r\n\tisInitialized(): boolean {\r\n\t\treturn this.config !== null && this.ticketId !== null;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current configuration\r\n\t */\r\n\tgetConfig(): EventTrackerConfig | null {\r\n\t\treturn this.config;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current ticket ID\r\n\t */\r\n\tgetTicketId(): string | null {\r\n\t\treturn this.ticketId;\r\n\t}\r\n\r\n\t/**\r\n\t * Create a new ticket\r\n\t */\r\n\tprivate async createTicket(): Promise<string | null> {\r\n\t\tif (!this.config) {\r\n\t\t\tthrow new Error(\"EventTracker not initialized\");\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await this.makeRequest(\"/api/v1/et/init\", {\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\r\n\t\t\t\t},\r\n\t\t\t\tbody: JSON.stringify({\r\n\t\t\t\t\tagentId: this.config.agentId,\r\n\t\t\t\t\tsessionId: this.config.sessionId,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tsdkStateManager.setInitCheck();\r\n\t\t\t\tthrow new Error(`Failed to initialize: ${response.status} ${response.statusText}`);\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json();\r\n\t\t\tthis.ticketId = data.ticketId;\r\n\r\n\t\t\t// Set up auto-tracking if enabled\r\n\t\t\tif (this.config.autoTrack) {\r\n\t\t\t\tthis.setupAutoTracking();\r\n\t\t\t}\r\n\t\t\treturn this.ticketId;\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"EventTracker initialization failed:\", error);\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Log an event\r\n\t * @param eventType The type of event\r\n\t * @param eventData Optional event data\r\n\t */\r\n\tasync logEvent(eventType: string, eventData?: EventData): Promise<void> {\r\n\t\tif (!this.config || !this.ticketId) {\r\n\t\t\tconsole.warn(\"EventTracker not initialized, skipping event:\", eventType);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst event = {\r\n\t\t\teventType,\r\n\t\t\teventData,\r\n\t\t\ttimestamp: Date.now(),\r\n\t\t};\r\n\r\n\t\t// Add to queue for offline support\r\n\t\tthis.eventQueue.push(event);\r\n\r\n\t\t// Trim queue if too large\r\n\t\tif (this.eventQueue.length > (this.config.queueSize || 100)) {\r\n\t\t\tthis.eventQueue.shift();\r\n\t\t}\r\n\r\n\t\t// Try to send immediately if online\r\n\t\tif (this.isOnline) {\r\n\t\t\ttry {\r\n\t\t\t\tawait this.sendEvent(event);\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.warn(\"Failed to send event, will retry later:\", error);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Send an event to the server\r\n\t */\r\n\tprivate async sendEvent(event: {\r\n\t\teventType: string;\r\n\t\teventData?: EventData;\r\n\t\ttimestamp: number;\r\n\t}): Promise<void> {\r\n\t\tif (!this.config || !this.ticketId) return;\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await this.makeRequest(\"/api/v1/et/event\", {\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\r\n\t\t\t\t},\r\n\t\t\t\tbody: JSON.stringify({\r\n\t\t\t\t\tticketId: this.ticketId,\r\n\t\t\t\t\teventType: event.eventType,\r\n\t\t\t\t\teventData: event.eventData,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthrow new Error(`Failed to log event: ${response.status} ${response.statusText}`);\r\n\t\t\t}\r\n\r\n\t\t\t// Remove from queue if successful\r\n\t\t\tconst index = this.eventQueue.findIndex((e) => e.timestamp === event.timestamp);\r\n\t\t\tif (index > -1) {\r\n\t\t\t\tthis.eventQueue.splice(index, 1);\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"Event logging failed:\", error);\r\n\r\n\t\t\t// Add to retry queue\r\n\t\t\tthis.retryQueue.push(() => this.sendEvent(event));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Close the current ticket\r\n\t */\r\n\tasync closeTicket(): Promise<void> {\r\n\t\tif (!this.config || !this.ticketId) {\r\n\t\t\tthrow new Error(\"EventTracker not initialized\");\r\n\t\t}\r\n\r\n\t\t// Flush any pending events\r\n\t\tawait this.flush();\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await this.makeRequest(\"/api/v1/et/close\", {\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\r\n\t\t\t\t},\r\n\t\t\t\tbody: JSON.stringify({\r\n\t\t\t\t\tticketId: this.ticketId,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthrow new Error(`Failed to close ticket: ${response.status} ${response.statusText}`);\r\n\t\t\t}\r\n\r\n\t\t\tthis.ticketId = null;\r\n\t\t\tthis.stopPeriodicFlush();\r\n\r\n\t\t\tconsole.log(\"Ticket closed successfully\");\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"Ticket close failed:\", error);\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Flush all pending events\r\n\t */\r\n\tasync flush(): Promise<void> {\r\n\t\tif (!this.isOnline || this.eventQueue.length === 0) return;\r\n\r\n\t\tconst eventsToFlush = [...this.eventQueue];\r\n\r\n\t\tfor (const event of eventsToFlush) {\r\n\t\t\tawait this.sendEvent(event);\r\n\t\t}\r\n\r\n\t\t// Process retry queue\r\n\t\tconst retryItems = [...this.retryQueue];\r\n\t\tthis.retryQueue = [];\r\n\r\n\t\tfor (const retryFn of retryItems) {\r\n\t\t\ttry {\r\n\t\t\t\tawait retryFn();\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error(\"Retry failed:\", error);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Make an HTTP request with retry logic\r\n\t */\r\n\tprivate async makeRequest(url: string, options: RequestInit): Promise<Response> {\r\n\t\tconst fullUrl = `${this.baseUrl}${url}`;\r\n\t\tconst maxRetries = this.config?.retryAttempts || 3;\r\n\r\n\t\tfor (let attempt = 1; attempt <= maxRetries; attempt++) {\r\n\t\t\ttry {\r\n\t\t\t\tconst response = await fetch(fullUrl, options);\r\n\t\t\t\treturn response;\r\n\t\t\t} catch (error) {\r\n\t\t\t\tif (attempt === maxRetries) {\r\n\t\t\t\t\tthrow error;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Exponential backoff\r\n\t\t\t\tconst delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\r\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"Max retries exceeded\");\r\n\t}\r\n\r\n\t/**\r\n\t * Set up automatic event tracking\r\n\t */\r\n\tprivate setupAutoTracking(): void {\r\n\t\tif (typeof window === \"undefined\" || !this.config?.autoTrack) return;\r\n\r\n\t\tconst autoTrackConfig = this.config.autoTrack === true ? {} : this.config.autoTrack;\r\n\r\n\t\t// Track page visits\r\n\t\tif (autoTrackConfig.pageVisits !== false) {\r\n\t\t\tthis.logEvent(\"pageVisit\", {\r\n\t\t\t\turl: window.location.href,\r\n\t\t\t\ttitle: document.title,\r\n\t\t\t\treferrer: document.referrer,\r\n\t\t\t\tuserAgent: navigator.userAgent,\r\n\t\t\t\tviewport: {\r\n\t\t\t\t\twidth: window.innerWidth,\r\n\t\t\t\t\theight: window.innerHeight,\r\n\t\t\t\t},\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t}).catch((error) => console.warn(\"Failed to track page visit:\", error));\r\n\t\t}\r\n\r\n\t\t// Track clicks on any clickable element\r\n\t\tif (autoTrackConfig.clicks !== false) {\r\n\t\t\tdocument.addEventListener(\"click\", (event) => {\r\n\t\t\t\tconst target = event.target as HTMLElement | HTMLButtonElement;\r\n\r\n\t\t\t\t// Track all clickable elements\r\n\t\t\t\tif (\r\n\t\t\t\t\ttarget.tagName === \"BUTTON\" ||\r\n\t\t\t\t\ttarget.tagName === \"A\" ||\r\n\t\t\t\t\ttarget.onclick ||\r\n\t\t\t\t\ttarget.getAttribute(\"role\") === \"button\" ||\r\n\t\t\t\t\t(target instanceof HTMLButtonElement && target.type === \"button\")\r\n\t\t\t\t) {\r\n\t\t\t\t\tthis.logEvent(\"click\", {\r\n\t\t\t\t\t\telement: target.tagName,\r\n\t\t\t\t\t\ttext: target.textContent?.trim().substring(0, 100), // Limit text length\r\n\t\t\t\t\t\thref: target.getAttribute(\"href\"),\r\n\t\t\t\t\t\tid: target.id,\r\n\t\t\t\t\t\tclassName: target.className,\r\n\t\t\t\t\t\trole: target.getAttribute(\"role\"),\r\n\t\t\t\t\t\tposition: {\r\n\t\t\t\t\t\t\tx: event.clientX,\r\n\t\t\t\t\t\t\ty: event.clientY,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t\t}).catch((error) => console.warn(\"Failed to track click:\", error));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track form submissions\r\n\t\tif (autoTrackConfig.forms !== false) {\r\n\t\t\tdocument.addEventListener(\"submit\", (event) => {\r\n\t\t\t\tconst target = event.target as HTMLFormElement;\r\n\t\t\t\tconst formData = new FormData(target);\r\n\t\t\t\tconst formFields: Record<string, string> = {};\r\n\r\n\t\t\t\t// Convert FormData to plain object\r\n\t\t\t\tformData.forEach((value, key) => {\r\n\t\t\t\t\tformFields[key] = value.toString();\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.logEvent(\"formSubmission\", {\r\n\t\t\t\t\tformId: target.id,\r\n\t\t\t\t\taction: target.action,\r\n\t\t\t\t\tmethod: target.method,\r\n\t\t\t\t\tfields: Object.keys(formFields),\r\n\t\t\t\t\tfieldCount: Object.keys(formFields).length,\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t}).catch((error) => console.warn(\"Failed to track form submission:\", error));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track input changes (debounced)\r\n\t\tif (autoTrackConfig.inputs !== false) {\r\n\t\t\tlet inputTimer: ReturnType<typeof setInterval>;\r\n\t\t\tdocument.addEventListener(\"input\", (event) => {\r\n\t\t\t\tconst target = event.target as HTMLInputElement;\r\n\t\t\t\tif (\r\n\t\t\t\t\ttarget.tagName === \"INPUT\" ||\r\n\t\t\t\t\ttarget.tagName === \"TEXTAREA\" ||\r\n\t\t\t\t\ttarget.tagName === \"SELECT\"\r\n\t\t\t\t) {\r\n\t\t\t\t\tclearTimeout(inputTimer);\r\n\t\t\t\t\tinputTimer = setTimeout(() => {\r\n\t\t\t\t\t\tthis.logEvent(\"fieldChange\", {\r\n\t\t\t\t\t\t\telement: target.tagName,\r\n\t\t\t\t\t\t\ttype: target.getAttribute(\"type\"),\r\n\t\t\t\t\t\t\tname: target.getAttribute(\"name\"),\r\n\t\t\t\t\t\t\tid: target.id,\r\n\t\t\t\t\t\t\tvalueLength: target.value?.length || 0,\r\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t\t\t}).catch((error) => console.warn(\"Failed to track field change:\", error));\r\n\t\t\t\t\t}, 1000); // Debounce for 1 second\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track page unload and session duration\r\n\t\tconst sessionStartTime = Date.now();\r\n\t\twindow.addEventListener(\"beforeunload\", () => {\r\n\t\t\tconst sessionDuration = Date.now() - sessionStartTime;\r\n\r\n\t\t\tthis.logEvent(\"pageUnload\", {\r\n\t\t\t\turl: window.location.href,\r\n\t\t\t\tsessionDuration: sessionDuration,\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t});\r\n\r\n\t\t\t// Close ticket synchronously\r\n\t\t\tif (this.ticketId) {\r\n\t\t\t\tnavigator.sendBeacon(\r\n\t\t\t\t\t`${this.baseUrl}/api/v1/et/close`,\r\n\t\t\t\t\tJSON.stringify({\r\n\t\t\t\t\t\tticketId: this.ticketId,\r\n\t\t\t\t\t})\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Track visibility changes\r\n\t\tif (autoTrackConfig.visibility !== false) {\r\n\t\t\tdocument.addEventListener(\"visibilitychange\", () => {\r\n\t\t\t\tthis.logEvent(\"visibilityChange\", {\r\n\t\t\t\t\thidden: document.hidden,\r\n\t\t\t\t\tvisibilityState: document.visibilityState,\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track errors\r\n\t\tif (autoTrackConfig.errors !== false) {\r\n\t\t\twindow.addEventListener(\"error\", (event) => {\r\n\t\t\t\tthis.logEvent(\"jsError\", {\r\n\t\t\t\t\tmessage: event.message,\r\n\t\t\t\t\tfilename: event.filename,\r\n\t\t\t\t\tlineno: event.lineno,\r\n\t\t\t\t\tcolno: event.colno,\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// Track unhandled promise rejections\r\n\t\t\twindow.addEventListener(\"unhandledrejection\", (event) => {\r\n\t\t\t\tthis.logEvent(\"unhandledRejection\", {\r\n\t\t\t\t\treason: event.reason?.toString(),\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track performance metrics (if available)\r\n\t\tif (\r\n\t\t\tautoTrackConfig.performance !== false &&\r\n\t\t\ttypeof window.performance !== \"undefined\" &&\r\n\t\t\twindow.performance.navigation\r\n\t\t) {\r\n\t\t\twindow.addEventListener(\"load\", () => {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tconst navigation = window.performance.navigation;\r\n\t\t\t\t\tconst timing = window.performance.timing;\r\n\r\n\t\t\t\t\tthis.logEvent(\"performanceMetrics\", {\r\n\t\t\t\t\t\tnavigationTime: timing.navigationStart,\r\n\t\t\t\t\t\tloadTime: timing.loadEventEnd - timing.navigationStart,\r\n\t\t\t\t\t\tdomReady: timing.domContentLoadedEventEnd - timing.navigationStart,\r\n\t\t\t\t\t\trenderTime: timing.loadEventEnd - timing.domContentLoadedEventEnd,\r\n\t\t\t\t\t\tnavigationType: navigation.type,\r\n\t\t\t\t\t\tredirectCount: navigation.redirectCount,\r\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t\t});\r\n\t\t\t\t}, 1000);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Set up network detection\r\n\t */\r\n\tprivate setupNetworkDetection(): void {\r\n\t\tif (typeof window === \"undefined\") return;\r\n\r\n\t\tthis.isOnline = navigator.onLine;\r\n\r\n\t\twindow.addEventListener(\"online\", () => {\r\n\t\t\tthis.isOnline = true;\r\n\t\t\tconsole.log(\"EventTracker: Back online, flushing queued events\");\r\n\t\t\tthis.flush();\r\n\t\t});\r\n\r\n\t\twindow.addEventListener(\"offline\", () => {\r\n\t\t\tthis.isOnline = false;\r\n\t\t\tconsole.log(\"EventTracker: Offline, queueing events\");\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Start periodic flush timer\r\n\t */\r\n\tprivate startPeriodicFlush(): void {\r\n\t\tif (this.flushTimer) {\r\n\t\t\tclearInterval(this.flushTimer);\r\n\t\t}\r\n\r\n\t\tconst interval = this.config?.flushInterval || 5000;\r\n\t\tthis.flushTimer = setInterval(() => {\r\n\t\t\tthis.flush();\r\n\t\t}, interval);\r\n\t}\r\n\r\n\t/**\r\n\t * Stop periodic flush timer\r\n\t */\r\n\tprivate stopPeriodicFlush(): void {\r\n\t\tif (this.flushTimer) {\r\n\t\t\tclearInterval(this.flushTimer);\r\n\t\t\tthis.flushTimer = null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// Create singleton instance\r\nexport const eventTracker = new EventTrackerSDK();\r\n\r\n// Also export for direct use in browsers\r\nif (typeof window !== \"undefined\") {\r\n\t(window as any).EventTracker = eventTracker;\r\n}\r\n","/**\r\n * @fileoverview 🚪 Logout Hook for CTI SDK\r\n *\r\n * This file contains the useLogout custom hook that provides comprehensive agent logout\r\n * functionality for the CTI SDK. It handles secure logout procedures, state cleanup,\r\n * and storage management with intelligent error handling and proper cleanup.\r\n *\r\n * 🎯 Key Features:\r\n * - 🚪 Secure agent logout with API validation\r\n * - 🗑️ Complete state cleanup and reset\r\n * - 💾 Storage management (localStorage & sessionStorage)\r\n * - ⏳ Loading states and error handling\r\n * - 📊 Real-time state updates\r\n * - 🛡️ Comprehensive error management\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport { useCallback, useState } from \"react\";\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"./sdk-state\"; // 🗃️ Global state manager\r\n\r\n// 📡 HTTP Client - Axios instance for API calls\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n/**\r\n * 🚪 Logout Payload Interface\r\n *\r\n * @interface LogoutPayload\r\n * @description 📊 Defines the structure for agent logout API payload data\r\n * Contains all necessary information for secure agent logout\r\n *\r\n * @properties\r\n * - `action: string` - 🎯 API action type (\"LOGOUTUSER\")\r\n * - `userId: string` - 👤 Agent identifier for logout\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic logout payload\r\n * const logoutPayload: LogoutPayload = {\r\n * action: \"LOGOUTUSER\",\r\n * userId: \"agent123\"\r\n * };\r\n *\r\n * // Usage in component\r\n * const { logout } = useLogout();\r\n * await logout();\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport interface LogoutPayload {\r\n\taction: string; // 🎯 API action type\r\n\tuserId: string; // 👤 Agent identifier\r\n}\r\n\r\n/**\r\n * 🚪 Logout Custom Hook\r\n *\r\n * @function useLogout\r\n * @description 🎯 Custom React hook that provides comprehensive agent logout functionality\r\n * for the CTI SDK. It handles secure logout procedures, complete state cleanup,\r\n * and storage management with intelligent error handling and proper cleanup.\r\n *\r\n * @returns {Object} Hook return object containing:\r\n * - `logout: () => Promise<any>` - 🚪 Logout function\r\n * - `isLoading: boolean` - ⏳ Loading state indicator\r\n * - `isSuccess: boolean` - ✅ Success state indicator\r\n * - `isError: boolean` - ❌ Error state indicator\r\n * - `error: any` - 🛡️ Error object when logout fails\r\n * - `data: any` - 📊 Response data from successful logout\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic usage in a component\r\n * const LogoutButton = () => {\r\n * const {\r\n * logout,\r\n * isLoading,\r\n * isSuccess,\r\n * isError,\r\n * error\r\n * } = useLogout();\r\n *\r\n * const handleLogout = async () => {\r\n * try {\r\n * const result = await logout();\r\n * console.log('🚪 Logout successful:', result);\r\n * // Redirect to login page or handle success\r\n * } catch (err) {\r\n * console.error('❌ Logout failed:', err);\r\n * }\r\n * };\r\n *\r\n * return (\r\n * <button\r\n * onClick={handleLogout}\r\n * disabled={isLoading}\r\n * >\r\n * {isLoading ? 'Logging out...' : 'Logout'}\r\n * </button>\r\n * );\r\n * };\r\n * ```\r\n *\r\n * @features\r\n * - 🚪 Secure agent logout with API validation\r\n * - 🗑️ Complete state cleanup and reset\r\n * - 💾 Storage management (localStorage & sessionStorage)\r\n * - ⏳ Comprehensive loading state management\r\n * - 🛡️ Robust error handling and recovery\r\n * - 📊 Real-time state updates via SDK manager\r\n * - 🔄 Automatic storage cleanup\r\n *\r\n * @logic\r\n * - 🔍 Retrieves agent state from localStorage\r\n * - 📦 Constructs logout API payload\r\n * - 📡 Makes API call to logout agent\r\n * - 🗑️ Clears SDK state manager\r\n * - 💾 Clears all storage (localStorage & sessionStorage)\r\n * - 📊 Handles success/error states\r\n * - ⏳ Manages loading states\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport const useLogout = () => {\r\n\t// =============================================================================\r\n\t// 🎛️ STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Loading State\r\n\t * @description Boolean flag indicating if a logout operation is currently in progress\r\n\t * @type {useState<boolean>} - Loading state for logout operations\r\n\t */\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\t/**\r\n\t * ✅ Success State\r\n\t * @description Boolean flag indicating if the last logout operation was successful\r\n\t * @type {useState<boolean>} - Success state for logout operations\r\n\t */\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\t/**\r\n\t * ❌ Error State Flag\r\n\t * @description Boolean flag indicating if the last logout operation encountered an error\r\n\t * @type {useState<boolean>} - Error state flag for logout operations\r\n\t */\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\t/**\r\n\t * 🛡️ Error Object\r\n\t * @description Contains the error object when a logout operation fails\r\n\t * @type {useState<any>} - Error object storage\r\n\t */\r\n\tconst [error, setError] = useState(null);\r\n\r\n\t/**\r\n\t * 📊 Response Data\r\n\t * @description Contains the response data from successful logout operations\r\n\t * @type {useState<any>} - Response data storage\r\n\t */\r\n\tconst [data, setData] = useState(null);\r\n\r\n\t// =============================================================================\r\n\t// 🚪 LOGOUT FUNCTION\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🚪 Agent Logout Handler\r\n\t *\r\n\t * @function handleLogout\r\n\t * @description 🎯 Handles secure agent logout with comprehensive cleanup procedures.\r\n\t * Retrieves agent state, constructs logout payload, makes API call,\r\n\t * and performs complete state and storage cleanup.\r\n\t *\r\n\t * @returns {Promise<any>} Promise that resolves with API response data or rejects with error\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Perform logout\r\n\t * const result = await logout();\r\n\t *\r\n\t * // Handle the response\r\n\t * if (result) {\r\n\t * console.log('🚪 Logout successful:', result);\r\n\t * // Redirect to login page\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: LOGOUT\r\n\t * - 🎯 Action: \"LOGOUTUSER\"\r\n\t * - 👤 User ID: Agent identifier from state\r\n\t *\r\n\t * @features\r\n\t * - 🔍 Intelligent agent state detection from localStorage\r\n\t * - 📦 Comprehensive API payload construction\r\n\t * - 🚪 Secure logout with API validation\r\n\t * - 🗑️ Complete state cleanup via SDK manager\r\n\t * - 💾 Complete storage cleanup (localStorage & sessionStorage)\r\n\t * - ⏳ Loading state management\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 State updates via SDK manager\r\n\t * - 🔄 Automatic cleanup procedures\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleLogout = useCallback(async () => {\r\n\t\t// 🔍 Retrieve current agent state from localStorage\r\n\t\tconst state = JSON.parse(localStorage.getItem(\"call-control-sdk-state\") ?? \"\");\r\n\r\n\t\t// ⏳ Set loading state to show UI feedback\r\n\t\tsetLoading(true);\r\n\r\n\t\t// 📦 Prepare API payload for agent logout\r\n\t\tconst payload: LogoutPayload = {\r\n\t\t\taction: \"LOGOUTUSER\", // 🎯 API action type\r\n\t\t\tuserId: state.agentId || \"\", // 👤 Agent identifier with fallback\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to logout agent\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.LOGOUT, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🗑️ Clear SDK state manager and reset all state\r\n\t\t\t\tsdkStateManager.clearStorageAndReset();\r\n\t\t\t\t// 💾 Clear all localStorage data\r\n\t\t\t\tlocalStorage.clear();\r\n\t\t\t\t// 💾 Clear all sessionStorage data\r\n\t\t\t\tsessionStorage.clear();\r\n\t\t\t\t// 📊 Store response data\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\t// 🔄 Return response data\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\tsetError(err);\r\n\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []); // 🔄 Empty dependency array for useCallback\r\n\r\n\t// =============================================================================\r\n\t// 🔄 HOOK RETURN OBJECT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📤 Hook Return Object\r\n\t * @description Returns all necessary functions and state for logout functionality\r\n\t * @returns {Object} Complete hook interface\r\n\t */\r\n\treturn {\r\n\t\tlogout: handleLogout, // 🚪 Logout function\r\n\t\tisLoading: loading, // ⏳ Loading state indicator\r\n\t\tisSuccess: success, // ✅ Success state indicator\r\n\t\tisError: isError, // ❌ Error state indicator\r\n\t\terror: error, // 🛡️ Error object\r\n\t\tdata: data, // 📊 Response data\r\n\t};\r\n};\r\n","export const IP = \"10.10.102.42\";\r\nexport const BASE_URL = `http://${IP}:8095`;\r\nexport const WS_BASE_URL = `ws://${IP}:8095`;\r\nexport const VERSION = {\r\n\tv1: \"/api/v1\",\r\n};\r\n\r\nexport const END_POINT = {\r\n\tLOGIN: `${BASE_URL}${VERSION.v1}/cti/login?provider=convox`,\r\n\tREADY_AGENT: `${BASE_URL}${VERSION.v1}/cti/ready-agent?provider=convox`,\r\n\tUPDATE_AGENT_BREAK: `${BASE_URL}${VERSION.v1}/cti/update-agent-status?provider=convox`,\r\n\tCLICK_TO_CALL: `${BASE_URL}${VERSION.v1}/cti/calls?provider=convox`,\r\n\tHOLD_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/hold?provider=convox`,\r\n\tMUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/mute?provider=convox`,\r\n\tUNMUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/unmute-call?provider=convox`,\r\n\tEND_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/end?provider=convox`,\r\n\tLOGOUT: `${BASE_URL}${VERSION.v1}/cti/logout?provider=convox`,\r\n\r\n\tCONFERENCE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference?provider=convox`,\r\n\tCONFERENCE_CALL_HOLD_OR_UN_HOLD: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hold?provider=convox`,\r\n\tCONFERENCE_CALL_MUTE_OT_UN_MUTE: `${BASE_URL}${VERSION.v1}/cti/calls/conference/mute?provider=convox`,\r\n\tCONFERENCE_CALL_END: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup?provider=convox`,\r\n\tCONFERENCE_CALL_END_ALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup/all?provider=convox`,\r\n\tTRANSFER_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/transfer?provider=convox`,\r\n\r\n\tAGENTS_LIST: `${BASE_URL}${VERSION.v1}/cti/users`,\r\n\tPROCESS_LIST: `${BASE_URL}${VERSION.v1}/cti/processes-list`,\r\n\tTRANSFER_TO_DETAILS: `${BASE_URL}${VERSION.v1}/cti/transfer-to-details?provider=convox`,\r\n\r\n\tCALL_HISTORY: `${BASE_URL}${VERSION.v1}/dashboard/call-history`,\r\n\tSENTIMENTAL_ANALYSIS: `${BASE_URL}${VERSION.v1}/users/get_sentiment_analysis`,\r\n};\r\n\r\nexport const WS_END_POINT = {\r\n\tWS: `${WS_BASE_URL}${VERSION.v1}/cti/ws`,\r\n};\r\n","/**\r\n * @fileoverview Axios HTTP Client Configuration\r\n * @description Configured Axios instance for Call Control SDK API communication.\r\n * Provides centralized HTTP client with authentication, error handling, and request/response interceptors.\r\n *\r\n * @author Achala IT Solutions\r\n * @version 1.0.0\r\n * @since 2024\r\n */\r\n\r\nimport axios, { AxiosInstance, AxiosResponse, AxiosError, InternalAxiosRequestConfig } from \"axios\";\r\nimport { BASE_URL } from \"./endPoint\";\r\n\r\n/**\r\n * @constant DEFAULT_TOKEN\r\n * @description Default authentication token for API requests\r\n * @declaration\r\n * ```typescript\r\n * const DEFAULT_TOKEN = \"12345\";\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `string`\r\n *\r\n * @example\r\n * ```typescript\r\n * console.log('Using token:', DEFAULT_TOKEN);\r\n * ```\r\n *\r\n * @return Default authentication token string\r\n *\r\n * @conclusion Temporary token for development - should be replaced with proper authentication in production.\r\n */\r\nconst DEFAULT_TOKEN = \"12345\";\r\n\r\n/**\r\n * @constant REQUEST_TIMEOUT\r\n * @description Default timeout for HTTP requests in milliseconds\r\n * @declaration\r\n * ```typescript\r\n * const REQUEST_TIMEOUT = 60000;\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `number`\r\n *\r\n * @example\r\n * ```typescript\r\n * console.log('Request timeout:', REQUEST_TIMEOUT); // 60000\r\n * ```\r\n *\r\n * @return Timeout value in milliseconds\r\n *\r\n * @conclusion Standard timeout for API requests to prevent hanging connections.\r\n */\r\nconst REQUEST_TIMEOUT = 60000;\r\n\r\n/**\r\n * @function getAuthToken\r\n * @description Retrieves the current authentication token for API requests\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function getAuthToken(): string\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `string`\r\n *\r\n * @example\r\n * ```typescript\r\n * const token = getAuthToken();\r\n * console.log('Current token:', token);\r\n * ```\r\n *\r\n * @return Current authentication token\r\n *\r\n * @conclusion Centralized token retrieval function for consistent authentication.\r\n */\r\nfunction getAuthToken(): string {\r\n\t// TODO: Replace with proper token management (localStorage, sessionStorage, etc.)\r\n\treturn DEFAULT_TOKEN;\r\n}\r\n\r\n/**\r\n * @function createAxiosInstance\r\n * @description Creates a configured Axios instance with interceptors and default settings\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function createAxiosInstance(): AxiosInstance\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `AxiosInstance`\r\n *\r\n * @example\r\n * ```typescript\r\n * const instance = createAxiosInstance();\r\n * instance.get('/api/users').then(response => console.log(response.data));\r\n * ```\r\n *\r\n * @return Configured Axios instance\r\n *\r\n * @conclusion Factory function for creating properly configured Axios instances.\r\n */\r\nfunction createAxiosInstance(): AxiosInstance {\r\n\tconst instance = axios.create({\r\n\t\tbaseURL: BASE_URL,\r\n\t\theaders: {\r\n\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\tAccept: \"application/json\",\r\n\t\t},\r\n\t\ttimeout: REQUEST_TIMEOUT,\r\n\t\twithCredentials: false, // Disable credentials for CORS\r\n\t});\r\n\r\n\t// Request interceptor for authentication\r\n\tinstance.interceptors.request.use(\r\n\t\t(config: InternalAxiosRequestConfig) => {\r\n\t\t\tconst token = getAuthToken();\r\n\r\n\t\t\tif (token && config.headers) {\r\n\t\t\t\tconfig.headers.Authorization = `Bearer ${token}`;\r\n\t\t\t}\r\n\r\n\t\t\t// Add request timestamp for debugging\r\n\t\t\t(config as any).metadata = { startTime: new Date().getTime() };\r\n\r\n\t\t\treturn config;\r\n\t\t},\r\n\t\t(error: AxiosError) => {\r\n\t\t\tconsole.error(\"Request interceptor error:\", error);\r\n\t\t\treturn Promise.reject(error);\r\n\t\t}\r\n\t);\r\n\r\n\t// Response interceptor for error handling\r\n\tinstance.interceptors.response.use(\r\n\t\t(response: AxiosResponse) => {\r\n\t\t\t// Add response time for debugging\r\n\t\t\tconst endTime = new Date().getTime();\r\n\t\t\tconst startTime = (response.config as any).metadata?.startTime;\r\n\t\t\tif (startTime) {\r\n\t\t\t\tconsole.log(`Request to ${response.config.url} took ${endTime - startTime}ms`);\r\n\t\t\t}\r\n\r\n\t\t\treturn response;\r\n\t\t},\r\n\t\tasync (error: AxiosError) => {\r\n\t\t\tconst originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean };\r\n\r\n\t\t\t// Handle 401 Unauthorized errors\r\n\t\t\tif (error.response?.status === 401 && !originalRequest._retry) {\r\n\t\t\t\toriginalRequest._retry = true;\r\n\t\t\t\tconsole.warn(\"Unauthorized request, attempting retry...\");\r\n\r\n\t\t\t\t// TODO: Implement token refresh logic here\r\n\t\t\t\t// const newToken = await refreshToken();\r\n\t\t\t\t// if (newToken) {\r\n\t\t\t\t// originalRequest.headers!.Authorization = `Bearer ${newToken}`;\r\n\t\t\t\t// return instance(originalRequest);\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\r\n\t\t\t// Handle network errors\r\n\t\t\tif (!error.response) {\r\n\t\t\t\tconsole.error(\"Network error:\", error.message);\r\n\t\t\t\terror.message = \"Network error: Please check your internet connection\";\r\n\t\t\t}\r\n\r\n\t\t\t// Handle server errors\r\n\t\t\tif (error.response && error.response.status >= 500) {\r\n\t\t\t\tconsole.error(\"Server error:\", error.response.status, error.response.data);\r\n\t\t\t\terror.message = \"Server error: Please try again later\";\r\n\t\t\t}\r\n\r\n\t\t\treturn Promise.reject(error);\r\n\t\t}\r\n\t);\r\n\r\n\treturn instance;\r\n}\r\n\r\n/**\r\n * @constant axiosInstance\r\n * @description Pre-configured Axios instance for Call Control SDK API communication\r\n *\r\n * @declaration\r\n * ```typescript\r\n * const axiosInstance: AxiosInstance = createAxiosInstance();\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `AxiosInstance`\r\n *\r\n * @example\r\n * ```typescript\r\n * import axiosInstance from './axios';\r\n *\r\n * // Make GET request\r\n * const response = await axiosInstance.get('/api/calls');\r\n *\r\n * // Make POST request\r\n * const result = await axiosInstance.post('/api/calls', callData);\r\n * ```\r\n *\r\n * @return Configured Axios instance ready for use\r\n *\r\n * @conclusion Main HTTP client for all Call Control SDK API operations.\r\n */\r\nconst axiosInstance: AxiosInstance = createAxiosInstance();\r\n\r\nexport default axiosInstance;\r\n","/**\r\n * @fileoverview 📞 End Call Hook for CTI SDK\r\n *\r\n * This file contains the useEndCall custom hook that provides comprehensive call termination\r\n * functionality for the CTI SDK. It handles call disposition capture, callback scheduling,\r\n * and proper call cleanup with intelligent state management and error handling.\r\n *\r\n * 🎯 Key Features:\r\n * - 📞 Call termination with disposition tracking\r\n * - 📅 Callback scheduling and follow-up management\r\n * - 🔄 Intelligent state cleanup and reset\r\n * - ⏳ Loading states and error handling\r\n * - 📊 Real-time state updates\r\n * - 🛡️ Comprehensive error management\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport { useCallback, useState } from \"react\";\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"./sdk-state\"; // 🗃️ Global state manager\r\n\r\n// 📡 HTTP Client - Axios instance for API calls\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n/**\r\n * 📞 End Call Payload Interface\r\n *\r\n * @interface EndCallPayload\r\n * @description 📊 Defines the structure for call termination API payload data\r\n * Contains all necessary information for ending a call with proper disposition\r\n *\r\n * @properties\r\n * - `action: string` - 🎯 API action type (\"ENDCALL\")\r\n * - `disposition: string` - 📝 Call outcome classification\r\n * - `userId: string` - 👤 Agent identifier\r\n * - `processid: string` - ⚙️ Process identifier\r\n * - `mobile_number: string` - 📱 Customer phone number\r\n * - `set_followUp: string` - 📅 Follow-up requirement (\"Y\" or \"N\")\r\n * - `callback_date: string` - 📅 Scheduled callback date\r\n * - `callback_hrs: string` - 🕐 Scheduled callback hour\r\n * - `callback_mins: string` - 🕐 Scheduled callback minute\r\n * - `refno?: string` - 🔗 Optional call reference number\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic end call payload\r\n * const endCallPayload: EndCallPayload = {\r\n * action: \"ENDCALL\",\r\n * disposition: \"RES\",\r\n * userId: \"agent123\",\r\n * processid: \"proc001\",\r\n * mobile_number: \"1234567890\",\r\n * set_followUp: \"N\",\r\n * callback_date: \"\",\r\n * callback_hrs: \"\",\r\n * callback_mins: \"\"\r\n * };\r\n *\r\n * // With callback scheduling\r\n * const endCallWithCallback: EndCallPayload = {\r\n * action: \"ENDCALL\",\r\n * disposition: \"RES\",\r\n * userId: \"agent123\",\r\n * processid: \"proc001\",\r\n * mobile_number: \"1234567890\",\r\n * set_followUp: \"Y\",\r\n * callback_date: \"2024-01-15\",\r\n * callback_hrs: \"14\",\r\n * callback_mins: \"30\"\r\n * };\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport interface EndCallPayload {\r\n\taction: string; // 🎯 API action type\r\n\tdisposition: string; // 📝 Call outcome classification\r\n\tuserId: string; // 👤 Agent identifier\r\n\tprocessid: string; // ⚙️ Process identifier\r\n\tmobile_number: string; // 📱 Customer phone number\r\n\tset_followUp: string; // 📅 Follow-up requirement\r\n\tcallback_date: string; // 📅 Scheduled callback date\r\n\tcallback_hrs: string; // 🕐 Scheduled callback hour\r\n\tcallback_mins: string; // 🕐 Scheduled callback minute\r\n\trefno?: string; // 🔗 Optional call reference number\r\n}\r\n\r\n/**\r\n * 📞 End Call Custom Hook\r\n *\r\n * @function useEndCall\r\n * @description 🎯 Custom React hook that provides comprehensive call termination functionality\r\n * for the CTI SDK. It handles call disposition capture, callback scheduling,\r\n * and proper call cleanup with intelligent state management and error handling.\r\n *\r\n * @returns {Object} Hook return object containing:\r\n * - `handleEndCall: (data: EndCallData) => Promise<any>` - 📞 Call termination function\r\n * - `isLoading: boolean` - ⏳ Loading state indicator\r\n * - `isSuccess: boolean` - ✅ Success state indicator\r\n * - `isError: boolean` - ❌ Error state indicator\r\n * - `error: any` - 🛡️ Error object when call fails\r\n * - `data: any` - 📊 Response data from successful calls\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic usage in a component\r\n * const EndCallButton = () => {\r\n * const {\r\n * handleEndCall,\r\n * isLoading,\r\n * isSuccess,\r\n * isError,\r\n * error\r\n * } = useEndCall();\r\n *\r\n * const endCall = async () => {\r\n * try {\r\n * const result = await handleEndCall({\r\n * disposition: \"RES\",\r\n * followUp: \"N\"\r\n * });\r\n * console.log('📞 Call ended:', result);\r\n * } catch (err) {\r\n * console.error('❌ End call failed:', err);\r\n * }\r\n * };\r\n *\r\n * return (\r\n * <button\r\n * onClick={endCall}\r\n * disabled={isLoading}\r\n * >\r\n * {isLoading ? 'Ending...' : 'End Call'}\r\n * </button>\r\n * );\r\n * };\r\n * ```\r\n *\r\n * @features\r\n * - 🎯 Comprehensive call termination with disposition tracking\r\n * - 📅 Callback scheduling and follow-up management\r\n * - 🔄 Intelligent state cleanup and reset\r\n * - ⏳ Comprehensive loading state management\r\n * - 🛡️ Robust error handling and recovery\r\n * - 📊 Real-time state updates via SDK manager\r\n * - 🔄 Automatic call state management\r\n *\r\n * @logic\r\n * - 🔍 Retrieves agent state from localStorage\r\n * - 📦 Constructs comprehensive API payload\r\n * - 📡 Makes API call to end call\r\n * - 🔄 Updates SDK state manager\r\n * - 📊 Handles success/error states\r\n * - ⏳ Manages loading states\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport const useEndCall = () => {\r\n\t// =============================================================================\r\n\t// 🎛️ STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Loading State\r\n\t * @description Boolean flag indicating if a call termination operation is currently in progress\r\n\t * @type {useState<boolean>} - Loading state for call termination operations\r\n\t */\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\t/**\r\n\t * ✅ Success State\r\n\t * @description Boolean flag indicating if the last call termination operation was successful\r\n\t * @type {useState<boolean>} - Success state for call termination operations\r\n\t */\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\t/**\r\n\t * ❌ Error State Flag\r\n\t * @description Boolean flag indicating if the last call termination operation encountered an error\r\n\t * @type {useState<boolean>} - Error state flag for call termination operations\r\n\t */\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\t/**\r\n\t * 🛡️ Error Object\r\n\t * @description Contains the error object when a call termination operation fails\r\n\t * @type {useState<any>} - Error object storage\r\n\t */\r\n\tconst [error, setError] = useState(null);\r\n\r\n\t/**\r\n\t * 📊 Response Data\r\n\t * @description Contains the response data from successful call termination operations\r\n\t * @type {useState<any>} - Response data storage\r\n\t */\r\n\tconst [data, setData] = useState(null);\r\n\r\n\t// =============================================================================\r\n\t// 📞 CALL TERMINATION FUNCTION\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Call Termination Handler\r\n\t *\r\n\t * @function handleEndCall\r\n\t * @description 🎯 Handles call termination with comprehensive disposition tracking and\r\n\t * callback scheduling. Constructs a complete API payload with agent state\r\n\t * information and call disposition data, then makes the termination request.\r\n\t *\r\n\t * @param {Object} data - 📊 Call termination data object containing:\r\n\t * - `disposition?: string` - 📝 Call outcome classification (default: \"RES\")\r\n\t * - `followUp?: string` - 📅 Follow-up requirement (default: \"N\")\r\n\t * - `callbackDate?: string` - 📅 Scheduled callback date (default: \"\")\r\n\t * - `callbackHrs?: string` - 🕐 Scheduled callback hour (default: \"\")\r\n\t * - `callbackMins?: string` - 🕐 Scheduled callback minute (default: \"\")\r\n\t *\r\n\t * @returns {Promise<any>} Promise that resolves with API response data or rejects with error\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // End call with basic disposition\r\n\t * const result = await handleEndCall({\r\n\t * disposition: \"RES\",\r\n\t * followUp: \"N\"\r\n\t * });\r\n\t *\r\n\t * // End call with callback scheduling\r\n\t * const result = await handleEndCall({\r\n\t * disposition: \"RES\",\r\n\t * followUp: \"Y\",\r\n\t * callbackDate: \"2024-01-15\",\r\n\t * callbackHrs: \"14\",\r\n\t * callbackMins: \"30\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: END_CALL\r\n\t * - 🎯 Action: \"ENDCALL\"\r\n\t * - 📝 Disposition: Call outcome classification\r\n\t * - 📅 Follow-up: Callback requirement\r\n\t * - 🕐 Callback: Scheduled callback time\r\n\t *\r\n\t * @features\r\n\t * - 🔍 Intelligent agent state detection from localStorage\r\n\t * - 📦 Comprehensive API payload construction\r\n\t * - 📞 Call termination with disposition tracking\r\n\t * - 📅 Callback scheduling and follow-up management\r\n\t * - ⏳ Loading state management\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 State updates via SDK manager\r\n\t * - 🔄 Automatic call state cleanup\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleEndCall = useCallback(\r\n\t\tasync (data: {\r\n\t\t\tdisposition?: string; // 📝 Call outcome classification\r\n\t\t\tfollowUp?: string; // 📅 Follow-up requirement\r\n\t\t\tcallbackDate?: string; // 📅 Scheduled callback date\r\n\t\t\tcallbackHrs?: string; // 🕐 Scheduled callback hour\r\n\t\t\tcallbackMins?: string; // 🕐 Scheduled callback minute\r\n\t\t}) => {\r\n\t\t\t// 🔍 Retrieve current agent state from localStorage\r\n\t\t\tconst state = JSON.parse(localStorage.getItem(\"call-control-sdk-state\") ?? \"\");\r\n\r\n\t\t\t// ⏳ Set loading state to show UI feedback\r\n\t\t\tsetLoading(true);\r\n\r\n\t\t\t// 📦 Prepare comprehensive API payload for call termination\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"ENDCALL\", // 🎯 API action type\r\n\t\t\t\tuserId: state?.agentId, // 👤 Agent identifier\r\n\t\t\t\tprocessid: state?.process?.process_id?.toString() ?? \"\", // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state?.process?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t\tcallreferenceid: state?.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tmobile_number: state?.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\r\n\t\t\t\tdisposition: data?.disposition ?? \"RES\", // 📝 Call outcome (default: Resolved)\r\n\t\t\t\tset_followUp: data?.followUp ?? \"N\", // 📅 Follow-up requirement (default: No)\r\n\t\t\t\tcallback_date: data?.callbackDate ?? \"\", // 📅 Callback date (default: empty)\r\n\t\t\t\tcallback_hrs: data?.callbackHrs ?? \"\", // 🕐 Callback hour (default: empty)\r\n\t\t\t\tcallback_mins: data?.callbackMins ?? \"\", // 🕐 Callback minute (default: empty)\r\n\t\t\t\tendcall_type: \"CLOSE\", // 🔚 End call type\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to terminate call\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.END_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t// 🔄 Update SDK state manager to end call\r\n\t\t\t\t\tsdkStateManager.endCall();\r\n\t\t\t\t\t// 📊 Store response data\r\n\t\t\t\t\tsetData(res?.data);\r\n\t\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\t\tsetSuccess(true);\r\n\t\t\t\t\t// 🔄 Return response data\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\t\tsetIsError(true);\r\n\t\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\t\tsetError(err);\r\n\t\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[] // 🔄 Empty dependency array for useCallback\r\n\t);\r\n\r\n\t// =============================================================================\r\n\t// 🔄 HOOK RETURN OBJECT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📤 Hook Return Object\r\n\t * @description Returns all necessary functions and state for call termination functionality\r\n\t * @returns {Object} Complete hook interface\r\n\t */\r\n\treturn {\r\n\t\thandleEndCall, // 📞 Call termination function\r\n\t\tisLoading: loading, // ⏳ Loading state indicator\r\n\t\tisSuccess: success, // ✅ Success state indicator\r\n\t\tisError: isError, // ❌ Error state indicator\r\n\t\terror: error, // 🛡️ Error object\r\n\t\tdata: data, // 📊 Response data\r\n\t};\r\n};\r\n","/**\r\n * @fileoverview 📞 Click-to-Call Hook for CTI SDK\r\n *\r\n * This file contains the useClickToCall custom hook that provides comprehensive call initiation\r\n * functionality for the CTI SDK. It handles both regular calls and conference calls with\r\n * intelligent state management and error handling.\r\n *\r\n * 🎯 Key Features:\r\n * - 📱 Regular call initiation for idle agents\r\n * - 👥 Conference call initiation for agents on calls\r\n * - 🔄 Intelligent state detection and routing\r\n * - ⏳ Loading states and error handling\r\n * - 📊 Real-time state updates\r\n * - 🛡️ Comprehensive error management\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport { useCallback, useState } from \"react\";\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"./sdk-state\"; // 🗃️ Global state manager\r\n\r\n/**\r\n * 📱 Start Call Payload Interface\r\n *\r\n * @interface StartCallPayload\r\n * @description 📊 Defines the structure for call initiation payload data\r\n * Contains the mobile number required to initiate a call\r\n *\r\n * @properties\r\n * - `mobileNumber: string` - 📱 The phone number to call (required)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic call initiation payload\r\n * const callPayload: StartCallPayload = {\r\n * mobileNumber: \"1234567890\"\r\n * };\r\n *\r\n * // Usage in component\r\n * const { handleStartCall } = useClickToCall();\r\n * await handleStartCall({ mobileNumber: \"9876543210\" });\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport interface StartCallPayload {\r\n\tmobileNumber: string; // 📱 Phone number to call\r\n}\r\n\r\n/**\r\n * 📞 Click-to-Call Custom Hook\r\n *\r\n * @function useClickToCall\r\n * @description 🎯 Custom React hook that provides comprehensive call initiation functionality\r\n * for the CTI SDK. It intelligently handles both regular calls and conference calls\r\n * based on the current agent state, with proper loading states and error handling.\r\n *\r\n * @returns {Object} Hook return object containing:\r\n * - `handleStartCall: (data: StartCallPayload) => Promise<any>` - 📞 Call initiation function\r\n * - `isLoading: boolean` - ⏳ Loading state indicator\r\n * - `isSuccess: boolean` - ✅ Success state indicator\r\n * - `isError: boolean` - ❌ Error state indicator\r\n * - `error: any` - 🛡️ Error object when call fails\r\n * - `data: any` - 📊 Response data from successful calls\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic usage in a component\r\n * const CallButton = () => {\r\n * const {\r\n * handleStartCall,\r\n * isLoading,\r\n * isSuccess,\r\n * isError,\r\n * error\r\n * } = useClickToCall();\r\n *\r\n * const makeCall = async () => {\r\n * try {\r\n * const result = await handleStartCall({\r\n * mobileNumber: \"1234567890\"\r\n * });\r\n * console.log('📞 Call initiated:', result);\r\n * } catch (err) {\r\n * console.error('❌ Call failed:', err);\r\n * }\r\n * };\r\n *\r\n * return (\r\n * <button\r\n * onClick={makeCall}\r\n * disabled={isLoading}\r\n * >\r\n * {isLoading ? 'Calling...' : 'Make Call'}\r\n * </button>\r\n * );\r\n * };\r\n * ```\r\n *\r\n * @features\r\n * - 🎯 Intelligent call routing based on agent state\r\n * - 📱 Regular call initiation for idle agents\r\n * - 👥 Conference call initiation for busy agents\r\n * - ⏳ Comprehensive loading state management\r\n * - 🛡️ Robust error handling and recovery\r\n * - 📊 Real-time state updates via SDK manager\r\n * - 🔄 Automatic conference dialog management\r\n *\r\n * @logic\r\n * - 🔍 Checks agent status from localStorage state\r\n * - 📞 Initiates regular call if agent is IDLE\r\n * - 👥 Initiates conference call if agent is ONCALL\r\n * - ⚠️ Shows alert if agent is not ready\r\n * - 🔄 Updates conference line state for conference calls\r\n * - 🎭 Opens conference dialog for conference calls\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport const useClickToCall = () => {\r\n\t// =============================================================================\r\n\t// 🎛️ STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Loading State\r\n\t * @description Boolean flag indicating if a call operation is currently in progress\r\n\t * @type {useState<boolean>} - Loading state for call operations\r\n\t */\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\t/**\r\n\t * ✅ Success State\r\n\t * @description Boolean flag indicating if the last call operation was successful\r\n\t * @type {useState<boolean>} - Success state for call operations\r\n\t */\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\t/**\r\n\t * ❌ Error State Flag\r\n\t * @description Boolean flag indicating if the last call operation encountered an error\r\n\t * @type {useState<boolean>} - Error state flag for call operations\r\n\t */\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\t/**\r\n\t * 🛡️ Error Object\r\n\t * @description Contains the error object when a call operation fails\r\n\t * @type {useState<any>} - Error object storage\r\n\t */\r\n\tconst [error, setError] = useState(null);\r\n\r\n\t/**\r\n\t * 📊 Response Data\r\n\t * @description Contains the response data from successful call operations\r\n\t * @type {useState<any>} - Response data storage\r\n\t */\r\n\tconst [data, setData] = useState(null);\r\n\r\n\t// =============================================================================\r\n\t// 📞 CALL INITIATION FUNCTION\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Call Initiation Handler\r\n\t *\r\n\t * @function handleStartCall\r\n\t * @description 🎯 Handles call initiation with intelligent routing based on agent state.\r\n\t * For idle agents, initiates a regular call. For agents on calls, initiates\r\n\t * a conference call on an available line. Includes comprehensive error\r\n\t * handling and state management.\r\n\t *\r\n\t * @param {StartCallPayload} data - 📊 Call initiation data containing mobile number\r\n\t * @param {string} data.mobileNumber - 📱 The phone number to call\r\n\t *\r\n\t * @returns {Promise<any>} Promise that resolves with API response data or rejects with error\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Initiate a call\r\n\t * const result = await handleStartCall({\r\n\t * mobileNumber: \"1234567890\"\r\n\t * });\r\n\t *\r\n\t * // Handle the response\r\n\t * if (result) {\r\n\t * console.log('📞 Call initiated successfully:', result);\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: CLICK_TO_CALL (for regular calls)\r\n\t * - 📡 Endpoint: CONFERENCE_CALL (for conference calls)\r\n\t * - 🎯 Action: \"CALL\" (for regular calls)\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\" (for conference calls)\r\n\t *\r\n\t * @features\r\n\t * - 🔍 Intelligent agent state detection\r\n\t * - 📞 Regular call initiation for idle agents\r\n\t * - 👥 Conference call initiation for busy agents\r\n\t * - ⏳ Loading state management\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 State updates via SDK manager\r\n\t * - 🎭 Conference dialog management\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleStartCall = useCallback(async (data: StartCallPayload) => {\r\n\t\t// 🔍 Retrieve current agent state from localStorage\r\n\t\tconst state = JSON.parse(localStorage.getItem(\"call-control-sdk-state\") ?? \"\");\r\n\r\n\t\t// ⏳ Set loading state to show UI feedback\r\n\t\tsetLoading(true);\r\n\r\n\t\t// 🔄 Regular Call Logic - Agent is IDLE\r\n\t\tif (state?.callData?.status === \"IDLE\") {\r\n\t\t\t// 📦 Prepare API payload for regular call initiation\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"CALL\", // 🎯 API action type\r\n\t\t\t\tuserId: state?.agentId, // 👤 Agent identifier\r\n\t\t\t\tphone_number: data?.mobileNumber, // 📱 Target phone number\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to initiate regular call\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.CLICK_TO_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t// 📊 Store response data\r\n\t\t\t\t\tsetData(res?.data);\r\n\t\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\t\tsetSuccess(true);\r\n\t\t\t\t\t// 🔄 Return response data\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\t\tsetIsError(true);\r\n\t\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\t\tsetError(err);\r\n\t\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t}\r\n\t\t// 🔄 Conference Call Logic - Agent is ONCALL\r\n\t\telse if (state?.callData?.status === \"ONCALL\") {\r\n\t\t\t// 🔍 Find available conference line (not line 1 and not already in use)\r\n\t\t\tconst line_used = state?.conferenceLine\r\n\t\t\t\t?.filter((each: any) => each.line !== 1) // 📞 Exclude line 1 (internal)\r\n\t\t\t\t?.find((each: any) => each.status === \"IDLE\" && !each?.isCallStart); // 🔍 Find idle line\r\n\r\n\t\t\t// 📦 Prepare API payload for conference call initiation\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\t\toperation: `CALL${line_used.line}`, // 🔧 Operation with line number\r\n\t\t\t\tline_used: String(line_used.line), // 📞 Line identifier as string\r\n\t\t\t\tthirdparty_no: data?.mobileNumber, // 📱 Target phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to initiate conference call\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t// 📊 Store response data\r\n\t\t\t\t\tsetData(res?.data);\r\n\t\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\t\tsetSuccess(true);\r\n\t\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\t\tsdkStateManager.setConferenceLine({\r\n\t\t\t\t\t\t...line_used, // 📋 Spread existing line data\r\n\t\t\t\t\t\tisCallStart: true, // ✅ Mark call as started\r\n\t\t\t\t\t\tstatus: \"ONCALL\", // 📊 Update status\r\n\t\t\t\t\t\tphone: data?.mobileNumber, // 📱 Store phone number\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// 🎭 Open conference dialog for management\r\n\t\t\t\t\tsdkStateManager.setOpenConferenceDialog(true);\r\n\t\t\t\t\t// 🔄 Return response data\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\t\tsetIsError(true);\r\n\t\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\t\tsetError(err);\r\n\t\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t}\r\n\t\t// ⚠️ Agent Not Ready Logic\r\n\t\telse {\r\n\t\t\t// 🚨 Show alert for agent not ready state\r\n\t\t\talert(\"Agent is not ready\");\r\n\t\t}\r\n\t}, []);\r\n\r\n\t// =============================================================================\r\n\t// 🔄 HOOK RETURN OBJECT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📤 Hook Return Object\r\n\t * @description Returns all necessary functions and state for call initiation functionality\r\n\t * @returns {Object} Complete hook interface\r\n\t */\r\n\treturn {\r\n\t\thandleStartCall, // 📞 Call initiation function\r\n\t\tisLoading: loading, // ⏳ Loading state indicator\r\n\t\tisSuccess: success, // ✅ Success state indicator\r\n\t\tisError: isError, // ❌ Error state indicator\r\n\t\terror: error, // 🛡️ Error object\r\n\t\tdata: data, // 📊 Response data\r\n\t};\r\n};\r\n","/**\r\n * @fileoverview CallControlPanel Component\r\n * @description Main wrapper component for the Call Control SDK interface.\r\n * Provides the primary entry point for integrating CTI functionality into React applications.\r\n *\r\n * @author Achala IT Solutions\r\n * @version 1.0.0\r\n * @since 2024\r\n */\r\n\r\nimport { memo, useCallback } from \"react\";\r\nimport type { CallControlPanelProps } from \"../../types\";\r\nimport { CallControls } from \"./callControls\";\r\nimport { SDKProvider } from \"./SDKProvider\";\r\n\r\n/**\r\n * @function CallControlPanel\r\n * @description Main wrapper component that provides the complete call control interface.\r\n * Wraps the CallControls component with necessary providers and context.\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function CallControlPanel(props: CallControlPanelProps): JSX.Element\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `props: CallControlPanelProps` - Component props including optional data change callback\r\n *\r\n * @returnType `JSX.Element`\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <CallControlPanel />\r\n *\r\n * // With data change callback\r\n * <CallControlPanel\r\n * onDataChange={(callData) => {\r\n * console.log('Call data updated:', callData);\r\n * // Handle call data changes\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @return React component providing complete call control interface\r\n *\r\n * @conclusion Primary component for integrating CTI functionality into React applications.\r\n */\r\nexport const CallControlPanel = memo<CallControlPanelProps>(({ onDataChange }) => {\r\n\t/**\r\n\t * @function handleDataChange\r\n\t * @description Internal handler for call data changes with error handling\r\n\t * @param data - Updated call data\r\n\t */\r\n\tconst handleDataChange = useCallback(\r\n\t\t(data: any) => {\r\n\t\t\ttry {\r\n\t\t\t\tif (onDataChange && typeof onDataChange === \"function\") {\r\n\t\t\t\t\tonDataChange(data);\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error(\"Error in CallControlPanel data change handler:\", error);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[onDataChange]\r\n\t);\r\n\r\n\treturn (\r\n\t\t<SDKProvider>\r\n\t\t\t<CallControls onDataChange={handleDataChange} />\r\n\t\t</SDKProvider>\r\n\t);\r\n});\r\n\r\n// Set display name for debugging\r\nCallControlPanel.displayName = \"CallControlPanel\";\r\n\r\n/**\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n","/**\r\n * @fileoverview 📞 Comprehensive Call Control Interface Component\r\n *\r\n * This file contains the main CallControls component that provides a complete telephony interface\r\n * for contact center agents. It includes all necessary controls for managing phone calls,\r\n * real-time updates via WebSocket, draggable UI, and comprehensive state management.\r\n *\r\n * 🎯 Key Features:\r\n * - 📱 Complete call control operations (dial, hold, mute, transfer, conference, end)\r\n * - 🔄 Real-time WebSocket integration for live updates\r\n * - 👤 Agent status management and break controls\r\n * - 🎨 Draggable interface with Material-UI components\r\n * - 📊 Call duration tracking and disposition management\r\n * - 🔧 Configurable button states and functionality\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// 📦 Material-UI Icon Imports - UI icons for call control buttons\r\nimport {\r\n\tCallEnd, // 📞 End call icon\r\n\tClose, // ❌ Close dialog icon\r\n\tDragIndicator, // 🖱️ Drag handle icon\r\n\tGroup, // 👥 Conference call icon\r\n\tKeyboardArrowDown, // ⬇️ Dropdown arrow icon\r\n\tLayers, // 📚 Queue layers icon\r\n\tMic, // 🎤 Microphone icon\r\n\tMicOff, // 🔇 Muted microphone icon\r\n\tPause, // ⏸️ Hold call icon\r\n\tPending, // ⏳ Pending status icon\r\n\tPhone, // 📱 Phone call icon\r\n\tPlayArrow, // ▶️ Resume call icon\r\n\tSupportAgent, // 🎧 Agent ready icon\r\n\tTransferWithinAStation, // 🔄 Call transfer icon\r\n\tUpcoming, // 📅 Upcoming calls icon\r\n\tWifiCalling3, // 📶 Dial call icon\r\n} from \"@mui/icons-material\";\r\n\r\n// 🎨 Material-UI Component Imports - Core UI components\r\nimport {\r\n\tBox, // 📦 Container component\r\n\tButton, // 🔘 Interactive button component\r\n\tChip, // 🏷️ Status chip component\r\n\tCircularProgress, // ⏳ Loading spinner component\r\n\tFade, // ✨ Fade animation component\r\n\tIconButton, // 🔘 Icon-only button component\r\n\tMenu, // 📋 Dropdown menu component\r\n\tMenuItem, // 📝 Menu item component\r\n\tPaper, // 📄 Elevated surface component\r\n\tTextField, // 📝 Text input component\r\n\tTooltip, // 💡 Hover tooltip component\r\n\tTypography, // 📝 Text component\r\n\tuseTheme, // 🎨 Theme hook\r\n} from \"@mui/material\";\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\n// 🏷️ Type Definitions - TypeScript interfaces and types\r\nimport type { CallControlPanelProps, ConferenceLineTypes } from \"../../types\";\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"../hooks/sdk-state\"; // 🗃️ Global state manager\r\nimport { useDraggable } from \"../hooks/useDraggable\"; // 🖱️ Draggable functionality hook\r\nimport { useSDKState } from \"../hooks/useSDKState\"; // 📊 SDK state hook\r\n\r\n// 🌐 API Configuration - Endpoint and WebSocket configuration\r\nimport { END_POINT, IP, WS_END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\nimport { usePostRequest } from \"../services/request\"; // 📡 HTTP request hook\r\n\r\n// 🎭 Dialog Components - Modal dialogs for various operations\r\nimport {\r\n\tCallHistoryDialog, // 📋 Call history dialog\r\n\tCallTransferDialog, // 🔄 Call transfer dialog\r\n\tConferenceDialog, // 👥 Conference call dialog\r\n\tEndCallDispositionDialog, // 📝 Call disposition dialog\r\n\tProcessorListDialog, // ⚙️ Process selection dialog\r\n} from \"./dialog\";\r\n\r\n// 🎨 Styling - Component styling utilities\r\nimport useStyles from \"./styles\"; // 🎨 Custom styles hook\r\n\r\n// 🔧 Service Imports - External service integrations\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\nimport { useToast } from \"../services/toastMessage\"; // 🍞 Toast notification service\r\n\r\n/**\r\n * 🔄 Utility Function: Conference Data Combiner\r\n *\r\n * @function getCombineConfrenceData\r\n * @description 🔗 Combines conference line data with real-time API response data to create unified conference state\r\n *\r\n * @param {ConferenceLineTypes[]} conferenceData - 📊 Array of existing conference line configurations\r\n * @param {any} apiData - 📡 Real-time API response containing conference status updates\r\n * @param {any} data - 📞 Additional call data including phone numbers and status\r\n *\r\n * @returns {ConferenceLineTypes[]} 🔄 Updated conference data array with merged information\r\n *\r\n * @example\r\n * ```typescript\r\n * const conferenceLines = [\r\n * { line: 1, status: \"IDLE\", phone: \"\" },\r\n * { line: 2, status: \"IDLE\", phone: \"\" }\r\n * ];\r\n * const apiResponse = {\r\n * line_2_status: \"ONCALL\",\r\n * line_2_phonenumber: \"1234567890\"\r\n * };\r\n * const callData = { status: \"ONCALL\", phone_number: \"0987654321\" };\r\n *\r\n * const result = getCombineConfrenceData(conferenceLines, apiResponse, callData);\r\n * // Returns updated conference data with merged status and phone numbers\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nconst getCombineConfrenceData = (\r\n\tconferenceData: ConferenceLineTypes[], // 📊 Input conference data\r\n\tapiData: any, // 📡 API response data\r\n\tdata: any // 📞 Call data\r\n) => {\r\n\t// 🔄 Map through each conference line and merge with API data\r\n\tconst updatedConferenceData = conferenceData.map((item) => {\r\n\t\t// 🎯 Handle primary line (line 1) - use main call data\r\n\t\tif (item?.line === 1) {\r\n\t\t\treturn {\r\n\t\t\t\tline: 1, // 📞 Primary line identifier\r\n\t\t\t\tstatus: data?.status ?? \"\", // 📊 Current call status\r\n\t\t\t\ttype: \"internal\" as \"internal\" | \"external\" | \"\", // 🏷️ Call type classification\r\n\t\t\t\tphone: data?.phone_number ?? \"\", // 📱 Phone number\r\n\t\t\t\tisMute: false, // 🔇 Mute state (default off)\r\n\t\t\t\tisHold: false, // ⏸️ Hold state (default off)\r\n\t\t\t\tisMergeCall: false, // 🔗 Merge state (default off)\r\n\t\t\t\tisCallStart: true, // ✅ Call active flag\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\t// 🔍 Handle secondary lines - use API response data\r\n\t\t\tconst statusKey = `line_${item.line}_status`; // 🔑 Status key for this line\r\n\t\t\tconst phoneKey = `line_${item.line}_phonenumber`; // 🔑 Phone key for this line\r\n\t\t\treturn {\r\n\t\t\t\t...item, // 📋 Spread existing line data\r\n\t\t\t\tstatus: apiData[statusKey] ?? \"IDLE\", // 📊 Update status from API\r\n\t\t\t\tphone: apiData[phoneKey] !== \"0\" ? apiData[phoneKey] : \"\", // 📱 Update phone if valid\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n\r\n\t// 🔄 Return the updated conference data array\r\n\treturn updatedConferenceData;\r\n};\r\n\r\n/**\r\n * ⏱️ Utility Function: Call Duration Formatter\r\n *\r\n * @function formatDuration\r\n * @description 🕐 Converts seconds into a formatted MM:SS time string for displaying call duration\r\n * Uses padding to ensure consistent two-digit formatting for professional appearance\r\n *\r\n * @param {number} seconds - ⏰ The duration in seconds to format (must be non-negative)\r\n *\r\n * @returns {string} 📊 Formatted time string in MM:SS format with zero-padding\r\n *\r\n * @example\r\n * ```typescript\r\n * formatDuration(125); // Returns \"02:05\" (2 minutes, 5 seconds)\r\n * formatDuration(3661); // Returns \"61:01\" (61 minutes, 1 second)\r\n * formatDuration(0); // Returns \"00:00\" (zero duration)\r\n * formatDuration(59); // Returns \"00:59\" (59 seconds)\r\n * ```\r\n *\r\n * @features\r\n * - 🔢 Zero-padded minutes and seconds for consistent display\r\n * - ⏱️ Handles any duration from 0 to 99:59 format\r\n * - 🎨 Professional time display format\r\n * - ⚡ Optimized with useCallback for performance\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nconst formatDuration = useCallback((seconds: number): string => {\r\n\t// 🧮 Calculate minutes by dividing seconds by 60 and flooring\r\n\tconst mins = Math.floor(seconds / 60);\r\n\r\n\t// 🔢 Calculate remaining seconds using modulo operator\r\n\tconst secs = seconds % 60;\r\n\r\n\t// 📊 Return formatted string with zero-padding for consistent display\r\n\treturn `${mins.toString().padStart(2, \"0\")}:${secs.toString().padStart(2, \"0\")}`;\r\n}, []); // 🔄 Empty dependency array for stable reference\r\n\r\n/**\r\n * =============================================================================\r\n * 🎯 MAIN COMPONENT: CallControls\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * 📞 Main Call Control Interface Component\r\n *\r\n * @function CallControls\r\n * @description 🎧 Comprehensive React component that renders a complete call control panel interface\r\n * for CTI (Computer Telephony Integration) systems. This component provides contact center\r\n * agents with all necessary tools to manage phone calls effectively.\r\n *\r\n * 🚀 Core Capabilities:\r\n * - 📱 Complete call operations (dial, hold, mute, transfer, conference, end)\r\n * - 🔄 Real-time WebSocket integration for live status updates\r\n * - 👤 Agent status management and break controls\r\n * - 🎨 Draggable interface with Material-UI components\r\n * - 📊 Call duration tracking and disposition management\r\n * - 🔧 Configurable button states and functionality\r\n * - 📞 Soft phone iframe integration\r\n * - 🍞 Toast notifications for user feedback\r\n *\r\n * @param {CallControlPanelProps} props - Component properties\r\n * @param {Function} [props.onDataChange] - 📡 Optional callback for call data updates\r\n *\r\n * @returns {JSX.Element} 🎨 Complete call control interface UI\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <CallControls />\r\n *\r\n * // With data change callback\r\n * <CallControls\r\n * onDataChange={(callData) => {\r\n * console.log('📞 Call status updated:', callData.status);\r\n * updateExternalSystem(callData);\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @features\r\n * - 🎯 Complete telephony control interface\r\n * - 🔄 Real-time call status synchronization\r\n * - 🖱️ Draggable floating window support\r\n * - 📱 Mobile-responsive design\r\n * - 🎨 Material-UI theming support\r\n * - ⚡ Optimized performance with React hooks\r\n * - 🔧 Highly configurable via SDK config\r\n *\r\n * @since 1.0.0\r\n * @version 5.4.8\r\n * @author CTI SDK Team\r\n */\r\nexport function CallControls({ onDataChange }: CallControlPanelProps) {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🎨 Material-UI Theme Object\r\n\t * @description Provides access to Material-UI theme for consistent styling across components\r\n\t * @type {Theme} - Material-UI theme object containing colors, spacing, typography, etc.\r\n\t */\r\n\tconst theme = useTheme();\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all call control functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t/**\r\n\t * 🍞 Toast Notification Service\r\n\t * @description Provides user feedback notifications for success, error, and info messages\r\n\t * @type {Function} - Toast notification function with message and type parameters\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * 🎨 Dynamic Style Objects\r\n\t * @description Style objects that adapt based on SDK configuration for different button states\r\n\t * @type {Object} - Contains disabled, enabled, and outlined style configurations\r\n\t */\r\n\tconst { disabled, enabled, outlined } = useStyles({\r\n\t\tdisabled: state.sdkConfig?.disabled || {}, // 🔴 Disabled button styles\r\n\t\tenabled: state.sdkConfig?.enabled || {}, // 🟢 Enabled button styles\r\n\t\toutlined: state.sdkConfig?.outlined || {}, // ⚪ Outlined button styles\r\n\t});\r\n\r\n\t// =============================================================================\r\n\t// 🔗 WEBSOCKET & REFS MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🌐 WebSocket Connection Reference\r\n\t * @description Persistent reference to WebSocket connection for real-time call updates\r\n\t * @type {useRef<WebSocket | null>} - WebSocket instance reference\r\n\t * @purpose Manages WebSocket connection lifecycle and message handling\r\n\t */\r\n\tconst webSocketRef = useRef<WebSocket | null>(null);\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ UI STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📋 Queue Counts Menu Anchor\r\n\t * @description Controls positioning and visibility of queue counts dropdown menu\r\n\t * @type {useState<null | HTMLElement>} - HTML element reference for menu positioning\r\n\t * @purpose Manages queue counts menu anchor element for proper positioning\r\n\t */\r\n\tconst [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n\t/**\r\n\t * 📞 Soft Phone Iframe Visibility\r\n\t * @description Controls whether the soft phone iframe is visible to the user\r\n\t * @type {useState<boolean>} - Boolean flag for iframe visibility\r\n\t * @purpose Shows/hides the integrated soft phone interface based on call state\r\n\t */\r\n\tconst [showIframe, setShowIframe] = useState<boolean>(true);\r\n\r\n\t/**\r\n\t * 👤 Agent Status Menu Anchor\r\n\t * @description Controls positioning and visibility of agent status dropdown menu\r\n\t * @type {useState<null | HTMLElement>} - HTML element reference for menu positioning\r\n\t * @purpose Manages agent status menu anchor element for break selection\r\n\t */\r\n\tconst [statusAnchorEl, setStatusAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n\t/**\r\n\t * 📱 Dialer Menu Anchor\r\n\t * @description Controls positioning and visibility of phone dialer dropdown menu\r\n\t * @type {useState<null | HTMLElement>} - HTML element reference for menu positioning\r\n\t * @purpose Manages dialer menu anchor element for phone number input\r\n\t */\r\n\tconst [dialerAnchorEl, setDialerAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n\t/**\r\n\t * 📝 Call Disposition Dialog State\r\n\t * @description Controls visibility of end call disposition form dialog\r\n\t * @type {useState<boolean>} - Boolean flag for dialog visibility\r\n\t * @purpose Shows/hides call disposition form when ending calls for proper call closure\r\n\t */\r\n\tconst [openCallDisposition, setOpenCallDisposition] = useState(false);\r\n\r\n\t/**\r\n\t * ⚙️ Processor Selection Dialog State\r\n\t * @description Controls visibility of process selection dialog during initialization\r\n\t * @type {useState<boolean>} - Boolean flag for dialog visibility\r\n\t * @purpose Shows/hides process selection interface when multiple processes are available\r\n\t */\r\n\tconst [openProcessorDialog, setOpenProcessorDialog] = useState(false);\r\n\r\n\t/**\r\n\t * 📋 Call History Dialog State\r\n\t * @description Controls visibility of call history dialog (currently unused feature)\r\n\t * @type {useState<boolean>} - Boolean flag for dialog visibility\r\n\t * @purpose Reserved for future call history functionality\r\n\t */\r\n\tconst [openCallHistoryDialog, setOpenCallHistoryDialog] = useState(false);\r\n\r\n\t/**\r\n\t * 📊 Available Process List\r\n\t * @description Stores the list of available processes for the current agent\r\n\t * @type {useState<null>} - Process list data (will be typed properly in future)\r\n\t * @purpose Holds process data for selection dialog when multiple processes exist\r\n\t */\r\n\tconst [processList, setProcessList] = useState(null);\r\n\r\n\t/**\r\n\t * 📱 Phone Number Input State\r\n\t * @description Stores the current phone number being entered in the dialer\r\n\t * @type {useState<string>} - String value of phone number input\r\n\t * @purpose Manages phone number input in dialer interface for outbound calls\r\n\t */\r\n\tconst [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n\r\n\t/**\r\n\t * ⏱️ Call Duration Timer State\r\n\t * @description Tracks the current call duration in seconds for display\r\n\t * @type {useState<number>} - Number representing seconds elapsed\r\n\t * @purpose Real-time call duration tracking and display for billing/reporting\r\n\t */\r\n\tconst [callDuration, setCallDuration] = useState(0);\r\n\r\n\t// =============================================================================\r\n\t// 🖱️ DRAGGABLE FUNCTIONALITY SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🖱️ Main Control Panel Draggable Hook\r\n\t * @description Provides draggable functionality for the main call control panel\r\n\t * @purpose Enables floating window behavior for the call control interface\r\n\t * @returns {Object} Draggable state and handlers for main panel\r\n\t */\r\n\tconst {\r\n\t\tposition, // 📍 Current panel position coordinates\r\n\t\tisDragging, // 🖱️ Whether panel is currently being dragged\r\n\t\tdragRef, // 🔗 Reference to draggable element\r\n\t\thandleMouseDown, // 🖱️ Mouse drag start handler\r\n\t\thandleTouchStart, // 👆 Touch drag start handler\r\n\t} = useDraggable(\r\n\t\tstate.controlPanelPosition, // 📍 Initial position from state\r\n\t\t(newPosition) => sdkStateManager.setControlPanelPosition(newPosition) // 💾 Position update callback\r\n\t);\r\n\r\n\t/**\r\n\t * 🖱️ Soft Phone Iframe Draggable Hook\r\n\t * @description Provides independent draggable functionality for the soft phone iframe\r\n\t * @purpose Allows separate positioning of the soft phone interface from main panel\r\n\t * @returns {Object} Draggable state and handlers for iframe panel\r\n\t */\r\n\tconst {\r\n\t\tposition: iframePosition, // 📍 Current iframe position coordinates\r\n\t\tisDragging: iframeIsDragging, // 🖱️ Whether iframe is currently being dragged\r\n\t\tdragRef: iframeDragRef, // 🔗 Reference to draggable iframe element\r\n\t\thandleMouseDown: iframeHandleMouseDown, // 🖱️ Mouse drag start handler for iframe\r\n\t\thandleTouchStart: iframeHandleTouchStart, // 👆 Touch drag start handler for iframe\r\n\t} = useDraggable(\r\n\t\tstate.iframePosition, // 📍 Initial iframe position from state\r\n\t\t(newPosition) => sdkStateManager.setIframePosition(newPosition) // 💾 Iframe position update callback\r\n\t);\r\n\r\n\t// =============================================================================\r\n\t// 📡 API HOOKS & REQUEST MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Click-to-Call API Hook\r\n\t * @description Custom hook for initiating outbound calls via API\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Handles click-to-call functionality with automatic UI cleanup\r\n\t * @features Automatic phone number clearing and dialer menu closure on success\r\n\t */\r\n\tconst [clickToCall, { isLoading: clickToCallLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"CALL\")\r\n\t\tphone_number: string; // 📱 Target phone number\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t}>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsetPhoneNumber(\"\"); // 🧹 Clear phone input\r\n\t\t\tsetDialerAnchorEl(null); // ❌ Close dialer menu\r\n\t\t},\r\n\t});\r\n\r\n\t/**\r\n\t * ⏸️ Hold/Unhold Call API Hook\r\n\t * @description Custom hook for managing call hold functionality\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Manages call hold/unhold operations with state synchronization\r\n\t * @features Automatic hold state toggling and error handling\r\n\t */\r\n\tconst [holdOrUnHold, { isLoading: holdOrUnHoldLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"HOLD\" or \"UNHOLD\")\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t\trefno?: string; // 🔗 Optional call reference number\r\n\t}>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setHolding(!state.isHolding); // 🔄 Toggle hold state\r\n\t\t},\r\n\t\tonError: (error) => {\r\n\t\t\tconsole.log(\"❌ Hold operation error:\", error); // 📝 Log errors\r\n\t\t},\r\n\t});\r\n\r\n\t/**\r\n\t * 🔇 Mute/Unmute Call API Hook\r\n\t * @description Custom hook for managing microphone mute functionality\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Handles microphone mute/unmute operations with state synchronization\r\n\t * @features Automatic mute state toggling and error handling\r\n\t */\r\n\tconst [muteOrUnMute, { isLoading: muteOrUnMuteLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"MUTE\" or \"UNMUTE\")\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t\trefno?: string; // 🔗 Optional call reference number\r\n\t}>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setMuted(!state.isMuted); // 🔄 Toggle mute state\r\n\t\t},\r\n\t\tonError: (error) => {\r\n\t\t\tconsole.log(\"❌ Mute operation error:\", error); // 📝 Log errors\r\n\t\t},\r\n\t});\r\n\r\n\t/**\r\n\t * 🎧 Agent Ready Status API Hook\r\n\t * @description Custom hook for setting agent availability status\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Manages agent ready status for incoming call availability\r\n\t * @features Simple API call without complex state management\r\n\t */\r\n\tconst [readyAgentStatus, { isLoading: agentReadyLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"READYAGENT\")\r\n\t\trefno?: string; // 🔗 Optional reference number\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t}>();\r\n\r\n\t/**\r\n\t * ☕ Agent Break Status API Hook\r\n\t * @description Custom hook for updating agent break/lunch status\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Handles agent break status updates (Lunch, Tea, etc.)\r\n\t * @features Break type management for workforce optimization\r\n\t */\r\n\tconst [updateAgentStatus, { isLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"AGENTBREAK\")\r\n\t\tbreak_type: string; // ☕ Break type (Lunch, Tea, etc.)\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t}>();\r\n\r\n\t/**\r\n\t * 📞 End Call with Disposition API Hook\r\n\t * @description Custom hook for ending calls with complete disposition data\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Manages call termination with comprehensive disposition tracking\r\n\t * @features Complete call closure with callback scheduling and follow-up management\r\n\t */\r\n\tconst [endCall, { isLoading: endCallLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"ENDCALL\")\r\n\t\tdisposition: string; // 📝 Call outcome classification\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t\tprocessid: string; // ⚙️ Process identifier\r\n\t\tmobile_number: string; // 📱 Customer phone number\r\n\t\tset_followUp: string; // 📅 Follow-up requirement\r\n\t\tcallback_date: string; // 📅 Scheduled callback date\r\n\t\tcallback_hrs: string; // 🕐 Scheduled callback hour\r\n\t\tcallback_mins: string; // 🕐 Scheduled callback minute\r\n\t\trefno?: string; // 🔗 Optional call reference number\r\n\t}>();\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ EVENT HANDLERS - UI INTERACTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ❌ Queue Counts Menu Close Handler\r\n\t *\r\n\t * @function handleCloseQueueCounts\r\n\t * @description 🚪 Closes the queue counts dropdown menu by clearing the anchor element state\r\n\t * This is triggered when the user clicks outside the menu or presses escape\r\n\t *\r\n\t * @returns {void} No return value - updates component state to close menu\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when menu should be closed\r\n\t * handleCloseQueueCounts();\r\n\t * ```\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleCloseQueueCounts = () => {\r\n\t\tsetAnchorEl(null); // 🧹 Clear anchor element to close menu\r\n\t};\r\n\r\n\t/**\r\n\t * 📱 Dialer Interface Open Handler\r\n\t *\r\n\t * @function handleOpenDialer\r\n\t * @description 📞 Opens the phone dialer interface by setting the dialer anchor element and updating\r\n\t * the agent status to \"dial\". Also ensures the soft phone iframe is visible for dialing.\r\n\t *\r\n\t * @param {React.MouseEvent<HTMLElement>} event - 🖱️ Mouse event from the dial button click\r\n\t *\r\n\t * @returns {void} No return value - updates multiple component states\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when dial button is clicked\r\n\t * <IconButton onClick={handleOpenDialer}>\r\n\t * <WifiCalling3 />\r\n\t * </IconButton>\r\n\t * ```\r\n\t *\r\n\t * @effects\r\n\t * - 📞 Shows the soft phone iframe\r\n\t * - 📍 Sets dialer menu anchor position\r\n\t * - 👤 Updates agent status to \"dial\"\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleOpenDialer = (event: React.MouseEvent<HTMLElement>) => {\r\n\t\tsetShowIframe(true); // 📞 Show soft phone interface\r\n\t\tsetDialerAnchorEl(event.currentTarget); // 📍 Position dialer menu\r\n\t\tsdkStateManager.setStatus(\"dial\"); // 👤 Set agent status to dial\r\n\t};\r\n\r\n\t/**\r\n\t * ❌ Dialer Interface Close Handler\r\n\t *\r\n\t * @function handleCloseDialer\r\n\t * @description 🚪 Closes the dialer interface and resets the agent status to \"idle\" if not currently\r\n\t * on a call. Clears the dialer anchor element state while preserving call status.\r\n\t *\r\n\t * @returns {void} No return value - updates component state to close dialer and reset status\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when dialer menu should be closed\r\n\t * handleCloseDialer();\r\n\t * ```\r\n\t *\r\n\t * @logic\r\n\t * - 🔍 Check if agent is not currently on a call\r\n\t * - 👤 Reset status to \"idle\" if not on call\r\n\t * - ❌ Close dialer menu regardless\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleCloseDialer = () => {\r\n\t\t// 🔍 Only reset status if not currently on a call\r\n\t\tif (state.status !== \"on call\") {\r\n\t\t\tsdkStateManager.setStatus(\"idle\"); // 👤 Reset to idle status\r\n\t\t}\r\n\r\n\t\tsetDialerAnchorEl(null); // ❌ Close dialer menu\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleOpenAgentStatus\r\n\t * @description Opens the agent status menu by setting the status anchor element to the clicked element's position. This allows agents to select break types.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleOpenAgentStatus = (event: React.MouseEvent<HTMLElement>) => {\r\n\t * setStatusAnchorEl(event.currentTarget);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * - `event: React.MouseEvent<HTMLElement>` - Mouse event from the status chip click\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when status chip is clicked\r\n\t * <Chip onClick={handleOpenAgentStatus} />\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - updates component state to show status menu\r\n\t *\r\n\t * @conclusion\r\n\t * Opens the dropdown menu for agents to select their break status (Lunch, Tea, etc.).\r\n\t */\r\n\r\n\tconst handleOpenAgentStatus = (event: React.MouseEvent<HTMLElement>) => {\r\n\t\tsetStatusAnchorEl(event.currentTarget);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleCloseAgentStatus\r\n\t * @description Closes the agent status menu by clearing the status anchor element state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleCloseAgentStatus = () => {\r\n\t * setStatusAnchorEl(null);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when status menu should be closed\r\n\t * handleCloseAgentStatus();\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - updates component state to close status menu\r\n\t *\r\n\t * @conclusion\r\n\t * Simple state management function for closing the agent status dropdown menu.\r\n\t */\r\n\r\n\tconst handleCloseAgentStatus = () => {\r\n\t\tsetStatusAnchorEl(null);\r\n\t};\r\n\r\n\t// =============================================================================\r\n\t// 📡 CALL CONTROL API FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🎧 Agent Ready Status Handler\r\n\t *\r\n\t * @function handleAgentReady\r\n\t * @description 👤 Sets the agent status to \"ready\" by making an API call to the ready agent endpoint.\r\n\t * This allows the agent to receive incoming calls and be available for the queue.\r\n\t *\r\n\t * @returns {void} No return value - makes API call to set agent as ready\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when agent ready button is clicked\r\n\t * <Button onClick={handleAgentReady}>\r\n\t * <SupportAgent />\r\n\t * </Button>\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"READYAGENT\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 📡 Endpoint: READY_AGENT\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleAgentReady = () => {\r\n\t\t// 📦 Prepare API payload for ready agent request\r\n\t\tconst payload = {\r\n\t\t\taction: \"READYAGENT\", // 🎯 API action type\r\n\t\t\tuserId: state.agentId, // 👤 Current agent identifier\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to set agent as ready\r\n\t\treadyAgentStatus(END_POINT.READY_AGENT, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleUpdateAgentStatus\r\n\t * @description Updates the agent's break status by making an API call with the selected break type. Closes the status menu after selection.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleUpdateAgentStatus = (status: string) => {\r\n\t * setStatusAnchorEl(null);\r\n\t * const payload = {\r\n\t * action: \"AGENTBREAK\",\r\n\t * break_type: status,\r\n\t * userId: state.agentId,\r\n\t * };\r\n\t * updateAgentStatus(END_POINT.UPDATE_AGENT_BREAK, payload);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * - `status: string` - The break type (e.g., \"Lunch\", \"Tea\")\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when break type is selected\r\n\t * handleUpdateAgentStatus(\"Lunch\");\r\n\t * handleUpdateAgentStatus(\"Tea\");\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call and closes status menu\r\n\t *\r\n\t * @conclusion\r\n\t * Enables agents to set their break status for proper workforce management.\r\n\t */\r\n\tconst handleUpdateAgentStatus = (status: string) => {\r\n\t\tsetStatusAnchorEl(null);\r\n\t\tconst payload = {\r\n\t\t\taction: \"AGENTBREAK\",\r\n\t\t\tbreak_type: status,\r\n\t\t\tuserId: state.agentId,\r\n\t\t};\r\n\t\tupdateAgentStatus(END_POINT.UPDATE_AGENT_BREAK, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * 📞 Outbound Call Initiator\r\n\t *\r\n\t * @function handleStartCall\r\n\t * @description 📱 Initiates an outbound call by validating the phone number and making an API call\r\n\t * to the click-to-call endpoint. Shows validation errors for invalid numbers.\r\n\t *\r\n\t * @param {string} number - 📱 The phone number to call (must be exactly 10 digits)\r\n\t *\r\n\t * @returns {void} No return value - validates input and makes API call if valid\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when call button is clicked in dialer\r\n\t * handleStartCall(\"1234567890\");\r\n\t * ```\r\n\t *\r\n\t * @validation\r\n\t * - 🔢 Must be exactly 10 digits long\r\n\t * - 📱 Must contain only numeric characters\r\n\t * - 🍞 Shows toast notification for invalid numbers\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"CALL\"\r\n\t * - 📱 Phone Number: Validated input\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 📡 Endpoint: CLICK_TO_CALL\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleStartCall = (number: string) => {\r\n\t\t// 🔢 Validate phone number length (must be 10 digits)\r\n\t\tif (number.length !== 10) {\r\n\t\t\tshowToast(\"Invalid phone number\", \"error\"); // 🍞 Show error toast\r\n\t\t} else if (!/^\\d+$/.test(number)) {\r\n\t\t\t// 📱 Validate numeric characters only\r\n\t\t\tshowToast(\"Invalid phone number\", \"error\"); // 🍞 Show error toast\r\n\t\t} else {\r\n\t\t\t// 📦 Prepare API payload for outbound call\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"CALL\", // 🎯 API action type\r\n\t\t\t\tphone_number: number, // 📱 Target phone number\r\n\t\t\t\tuserId: state.agentId, // 👤 Current agent identifier\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to initiate outbound call\r\n\t\t\tclickToCall(END_POINT.CLICK_TO_CALL, payload);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleHoldToggle\r\n\t * @description Toggles the hold status of the current call by making an API call with the appropriate action (HOLD or UNHOLD) based on current state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleHoldToggle = () => {\r\n\t * const payload = {\r\n\t * action: state.isHolding ? \"UNHOLD\" : \"HOLD\",\r\n\t * userId: state.agentId,\r\n\t * };\r\n\t * holdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (uses component state for current hold status)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when hold button is clicked\r\n\t * <Button onClick={handleHoldToggle}>\r\n\t * {state.isHolding ? <PlayArrow /> : <Pause />}\r\n\t * </Button>\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call to toggle hold status\r\n\t *\r\n\t * @conclusion\r\n\t * Essential function for call management, allowing agents to pause and resume calls.\r\n\t */\r\n\r\n\tconst handleHoldToggle = () => {\r\n\t\tconst payload = {\r\n\t\t\taction: state.isHolding ? \"UNHOLD\" : \"HOLD\",\r\n\t\t\tuserId: state.agentId,\r\n\t\t};\r\n\t\tholdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleMuteToggle\r\n\t * @description Toggles the mute status of the current call by making an API call with the appropriate action (MUTE or UNMUTE) based on current state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleMuteToggle = () => {\r\n\t * const payload = {\r\n\t * action: state.isMuted ? \"UNMUTE\" : \"MUTE\",\r\n\t * userId: state.agentId,\r\n\t * };\r\n\t * muteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (uses component state for current mute status)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when mute button is clicked\r\n\t * <Button onClick={handleMuteToggle}>\r\n\t * {state.isMuted ? <MicOff /> : <Mic />}\r\n\t * </Button>\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call to toggle mute status\r\n\t *\r\n\t * @conclusion\r\n\t * Critical function for audio control during calls, allowing agents to mute/unmute their microphone.\r\n\t */\r\n\r\n\tconst handleMuteToggle = () => {\r\n\t\tconst payload = {\r\n\t\t\taction: state.isMuted ? \"UNMUTE\" : \"MUTE\",\r\n\t\t\tuserId: state.agentId,\r\n\t\t};\r\n\r\n\t\tmuteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleEndCall\r\n\t * @description Ends the current call with disposition data by making an API call to the end call endpoint. Processes callback information and updates component state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleEndCall = (data: {\r\n\t * disposition: { label: string; value: string };\r\n\t * followUp: { label: string; value: string };\r\n\t * callbackDate: string;\r\n\t * callbackHrs: string;\r\n\t * callbackMins: string;\r\n\t * }) => {\r\n\t * console.log(\"data\", data);\r\n\t * const payload = {\r\n\t * action: \"ENDCALL\",\r\n\t * userId: state.agentId,\r\n\t * processid: state.process?.process_id?.toString() ?? \"\",\r\n\t * process_name: state.process?.process_name ?? \"\",\r\n\t * callreferenceid: state.callData?.convox_id ?? \"\",\r\n\t * mobile_number: state.callData?.phone_number ?? \"\",\r\n\t * disposition: data?.disposition?.value ?? \"\",\r\n\t * set_followUp: data?.followUp?.value ?? \"\",\r\n\t * callback_date: data?.callbackDate ?? \"\",\r\n\t * callback_hrs: data?.callbackHrs ?? \"\",\r\n\t * callback_mins: data?.callbackMins ?? \"\",\r\n\t * endcall_type: \"CLOSE\",\r\n\t * };\r\n\t * setPhoneNumber(\"\");\r\n\t * endCall(END_POINT.END_CALL, payload);\r\n\t * sdkStateManager.endCall();\r\n\t * setOpenCallDisposition(false);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * - `data: object` - Disposition data containing:\r\n\t * - `disposition: { label: string; value: string }` - Call outcome classification\r\n\t * - `followUp: { label: string; value: string }` - Follow-up requirements\r\n\t * - `callbackDate: string` - Scheduled callback date\r\n\t * - `callbackHrs: string` - Scheduled callback hour\r\n\t * - `callbackMins: string` - Scheduled callback minute\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when end call disposition is submitted\r\n\t * handleEndCall({\r\n\t * disposition: { label: \"Resolved\", value: \"RESOLVED\" },\r\n\t * followUp: { label: \"None\", value: \"NONE\" },\r\n\t * callbackDate: \"2024-01-15\",\r\n\t * callbackHrs: \"14\",\r\n\t * callbackMins: \"30\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call and updates component state:\r\n\t * - Clears phone number input\r\n\t * - Makes end call API request\r\n\t * - Updates SDK state to end call\r\n\t * - Closes disposition dialog\r\n\t *\r\n\t * @conclusion\r\n\t * Comprehensive function for properly ending calls with complete disposition tracking and callback scheduling.\r\n\t */\r\n\r\n\tconst handleEndCall = (data: {\r\n\t\tdisposition: { label: string; value: string };\r\n\t\tfollowUp: { label: string; value: string };\r\n\t\tcallbackDate: string;\r\n\t\tcallbackHrs: string;\r\n\t\tcallbackMins: string;\r\n\t}) => {\r\n\t\tconsole.log(\"data\", data);\r\n\t\tconst payload = {\r\n\t\t\taction: \"ENDCALL\",\r\n\t\t\tuserId: state.agentId,\r\n\t\t\tprocessid: state.process?.process_id?.toString() ?? \"\",\r\n\t\t\tprocess_name: state.process?.process_name ?? \"\",\r\n\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\",\r\n\t\t\tmobile_number: state.callData?.phone_number ?? \"\",\r\n\r\n\t\t\tdisposition: data?.disposition?.value ?? \"\",\r\n\t\t\tset_followUp: data?.followUp?.value ?? \"\",\r\n\t\t\tcallback_date: data?.callbackDate ?? \"\",\r\n\t\t\tcallback_hrs: data?.callbackHrs ?? \"\",\r\n\t\t\tcallback_mins: data?.callbackMins ?? \"\",\r\n\t\t\tendcall_type: \"CLOSE\",\r\n\t\t};\r\n\t\tsetPhoneNumber(\"\");\r\n\t\tendCall(END_POINT.END_CALL, payload);\r\n\t\tsdkStateManager.endCall();\r\n\t\tsetOpenCallDisposition(false);\r\n\t};\r\n\r\n\t// =============================================================================\r\n\t// 🔄 EFFECT HOOKS - LIFECYCLE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🛡️ Page Unload Protection Effect\r\n\t *\r\n\t * @hook useEffect - Before Unload Handler\r\n\t * @description 🚫 Sets up a beforeunload event listener to prevent users from accidentally\r\n\t * leaving the page during active calls. This helps preserve call sessions\r\n\t * and prevents data loss.\r\n\t *\r\n\t * @dependencies [] - Empty dependency array for component mount only\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs on component mount\r\n\t * // Prevents page unload during active calls\r\n\t * ```\r\n\t *\r\n\t * @effects\r\n\t * - 🛡️ Prevents accidental page navigation during calls\r\n\t * - 💾 Preserves call session data\r\n\t * - 🧹 Cleans up event listener on unmount\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// 🛡️ Define beforeunload handler to prevent accidental navigation\r\n\t\tconst handleBeforeUnload = (e: BeforeUnloadEvent) => {\r\n\t\t\te.preventDefault(); // 🚫 Prevent default unload behavior\r\n\t\t};\r\n\r\n\t\t// 📡 Add event listener for beforeunload\r\n\t\twindow.addEventListener(\"beforeunload\", handleBeforeUnload);\r\n\r\n\t\t// 🧹 Cleanup function to remove event listener\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener(\"beforeunload\", handleBeforeUnload);\r\n\t\t};\r\n\t}, []); // 🔄 Empty dependency array - runs only on mount/unmount\r\n\r\n\t/**\r\n\t * ⏱️ Call Duration Timer Effect\r\n\t *\r\n\t * @hook useEffect - Call Duration Timer\r\n\t * @description 🕐 Manages a real-time timer that tracks and displays call duration.\r\n\t * Updates every second when a call is active and resets when the call ends.\r\n\t *\r\n\t * @dependencies [state.callData.status] - Runs when call status changes\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when call status changes\r\n\t * // Updates callDuration state every second during active calls\r\n\t * ```\r\n\t *\r\n\t * @logic\r\n\t * - 🔍 Check if call status is \"ONCALL\"\r\n\t * - ⏰ Start interval timer if call is active\r\n\t * - 🧮 Calculate elapsed time from call start\r\n\t * - 🔄 Update duration state every second\r\n\t * - 🧹 Clear interval when call ends\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\tlet interval: ReturnType<typeof setInterval>; // ⏰ Interval reference\r\n\r\n\t\t// 🔍 Check if call is currently active\r\n\t\tif (state.callData.status && state.callData.status === \"ONCALL\") {\r\n\t\t\t// ⏰ Start timer interval for active call\r\n\t\t\tinterval = setInterval(() => {\r\n\t\t\t\t// 🧮 Calculate elapsed time in seconds\r\n\t\t\t\tconst elapsed = Math.floor((Date.now() - state.callStartTime!) / 1000);\r\n\t\t\t\tsetCallDuration(elapsed); // 📊 Update duration state\r\n\t\t\t}, 1000); // 🔄 Update every second\r\n\t\t} else {\r\n\t\t\t// 🔄 Reset duration when call is not active\r\n\t\t\tsetCallDuration(0);\r\n\t\t}\r\n\r\n\t\t// 🧹 Cleanup function to clear interval\r\n\t\treturn () => {\r\n\t\t\tif (interval) clearInterval(interval);\r\n\t\t};\r\n\t}, [state.callData.status]); // 🔄 Dependency on call status\r\n\r\n\t/**\r\n\t * @hook useEffect - Data Change Notification\r\n\t * @description Notifies parent components of call data changes by calling the onDataChange callback whenever call data updates occur.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * useEffect(() => {\r\n\t * if (onDataChange) {\r\n\t * onDataChange(state.callData);\r\n\t * }\r\n\t * }, [state.callData, onDataChange]);\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (depends on state.callData and onDataChange prop)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when call data changes\r\n\t * // Calls parent component's onDataChange callback\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - calls parent callback with updated call data\r\n\t *\r\n\t * @conclusion\r\n\t * Enables parent components to react to call state changes for external integrations and logging.\r\n\t */\r\n\r\n\tuseEffect(() => {\r\n\t\tif (onDataChange && state.callData) {\r\n\t\t\tconst { process_id, process_name, status, phone_number, agent_id, convox_id } =\r\n\t\t\t\tstate.callData;\r\n\t\t\tconst callData = {\r\n\t\t\t\tphone_number,\r\n\t\t\t\tstatus,\r\n\t\t\t\tcallReferenceId: convox_id,\r\n\t\t\t\tagent_id,\r\n\t\t\t\tprocess_id,\r\n\t\t\t\tprocess_name,\r\n\t\t\t};\r\n\t\t\tonDataChange(callData);\r\n\t\t}\r\n\t}, [state.callData, onDataChange]);\r\n\r\n\t/**\r\n\t * @hook useEffect - Process List Fetching\r\n\t * @description Fetches the list of available processes for the agent when the agentId becomes available. Handles process selection and error states.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * useEffect(() => {\r\n\t * if (state.agentId) {\r\n\t * axiosInstance\r\n\t * .post(END_POINT.PROCESS_LIST, {\r\n\t * userId: state.agentId,\r\n\t * action: \"GETAGENTPROCESSLIST\",\r\n\t * refno: \"1234221233\",\r\n\t * })\r\n\t * .then((res) => {\r\n\t * console.log(res.data.data, \"res4\");\r\n\t * if (res && res.data && res?.data?.length > 1) {\r\n\t * setProcessList(res.data.data);\r\n\t * setOpenProcessorDialog(true);\r\n\t * } else {\r\n\t * sdkStateManager.setProcess(res?.data?.data[0]);\r\n\t * setOpenProcessorDialog(false);\r\n\t * }\r\n\t * })\r\n\t * .catch((err) => {\r\n\t * showToast(err.response.data.message, \"error\");\r\n\t * });\r\n\t * } else {\r\n\t * console.log(\"No agentId available, skipping API call\");\r\n\t * }\r\n\t * }, [state.agentId]);\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (depends on state.agentId)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when agentId becomes available\r\n\t * // Fetches process list and handles selection\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - fetches data and updates component state:\r\n\t * - Sets process list if multiple processes available\r\n\t * - Auto-selects single process\r\n\t * - Shows error toast on failure\r\n\t *\r\n\t * @conclusion\r\n\t * Critical initialization function that sets up the agent's available processes for call handling.\r\n\t */\r\n\tuseEffect(() => {\r\n\t\tif (state.agentId) {\r\n\t\t\taxiosInstance\r\n\t\t\t\t.post(END_POINT.PROCESS_LIST, {\r\n\t\t\t\t\tuserId: state.agentId,\r\n\t\t\t\t\taction: \"GETAGENTPROCESSLIST\",\r\n\t\t\t\t\trefno: \"1234221233\",\r\n\t\t\t\t})\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\tconsole.log(res.data.data, \"res4\");\r\n\t\t\t\t\tif (res && res.data && res?.data?.length > 1) {\r\n\t\t\t\t\t\tsetProcessList(res.data.data);\r\n\t\t\t\t\t\tsetOpenProcessorDialog(true);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsdkStateManager.setProcess(res?.data?.data[0]);\r\n\t\t\t\t\t\tsetOpenProcessorDialog(false);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\tshowToast(err.response.data.message, \"error\");\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\tconsole.log(\"No agentId available, skipping API call\");\r\n\t\t}\r\n\t}, [state.agentId]);\r\n\r\n\t/**\r\n\t * 🌐 WebSocket Real-time Connection Effect\r\n\t *\r\n\t * @hook useEffect - WebSocket Connection\r\n\t * @description 🔄 Establishes and manages WebSocket connection for real-time call updates.\r\n\t * Handles connection lifecycle, message parsing, and call state synchronization.\r\n\t *\r\n\t * @dependencies [state.agentId] - Runs when agent ID becomes available\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when agentId becomes available\r\n\t * // Establishes WebSocket connection for real-time updates\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔗 Agent-specific WebSocket endpoint connection\r\n\t * - 📡 Real-time call data updates\r\n\t * - 🎯 Conference data synchronization\r\n\t * - 📞 Automatic soft phone interface management\r\n\t * - 🛡️ Error handling and connection cleanup\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// 🔍 Only establish connection if agent ID is available\r\n\t\tif (state.agentId) {\r\n\t\t\t// 🌐 Create WebSocket connection with agent-specific endpoint\r\n\t\t\twebSocketRef.current = new WebSocket(`${WS_END_POINT.WS}?agent_id=${state.agentId}`);\r\n\r\n\t\t\t// ✅ Connection established handler\r\n\t\t\twebSocketRef.current.onopen = () => {\r\n\t\t\t\tconsole.log(\"🌐 WebSocket connection established\");\r\n\t\t\t};\r\n\r\n\t\t\t// 📨 Message received handler\r\n\t\t\twebSocketRef.current.onmessage = (event) => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// 📊 Parse incoming JSON data\r\n\t\t\t\t\tconst data = JSON.parse(event.data);\r\n\r\n\t\t\t\t\t// 🔄 Combine conference data with API response\r\n\t\t\t\t\tconst confrence = getCombineConfrenceData(\r\n\t\t\t\t\t\tstate?.conferenceLine, // 📊 Current conference lines\r\n\t\t\t\t\t\tdata?.conferencestatus, // 📡 API conference status\r\n\t\t\t\t\t\tdata // 📞 Additional call data\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tconsole.log(confrence, \"📊 Parsed JSON:\", data);\r\n\r\n\t\t\t\t\t// 🔄 Update call data in state manager\r\n\t\t\t\t\tsdkStateManager.updateCallData(data);\r\n\r\n\t\t\t\t\t// 🔄 Update conference data in state manager\r\n\t\t\t\t\tsdkStateManager.updateConferenceData([...confrence]);\r\n\r\n\t\t\t\t\t// 📞 Handle call start\r\n\t\t\t\t\tif (data.status === \"ONCALL\") {\r\n\t\t\t\t\t\tsdkStateManager.startCall(); // 🎯 Start call tracking\r\n\t\t\t\t\t\tif (!showIframe) {\r\n\t\t\t\t\t\t\tsetShowIframe(true); // 📞 Show soft phone interface\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// 🔚 Handle call wrap-up\r\n\t\t\t\t\tif (data.status === \"WRAPUP\") {\r\n\t\t\t\t\t\tsdkStateManager.endCall(); // 🎯 End call tracking\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch {\r\n\t\t\t\t\t// 📝 Log raw message if JSON parsing fails\r\n\t\t\t\t\tconsole.log(\"📨 Raw message:\", event.data);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// ❌ Connection closed handler\r\n\t\t\twebSocketRef.current.onclose = () => {\r\n\t\t\t\tconsole.log(\"🔌 WebSocket connection closed\");\r\n\t\t\t};\r\n\r\n\t\t\t// ⚠️ Connection error handler\r\n\t\t\twebSocketRef.current.onerror = (error) => {\r\n\t\t\t\tconsole.error(\"❌ WebSocket error:\", error);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// 🧹 Cleanup function to close WebSocket connection\r\n\t\treturn () => {\r\n\t\t\twebSocketRef.current?.close();\r\n\t\t};\r\n\t}, [state.agentId]); // 🔄 Dependency on agent ID\r\n\r\n\t// =============================================================================\r\n\t// 🎯 CONDITIONAL RENDERING LOGIC\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⚙️ SDK Initialization Check\r\n\t *\r\n\t * @section Initialization Check\r\n\t * @description 🔧 Renders a processor selection dialog when the SDK is not fully initialized\r\n\t * or when no process is selected. This ensures agents can choose their working\r\n\t * process before accessing call controls.\r\n\t *\r\n\t * @returns {JSX.Element} ⚙️ Processor selection interface\r\n\t *\r\n\t * @conditions\r\n\t * - ❌ SDK is not initialized\r\n\t * - ❌ No process is selected\r\n\t * - ✅ Multiple processes are available for selection\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Rendered when SDK needs initialization\r\n\t * // Shows process selection dialog\r\n\t * ```\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tif (!state.isInitialized || !state.process) {\r\n\t\treturn (\r\n\t\t\t<Box>\r\n\t\t\t\t{/* ⚙️ Processor Selection Dialog */}\r\n\t\t\t\t{Boolean(openProcessorDialog) && (\r\n\t\t\t\t\t<ProcessorListDialog\r\n\t\t\t\t\t\tprocessList={processList} // 📊 Available processes\r\n\t\t\t\t\t\topen={openProcessorDialog} // 👁️ Dialog visibility\r\n\t\t\t\t\t\tsetOpen={setOpenProcessorDialog} // 🔄 Dialog state setter\r\n\t\t\t\t\t\thandleSelectedProcessor={(data: { process_id: number; process_name: string }) => {\r\n\t\t\t\t\t\t\tsdkStateManager.setProcess(data); // 💾 Set selected process\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\t\t);\r\n\t}\r\n\r\n\t// =============================================================================\r\n\t// 🎨 MAIN RENDER RETURN - COMPLETE UI INTERFACE\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🎯 Main UI Components Render\r\n\t *\r\n\t * @section Main UI Components\r\n\t * @description 🎨 The main return statement renders the complete call control interface including\r\n\t * all interactive elements, dialogs, and real-time components. This is the primary\r\n\t * UI that agents interact with for all telephony operations.\r\n\t *\r\n\t * @returns {JSX.Element} 🎨 Complete call control interface UI\r\n\t *\r\n\t * @components\r\n\t * - 🖱️ Draggable main control panel with call status and timer\r\n\t * - 📞 Soft phone iframe integration for dialing\r\n\t * - 📱 Dialer menu with phone number input\r\n\t * - 👤 Agent status selection menu for breaks\r\n\t * - 📋 Queue count display menu\r\n\t * - 👥 Conference call dialog\r\n\t * - 🔄 Call transfer dialog\r\n\t * - 📝 End call disposition dialog\r\n\t * - 📊 Call history dialog\r\n\t *\r\n\t * @features\r\n\t * - ✨ Smooth fade animations for all components\r\n\t * - 🖱️ Draggable floating windows\r\n\t * - 📱 Responsive design for different screen sizes\r\n\t * - 🎨 Material-UI theming support\r\n\t * - ⚡ Real-time updates via WebSocket\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{/* 🎯 Main Control Panel Container */}\r\n\t\t\t<Box>\r\n\t\t\t\t{/* ✨ Fade Animation for Main Panel */}\r\n\t\t\t\t<Fade\r\n\t\t\t\t\tin={true}\r\n\t\t\t\t\ttimeout={300}\r\n\t\t\t\t>\r\n\t\t\t\t\t{/* 📄 Main Control Panel Paper Component */}\r\n\t\t\t\t\t<Paper\r\n\t\t\t\t\t\tref={state.sdkConfig?.isDraggable ? dragRef : null} // 🖱️ Drag reference if draggable\r\n\t\t\t\t\t\televation={\r\n\t\t\t\t\t\t\tisDragging ?\r\n\t\t\t\t\t\t\t\t4 // 🔝 Higher elevation when dragging\r\n\t\t\t\t\t\t\t: state.sdkConfig?.isDraggable ?\r\n\t\t\t\t\t\t\t\t1 // 📄 Normal elevation if draggable\r\n\t\t\t\t\t\t\t:\t0 // 📄 No elevation if not draggable\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tposition: state.sdkConfig?.isDraggable ? \"fixed\" : \"relative\", // 📍 Position based on draggable config\r\n\t\t\t\t\t\t\tleft: state.sdkConfig?.isDraggable ? position.x : \"auto\", // 📍 X position for draggable\r\n\t\t\t\t\t\t\ttop: state.sdkConfig?.isDraggable ? position.y : \"auto\", // 📍 Y position for draggable\r\n\t\t\t\t\t\t\tdisplay: \"inline-block\", // 📦 Inline block display\r\n\t\t\t\t\t\t\twidth: \"auto\", // 📏 Auto width\r\n\t\t\t\t\t\t\tflexShrink: 0, // 🔒 Prevent shrinking\r\n\t\t\t\t\t\t\twhiteSpace: \"nowrap\", // 📝 No text wrapping\r\n\t\t\t\t\t\t\tp: 0.5, // 📏 Padding\r\n\t\t\t\t\t\t\tborderRadius: 3, // 🔄 Border radius\r\n\t\t\t\t\t\t\tbgcolor: \"background.paper\", // 🎨 Background color\r\n\t\t\t\t\t\t\tzIndex: state.sdkConfig?.isDraggable ? Number.MAX_SAFE_INTEGER : 0, // 🔝 Z-index for layering\r\n\t\t\t\t\t\t\ttransition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n\t\t\t\t\t\t\t\t// ✨ Smooth transitions\r\n\t\t\t\t\t\t\t\tduration: theme.transitions.duration.short,\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\tuserSelect: \"none\", // 🚫 Prevent text selection\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{/* Status and Timer Row */}\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\tgap: 1,\r\n\t\t\t\t\t\t\t\t\tmargin: \"0px 10px\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{state.sdkConfig?.isDraggable && (\r\n\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tcursor: \"all-scroll\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tonMouseDown={handleMouseDown}\r\n\t\t\t\t\t\t\t\t\t\tonTouchStart={handleTouchStart}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<DragIndicator />{\" \"}\r\n\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t\t\t{/* Dial Button */}\r\n\t\t\t\t\t\t\t\t\t{!state.sdkConfig?.disabledDialButton && (\r\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Dial\">\r\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"BREAK\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleOpenDialer(e);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"warning\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<WifiCalling3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"action.selected\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t:\t\"success.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t{/* Call Duration */}\r\n\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tcolor: \"success.main\",\r\n\t\t\t\t\t\t\t\t\t\twidth: \"40px\",\r\n\t\t\t\t\t\t\t\t\t\tmarginRight: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tfontSize: \"18px\",\r\n\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{formatDuration(callDuration)}\r\n\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"18px 0px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tlabel={\r\n\t\t\t\t\t\t\t\t\t\tisLoading || agentReadyLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<CircularProgress size=\"20px\" />\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextAlign: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{state.callData?.status?.toUpperCase() ?? \"N/A\"}\r\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tonClick={handleOpenAgentStatus}\r\n\t\t\t\t\t\t\t\t\tdeleteIcon={<KeyboardArrowDown color=\"primary\" />}\r\n\t\t\t\t\t\t\t\t\tonDelete={handleOpenAgentStatus}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t\t{/* 🎛️ Control Buttons Section */}\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\", // 📦 Flexbox layout\r\n\t\t\t\t\t\t\t\t\tgap: 1, // 📏 Gap between buttons\r\n\t\t\t\t\t\t\t\t\tjustifyContent: \"center\", // 🎯 Center alignment\r\n\t\t\t\t\t\t\t\t\talignItems: \"center\", // 📐 Vertical center alignment\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{/* Agent Ready */}\r\n\t\t\t\t\t\t\t\t<Tooltip title={\"Agent Ready\"}>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\t:\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\thandleAgentReady();\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tclasses={{\r\n\t\t\t\t\t\t\t\t\t\t\troot:\r\n\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t\"enabled\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t...((\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\toutlined\r\n\t\t\t\t\t\t\t\t\t\t\t:\tenabled),\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={agentReadyLoading}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<SupportAgent />\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</Tooltip>\r\n\r\n\t\t\t\t\t\t\t\t{/* Hold Button */}\r\n\r\n\t\t\t\t\t\t\t\t<Tooltip title={state.isHolding ? \"Resume\" : \"Hold\"}>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isHolding && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\thandleHoldToggle();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isHolding && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t\t\t(state.callData?.status?.toUpperCase() !== \"ONCALL\" && !state.isHolding) ||\r\n\t\t\t\t\t\t\t\t\t\t\tholdOrUnHoldLoading\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{holdOrUnHoldLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t: state.isHolding ?\r\n\t\t\t\t\t\t\t\t\t\t\t<PlayArrow />\r\n\t\t\t\t\t\t\t\t\t\t:\t<Pause />}\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</Tooltip>\r\n\r\n\t\t\t\t\t\t\t\t{/* Mute Button */}\r\n\r\n\t\t\t\t\t\t\t\t<Tooltip title={state.isMuted ? \"Unmute\" : \"Mute\"}>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isMuted && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\thandleMuteToggle();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isMuted && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t\t\t(state.callData?.status?.toUpperCase() !== \"ONCALL\" && !state.isMuted) ||\r\n\t\t\t\t\t\t\t\t\t\t\tmuteOrUnMuteLoading\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{muteOrUnMuteLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t: state.isMuted ?\r\n\t\t\t\t\t\t\t\t\t\t\t<MicOff />\r\n\t\t\t\t\t\t\t\t\t\t:\t<Mic />}\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</Tooltip>\r\n\r\n\t\t\t\t\t\t\t\t{/* Call Transfer */}\r\n\t\t\t\t\t\t\t\t{!state.sdkConfig?.disableCallTransferButton && (\r\n\t\t\t\t\t\t\t\t\t<Tooltip title={\"Transfer Call\"}>\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\tvariant={state.openCallTransferDialog ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsdkStateManager.setOpenCallTransferDialog(true);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.openCallTransferDialog ? { ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={state.callData?.status?.toUpperCase() !== \"ONCALL\"}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<TransferWithinAStation />\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t\t{/* Call Conference Button */}\r\n\t\t\t\t\t\t\t\t{!state.sdkConfig?.disableConferenceButton && (\r\n\t\t\t\t\t\t\t\t\t<Tooltip title={\"Conference Call\"}>\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\tvariant={state.openConferenceDialog ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsdkStateManager.setOpenConferenceDialog(true);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.openConferenceDialog ? { ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={state.callData?.status?.toUpperCase() !== \"ONCALL\"}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<Group />\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t\t{/* End Call Button */}\r\n\t\t\t\t\t\t\t\t{!state.sdkConfig?.disableEndCallButton && (\r\n\t\t\t\t\t\t\t\t\t<Tooltip title={\"End Call\"}>\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenCallDisposition(true);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborderRight: \"1px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: \"error.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminWidth: \"60px !important\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \" 0px 2px 1px #5f3f3f\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborder: `1px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: \"40px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \" 0px 2px 1px #5f3f3f\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...disabled,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminWidth: \"60px !important\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"WRAPUP\") ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tendCallLoading\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{endCallLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t:\t<CallEnd />}\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Paper>\r\n\t\t\t\t</Fade>\r\n\t\t\t</Box>\r\n\t\t\t<Fade\r\n\t\t\t\tin={true}\r\n\t\t\t\ttimeout={300}\r\n\t\t\t>\r\n\t\t\t\t<Paper\r\n\t\t\t\t\tref={iframeDragRef}\r\n\t\t\t\t\televation={iframeIsDragging ? 4 : 1}\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\t\tleft: iframePosition.x,\r\n\t\t\t\t\t\ttop: iframePosition.y,\r\n\t\t\t\t\t\tborderRadius: 2,\r\n\t\t\t\t\t\tbgcolor: \"background.paper\",\r\n\t\t\t\t\t\tzIndex: Number.MAX_SAFE_INTEGER,\r\n\t\t\t\t\t\ttransition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n\t\t\t\t\t\t\tduration: theme.transitions.duration.short,\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t\tvisibility: showIframe && !state.sdkConfig?.disableSoftPhone ? \"visible\" : \"hidden\",\r\n\t\t\t\t\t\tuserSelect: \"none\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\tcursor: \"all-scroll\",\r\n\t\t\t\t\t\t\tpadding: \"0px 10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonMouseDown={iframeHandleMouseDown}\r\n\t\t\t\t\t\tonTouchStart={iframeHandleTouchStart}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<DragIndicator\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\ttransform: \"rotate(90deg)\",\r\n\t\t\t\t\t\t\t\tcolor: \"#7b7b7b\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>{\" \"}\r\n\t\t\t\t\t\t<IconButton onClick={() => setShowIframe(false)}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t<iframe\r\n\t\t\t\t\t\t\tsrc={`https://${IP}/ConVoxCCS/iframe?agent_id=${state.agentId}&process_id=${state.process?.process_id}`}\r\n\t\t\t\t\t\t\theight={380}\r\n\t\t\t\t\t\t\twidth={420}\r\n\t\t\t\t\t\t\tallow=\"camera; microphone; autoplay\"\r\n\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\tborder: \"none\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t></iframe>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Fade>\r\n\r\n\t\t\t{/* Dialer */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={dialerAnchorEl}\r\n\t\t\t\topen={Boolean(dialerAnchorEl)}\r\n\t\t\t\tonClose={handleCloseDialer}\r\n\t\t\t\tonClick={(e) => e.stopPropagation()}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tzIndex: 99999,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tall: \"unset\",\r\n\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\"&hover\": {\r\n\t\t\t\t\t\t\tbackgroundColor: \"white\",\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<TextField\r\n\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\tvalue={phoneNumber}\r\n\t\t\t\t\t\tplaceholder=\"Enter Mobile No.\"\r\n\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\tsetPhoneNumber(e.target.value);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\tcolor=\"info\"\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\thandleStartCall(phoneNumber);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{clickToCallLoading ?\r\n\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tcolor: theme.palette.success.main,\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t:\t<Phone color=\"success\" />}\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</Box>\r\n\t\t\t</Menu>\r\n\r\n\t\t\t{/* Status */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={statusAnchorEl}\r\n\t\t\t\topen={Boolean(statusAnchorEl)}\r\n\t\t\t\tonClose={handleCloseAgentStatus}\r\n\t\t\t\tonClick={(e) => e.stopPropagation()}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tzIndex: 99999,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<MenuItem onClick={() => handleUpdateAgentStatus(\"Lunch\")}>- Lunch</MenuItem>\r\n\t\t\t\t<MenuItem onClick={() => handleUpdateAgentStatus(\"Tea\")}>- Tea</MenuItem>\r\n\t\t\t</Menu>\r\n\r\n\t\t\t{/* Queue Count */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={anchorEl}\r\n\t\t\t\topen={Boolean(anchorEl)}\r\n\t\t\t\tonClose={handleCloseQueueCounts}\r\n\t\t\t\tonClick={(e) => e.stopPropagation()}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tzIndex: 99999,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\tjustifyContent: \"flex-start\",\r\n\t\t\t\t\t\tflexDirection: \"column\",\r\n\t\t\t\t\t\tpadding: \"0px 10px\",\r\n\t\t\t\t\t\t\"&hover\": {\r\n\t\t\t\t\t\t\tbackgroundColor: \"white\",\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\ticon={<Layers color=\"secondary\" />}\r\n\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\tlabel=\"Waiting - 25\"\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tmargin: \"4px 2px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\ticon={<Pending color=\"info\" />}\r\n\t\t\t\t\t\tlabel=\"Pending - 99+\"\r\n\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tmargin: \"4px 2px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\ticon={<Upcoming color=\"success\" />}\r\n\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\tlabel=\"Upcoming - 66\"\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tmargin: \"4px 2px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</Box>\r\n\t\t\t</Menu>\r\n\r\n\t\t\t{/* Conference Call Dialog */}\r\n\t\t\t{Boolean(state.openConferenceDialog) && <ConferenceDialog />}\r\n\r\n\t\t\t{/* Call Transfer Dialog */}\r\n\t\t\t{Boolean(state.openCallTransferDialog) && (\r\n\t\t\t\t<CallTransferDialog open={state.openCallTransferDialog} />\r\n\t\t\t)}\r\n\r\n\t\t\t{/* Call Disposition Dialog */}\r\n\t\t\t{Boolean(openCallDisposition) && (\r\n\t\t\t\t<EndCallDispositionDialog\r\n\t\t\t\t\topen={openCallDisposition}\r\n\t\t\t\t\tsetOpen={setOpenCallDisposition}\r\n\t\t\t\t\tonSubmitDisposition={handleEndCall}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\r\n\t\t\t{/* Call Disposition Dialog */}\r\n\t\t\t{Boolean(openCallHistoryDialog) && (\r\n\t\t\t\t<CallHistoryDialog\r\n\t\t\t\t\topen={openCallHistoryDialog}\r\n\t\t\t\t\tsetOpen={setOpenCallHistoryDialog}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * 📋 FILE SUMMARY & COMPONENT OVERVIEW\r\n * =============================================================================\r\n *\r\n * 🎯 This CallControls component is a comprehensive telephony interface that provides:\r\n *\r\n * 📞 **Core Functionality**:\r\n * - 📱 Complete call control operations (dial, hold, mute, transfer, conference, end)\r\n * - ⏸️ Hold/resume functionality with visual feedback\r\n * - 🔇 Mute/unmute controls with state synchronization\r\n * - 🔄 Call transfer and conference capabilities\r\n * - 📝 End call with comprehensive disposition tracking\r\n *\r\n * 🔄 **Real-time Updates**:\r\n * - 🌐 WebSocket integration for live call status updates\r\n * - 📊 Conference data synchronization\r\n * - ⏱️ Real-time call duration tracking\r\n * - 📡 Automatic UI updates based on call state changes\r\n *\r\n * 👤 **Agent Management**:\r\n * - 🎧 Agent ready/break status controls\r\n * - ☕ Break type management (Lunch, Tea, etc.)\r\n * - ⚙️ Process selection and initialization\r\n * - 📊 Queue count monitoring\r\n *\r\n * 🎨 **User Experience**:\r\n * - 🖱️ Draggable floating interface\r\n * - 📞 Soft phone iframe integration\r\n * - 📱 Responsive design for different screen sizes\r\n * - ✨ Smooth animations and transitions\r\n * - 🎨 Material-UI theming support\r\n *\r\n * 📊 **Data Management**:\r\n * - 📝 Call disposition tracking and classification\r\n * - 📅 Callback scheduling and follow-up management\r\n * - 🔄 State synchronization across components\r\n * - 💾 Persistent position and configuration storage\r\n *\r\n * 🛡️ **Error Handling**:\r\n * - ✅ Input validation for phone numbers\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🚫 Page unload protection during active calls\r\n * - 🔄 Graceful failure management and recovery\r\n *\r\n * 🔗 **Integration**:\r\n * - 📡 Parent component communication via callbacks\r\n * - 🌐 External system connectivity via APIs\r\n * - 🔧 Configurable button states and functionality\r\n * - 📊 Real-time data synchronization\r\n *\r\n * 🏗️ **Architecture**:\r\n * - ⚛️ React functional component with hooks\r\n * - 🗃️ Centralized state management via SDK state manager\r\n * - 🔄 Effect hooks for lifecycle management\r\n * - 📡 Custom hooks for API operations\r\n * - 🎨 Material-UI component library integration\r\n *\r\n * 🎯 **Best Practices**:\r\n * - 📝 Comprehensive JSDoc documentation\r\n * - 🎨 Consistent code formatting and structure\r\n * - 🔧 TypeScript type safety throughout\r\n * - ⚡ Performance optimization with useCallback\r\n * - 🧹 Proper cleanup and memory management\r\n *\r\n * 📈 **Performance Features**:\r\n * - ⚡ Optimized re-renders with proper dependency arrays\r\n * - 🔄 Memoized callback functions\r\n * - 🧹 Automatic cleanup of intervals and event listeners\r\n * - 📊 Efficient state updates and synchronization\r\n *\r\n * 🎯 **Use Cases**:\r\n * - 🏢 Contact center agent interfaces\r\n * - 📞 Customer service telephony systems\r\n * - 🎧 Call center management platforms\r\n * - 📱 Integrated telephony applications\r\n * - 🔄 Multi-channel communication systems\r\n *\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n * @license Proprietary\r\n */\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { type MouseEvent, type TouchEvent, useCallback, useRef, useState } from \"react\";\r\n\r\n/**\r\n * Represents a 2D position on the screen in pixels.\r\n *\r\n * @typedef {Object} Position\r\n * @property {number} x - The horizontal coordinate in pixels.\r\n * @property {number} y - The vertical coordinate in pixels.\r\n */\r\ninterface Position {\r\n\tx: number;\r\n\ty: number;\r\n}\r\n\r\n/**\r\n * The return type of the `useDraggable` hook.\r\n *\r\n * @typedef {Object} UseDraggableReturn\r\n * @property {Position} position - The current position of the draggable element in `{x, y}` pixels.\r\n * @property {boolean} isDragging - Whether the element is currently being dragged.\r\n * @property {React.RefObject<HTMLDivElement | null>} dragRef - Ref to attach to the draggable DOM element.\r\n * @property {(e: MouseEvent<HTMLDivElement>) => void} handleMouseDown - Mouse down handler to start dragging.\r\n * @property {(e: TouchEvent<HTMLDivElement>) => void} handleTouchStart - Touch start handler to start dragging.\r\n */\r\ninterface UseDraggableReturn {\r\n\tposition: Position;\r\n\tisDragging: boolean;\r\n\tdragRef: any;\r\n\thandleMouseDown: (_e: MouseEvent<HTMLDivElement>) => void;\r\n\thandleTouchStart: (_e: TouchEvent<HTMLDivElement>) => void;\r\n}\r\n\r\n/**\r\n * A custom React hook that enables drag-and-drop functionality for a DOM element,\r\n * with position constraints inside the viewport and an optional position change callback.\r\n *\r\n * @param {Position} initialPosition - The starting `{x, y}` position of the element in pixels.\r\n * @param {(position: Position) => void} [onPositionChange] - Optional callback fired whenever position changes.\r\n *\r\n * @returns {UseDraggableReturn} - Object containing the element's current position, drag state, event handlers, and ref.\r\n *\r\n * @example\r\n * ```tsx\r\n * const { dragRef, handleMouseDown, handleTouchStart, position } =\r\n * useDraggable({ x: 100, y: 200 }, (pos) => console.log(\"Moved to:\", pos));\r\n *\r\n * return (\r\n * <div\r\n * ref={dragRef}\r\n * onMouseDown={handleMouseDown}\r\n * onTouchStart={handleTouchStart}\r\n * style={{\r\n * position: \"absolute\",\r\n * left: position.x,\r\n * top: position.y,\r\n * }}\r\n * >\r\n * Drag me\r\n * </div>\r\n * );\r\n * ```\r\n *\r\n * @developerNotes\r\n * - **Performance**: This hook uses `useCallback` to memoize handlers, preventing unnecessary re-renders in the consuming component.\r\n * - **Repaint Efficiency**: Position updates use state but are constrained to the viewport, so excessive off-screen rendering is avoided.\r\n * - **Refs for Persistence**: Drag start positions are stored in `useRef` to avoid triggering re-renders mid-drag.\r\n * - **Pointer Events**: Prevent default behavior in touch/mouse events to stop unwanted scrolling while dragging.\r\n * - **Viewport Constraints**: `updatePosition` ensures the draggable element never goes outside the visible browser window.\r\n * - **Mobile Support**: Touch events are handled alongside mouse events for full cross-device compatibility.\r\n */\r\nexport function useDraggable(\r\n\tinitialPosition: Position,\r\n\tonPositionChange?: (_position: Position) => void\r\n): UseDraggableReturn {\r\n\t/** Current position of the draggable element. */\r\n\tconst [position, setPosition] = useState<Position>(initialPosition);\r\n\r\n\t/** Whether the element is currently being dragged. */\r\n\tconst [isDragging, setIsDragging] = useState(false);\r\n\r\n\t/** Ref to the draggable DOM element. Attach this to your draggable container. */\r\n\tconst dragRef = useRef<HTMLDivElement>();\r\n\r\n\t/** Starting cursor/touch position at drag start. */\r\n\tconst dragStart = useRef<Position>({ x: 0, y: 0 });\r\n\r\n\t/** Starting element position at drag start. */\r\n\tconst elementStart = useRef<Position>({ x: 0, y: 0 });\r\n\r\n\t/**\r\n\t * Updates the element's position and fires `onPositionChange` if provided.\r\n\t * Constrains position so the element stays within viewport bounds.\r\n\t */\r\n\tconst updatePosition = useCallback(\r\n\t\t(newPosition: Position) => {\r\n\t\t\tconst element = dragRef.current;\r\n\t\t\tif (!element) return;\r\n\r\n\t\t\tconst rect = element.getBoundingClientRect();\r\n\t\t\tconst viewportWidth = window.innerWidth;\r\n\t\t\tconst viewportHeight = window.innerHeight;\r\n\r\n\t\t\tconst constrainedPosition = {\r\n\t\t\t\tx: Math.max(0, Math.min(newPosition.x, viewportWidth - rect.width)),\r\n\t\t\t\ty: Math.max(0, Math.min(newPosition.y, viewportHeight - rect.height)),\r\n\t\t\t};\r\n\r\n\t\t\tsetPosition(constrainedPosition);\r\n\t\t\tonPositionChange?.(constrainedPosition);\r\n\t\t},\r\n\t\t[onPositionChange]\r\n\t);\r\n\r\n\t/**\r\n\t * Begins drag logic and attaches move/end event listeners.\r\n\t */\r\n\tconst handleStart = useCallback(\r\n\t\t(clientX: number, clientY: number) => {\r\n\t\t\tsetIsDragging(true);\r\n\t\t\tdragStart.current = { x: clientX, y: clientY };\r\n\t\t\telementStart.current = position;\r\n\r\n\t\t\t/** Updates position based on pointer movement delta. */\r\n\t\t\tconst handleMove = (moveClientX: number, moveClientY: number) => {\r\n\t\t\t\tconst deltaX = moveClientX - dragStart.current.x;\r\n\t\t\t\tconst deltaY = moveClientY - dragStart.current.y;\r\n\r\n\t\t\t\tupdatePosition({\r\n\t\t\t\t\tx: elementStart.current.x + deltaX,\r\n\t\t\t\t\ty: elementStart.current.y + deltaY,\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\t\t\t/** Handles mouse movement during drag. */\r\n\t\t\tconst handleMouseMove = (e: globalThis.MouseEvent) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\thandleMove(e.clientX, e.clientY);\r\n\t\t\t};\r\n\r\n\t\t\t/** Handles touch movement during drag. */\r\n\t\t\tconst handleTouchMove = (e: globalThis.TouchEvent) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tconst touch = e.touches[0];\r\n\t\t\t\tif (touch) {\r\n\t\t\t\t\thandleMove(touch.clientX, touch.clientY);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t/** Ends dragging and removes event listeners. */\r\n\t\t\tconst handleEnd = () => {\r\n\t\t\t\tsetIsDragging(false);\r\n\t\t\t\tdocument.removeEventListener(\"mousemove\", handleMouseMove);\r\n\t\t\t\tdocument.removeEventListener(\"mouseup\", handleEnd);\r\n\t\t\t\tdocument.removeEventListener(\"touchmove\", handleTouchMove);\r\n\t\t\t\tdocument.removeEventListener(\"touchend\", handleEnd);\r\n\t\t\t};\r\n\r\n\t\t\t// Attach listeners\r\n\t\t\tdocument.addEventListener(\"mousemove\", handleMouseMove);\r\n\t\t\tdocument.addEventListener(\"mouseup\", handleEnd);\r\n\t\t\tdocument.addEventListener(\"touchmove\", handleTouchMove, {\r\n\t\t\t\tpassive: false,\r\n\t\t\t});\r\n\t\t\tdocument.addEventListener(\"touchend\", handleEnd);\r\n\t\t},\r\n\t\t[position, updatePosition]\r\n\t);\r\n\r\n\t/**\r\n\t * Mouse down handler to start dragging.\r\n\t */\r\n\tconst handleMouseDown = useCallback(\r\n\t\t(e: MouseEvent<HTMLDivElement>) => {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleStart(e.clientX, e.clientY);\r\n\t\t},\r\n\t\t[handleStart]\r\n\t);\r\n\r\n\t/**\r\n\t * Touch start handler to start dragging.\r\n\t */\r\n\tconst handleTouchStart = useCallback(\r\n\t\t(e: TouchEvent<HTMLDivElement>) => {\r\n\t\t\te.preventDefault();\r\n\t\t\tconst touch = e.touches[0];\r\n\t\t\tif (touch) {\r\n\t\t\t\thandleStart(touch.clientX, touch.clientY);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[handleStart]\r\n\t);\r\n\r\n\treturn {\r\n\t\tposition,\r\n\t\tisDragging,\r\n\t\tdragRef,\r\n\t\thandleMouseDown,\r\n\t\thandleTouchStart,\r\n\t};\r\n}\r\n","import { useState, useEffect } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { SDKState } from \"../../types\";\r\n\r\n/**\r\n * Custom React hook that provides the current SDK state and automatically\r\n * updates the state when changes occur in the `sdkStateManager`.\r\n *\r\n * @function useSDKState\r\n * @returns {SDKState} The latest SDK state object from the SDK state manager.\r\n *\r\n * @example\r\n * // Example usage in a component\r\n * import { useSDKState } from \"../hooks/useSDKState\";\r\n *\r\n * function CallControls() {\r\n * const sdkState = useSDKState();\r\n *\r\n * if (!sdkState.isInitialized) {\r\n * return <div>SDK not initialized</div>;\r\n * }\r\n *\r\n * return (\r\n * <div>\r\n * Status: {sdkState.status}\r\n * {sdkState.isMuted ? \"🔇\" : \"🎤\"}\r\n * </div>\r\n * );\r\n * }\r\n */\r\nexport function useSDKState(): SDKState {\r\n\t/**\r\n\t * Local React state holding the current SDK state.\r\n\t * Initialized from the sdkStateManager's current state.\r\n\t */\r\n\tconst [state, setState] = useState<SDKState>(sdkStateManager.getState());\r\n\r\n\t/**\r\n\t * Sets up a subscription to the sdkStateManager on component mount.\r\n\t * Whenever the SDK state changes, this updates the local `state`.\r\n\t * Cleans up the subscription on component unmount.\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// Subscribe to state changes from the sdkStateManager\r\n\t\tconst unsubscribe = sdkStateManager.subscribe(() => {\r\n\t\t\t// Update local React state with the latest SDK state\r\n\t\t\tsetState(sdkStateManager.getState());\r\n\t\t});\r\n\r\n\t\t// Return the unsubscribe function to clean up\r\n\t\treturn unsubscribe;\r\n\t}, []);\r\n\r\n\t/**\r\n\t * Return the current SDK state to the calling component.\r\n\t */\r\n\treturn state;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { type AxiosRequestConfig } from \"axios\";\r\nimport { useCallback, useReducer } from \"react\";\r\n\r\nimport axiosInstance from \"./axios\";\r\nimport { useToast } from \"./toastMessage\";\r\nimport {\r\n\tRequestResult,\r\n\tUseGetRequest,\r\n\tRequestOptions,\r\n\tUsePostRequest,\r\n\tUsePutRequest,\r\n\tUseDeleteRequest,\r\n\tUsePatchRequest,\r\n} from \"../../types\";\r\n\r\nconst initialState = {\r\n\tisLoading: false, // Initially not loading\r\n\tisSuccess: false, // Initially no success\r\n\tisError: false, // Initially no error\r\n\terror: null, // No error to show\r\n\tdata: null, // No data to show\r\n};\r\n\r\nconst reducer = (state: typeof initialState, action: { type: string; payload: any }) => {\r\n\tif (action.type === \"isLoading\") {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tisLoading: action.payload,\r\n\t\t};\r\n\t} else if (action.type === \"isSuccess\") {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tisSuccess: true,\r\n\t\t\tdata: action.payload,\r\n\t\t};\r\n\t} else if (action.type === \"isError\") {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tisError: true,\r\n\t\t\terror: action.payload,\r\n\t\t};\r\n\t} else if (action.type === \"reset\") {\r\n\t\treturn {\r\n\t\t\tisLoading: false,\r\n\t\t\tisSuccess: false,\r\n\t\t\tisError: false,\r\n\t\t\terror: null,\r\n\t\t\tdata: null,\r\n\t\t};\r\n\t}\r\n\tthrow Error(\"Unknown action.\");\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `useGetRequest` custom hook.\r\n * @description Performs a typed HTTP GET request using Axios with internal state and toast notification support.\r\n * Accepts optional success and error callbacks and returns a request function with response state.\r\n *\r\n * @params\r\n * - props: An optional object containing `onSuccess` and `onError` handlers for request lifecycle callbacks.\r\n *\r\n * @example\r\n * const [getUser, userState] = useGetRequest<User>({\r\n * onSuccess: (res) => console.log(res),\r\n * onError: (err) => console.error(err),\r\n * });\r\n * getUser(\"/api/user\");\r\n *\r\n * @returns A tuple containing:\r\n * - A function to perform the GET request.\r\n * - A state object representing loading, error, and data.\r\n */\r\nexport const useGetRequest = <T = UseGetRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n\t/**\r\n\t * getRequest: Function to trigger the GET call.\r\n\t * state: Holds request state (loading, success, error, data).\r\n\t */\r\n): [(_url: string, _config?: AxiosRequestConfig) => void, RequestResult<T>] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function getRequest\r\n\t * @description Makes the GET request, updates internal state, handles success/error, and triggers notifications.\r\n\t * @param url - The API endpoint to call.\r\n\t * @param config - Optional Axios request config (headers, params, etc.)\r\n\t */\r\n\tconst getRequest = useCallback(\r\n\t\t(url: string, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\t\t\t/**\r\n\t\t\t * Execute the GET request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.get(url, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, config);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, config);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, config);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the GET function and the current request state.\r\n\t */\r\n\treturn [getRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `usePostRequest` custom hook.\r\n * @description Sends a typed POST request via Axios and manages the request state, error handling, and toast notifications.\r\n *\r\n * @params\r\n * - props: Optional object containing `onSuccess` and `onError` callback handlers.\r\n *\r\n * @example\r\n * const [createUser, state] = usePostRequest<User>({\r\n * onSuccess: (res) => console.log(\"User created\", res),\r\n * onError: (err) => console.error(\"Failed to create\", err),\r\n * });\r\n * createUser(\"/api/users\", payload);\r\n *\r\n * @returns A tuple:\r\n * - postRequest: Function to execute the POST call.\r\n * - state: Object containing isLoading, isError, isSuccess, error, and data.\r\n */\r\nexport const usePostRequest = <T = UsePostRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * postRequest: Function to trigger the POST call.\r\n\t * state: Holds request state (loading, success, error, data).\r\n\t */\r\n\t(_url: string, _payload: T, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null, disabledSuccessToast = false } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function postRequest\r\n\t * @description Sends a POST request, updates state, and calls handlers.\r\n\t * @param url - Endpoint to which data is posted.\r\n\t * @param payload - Request body data to be sent.\r\n\t * @param config - Optional Axios request configuration.\r\n\t */\r\n\tconst postRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\r\n\t\t\t/**\r\n\t\t\t * Execute the POST request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.post(url, payload, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\t// if (res.data?.success) {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\tconsole.log(res.data?.message, \"res45\");\r\n\t\t\t\t\tif (!disabledSuccessToast) {\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// } else {\r\n\t\t\t\t\t// /**\r\n\t\t\t\t\t// * Update state with error information.\r\n\t\t\t\t\t// */\r\n\r\n\t\t\t\t\t// dispatch({\r\n\t\t\t\t\t// type: \"isError\",\r\n\t\t\t\t\t// payload: res.data,\r\n\t\t\t\t\t// });\r\n\r\n\t\t\t\t\t// /**\r\n\t\t\t\t\t// * Show error message via toast system.\r\n\t\t\t\t\t// */\r\n\r\n\t\t\t\t\t// showToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t// /**\r\n\t\t\t\t\t// * Invoke user-defined error handler if available.\r\n\t\t\t\t\t// */\r\n\r\n\t\t\t\t\t// onError?.(res.data, payload);\r\n\t\t\t\t\t// }\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message using toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, payload);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the POST function and the current request state.\r\n\t */\r\n\treturn [postRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `usePutRequest` custom hook.\r\n * @description Sends a typed PUT request using Axios and manages its state, including success and error handling via callbacks and toast messages.\r\n *\r\n * @params\r\n * - props: Optional object with `onSuccess` and `onError` handlers for request lifecycle management.\r\n *\r\n * @example\r\n * const [updateUser, state] = usePutRequest<User>({\r\n * onSuccess: (res) => console.log(\"Updated!\", res),\r\n * onError: (err) => console.error(\"Update failed\", err),\r\n * });\r\n * updateUser(\"/api/users/1\", updatedPayload);\r\n *\r\n * @returns A tuple:\r\n * - putRequest: Function to trigger the PUT call.\r\n * - state: Object containing isLoading, isSuccess, isError, error, and data.\r\n */\r\nexport const usePutRequest = <T = UsePutRequest>(\r\n\t/**\r\n\t * @param props Optional success and error callback functions.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * putRequest: Function to perform the PUT request.\r\n\t * state: Holds the status and result of the request.\r\n\t */\r\n\t(_url: string, _payload: T, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure handlers from props, with defaults.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function putRequest\r\n\t * @description Executes a PUT HTTP request and updates state accordingly.\r\n\t * @param url - The endpoint URL to which the PUT request is made.\r\n\t * @param payload - The request body data.\r\n\t * @param config - Optional Axios request config object.\r\n\t */\r\n\tconst putRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\r\n\t\t\t/**\r\n\t\t\t * Execute the PUT request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.put(url, payload, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, payload);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, payload);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the PUT function and the current request state.\r\n\t */\r\n\treturn [putRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `useDeleteRequest` custom hook.\r\n * @description Sends a DELETE request using Axios and manages request state with toast notifications and optional success/error handlers.\r\n *\r\n * @params\r\n * - props: Optional callbacks `onSuccess` and `onError` to handle API response lifecycle events.\r\n *\r\n * @example\r\n * const [deleteUser, state] = useDeleteRequest({\r\n * onSuccess: (res) => console.log(\"Deleted!\", res),\r\n * onError: (err) => console.error(\"Delete failed\", err),\r\n * });\r\n * deleteUser(\"/api/users/1\");\r\n *\r\n * @returns A tuple:\r\n * - deleteRequest: Function to send the DELETE request.\r\n * - state: Object holding request status (`isLoading`, `isSuccess`, `isError`), response data, and error.\r\n */\r\nexport const useDeleteRequest = <T = UseDeleteRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * deleteRequest: Function that initiates the DELETE API call.\r\n\t * state: Object describing the request’s current status and result.\r\n\t */\r\n\t(_url: string, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function deleteRequest\r\n\t * @description Executes a DELETE API call and handles response or errors.\r\n\t *\r\n\t * @param url - The endpoint to delete the resource from.\r\n\t * @param config - Optional Axios request configuration (e.g., headers).\r\n\t */\r\n\tconst deleteRequest = useCallback(\r\n\t\t(url: string, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\r\n\t\t\t/**\r\n\t\t\t * Execute the DELETE request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.delete(url, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, config);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, config);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, config);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the DELETE function and the current request state.\r\n\t */\r\n\treturn [deleteRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `usePatchRequest` custom hook.\r\n * @description Executes a PATCH request using Axios with built-in state management, error handling, and toast support.\r\n *\r\n * @params\r\n * - props: Optional object containing `onSuccess` and `onError` callback handlers.\r\n *\r\n * @example\r\n * const [patchData, state] = usePatchRequest({\r\n * onSuccess: (res) => console.log(\"Patched successfully\", res),\r\n * onError: (err) => console.error(\"Patch failed\", err),\r\n * });\r\n *\r\n * patchData(\"/api/users/1\", { name: \"Updated Name\" });\r\n *\r\n * @returns A tuple:\r\n * - patchRequest: Function that triggers the PATCH API call.\r\n * - state: Object holding request lifecycle flags, response data, and error.\r\n */\r\nexport const usePatchRequest = <T = UsePatchRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * patchRequest: Function to initiate a PATCH request.\r\n\t * state: The internal state of the request lifecycle.\r\n\t */\r\n\t(_url: string, _payload: T, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function patchRequest\r\n\t * @description Triggers a PATCH HTTP request to the given endpoint with payload and optional config.\r\n\t * @param url - API endpoint for the PATCH request.\r\n\t * @param payload - The data to send in the request body.\r\n\t * @param config - Optional Axios configuration (headers, params, etc.)\r\n\t */\r\n\tconst patchRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\t\t\t/**\r\n\t\t\t * Execute the PATCH request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.patch(url, payload, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, payload);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, payload);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the PATCH function and the current request state.\r\n\t */\r\n\treturn [patchRequest, state];\r\n};\r\n","import { createContext, useContext, useState, ReactNode } from \"react\";\r\nimport { Snackbar, Alert, AlertColor } from \"@mui/material\";\r\n\r\ntype ToastContextType = {\r\n showToast: (message: string, severity?: AlertColor) => void;\r\n};\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nexport const useToast = () => {\r\n const ctx = useContext(ToastContext);\r\n if (!ctx) throw new Error(\"useToast must be used inside ToastProvider\");\r\n return ctx;\r\n};\r\n\r\nexport const ToastProvider = ({ children }: { children: ReactNode }) => {\r\n const [open, setOpen] = useState(false);\r\n const [message, setMessage] = useState(\"\");\r\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\r\n\r\n const showToast = (msg: string, sev: AlertColor = \"info\") => {\r\n setMessage(msg);\r\n setSeverity(sev);\r\n setOpen(true);\r\n };\r\n\r\n return (\r\n <ToastContext.Provider value={{ showToast }}>\r\n {children}\r\n <Snackbar\r\n open={open}\r\n color={severity}\r\n autoHideDuration={3000}\r\n onClose={() => setOpen(false)}\r\n anchorOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n >\r\n <Alert\r\n variant=\"filled\"\r\n severity={severity}\r\n onClose={() => setOpen(false)}\r\n sx={{ width: \"100%\" }}\r\n >\r\n {message}\r\n </Alert>\r\n </Snackbar>\r\n </ToastContext.Provider>\r\n );\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * @fileoverview 🎭 Comprehensive Dialog Components for CTI SDK\r\n *\r\n * This file contains all dialog components used in the CTI SDK for various call management operations.\r\n * It includes conference management, call transfer, disposition capture, process selection, and call history dialogs.\r\n * Each dialog provides a complete interface for specific telephony operations with real-time updates and error handling.\r\n *\r\n * 🎯 Key Dialog Components:\r\n * - 👥 ConferenceDialog: Multi-line conference call management\r\n * - 🔄 CallTransferDialog: Call transfer to processes, queues, or agents\r\n * - 📝 EndCallDispositionDialog: Call outcome capture and callback scheduling\r\n * - ⚙️ ProcessorListDialog: Process selection during initialization\r\n * - 📋 CallHistoryDialog: Call history interface (placeholder)\r\n *\r\n * 🚀 Core Features:\r\n * - 🎨 Material-UI dialog components with consistent styling\r\n * - 📡 Real-time API integration with loading states\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🔄 State management integration\r\n * - 📱 Responsive design for different screen sizes\r\n * - 🛡️ Error handling and validation\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// 📦 Material-UI Icon Imports - UI icons for dialog components\r\nimport {\r\n\tCall, // 📞 Call initiation icon\r\n\tCallEnd, // 📞 End call icon\r\n\tCallSplit, // 🔀 Call merge/split icon\r\n\tClose, // ❌ Close dialog icon\r\n\tMic, // 🎤 Microphone icon\r\n\tMicOff, // 🔇 Muted microphone icon\r\n\tPause, // ⏸️ Hold call icon\r\n\tPhoneDisabled, // 📵 Disabled phone icon\r\n\tPlayArrow, // ▶️ Resume call icon\r\n\tSupportAgent, // 🎧 Agent/support icon\r\n} from \"@mui/icons-material\";\r\n\r\n// 🎨 Material-UI Component Imports - Core UI components\r\nimport {\r\n\tBox, // 📦 Container component\r\n\tButton, // 🔘 Interactive button component\r\n\tDialog, // 🎭 Modal dialog component\r\n\tIconButton, // 🔘 Icon-only button component\r\n\tPaper, // 📄 Elevated surface component\r\n\tTextField, // 📝 Text input component\r\n\tTypography, // 📝 Text component\r\n\tAutocomplete, // 🔍 Autocomplete input component\r\n\tTooltip, // 💡 Hover tooltip component\r\n\tuseTheme, // 🎨 Theme hook\r\n\tTableContainer, // 📊 Table container component\r\n\tTable, // 📊 Table component\r\n\tTableHead, // 📊 Table header component\r\n\tTableRow, // 📊 Table row component\r\n\tTableCell, // 📊 Table cell component\r\n\tTableBody, // 📊 Table body component\r\n\tCircularProgress, // ⏳ Loading spinner component\r\n} from \"@mui/material\";\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport React, { useEffect, useState } from \"react\";\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { useSDKState } from \"../hooks/useSDKState\"; // 📊 SDK state hook\r\nimport { sdkStateManager } from \"../hooks/sdk-state\"; // 🗃️ Global state manager\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { usePostRequest } from \"../services/request\"; // 📡 HTTP request hook\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n// 🏷️ Type Definitions - TypeScript interfaces and types\r\nimport type { ConferenceLineTypes } from \"../../types\";\r\n\r\n// 🔧 Service Imports - External service integrations\r\nimport { useToast } from \"../services/toastMessage\"; // 🍞 Toast notification service\r\n\r\n// 🎨 Styling - Component styling utilities\r\nimport useStyles from \"./styles\"; // 🎨 Custom styles hook\r\n\r\n/**\r\n * 🔄 Type Definition: Call Transfer Request Payload\r\n *\r\n * @type TransferCallRequest\r\n * @description 📡 Defines the structure for call transfer API request payloads\r\n * Contains all necessary data for transferring calls to different destinations\r\n *\r\n * @properties\r\n * - `mobile_number?: string` - 📱 Customer phone number (optional)\r\n * - `userid?: string` - 👤 Agent identifier (optional)\r\n * - `type?: string` - 🎯 Transfer type: \"PROCESS\", \"QUEUE\", or \"AGENT\" (optional)\r\n * - `transfer_to?: string` - 🎯 Destination identifier (process name, queue name, or agent ID) (optional)\r\n * - `callreferenceid?: string` - 🔗 Unique call reference identifier (optional)\r\n * - `processid?: string` - ⚙️ Process identifier (optional)\r\n * - `process_name?: string` - 📝 Process name (optional)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Transfer to process\r\n * const processTransfer: TransferCallRequest = {\r\n * mobile_number: \"1234567890\",\r\n * userid: \"agent123\",\r\n * type: \"PROCESS\",\r\n * transfer_to: \"Sales Process\",\r\n * callreferenceid: \"call_12345\",\r\n * processid: \"proc_001\",\r\n * process_name: \"Sales Process\"\r\n * };\r\n *\r\n * // Transfer to agent\r\n * const agentTransfer: TransferCallRequest = {\r\n * mobile_number: \"1234567890\",\r\n * userid: \"agent123\",\r\n * type: \"AGENT\",\r\n * transfer_to: \"agent456\",\r\n * callreferenceid: \"call_12345\"\r\n * };\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\ntype TransferCallRequest = {\r\n\tmobile_number?: string; // 📱 Customer phone number\r\n\tuserid?: string; // 👤 Agent identifier\r\n\ttype?: string; // 🎯 Transfer type (PROCESS/QUEUE/AGENT)\r\n\ttransfer_to?: string; // 🎯 Destination identifier\r\n\tcallreferenceid?: string; // 🔗 Call reference ID\r\n\tprocessid?: string; // ⚙️ Process identifier\r\n\tprocess_name?: string; // 📝 Process name\r\n};\r\n\r\n/**\r\n * 📊 Conference Table Row Component\r\n *\r\n * @component ConferenceTableRow\r\n * @description 🎯 Individual table row component for conference call management. Renders a single conference line\r\n * with comprehensive status display, controls, and action buttons for complete call management operations.\r\n * Each row represents one conference line with real-time status updates and interactive controls.\r\n *\r\n * @param {ConferenceLineTypes} each - 📊 Conference line data object containing:\r\n * - `line: number` - 📞 Line number identifier\r\n * - `status: string` - 📊 Current line status (IDLE, ONCALL, CONFERENCE, etc.)\r\n * - `phone: string` - 📱 Phone number for this line\r\n * - `isCallStart: boolean` - ✅ Whether call is active on this line\r\n * - `isHold: boolean` - ⏸️ Whether line is on hold\r\n * - `isMute: boolean` - 🔇 Whether line is muted\r\n * - `isMergeCall: boolean` - 🔗 Whether line is merged in conference\r\n *\r\n * @returns {JSX.Element} 📊 Complete table row with conference line controls\r\n *\r\n * @example\r\n * ```tsx\r\n * // Conference line for external call\r\n * <ConferenceTableRow each={{\r\n * line: 2,\r\n * status: \"ONCALL\",\r\n * phone: \"1234567890\",\r\n * isCallStart: true,\r\n * isHold: false,\r\n * isMute: false,\r\n * isMergeCall: false\r\n * }} />\r\n *\r\n * // Conference line for internal call (line 1)\r\n * <ConferenceTableRow each={{\r\n * line: 1,\r\n * status: \"CONFERENCE\",\r\n * phone: \"0987654321\",\r\n * isCallStart: true,\r\n * isHold: false,\r\n * isMute: true,\r\n * isMergeCall: true\r\n * }} />\r\n * ```\r\n *\r\n * @features\r\n * - 📞 Line number display with clear identification\r\n * - 📊 Real-time status indicator with color coding\r\n * - 🏷️ Call type classification (Internal/External)\r\n * - 📱 Editable phone number input field\r\n * - 🎛️ Complete action button set (Call, Merge, Hold, Mute, End)\r\n * - ⏳ Loading states for all operations\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🎨 Dynamic styling based on line state\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nconst ConferenceTableRow = ({ each }: any) => {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all conference functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t/**\r\n\t * 🍞 Toast Notification Service\r\n\t * @description Provides user feedback notifications for success, error, and info messages\r\n\t * @type {Function} - Toast notification function with message and type parameters\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * 🎨 Dynamic Style Objects\r\n\t * @description Style objects that adapt based on SDK configuration for different button states\r\n\t * @type {Object} - Contains disabled, enabled, and outlined style configurations\r\n\t */\r\n\tconst { disabled, enabled, outlined } = useStyles({\r\n\t\tdisabled: state.sdkConfig?.disabled || {}, // 🔴 Disabled button styles\r\n\t\tenabled: state.sdkConfig?.enabled || {}, // 🟢 Enabled button styles\r\n\t\toutlined: state.sdkConfig?.outlined || {}, // ⚪ Outlined button styles\r\n\t});\r\n\r\n\t/**\r\n\t * 🎨 Material-UI Theme Object\r\n\t * @description Provides access to Material-UI theme for consistent styling across components\r\n\t * @type {Theme} - Material-UI theme object containing colors, spacing, typography, etc.\r\n\t */\r\n\tconst theme = useTheme();\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ LOADING STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Start Loading State\r\n\t * @description Loading state for conference call start operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during call initiation API requests\r\n\t */\r\n\tconst [conferenceCallStart, setConferenceCallStart] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Merge Loading State\r\n\t * @description Loading state for conference call merge operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during call merge API requests\r\n\t */\r\n\tconst [conferenceCallMerge, setConferenceCallMerge] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Hold/Unhold Loading State\r\n\t * @description Loading state for hold/unhold operations\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during hold/unhold API requests\r\n\t */\r\n\tconst [conferenceCallHoldOrUnHold, setConferenceCallHoldOrUnHold] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Mute/Unmute Loading State\r\n\t * @description Loading state for mute/unmute operations\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during mute/unmute API requests\r\n\t */\r\n\tconst [conferenceCallMuteOrUnMute, setConferenceCallMuteOrUnMute] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call End Loading State\r\n\t * @description Loading state for conference call end operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during call termination API requests\r\n\t */\r\n\tconst [conferenceCallEnd, setConferenceCallEnd] = useState(false);\r\n\r\n\t// =============================================================================\r\n\t// 🔧 UTILITY FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🔄 Conference Line Data Update Utility\r\n\t *\r\n\t * @function onConferenceLineUpdate\r\n\t * @description 📊 Updates conference line data in the SDK state manager by merging new data\r\n\t * with existing line data. This ensures real-time updates to conference line\r\n\t * properties like phone numbers, status, and control states.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Current conference line data object\r\n\t * @param {any} data - 🔄 New data to merge with existing line data\r\n\t *\r\n\t * @returns {void} No return value - updates SDK state directly\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Update phone number for a conference line\r\n\t * onConferenceLineUpdate(lineData, { phone: \"9876543210\" });\r\n\t *\r\n\t * // Update multiple properties\r\n\t * onConferenceLineUpdate(lineData, {\r\n\t * phone: \"9876543210\",\r\n\t * status: \"ONCALL\",\r\n\t * isMute: true\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔄 Immutable state updates using spread operator\r\n\t * - 📊 Real-time conference line synchronization\r\n\t * - 🎯 Targeted property updates without affecting other properties\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onConferenceLineUpdate = (line: ConferenceLineTypes, data: any) => {\r\n\t\tsdkStateManager.setConferenceLine({ ...line, ...data }); // 🔄 Merge and update line data\r\n\t};\r\n\r\n\t/**\r\n\t * 📞 Conference Call Start Handler\r\n\t *\r\n\t * @function onConferenceCallStart\r\n\t * @description 🎯 Initiates a conference call by making an API request to start an external conference.\r\n\t * This function handles the complete call initiation process including payload construction,\r\n\t * API communication, state updates, and user feedback through toast notifications.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Start conference call on line 2\r\n\t * onConferenceCallStart(lineData, {\r\n\t * isCallStart: true,\r\n\t * status: \"ONCALL\",\r\n\t * phone: \"1234567890\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"CALL{line_number}\" (e.g., \"CALL2\")\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 Conference line state synchronization\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onConferenceCallStart = (line: ConferenceLineTypes, data: any) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallStart(true);\r\n\r\n\t\t// 📦 Prepare API payload for conference call initiation\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: `CALL${line_used.line}`, // 🔧 Operation with line number\r\n\t\t\tline_used: String(line_used.line), // 📞 Line identifier as string\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to initiate conference call\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallStart(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * 🔀 Conference Call Merge Handler\r\n\t *\r\n\t * @function onMergeConferenceCall\r\n\t * @description 🔗 Merges multiple conference calls by making an API request to combine active calls\r\n\t * into a single conference session. This allows multiple participants to be connected\r\n\t * in one conference call with shared audio and controls.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Merge conference calls on line 1\r\n\t * onMergeConferenceCall(lineData, {\r\n\t * isMergeCall: true,\r\n\t * status: \"ONCALL\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"CONFERENCE\"\r\n\t * - 📞 Line Used: Line identifier as string\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🔗 Conference call merging functionality\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onMergeConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallMerge(true);\r\n\r\n\t\t// 📦 Prepare API payload for conference call merge\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: `CONFERENCE`, // 🔧 Merge operation\r\n\t\t\tline_used: String(line_used.line), // 📞 Line identifier as string\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to merge conference calls\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallMerge(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * ⏸️ Conference Call Hold/Unhold Handler\r\n\t *\r\n\t * @function onHoldOrUnHoldConferenceCall\r\n\t * @description 🔄 Toggles hold status for conference call lines by making API requests to either\r\n\t * hold or unhold specific conference lines. This allows agents to temporarily\r\n\t * suspend audio for individual participants while maintaining the conference.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t * @param {string} type - 🎯 Operation type: \"HOLDUSER\" to hold or \"UNHOLDUSER\" to unhold\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Hold a conference line\r\n\t * onHoldOrUnHoldConferenceCall(lineData, { isHold: true }, \"HOLDUSER\");\r\n\t *\r\n\t * // Unhold a conference line\r\n\t * onHoldOrUnHoldConferenceCall(lineData, { isHold: false }, \"UNHOLDUSER\");\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"HOLDUSER\" or \"UNHOLDUSER\"\r\n\t * - 📞 Hold Channel: \"hold{line_number}\" or \"unhold{line_number}\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_HOLD_OR_UN_HOLD\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - ⏸️ Individual line hold/unhold control\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onHoldOrUnHoldConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallHoldOrUnHold(true);\r\n\r\n\t\t// 📦 Prepare API payload for hold/unhold operation\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: type, // 🔧 Hold or unhold operation\r\n\t\t\thold_channel_no: type === \"HOLDUSER\" ? `hold${line_used.line}` : `unhold${line_used.line}`, // 📞 Channel identifier\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to hold/unhold conference line\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_HOLD_OR_UN_HOLD, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallHoldOrUnHold(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * 🔇 Conference Call Mute/Unmute Handler\r\n\t *\r\n\t * @function onMuteOrUnMuteConferenceCall\r\n\t * @description 🎤 Toggles mute status for conference call lines by making API requests to either\r\n\t * mute or unmute specific conference lines. This allows agents to control audio\r\n\t * output for individual participants while maintaining the conference connection.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t * @param {string} type - 🎯 Operation type: \"MUTEUSER\" to mute or \"PLAYUSER\" to unmute\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Mute a conference line\r\n\t * onMuteOrUnMuteConferenceCall(lineData, { isMute: true }, \"MUTEUSER\");\r\n\t *\r\n\t * // Unmute a conference line\r\n\t * onMuteOrUnMuteConferenceCall(lineData, { isMute: false }, \"PLAYUSER\");\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"MUTEUSER\" or \"PLAYUSER\"\r\n\t * - 📞 Channel: \"mute{line_number}\" or \"play{line_number}\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_MUTE_OT_UN_MUTE\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🎤 Individual line mute/unmute control\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onMuteOrUnMuteConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallMuteOrUnMute(true);\r\n\r\n\t\t// 📦 Prepare API payload for mute/unmute operation\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: type, // 🔧 Mute or unmute operation\r\n\t\t\tchannel_no: type === \"MUTEUSER\" ? `mute${line_used.line}` : `play${line_used.line}`, // 📞 Channel identifier\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to mute/unmute conference line\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_MUTE_OT_UN_MUTE, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallMuteOrUnMute(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * 📞 Conference Call End Handler\r\n\t *\r\n\t * @function onEndConferenceCall\r\n\t * @description 🔚 Ends a specific conference call line by making an API request to terminate\r\n\t * the connection for that particular line. This allows agents to disconnect\r\n\t * individual participants while maintaining other conference lines.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // End conference call on line 2\r\n\t * onEndConferenceCall(lineData, {\r\n\t * isCallStart: false,\r\n\t * status: \"LINE USED\",\r\n\t * isMergeCall: false,\r\n\t * isMute: false,\r\n\t * isHold: false\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"HANGUP_CHANNEL\"\r\n\t * - 📞 Line Used: Line identifier minus 1 (e.g., line 2 becomes \"1\")\r\n\t * - 👤 User Type: \"THIRDPARTY{line_number_minus_1}\"\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_END\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🔚 Individual line termination control\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onEndConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallEnd(true);\r\n\r\n\t\t// 📦 Prepare API payload for conference call termination\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: \"HANGUP_CHANNEL\", // 🔧 Hangup operation\r\n\t\t\tline_used: String(line_used.line - 1), // 📞 Line identifier (adjusted for API)\r\n\t\t\tuser_type: `THIRDPARTY${line_used.line - 1}`, // 👤 User type identifier\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to end conference call\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_END, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallEnd(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\treturn (\r\n\t\t<TableRow\r\n\t\t\tkey={each.line}\r\n\t\t\tsx={{\r\n\t\t\t\tborder: \"2px solid #fff\",\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Typography>Line {each?.line ?? \"\"}. </Typography>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Typography\r\n\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tpx: 1,\r\n\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{each?.status ?? \"\"}\r\n\t\t\t\t</Typography>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Button\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Typography variant=\"body2\">{each?.line === 1 ? \"Internal\" : \"External\"}</Typography>\r\n\t\t\t\t</Button>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<TextField\r\n\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\tplaceholder=\"Phone Number\"\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tvalue={each?.phone || \"\"}\r\n\t\t\t\t\tdisabled={each?.line === 1 || each?.status === \"LINE USED\"}\r\n\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\tonConferenceLineUpdate(each, { phone: e.target.value });\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\tjustifyContent: \"space-around\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{/* Conference Call Button */}\r\n\t\t\t\t\t{each.line !== 1 && (\r\n\t\t\t\t\t\t<Tooltip title=\"Call\">\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={each?.status !== \"IDLE\" ? \"outlined\" : \"contained\"}\r\n\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\teach?.status !== \"IDLE\" ?\r\n\t\t\t\t\t\t\t\t\t\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t:\t{\r\n\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"success.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `0px 2px 1px ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"success.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonConferenceCallStart(each, {});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={each?.status !== \"IDLE\"}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{conferenceCallStart ?\r\n\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t:\t<Call sx={{ color: each?.status !== \"IDLE\" ? \"default\" : \"#f3f2f2\" }} />}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{/* Merge Call Button */}\r\n\t\t\t\t\t{each.line === 1 && (\r\n\t\t\t\t\t\t<Tooltip title=\"Merge Call\">\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={each?.isMergeCall && each?.status === \"ONCALL\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\teach?.isMergeCall && each?.status === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t{ ...disabled, padding: \"0px 16px\" }\r\n\t\t\t\t\t\t\t\t\t: each?.status === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t{ ...outlined, padding: \"0px 16px\" }\r\n\t\t\t\t\t\t\t\t\t:\t{ ...disabled, padding: \"0px 16px\" }\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonMergeConferenceCall(each, {\r\n\t\t\t\t\t\t\t\t\t\tisMergeCall: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={each?.status !== \"ONCALL\" || conferenceCallMerge}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{each?.isMergeCall ? \"Merged\" : \"Merge\"}\r\n\t\t\t\t\t\t\t\t{conferenceCallMerge ?\r\n\t\t\t\t\t\t\t\t\t<CircularProgress size=\"20px\" />\r\n\t\t\t\t\t\t\t\t:\t<CallSplit />}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{/* Hold Or Un Hold Call Button */}\r\n\t\t\t\t\t<Tooltip title={each.isHold ? \"Hold\" : \"Un Hold\"}>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant={each?.isHold ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t(each?.isHold && each?.status === \"ONCALL\") || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t: each?.status === \"ONCALL\" || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tif (each.isHold) {\r\n\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: false }, \"UNHOLDUSER\");\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: true }, \"HOLDUSER\");\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t(each?.status !== \"ONCALL\" && each?.status !== \"CONFERENCE\") ||\r\n\t\t\t\t\t\t\t\tconferenceCallHoldOrUnHold\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallHoldOrUnHold ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t: each.isHold ?\r\n\t\t\t\t\t\t\t\t<PlayArrow />\r\n\t\t\t\t\t\t\t:\t<Pause />}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t{/* Mute Or Un Mute Call Button */}\r\n\t\t\t\t\t<Tooltip title={each.isMute ? \"Mute\" : \"Un Mute\"}>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant={each?.isMute ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t(each?.isMute && each?.status === \"ONCALL\") || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t: each?.status === \"ONCALL\" || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tif (each.isMute) {\r\n\t\t\t\t\t\t\t\t\tonMuteOrUnMuteConferenceCall(each, { isMute: false }, \"PLAYUSER\");\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tonMuteOrUnMuteConferenceCall(each, { isMute: true }, \"MUTEUSER\");\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t(each?.status !== \"ONCALL\" && each?.status !== \"CONFERENCE\") ||\r\n\t\t\t\t\t\t\t\tconferenceCallMuteOrUnMute\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallMuteOrUnMute ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t: each.isMute ?\r\n\t\t\t\t\t\t\t\t<MicOff />\r\n\t\t\t\t\t\t\t:\t<Mic />}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t{/* End Call Button */}\r\n\t\t\t\t\t{each?.line !== 1 ?\r\n\t\t\t\t\t\t<Tooltip title=\"End Call\">\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"CONFERENCE\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"DIALING\"\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"CONFERENCE\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"DIALING\"\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `0px 2px 1px ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t:\t{\r\n\t\t\t\t\t\t\t\t\t\t\t...disabled,\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonEndConferenceCall(each, {\r\n\t\t\t\t\t\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\t\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t\t\t\t\t\t\tisMute: false,\r\n\t\t\t\t\t\t\t\t\t\tisHold: false,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t(each?.status !== \"ONCALL\" &&\r\n\t\t\t\t\t\t\t\t\t\teach?.status !== \"CONFERENCE\" &&\r\n\t\t\t\t\t\t\t\t\t\teach?.status !== \"DIALING\") ||\r\n\t\t\t\t\t\t\t\t\tconferenceCallEnd\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{conferenceCallEnd ?\r\n\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t:\t<CallEnd />}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t:\t<Button\r\n\t\t\t\t\t\t\tvariant={each?.isCallStart ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tdisplay: \"none\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tonEndConferenceCall(each, {\r\n\t\t\t\t\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t\t\t\t\t\tisMute: false,\r\n\t\t\t\t\t\t\t\t\tisHold: false,\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tdisabled={!each?.isCallStart || conferenceCallEnd}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallEnd ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t:\t<CallEnd />}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</Box>\r\n\t\t\t</TableCell>\r\n\t\t</TableRow>\r\n\t);\r\n};\r\n\r\n/**\r\n * =============================================================================\r\n * 👥 CONFERENCE DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * 🎭 Main Conference Call Management Dialog\r\n *\r\n * @component ConferenceDialog\r\n * @description 🎯 Main conference call management dialog that provides a comprehensive interface\r\n * for managing multiple conference lines, starting calls, merging calls, and ending\r\n * conferences. This dialog serves as the central hub for all conference-related\r\n * operations with real-time status updates and complete call control functionality.\r\n *\r\n * @returns {JSX.Element} 🎭 Complete conference management interface\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage - renders conference management dialog\r\n * <ConferenceDialog />\r\n * ```\r\n *\r\n * @features\r\n * - 📊 Conference line table with real-time status display\r\n * - 🎛️ Individual line controls (Call, Merge, Hold, Mute, End)\r\n * - 🔚 End all conference button for bulk termination\r\n * - 📱 Phone number input for each conference line\r\n * - ⏳ Loading states for all operations\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🎨 Material-UI styling with consistent design\r\n * - 📊 Real-time status updates via WebSocket\r\n * - 🔄 State management integration\r\n *\r\n * @components\r\n * - 📋 Conference line table with ConferenceTableRow components\r\n * - 🔘 Action buttons for each conference line\r\n * - 📱 Phone number input fields\r\n * - 🔚 End all conference button\r\n * - ❌ Close dialog button\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport function ConferenceDialog() {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all conference functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t/**\r\n\t * 🍞 Toast Notification Service\r\n\t * @description Provides user feedback notifications for success, error, and info messages\r\n\t * @type {Function} - Toast notification function with message and type parameters\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ LOADING STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ End All Conference Calls Loading State\r\n\t * @description Loading state for ending all conference calls operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during bulk conference termination API requests\r\n\t */\r\n\tconst [conferenceCallEndAll, setConferenceCallEndAll] = useState(false);\r\n\r\n\t// =============================================================================\r\n\t// 🔧 UTILITY FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ❌ Conference Dialog Close Handler\r\n\t *\r\n\t * @function handleClose\r\n\t * @description 🚪 Closes the conference dialog by updating the SDK state manager.\r\n\t * This function provides a simple way to close the dialog and return\r\n\t * to the main call control interface.\r\n\t *\r\n\t * @returns {void} No return value - updates SDK state directly\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when close button is clicked\r\n\t * handleClose();\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔄 Updates SDK state to close dialog\r\n\t * - 🎯 Simple one-line implementation\r\n\t * - 🚪 Provides clean dialog closure\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleClose = () => {\r\n\t\tsdkStateManager.setOpenConferenceDialog(false); // 🚪 Close conference dialog\r\n\t};\r\n\r\n\t/**\r\n\t * 🔚 End All Conference Calls Handler\r\n\t *\r\n\t * @function onEndAllConferenceCalls\r\n\t * @description 🎯 Ends all active conference calls by making an API request to terminate\r\n\t * the entire conference session. This function provides bulk termination\r\n\t * functionality for all conference lines and resets the conference state.\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when \"End Conference\" button is clicked\r\n\t * onEndAllConferenceCalls();\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"ENDCONFERENCE\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_END_ALL\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Conference state reset after successful termination\r\n\t * - 🚪 Automatic dialog closure after completion\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🔚 Bulk conference termination\r\n\t *\r\n\t * @effects\r\n\t * - 🔄 Resets all conference lines to initial state\r\n\t * - 🚪 Closes the conference dialog\r\n\t * - 🍞 Shows success/error notifications\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onEndAllConferenceCalls = () => {\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallEndAll(true);\r\n\r\n\t\t// 📦 Prepare API payload for ending all conference calls\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: \"ENDCONFERENCE\", // 🔧 End conference operation\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to end all conference calls\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_END_ALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Reset all conference lines to initial state\r\n\t\t\t\tsdkStateManager.resetConferenceLines();\r\n\t\t\t\t// 🚪 Close the conference dialog\r\n\t\t\t\thandleClose();\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallEndAll(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={state.openConferenceDialog}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"10px 16px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\">{state?.agentId ?? \"\"} conference</Typography>\r\n\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 2px #e7e5e5ff\",\r\n\t\t\t\t\t\t\tmargin: \"0px 15px\",\r\n\t\t\t\t\t\t\tborderRadius: \"20px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<TableContainer\r\n\t\t\t\t\t\t\tcomponent={Paper}\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\toutline: \"0px solid gray !important\",\r\n\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 6px #e7e5e5ff\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<Table\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tborder: \"4px solid #ffffff !important\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<TableHead>\r\n\t\t\t\t\t\t\t\t\t<TableRow\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tborder: \"2px solid #f3f3f3ff !important\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tLine\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tStatus\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tCall Type\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tMobile Number\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tCall Actions\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t</TableHead>\r\n\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t{state?.conferenceLine.map((each: any) => (\r\n\t\t\t\t\t\t\t\t\t\t<ConferenceTableRow each={each} />\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t</TableBody>\r\n\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t</TableContainer>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t{/* End All Calls */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\ttextAlign=\"center\"\r\n\t\t\t\t\t\tm={2}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\tonClick={onEndAllConferenceCalls}\r\n\t\t\t\t\t\t\tdisabled={conferenceCallEndAll}\r\n\t\t\t\t\t\t\tsx={{ px: 2, borderRadius: \"20px\", textTransform: \"capitalize\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallEndAll ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tmarginRight: \"8px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t:\t<IconButton\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.main\",\r\n\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"error.dark\" },\r\n\t\t\t\t\t\t\t\t\t\tmarginRight: \"8px\",\r\n\t\t\t\t\t\t\t\t\t\twidth: \"28px\",\r\n\t\t\t\t\t\t\t\t\t\theight: \"28px\",\r\n\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\",\r\n\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\tlineHeight: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\tcolor: \"white\",\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"50%\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<PhoneDisabled\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"white\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tEnd Conference\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * 🔄 CALL TRANSFER DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * 🎭 Call Transfer Management Dialog\r\n *\r\n * @component CallTransferDialog\r\n * @description 🔄 Dialog for transferring calls to processes, queues, or agents. Provides a comprehensive\r\n * interface for selecting transfer destinations and executing transfers with real-time\r\n * data loading and user feedback. This dialog supports multiple transfer types with\r\n * tabbed navigation for easy destination selection.\r\n *\r\n * @param {boolean} open - 👁️ Controls dialog visibility state\r\n *\r\n * @returns {JSX.Element} 🎭 Complete call transfer interface\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage - renders call transfer dialog\r\n * <CallTransferDialog open={true} />\r\n *\r\n * // With state management\r\n * const [transferOpen, setTransferOpen] = useState(false);\r\n * <CallTransferDialog open={transferOpen} />\r\n * ```\r\n *\r\n * @features\r\n * - 📋 Tabbed interface for different transfer types (Process, Queue, Agent)\r\n * - 🔄 Real-time data loading for available destinations\r\n * - ⏳ Loading states for all operations\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🎨 Material-UI styling with consistent design\r\n * - 📡 API integration for destination data\r\n * - 🎯 One-click transfer execution\r\n * - 🛡️ Error handling and validation\r\n *\r\n * @components\r\n * - 📋 Transfer destination tabs (Process, Queue, Agent)\r\n * - 📊 Destination selection interface with cards\r\n * - 🔘 Transfer execution buttons\r\n * - ⏳ Loading spinners for data fetching\r\n * - ❌ Close dialog button\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport function CallTransferDialog({ open }: any) {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all transfer functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t// =============================================================================\r\n\t// 📡 API HOOKS & REQUEST MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Call Transfer API Hook\r\n\t * @description Custom hook for making call transfer API requests with automatic success handling\r\n\t * @type {usePostRequest<TransferCallRequest>} - HTTP request hook with TransferCallRequest type\r\n\t * @purpose Handles call transfer operations with loading states and success callbacks\r\n\t */\r\n\tconst [transferCall] = usePostRequest<TransferCallRequest>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setOpenCallTransferDialog(false); // 🚪 Close dialog on successful transfer\r\n\t\t},\r\n\t});\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ UI STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📋 Currently Selected Tab State\r\n\t * @description Tracks which tab is currently active in the transfer dialog\r\n\t * @type {useState<string>} - String state for tab identifier\r\n\t * @purpose Controls which transfer destination type is displayed (process, queue, agent)\r\n\t */\r\n\tconst [currentselecteTab, setCurrentselecteTab] = useState(\"process\");\r\n\r\n\t// =============================================================================\r\n\t// 📡 DATA FETCHING HOOKS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 👥 Idle Agents List API Hook\r\n\t * @description Custom hook for fetching available idle agents for transfer\r\n\t * @type {usePostRequest<any>} - HTTP request hook for agents data\r\n\t * @purpose Retrieves list of available agents who can receive transferred calls\r\n\t */\r\n\tconst [getIdelAgentsList, { data: idleAgentsList, isLoading: isIdleAgentsListLoading }] =\r\n\t\tusePostRequest<any>({\r\n\t\t\tdisabledSuccessToast: true, // 🔇 Disable automatic success toast\r\n\t\t});\r\n\r\n\t/**\r\n\t * 📊 Process and Queues List API Hook\r\n\t * @description Custom hook for fetching available processes and queues for transfer\r\n\t * @type {usePostRequest<object>} - HTTP request hook for processes/queues data\r\n\t * @purpose Retrieves list of available processes and queues for call transfer\r\n\t */\r\n\tconst [\r\n\t\tgetProcessAndQueuesList,\r\n\t\t{ data: processAndQueuesList, isLoading: isProcessAndQueuesListLoading },\r\n\t] = usePostRequest<{\r\n\t\tstatus: string; // 📊 Status filter\r\n\t\tactive: boolean; // ✅ Active filter\r\n\t\tprocess?: any[]; // ⚙️ Process list\r\n\t\tqueue?: any[]; // 📋 Queue list\r\n\t}>({\r\n\t\tdisabledSuccessToast: true, // 🔇 Disable automatic success toast\r\n\t});\r\n\r\n\t// =============================================================================\r\n\t// 🔧 UTILITY FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ❌ Call Transfer Dialog Close Handler\r\n\t *\r\n\t * @function handleClose\r\n\t * @description 🚪 Closes the call transfer dialog by updating the SDK state manager.\r\n\t * This function provides a simple way to close the dialog and return\r\n\t * to the main call control interface.\r\n\t *\r\n\t * @returns {void} No return value - updates SDK state directly\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when close button is clicked\r\n\t * handleClose();\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔄 Updates SDK state to close dialog\r\n\t * - 🎯 Simple one-line implementation\r\n\t * - 🚪 Provides clean dialog closure\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleClose = () => {\r\n\t\tsdkStateManager.setOpenCallTransferDialog(false); // 🚪 Close transfer dialog\r\n\t};\r\n\r\n\t/**\r\n\t * 🔄 Call Transfer Execution Handler\r\n\t *\r\n\t * @function handleTransferCall\r\n\t * @description 🎯 Executes call transfer to selected destination by constructing appropriate\r\n\t * API payloads based on transfer type and making the transfer request.\r\n\t * Supports three transfer types: Process, Queue, and Agent transfers.\r\n\t *\r\n\t * @param {any} data - 📊 Transfer destination data object containing destination information\r\n\t * @param {string} type - 🎯 Transfer type: \"PROCESS\", \"QUEUE\", or \"AGENT\"\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Transfer to a process\r\n\t * handleTransferCall(processData, \"PROCESS\");\r\n\t *\r\n\t * // Transfer to a queue\r\n\t * handleTransferCall(queueData, \"QUEUE\");\r\n\t *\r\n\t * // Transfer to an agent\r\n\t * handleTransferCall(agentData, \"AGENT\");\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: Varies by transfer type\r\n\t * - 📱 Mobile Number: Customer phone number from call data\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 🔗 Call Reference ID: Unique call identifier\r\n\t * - ⚙️ Process ID: Current process identifier\r\n\t * - 📝 Process Name: Current process name\r\n\t * - 📡 Endpoint: TRANSFER_CALL\r\n\t *\r\n\t * @features\r\n\t * - 🎯 Dynamic payload construction based on transfer type\r\n\t * - 📊 Comprehensive call data integration\r\n\t * - 🔄 Automatic dialog closure on success\r\n\t * - 🛡️ Error handling through usePostRequest hook\r\n\t * - 📞 Support for all transfer destination types\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleTransferCall = (data: any, type: string) => {\r\n\t\tconsole.log(data, \"data34\"); // 📝 Debug log for transfer data\r\n\r\n\t\t// 🔄 Process Transfer Logic\r\n\t\tif (type === \"PROCESS\") {\r\n\t\t\t// 📦 Prepare API payload for process transfer\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\ttype: \"PROCESS\", // 🎯 Transfer type\r\n\t\t\t\ttransfer_to: data?.process_name ?? \"\", // 🎯 Destination process name\r\n\t\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"), // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t};\r\n\t\t\t// 📡 Execute process transfer\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t}\r\n\t\t// 🔄 Queue Transfer Logic\r\n\t\telse if (type === \"QUEUE\") {\r\n\t\t\t// 📦 Prepare API payload for queue transfer\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\ttype: \"QUEUE\", // 🎯 Transfer type\r\n\t\t\t\ttransfer_to: data?.queue_name ?? \"\", // 🎯 Destination queue name\r\n\t\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"), // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t};\r\n\t\t\t// 📡 Execute queue transfer\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t}\r\n\t\t// 🔄 Agent Transfer Logic\r\n\t\telse if (type === \"AGENT\") {\r\n\t\t\t// 📦 Prepare API payload for agent transfer\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\ttype: \"AGENT\", // 🎯 Transfer type\r\n\t\t\t\ttransfer_to: data?.user_id ?? \"\", // 🎯 Destination agent ID\r\n\t\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"), // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t};\r\n\t\t\t// 📡 Execute agent transfer\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t}\r\n\t};\r\n\r\n\t// =============================================================================\r\n\t// 🔄 EFFECT HOOKS - LIFECYCLE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📡 Data Fetching Effect Hook\r\n\t *\r\n\t * @hook useEffect - Data Fetching\r\n\t * @description 🔄 Fetches available transfer destinations on component mount to populate\r\n\t * the transfer dialog with current agents, processes, and queues.\r\n\t * This ensures users have access to all available transfer options.\r\n\t *\r\n\t * @dependencies [] - Empty dependency array for component mount only\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs on component mount\r\n\t * // Fetches idle agents and active processes/queues\r\n\t * ```\r\n\t *\r\n\t * @effects\r\n\t * - 👥 Loads available idle agents for agent transfers\r\n\t * - ⚙️ Loads active processes for process transfers\r\n\t * - 📋 Loads active queues for queue transfers\r\n\t * - 🔄 Populates transfer destination options\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: AGENTS_LIST - Fetches idle agents\r\n\t * - 📡 Endpoint: TRANSFER_TO_DETAILS - Fetches processes and queues\r\n\t * - 🔍 Filters: Status and active flags for relevant data\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// 👥 Fetch available idle agents for transfer\r\n\t\tgetIdelAgentsList(END_POINT.AGENTS_LIST, {\r\n\t\t\tstatus: \"IDLE\", // 🔍 Only idle agents\r\n\t\t\tactive: true, // ✅ Only active agents\r\n\t\t});\r\n\r\n\t\t// ⚙️ Fetch available processes and queues for transfer\r\n\t\tgetProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n\t\t\tstatus: \"ACTIVE\", // 🔍 Only active processes/queues\r\n\t\t\tactive: true, // ✅ Only active items\r\n\t\t});\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Call Transfer</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Process and Queues */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"6px 10px\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"process\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCurrentselecteTab(\"process\");\r\n\t\t\t\t\t\t\t\t\tgetProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n\t\t\t\t\t\t\t\t\t\tstatus: \"ACTIVE\",\r\n\t\t\t\t\t\t\t\t\t\tactive: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tProcess\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"queues\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCurrentselecteTab(\"queues\");\r\n\t\t\t\t\t\t\t\t\tgetProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n\t\t\t\t\t\t\t\t\t\tstatus: \"ACTIVE\",\r\n\t\t\t\t\t\t\t\t\t\tactive: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tQueues\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"agents\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCurrentselecteTab(\"agents\");\r\n\t\t\t\t\t\t\t\t\tgetIdelAgentsList(END_POINT.AGENTS_LIST, {\r\n\t\t\t\t\t\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\t\t\t\t\t\tactive: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tAgents\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t{(isProcessAndQueuesListLoading || isIdleAgentsListLoading) && (\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\theight: \"80px\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<CircularProgress />{\" \"}\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!isIdleAgentsListLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"process\" && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t{(\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process &&\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.length > 0\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.map((process: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.process_name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleTransferCall(process, \"PROCESS\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tNo Process Found\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!isIdleAgentsListLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"queues\" && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t{(\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue &&\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue?.length > 0\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue?.map((queue: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{queue.queue_name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.find(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(process: any) => process.process_id === queue.process_id\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)?.process_name\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\"(\" +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.find(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(process: any) => process.process_id === queue.process_id\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)?.process_name +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\")\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t:\t\"\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleTransferCall(queue, \"QUEUE\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tNo Queues Found\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!isIdleAgentsListLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"agents\" && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t{idleAgentsList?.data && idleAgentsList?.data?.length > 0 ?\r\n\t\t\t\t\t\t\t\t\t\tidleAgentsList?.data?.map((agent: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{agent.name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleTransferCall(agent, \"AGENT\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tNo Agents Found\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * END CALL DISPOSITION DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * @component EndCallDispositionDialog\r\n * @description Dialog for capturing call disposition data when ending calls. Collects outcome, follow-up requirements, and callback scheduling information.\r\n * @declaration\r\n * ```typescript\r\n * export function EndCallDispositionDialog({ open, setOpen, onSubmitDisposition }: any) {\r\n * ```\r\n * @requiredParams\r\n * - `open: boolean` - Controls dialog visibility\r\n * - `setOpen: (open: boolean) => void` - Function to control dialog state\r\n * - `onSubmitDisposition: (data: any) => void` - Callback for disposition data\r\n * @returnType `JSX.Element` - Call disposition form interface\r\n * @description Renders form for capturing call disposition information\r\n * @example\r\n * ```tsx\r\n * <EndCallDispositionDialog\r\n * open={true}\r\n * setOpen={setOpen}\r\n * onSubmitDisposition={handleDisposition}\r\n * />\r\n * ```\r\n * @return Returns dialog with:\r\n * - Disposition selection dropdown\r\n * - Follow-up selection dropdown\r\n * - Callback date/time inputs\r\n * - Submit and cancel buttons\r\n * @conclusion Main interface for call disposition capture\r\n */\r\nexport function EndCallDispositionDialog({ open, setOpen, onSubmitDisposition }: any) {\r\n\t/**\r\n\t * @variable formData\r\n\t * @description State for end call disposition form data\r\n\t * @type `useState<object>`\r\n\t * @purpose Stores disposition, follow-up, and callback information\r\n\t */\r\n\tconst [formData, setFormData] = useState({\r\n\t\tdisposition: { label: \"Resolved\", value: \"RES\" },\r\n\t\tfollowUp: { label: \"No\", value: \"N\" },\r\n\t\tcallbackDate: \"\",\r\n\t\tcallbackHrs: \"\",\r\n\t\tcallbackMins: \"\",\r\n\t});\r\n\t/**\r\n\t * @variable dispositionOptions\r\n\t * @description Available disposition options for call outcomes\r\n\t * @type `Array<{ label: string; value: string }>`\r\n\t * @purpose Provides predefined disposition choices\r\n\t */\r\n\tconst dispositionOptions = [\r\n\t\t{ label: \"Not Interested\", value: \"NI\" },\r\n\t\t{ label: \"Resolved\", value: \"RES\" },\r\n\t];\r\n\t/**\r\n\t * @variable followUpOptions\r\n\t * @description Available follow-up options for calls\r\n\t * @type `Array<{ label: string; value: string }>`\r\n\t * @purpose Provides follow-up requirement choices\r\n\t */\r\n\tconst followUpOptions = [\r\n\t\t{ label: \"Yes\", value: \"Y\" },\r\n\t\t{ label: \"No\", value: \"N\" },\r\n\t];\r\n\r\n\t/**\r\n\t * @function handleChange\r\n\t * @description Updates form data when input values change\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleChange = (field: keyof typeof formData, value: { label: string } | null | string) => {\r\n\t * setFormData((prev) => ({ ...prev, [field]: value }));\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams\r\n\t * - `field: keyof typeof formData` - Form field to update\r\n\t * - `value: { label: string } | null | string` - New value for the field\r\n\t * @returnType `void`\r\n\t * @description Updates specific form field with new value\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleChange(\"disposition\", { label: \"Resolved\", value: \"RES\" });\r\n\t * handleChange(\"callbackDate\", \"2024-01-15\");\r\n\t * ```\r\n\t * @return No return value - updates form state\r\n\t * @conclusion Generic form field update handler\r\n\t */\r\n\r\n\tconst handleChange = (field: keyof typeof formData, value: { label: string } | null | string) => {\r\n\t\tsetFormData((prev) => ({ ...prev, [field]: value }));\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleReset\r\n\t * @description Resets form data to default values\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleReset = () => {\r\n\t * setFormData({\r\n\t * disposition: { label: \"Resolved\", value: \"RES\" },\r\n\t * followUp: { label: \"No\", value: \"N\" },\r\n\t * callbackDate: \"\",\r\n\t * callbackHrs: \"\",\r\n\t * callbackMins: \"\",\r\n\t * });\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Resets all form fields to default values\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleReset();\r\n\t * ```\r\n\t * @return No return value - resets form state\r\n\t * @conclusion Resets form to initial state\r\n\t */\r\n\r\n\tconst handleReset = () => {\r\n\t\tsetFormData({\r\n\t\t\tdisposition: { label: \"Resolved\", value: \"RES\" },\r\n\t\t\tfollowUp: { label: \"No\", value: \"N\" },\r\n\t\t\tcallbackDate: \"\",\r\n\t\t\tcallbackHrs: \"\",\r\n\t\t\tcallbackMins: \"\",\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleClose\r\n\t * @description Closes dialog and resets form data\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleClose = () => {\r\n\t * handleReset();\r\n\t * setOpen(false);\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Closes dialog and resets form to default state\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleClose();\r\n\t * ```\r\n\t * @return No return value - closes dialog and resets form\r\n\t * @conclusion Closes dialog with proper cleanup\r\n\t */\r\n\r\n\tconst handleClose = () => {\r\n\t\thandleReset();\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"xs\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\tm={1}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{\" \"}\r\n\t\t\t\t\t\t\tCall Disposition\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\t\t\t\tgap={2}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\tvalue={formData.disposition}\r\n\t\t\t\t\t\t\t\toptions={dispositionOptions}\r\n\t\t\t\t\t\t\t\tgetOptionLabel={(opt) => opt.label}\r\n\t\t\t\t\t\t\t\tonChange={(_, val) => handleChange(\"disposition\", val)}\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\t\t\t\t\tlabel=\"Disposition\"\r\n\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\toptions={followUpOptions}\r\n\t\t\t\t\t\t\t\tgetOptionLabel={(opt) => opt.label}\r\n\t\t\t\t\t\t\t\tvalue={formData.followUp}\r\n\t\t\t\t\t\t\t\tonChange={(_, val) => handleChange(\"followUp\", val)}\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\t\t\t\t\tlabel=\"Follow Up\"\r\n\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t{/* Callback Date + Time */}\r\n\t\t\t\t\t\t{formData?.followUp?.label?.toLowerCase() === \"yes\" && (\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\t\t\t\t\tgap={2}\r\n\t\t\t\t\t\t\t\tmt={2}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\tlabel=\"Callback Date\"\r\n\t\t\t\t\t\t\t\t\ttype=\"date\"\r\n\t\t\t\t\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\t\t\t\t\tinputLabel: { shrink: true },\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackDate}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleChange(\"callbackDate\", e.target.value)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\tlabel=\"Hours (0-23)\"\r\n\t\t\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackHrs}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleChange(\"callbackHrs\", e.target.value)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{formData?.followUp?.label?.toLowerCase() === \"yes\" && (\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\t\t\t\t\tgap={2}\r\n\t\t\t\t\t\t\t\tmt={2}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\tlabel=\"Minutes (0-59)\"\r\n\t\t\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackMins}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleChange(\"callbackMins\", e.target.value)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<Box sx={{ flex: 1 }}></Box>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\ttextAlign=\"right\"\r\n\t\t\t\t\t\tm={2}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\tonClick={handleClose}\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tcancel\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"contained\"\r\n\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\tonClick={() => onSubmitDisposition(formData)}\r\n\t\t\t\t\t\t\tsx={{ px: 2, borderRadius: \"10px\", textTransform: \"capitalize\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tSubmit\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * PROCESSOR LIST DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * @component ProcessorListDialog\r\n * @description Dialog for selecting available processes during SDK initialization. Allows agents to choose their working process from available options.\r\n * @declaration\r\n * ```typescript\r\n * export function ProcessorListDialog({\r\n * open,\r\n * setOpen,\r\n * processList = null,\r\n * handleSelectedProcessor,\r\n * }: any) {\r\n * ```\r\n * @requiredParams\r\n * - `open: boolean` - Controls dialog visibility\r\n * - `setOpen: (open: boolean) => void` - Function to control dialog state\r\n * - `processList: any[]` - Array of available processes\r\n * - `handleSelectedProcessor: (data: any) => void` - Callback for process selection\r\n * @returnType `JSX.Element` - Process selection interface\r\n * @description Renders list of available processes for selection\r\n * @example\r\n * ```tsx\r\n * <ProcessorListDialog\r\n * open={true}\r\n * setOpen={setOpen}\r\n * processList={processes}\r\n * handleSelectedProcessor={handleProcess}\r\n * />\r\n * ```\r\n * @return Returns dialog with:\r\n * - List of available processes\r\n * - Process selection interface\r\n * - Click handlers for process selection\r\n * @conclusion Main interface for process selection during initialization\r\n */\r\nexport function ProcessorListDialog({\r\n\topen,\r\n\tsetOpen,\r\n\tprocessList = null,\r\n\thandleSelectedProcessor,\r\n}: any) {\r\n\t/**\r\n\t * @function handleClose\r\n\t * @description Closes the processor selection dialog\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleClose = () => {\r\n\t * setOpen(false);\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Closes processor selection dialog\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleClose();\r\n\t * ```\r\n\t * @return No return value - closes dialog\r\n\t * @conclusion Simple dialog close handler\r\n\t */\r\n\tconst handleClose = () => {\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tmaxWidth={\"xs\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Process List</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"6px 10px\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{processList.length > 0 ?\r\n\t\t\t\t\t\t\tprocessList?.map((process: any, index: any) => (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\r\n\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\thandleSelectedProcessor(process);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{/* Status */}\r\n\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t{process.process_name}\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t:\tnull}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * CALL HISTORY DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * @component CallHistoryDialog\r\n * @description Placeholder dialog for call history functionality. Currently shows \"Coming Soon\" message as this feature is not yet implemented.\r\n * @declaration\r\n * ```typescript\r\n * export function CallHistoryDialog({ open, setOpen }: any) {\r\n * ```\r\n * @requiredParams\r\n * - `open: boolean` - Controls dialog visibility\r\n * - `setOpen: (open: boolean) => void` - Function to control dialog state\r\n * @returnType `JSX.Element` - Placeholder call history interface\r\n * @description Renders placeholder for future call history functionality\r\n * @example\r\n * ```tsx\r\n * <CallHistoryDialog open={true} setOpen={setOpen} />\r\n * ```\r\n * @return Returns dialog with:\r\n * - \"Coming Soon\" placeholder message\r\n * - Basic dialog structure\r\n * @conclusion Placeholder component for future call history feature\r\n */\r\nexport function CallHistoryDialog({ open, setOpen }: any) {\r\n\t/**\r\n\t * @function handleClose\r\n\t * @description Closes the call history dialog\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleClose = () => {\r\n\t * setOpen(false);\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Closes call history dialog\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleClose();\r\n\t * ```\r\n\t * @return No return value - closes dialog\r\n\t * @conclusion Simple dialog close handler\r\n\t */\r\n\r\n\tconst handleClose = () => {\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Call History</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\ttextAlign: \"center\",\r\n\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tp={6}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tComing Soon...\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * 📋 COMPREHENSIVE FILE SUMMARY\r\n * =============================================================================\r\n *\r\n * 🎭 This dialog.tsx file contains comprehensive dialog components for CTI functionality:\r\n *\r\n * 📊 **Core Dialog Components:**\r\n * 1. 👥 **ConferenceDialog**: Complete conference call management with line controls\r\n * - Multi-line conference management\r\n * - Individual line controls (Call, Merge, Hold, Mute, End)\r\n * - Bulk conference termination\r\n * - Real-time status updates\r\n *\r\n * 2. 🔄 **CallTransferDialog**: Call transfer to processes, queues, or agents\r\n * - Tabbed interface for different transfer types\r\n * - Real-time destination data loading\r\n * - One-click transfer execution\r\n * - Comprehensive error handling\r\n *\r\n * 3. 📝 **EndCallDispositionDialog**: Call disposition capture and callback scheduling\r\n * - Disposition outcome selection\r\n * - Follow-up requirement tracking\r\n * - Callback date/time scheduling\r\n * - Form validation and submission\r\n *\r\n * 4. ⚙️ **ProcessorListDialog**: Process selection during initialization\r\n * - Available process listing\r\n * - Process selection interface\r\n * - Initialization workflow integration\r\n *\r\n * 5. 📋 **CallHistoryDialog**: Placeholder for future call history feature\r\n * - \"Coming Soon\" placeholder\r\n * - Future call history functionality\r\n *\r\n * 🚀 **Key Technical Features:**\r\n * - 🎨 Material-UI dialog components with consistent styling\r\n * - 📡 Real-time API integration with loading states\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🔄 State management integration with SDK\r\n * - 📱 Responsive design for different screen sizes\r\n * - 🛡️ Comprehensive error handling and validation\r\n * - ⏳ Loading states for all operations\r\n * - 🎯 One-click action execution\r\n * - 📊 Real-time data updates\r\n *\r\n * 🔧 **Technical Implementation:**\r\n * - ⚛️ React functional components with hooks\r\n * - 📡 Custom usePostRequest hooks for API calls\r\n * - 🗃️ Centralized state management via SDK\r\n * - 🎨 Material-UI theming and styling\r\n * - 📝 TypeScript type definitions\r\n * - 🔄 Effect hooks for lifecycle management\r\n * - 🛡️ Error boundary patterns\r\n *\r\n * 📈 **Performance Optimizations:**\r\n * - ⚡ Optimized re-renders with proper dependency arrays\r\n * - 🔄 Efficient state updates\r\n * - 📡 Minimal API calls with caching\r\n * - 🎯 Targeted component updates\r\n * - 💾 Memory-efficient state management\r\n *\r\n * 🎯 **User Experience Features:**\r\n * - 🎨 Consistent visual design language\r\n * - 📱 Mobile-responsive layouts\r\n * - ⏳ Loading indicators for all operations\r\n * - 🍞 Contextual feedback messages\r\n * - 🎯 Intuitive navigation and controls\r\n * - 🔄 Real-time status updates\r\n * - 🛡️ Error recovery mechanisms\r\n *\r\n * 📊 **API Integration:**\r\n * - 📡 RESTful API endpoints for all operations\r\n * - 🔄 Real-time WebSocket updates\r\n * - 🛡️ Error handling and retry logic\r\n * - 📊 Data validation and sanitization\r\n * - 🔐 Secure authentication integration\r\n *\r\n * The components follow React best practices with proper state management,\r\n * error handling, accessibility considerations, and user experience design.\r\n * Each dialog is self-contained with its own state management while integrating\r\n * seamlessly with the overall SDK architecture.\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n","import { SxProps, useTheme } from \"@mui/material\";\r\n\r\nconst useStyles = ({\r\n disabled,\r\n enabled,\r\n outlined,\r\n}: {\r\n disabled: SxProps;\r\n enabled: SxProps;\r\n outlined: SxProps;\r\n}): {\r\n disabled: SxProps;\r\n enabled: SxProps;\r\n outlined: SxProps;\r\n} => {\r\n const theme = useTheme();\r\n return {\r\n disabled: {\r\n padding: \"0px\",\r\n margin: \"0px\",\r\n minWidth: \"40px !important\",\r\n borderRadius: \"16px\",\r\n border: `1px solid rgb(206, 204, 204)`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n boxShadow: \" 0px 2px 2px rgba(0, 0, 0, 0.79)\",\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"primary.main\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n ...disabled,\r\n },\r\n enabled: {\r\n padding: \"0px\",\r\n margin: \"0px\",\r\n minWidth: \"40px !important\",\r\n borderRadius: \"16px\",\r\n boxShadow: \" 0px 2px 1px rgba(0, 0, 0, 0.507)\",\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n boxShadow: \" 0px 2px 1px rgba(0, 0, 0, 0.507)\",\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"primary.main\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n ...enabled,\r\n },\r\n outlined: {\r\n padding: \"0px\",\r\n margin: \"0px\",\r\n minWidth: \"40px !important\",\r\n borderRadius: \"16px\",\r\n backgroundColor: theme.palette.grey[200],\r\n boxShadow: `0px 2px 1px ${theme.palette.primary.light}`,\r\n border: `0px solid ${theme.palette.primary.main}`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n boxShadow: `0px 2px 1px ${theme.palette.primary.main}`,\r\n border: `0px solid ${theme.palette.primary.main}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"primary.main\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n ...outlined,\r\n },\r\n };\r\n};\r\n\r\nexport default useStyles;\r\n","/**\r\n * @fileoverview SDKProvider Component\r\n * @description Context provider component that wraps the Call Control SDK with necessary providers.\r\n * Provides toast notifications and other global services to child components.\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\nimport { ReactNode, memo } from \"react\";\r\nimport { ToastProvider } from \"../services/toastMessage\";\r\nimport React from \"react\";\r\n\r\n/**\r\n * @interface SDKProviderProps\r\n * @description Props interface for the SDKProvider component\r\n *\r\n * @declaration\r\n * ```typescript\r\n * interface SDKProviderProps {\r\n * children: ReactNode;\r\n * }\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `children: ReactNode` - Child components to be wrapped with providers\r\n *\r\n * @returnType Interface definition\r\n *\r\n * @example\r\n * ```tsx\r\n * <SDKProvider>\r\n * <CallControls />\r\n * </SDKProvider>\r\n * ```\r\n *\r\n * @return Interface definition for provider props\r\n *\r\n * @conclusion Simple interface for wrapping child components with SDK providers.\r\n */\r\ninterface SDKProviderProps {\r\n\t/** Child components to be wrapped with SDK providers */\r\n\tchildren: ReactNode;\r\n}\r\n\r\n/**\r\n * @function SDKProvider\r\n * @description Context provider component that wraps child components with necessary SDK services.\r\n * Provides toast notifications and other global services required by the Call Control SDK.\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function SDKProvider(props: SDKProviderProps): JSX.Element\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `props: SDKProviderProps` - Component props containing children to wrap\r\n *\r\n * @returnType `JSX.Element`\r\n *\r\n * @example\r\n * ```tsx\r\n * <SDKProvider>\r\n * <CallControls onDataChange={handleDataChange} />\r\n * </SDKProvider>\r\n * ```\r\n *\r\n * @return React component providing SDK context and services\r\n *\r\n * @conclusion Essential wrapper component that provides global services to the Call Control SDK.\r\n */\r\nexport const SDKProvider = memo<SDKProviderProps>(({ children }) => {\r\n\treturn <ToastProvider>{children}</ToastProvider>;\r\n});\r\n\r\n// Set display name for debugging\r\nSDKProvider.displayName = \"SDKProvider\";\r\n\r\n/**\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n"],"mappings":"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","names":["index_exports","__export","CallControlPanel","getSDKVersion","initSDK","isSDKInitialized","useClickToCall","useEndCall","useLogout","__toCommonJS","SDKStateManager","__publicField","stored","parsedState","__spreadProps","__spreadValues","error","persistentState","listener","apiKey","agentId","sdkConfig","index","isHolding","isMuted","status","process","position","open","data","line","_a","conferenceLineData","each","sdkStateManager","EventTrackerSDK","__publicField","config","__spreadValues","ticket","response","sdkStateManager","data","error","eventType","eventData","event","index","e","eventsToFlush","retryItems","retryFn","url","options","_a","fullUrl","maxRetries","attempt","delay","resolve","autoTrackConfig","target","formData","formFields","value","key","inputTimer","sessionStartTime","sessionDuration","navigation","timing","interval","eventTracker","import_react","IP","BASE_URL","WS_BASE_URL","VERSION","END_POINT","WS_END_POINT","import_axios","DEFAULT_TOKEN","REQUEST_TIMEOUT","getAuthToken","createAxiosInstance","instance","axios","BASE_URL","config","token","error","response","_a","endTime","startTime","originalRequest","axiosInstance","axios_default","useLogout","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","state","payload","axios_default","END_POINT","res","sdkStateManager","err","import_react","useEndCall","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","state","payload","axios_default","END_POINT","res","sdkStateManager","err","import_react","useClickToCall","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","_b","_c","_d","_e","_f","_g","_h","_i","state","payload","axios_default","END_POINT","res","err","line_used","each","sdkStateManager","__spreadProps","__spreadValues","import_react","import_icons_material","import_material","import_react","import_react","useDraggable","initialPosition","onPositionChange","position","setPosition","isDragging","setIsDragging","dragRef","dragStart","elementStart","updatePosition","newPosition","element","rect","viewportWidth","viewportHeight","constrainedPosition","handleStart","clientX","clientY","handleMove","moveClientX","moveClientY","deltaX","deltaY","handleMouseMove","e","handleTouchMove","touch","handleEnd","handleMouseDown","handleTouchStart","import_react","useSDKState","state","setState","sdkStateManager","import_react","import_react","import_material","import_jsx_runtime","ToastContext","useToast","ctx","ToastProvider","children","open","setOpen","message","setMessage","severity","setSeverity","showToast","msg","sev","initialState","reducer","state","action","__spreadProps","__spreadValues","usePostRequest","props","onSuccess","onError","disabledSuccessToast","showToast","useToast","state","dispatch","reducer","initialState","url","payload","config","axios_default","res","_a","_b","err","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","error","import_icons_material","import_material","import_react","import_material","useStyles","disabled","enabled","outlined","theme","__spreadValues","styles_default","import_jsx_runtime","ConferenceTableRow","each","_a","_b","_c","_d","_e","state","useSDKState","showToast","useToast","disabled","enabled","outlined","styles_default","theme","conferenceCallStart","setConferenceCallStart","conferenceCallMerge","setConferenceCallMerge","conferenceCallHoldOrUnHold","setConferenceCallHoldOrUnHold","conferenceCallMuteOrUnMute","setConferenceCallMuteOrUnMute","conferenceCallEnd","setConferenceCallEnd","onConferenceLineUpdate","line","data","sdkStateManager","__spreadValues","onConferenceCallStart","line_used","payload","axios_default","END_POINT","res","err","message","onMergeConferenceCall","onHoldOrUnHoldConferenceCall","type","onMuteOrUnMuteConferenceCall","onEndConferenceCall","e","__spreadProps","ConferenceDialog","conferenceCallEndAll","setConferenceCallEndAll","handleClose","onEndAllConferenceCalls","CallTransferDialog","open","_f","_g","_h","_i","_j","_k","_l","transferCall","usePostRequest","currentselecteTab","setCurrentselecteTab","getIdelAgentsList","idleAgentsList","isIdleAgentsListLoading","getProcessAndQueuesList","processAndQueuesList","isProcessAndQueuesListLoading","handleTransferCall","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","_G","process","index","queue","agent","EndCallDispositionDialog","setOpen","onSubmitDisposition","formData","setFormData","dispositionOptions","followUpOptions","handleChange","field","value","prev","handleReset","opt","_","val","params","ProcessorListDialog","processList","handleSelectedProcessor","CallHistoryDialog","import_jsx_runtime","getCombineConfrenceData","conferenceData","apiData","data","item","_a","_b","_c","statusKey","phoneKey","__spreadProps","__spreadValues","formatDuration","seconds","mins","secs","CallControls","onDataChange","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","_G","_H","_I","_J","_K","_L","_M","_N","_O","_P","_Q","_R","_S","_T","_U","_V","_W","_X","_Y","_Z","__","_$","_aa","_ba","_ca","_da","_ea","_fa","_ga","_ha","_ia","_ja","_ka","_la","_ma","_na","_oa","_pa","_qa","_ra","_sa","_ta","_ua","_va","_wa","_xa","_ya","_za","_Aa","theme","state","useSDKState","showToast","useToast","disabled","enabled","outlined","styles_default","webSocketRef","anchorEl","setAnchorEl","showIframe","setShowIframe","statusAnchorEl","setStatusAnchorEl","dialerAnchorEl","setDialerAnchorEl","openCallDisposition","setOpenCallDisposition","openProcessorDialog","setOpenProcessorDialog","openCallHistoryDialog","setOpenCallHistoryDialog","processList","setProcessList","phoneNumber","setPhoneNumber","callDuration","setCallDuration","position","isDragging","dragRef","handleMouseDown","handleTouchStart","useDraggable","newPosition","sdkStateManager","iframePosition","iframeIsDragging","iframeDragRef","iframeHandleMouseDown","iframeHandleTouchStart","clickToCall","clickToCallLoading","usePostRequest","holdOrUnHold","holdOrUnHoldLoading","error","muteOrUnMute","muteOrUnMuteLoading","readyAgentStatus","agentReadyLoading","updateAgentStatus","isLoading","endCall","endCallLoading","handleCloseQueueCounts","handleOpenDialer","event","handleCloseDialer","handleOpenAgentStatus","handleCloseAgentStatus","handleAgentReady","payload","END_POINT","handleUpdateAgentStatus","status","handleStartCall","number","handleHoldToggle","handleMuteToggle","handleEndCall","handleBeforeUnload","e","interval","elapsed","process_id","process_name","phone_number","agent_id","convox_id","axios_default","res","err","WS_END_POINT","confrence","ProcessorListDialog","IP","ConferenceDialog","CallTransferDialog","EndCallDispositionDialog","CallHistoryDialog","import_react","import_jsx_runtime","SDKProvider","children","ToastProvider","import_jsx_runtime","CallControlPanel","onDataChange","handleDataChange","data","error","SDKProvider","CallControls","initSDK","apiKey","tenantId","agentId","sdkConfig","eventTracker","BASE_URL","sdkStateManager","error","getSDKVersion","isSDKInitialized"]}
1
+ {"version":3,"sources":["../call-control-sdk/index.ts","../call-control-sdk/lib/hooks/sdk-state.ts","../call-control-sdk/lib/hooks/eventsTracker.ts","../call-control-sdk/lib/hooks/useLogout.ts","../call-control-sdk/lib/services/endPoint.ts","../call-control-sdk/lib/services/axios.ts","../call-control-sdk/lib/hooks/useEndCall.ts","../call-control-sdk/lib/hooks/useClickToCall.ts","../call-control-sdk/lib/components/callControlPanel.tsx","../call-control-sdk/lib/components/callControls.tsx","../call-control-sdk/lib/hooks/useDraggable.ts","../call-control-sdk/lib/hooks/useSDKState.ts","../call-control-sdk/lib/services/request.ts","../call-control-sdk/lib/services/toastMessage.tsx","../call-control-sdk/lib/components/dialog.tsx","../call-control-sdk/lib/components/styles.ts","../call-control-sdk/lib/components/SDKProvider.tsx"],"sourcesContent":["/**\r\n * @fileoverview Call Control SDK - Main Entry Point\r\n * @description Comprehensive CTI (Computer Telephony Integration) SDK for React applications.\r\n * Provides complete call control functionality including dialing, conferencing, transferring,\r\n * and real-time call management with WebSocket integration.\r\n *\r\n * @author Achala IT Solutions\r\n * @version 1.0.0\r\n * @since 2024\r\n */\r\n\r\nimport { eventTracker } from \"./lib/hooks/eventsTracker\";\r\nimport { sdkStateManager } from \"./lib/hooks/sdk-state\";\r\nimport { useLogout } from \"./lib/hooks/useLogout\";\r\nimport { BASE_URL } from \"./lib/services/endPoint\";\r\nimport { useEndCall } from \"./lib/hooks/useEndCall\";\r\nimport { SDKConfig } from \"./types\";\r\nimport { useClickToCall } from \"./lib/hooks/useClickToCall\";\r\n\r\n// Component exports\r\nexport { CallControlPanel } from \"./lib/components/callControlPanel\";\r\n\r\n// Type exports\r\nexport type {\r\n\tCallControlPanelProps,\r\n\tCallData,\r\n\tCallStatus,\r\n\tConferenceLineTypes,\r\n\tSDKConfig,\r\n\tSDKState,\r\n} from \"./types\";\r\n\r\n/**\r\n * @interface InitSDKParams\r\n * @description Parameters required for SDK initialization\r\n *\r\n * @declaration\r\n * ```typescript\r\n * interface InitSDKParams {\r\n * apiKey: string;\r\n * tenantId: string;\r\n * agentId: string;\r\n * sdkConfig?: SDKConfig;\r\n * }\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `apiKey: string` - Authentication key for SDK access\r\n * - `tenantId: string` - Tenant identifier for multi-tenancy support\r\n * - `agentId: string` - Agent identifier for call management\r\n *\r\n * @returnType Interface definition\r\n *\r\n * @example\r\n * ```typescript\r\n * const initParams: InitSDKParams = {\r\n * apiKey: \"your-api-key\",\r\n * tenantId: \"tenant-123\",\r\n * agentId: \"agent-456\",\r\n * sdkConfig: {\r\n * isDraggable: true,\r\n * disableSoftPhone: false\r\n * }\r\n * };\r\n * ```\r\n *\r\n * @return Interface definition for SDK initialization parameters\r\n *\r\n * @conclusion Essential interface for proper SDK initialization with all required parameters.\r\n */\r\ninterface InitSDKParams {\r\n\t/** Authentication key for SDK access */\r\n\tapiKey: string;\r\n\t/** Tenant identifier for multi-tenancy support */\r\n\ttenantId: string;\r\n\t/** Agent identifier for call management */\r\n\tagentId: string;\r\n\t/** Optional SDK configuration for customizing behavior */\r\n\tsdkConfig?: SDKConfig;\r\n}\r\n\r\n/**\r\n * @function initSDK\r\n * @description Initializes the Call Control SDK with authentication credentials and configuration.\r\n * Sets up event tracking, state management, and establishes connection to the CTI system.\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function initSDK(params: InitSDKParams): Promise<void>\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `params: InitSDKParams` - Object containing API key, tenant ID, agent ID, and optional config\r\n *\r\n * @returnType `Promise<void>`\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic initialization\r\n * await initSDK({\r\n * apiKey: \"your-api-key\",\r\n * tenantId: \"tenant-123\",\r\n * agentId: \"agent-456\"\r\n * });\r\n *\r\n * // With custom configuration\r\n * await initSDK({\r\n * apiKey: \"your-api-key\",\r\n * tenantId: \"tenant-123\",\r\n * agentId: \"agent-456\",\r\n * sdkConfig: {\r\n * isDraggable: true,\r\n * disableSoftPhone: false,\r\n * disableEndCallButton: false\r\n * }\r\n * });\r\n * ```\r\n *\r\n * @return Promise that resolves when initialization is complete\r\n *\r\n * @throws {Error} When API key is missing or invalid\r\n * @throws {Error} When tenant ID is missing or invalid\r\n * @throws {Error} When agent ID is missing or invalid\r\n * @throws {Error} When initialization fails due to network or authentication issues\r\n *\r\n * @conclusion Critical function that must be called before using any SDK functionality.\r\n */\r\nexport async function initSDK({\r\n\tapiKey,\r\n\ttenantId,\r\n\tagentId,\r\n\tsdkConfig,\r\n}: InitSDKParams): Promise<void> {\r\n\t// Input validation\r\n\tif (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n\t\tthrow new Error(\r\n\t\t\t\"SDK initialization failed: API key is required and must be a non-empty string\"\r\n\t\t);\r\n\t}\r\n\r\n\tif (!tenantId || typeof tenantId !== \"string\" || tenantId.trim().length === 0) {\r\n\t\tthrow new Error(\r\n\t\t\t\"SDK initialization failed: Tenant ID is required and must be a non-empty string\"\r\n\t\t);\r\n\t}\r\n\r\n\tif (!agentId || typeof agentId !== \"string\" || agentId.trim().length === 0) {\r\n\t\tthrow new Error(\r\n\t\t\t\"SDK initialization failed: Agent ID is required and must be a non-empty string\"\r\n\t\t);\r\n\t}\r\n\r\n\ttry {\r\n\t\t// Initialize event tracker\r\n\t\tconst initResult = await eventTracker.init({\r\n\t\t\tapiKey: apiKey.trim(),\r\n\t\t\ttenantId: tenantId.trim(),\r\n\t\t\tagentId: agentId.trim(),\r\n\t\t\tbaseUrl: BASE_URL,\r\n\t\t});\r\n\r\n\t\tif (initResult) {\r\n\t\t\tconsole.log(\"SDK initialized successfully\");\r\n\t\t\tsdkStateManager.initialize(apiKey.trim(), agentId.trim(), sdkConfig);\r\n\t\t} else {\r\n\t\t\tconsole.error(\"SDK initialization failed: Event tracker initialization returned false\");\r\n\t\t\tsdkStateManager.setInitCheck();\r\n\t\t\tthrow new Error(\r\n\t\t\t\t\"SDK initialization failed: Unable to establish connection with the CTI system\"\r\n\t\t\t);\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"SDK initialization error:\", error);\r\n\t\tsdkStateManager.setInitCheck();\r\n\r\n\t\tif (error instanceof Error) {\r\n\t\t\tthrow error;\r\n\t\t} else {\r\n\t\t\tthrow new Error(`SDK initialization failed: ${String(error)}`);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * @function getSDKVersion\r\n * @description Returns the current version of the Call Control SDK\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function getSDKVersion(): string\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `string`\r\n *\r\n * @example\r\n * ```typescript\r\n * const version = getSDKVersion();\r\n * console.log(`Using Call Control SDK version: ${version}`);\r\n * ```\r\n *\r\n * @return Current SDK version string\r\n *\r\n * @conclusion Utility function for version checking and debugging purposes.\r\n */\r\nexport function getSDKVersion(): string {\r\n\treturn \"5.4.8\";\r\n}\r\n\r\n/**\r\n * @function isSDKInitialized\r\n * @description Checks if the SDK has been successfully initialized\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function isSDKInitialized(): boolean\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `boolean`\r\n *\r\n * @example\r\n * ```typescript\r\n * if (isSDKInitialized()) {\r\n * // SDK is ready to use\r\n * console.log(\"SDK is initialized and ready\");\r\n * } else {\r\n * console.log(\"SDK needs to be initialized first\");\r\n * }\r\n * ```\r\n *\r\n * @return True if SDK is initialized, false otherwise\r\n *\r\n * @conclusion Utility function for checking SDK initialization status before using features.\r\n */\r\nexport function isSDKInitialized(): boolean {\r\n\treturn sdkStateManager.getState().isInitialized;\r\n}\r\n\r\n// Hook exports\r\nexport { useLogout, useEndCall, useClickToCall };\r\n","import type { SDKState, CallData, CallStatus, ConferenceLineTypes, SDKConfig } from \"../../types\";\r\n\r\nclass SDKStateManager {\r\n\tprivate state: SDKState;\r\n\tprivate listeners: Array<() => void> = [];\r\n\tprivate readonly STORAGE_KEY = \"call-control-sdk-state\";\r\n\r\n\tconstructor() {\r\n\t\tthis.state = this.getInitialState();\r\n\t\tthis.loadFromStorage();\r\n\t}\r\n\r\n\tprivate getInitialState(): SDKState {\r\n\t\treturn {\r\n\t\t\tprocess: null,\r\n\t\t\tagentId: \"\",\r\n\t\t\topenConferenceDialog: false,\r\n\t\t\topenCallTransferDialog: false,\r\n\t\t\tisInitialized: false,\r\n\t\t\tsdkConfig: {\r\n\t\t\t\tdisableEndCallButton: false,\r\n\t\t\t\tdisabledDialButton: false,\r\n\t\t\t\tdisableCallTransferButton: false,\r\n\t\t\t\tisDraggable: true,\r\n\t\t\t\tdisableSoftPhone: false,\r\n\t\t\t\tdisableConferenceButton: false,\r\n\t\t\t\tdisabled: {},\r\n\t\t\t\tenabled: {},\r\n\t\t\t\toutlined: {},\r\n\t\t\t},\r\n\t\t\tisHolding: false,\r\n\t\t\tisMuted: false,\r\n\t\t\tstatus: \"idle\",\r\n\t\t\tcallStartTime: null,\r\n\t\t\tcontrolPanelPosition: { x: 10, y: 10 },\r\n\t\t\tiframePosition: { x: 10, y: 80 },\r\n\t\t\tcallData: {\r\n\t\t\t\tagent_id: \"\",\r\n\t\t\t\tstatus: \"\",\r\n\t\t\t\ttype: \"\",\r\n\t\t\t\tevent_time: \"\",\r\n\t\t\t\tphone_number: \"\",\r\n\t\t\t},\r\n\t\t\tconferenceLine: [\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 1,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 2,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 3,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 4,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tline: 5,\r\n\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\tphone: \"\",\r\n\t\t\t\t\tisMute: false,\r\n\t\t\t\t\tisHold: false,\r\n\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t};\r\n\t}\r\n\r\n\tprivate loadFromStorage(): void {\r\n\t\ttry {\r\n\t\t\tconst stored = localStorage.getItem(this.STORAGE_KEY);\r\n\t\t\tif (stored) {\r\n\t\t\t\tconst parsedState = JSON.parse(stored);\r\n\t\t\t\t// Only restore persistent data, not initialization state\r\n\t\t\t\tthis.state = {\r\n\t\t\t\t\t...this.state,\r\n\t\t\t\t\tagentId: parsedState.agentId || \"\",\r\n\t\t\t\t\tprocess: parsedState.process || null,\r\n\t\t\t\t\topenConferenceDialog: parsedState?.openConferenceDialog || false,\r\n\t\t\t\t\topenCallTransferDialog: parsedState?.openCallTransferDialog || false,\r\n\t\t\t\t\tisInitialized: parsedState.isInitialized || false,\r\n\t\t\t\t\tsdkConfig: parsedState.sdkConfig || {\r\n\t\t\t\t\t\tdisableEndCallButton: false,\r\n\t\t\t\t\t\tdisabledDialButton: false,\r\n\t\t\t\t\t\tdisableCallTransferButton: false,\r\n\t\t\t\t\t\tisDraggable: true,\r\n\t\t\t\t\t\tdisableSoftPhone: false,\r\n\t\t\t\t\t\tdisableConferenceButton: false,\r\n\t\t\t\t\t\tdisabled: {},\r\n\t\t\t\t\t\tenabled: {},\r\n\t\t\t\t\t\toutlined: {},\r\n\t\t\t\t\t},\r\n\t\t\t\t\tisHolding: parsedState.isHolding || false,\r\n\t\t\t\t\tisMuted: parsedState.isMuted || false,\r\n\t\t\t\t\tstatus: parsedState.status || \"idle\",\r\n\t\t\t\t\tcallStartTime: parsedState.callStartTime || null,\r\n\t\t\t\t\tcontrolPanelPosition: parsedState.controlPanelPosition || {\r\n\t\t\t\t\t\tx: 10,\r\n\t\t\t\t\t\ty: 10,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tiframePosition: parsedState.iframePosition || { x: 10, y: 80 },\r\n\t\t\t\t\tcallData: parsedState.callData || {\r\n\t\t\t\t\t\tmobileNumber: \"\",\r\n\t\t\t\t\t\tcallReferenceId: \"\",\r\n\t\t\t\t\t\tagent_id: \"\",\r\n\t\t\t\t\t\tstatus: \"\",\r\n\t\t\t\t\t\ttype: \"\",\r\n\t\t\t\t\t\tevent_time: \"\",\r\n\t\t\t\t\t\tphone_number: \"\",\r\n\t\t\t\t\t},\r\n\t\t\t\t\t// Fix: Properly handle conferenceLine with fallback to initial state\r\n\t\t\t\t\tconferenceLine:\r\n\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\tparsedState.conferenceLine &&\r\n\t\t\t\t\t\t\tArray.isArray(parsedState.conferenceLine) &&\r\n\t\t\t\t\t\t\tparsedState.conferenceLine.length > 0\r\n\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\tparsedState.conferenceLine\r\n\t\t\t\t\t\t:\tthis.state.conferenceLine,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn(\"Failed to load SDK state from localStorage:\", error);\r\n\t\t\t// If loading fails, keep the initial state\r\n\t\t}\r\n\t}\r\n\r\n\tprivate saveToStorage(): void {\r\n\t\ttry {\r\n\t\t\tconst persistentState = {\r\n\t\t\t\tagentId: this.state.agentId,\r\n\t\t\t\tprocess: this.state.process,\r\n\t\t\t\tisInitialized: this.state.isInitialized,\r\n\t\t\t\topenConferenceDialog: this.state.openConferenceDialog,\r\n\t\t\t\topenCallTransferDialog: this.state.openCallTransferDialog,\r\n\t\t\t\tsdkConfig: this.state.sdkConfig,\r\n\t\t\t\tisHolding: this.state.isHolding,\r\n\t\t\t\tisMuted: this.state.isMuted,\r\n\t\t\t\tstatus: this.state.status,\r\n\t\t\t\tcallStartTime: this.state.callStartTime,\r\n\t\t\t\tcontrolPanelPosition: this.state.controlPanelPosition,\r\n\t\t\t\tiframePosition: this.state.iframePosition,\r\n\t\t\t\tcallData: this.state.callData,\r\n\t\t\t\tconferenceLine: this.state.conferenceLine,\r\n\t\t\t};\r\n\t\t\tlocalStorage.setItem(this.STORAGE_KEY, JSON.stringify(persistentState));\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn(\"Failed to save SDK state to localStorage:\", error);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate notifyListeners(): void {\r\n\t\tthis.listeners.forEach((listener) => listener());\r\n\t}\r\n\r\n\tpublic initialize(apiKey: string, agentId: string, sdkConfig?: SDKConfig): void {\r\n\t\tif (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n\t\t\tthrow new Error(\"API key not available\");\r\n\t\t} else {\r\n\t\t\tthis.state.agentId = agentId;\r\n\t\t\tthis.state.openConferenceDialog = false;\r\n\t\t\tthis.state.openCallTransferDialog = false;\r\n\t\t\tthis.state.sdkConfig = {\r\n\t\t\t\tdisableEndCallButton: false,\r\n\t\t\t\tdisabledDialButton: false,\r\n\t\t\t\tdisableCallTransferButton: false,\r\n\t\t\t\tisDraggable: true,\r\n\t\t\t\tdisableSoftPhone: false,\r\n\t\t\t\tdisableConferenceButton: false,\r\n\t\t\t\tdisabled: {},\r\n\t\t\t\tenabled: {},\r\n\t\t\t\toutlined: {},\r\n\t\t\t\t...sdkConfig,\r\n\t\t\t};\r\n\t\t\tthis.state.isInitialized = true;\r\n\t\t\tthis.saveToStorage();\r\n\t\t\tthis.notifyListeners();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getState(): SDKState {\r\n\t\treturn { ...this.state };\r\n\t}\r\n\r\n\tpublic subscribe(listener: () => void): () => void {\r\n\t\tthis.listeners.push(listener);\r\n\t\treturn () => {\r\n\t\t\tconst index = this.listeners.indexOf(listener);\r\n\t\t\tif (index > -1) {\r\n\t\t\t\tthis.listeners.splice(index, 1);\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tpublic setHolding(isHolding: boolean): void {\r\n\t\tthis.state.isHolding = isHolding;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setMuted(isMuted: boolean): void {\r\n\t\tthis.state.isMuted = isMuted;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setStatus(status: CallStatus): void {\r\n\t\tthis.state.status = status;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setProcess(process: { process_id: number; process_name: string }): void {\r\n\t\tthis.state.process = process;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setControlPanelPosition(position: { x: number; y: number }): void {\r\n\t\tthis.state.controlPanelPosition = position;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setIframePosition(position: { x: number; y: number }): void {\r\n\t\tthis.state.iframePosition = position;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic startCall(): void {\r\n\t\tthis.state.callStartTime = Date.now();\r\n\t\tthis.state.status = \"on call\";\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic endCall(): void {\r\n\t\tthis.state.callStartTime = null;\r\n\t\tthis.state.status = \"idle\";\r\n\t\tthis.state.isHolding = false;\r\n\t\tthis.state.isMuted = false;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setInitCheck(): void {\r\n\t\tthis.state.isInitialized = false;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setOpenConferenceDialog(open: boolean): void {\r\n\t\tthis.state.openConferenceDialog = open;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setOpenCallTransferDialog(open: boolean): void {\r\n\t\tthis.state.openCallTransferDialog = open;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic updateCallData(data: Partial<CallData>): void {\r\n\t\tthis.state.callData = { ...this.state.callData, ...data };\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic updateConferenceData(data: ConferenceLineTypes[]): void {\r\n\t\tthis.state.conferenceLine = [...data];\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic setConferenceLine(line: ConferenceLineTypes): void {\r\n\t\t// Fix: Check if conferenceLine is corrupted and reset if needed\r\n\t\tif (!this.state.conferenceLine || !Array.isArray(this.state.conferenceLine)) {\r\n\t\t\tconsole.warn(\"Conference line data corrupted, resetting to initial state\");\r\n\t\t\tthis.state.conferenceLine = this.getInitialState().conferenceLine;\r\n\t\t}\r\n\r\n\t\tconst conferenceLineData = this.state.conferenceLine?.map((each: ConferenceLineTypes) => {\r\n\t\t\tif (each.line === line.line) {\r\n\t\t\t\treturn line;\r\n\t\t\t}\r\n\t\t\treturn each;\r\n\t\t});\r\n\t\tthis.state.conferenceLine = conferenceLineData;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic resetConferenceLines(): void {\r\n\t\tthis.state.conferenceLine = this.getInitialState().conferenceLine;\r\n\t\tthis.saveToStorage();\r\n\t\tthis.notifyListeners();\r\n\t}\r\n\r\n\tpublic clearStorageAndReset(): void {\r\n\t\ttry {\r\n\t\t\tlocalStorage.removeItem(this.STORAGE_KEY);\r\n\t\t\tthis.state = this.getInitialState();\r\n\t\t\tthis.notifyListeners();\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn(\"Failed to clear localStorage:\", error);\r\n\t\t}\r\n\t}\r\n\r\n\t// Debug methods\r\n\tpublic debugStorage(): void {\r\n\t\ttry {\r\n\t\t\tconst stored = localStorage.getItem(this.STORAGE_KEY);\r\n\t\t\tconsole.log(\"Current localStorage data:\", stored);\r\n\t\t\tif (stored) {\r\n\t\t\t\tconsole.log(\"Parsed localStorage data:\", JSON.parse(stored));\r\n\t\t\t}\r\n\t\t\tconsole.log(\"Current state:\", this.state);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"Error debugging storage:\", error);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getConferenceLines(): ConferenceLineTypes[] {\r\n\t\treturn this.state.conferenceLine || [];\r\n\t}\r\n}\r\n\r\n// SDK State Manager Instance\r\nexport const sdkStateManager = new SDKStateManager();\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/**\r\n * EventTracker SDK - A plug-and-play event tracking system\r\n *\r\n * Usage:\r\n * import EventTracker from '@eventtracker/et';\r\n *\r\n * EventTracker.init({\r\n * apiKey: 'your-api-key',\r\n * tenantId: 'tenant_001',\r\n * agentId: 'agent_123',\r\n * sessionId: 'session_456'\r\n * });\r\n *\r\n * EventTracker.logEvent('appointmentBooked', { patientId: 'p123' });\r\n */\r\n\r\nimport { sdkStateManager } from \"./sdk-state\";\r\n\r\nexport interface EventTrackerConfig {\r\n\tapiKey: string;\r\n\ttenantId: string;\r\n\tagentId: string;\r\n\tsessionId?: string;\r\n\tbaseUrl?: string;\r\n\tautoTrack?:\r\n\t\t| boolean\r\n\t\t| {\r\n\t\t\t\tpageVisits?: boolean;\r\n\t\t\t\tclicks?: boolean;\r\n\t\t\t\tforms?: boolean;\r\n\t\t\t\tinputs?: boolean;\r\n\t\t\t\tscrolling?: boolean;\r\n\t\t\t\tperformance?: boolean;\r\n\t\t\t\terrors?: boolean;\r\n\t\t\t\tvisibility?: boolean;\r\n\t\t };\r\n\tretryAttempts?: number;\r\n\tqueueSize?: number;\r\n\tflushInterval?: number;\r\n}\r\n\r\nexport interface EventData {\r\n\t[key: string]: any;\r\n}\r\n\r\nexport interface EventTrackerInstance {\r\n\tinit(config: EventTrackerConfig): Promise<string | null>;\r\n\tlogEvent(eventType: string, eventData?: EventData): Promise<void>;\r\n\tcloseTicket(): Promise<void>;\r\n\tisInitialized(): boolean;\r\n\tgetConfig(): EventTrackerConfig | null;\r\n\tgetTicketId(): string | null;\r\n\tflush(): Promise<void>;\r\n}\r\n\r\nclass EventTrackerSDK implements EventTrackerInstance {\r\n\tprivate config: EventTrackerConfig | null = null;\r\n\tprivate ticketId: string | null = null;\r\n\tprivate baseUrl: string = \"\";\r\n\tprivate eventQueue: Array<{\r\n\t\teventType: string;\r\n\t\teventData?: EventData;\r\n\t\ttimestamp: number;\r\n\t}> = [];\r\n\tprivate isOnline: boolean = true;\r\n\tprivate retryQueue: Array<() => Promise<void>> = [];\r\n\tprivate flushTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n\t/**\r\n\t * Initialize the EventTracker SDK\r\n\t * @param config Configuration object\r\n\t */\r\n\tasync init(config: EventTrackerConfig): Promise<string | null> {\r\n\t\tthis.config = {\r\n\t\t\tautoTrack: true,\r\n\t\t\tretryAttempts: 3,\r\n\t\t\tqueueSize: 100,\r\n\t\t\tflushInterval: 5000,\r\n\t\t\t...config,\r\n\t\t};\r\n\r\n\t\tthis.baseUrl = config.baseUrl || (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n\t\t// Set up online/offline detection\r\n\t\tthis.setupNetworkDetection();\r\n\r\n\t\t// Create ticket and set up auto-tracking\r\n\t\tconst ticket = await this.createTicket();\r\n\r\n\t\t// Start periodic flush\r\n\t\tthis.startPeriodicFlush();\r\n\r\n\t\tconsole.log(\"EventTracker SDK initialized successfully\");\r\n\t\treturn ticket;\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the SDK is initialized\r\n\t */\r\n\tisInitialized(): boolean {\r\n\t\treturn this.config !== null && this.ticketId !== null;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current configuration\r\n\t */\r\n\tgetConfig(): EventTrackerConfig | null {\r\n\t\treturn this.config;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current ticket ID\r\n\t */\r\n\tgetTicketId(): string | null {\r\n\t\treturn this.ticketId;\r\n\t}\r\n\r\n\t/**\r\n\t * Create a new ticket\r\n\t */\r\n\tprivate async createTicket(): Promise<string | null> {\r\n\t\tif (!this.config) {\r\n\t\t\tthrow new Error(\"EventTracker not initialized\");\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await this.makeRequest(\"/api/v1/et/init\", {\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\r\n\t\t\t\t},\r\n\t\t\t\tbody: JSON.stringify({\r\n\t\t\t\t\tagentId: this.config.agentId,\r\n\t\t\t\t\tsessionId: this.config.sessionId,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tsdkStateManager.setInitCheck();\r\n\t\t\t\tthrow new Error(`Failed to initialize: ${response.status} ${response.statusText}`);\r\n\t\t\t}\r\n\r\n\t\t\tconst data = await response.json();\r\n\t\t\tthis.ticketId = data.ticketId;\r\n\r\n\t\t\t// Set up auto-tracking if enabled\r\n\t\t\tif (this.config.autoTrack) {\r\n\t\t\t\tthis.setupAutoTracking();\r\n\t\t\t}\r\n\t\t\treturn this.ticketId;\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"EventTracker initialization failed:\", error);\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Log an event\r\n\t * @param eventType The type of event\r\n\t * @param eventData Optional event data\r\n\t */\r\n\tasync logEvent(eventType: string, eventData?: EventData): Promise<void> {\r\n\t\tif (!this.config || !this.ticketId) {\r\n\t\t\tconsole.warn(\"EventTracker not initialized, skipping event:\", eventType);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst event = {\r\n\t\t\teventType,\r\n\t\t\teventData,\r\n\t\t\ttimestamp: Date.now(),\r\n\t\t};\r\n\r\n\t\t// Add to queue for offline support\r\n\t\tthis.eventQueue.push(event);\r\n\r\n\t\t// Trim queue if too large\r\n\t\tif (this.eventQueue.length > (this.config.queueSize || 100)) {\r\n\t\t\tthis.eventQueue.shift();\r\n\t\t}\r\n\r\n\t\t// Try to send immediately if online\r\n\t\tif (this.isOnline) {\r\n\t\t\ttry {\r\n\t\t\t\tawait this.sendEvent(event);\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.warn(\"Failed to send event, will retry later:\", error);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Send an event to the server\r\n\t */\r\n\tprivate async sendEvent(event: {\r\n\t\teventType: string;\r\n\t\teventData?: EventData;\r\n\t\ttimestamp: number;\r\n\t}): Promise<void> {\r\n\t\tif (!this.config || !this.ticketId) return;\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await this.makeRequest(\"/api/v1/et/event\", {\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\r\n\t\t\t\t},\r\n\t\t\t\tbody: JSON.stringify({\r\n\t\t\t\t\tticketId: this.ticketId,\r\n\t\t\t\t\teventType: event.eventType,\r\n\t\t\t\t\teventData: event.eventData,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthrow new Error(`Failed to log event: ${response.status} ${response.statusText}`);\r\n\t\t\t}\r\n\r\n\t\t\t// Remove from queue if successful\r\n\t\t\tconst index = this.eventQueue.findIndex((e) => e.timestamp === event.timestamp);\r\n\t\t\tif (index > -1) {\r\n\t\t\t\tthis.eventQueue.splice(index, 1);\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"Event logging failed:\", error);\r\n\r\n\t\t\t// Add to retry queue\r\n\t\t\tthis.retryQueue.push(() => this.sendEvent(event));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Close the current ticket\r\n\t */\r\n\tasync closeTicket(): Promise<void> {\r\n\t\tif (!this.config || !this.ticketId) {\r\n\t\t\tthrow new Error(\"EventTracker not initialized\");\r\n\t\t}\r\n\r\n\t\t// Flush any pending events\r\n\t\tawait this.flush();\r\n\r\n\t\ttry {\r\n\t\t\tconst response = await this.makeRequest(\"/api/v1/et/close\", {\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t\t\t\"X-API-Key\": this.config.apiKey,\r\n\t\t\t\t},\r\n\t\t\t\tbody: JSON.stringify({\r\n\t\t\t\t\tticketId: this.ticketId,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\tthrow new Error(`Failed to close ticket: ${response.status} ${response.statusText}`);\r\n\t\t\t}\r\n\r\n\t\t\tthis.ticketId = null;\r\n\t\t\tthis.stopPeriodicFlush();\r\n\r\n\t\t\tconsole.log(\"Ticket closed successfully\");\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"Ticket close failed:\", error);\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Flush all pending events\r\n\t */\r\n\tasync flush(): Promise<void> {\r\n\t\tif (!this.isOnline || this.eventQueue.length === 0) return;\r\n\r\n\t\tconst eventsToFlush = [...this.eventQueue];\r\n\r\n\t\tfor (const event of eventsToFlush) {\r\n\t\t\tawait this.sendEvent(event);\r\n\t\t}\r\n\r\n\t\t// Process retry queue\r\n\t\tconst retryItems = [...this.retryQueue];\r\n\t\tthis.retryQueue = [];\r\n\r\n\t\tfor (const retryFn of retryItems) {\r\n\t\t\ttry {\r\n\t\t\t\tawait retryFn();\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error(\"Retry failed:\", error);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Make an HTTP request with retry logic\r\n\t */\r\n\tprivate async makeRequest(url: string, options: RequestInit): Promise<Response> {\r\n\t\tconst fullUrl = `${this.baseUrl}${url}`;\r\n\t\tconst maxRetries = this.config?.retryAttempts || 3;\r\n\r\n\t\tfor (let attempt = 1; attempt <= maxRetries; attempt++) {\r\n\t\t\ttry {\r\n\t\t\t\tconst response = await fetch(fullUrl, options);\r\n\t\t\t\treturn response;\r\n\t\t\t} catch (error) {\r\n\t\t\t\tif (attempt === maxRetries) {\r\n\t\t\t\t\tthrow error;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Exponential backoff\r\n\t\t\t\tconst delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\r\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"Max retries exceeded\");\r\n\t}\r\n\r\n\t/**\r\n\t * Set up automatic event tracking\r\n\t */\r\n\tprivate setupAutoTracking(): void {\r\n\t\tif (typeof window === \"undefined\" || !this.config?.autoTrack) return;\r\n\r\n\t\tconst autoTrackConfig = this.config.autoTrack === true ? {} : this.config.autoTrack;\r\n\r\n\t\t// Track page visits\r\n\t\tif (autoTrackConfig.pageVisits !== false) {\r\n\t\t\tthis.logEvent(\"pageVisit\", {\r\n\t\t\t\turl: window.location.href,\r\n\t\t\t\ttitle: document.title,\r\n\t\t\t\treferrer: document.referrer,\r\n\t\t\t\tuserAgent: navigator.userAgent,\r\n\t\t\t\tviewport: {\r\n\t\t\t\t\twidth: window.innerWidth,\r\n\t\t\t\t\theight: window.innerHeight,\r\n\t\t\t\t},\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t}).catch((error) => console.warn(\"Failed to track page visit:\", error));\r\n\t\t}\r\n\r\n\t\t// Track clicks on any clickable element\r\n\t\tif (autoTrackConfig.clicks !== false) {\r\n\t\t\tdocument.addEventListener(\"click\", (event) => {\r\n\t\t\t\tconst target = event.target as HTMLElement | HTMLButtonElement;\r\n\r\n\t\t\t\t// Track all clickable elements\r\n\t\t\t\tif (\r\n\t\t\t\t\ttarget.tagName === \"BUTTON\" ||\r\n\t\t\t\t\ttarget.tagName === \"A\" ||\r\n\t\t\t\t\ttarget.onclick ||\r\n\t\t\t\t\ttarget.getAttribute(\"role\") === \"button\" ||\r\n\t\t\t\t\t(target instanceof HTMLButtonElement && target.type === \"button\")\r\n\t\t\t\t) {\r\n\t\t\t\t\tthis.logEvent(\"click\", {\r\n\t\t\t\t\t\telement: target.tagName,\r\n\t\t\t\t\t\ttext: target.textContent?.trim().substring(0, 100), // Limit text length\r\n\t\t\t\t\t\thref: target.getAttribute(\"href\"),\r\n\t\t\t\t\t\tid: target.id,\r\n\t\t\t\t\t\tclassName: target.className,\r\n\t\t\t\t\t\trole: target.getAttribute(\"role\"),\r\n\t\t\t\t\t\tposition: {\r\n\t\t\t\t\t\t\tx: event.clientX,\r\n\t\t\t\t\t\t\ty: event.clientY,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t\t}).catch((error) => console.warn(\"Failed to track click:\", error));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track form submissions\r\n\t\tif (autoTrackConfig.forms !== false) {\r\n\t\t\tdocument.addEventListener(\"submit\", (event) => {\r\n\t\t\t\tconst target = event.target as HTMLFormElement;\r\n\t\t\t\tconst formData = new FormData(target);\r\n\t\t\t\tconst formFields: Record<string, string> = {};\r\n\r\n\t\t\t\t// Convert FormData to plain object\r\n\t\t\t\tformData.forEach((value, key) => {\r\n\t\t\t\t\tformFields[key] = value.toString();\r\n\t\t\t\t});\r\n\r\n\t\t\t\tthis.logEvent(\"formSubmission\", {\r\n\t\t\t\t\tformId: target.id,\r\n\t\t\t\t\taction: target.action,\r\n\t\t\t\t\tmethod: target.method,\r\n\t\t\t\t\tfields: Object.keys(formFields),\r\n\t\t\t\t\tfieldCount: Object.keys(formFields).length,\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t}).catch((error) => console.warn(\"Failed to track form submission:\", error));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track input changes (debounced)\r\n\t\tif (autoTrackConfig.inputs !== false) {\r\n\t\t\tlet inputTimer: ReturnType<typeof setInterval>;\r\n\t\t\tdocument.addEventListener(\"input\", (event) => {\r\n\t\t\t\tconst target = event.target as HTMLInputElement;\r\n\t\t\t\tif (\r\n\t\t\t\t\ttarget.tagName === \"INPUT\" ||\r\n\t\t\t\t\ttarget.tagName === \"TEXTAREA\" ||\r\n\t\t\t\t\ttarget.tagName === \"SELECT\"\r\n\t\t\t\t) {\r\n\t\t\t\t\tclearTimeout(inputTimer);\r\n\t\t\t\t\tinputTimer = setTimeout(() => {\r\n\t\t\t\t\t\tthis.logEvent(\"fieldChange\", {\r\n\t\t\t\t\t\t\telement: target.tagName,\r\n\t\t\t\t\t\t\ttype: target.getAttribute(\"type\"),\r\n\t\t\t\t\t\t\tname: target.getAttribute(\"name\"),\r\n\t\t\t\t\t\t\tid: target.id,\r\n\t\t\t\t\t\t\tvalueLength: target.value?.length || 0,\r\n\t\t\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t\t\t}).catch((error) => console.warn(\"Failed to track field change:\", error));\r\n\t\t\t\t\t}, 1000); // Debounce for 1 second\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track page unload and session duration\r\n\t\tconst sessionStartTime = Date.now();\r\n\t\twindow.addEventListener(\"beforeunload\", () => {\r\n\t\t\tconst sessionDuration = Date.now() - sessionStartTime;\r\n\r\n\t\t\tthis.logEvent(\"pageUnload\", {\r\n\t\t\t\turl: window.location.href,\r\n\t\t\t\tsessionDuration: sessionDuration,\r\n\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t});\r\n\r\n\t\t\t// Close ticket synchronously\r\n\t\t\tif (this.ticketId) {\r\n\t\t\t\tnavigator.sendBeacon(\r\n\t\t\t\t\t`${this.baseUrl}/api/v1/et/close`,\r\n\t\t\t\t\tJSON.stringify({\r\n\t\t\t\t\t\tticketId: this.ticketId,\r\n\t\t\t\t\t})\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Track visibility changes\r\n\t\tif (autoTrackConfig.visibility !== false) {\r\n\t\t\tdocument.addEventListener(\"visibilitychange\", () => {\r\n\t\t\t\tthis.logEvent(\"visibilityChange\", {\r\n\t\t\t\t\thidden: document.hidden,\r\n\t\t\t\t\tvisibilityState: document.visibilityState,\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track errors\r\n\t\tif (autoTrackConfig.errors !== false) {\r\n\t\t\twindow.addEventListener(\"error\", (event) => {\r\n\t\t\t\tthis.logEvent(\"jsError\", {\r\n\t\t\t\t\tmessage: event.message,\r\n\t\t\t\t\tfilename: event.filename,\r\n\t\t\t\t\tlineno: event.lineno,\r\n\t\t\t\t\tcolno: event.colno,\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// Track unhandled promise rejections\r\n\t\t\twindow.addEventListener(\"unhandledrejection\", (event) => {\r\n\t\t\t\tthis.logEvent(\"unhandledRejection\", {\r\n\t\t\t\t\treason: event.reason?.toString(),\r\n\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Track performance metrics (if available)\r\n\t\tif (\r\n\t\t\tautoTrackConfig.performance !== false &&\r\n\t\t\ttypeof window.performance !== \"undefined\" &&\r\n\t\t\twindow.performance.navigation\r\n\t\t) {\r\n\t\t\twindow.addEventListener(\"load\", () => {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tconst navigation = window.performance.navigation;\r\n\t\t\t\t\tconst timing = window.performance.timing;\r\n\r\n\t\t\t\t\tthis.logEvent(\"performanceMetrics\", {\r\n\t\t\t\t\t\tnavigationTime: timing.navigationStart,\r\n\t\t\t\t\t\tloadTime: timing.loadEventEnd - timing.navigationStart,\r\n\t\t\t\t\t\tdomReady: timing.domContentLoadedEventEnd - timing.navigationStart,\r\n\t\t\t\t\t\trenderTime: timing.loadEventEnd - timing.domContentLoadedEventEnd,\r\n\t\t\t\t\t\tnavigationType: navigation.type,\r\n\t\t\t\t\t\tredirectCount: navigation.redirectCount,\r\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\r\n\t\t\t\t\t});\r\n\t\t\t\t}, 1000);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Set up network detection\r\n\t */\r\n\tprivate setupNetworkDetection(): void {\r\n\t\tif (typeof window === \"undefined\") return;\r\n\r\n\t\tthis.isOnline = navigator.onLine;\r\n\r\n\t\twindow.addEventListener(\"online\", () => {\r\n\t\t\tthis.isOnline = true;\r\n\t\t\tconsole.log(\"EventTracker: Back online, flushing queued events\");\r\n\t\t\tthis.flush();\r\n\t\t});\r\n\r\n\t\twindow.addEventListener(\"offline\", () => {\r\n\t\t\tthis.isOnline = false;\r\n\t\t\tconsole.log(\"EventTracker: Offline, queueing events\");\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Start periodic flush timer\r\n\t */\r\n\tprivate startPeriodicFlush(): void {\r\n\t\tif (this.flushTimer) {\r\n\t\t\tclearInterval(this.flushTimer);\r\n\t\t}\r\n\r\n\t\tconst interval = this.config?.flushInterval || 5000;\r\n\t\tthis.flushTimer = setInterval(() => {\r\n\t\t\tthis.flush();\r\n\t\t}, interval);\r\n\t}\r\n\r\n\t/**\r\n\t * Stop periodic flush timer\r\n\t */\r\n\tprivate stopPeriodicFlush(): void {\r\n\t\tif (this.flushTimer) {\r\n\t\t\tclearInterval(this.flushTimer);\r\n\t\t\tthis.flushTimer = null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// Create singleton instance\r\nexport const eventTracker = new EventTrackerSDK();\r\n\r\n// Also export for direct use in browsers\r\nif (typeof window !== \"undefined\") {\r\n\t(window as any).EventTracker = eventTracker;\r\n}\r\n","/**\r\n * @fileoverview 🚪 Logout Hook for CTI SDK\r\n *\r\n * This file contains the useLogout custom hook that provides comprehensive agent logout\r\n * functionality for the CTI SDK. It handles secure logout procedures, state cleanup,\r\n * and storage management with intelligent error handling and proper cleanup.\r\n *\r\n * 🎯 Key Features:\r\n * - 🚪 Secure agent logout with API validation\r\n * - 🗑️ Complete state cleanup and reset\r\n * - 💾 Storage management (localStorage & sessionStorage)\r\n * - ⏳ Loading states and error handling\r\n * - 📊 Real-time state updates\r\n * - 🛡️ Comprehensive error management\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport { useCallback, useState } from \"react\";\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"./sdk-state\"; // 🗃️ Global state manager\r\n\r\n// 📡 HTTP Client - Axios instance for API calls\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n/**\r\n * 🚪 Logout Payload Interface\r\n *\r\n * @interface LogoutPayload\r\n * @description 📊 Defines the structure for agent logout API payload data\r\n * Contains all necessary information for secure agent logout\r\n *\r\n * @properties\r\n * - `action: string` - 🎯 API action type (\"LOGOUTUSER\")\r\n * - `userId: string` - 👤 Agent identifier for logout\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic logout payload\r\n * const logoutPayload: LogoutPayload = {\r\n * action: \"LOGOUTUSER\",\r\n * userId: \"agent123\"\r\n * };\r\n *\r\n * // Usage in component\r\n * const { logout } = useLogout();\r\n * await logout();\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport interface LogoutPayload {\r\n\taction: string; // 🎯 API action type\r\n\tuserId: string; // 👤 Agent identifier\r\n}\r\n\r\n/**\r\n * 🚪 Logout Custom Hook\r\n *\r\n * @function useLogout\r\n * @description 🎯 Custom React hook that provides comprehensive agent logout functionality\r\n * for the CTI SDK. It handles secure logout procedures, complete state cleanup,\r\n * and storage management with intelligent error handling and proper cleanup.\r\n *\r\n * @returns {Object} Hook return object containing:\r\n * - `logout: () => Promise<any>` - 🚪 Logout function\r\n * - `isLoading: boolean` - ⏳ Loading state indicator\r\n * - `isSuccess: boolean` - ✅ Success state indicator\r\n * - `isError: boolean` - ❌ Error state indicator\r\n * - `error: any` - 🛡️ Error object when logout fails\r\n * - `data: any` - 📊 Response data from successful logout\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic usage in a component\r\n * const LogoutButton = () => {\r\n * const {\r\n * logout,\r\n * isLoading,\r\n * isSuccess,\r\n * isError,\r\n * error\r\n * } = useLogout();\r\n *\r\n * const handleLogout = async () => {\r\n * try {\r\n * const result = await logout();\r\n * console.log('🚪 Logout successful:', result);\r\n * // Redirect to login page or handle success\r\n * } catch (err) {\r\n * console.error('❌ Logout failed:', err);\r\n * }\r\n * };\r\n *\r\n * return (\r\n * <button\r\n * onClick={handleLogout}\r\n * disabled={isLoading}\r\n * >\r\n * {isLoading ? 'Logging out...' : 'Logout'}\r\n * </button>\r\n * );\r\n * };\r\n * ```\r\n *\r\n * @features\r\n * - 🚪 Secure agent logout with API validation\r\n * - 🗑️ Complete state cleanup and reset\r\n * - 💾 Storage management (localStorage & sessionStorage)\r\n * - ⏳ Comprehensive loading state management\r\n * - 🛡️ Robust error handling and recovery\r\n * - 📊 Real-time state updates via SDK manager\r\n * - 🔄 Automatic storage cleanup\r\n *\r\n * @logic\r\n * - 🔍 Retrieves agent state from localStorage\r\n * - 📦 Constructs logout API payload\r\n * - 📡 Makes API call to logout agent\r\n * - 🗑️ Clears SDK state manager\r\n * - 💾 Clears all storage (localStorage & sessionStorage)\r\n * - 📊 Handles success/error states\r\n * - ⏳ Manages loading states\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport const useLogout = () => {\r\n\t// =============================================================================\r\n\t// 🎛️ STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Loading State\r\n\t * @description Boolean flag indicating if a logout operation is currently in progress\r\n\t * @type {useState<boolean>} - Loading state for logout operations\r\n\t */\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\t/**\r\n\t * ✅ Success State\r\n\t * @description Boolean flag indicating if the last logout operation was successful\r\n\t * @type {useState<boolean>} - Success state for logout operations\r\n\t */\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\t/**\r\n\t * ❌ Error State Flag\r\n\t * @description Boolean flag indicating if the last logout operation encountered an error\r\n\t * @type {useState<boolean>} - Error state flag for logout operations\r\n\t */\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\t/**\r\n\t * 🛡️ Error Object\r\n\t * @description Contains the error object when a logout operation fails\r\n\t * @type {useState<any>} - Error object storage\r\n\t */\r\n\tconst [error, setError] = useState(null);\r\n\r\n\t/**\r\n\t * 📊 Response Data\r\n\t * @description Contains the response data from successful logout operations\r\n\t * @type {useState<any>} - Response data storage\r\n\t */\r\n\tconst [data, setData] = useState(null);\r\n\r\n\t// =============================================================================\r\n\t// 🚪 LOGOUT FUNCTION\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🚪 Agent Logout Handler\r\n\t *\r\n\t * @function handleLogout\r\n\t * @description 🎯 Handles secure agent logout with comprehensive cleanup procedures.\r\n\t * Retrieves agent state, constructs logout payload, makes API call,\r\n\t * and performs complete state and storage cleanup.\r\n\t *\r\n\t * @returns {Promise<any>} Promise that resolves with API response data or rejects with error\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Perform logout\r\n\t * const result = await logout();\r\n\t *\r\n\t * // Handle the response\r\n\t * if (result) {\r\n\t * console.log('🚪 Logout successful:', result);\r\n\t * // Redirect to login page\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: LOGOUT\r\n\t * - 🎯 Action: \"LOGOUTUSER\"\r\n\t * - 👤 User ID: Agent identifier from state\r\n\t *\r\n\t * @features\r\n\t * - 🔍 Intelligent agent state detection from localStorage\r\n\t * - 📦 Comprehensive API payload construction\r\n\t * - 🚪 Secure logout with API validation\r\n\t * - 🗑️ Complete state cleanup via SDK manager\r\n\t * - 💾 Complete storage cleanup (localStorage & sessionStorage)\r\n\t * - ⏳ Loading state management\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 State updates via SDK manager\r\n\t * - 🔄 Automatic cleanup procedures\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleLogout = useCallback(async () => {\r\n\t\t// 🔍 Retrieve current agent state from localStorage\r\n\t\tconst state = JSON.parse(localStorage.getItem(\"call-control-sdk-state\") ?? \"\");\r\n\r\n\t\t// ⏳ Set loading state to show UI feedback\r\n\t\tsetLoading(true);\r\n\r\n\t\t// 📦 Prepare API payload for agent logout\r\n\t\tconst payload: LogoutPayload = {\r\n\t\t\taction: \"LOGOUTUSER\", // 🎯 API action type\r\n\t\t\tuserId: state.agentId || \"\", // 👤 Agent identifier with fallback\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to logout agent\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.LOGOUT, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🗑️ Clear SDK state manager and reset all state\r\n\t\t\t\tsdkStateManager.clearStorageAndReset();\r\n\t\t\t\t// 💾 Clear all localStorage data\r\n\t\t\t\tlocalStorage.clear();\r\n\t\t\t\t// 💾 Clear all sessionStorage data\r\n\t\t\t\tsessionStorage.clear();\r\n\t\t\t\t// 📊 Store response data\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\t// 🔄 Return response data\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\tsetError(err);\r\n\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []); // 🔄 Empty dependency array for useCallback\r\n\r\n\t// =============================================================================\r\n\t// 🔄 HOOK RETURN OBJECT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📤 Hook Return Object\r\n\t * @description Returns all necessary functions and state for logout functionality\r\n\t * @returns {Object} Complete hook interface\r\n\t */\r\n\treturn {\r\n\t\tlogout: handleLogout, // 🚪 Logout function\r\n\t\tisLoading: loading, // ⏳ Loading state indicator\r\n\t\tisSuccess: success, // ✅ Success state indicator\r\n\t\tisError: isError, // ❌ Error state indicator\r\n\t\terror: error, // 🛡️ Error object\r\n\t\tdata: data, // 📊 Response data\r\n\t};\r\n};\r\n","export const IP = \"10.10.102.42\";\r\nexport const BASE_URL = `http://${IP}:8095`;\r\nexport const WS_BASE_URL = `ws://${IP}:8095`;\r\nexport const VERSION = {\r\n\tv1: \"/api/v1\",\r\n};\r\n\r\nexport const END_POINT = {\r\n\tLOGIN: `${BASE_URL}${VERSION.v1}/cti/login?provider=convox`,\r\n\tREADY_AGENT: `${BASE_URL}${VERSION.v1}/cti/ready-agent?provider=convox`,\r\n\tUPDATE_AGENT_BREAK: `${BASE_URL}${VERSION.v1}/cti/update-agent-status?provider=convox`,\r\n\tCLICK_TO_CALL: `${BASE_URL}${VERSION.v1}/cti/calls?provider=convox`,\r\n\tHOLD_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/hold?provider=convox`,\r\n\tMUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/mute?provider=convox`,\r\n\tUNMUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/unmute-call?provider=convox`,\r\n\tEND_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/end?provider=convox`,\r\n\tLOGOUT: `${BASE_URL}${VERSION.v1}/cti/logout?provider=convox`,\r\n\r\n\tCONFERENCE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference?provider=convox`,\r\n\tCONFERENCE_CALL_HOLD_OR_UN_HOLD: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hold?provider=convox`,\r\n\tCONFERENCE_CALL_MUTE_OT_UN_MUTE: `${BASE_URL}${VERSION.v1}/cti/calls/conference/mute?provider=convox`,\r\n\tCONFERENCE_CALL_END: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup?provider=convox`,\r\n\tCONFERENCE_CALL_END_ALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup/all?provider=convox`,\r\n\tTRANSFER_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/transfer?provider=convox`,\r\n\r\n\tAGENTS_LIST: `${BASE_URL}${VERSION.v1}/cti/users`,\r\n\tPROCESS_LIST: `${BASE_URL}${VERSION.v1}/cti/processes-list`,\r\n\tTRANSFER_TO_DETAILS: `${BASE_URL}${VERSION.v1}/cti/transfer-to-details?provider=convox`,\r\n\r\n\tCALL_HISTORY: `${BASE_URL}${VERSION.v1}/dashboard/call-history`,\r\n\tSENTIMENTAL_ANALYSIS: `${BASE_URL}${VERSION.v1}/users/get_sentiment_analysis`,\r\n};\r\n\r\nexport const WS_END_POINT = {\r\n\tWS: `${WS_BASE_URL}${VERSION.v1}/cti/ws`,\r\n};\r\n","/**\r\n * @fileoverview Axios HTTP Client Configuration\r\n * @description Configured Axios instance for Call Control SDK API communication.\r\n * Provides centralized HTTP client with authentication, error handling, and request/response interceptors.\r\n *\r\n * @author Achala IT Solutions\r\n * @version 1.0.0\r\n * @since 2024\r\n */\r\n\r\nimport axios, { AxiosInstance, AxiosResponse, AxiosError, InternalAxiosRequestConfig } from \"axios\";\r\nimport { BASE_URL } from \"./endPoint\";\r\n\r\n/**\r\n * @constant DEFAULT_TOKEN\r\n * @description Default authentication token for API requests\r\n * @declaration\r\n * ```typescript\r\n * const DEFAULT_TOKEN = \"12345\";\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `string`\r\n *\r\n * @example\r\n * ```typescript\r\n * console.log('Using token:', DEFAULT_TOKEN);\r\n * ```\r\n *\r\n * @return Default authentication token string\r\n *\r\n * @conclusion Temporary token for development - should be replaced with proper authentication in production.\r\n */\r\nconst DEFAULT_TOKEN = \"12345\";\r\n\r\n/**\r\n * @constant REQUEST_TIMEOUT\r\n * @description Default timeout for HTTP requests in milliseconds\r\n * @declaration\r\n * ```typescript\r\n * const REQUEST_TIMEOUT = 60000;\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `number`\r\n *\r\n * @example\r\n * ```typescript\r\n * console.log('Request timeout:', REQUEST_TIMEOUT); // 60000\r\n * ```\r\n *\r\n * @return Timeout value in milliseconds\r\n *\r\n * @conclusion Standard timeout for API requests to prevent hanging connections.\r\n */\r\nconst REQUEST_TIMEOUT = 60000;\r\n\r\n/**\r\n * @function getAuthToken\r\n * @description Retrieves the current authentication token for API requests\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function getAuthToken(): string\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `string`\r\n *\r\n * @example\r\n * ```typescript\r\n * const token = getAuthToken();\r\n * console.log('Current token:', token);\r\n * ```\r\n *\r\n * @return Current authentication token\r\n *\r\n * @conclusion Centralized token retrieval function for consistent authentication.\r\n */\r\nfunction getAuthToken(): string {\r\n\t// TODO: Replace with proper token management (localStorage, sessionStorage, etc.)\r\n\treturn DEFAULT_TOKEN;\r\n}\r\n\r\n/**\r\n * @function createAxiosInstance\r\n * @description Creates a configured Axios instance with interceptors and default settings\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function createAxiosInstance(): AxiosInstance\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `AxiosInstance`\r\n *\r\n * @example\r\n * ```typescript\r\n * const instance = createAxiosInstance();\r\n * instance.get('/api/users').then(response => console.log(response.data));\r\n * ```\r\n *\r\n * @return Configured Axios instance\r\n *\r\n * @conclusion Factory function for creating properly configured Axios instances.\r\n */\r\nfunction createAxiosInstance(): AxiosInstance {\r\n\tconst instance = axios.create({\r\n\t\tbaseURL: BASE_URL,\r\n\t\theaders: {\r\n\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\tAccept: \"application/json\",\r\n\t\t},\r\n\t\ttimeout: REQUEST_TIMEOUT,\r\n\t\twithCredentials: false, // Disable credentials for CORS\r\n\t});\r\n\r\n\t// Request interceptor for authentication\r\n\tinstance.interceptors.request.use(\r\n\t\t(config: InternalAxiosRequestConfig) => {\r\n\t\t\tconst token = getAuthToken();\r\n\r\n\t\t\tif (token && config.headers) {\r\n\t\t\t\tconfig.headers.Authorization = `Bearer ${token}`;\r\n\t\t\t}\r\n\r\n\t\t\t// Add request timestamp for debugging\r\n\t\t\t(config as any).metadata = { startTime: new Date().getTime() };\r\n\r\n\t\t\treturn config;\r\n\t\t},\r\n\t\t(error: AxiosError) => {\r\n\t\t\tconsole.error(\"Request interceptor error:\", error);\r\n\t\t\treturn Promise.reject(error);\r\n\t\t}\r\n\t);\r\n\r\n\t// Response interceptor for error handling\r\n\tinstance.interceptors.response.use(\r\n\t\t(response: AxiosResponse) => {\r\n\t\t\t// Add response time for debugging\r\n\t\t\tconst endTime = new Date().getTime();\r\n\t\t\tconst startTime = (response.config as any).metadata?.startTime;\r\n\t\t\tif (startTime) {\r\n\t\t\t\tconsole.log(`Request to ${response.config.url} took ${endTime - startTime}ms`);\r\n\t\t\t}\r\n\r\n\t\t\treturn response;\r\n\t\t},\r\n\t\tasync (error: AxiosError) => {\r\n\t\t\tconst originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean };\r\n\r\n\t\t\t// Handle 401 Unauthorized errors\r\n\t\t\tif (error.response?.status === 401 && !originalRequest._retry) {\r\n\t\t\t\toriginalRequest._retry = true;\r\n\t\t\t\tconsole.warn(\"Unauthorized request, attempting retry...\");\r\n\r\n\t\t\t\t// TODO: Implement token refresh logic here\r\n\t\t\t\t// const newToken = await refreshToken();\r\n\t\t\t\t// if (newToken) {\r\n\t\t\t\t// originalRequest.headers!.Authorization = `Bearer ${newToken}`;\r\n\t\t\t\t// return instance(originalRequest);\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\r\n\t\t\t// Handle network errors\r\n\t\t\tif (!error.response) {\r\n\t\t\t\tconsole.error(\"Network error:\", error.message);\r\n\t\t\t\terror.message = \"Network error: Please check your internet connection\";\r\n\t\t\t}\r\n\r\n\t\t\t// Handle server errors\r\n\t\t\tif (error.response && error.response.status >= 500) {\r\n\t\t\t\tconsole.error(\"Server error:\", error.response.status, error.response.data);\r\n\t\t\t\terror.message = \"Server error: Please try again later\";\r\n\t\t\t}\r\n\r\n\t\t\treturn Promise.reject(error);\r\n\t\t}\r\n\t);\r\n\r\n\treturn instance;\r\n}\r\n\r\n/**\r\n * @constant axiosInstance\r\n * @description Pre-configured Axios instance for Call Control SDK API communication\r\n *\r\n * @declaration\r\n * ```typescript\r\n * const axiosInstance: AxiosInstance = createAxiosInstance();\r\n * ```\r\n *\r\n * @requiredParams None\r\n *\r\n * @returnType `AxiosInstance`\r\n *\r\n * @example\r\n * ```typescript\r\n * import axiosInstance from './axios';\r\n *\r\n * // Make GET request\r\n * const response = await axiosInstance.get('/api/calls');\r\n *\r\n * // Make POST request\r\n * const result = await axiosInstance.post('/api/calls', callData);\r\n * ```\r\n *\r\n * @return Configured Axios instance ready for use\r\n *\r\n * @conclusion Main HTTP client for all Call Control SDK API operations.\r\n */\r\nconst axiosInstance: AxiosInstance = createAxiosInstance();\r\n\r\nexport default axiosInstance;\r\n","/**\r\n * @fileoverview 📞 End Call Hook for CTI SDK\r\n *\r\n * This file contains the useEndCall custom hook that provides comprehensive call termination\r\n * functionality for the CTI SDK. It handles call disposition capture, callback scheduling,\r\n * and proper call cleanup with intelligent state management and error handling.\r\n *\r\n * 🎯 Key Features:\r\n * - 📞 Call termination with disposition tracking\r\n * - 📅 Callback scheduling and follow-up management\r\n * - 🔄 Intelligent state cleanup and reset\r\n * - ⏳ Loading states and error handling\r\n * - 📊 Real-time state updates\r\n * - 🛡️ Comprehensive error management\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport { useCallback, useState } from \"react\";\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"./sdk-state\"; // 🗃️ Global state manager\r\n\r\n// 📡 HTTP Client - Axios instance for API calls\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n/**\r\n * 📞 End Call Payload Interface\r\n *\r\n * @interface EndCallPayload\r\n * @description 📊 Defines the structure for call termination API payload data\r\n * Contains all necessary information for ending a call with proper disposition\r\n *\r\n * @properties\r\n * - `action: string` - 🎯 API action type (\"ENDCALL\")\r\n * - `disposition: string` - 📝 Call outcome classification\r\n * - `userId: string` - 👤 Agent identifier\r\n * - `processid: string` - ⚙️ Process identifier\r\n * - `mobile_number: string` - 📱 Customer phone number\r\n * - `set_followUp: string` - 📅 Follow-up requirement (\"Y\" or \"N\")\r\n * - `callback_date: string` - 📅 Scheduled callback date\r\n * - `callback_hrs: string` - 🕐 Scheduled callback hour\r\n * - `callback_mins: string` - 🕐 Scheduled callback minute\r\n * - `refno?: string` - 🔗 Optional call reference number\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic end call payload\r\n * const endCallPayload: EndCallPayload = {\r\n * action: \"ENDCALL\",\r\n * disposition: \"RES\",\r\n * userId: \"agent123\",\r\n * processid: \"proc001\",\r\n * mobile_number: \"1234567890\",\r\n * set_followUp: \"N\",\r\n * callback_date: \"\",\r\n * callback_hrs: \"\",\r\n * callback_mins: \"\"\r\n * };\r\n *\r\n * // With callback scheduling\r\n * const endCallWithCallback: EndCallPayload = {\r\n * action: \"ENDCALL\",\r\n * disposition: \"RES\",\r\n * userId: \"agent123\",\r\n * processid: \"proc001\",\r\n * mobile_number: \"1234567890\",\r\n * set_followUp: \"Y\",\r\n * callback_date: \"2024-01-15\",\r\n * callback_hrs: \"14\",\r\n * callback_mins: \"30\"\r\n * };\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport interface EndCallPayload {\r\n\taction: string; // 🎯 API action type\r\n\tdisposition: string; // 📝 Call outcome classification\r\n\tuserId: string; // 👤 Agent identifier\r\n\tprocessid: string; // ⚙️ Process identifier\r\n\tmobile_number: string; // 📱 Customer phone number\r\n\tset_followUp: string; // 📅 Follow-up requirement\r\n\tcallback_date: string; // 📅 Scheduled callback date\r\n\tcallback_hrs: string; // 🕐 Scheduled callback hour\r\n\tcallback_mins: string; // 🕐 Scheduled callback minute\r\n\trefno?: string; // 🔗 Optional call reference number\r\n}\r\n\r\n/**\r\n * 📞 End Call Custom Hook\r\n *\r\n * @function useEndCall\r\n * @description 🎯 Custom React hook that provides comprehensive call termination functionality\r\n * for the CTI SDK. It handles call disposition capture, callback scheduling,\r\n * and proper call cleanup with intelligent state management and error handling.\r\n *\r\n * @returns {Object} Hook return object containing:\r\n * - `handleEndCall: (data: EndCallData) => Promise<any>` - 📞 Call termination function\r\n * - `isLoading: boolean` - ⏳ Loading state indicator\r\n * - `isSuccess: boolean` - ✅ Success state indicator\r\n * - `isError: boolean` - ❌ Error state indicator\r\n * - `error: any` - 🛡️ Error object when call fails\r\n * - `data: any` - 📊 Response data from successful calls\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic usage in a component\r\n * const EndCallButton = () => {\r\n * const {\r\n * handleEndCall,\r\n * isLoading,\r\n * isSuccess,\r\n * isError,\r\n * error\r\n * } = useEndCall();\r\n *\r\n * const endCall = async () => {\r\n * try {\r\n * const result = await handleEndCall({\r\n * disposition: \"RES\",\r\n * followUp: \"N\"\r\n * });\r\n * console.log('📞 Call ended:', result);\r\n * } catch (err) {\r\n * console.error('❌ End call failed:', err);\r\n * }\r\n * };\r\n *\r\n * return (\r\n * <button\r\n * onClick={endCall}\r\n * disabled={isLoading}\r\n * >\r\n * {isLoading ? 'Ending...' : 'End Call'}\r\n * </button>\r\n * );\r\n * };\r\n * ```\r\n *\r\n * @features\r\n * - 🎯 Comprehensive call termination with disposition tracking\r\n * - 📅 Callback scheduling and follow-up management\r\n * - 🔄 Intelligent state cleanup and reset\r\n * - ⏳ Comprehensive loading state management\r\n * - 🛡️ Robust error handling and recovery\r\n * - 📊 Real-time state updates via SDK manager\r\n * - 🔄 Automatic call state management\r\n *\r\n * @logic\r\n * - 🔍 Retrieves agent state from localStorage\r\n * - 📦 Constructs comprehensive API payload\r\n * - 📡 Makes API call to end call\r\n * - 🔄 Updates SDK state manager\r\n * - 📊 Handles success/error states\r\n * - ⏳ Manages loading states\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport const useEndCall = () => {\r\n\t// =============================================================================\r\n\t// 🎛️ STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Loading State\r\n\t * @description Boolean flag indicating if a call termination operation is currently in progress\r\n\t * @type {useState<boolean>} - Loading state for call termination operations\r\n\t */\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\t/**\r\n\t * ✅ Success State\r\n\t * @description Boolean flag indicating if the last call termination operation was successful\r\n\t * @type {useState<boolean>} - Success state for call termination operations\r\n\t */\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\t/**\r\n\t * ❌ Error State Flag\r\n\t * @description Boolean flag indicating if the last call termination operation encountered an error\r\n\t * @type {useState<boolean>} - Error state flag for call termination operations\r\n\t */\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\t/**\r\n\t * 🛡️ Error Object\r\n\t * @description Contains the error object when a call termination operation fails\r\n\t * @type {useState<any>} - Error object storage\r\n\t */\r\n\tconst [error, setError] = useState(null);\r\n\r\n\t/**\r\n\t * 📊 Response Data\r\n\t * @description Contains the response data from successful call termination operations\r\n\t * @type {useState<any>} - Response data storage\r\n\t */\r\n\tconst [data, setData] = useState(null);\r\n\r\n\t// =============================================================================\r\n\t// 📞 CALL TERMINATION FUNCTION\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Call Termination Handler\r\n\t *\r\n\t * @function handleEndCall\r\n\t * @description 🎯 Handles call termination with comprehensive disposition tracking and\r\n\t * callback scheduling. Constructs a complete API payload with agent state\r\n\t * information and call disposition data, then makes the termination request.\r\n\t *\r\n\t * @param {Object} data - 📊 Call termination data object containing:\r\n\t * - `disposition?: string` - 📝 Call outcome classification (default: \"RES\")\r\n\t * - `followUp?: string` - 📅 Follow-up requirement (default: \"N\")\r\n\t * - `callbackDate?: string` - 📅 Scheduled callback date (default: \"\")\r\n\t * - `callbackHrs?: string` - 🕐 Scheduled callback hour (default: \"\")\r\n\t * - `callbackMins?: string` - 🕐 Scheduled callback minute (default: \"\")\r\n\t *\r\n\t * @returns {Promise<any>} Promise that resolves with API response data or rejects with error\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // End call with basic disposition\r\n\t * const result = await handleEndCall({\r\n\t * disposition: \"RES\",\r\n\t * followUp: \"N\"\r\n\t * });\r\n\t *\r\n\t * // End call with callback scheduling\r\n\t * const result = await handleEndCall({\r\n\t * disposition: \"RES\",\r\n\t * followUp: \"Y\",\r\n\t * callbackDate: \"2024-01-15\",\r\n\t * callbackHrs: \"14\",\r\n\t * callbackMins: \"30\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: END_CALL\r\n\t * - 🎯 Action: \"ENDCALL\"\r\n\t * - 📝 Disposition: Call outcome classification\r\n\t * - 📅 Follow-up: Callback requirement\r\n\t * - 🕐 Callback: Scheduled callback time\r\n\t *\r\n\t * @features\r\n\t * - 🔍 Intelligent agent state detection from localStorage\r\n\t * - 📦 Comprehensive API payload construction\r\n\t * - 📞 Call termination with disposition tracking\r\n\t * - 📅 Callback scheduling and follow-up management\r\n\t * - ⏳ Loading state management\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 State updates via SDK manager\r\n\t * - 🔄 Automatic call state cleanup\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleEndCall = useCallback(\r\n\t\tasync (data: {\r\n\t\t\tdisposition?: string; // 📝 Call outcome classification\r\n\t\t\tfollowUp?: string; // 📅 Follow-up requirement\r\n\t\t\tcallbackDate?: string; // 📅 Scheduled callback date\r\n\t\t\tcallbackHrs?: string; // 🕐 Scheduled callback hour\r\n\t\t\tcallbackMins?: string; // 🕐 Scheduled callback minute\r\n\t\t}) => {\r\n\t\t\t// 🔍 Retrieve current agent state from localStorage\r\n\t\t\tconst state = JSON.parse(localStorage.getItem(\"call-control-sdk-state\") ?? \"\");\r\n\r\n\t\t\t// ⏳ Set loading state to show UI feedback\r\n\t\t\tsetLoading(true);\r\n\r\n\t\t\t// 📦 Prepare comprehensive API payload for call termination\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"ENDCALL\", // 🎯 API action type\r\n\t\t\t\tuserId: state?.agentId, // 👤 Agent identifier\r\n\t\t\t\tprocessid: state?.process?.process_id?.toString() ?? \"\", // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state?.process?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t\tcallreferenceid: state?.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tmobile_number: state?.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\r\n\t\t\t\tdisposition: data?.disposition ?? \"RES\", // 📝 Call outcome (default: Resolved)\r\n\t\t\t\tset_followUp: data?.followUp ?? \"N\", // 📅 Follow-up requirement (default: No)\r\n\t\t\t\tcallback_date: data?.callbackDate ?? \"\", // 📅 Callback date (default: empty)\r\n\t\t\t\tcallback_hrs: data?.callbackHrs ?? \"\", // 🕐 Callback hour (default: empty)\r\n\t\t\t\tcallback_mins: data?.callbackMins ?? \"\", // 🕐 Callback minute (default: empty)\r\n\t\t\t\tendcall_type: \"CLOSE\", // 🔚 End call type\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to terminate call\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.END_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t// 🔄 Update SDK state manager to end call\r\n\t\t\t\t\tsdkStateManager.endCall();\r\n\t\t\t\t\t// 📊 Store response data\r\n\t\t\t\t\tsetData(res?.data);\r\n\t\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\t\tsetSuccess(true);\r\n\t\t\t\t\t// 🔄 Return response data\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\t\tsetIsError(true);\r\n\t\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\t\tsetError(err);\r\n\t\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[] // 🔄 Empty dependency array for useCallback\r\n\t);\r\n\r\n\t// =============================================================================\r\n\t// 🔄 HOOK RETURN OBJECT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📤 Hook Return Object\r\n\t * @description Returns all necessary functions and state for call termination functionality\r\n\t * @returns {Object} Complete hook interface\r\n\t */\r\n\treturn {\r\n\t\thandleEndCall, // 📞 Call termination function\r\n\t\tisLoading: loading, // ⏳ Loading state indicator\r\n\t\tisSuccess: success, // ✅ Success state indicator\r\n\t\tisError: isError, // ❌ Error state indicator\r\n\t\terror: error, // 🛡️ Error object\r\n\t\tdata: data, // 📊 Response data\r\n\t};\r\n};\r\n","/**\r\n * @fileoverview 📞 Click-to-Call Hook for CTI SDK\r\n *\r\n * This file contains the useClickToCall custom hook that provides comprehensive call initiation\r\n * functionality for the CTI SDK. It handles both regular calls and conference calls with\r\n * intelligent state management and error handling.\r\n *\r\n * 🎯 Key Features:\r\n * - 📱 Regular call initiation for idle agents\r\n * - 👥 Conference call initiation for agents on calls\r\n * - 🔄 Intelligent state detection and routing\r\n * - ⏳ Loading states and error handling\r\n * - 📊 Real-time state updates\r\n * - 🛡️ Comprehensive error management\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport { useCallback, useState } from \"react\";\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"./sdk-state\"; // 🗃️ Global state manager\r\n\r\n/**\r\n * 📱 Start Call Payload Interface\r\n *\r\n * @interface StartCallPayload\r\n * @description 📊 Defines the structure for call initiation payload data\r\n * Contains the mobile number required to initiate a call\r\n *\r\n * @properties\r\n * - `mobileNumber: string` - 📱 The phone number to call (required)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic call initiation payload\r\n * const callPayload: StartCallPayload = {\r\n * mobileNumber: \"1234567890\"\r\n * };\r\n *\r\n * // Usage in component\r\n * const { handleStartCall } = useClickToCall();\r\n * await handleStartCall({ mobileNumber: \"9876543210\" });\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport interface StartCallPayload {\r\n\tmobileNumber: string; // 📱 Phone number to call\r\n}\r\n\r\n/**\r\n * 📞 Click-to-Call Custom Hook\r\n *\r\n * @function useClickToCall\r\n * @description 🎯 Custom React hook that provides comprehensive call initiation functionality\r\n * for the CTI SDK. It intelligently handles both regular calls and conference calls\r\n * based on the current agent state, with proper loading states and error handling.\r\n *\r\n * @returns {Object} Hook return object containing:\r\n * - `handleStartCall: (data: StartCallPayload) => Promise<any>` - 📞 Call initiation function\r\n * - `isLoading: boolean` - ⏳ Loading state indicator\r\n * - `isSuccess: boolean` - ✅ Success state indicator\r\n * - `isError: boolean` - ❌ Error state indicator\r\n * - `error: any` - 🛡️ Error object when call fails\r\n * - `data: any` - 📊 Response data from successful calls\r\n *\r\n * @example\r\n * ```typescript\r\n * // Basic usage in a component\r\n * const CallButton = () => {\r\n * const {\r\n * handleStartCall,\r\n * isLoading,\r\n * isSuccess,\r\n * isError,\r\n * error\r\n * } = useClickToCall();\r\n *\r\n * const makeCall = async () => {\r\n * try {\r\n * const result = await handleStartCall({\r\n * mobileNumber: \"1234567890\"\r\n * });\r\n * console.log('📞 Call initiated:', result);\r\n * } catch (err) {\r\n * console.error('❌ Call failed:', err);\r\n * }\r\n * };\r\n *\r\n * return (\r\n * <button\r\n * onClick={makeCall}\r\n * disabled={isLoading}\r\n * >\r\n * {isLoading ? 'Calling...' : 'Make Call'}\r\n * </button>\r\n * );\r\n * };\r\n * ```\r\n *\r\n * @features\r\n * - 🎯 Intelligent call routing based on agent state\r\n * - 📱 Regular call initiation for idle agents\r\n * - 👥 Conference call initiation for busy agents\r\n * - ⏳ Comprehensive loading state management\r\n * - 🛡️ Robust error handling and recovery\r\n * - 📊 Real-time state updates via SDK manager\r\n * - 🔄 Automatic conference dialog management\r\n *\r\n * @logic\r\n * - 🔍 Checks agent status from localStorage state\r\n * - 📞 Initiates regular call if agent is IDLE\r\n * - 👥 Initiates conference call if agent is ONCALL\r\n * - ⚠️ Shows alert if agent is not ready\r\n * - 🔄 Updates conference line state for conference calls\r\n * - 🎭 Opens conference dialog for conference calls\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport const useClickToCall = () => {\r\n\t// =============================================================================\r\n\t// 🎛️ STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Loading State\r\n\t * @description Boolean flag indicating if a call operation is currently in progress\r\n\t * @type {useState<boolean>} - Loading state for call operations\r\n\t */\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\t/**\r\n\t * ✅ Success State\r\n\t * @description Boolean flag indicating if the last call operation was successful\r\n\t * @type {useState<boolean>} - Success state for call operations\r\n\t */\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\t/**\r\n\t * ❌ Error State Flag\r\n\t * @description Boolean flag indicating if the last call operation encountered an error\r\n\t * @type {useState<boolean>} - Error state flag for call operations\r\n\t */\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\t/**\r\n\t * 🛡️ Error Object\r\n\t * @description Contains the error object when a call operation fails\r\n\t * @type {useState<any>} - Error object storage\r\n\t */\r\n\tconst [error, setError] = useState(null);\r\n\r\n\t/**\r\n\t * 📊 Response Data\r\n\t * @description Contains the response data from successful call operations\r\n\t * @type {useState<any>} - Response data storage\r\n\t */\r\n\tconst [data, setData] = useState(null);\r\n\r\n\t// =============================================================================\r\n\t// 📞 CALL INITIATION FUNCTION\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Call Initiation Handler\r\n\t *\r\n\t * @function handleStartCall\r\n\t * @description 🎯 Handles call initiation with intelligent routing based on agent state.\r\n\t * For idle agents, initiates a regular call. For agents on calls, initiates\r\n\t * a conference call on an available line. Includes comprehensive error\r\n\t * handling and state management.\r\n\t *\r\n\t * @param {StartCallPayload} data - 📊 Call initiation data containing mobile number\r\n\t * @param {string} data.mobileNumber - 📱 The phone number to call\r\n\t *\r\n\t * @returns {Promise<any>} Promise that resolves with API response data or rejects with error\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Initiate a call\r\n\t * const result = await handleStartCall({\r\n\t * mobileNumber: \"1234567890\"\r\n\t * });\r\n\t *\r\n\t * // Handle the response\r\n\t * if (result) {\r\n\t * console.log('📞 Call initiated successfully:', result);\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: CLICK_TO_CALL (for regular calls)\r\n\t * - 📡 Endpoint: CONFERENCE_CALL (for conference calls)\r\n\t * - 🎯 Action: \"CALL\" (for regular calls)\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\" (for conference calls)\r\n\t *\r\n\t * @features\r\n\t * - 🔍 Intelligent agent state detection\r\n\t * - 📞 Regular call initiation for idle agents\r\n\t * - 👥 Conference call initiation for busy agents\r\n\t * - ⏳ Loading state management\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 State updates via SDK manager\r\n\t * - 🎭 Conference dialog management\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleStartCall = useCallback(async (data: StartCallPayload) => {\r\n\t\t// 🔍 Retrieve current agent state from localStorage\r\n\t\tconst state = JSON.parse(localStorage.getItem(\"call-control-sdk-state\") ?? \"\");\r\n\r\n\t\t// ⏳ Set loading state to show UI feedback\r\n\t\tsetLoading(true);\r\n\r\n\t\t// 🔄 Regular Call Logic - Agent is IDLE\r\n\t\tif (state?.callData?.status === \"IDLE\") {\r\n\t\t\t// 📦 Prepare API payload for regular call initiation\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"CALL\", // 🎯 API action type\r\n\t\t\t\tuserId: state?.agentId, // 👤 Agent identifier\r\n\t\t\t\tphone_number: data?.mobileNumber, // 📱 Target phone number\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to initiate regular call\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.CLICK_TO_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t// 📊 Store response data\r\n\t\t\t\t\tsetData(res?.data);\r\n\t\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\t\tsetSuccess(true);\r\n\t\t\t\t\t// 🔄 Return response data\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\t\tsetIsError(true);\r\n\t\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\t\tsetError(err);\r\n\t\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t}\r\n\t\t// 🔄 Conference Call Logic - Agent is ONCALL\r\n\t\telse if (state?.callData?.status === \"ONCALL\") {\r\n\t\t\t// 🔍 Find available conference line (not line 1 and not already in use)\r\n\t\t\tconst line_used = state?.conferenceLine\r\n\t\t\t\t?.filter((each: any) => each.line !== 1) // 📞 Exclude line 1 (internal)\r\n\t\t\t\t?.find((each: any) => each.status === \"IDLE\" && !each?.isCallStart); // 🔍 Find idle line\r\n\r\n\t\t\t// 📦 Prepare API payload for conference call initiation\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\t\toperation: `CALL${line_used.line}`, // 🔧 Operation with line number\r\n\t\t\t\tline_used: String(line_used.line), // 📞 Line identifier as string\r\n\t\t\t\tthirdparty_no: data?.mobileNumber, // 📱 Target phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to initiate conference call\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t// 📊 Store response data\r\n\t\t\t\t\tsetData(res?.data);\r\n\t\t\t\t\t// ✅ Mark operation as successful\r\n\t\t\t\t\tsetSuccess(true);\r\n\t\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\t\tsdkStateManager.setConferenceLine({\r\n\t\t\t\t\t\t...line_used, // 📋 Spread existing line data\r\n\t\t\t\t\t\tisCallStart: true, // ✅ Mark call as started\r\n\t\t\t\t\t\tstatus: \"ONCALL\", // 📊 Update status\r\n\t\t\t\t\t\tphone: data?.mobileNumber, // 📱 Store phone number\r\n\t\t\t\t\t});\r\n\t\t\t\t\t// 🎭 Open conference dialog for management\r\n\t\t\t\t\tsdkStateManager.setOpenConferenceDialog(true);\r\n\t\t\t\t\t// 🔄 Return response data\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t// ❌ Mark operation as failed\r\n\t\t\t\t\tsetIsError(true);\r\n\t\t\t\t\t// 🛡️ Store error object\r\n\t\t\t\t\tsetError(err);\r\n\t\t\t\t\t// 🔄 Return error response data\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t}\r\n\t\t// ⚠️ Agent Not Ready Logic\r\n\t\telse {\r\n\t\t\t// 🚨 Show alert for agent not ready state\r\n\t\t\talert(\"Agent is not ready\");\r\n\t\t}\r\n\t}, []);\r\n\r\n\t// =============================================================================\r\n\t// 🔄 HOOK RETURN OBJECT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📤 Hook Return Object\r\n\t * @description Returns all necessary functions and state for call initiation functionality\r\n\t * @returns {Object} Complete hook interface\r\n\t */\r\n\treturn {\r\n\t\thandleStartCall, // 📞 Call initiation function\r\n\t\tisLoading: loading, // ⏳ Loading state indicator\r\n\t\tisSuccess: success, // ✅ Success state indicator\r\n\t\tisError: isError, // ❌ Error state indicator\r\n\t\terror: error, // 🛡️ Error object\r\n\t\tdata: data, // 📊 Response data\r\n\t};\r\n};\r\n","/**\r\n * @fileoverview CallControlPanel Component\r\n * @description Main wrapper component for the Call Control SDK interface.\r\n * Provides the primary entry point for integrating CTI functionality into React applications.\r\n *\r\n * @author Achala IT Solutions\r\n * @version 1.0.0\r\n * @since 2024\r\n */\r\n\r\nimport { memo, useCallback } from \"react\";\r\nimport type { CallControlPanelProps } from \"../../types\";\r\nimport { CallControls } from \"./callControls\";\r\nimport { SDKProvider } from \"./SDKProvider\";\r\n\r\n/**\r\n * @function CallControlPanel\r\n * @description Main wrapper component that provides the complete call control interface.\r\n * Wraps the CallControls component with necessary providers and context.\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function CallControlPanel(props: CallControlPanelProps): JSX.Element\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `props: CallControlPanelProps` - Component props including optional data change callback\r\n *\r\n * @returnType `JSX.Element`\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <CallControlPanel />\r\n *\r\n * // With data change callback\r\n * <CallControlPanel\r\n * onDataChange={(callData) => {\r\n * console.log('Call data updated:', callData);\r\n * // Handle call data changes\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @return React component providing complete call control interface\r\n *\r\n * @conclusion Primary component for integrating CTI functionality into React applications.\r\n */\r\nexport const CallControlPanel = memo<CallControlPanelProps>(\r\n ({ onDataChange }) => {\r\n /**\r\n * @function handleDataChange\r\n * @description Internal handler for call data changes with error handling\r\n * @param data - Updated call data\r\n */\r\n const handleDataChange = useCallback(\r\n (data: any) => {\r\n try {\r\n if (onDataChange && typeof onDataChange === \"function\") {\r\n onDataChange(data);\r\n }\r\n } catch (error) {\r\n console.error(\r\n \"Error in CallControlPanel data change handler:\",\r\n error\r\n );\r\n }\r\n },\r\n [onDataChange]\r\n );\r\n\r\n return (\r\n <SDKProvider>\r\n <CallControls onDataChange={handleDataChange} />\r\n </SDKProvider>\r\n );\r\n }\r\n);\r\n\r\n// Set display name for debugging\r\nCallControlPanel.displayName = \"CallControlPanel\";\r\n\r\n/**\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n","/**\r\n * @fileoverview 📞 Comprehensive Call Control Interface Component\r\n *\r\n * This file contains the main CallControls component that provides a complete telephony interface\r\n * for contact center agents. It includes all necessary controls for managing phone calls,\r\n * real-time updates via WebSocket, draggable UI, and comprehensive state management.\r\n *\r\n * 🎯 Key Features:\r\n * - 📱 Complete call control operations (dial, hold, mute, transfer, conference, end)\r\n * - 🔄 Real-time WebSocket integration for live updates\r\n * - 👤 Agent status management and break controls\r\n * - 🎨 Draggable interface with Material-UI components\r\n * - 📊 Call duration tracking and disposition management\r\n * - 🔧 Configurable button states and functionality\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// 📦 Material-UI Icon Imports - UI icons for call control buttons\r\nimport {\r\n\tCallEnd, // 📞 End call icon\r\n\tClose, // ❌ Close dialog icon\r\n\tDragIndicator, // 🖱️ Drag handle icon\r\n\tGroup, // 👥 Conference call icon\r\n\tKeyboardArrowDown, // ⬇️ Dropdown arrow icon\r\n\tLayers, // 📚 Queue layers icon\r\n\tMic, // 🎤 Microphone icon\r\n\tMicOff, // 🔇 Muted microphone icon\r\n\tPause, // ⏸️ Hold call icon\r\n\tPending, // ⏳ Pending status icon\r\n\tPhone, // 📱 Phone call icon\r\n\tPlayArrow, // ▶️ Resume call icon\r\n\tSupportAgent, // 🎧 Agent ready icon\r\n\tTransferWithinAStation, // 🔄 Call transfer icon\r\n\tUpcoming, // 📅 Upcoming calls icon\r\n\tWifiCalling3, // 📶 Dial call icon\r\n} from \"@mui/icons-material\";\r\n\r\n// 🎨 Material-UI Component Imports - Core UI components\r\nimport {\r\n\tBox, // 📦 Container component\r\n\tButton, // 🔘 Interactive button component\r\n\tChip, // 🏷️ Status chip component\r\n\tCircularProgress, // ⏳ Loading spinner component\r\n\tFade, // ✨ Fade animation component\r\n\tIconButton, // 🔘 Icon-only button component\r\n\tMenu, // 📋 Dropdown menu component\r\n\tMenuItem, // 📝 Menu item component\r\n\tPaper, // 📄 Elevated surface component\r\n\tTextField, // 📝 Text input component\r\n\tTooltip, // 💡 Hover tooltip component\r\n\tTypography, // 📝 Text component\r\n\tuseTheme, // 🎨 Theme hook\r\n} from \"@mui/material\";\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\n// 🏷️ Type Definitions - TypeScript interfaces and types\r\nimport type { CallControlPanelProps, ConferenceLineTypes } from \"../../types\";\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { sdkStateManager } from \"../hooks/sdk-state\"; // 🗃️ Global state manager\r\nimport { useDraggable } from \"../hooks/useDraggable\"; // 🖱️ Draggable functionality hook\r\nimport { useSDKState } from \"../hooks/useSDKState\"; // 📊 SDK state hook\r\n\r\n// 🌐 API Configuration - Endpoint and WebSocket configuration\r\nimport { END_POINT, IP, WS_END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\nimport { usePostRequest } from \"../services/request\"; // 📡 HTTP request hook\r\n\r\n// 🎭 Dialog Components - Modal dialogs for various operations\r\nimport {\r\n\tCallHistoryDialog, // 📋 Call history dialog\r\n\tCallTransferDialog, // 🔄 Call transfer dialog\r\n\tConferenceDialog, // 👥 Conference call dialog\r\n\tEndCallDispositionDialog, // 📝 Call disposition dialog\r\n\tProcessorListDialog, // ⚙️ Process selection dialog\r\n} from \"./dialog\";\r\n\r\n// 🎨 Styling - Component styling utilities\r\nimport useStyles from \"./styles\"; // 🎨 Custom styles hook\r\n\r\n// 🔧 Service Imports - External service integrations\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\nimport { useToast } from \"../services/toastMessage\"; // 🍞 Toast notification service\r\n\r\n/**\r\n * 🔄 Utility Function: Conference Data Combiner\r\n *\r\n * @function getCombineConfrenceData\r\n * @description 🔗 Combines conference line data with real-time API response data to create unified conference state\r\n *\r\n * @param {ConferenceLineTypes[]} conferenceData - 📊 Array of existing conference line configurations\r\n * @param {any} apiData - 📡 Real-time API response containing conference status updates\r\n * @param {any} data - 📞 Additional call data including phone numbers and status\r\n *\r\n * @returns {ConferenceLineTypes[]} 🔄 Updated conference data array with merged information\r\n *\r\n * @example\r\n * ```typescript\r\n * const conferenceLines = [\r\n * { line: 1, status: \"IDLE\", phone: \"\" },\r\n * { line: 2, status: \"IDLE\", phone: \"\" }\r\n * ];\r\n * const apiResponse = {\r\n * line_2_status: \"ONCALL\",\r\n * line_2_phonenumber: \"1234567890\"\r\n * };\r\n * const callData = { status: \"ONCALL\", phone_number: \"0987654321\" };\r\n *\r\n * const result = getCombineConfrenceData(conferenceLines, apiResponse, callData);\r\n * // Returns updated conference data with merged status and phone numbers\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nconst getCombineConfrenceData = (\r\n\tconferenceData: ConferenceLineTypes[], // 📊 Input conference data\r\n\tapiData: any, // 📡 API response data\r\n\tdata: any // 📞 Call data\r\n) => {\r\n\t// 🔄 Map through each conference line and merge with API data\r\n\tconst updatedConferenceData = conferenceData.map((item) => {\r\n\t\t// 🎯 Handle primary line (line 1) - use main call data\r\n\t\tif (item?.line === 1) {\r\n\t\t\treturn {\r\n\t\t\t\tline: 1, // 📞 Primary line identifier\r\n\t\t\t\tstatus: data?.status ?? \"\", // 📊 Current call status\r\n\t\t\t\ttype: \"internal\" as \"internal\" | \"external\" | \"\", // 🏷️ Call type classification\r\n\t\t\t\tphone: data?.phone_number ?? \"\", // 📱 Phone number\r\n\t\t\t\tisMute: false, // 🔇 Mute state (default off)\r\n\t\t\t\tisHold: false, // ⏸️ Hold state (default off)\r\n\t\t\t\tisMergeCall: false, // 🔗 Merge state (default off)\r\n\t\t\t\tisCallStart: true, // ✅ Call active flag\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\t// 🔍 Handle secondary lines - use API response data\r\n\t\t\tconst statusKey = `line_${item.line}_status`; // 🔑 Status key for this line\r\n\t\t\tconst phoneKey = `line_${item.line}_phonenumber`; // 🔑 Phone key for this line\r\n\t\t\treturn {\r\n\t\t\t\t...item, // 📋 Spread existing line data\r\n\t\t\t\tstatus: apiData[statusKey] ?? \"IDLE\", // 📊 Update status from API\r\n\t\t\t\tphone: apiData[phoneKey] !== \"0\" ? apiData[phoneKey] : \"\", // 📱 Update phone if valid\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n\r\n\t// 🔄 Return the updated conference data array\r\n\treturn updatedConferenceData;\r\n};\r\n\r\n/**\r\n * ⏱️ Utility Function: Call Duration Formatter\r\n *\r\n * @function formatDuration\r\n * @description 🕐 Converts seconds into a formatted MM:SS time string for displaying call duration\r\n * Uses padding to ensure consistent two-digit formatting for professional appearance\r\n *\r\n * @param {number} seconds - ⏰ The duration in seconds to format (must be non-negative)\r\n *\r\n * @returns {string} 📊 Formatted time string in MM:SS format with zero-padding\r\n *\r\n * @example\r\n * ```typescript\r\n * formatDuration(125); // Returns \"02:05\" (2 minutes, 5 seconds)\r\n * formatDuration(3661); // Returns \"61:01\" (61 minutes, 1 second)\r\n * formatDuration(0); // Returns \"00:00\" (zero duration)\r\n * formatDuration(59); // Returns \"00:59\" (59 seconds)\r\n * ```\r\n *\r\n * @features\r\n * - 🔢 Zero-padded minutes and seconds for consistent display\r\n * - ⏱️ Handles any duration from 0 to 99:59 format\r\n * - 🎨 Professional time display format\r\n * - ⚡ Optimized with useCallback for performance\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nconst formatDuration = useCallback((seconds: number): string => {\r\n\t// 🧮 Calculate minutes by dividing seconds by 60 and flooring\r\n\tconst mins = Math.floor(seconds / 60);\r\n\r\n\t// 🔢 Calculate remaining seconds using modulo operator\r\n\tconst secs = seconds % 60;\r\n\r\n\t// 📊 Return formatted string with zero-padding for consistent display\r\n\treturn `${mins.toString().padStart(2, \"0\")}:${secs.toString().padStart(2, \"0\")}`;\r\n}, []); // 🔄 Empty dependency array for stable reference\r\n\r\n/**\r\n * =============================================================================\r\n * 🎯 MAIN COMPONENT: CallControls\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * 📞 Main Call Control Interface Component\r\n *\r\n * @function CallControls\r\n * @description 🎧 Comprehensive React component that renders a complete call control panel interface\r\n * for CTI (Computer Telephony Integration) systems. This component provides contact center\r\n * agents with all necessary tools to manage phone calls effectively.\r\n *\r\n * 🚀 Core Capabilities:\r\n * - 📱 Complete call operations (dial, hold, mute, transfer, conference, end)\r\n * - 🔄 Real-time WebSocket integration for live status updates\r\n * - 👤 Agent status management and break controls\r\n * - 🎨 Draggable interface with Material-UI components\r\n * - 📊 Call duration tracking and disposition management\r\n * - 🔧 Configurable button states and functionality\r\n * - 📞 Soft phone iframe integration\r\n * - 🍞 Toast notifications for user feedback\r\n *\r\n * @param {CallControlPanelProps} props - Component properties\r\n * @param {Function} [props.onDataChange] - 📡 Optional callback for call data updates\r\n *\r\n * @returns {JSX.Element} 🎨 Complete call control interface UI\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage\r\n * <CallControls />\r\n *\r\n * // With data change callback\r\n * <CallControls\r\n * onDataChange={(callData) => {\r\n * console.log('📞 Call status updated:', callData.status);\r\n * updateExternalSystem(callData);\r\n * }}\r\n * />\r\n * ```\r\n *\r\n * @features\r\n * - 🎯 Complete telephony control interface\r\n * - 🔄 Real-time call status synchronization\r\n * - 🖱️ Draggable floating window support\r\n * - 📱 Mobile-responsive design\r\n * - 🎨 Material-UI theming support\r\n * - ⚡ Optimized performance with React hooks\r\n * - 🔧 Highly configurable via SDK config\r\n *\r\n * @since 1.0.0\r\n * @version 5.4.8\r\n * @author CTI SDK Team\r\n */\r\nexport function CallControls({ onDataChange }: CallControlPanelProps) {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🎨 Material-UI Theme Object\r\n\t * @description Provides access to Material-UI theme for consistent styling across components\r\n\t * @type {Theme} - Material-UI theme object containing colors, spacing, typography, etc.\r\n\t */\r\n\tconst theme = useTheme();\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all call control functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t/**\r\n\t * 🍞 Toast Notification Service\r\n\t * @description Provides user feedback notifications for success, error, and info messages\r\n\t * @type {Function} - Toast notification function with message and type parameters\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * 🎨 Dynamic Style Objects\r\n\t * @description Style objects that adapt based on SDK configuration for different button states\r\n\t * @type {Object} - Contains disabled, enabled, and outlined style configurations\r\n\t */\r\n\tconst { disabled, enabled, outlined } = useStyles({\r\n\t\tdisabled: state.sdkConfig?.disabled || {}, // 🔴 Disabled button styles\r\n\t\tenabled: state.sdkConfig?.enabled || {}, // 🟢 Enabled button styles\r\n\t\toutlined: state.sdkConfig?.outlined || {}, // ⚪ Outlined button styles\r\n\t});\r\n\r\n\t// =============================================================================\r\n\t// 🔗 WEBSOCKET & REFS MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🌐 WebSocket Connection Reference\r\n\t * @description Persistent reference to WebSocket connection for real-time call updates\r\n\t * @type {useRef<WebSocket | null>} - WebSocket instance reference\r\n\t * @purpose Manages WebSocket connection lifecycle and message handling\r\n\t */\r\n\tconst webSocketRef = useRef<WebSocket | null>(null);\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ UI STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📋 Queue Counts Menu Anchor\r\n\t * @description Controls positioning and visibility of queue counts dropdown menu\r\n\t * @type {useState<null | HTMLElement>} - HTML element reference for menu positioning\r\n\t * @purpose Manages queue counts menu anchor element for proper positioning\r\n\t */\r\n\tconst [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n\t/**\r\n\t * 📞 Soft Phone Iframe Visibility\r\n\t * @description Controls whether the soft phone iframe is visible to the user\r\n\t * @type {useState<boolean>} - Boolean flag for iframe visibility\r\n\t * @purpose Shows/hides the integrated soft phone interface based on call state\r\n\t */\r\n\tconst [showIframe, setShowIframe] = useState<boolean>(true);\r\n\r\n\t/**\r\n\t * 👤 Agent Status Menu Anchor\r\n\t * @description Controls positioning and visibility of agent status dropdown menu\r\n\t * @type {useState<null | HTMLElement>} - HTML element reference for menu positioning\r\n\t * @purpose Manages agent status menu anchor element for break selection\r\n\t */\r\n\tconst [statusAnchorEl, setStatusAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n\t/**\r\n\t * 📱 Dialer Menu Anchor\r\n\t * @description Controls positioning and visibility of phone dialer dropdown menu\r\n\t * @type {useState<null | HTMLElement>} - HTML element reference for menu positioning\r\n\t * @purpose Manages dialer menu anchor element for phone number input\r\n\t */\r\n\tconst [dialerAnchorEl, setDialerAnchorEl] = useState<null | HTMLElement>(null);\r\n\r\n\t/**\r\n\t * 📝 Call Disposition Dialog State\r\n\t * @description Controls visibility of end call disposition form dialog\r\n\t * @type {useState<boolean>} - Boolean flag for dialog visibility\r\n\t * @purpose Shows/hides call disposition form when ending calls for proper call closure\r\n\t */\r\n\tconst [openCallDisposition, setOpenCallDisposition] = useState(false);\r\n\r\n\t/**\r\n\t * ⚙️ Processor Selection Dialog State\r\n\t * @description Controls visibility of process selection dialog during initialization\r\n\t * @type {useState<boolean>} - Boolean flag for dialog visibility\r\n\t * @purpose Shows/hides process selection interface when multiple processes are available\r\n\t */\r\n\tconst [openProcessorDialog, setOpenProcessorDialog] = useState(false);\r\n\r\n\t/**\r\n\t * 📋 Call History Dialog State\r\n\t * @description Controls visibility of call history dialog (currently unused feature)\r\n\t * @type {useState<boolean>} - Boolean flag for dialog visibility\r\n\t * @purpose Reserved for future call history functionality\r\n\t */\r\n\tconst [openCallHistoryDialog, setOpenCallHistoryDialog] = useState(false);\r\n\r\n\t/**\r\n\t * 📊 Available Process List\r\n\t * @description Stores the list of available processes for the current agent\r\n\t * @type {useState<null>} - Process list data (will be typed properly in future)\r\n\t * @purpose Holds process data for selection dialog when multiple processes exist\r\n\t */\r\n\tconst [processList, setProcessList] = useState(null);\r\n\r\n\t/**\r\n\t * 📱 Phone Number Input State\r\n\t * @description Stores the current phone number being entered in the dialer\r\n\t * @type {useState<string>} - String value of phone number input\r\n\t * @purpose Manages phone number input in dialer interface for outbound calls\r\n\t */\r\n\tconst [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n\r\n\t/**\r\n\t * ⏱️ Call Duration Timer State\r\n\t * @description Tracks the current call duration in seconds for display\r\n\t * @type {useState<number>} - Number representing seconds elapsed\r\n\t * @purpose Real-time call duration tracking and display for billing/reporting\r\n\t */\r\n\tconst [callDuration, setCallDuration] = useState(0);\r\n\r\n\t// =============================================================================\r\n\t// 🖱️ DRAGGABLE FUNCTIONALITY SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🖱️ Main Control Panel Draggable Hook\r\n\t * @description Provides draggable functionality for the main call control panel\r\n\t * @purpose Enables floating window behavior for the call control interface\r\n\t * @returns {Object} Draggable state and handlers for main panel\r\n\t */\r\n\tconst {\r\n\t\tposition, // 📍 Current panel position coordinates\r\n\t\tisDragging, // 🖱️ Whether panel is currently being dragged\r\n\t\tdragRef, // 🔗 Reference to draggable element\r\n\t\thandleMouseDown, // 🖱️ Mouse drag start handler\r\n\t\thandleTouchStart, // 👆 Touch drag start handler\r\n\t} = useDraggable(\r\n\t\tstate.controlPanelPosition, // 📍 Initial position from state\r\n\t\t(newPosition) => sdkStateManager.setControlPanelPosition(newPosition) // 💾 Position update callback\r\n\t);\r\n\r\n\t/**\r\n\t * 🖱️ Soft Phone Iframe Draggable Hook\r\n\t * @description Provides independent draggable functionality for the soft phone iframe\r\n\t * @purpose Allows separate positioning of the soft phone interface from main panel\r\n\t * @returns {Object} Draggable state and handlers for iframe panel\r\n\t */\r\n\tconst {\r\n\t\tposition: iframePosition, // 📍 Current iframe position coordinates\r\n\t\tisDragging: iframeIsDragging, // 🖱️ Whether iframe is currently being dragged\r\n\t\tdragRef: iframeDragRef, // 🔗 Reference to draggable iframe element\r\n\t\thandleMouseDown: iframeHandleMouseDown, // 🖱️ Mouse drag start handler for iframe\r\n\t\thandleTouchStart: iframeHandleTouchStart, // 👆 Touch drag start handler for iframe\r\n\t} = useDraggable(\r\n\t\tstate.iframePosition, // 📍 Initial iframe position from state\r\n\t\t(newPosition) => sdkStateManager.setIframePosition(newPosition) // 💾 Iframe position update callback\r\n\t);\r\n\r\n\t// =============================================================================\r\n\t// 📡 API HOOKS & REQUEST MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Click-to-Call API Hook\r\n\t * @description Custom hook for initiating outbound calls via API\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Handles click-to-call functionality with automatic UI cleanup\r\n\t * @features Automatic phone number clearing and dialer menu closure on success\r\n\t */\r\n\tconst [clickToCall, { isLoading: clickToCallLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"CALL\")\r\n\t\tphone_number: string; // 📱 Target phone number\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t}>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsetPhoneNumber(\"\"); // 🧹 Clear phone input\r\n\t\t\tsetDialerAnchorEl(null); // ❌ Close dialer menu\r\n\t\t},\r\n\t});\r\n\r\n\t/**\r\n\t * ⏸️ Hold/Unhold Call API Hook\r\n\t * @description Custom hook for managing call hold functionality\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Manages call hold/unhold operations with state synchronization\r\n\t * @features Automatic hold state toggling and error handling\r\n\t */\r\n\tconst [holdOrUnHold, { isLoading: holdOrUnHoldLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"HOLD\" or \"UNHOLD\")\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t\trefno?: string; // 🔗 Optional call reference number\r\n\t}>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setHolding(!state.isHolding); // 🔄 Toggle hold state\r\n\t\t},\r\n\t\tonError: (error) => {\r\n\t\t\tconsole.log(\"❌ Hold operation error:\", error); // 📝 Log errors\r\n\t\t},\r\n\t});\r\n\r\n\t/**\r\n\t * 🔇 Mute/Unmute Call API Hook\r\n\t * @description Custom hook for managing microphone mute functionality\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Handles microphone mute/unmute operations with state synchronization\r\n\t * @features Automatic mute state toggling and error handling\r\n\t */\r\n\tconst [muteOrUnMute, { isLoading: muteOrUnMuteLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"MUTE\" or \"UNMUTE\")\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t\trefno?: string; // 🔗 Optional call reference number\r\n\t}>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setMuted(!state.isMuted); // 🔄 Toggle mute state\r\n\t\t},\r\n\t\tonError: (error) => {\r\n\t\t\tconsole.log(\"❌ Mute operation error:\", error); // 📝 Log errors\r\n\t\t},\r\n\t});\r\n\r\n\t/**\r\n\t * 🎧 Agent Ready Status API Hook\r\n\t * @description Custom hook for setting agent availability status\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Manages agent ready status for incoming call availability\r\n\t * @features Simple API call without complex state management\r\n\t */\r\n\tconst [readyAgentStatus, { isLoading: agentReadyLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"READYAGENT\")\r\n\t\trefno?: string; // 🔗 Optional reference number\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t}>();\r\n\r\n\t/**\r\n\t * ☕ Agent Break Status API Hook\r\n\t * @description Custom hook for updating agent break/lunch status\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Handles agent break status updates (Lunch, Tea, etc.)\r\n\t * @features Break type management for workforce optimization\r\n\t */\r\n\tconst [updateAgentStatus, { isLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"AGENTBREAK\")\r\n\t\tbreak_type: string; // ☕ Break type (Lunch, Tea, etc.)\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t}>();\r\n\r\n\t/**\r\n\t * 📞 End Call with Disposition API Hook\r\n\t * @description Custom hook for ending calls with complete disposition data\r\n\t * @type {usePostRequest} - HTTP POST request hook with loading states\r\n\t * @purpose Manages call termination with comprehensive disposition tracking\r\n\t * @features Complete call closure with callback scheduling and follow-up management\r\n\t */\r\n\tconst [endCall, { isLoading: endCallLoading }] = usePostRequest<{\r\n\t\taction: string; // 🎯 API action type (\"ENDCALL\")\r\n\t\tdisposition: string; // 📝 Call outcome classification\r\n\t\tuserId: string; // 👤 Agent identifier\r\n\t\tprocessid: string; // ⚙️ Process identifier\r\n\t\tmobile_number: string; // 📱 Customer phone number\r\n\t\tset_followUp: string; // 📅 Follow-up requirement\r\n\t\tcallback_date: string; // 📅 Scheduled callback date\r\n\t\tcallback_hrs: string; // 🕐 Scheduled callback hour\r\n\t\tcallback_mins: string; // 🕐 Scheduled callback minute\r\n\t\trefno?: string; // 🔗 Optional call reference number\r\n\t}>();\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ EVENT HANDLERS - UI INTERACTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ❌ Queue Counts Menu Close Handler\r\n\t *\r\n\t * @function handleCloseQueueCounts\r\n\t * @description 🚪 Closes the queue counts dropdown menu by clearing the anchor element state\r\n\t * This is triggered when the user clicks outside the menu or presses escape\r\n\t *\r\n\t * @returns {void} No return value - updates component state to close menu\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when menu should be closed\r\n\t * handleCloseQueueCounts();\r\n\t * ```\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleCloseQueueCounts = () => {\r\n\t\tsetAnchorEl(null); // 🧹 Clear anchor element to close menu\r\n\t};\r\n\r\n\t/**\r\n\t * 📱 Dialer Interface Open Handler\r\n\t *\r\n\t * @function handleOpenDialer\r\n\t * @description 📞 Opens the phone dialer interface by setting the dialer anchor element and updating\r\n\t * the agent status to \"dial\". Also ensures the soft phone iframe is visible for dialing.\r\n\t *\r\n\t * @param {React.MouseEvent<HTMLElement>} event - 🖱️ Mouse event from the dial button click\r\n\t *\r\n\t * @returns {void} No return value - updates multiple component states\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when dial button is clicked\r\n\t * <IconButton onClick={handleOpenDialer}>\r\n\t * <WifiCalling3 />\r\n\t * </IconButton>\r\n\t * ```\r\n\t *\r\n\t * @effects\r\n\t * - 📞 Shows the soft phone iframe\r\n\t * - 📍 Sets dialer menu anchor position\r\n\t * - 👤 Updates agent status to \"dial\"\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleOpenDialer = (event: React.MouseEvent<HTMLElement>) => {\r\n\t\tsetShowIframe(true); // 📞 Show soft phone interface\r\n\t\tsetDialerAnchorEl(event.currentTarget); // 📍 Position dialer menu\r\n\t\tsdkStateManager.setStatus(\"dial\"); // 👤 Set agent status to dial\r\n\t};\r\n\r\n\t/**\r\n\t * ❌ Dialer Interface Close Handler\r\n\t *\r\n\t * @function handleCloseDialer\r\n\t * @description 🚪 Closes the dialer interface and resets the agent status to \"idle\" if not currently\r\n\t * on a call. Clears the dialer anchor element state while preserving call status.\r\n\t *\r\n\t * @returns {void} No return value - updates component state to close dialer and reset status\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when dialer menu should be closed\r\n\t * handleCloseDialer();\r\n\t * ```\r\n\t *\r\n\t * @logic\r\n\t * - 🔍 Check if agent is not currently on a call\r\n\t * - 👤 Reset status to \"idle\" if not on call\r\n\t * - ❌ Close dialer menu regardless\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleCloseDialer = () => {\r\n\t\t// 🔍 Only reset status if not currently on a call\r\n\t\tif (state.status !== \"on call\") {\r\n\t\t\tsdkStateManager.setStatus(\"idle\"); // 👤 Reset to idle status\r\n\t\t}\r\n\r\n\t\tsetDialerAnchorEl(null); // ❌ Close dialer menu\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleOpenAgentStatus\r\n\t * @description Opens the agent status menu by setting the status anchor element to the clicked element's position. This allows agents to select break types.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleOpenAgentStatus = (event: React.MouseEvent<HTMLElement>) => {\r\n\t * setStatusAnchorEl(event.currentTarget);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * - `event: React.MouseEvent<HTMLElement>` - Mouse event from the status chip click\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when status chip is clicked\r\n\t * <Chip onClick={handleOpenAgentStatus} />\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - updates component state to show status menu\r\n\t *\r\n\t * @conclusion\r\n\t * Opens the dropdown menu for agents to select their break status (Lunch, Tea, etc.).\r\n\t */\r\n\r\n\tconst handleOpenAgentStatus = (event: React.MouseEvent<HTMLElement>) => {\r\n\t\tsetStatusAnchorEl(event.currentTarget);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleCloseAgentStatus\r\n\t * @description Closes the agent status menu by clearing the status anchor element state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleCloseAgentStatus = () => {\r\n\t * setStatusAnchorEl(null);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when status menu should be closed\r\n\t * handleCloseAgentStatus();\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - updates component state to close status menu\r\n\t *\r\n\t * @conclusion\r\n\t * Simple state management function for closing the agent status dropdown menu.\r\n\t */\r\n\r\n\tconst handleCloseAgentStatus = () => {\r\n\t\tsetStatusAnchorEl(null);\r\n\t};\r\n\r\n\t// =============================================================================\r\n\t// 📡 CALL CONTROL API FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🎧 Agent Ready Status Handler\r\n\t *\r\n\t * @function handleAgentReady\r\n\t * @description 👤 Sets the agent status to \"ready\" by making an API call to the ready agent endpoint.\r\n\t * This allows the agent to receive incoming calls and be available for the queue.\r\n\t *\r\n\t * @returns {void} No return value - makes API call to set agent as ready\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when agent ready button is clicked\r\n\t * <Button onClick={handleAgentReady}>\r\n\t * <SupportAgent />\r\n\t * </Button>\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"READYAGENT\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 📡 Endpoint: READY_AGENT\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleAgentReady = () => {\r\n\t\t// 📦 Prepare API payload for ready agent request\r\n\t\tconst payload = {\r\n\t\t\taction: \"READYAGENT\", // 🎯 API action type\r\n\t\t\tuserId: state.agentId, // 👤 Current agent identifier\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to set agent as ready\r\n\t\treadyAgentStatus(END_POINT.READY_AGENT, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleUpdateAgentStatus\r\n\t * @description Updates the agent's break status by making an API call with the selected break type. Closes the status menu after selection.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleUpdateAgentStatus = (status: string) => {\r\n\t * setStatusAnchorEl(null);\r\n\t * const payload = {\r\n\t * action: \"AGENTBREAK\",\r\n\t * break_type: status,\r\n\t * userId: state.agentId,\r\n\t * };\r\n\t * updateAgentStatus(END_POINT.UPDATE_AGENT_BREAK, payload);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * - `status: string` - The break type (e.g., \"Lunch\", \"Tea\")\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when break type is selected\r\n\t * handleUpdateAgentStatus(\"Lunch\");\r\n\t * handleUpdateAgentStatus(\"Tea\");\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call and closes status menu\r\n\t *\r\n\t * @conclusion\r\n\t * Enables agents to set their break status for proper workforce management.\r\n\t */\r\n\tconst handleUpdateAgentStatus = (status: string) => {\r\n\t\tsetStatusAnchorEl(null);\r\n\t\tconst payload = {\r\n\t\t\taction: \"AGENTBREAK\",\r\n\t\t\tbreak_type: status,\r\n\t\t\tuserId: state.agentId,\r\n\t\t};\r\n\t\tupdateAgentStatus(END_POINT.UPDATE_AGENT_BREAK, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * 📞 Outbound Call Initiator\r\n\t *\r\n\t * @function handleStartCall\r\n\t * @description 📱 Initiates an outbound call by validating the phone number and making an API call\r\n\t * to the click-to-call endpoint. Shows validation errors for invalid numbers.\r\n\t *\r\n\t * @param {string} number - 📱 The phone number to call (must be exactly 10 digits)\r\n\t *\r\n\t * @returns {void} No return value - validates input and makes API call if valid\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when call button is clicked in dialer\r\n\t * handleStartCall(\"1234567890\");\r\n\t * ```\r\n\t *\r\n\t * @validation\r\n\t * - 🔢 Must be exactly 10 digits long\r\n\t * - 📱 Must contain only numeric characters\r\n\t * - 🍞 Shows toast notification for invalid numbers\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"CALL\"\r\n\t * - 📱 Phone Number: Validated input\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 📡 Endpoint: CLICK_TO_CALL\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleStartCall = (number: string) => {\r\n\t\t// 🔢 Validate phone number length (must be 10 digits)\r\n\t\tif (number.length !== 10) {\r\n\t\t\tshowToast(\"Invalid phone number\", \"error\"); // 🍞 Show error toast\r\n\t\t} else if (!/^\\d+$/.test(number)) {\r\n\t\t\t// 📱 Validate numeric characters only\r\n\t\t\tshowToast(\"Invalid phone number\", \"error\"); // 🍞 Show error toast\r\n\t\t} else {\r\n\t\t\t// 📦 Prepare API payload for outbound call\r\n\t\t\tconst payload = {\r\n\t\t\t\taction: \"CALL\", // 🎯 API action type\r\n\t\t\t\tphone_number: number, // 📱 Target phone number\r\n\t\t\t\tuserId: state.agentId, // 👤 Current agent identifier\r\n\t\t\t};\r\n\r\n\t\t\t// 📡 Make API call to initiate outbound call\r\n\t\t\tclickToCall(END_POINT.CLICK_TO_CALL, payload);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleHoldToggle\r\n\t * @description Toggles the hold status of the current call by making an API call with the appropriate action (HOLD or UNHOLD) based on current state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleHoldToggle = () => {\r\n\t * const payload = {\r\n\t * action: state.isHolding ? \"UNHOLD\" : \"HOLD\",\r\n\t * userId: state.agentId,\r\n\t * };\r\n\t * holdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (uses component state for current hold status)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when hold button is clicked\r\n\t * <Button onClick={handleHoldToggle}>\r\n\t * {state.isHolding ? <PlayArrow /> : <Pause />}\r\n\t * </Button>\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call to toggle hold status\r\n\t *\r\n\t * @conclusion\r\n\t * Essential function for call management, allowing agents to pause and resume calls.\r\n\t */\r\n\r\n\tconst handleHoldToggle = () => {\r\n\t\tconst payload = {\r\n\t\t\taction: state.isHolding ? \"UNHOLD\" : \"HOLD\",\r\n\t\t\tuserId: state.agentId,\r\n\t\t};\r\n\t\tholdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleMuteToggle\r\n\t * @description Toggles the mute status of the current call by making an API call with the appropriate action (MUTE or UNMUTE) based on current state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleMuteToggle = () => {\r\n\t * const payload = {\r\n\t * action: state.isMuted ? \"UNMUTE\" : \"MUTE\",\r\n\t * userId: state.agentId,\r\n\t * };\r\n\t * muteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (uses component state for current mute status)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when mute button is clicked\r\n\t * <Button onClick={handleMuteToggle}>\r\n\t * {state.isMuted ? <MicOff /> : <Mic />}\r\n\t * </Button>\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call to toggle mute status\r\n\t *\r\n\t * @conclusion\r\n\t * Critical function for audio control during calls, allowing agents to mute/unmute their microphone.\r\n\t */\r\n\r\n\tconst handleMuteToggle = () => {\r\n\t\tconst payload = {\r\n\t\t\taction: state.isMuted ? \"UNMUTE\" : \"MUTE\",\r\n\t\t\tuserId: state.agentId,\r\n\t\t};\r\n\r\n\t\tmuteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleEndCall\r\n\t * @description Ends the current call with disposition data by making an API call to the end call endpoint. Processes callback information and updates component state.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleEndCall = (data: {\r\n\t * disposition: { label: string; value: string };\r\n\t * followUp: { label: string; value: string };\r\n\t * callbackDate: string;\r\n\t * callbackHrs: string;\r\n\t * callbackMins: string;\r\n\t * }) => {\r\n\t * console.log(\"data\", data);\r\n\t * const payload = {\r\n\t * action: \"ENDCALL\",\r\n\t * userId: state.agentId,\r\n\t * processid: state.process?.process_id?.toString() ?? \"\",\r\n\t * process_name: state.process?.process_name ?? \"\",\r\n\t * callreferenceid: state.callData?.convox_id ?? \"\",\r\n\t * mobile_number: state.callData?.phone_number ?? \"\",\r\n\t * disposition: data?.disposition?.value ?? \"\",\r\n\t * set_followUp: data?.followUp?.value ?? \"\",\r\n\t * callback_date: data?.callbackDate ?? \"\",\r\n\t * callback_hrs: data?.callbackHrs ?? \"\",\r\n\t * callback_mins: data?.callbackMins ?? \"\",\r\n\t * endcall_type: \"CLOSE\",\r\n\t * };\r\n\t * setPhoneNumber(\"\");\r\n\t * endCall(END_POINT.END_CALL, payload);\r\n\t * sdkStateManager.endCall();\r\n\t * setOpenCallDisposition(false);\r\n\t * };\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * - `data: object` - Disposition data containing:\r\n\t * - `disposition: { label: string; value: string }` - Call outcome classification\r\n\t * - `followUp: { label: string; value: string }` - Follow-up requirements\r\n\t * - `callbackDate: string` - Scheduled callback date\r\n\t * - `callbackHrs: string` - Scheduled callback hour\r\n\t * - `callbackMins: string` - Scheduled callback minute\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when end call disposition is submitted\r\n\t * handleEndCall({\r\n\t * disposition: { label: \"Resolved\", value: \"RESOLVED\" },\r\n\t * followUp: { label: \"None\", value: \"NONE\" },\r\n\t * callbackDate: \"2024-01-15\",\r\n\t * callbackHrs: \"14\",\r\n\t * callbackMins: \"30\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - makes API call and updates component state:\r\n\t * - Clears phone number input\r\n\t * - Makes end call API request\r\n\t * - Updates SDK state to end call\r\n\t * - Closes disposition dialog\r\n\t *\r\n\t * @conclusion\r\n\t * Comprehensive function for properly ending calls with complete disposition tracking and callback scheduling.\r\n\t */\r\n\r\n\tconst handleEndCall = (data: {\r\n\t\tdisposition: { label: string; value: string };\r\n\t\tfollowUp: { label: string; value: string };\r\n\t\tcallbackDate: string;\r\n\t\tcallbackHrs: string;\r\n\t\tcallbackMins: string;\r\n\t}) => {\r\n\t\tconsole.log(\"data\", data);\r\n\t\tconst payload = {\r\n\t\t\taction: \"ENDCALL\",\r\n\t\t\tuserId: state.agentId,\r\n\t\t\tprocessid: state.process?.process_id?.toString() ?? \"\",\r\n\t\t\tprocess_name: state.process?.process_name ?? \"\",\r\n\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\",\r\n\t\t\tmobile_number: state.callData?.phone_number ?? \"\",\r\n\r\n\t\t\tdisposition: data?.disposition?.value ?? \"\",\r\n\t\t\tset_followUp: data?.followUp?.value ?? \"\",\r\n\t\t\tcallback_date: data?.callbackDate ?? \"\",\r\n\t\t\tcallback_hrs: data?.callbackHrs ?? \"\",\r\n\t\t\tcallback_mins: data?.callbackMins ?? \"\",\r\n\t\t\tendcall_type: \"CLOSE\",\r\n\t\t};\r\n\t\tsetPhoneNumber(\"\");\r\n\t\tendCall(END_POINT.END_CALL, payload);\r\n\t\tsdkStateManager.endCall();\r\n\t\tsetOpenCallDisposition(false);\r\n\t};\r\n\r\n\t// =============================================================================\r\n\t// 🔄 EFFECT HOOKS - LIFECYCLE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🛡️ Page Unload Protection Effect\r\n\t *\r\n\t * @hook useEffect - Before Unload Handler\r\n\t * @description 🚫 Sets up a beforeunload event listener to prevent users from accidentally\r\n\t * leaving the page during active calls. This helps preserve call sessions\r\n\t * and prevents data loss.\r\n\t *\r\n\t * @dependencies [] - Empty dependency array for component mount only\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs on component mount\r\n\t * // Prevents page unload during active calls\r\n\t * ```\r\n\t *\r\n\t * @effects\r\n\t * - 🛡️ Prevents accidental page navigation during calls\r\n\t * - 💾 Preserves call session data\r\n\t * - 🧹 Cleans up event listener on unmount\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// 🛡️ Define beforeunload handler to prevent accidental navigation\r\n\t\tconst handleBeforeUnload = (e: BeforeUnloadEvent) => {\r\n\t\t\te.preventDefault(); // 🚫 Prevent default unload behavior\r\n\t\t};\r\n\r\n\t\t// 📡 Add event listener for beforeunload\r\n\t\twindow.addEventListener(\"beforeunload\", handleBeforeUnload);\r\n\r\n\t\t// 🧹 Cleanup function to remove event listener\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener(\"beforeunload\", handleBeforeUnload);\r\n\t\t};\r\n\t}, []); // 🔄 Empty dependency array - runs only on mount/unmount\r\n\r\n\t/**\r\n\t * ⏱️ Call Duration Timer Effect\r\n\t *\r\n\t * @hook useEffect - Call Duration Timer\r\n\t * @description 🕐 Manages a real-time timer that tracks and displays call duration.\r\n\t * Updates every second when a call is active and resets when the call ends.\r\n\t *\r\n\t * @dependencies [state.callData.status] - Runs when call status changes\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when call status changes\r\n\t * // Updates callDuration state every second during active calls\r\n\t * ```\r\n\t *\r\n\t * @logic\r\n\t * - 🔍 Check if call status is \"ONCALL\"\r\n\t * - ⏰ Start interval timer if call is active\r\n\t * - 🧮 Calculate elapsed time from call start\r\n\t * - 🔄 Update duration state every second\r\n\t * - 🧹 Clear interval when call ends\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\tlet interval: ReturnType<typeof setInterval>; // ⏰ Interval reference\r\n\r\n\t\t// 🔍 Check if call is currently active\r\n\t\tif (state.callData.status && state.callData.status === \"ONCALL\") {\r\n\t\t\t// ⏰ Start timer interval for active call\r\n\t\t\tinterval = setInterval(() => {\r\n\t\t\t\t// 🧮 Calculate elapsed time in seconds\r\n\t\t\t\tconst elapsed = Math.floor((Date.now() - state.callStartTime!) / 1000);\r\n\t\t\t\tsetCallDuration(elapsed); // 📊 Update duration state\r\n\t\t\t}, 1000); // 🔄 Update every second\r\n\t\t} else {\r\n\t\t\t// 🔄 Reset duration when call is not active\r\n\t\t\tsetCallDuration(0);\r\n\t\t}\r\n\r\n\t\t// 🧹 Cleanup function to clear interval\r\n\t\treturn () => {\r\n\t\t\tif (interval) clearInterval(interval);\r\n\t\t};\r\n\t}, [state.callData.status]); // 🔄 Dependency on call status\r\n\r\n\t/**\r\n\t * @hook useEffect - Data Change Notification\r\n\t * @description Notifies parent components of call data changes by calling the onDataChange callback whenever call data updates occur.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * useEffect(() => {\r\n\t * if (onDataChange) {\r\n\t * onDataChange(state.callData);\r\n\t * }\r\n\t * }, [state.callData, onDataChange]);\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (depends on state.callData and onDataChange prop)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when call data changes\r\n\t * // Calls parent component's onDataChange callback\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - calls parent callback with updated call data\r\n\t *\r\n\t * @conclusion\r\n\t * Enables parent components to react to call state changes for external integrations and logging.\r\n\t */\r\n\r\n\tuseEffect(() => {\r\n\t\tif (onDataChange && state.callData) {\r\n\t\t\tconst { process_id, process_name, status, phone_number, agent_id, convox_id } =\r\n\t\t\t\tstate.callData;\r\n\t\t\tconst callData = {\r\n\t\t\t\tphone_number,\r\n\t\t\t\tstatus,\r\n\t\t\t\tcallReferenceId: convox_id,\r\n\t\t\t\tagent_id,\r\n\t\t\t\tprocess_id,\r\n\t\t\t\tprocess_name,\r\n\t\t\t};\r\n\t\t\tonDataChange(callData);\r\n\t\t}\r\n\t}, [state.callData, onDataChange]);\r\n\r\n\t/**\r\n\t * @hook useEffect - Process List Fetching\r\n\t * @description Fetches the list of available processes for the agent when the agentId becomes available. Handles process selection and error states.\r\n\t *\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * useEffect(() => {\r\n\t * if (state.agentId) {\r\n\t * axiosInstance\r\n\t * .post(END_POINT.PROCESS_LIST, {\r\n\t * userId: state.agentId,\r\n\t * action: \"GETAGENTPROCESSLIST\",\r\n\t * refno: \"1234221233\",\r\n\t * })\r\n\t * .then((res) => {\r\n\t * console.log(res.data.data, \"res4\");\r\n\t * if (res && res.data && res?.data?.length > 1) {\r\n\t * setProcessList(res.data.data);\r\n\t * setOpenProcessorDialog(true);\r\n\t * } else {\r\n\t * sdkStateManager.setProcess(res?.data?.data[0]);\r\n\t * setOpenProcessorDialog(false);\r\n\t * }\r\n\t * })\r\n\t * .catch((err) => {\r\n\t * showToast(err.response.data.message, \"error\");\r\n\t * });\r\n\t * } else {\r\n\t * console.log(\"No agentId available, skipping API call\");\r\n\t * }\r\n\t * }, [state.agentId]);\r\n\t * ```\r\n\t *\r\n\t * @requiredParams\r\n\t * None (depends on state.agentId)\r\n\t *\r\n\t * @returnType\r\n\t * `void`\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when agentId becomes available\r\n\t * // Fetches process list and handles selection\r\n\t * ```\r\n\t *\r\n\t * @return\r\n\t * No return value - fetches data and updates component state:\r\n\t * - Sets process list if multiple processes available\r\n\t * - Auto-selects single process\r\n\t * - Shows error toast on failure\r\n\t *\r\n\t * @conclusion\r\n\t * Critical initialization function that sets up the agent's available processes for call handling.\r\n\t */\r\n\tuseEffect(() => {\r\n\t\tif (state.agentId) {\r\n\t\t\taxiosInstance\r\n\t\t\t\t.post(END_POINT.PROCESS_LIST, {\r\n\t\t\t\t\tuserId: state.agentId,\r\n\t\t\t\t\taction: \"GETAGENTPROCESSLIST\",\r\n\t\t\t\t\trefno: \"1234221233\",\r\n\t\t\t\t})\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\tconsole.log(res.data.data, \"res4\");\r\n\t\t\t\t\tif (res && res.data && res?.data?.length > 1) {\r\n\t\t\t\t\t\tsetProcessList(res.data.data);\r\n\t\t\t\t\t\tsetOpenProcessorDialog(true);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsdkStateManager.setProcess(res?.data?.data[0]);\r\n\t\t\t\t\t\tsetOpenProcessorDialog(false);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\tshowToast(err.response.data.message, \"error\");\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\tconsole.log(\"No agentId available, skipping API call\");\r\n\t\t}\r\n\t}, [state.agentId]);\r\n\r\n\t/**\r\n\t * 🌐 WebSocket Real-time Connection Effect\r\n\t *\r\n\t * @hook useEffect - WebSocket Connection\r\n\t * @description 🔄 Establishes and manages WebSocket connection for real-time call updates.\r\n\t * Handles connection lifecycle, message parsing, and call state synchronization.\r\n\t *\r\n\t * @dependencies [state.agentId] - Runs when agent ID becomes available\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs when agentId becomes available\r\n\t * // Establishes WebSocket connection for real-time updates\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔗 Agent-specific WebSocket endpoint connection\r\n\t * - 📡 Real-time call data updates\r\n\t * - 🎯 Conference data synchronization\r\n\t * - 📞 Automatic soft phone interface management\r\n\t * - 🛡️ Error handling and connection cleanup\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// 🔍 Only establish connection if agent ID is available\r\n\t\tif (state.agentId) {\r\n\t\t\t// 🌐 Create WebSocket connection with agent-specific endpoint\r\n\t\t\twebSocketRef.current = new WebSocket(`${WS_END_POINT.WS}?agent_id=${state.agentId}`);\r\n\r\n\t\t\t// ✅ Connection established handler\r\n\t\t\twebSocketRef.current.onopen = () => {\r\n\t\t\t\tconsole.log(\"🌐 WebSocket connection established\");\r\n\t\t\t};\r\n\r\n\t\t\t// 📨 Message received handler\r\n\t\t\twebSocketRef.current.onmessage = (event) => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// 📊 Parse incoming JSON data\r\n\t\t\t\t\tconst data = JSON.parse(event.data);\r\n\r\n\t\t\t\t\t// 🔄 Combine conference data with API response\r\n\t\t\t\t\tconst confrence = getCombineConfrenceData(\r\n\t\t\t\t\t\tstate?.conferenceLine, // 📊 Current conference lines\r\n\t\t\t\t\t\tdata?.conferencestatus, // 📡 API conference status\r\n\t\t\t\t\t\tdata // 📞 Additional call data\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tconsole.log(confrence, \"📊 Parsed JSON:\", data);\r\n\r\n\t\t\t\t\t// 🔄 Update call data in state manager\r\n\t\t\t\t\tsdkStateManager.updateCallData(data);\r\n\r\n\t\t\t\t\t// 🔄 Update conference data in state manager\r\n\t\t\t\t\tsdkStateManager.updateConferenceData([...confrence]);\r\n\r\n\t\t\t\t\t// 📞 Handle call start\r\n\t\t\t\t\tif (data.status === \"ONCALL\") {\r\n\t\t\t\t\t\tsdkStateManager.startCall(); // 🎯 Start call tracking\r\n\t\t\t\t\t\tif (!showIframe) {\r\n\t\t\t\t\t\t\tsetShowIframe(true); // 📞 Show soft phone interface\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// 🔚 Handle call wrap-up\r\n\t\t\t\t\tif (data.status === \"WRAPUP\") {\r\n\t\t\t\t\t\tsdkStateManager.endCall(); // 🎯 End call tracking\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch {\r\n\t\t\t\t\t// 📝 Log raw message if JSON parsing fails\r\n\t\t\t\t\tconsole.log(\"📨 Raw message:\", event.data);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// ❌ Connection closed handler\r\n\t\t\twebSocketRef.current.onclose = () => {\r\n\t\t\t\tconsole.log(\"🔌 WebSocket connection closed\");\r\n\t\t\t};\r\n\r\n\t\t\t// ⚠️ Connection error handler\r\n\t\t\twebSocketRef.current.onerror = (error) => {\r\n\t\t\t\tconsole.error(\"❌ WebSocket error:\", error);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t// 🧹 Cleanup function to close WebSocket connection\r\n\t\treturn () => {\r\n\t\t\twebSocketRef.current?.close();\r\n\t\t};\r\n\t}, [state.agentId]); // 🔄 Dependency on agent ID\r\n\r\n\t// =============================================================================\r\n\t// 🎯 CONDITIONAL RENDERING LOGIC\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⚙️ SDK Initialization Check\r\n\t *\r\n\t * @section Initialization Check\r\n\t * @description 🔧 Renders a processor selection dialog when the SDK is not fully initialized\r\n\t * or when no process is selected. This ensures agents can choose their working\r\n\t * process before accessing call controls.\r\n\t *\r\n\t * @returns {JSX.Element} ⚙️ Processor selection interface\r\n\t *\r\n\t * @conditions\r\n\t * - ❌ SDK is not initialized\r\n\t * - ❌ No process is selected\r\n\t * - ✅ Multiple processes are available for selection\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Rendered when SDK needs initialization\r\n\t * // Shows process selection dialog\r\n\t * ```\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tif (!state.isInitialized || !state.process) {\r\n\t\treturn (\r\n\t\t\t<Box>\r\n\t\t\t\t{/* ⚙️ Processor Selection Dialog */}\r\n\t\t\t\t{Boolean(openProcessorDialog) && (\r\n\t\t\t\t\t<ProcessorListDialog\r\n\t\t\t\t\t\tprocessList={processList} // 📊 Available processes\r\n\t\t\t\t\t\topen={openProcessorDialog} // 👁️ Dialog visibility\r\n\t\t\t\t\t\tsetOpen={setOpenProcessorDialog} // 🔄 Dialog state setter\r\n\t\t\t\t\t\thandleSelectedProcessor={(data: { process_id: number; process_name: string }) => {\r\n\t\t\t\t\t\t\tsdkStateManager.setProcess(data); // 💾 Set selected process\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\t\t);\r\n\t}\r\n\r\n\t// =============================================================================\r\n\t// 🎨 MAIN RENDER RETURN - COMPLETE UI INTERFACE\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🎯 Main UI Components Render\r\n\t *\r\n\t * @section Main UI Components\r\n\t * @description 🎨 The main return statement renders the complete call control interface including\r\n\t * all interactive elements, dialogs, and real-time components. This is the primary\r\n\t * UI that agents interact with for all telephony operations.\r\n\t *\r\n\t * @returns {JSX.Element} 🎨 Complete call control interface UI\r\n\t *\r\n\t * @components\r\n\t * - 🖱️ Draggable main control panel with call status and timer\r\n\t * - 📞 Soft phone iframe integration for dialing\r\n\t * - 📱 Dialer menu with phone number input\r\n\t * - 👤 Agent status selection menu for breaks\r\n\t * - 📋 Queue count display menu\r\n\t * - 👥 Conference call dialog\r\n\t * - 🔄 Call transfer dialog\r\n\t * - 📝 End call disposition dialog\r\n\t * - 📊 Call history dialog\r\n\t *\r\n\t * @features\r\n\t * - ✨ Smooth fade animations for all components\r\n\t * - 🖱️ Draggable floating windows\r\n\t * - 📱 Responsive design for different screen sizes\r\n\t * - 🎨 Material-UI theming support\r\n\t * - ⚡ Real-time updates via WebSocket\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{/* 🎯 Main Control Panel Container */}\r\n\t\t\t<Box>\r\n\t\t\t\t{/* ✨ Fade Animation for Main Panel */}\r\n\t\t\t\t<Fade\r\n\t\t\t\t\tin={true}\r\n\t\t\t\t\ttimeout={300}\r\n\t\t\t\t>\r\n\t\t\t\t\t{/* 📄 Main Control Panel Paper Component */}\r\n\t\t\t\t\t<Paper\r\n\t\t\t\t\t\tref={state.sdkConfig?.isDraggable ? dragRef : null} // 🖱️ Drag reference if draggable\r\n\t\t\t\t\t\televation={\r\n\t\t\t\t\t\t\tisDragging ?\r\n\t\t\t\t\t\t\t\t4 // 🔝 Higher elevation when dragging\r\n\t\t\t\t\t\t\t: state.sdkConfig?.isDraggable ?\r\n\t\t\t\t\t\t\t\t1 // 📄 Normal elevation if draggable\r\n\t\t\t\t\t\t\t:\t0 // 📄 No elevation if not draggable\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tposition: state.sdkConfig?.isDraggable ? \"fixed\" : \"relative\", // 📍 Position based on draggable config\r\n\t\t\t\t\t\t\tleft: state.sdkConfig?.isDraggable ? position.x : \"auto\", // 📍 X position for draggable\r\n\t\t\t\t\t\t\ttop: state.sdkConfig?.isDraggable ? position.y : \"auto\", // 📍 Y position for draggable\r\n\t\t\t\t\t\t\tdisplay: \"inline-block\", // 📦 Inline block display\r\n\t\t\t\t\t\t\twidth: \"auto\", // 📏 Auto width\r\n\t\t\t\t\t\t\tflexShrink: 0, // 🔒 Prevent shrinking\r\n\t\t\t\t\t\t\twhiteSpace: \"nowrap\", // 📝 No text wrapping\r\n\t\t\t\t\t\t\tp: 0.5, // 📏 Padding\r\n\t\t\t\t\t\t\tborderRadius: 3, // 🔄 Border radius\r\n\t\t\t\t\t\t\tbgcolor: \"background.paper\", // 🎨 Background color\r\n\t\t\t\t\t\t\tzIndex: state.sdkConfig?.isDraggable ? Number.MAX_SAFE_INTEGER : 0, // 🔝 Z-index for layering\r\n\t\t\t\t\t\t\ttransition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n\t\t\t\t\t\t\t\t// ✨ Smooth transitions\r\n\t\t\t\t\t\t\t\tduration: theme.transitions.duration.short,\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\tuserSelect: \"none\", // 🚫 Prevent text selection\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{/* Status and Timer Row */}\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\tgap: 1,\r\n\t\t\t\t\t\t\t\t\tmargin: \"0px 10px\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{state.sdkConfig?.isDraggable && (\r\n\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tcursor: \"all-scroll\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tonMouseDown={handleMouseDown}\r\n\t\t\t\t\t\t\t\t\t\tonTouchStart={handleTouchStart}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<DragIndicator />{\" \"}\r\n\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t\t\t{/* Dial Button */}\r\n\t\t\t\t\t\t\t\t\t{!state.sdkConfig?.disabledDialButton && (\r\n\t\t\t\t\t\t\t\t\t\t<Tooltip title=\"Dial\">\r\n\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"BREAK\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleOpenDialer(e);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"warning\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<WifiCalling3\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"action.selected\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t:\t\"success.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t{/* Call Duration */}\r\n\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tcolor: \"success.main\",\r\n\t\t\t\t\t\t\t\t\t\twidth: \"40px\",\r\n\t\t\t\t\t\t\t\t\t\tmarginRight: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tfontSize: \"18px\",\r\n\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{formatDuration(callDuration)}\r\n\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"18px 0px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tlabel={\r\n\t\t\t\t\t\t\t\t\t\tisLoading || agentReadyLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<CircularProgress size=\"20px\" />\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextAlign: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{state.callData?.status?.toUpperCase() ?? \"N/A\"}\r\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tonClick={handleOpenAgentStatus}\r\n\t\t\t\t\t\t\t\t\tdeleteIcon={<KeyboardArrowDown color=\"primary\" />}\r\n\t\t\t\t\t\t\t\t\tonDelete={handleOpenAgentStatus}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t\t{/* 🎛️ Control Buttons Section */}\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\", // 📦 Flexbox layout\r\n\t\t\t\t\t\t\t\t\tgap: 1, // 📏 Gap between buttons\r\n\t\t\t\t\t\t\t\t\tjustifyContent: \"center\", // 🎯 Center alignment\r\n\t\t\t\t\t\t\t\t\talignItems: \"center\", // 📐 Vertical center alignment\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{/* Agent Ready */}\r\n\t\t\t\t\t\t\t\t<Tooltip title={\"Agent Ready\"}>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\t:\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\thandleAgentReady();\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tclasses={{\r\n\t\t\t\t\t\t\t\t\t\t\troot:\r\n\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t\"enabled\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t...((\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"MISSED\"\r\n\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\toutlined\r\n\t\t\t\t\t\t\t\t\t\t\t:\tenabled),\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={agentReadyLoading}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<SupportAgent />\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</Tooltip>\r\n\r\n\t\t\t\t\t\t\t\t{/* Hold Button */}\r\n\r\n\t\t\t\t\t\t\t\t<Tooltip title={state.isHolding ? \"Resume\" : \"Hold\"}>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isHolding && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\thandleHoldToggle();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isHolding && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t\t\t(state.callData?.status?.toUpperCase() !== \"ONCALL\" && !state.isHolding) ||\r\n\t\t\t\t\t\t\t\t\t\t\tholdOrUnHoldLoading\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{holdOrUnHoldLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t: state.isHolding ?\r\n\t\t\t\t\t\t\t\t\t\t\t<PlayArrow />\r\n\t\t\t\t\t\t\t\t\t\t:\t<Pause />}\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</Tooltip>\r\n\r\n\t\t\t\t\t\t\t\t{/* Mute Button */}\r\n\r\n\t\t\t\t\t\t\t\t<Tooltip title={state.isMuted ? \"Unmute\" : \"Mute\"}>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isMuted && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\thandleMuteToggle();\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\tstate.isMuted && state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t\t\t(state.callData?.status?.toUpperCase() !== \"ONCALL\" && !state.isMuted) ||\r\n\t\t\t\t\t\t\t\t\t\t\tmuteOrUnMuteLoading\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{muteOrUnMuteLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t: state.isMuted ?\r\n\t\t\t\t\t\t\t\t\t\t\t<MicOff />\r\n\t\t\t\t\t\t\t\t\t\t:\t<Mic />}\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</Tooltip>\r\n\r\n\t\t\t\t\t\t\t\t{/* Call Transfer */}\r\n\t\t\t\t\t\t\t\t{!state.sdkConfig?.disableCallTransferButton && (\r\n\t\t\t\t\t\t\t\t\t<Tooltip title={\"Transfer Call\"}>\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\tvariant={state.openCallTransferDialog ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsdkStateManager.setOpenCallTransferDialog(true);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.openCallTransferDialog ? { ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={state.callData?.status?.toUpperCase() !== \"ONCALL\"}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<TransferWithinAStation />\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t\t{/* Call Conference Button */}\r\n\t\t\t\t\t\t\t\t{!state.sdkConfig?.disableConferenceButton && (\r\n\t\t\t\t\t\t\t\t\t<Tooltip title={\"Conference Call\"}>\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\tvariant={state.openConferenceDialog ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsdkStateManager.setOpenConferenceDialog(true);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\t\tstate.openConferenceDialog ? { ...enabled }\r\n\t\t\t\t\t\t\t\t\t\t\t\t: state.callData?.status?.toUpperCase() === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={state.callData?.status?.toUpperCase() !== \"ONCALL\"}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<Group />\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t\t{/* End Call Button */}\r\n\t\t\t\t\t\t\t\t{!state.sdkConfig?.disableEndCallButton && (\r\n\t\t\t\t\t\t\t\t\t<Tooltip title={\"End Call\"}>\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetOpenCallDisposition(true);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborderRight: \"1px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: \"error.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminWidth: \"60px !important\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \" 0px 2px 1px #5f3f3f\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborder: `1px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: \"40px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \" 0px 2px 1px #5f3f3f\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t:\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...disabled,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tminWidth: \"60px !important\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t\t\t\t(state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate.callData?.status?.toUpperCase() !== \"WRAPUP\") ||\r\n\t\t\t\t\t\t\t\t\t\t\t\tendCallLoading\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{endCallLoading ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t:\t<CallEnd />}\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Paper>\r\n\t\t\t\t</Fade>\r\n\t\t\t</Box>\r\n\t\t\t<Fade\r\n\t\t\t\tin={true}\r\n\t\t\t\ttimeout={300}\r\n\t\t\t>\r\n\t\t\t\t<Paper\r\n\t\t\t\t\tref={iframeDragRef}\r\n\t\t\t\t\televation={iframeIsDragging ? 4 : 1}\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\t\tleft: iframePosition.x,\r\n\t\t\t\t\t\ttop: iframePosition.y,\r\n\t\t\t\t\t\tborderRadius: 2,\r\n\t\t\t\t\t\tbgcolor: \"background.paper\",\r\n\t\t\t\t\t\tzIndex: Number.MAX_SAFE_INTEGER,\r\n\t\t\t\t\t\ttransition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n\t\t\t\t\t\t\tduration: theme.transitions.duration.short,\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t\tvisibility: showIframe && !state.sdkConfig?.disableSoftPhone ? \"visible\" : \"hidden\",\r\n\t\t\t\t\t\tuserSelect: \"none\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\tcursor: \"all-scroll\",\r\n\t\t\t\t\t\t\tpadding: \"0px 10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tonMouseDown={iframeHandleMouseDown}\r\n\t\t\t\t\t\tonTouchStart={iframeHandleTouchStart}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<DragIndicator\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\ttransform: \"rotate(90deg)\",\r\n\t\t\t\t\t\t\t\tcolor: \"#7b7b7b\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>{\" \"}\r\n\t\t\t\t\t\t<IconButton onClick={() => setShowIframe(false)}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t<iframe\r\n\t\t\t\t\t\t\tsrc={`https://${IP}/ConVoxCCS/iframe?agent_id=${state.agentId}&process_id=${state.process?.process_id}`}\r\n\t\t\t\t\t\t\theight={380}\r\n\t\t\t\t\t\t\twidth={420}\r\n\t\t\t\t\t\t\tallow=\"camera; microphone; autoplay\"\r\n\t\t\t\t\t\t\tstyle={{\r\n\t\t\t\t\t\t\t\tborder: \"none\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t></iframe>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Fade>\r\n\r\n\t\t\t{/* Dialer */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={dialerAnchorEl}\r\n\t\t\t\topen={Boolean(dialerAnchorEl)}\r\n\t\t\t\tonClose={handleCloseDialer}\r\n\t\t\t\tonClick={(e) => e.stopPropagation()}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tzIndex: 99999,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tall: \"unset\",\r\n\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\"&hover\": {\r\n\t\t\t\t\t\t\tbackgroundColor: \"white\",\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<TextField\r\n\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\tvalue={phoneNumber}\r\n\t\t\t\t\t\tplaceholder=\"Enter Mobile No.\"\r\n\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\tsetPhoneNumber(e.target.value);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\tcolor=\"info\"\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\thandleStartCall(phoneNumber);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{clickToCallLoading ?\r\n\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tcolor: theme.palette.success.main,\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t:\t<Phone color=\"success\" />}\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</Box>\r\n\t\t\t</Menu>\r\n\r\n\t\t\t{/* Status */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={statusAnchorEl}\r\n\t\t\t\topen={Boolean(statusAnchorEl)}\r\n\t\t\t\tonClose={handleCloseAgentStatus}\r\n\t\t\t\tonClick={(e) => e.stopPropagation()}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tzIndex: 99999,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<MenuItem onClick={() => handleUpdateAgentStatus(\"Lunch\")}>- Lunch</MenuItem>\r\n\t\t\t\t<MenuItem onClick={() => handleUpdateAgentStatus(\"Tea\")}>- Tea</MenuItem>\r\n\t\t\t</Menu>\r\n\r\n\t\t\t{/* Queue Count */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={anchorEl}\r\n\t\t\t\topen={Boolean(anchorEl)}\r\n\t\t\t\tonClose={handleCloseQueueCounts}\r\n\t\t\t\tonClick={(e) => e.stopPropagation()}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tzIndex: 99999,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\tjustifyContent: \"flex-start\",\r\n\t\t\t\t\t\tflexDirection: \"column\",\r\n\t\t\t\t\t\tpadding: \"0px 10px\",\r\n\t\t\t\t\t\t\"&hover\": {\r\n\t\t\t\t\t\t\tbackgroundColor: \"white\",\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\ticon={<Layers color=\"secondary\" />}\r\n\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\tlabel=\"Waiting - 25\"\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tmargin: \"4px 2px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\ticon={<Pending color=\"info\" />}\r\n\t\t\t\t\t\tlabel=\"Pending - 99+\"\r\n\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tmargin: \"4px 2px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\ticon={<Upcoming color=\"success\" />}\r\n\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\tlabel=\"Upcoming - 66\"\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tmargin: \"4px 2px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</Box>\r\n\t\t\t</Menu>\r\n\r\n\t\t\t{/* Conference Call Dialog */}\r\n\t\t\t{Boolean(state.openConferenceDialog) && <ConferenceDialog />}\r\n\r\n\t\t\t{/* Call Transfer Dialog */}\r\n\t\t\t{Boolean(state.openCallTransferDialog) && (\r\n\t\t\t\t<CallTransferDialog open={state.openCallTransferDialog} />\r\n\t\t\t)}\r\n\r\n\t\t\t{/* Call Disposition Dialog */}\r\n\t\t\t{Boolean(openCallDisposition) && (\r\n\t\t\t\t<EndCallDispositionDialog\r\n\t\t\t\t\topen={openCallDisposition}\r\n\t\t\t\t\tsetOpen={setOpenCallDisposition}\r\n\t\t\t\t\tonSubmitDisposition={handleEndCall}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\r\n\t\t\t{/* Call Disposition Dialog */}\r\n\t\t\t{Boolean(openCallHistoryDialog) && (\r\n\t\t\t\t<CallHistoryDialog\r\n\t\t\t\t\topen={openCallHistoryDialog}\r\n\t\t\t\t\tsetOpen={setOpenCallHistoryDialog}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * 📋 FILE SUMMARY & COMPONENT OVERVIEW\r\n * =============================================================================\r\n *\r\n * 🎯 This CallControls component is a comprehensive telephony interface that provides:\r\n *\r\n * 📞 **Core Functionality**:\r\n * - 📱 Complete call control operations (dial, hold, mute, transfer, conference, end)\r\n * - ⏸️ Hold/resume functionality with visual feedback\r\n * - 🔇 Mute/unmute controls with state synchronization\r\n * - 🔄 Call transfer and conference capabilities\r\n * - 📝 End call with comprehensive disposition tracking\r\n *\r\n * 🔄 **Real-time Updates**:\r\n * - 🌐 WebSocket integration for live call status updates\r\n * - 📊 Conference data synchronization\r\n * - ⏱️ Real-time call duration tracking\r\n * - 📡 Automatic UI updates based on call state changes\r\n *\r\n * 👤 **Agent Management**:\r\n * - 🎧 Agent ready/break status controls\r\n * - ☕ Break type management (Lunch, Tea, etc.)\r\n * - ⚙️ Process selection and initialization\r\n * - 📊 Queue count monitoring\r\n *\r\n * 🎨 **User Experience**:\r\n * - 🖱️ Draggable floating interface\r\n * - 📞 Soft phone iframe integration\r\n * - 📱 Responsive design for different screen sizes\r\n * - ✨ Smooth animations and transitions\r\n * - 🎨 Material-UI theming support\r\n *\r\n * 📊 **Data Management**:\r\n * - 📝 Call disposition tracking and classification\r\n * - 📅 Callback scheduling and follow-up management\r\n * - 🔄 State synchronization across components\r\n * - 💾 Persistent position and configuration storage\r\n *\r\n * 🛡️ **Error Handling**:\r\n * - ✅ Input validation for phone numbers\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🚫 Page unload protection during active calls\r\n * - 🔄 Graceful failure management and recovery\r\n *\r\n * 🔗 **Integration**:\r\n * - 📡 Parent component communication via callbacks\r\n * - 🌐 External system connectivity via APIs\r\n * - 🔧 Configurable button states and functionality\r\n * - 📊 Real-time data synchronization\r\n *\r\n * 🏗️ **Architecture**:\r\n * - ⚛️ React functional component with hooks\r\n * - 🗃️ Centralized state management via SDK state manager\r\n * - 🔄 Effect hooks for lifecycle management\r\n * - 📡 Custom hooks for API operations\r\n * - 🎨 Material-UI component library integration\r\n *\r\n * 🎯 **Best Practices**:\r\n * - 📝 Comprehensive JSDoc documentation\r\n * - 🎨 Consistent code formatting and structure\r\n * - 🔧 TypeScript type safety throughout\r\n * - ⚡ Performance optimization with useCallback\r\n * - 🧹 Proper cleanup and memory management\r\n *\r\n * 📈 **Performance Features**:\r\n * - ⚡ Optimized re-renders with proper dependency arrays\r\n * - 🔄 Memoized callback functions\r\n * - 🧹 Automatic cleanup of intervals and event listeners\r\n * - 📊 Efficient state updates and synchronization\r\n *\r\n * 🎯 **Use Cases**:\r\n * - 🏢 Contact center agent interfaces\r\n * - 📞 Customer service telephony systems\r\n * - 🎧 Call center management platforms\r\n * - 📱 Integrated telephony applications\r\n * - 🔄 Multi-channel communication systems\r\n *\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n * @license Proprietary\r\n */\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { type MouseEvent, type TouchEvent, useCallback, useRef, useState } from \"react\";\r\n\r\n/**\r\n * Represents a 2D position on the screen in pixels.\r\n *\r\n * @typedef {Object} Position\r\n * @property {number} x - The horizontal coordinate in pixels.\r\n * @property {number} y - The vertical coordinate in pixels.\r\n */\r\ninterface Position {\r\n\tx: number;\r\n\ty: number;\r\n}\r\n\r\n/**\r\n * The return type of the `useDraggable` hook.\r\n *\r\n * @typedef {Object} UseDraggableReturn\r\n * @property {Position} position - The current position of the draggable element in `{x, y}` pixels.\r\n * @property {boolean} isDragging - Whether the element is currently being dragged.\r\n * @property {React.RefObject<HTMLDivElement | null>} dragRef - Ref to attach to the draggable DOM element.\r\n * @property {(e: MouseEvent<HTMLDivElement>) => void} handleMouseDown - Mouse down handler to start dragging.\r\n * @property {(e: TouchEvent<HTMLDivElement>) => void} handleTouchStart - Touch start handler to start dragging.\r\n */\r\ninterface UseDraggableReturn {\r\n\tposition: Position;\r\n\tisDragging: boolean;\r\n\tdragRef: any;\r\n\thandleMouseDown: (_e: MouseEvent<HTMLDivElement>) => void;\r\n\thandleTouchStart: (_e: TouchEvent<HTMLDivElement>) => void;\r\n}\r\n\r\n/**\r\n * A custom React hook that enables drag-and-drop functionality for a DOM element,\r\n * with position constraints inside the viewport and an optional position change callback.\r\n *\r\n * @param {Position} initialPosition - The starting `{x, y}` position of the element in pixels.\r\n * @param {(position: Position) => void} [onPositionChange] - Optional callback fired whenever position changes.\r\n *\r\n * @returns {UseDraggableReturn} - Object containing the element's current position, drag state, event handlers, and ref.\r\n *\r\n * @example\r\n * ```tsx\r\n * const { dragRef, handleMouseDown, handleTouchStart, position } =\r\n * useDraggable({ x: 100, y: 200 }, (pos) => console.log(\"Moved to:\", pos));\r\n *\r\n * return (\r\n * <div\r\n * ref={dragRef}\r\n * onMouseDown={handleMouseDown}\r\n * onTouchStart={handleTouchStart}\r\n * style={{\r\n * position: \"absolute\",\r\n * left: position.x,\r\n * top: position.y,\r\n * }}\r\n * >\r\n * Drag me\r\n * </div>\r\n * );\r\n * ```\r\n *\r\n * @developerNotes\r\n * - **Performance**: This hook uses `useCallback` to memoize handlers, preventing unnecessary re-renders in the consuming component.\r\n * - **Repaint Efficiency**: Position updates use state but are constrained to the viewport, so excessive off-screen rendering is avoided.\r\n * - **Refs for Persistence**: Drag start positions are stored in `useRef` to avoid triggering re-renders mid-drag.\r\n * - **Pointer Events**: Prevent default behavior in touch/mouse events to stop unwanted scrolling while dragging.\r\n * - **Viewport Constraints**: `updatePosition` ensures the draggable element never goes outside the visible browser window.\r\n * - **Mobile Support**: Touch events are handled alongside mouse events for full cross-device compatibility.\r\n */\r\nexport function useDraggable(\r\n\tinitialPosition: Position,\r\n\tonPositionChange?: (_position: Position) => void\r\n): UseDraggableReturn {\r\n\t/** Current position of the draggable element. */\r\n\tconst [position, setPosition] = useState<Position>(initialPosition);\r\n\r\n\t/** Whether the element is currently being dragged. */\r\n\tconst [isDragging, setIsDragging] = useState(false);\r\n\r\n\t/** Ref to the draggable DOM element. Attach this to your draggable container. */\r\n\tconst dragRef = useRef<HTMLDivElement>();\r\n\r\n\t/** Starting cursor/touch position at drag start. */\r\n\tconst dragStart = useRef<Position>({ x: 0, y: 0 });\r\n\r\n\t/** Starting element position at drag start. */\r\n\tconst elementStart = useRef<Position>({ x: 0, y: 0 });\r\n\r\n\t/**\r\n\t * Updates the element's position and fires `onPositionChange` if provided.\r\n\t * Constrains position so the element stays within viewport bounds.\r\n\t */\r\n\tconst updatePosition = useCallback(\r\n\t\t(newPosition: Position) => {\r\n\t\t\tconst element = dragRef.current;\r\n\t\t\tif (!element) return;\r\n\r\n\t\t\tconst rect = element.getBoundingClientRect();\r\n\t\t\tconst viewportWidth = window.innerWidth;\r\n\t\t\tconst viewportHeight = window.innerHeight;\r\n\r\n\t\t\tconst constrainedPosition = {\r\n\t\t\t\tx: Math.max(0, Math.min(newPosition.x, viewportWidth - rect.width)),\r\n\t\t\t\ty: Math.max(0, Math.min(newPosition.y, viewportHeight - rect.height)),\r\n\t\t\t};\r\n\r\n\t\t\tsetPosition(constrainedPosition);\r\n\t\t\tonPositionChange?.(constrainedPosition);\r\n\t\t},\r\n\t\t[onPositionChange]\r\n\t);\r\n\r\n\t/**\r\n\t * Begins drag logic and attaches move/end event listeners.\r\n\t */\r\n\tconst handleStart = useCallback(\r\n\t\t(clientX: number, clientY: number) => {\r\n\t\t\tsetIsDragging(true);\r\n\t\t\tdragStart.current = { x: clientX, y: clientY };\r\n\t\t\telementStart.current = position;\r\n\r\n\t\t\t/** Updates position based on pointer movement delta. */\r\n\t\t\tconst handleMove = (moveClientX: number, moveClientY: number) => {\r\n\t\t\t\tconst deltaX = moveClientX - dragStart.current.x;\r\n\t\t\t\tconst deltaY = moveClientY - dragStart.current.y;\r\n\r\n\t\t\t\tupdatePosition({\r\n\t\t\t\t\tx: elementStart.current.x + deltaX,\r\n\t\t\t\t\ty: elementStart.current.y + deltaY,\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\t\t\t/** Handles mouse movement during drag. */\r\n\t\t\tconst handleMouseMove = (e: globalThis.MouseEvent) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\thandleMove(e.clientX, e.clientY);\r\n\t\t\t};\r\n\r\n\t\t\t/** Handles touch movement during drag. */\r\n\t\t\tconst handleTouchMove = (e: globalThis.TouchEvent) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tconst touch = e.touches[0];\r\n\t\t\t\tif (touch) {\r\n\t\t\t\t\thandleMove(touch.clientX, touch.clientY);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t/** Ends dragging and removes event listeners. */\r\n\t\t\tconst handleEnd = () => {\r\n\t\t\t\tsetIsDragging(false);\r\n\t\t\t\tdocument.removeEventListener(\"mousemove\", handleMouseMove);\r\n\t\t\t\tdocument.removeEventListener(\"mouseup\", handleEnd);\r\n\t\t\t\tdocument.removeEventListener(\"touchmove\", handleTouchMove);\r\n\t\t\t\tdocument.removeEventListener(\"touchend\", handleEnd);\r\n\t\t\t};\r\n\r\n\t\t\t// Attach listeners\r\n\t\t\tdocument.addEventListener(\"mousemove\", handleMouseMove);\r\n\t\t\tdocument.addEventListener(\"mouseup\", handleEnd);\r\n\t\t\tdocument.addEventListener(\"touchmove\", handleTouchMove, {\r\n\t\t\t\tpassive: false,\r\n\t\t\t});\r\n\t\t\tdocument.addEventListener(\"touchend\", handleEnd);\r\n\t\t},\r\n\t\t[position, updatePosition]\r\n\t);\r\n\r\n\t/**\r\n\t * Mouse down handler to start dragging.\r\n\t */\r\n\tconst handleMouseDown = useCallback(\r\n\t\t(e: MouseEvent<HTMLDivElement>) => {\r\n\t\t\te.preventDefault();\r\n\t\t\thandleStart(e.clientX, e.clientY);\r\n\t\t},\r\n\t\t[handleStart]\r\n\t);\r\n\r\n\t/**\r\n\t * Touch start handler to start dragging.\r\n\t */\r\n\tconst handleTouchStart = useCallback(\r\n\t\t(e: TouchEvent<HTMLDivElement>) => {\r\n\t\t\te.preventDefault();\r\n\t\t\tconst touch = e.touches[0];\r\n\t\t\tif (touch) {\r\n\t\t\t\thandleStart(touch.clientX, touch.clientY);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[handleStart]\r\n\t);\r\n\r\n\treturn {\r\n\t\tposition,\r\n\t\tisDragging,\r\n\t\tdragRef,\r\n\t\thandleMouseDown,\r\n\t\thandleTouchStart,\r\n\t};\r\n}\r\n","import { useState, useEffect } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { SDKState } from \"../../types\";\r\n\r\n/**\r\n * Custom React hook that provides the current SDK state and automatically\r\n * updates the state when changes occur in the `sdkStateManager`.\r\n *\r\n * @function useSDKState\r\n * @returns {SDKState} The latest SDK state object from the SDK state manager.\r\n *\r\n * @example\r\n * // Example usage in a component\r\n * import { useSDKState } from \"../hooks/useSDKState\";\r\n *\r\n * function CallControls() {\r\n * const sdkState = useSDKState();\r\n *\r\n * if (!sdkState.isInitialized) {\r\n * return <div>SDK not initialized</div>;\r\n * }\r\n *\r\n * return (\r\n * <div>\r\n * Status: {sdkState.status}\r\n * {sdkState.isMuted ? \"🔇\" : \"🎤\"}\r\n * </div>\r\n * );\r\n * }\r\n */\r\nexport function useSDKState(): SDKState {\r\n\t/**\r\n\t * Local React state holding the current SDK state.\r\n\t * Initialized from the sdkStateManager's current state.\r\n\t */\r\n\tconst [state, setState] = useState<SDKState>(sdkStateManager.getState());\r\n\r\n\t/**\r\n\t * Sets up a subscription to the sdkStateManager on component mount.\r\n\t * Whenever the SDK state changes, this updates the local `state`.\r\n\t * Cleans up the subscription on component unmount.\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// Subscribe to state changes from the sdkStateManager\r\n\t\tconst unsubscribe = sdkStateManager.subscribe(() => {\r\n\t\t\t// Update local React state with the latest SDK state\r\n\t\t\tsetState(sdkStateManager.getState());\r\n\t\t});\r\n\r\n\t\t// Return the unsubscribe function to clean up\r\n\t\treturn unsubscribe;\r\n\t}, []);\r\n\r\n\t/**\r\n\t * Return the current SDK state to the calling component.\r\n\t */\r\n\treturn state;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { type AxiosRequestConfig } from \"axios\";\r\nimport { useCallback, useReducer } from \"react\";\r\n\r\nimport axiosInstance from \"./axios\";\r\nimport { useToast } from \"./toastMessage\";\r\nimport {\r\n\tRequestResult,\r\n\tUseGetRequest,\r\n\tRequestOptions,\r\n\tUsePostRequest,\r\n\tUsePutRequest,\r\n\tUseDeleteRequest,\r\n\tUsePatchRequest,\r\n} from \"../../types\";\r\n\r\nconst initialState = {\r\n\tisLoading: false, // Initially not loading\r\n\tisSuccess: false, // Initially no success\r\n\tisError: false, // Initially no error\r\n\terror: null, // No error to show\r\n\tdata: null, // No data to show\r\n};\r\n\r\nconst reducer = (state: typeof initialState, action: { type: string; payload: any }) => {\r\n\tif (action.type === \"isLoading\") {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tisLoading: action.payload,\r\n\t\t};\r\n\t} else if (action.type === \"isSuccess\") {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tisSuccess: true,\r\n\t\t\tdata: action.payload,\r\n\t\t};\r\n\t} else if (action.type === \"isError\") {\r\n\t\treturn {\r\n\t\t\t...state,\r\n\t\t\tisError: true,\r\n\t\t\terror: action.payload,\r\n\t\t};\r\n\t} else if (action.type === \"reset\") {\r\n\t\treturn {\r\n\t\t\tisLoading: false,\r\n\t\t\tisSuccess: false,\r\n\t\t\tisError: false,\r\n\t\t\terror: null,\r\n\t\t\tdata: null,\r\n\t\t};\r\n\t}\r\n\tthrow Error(\"Unknown action.\");\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `useGetRequest` custom hook.\r\n * @description Performs a typed HTTP GET request using Axios with internal state and toast notification support.\r\n * Accepts optional success and error callbacks and returns a request function with response state.\r\n *\r\n * @params\r\n * - props: An optional object containing `onSuccess` and `onError` handlers for request lifecycle callbacks.\r\n *\r\n * @example\r\n * const [getUser, userState] = useGetRequest<User>({\r\n * onSuccess: (res) => console.log(res),\r\n * onError: (err) => console.error(err),\r\n * });\r\n * getUser(\"/api/user\");\r\n *\r\n * @returns A tuple containing:\r\n * - A function to perform the GET request.\r\n * - A state object representing loading, error, and data.\r\n */\r\nexport const useGetRequest = <T = UseGetRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n\t/**\r\n\t * getRequest: Function to trigger the GET call.\r\n\t * state: Holds request state (loading, success, error, data).\r\n\t */\r\n): [(_url: string, _config?: AxiosRequestConfig) => void, RequestResult<T>] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function getRequest\r\n\t * @description Makes the GET request, updates internal state, handles success/error, and triggers notifications.\r\n\t * @param url - The API endpoint to call.\r\n\t * @param config - Optional Axios request config (headers, params, etc.)\r\n\t */\r\n\tconst getRequest = useCallback(\r\n\t\t(url: string, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\t\t\t/**\r\n\t\t\t * Execute the GET request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.get(url, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, config);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, config);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, config);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the GET function and the current request state.\r\n\t */\r\n\treturn [getRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `usePostRequest` custom hook.\r\n * @description Sends a typed POST request via Axios and manages the request state, error handling, and toast notifications.\r\n *\r\n * @params\r\n * - props: Optional object containing `onSuccess` and `onError` callback handlers.\r\n *\r\n * @example\r\n * const [createUser, state] = usePostRequest<User>({\r\n * onSuccess: (res) => console.log(\"User created\", res),\r\n * onError: (err) => console.error(\"Failed to create\", err),\r\n * });\r\n * createUser(\"/api/users\", payload);\r\n *\r\n * @returns A tuple:\r\n * - postRequest: Function to execute the POST call.\r\n * - state: Object containing isLoading, isError, isSuccess, error, and data.\r\n */\r\nexport const usePostRequest = <T = UsePostRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * postRequest: Function to trigger the POST call.\r\n\t * state: Holds request state (loading, success, error, data).\r\n\t */\r\n\t(_url: string, _payload: T, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null, disabledSuccessToast = false } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function postRequest\r\n\t * @description Sends a POST request, updates state, and calls handlers.\r\n\t * @param url - Endpoint to which data is posted.\r\n\t * @param payload - Request body data to be sent.\r\n\t * @param config - Optional Axios request configuration.\r\n\t */\r\n\tconst postRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\r\n\t\t\t/**\r\n\t\t\t * Execute the POST request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.post(url, payload, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\t// if (res.data?.success) {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\tconsole.log(res.data?.message, \"res45\");\r\n\t\t\t\t\tif (!disabledSuccessToast) {\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// } else {\r\n\t\t\t\t\t// /**\r\n\t\t\t\t\t// * Update state with error information.\r\n\t\t\t\t\t// */\r\n\r\n\t\t\t\t\t// dispatch({\r\n\t\t\t\t\t// type: \"isError\",\r\n\t\t\t\t\t// payload: res.data,\r\n\t\t\t\t\t// });\r\n\r\n\t\t\t\t\t// /**\r\n\t\t\t\t\t// * Show error message via toast system.\r\n\t\t\t\t\t// */\r\n\r\n\t\t\t\t\t// showToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t// /**\r\n\t\t\t\t\t// * Invoke user-defined error handler if available.\r\n\t\t\t\t\t// */\r\n\r\n\t\t\t\t\t// onError?.(res.data, payload);\r\n\t\t\t\t\t// }\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message using toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, payload);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the POST function and the current request state.\r\n\t */\r\n\treturn [postRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `usePutRequest` custom hook.\r\n * @description Sends a typed PUT request using Axios and manages its state, including success and error handling via callbacks and toast messages.\r\n *\r\n * @params\r\n * - props: Optional object with `onSuccess` and `onError` handlers for request lifecycle management.\r\n *\r\n * @example\r\n * const [updateUser, state] = usePutRequest<User>({\r\n * onSuccess: (res) => console.log(\"Updated!\", res),\r\n * onError: (err) => console.error(\"Update failed\", err),\r\n * });\r\n * updateUser(\"/api/users/1\", updatedPayload);\r\n *\r\n * @returns A tuple:\r\n * - putRequest: Function to trigger the PUT call.\r\n * - state: Object containing isLoading, isSuccess, isError, error, and data.\r\n */\r\nexport const usePutRequest = <T = UsePutRequest>(\r\n\t/**\r\n\t * @param props Optional success and error callback functions.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * putRequest: Function to perform the PUT request.\r\n\t * state: Holds the status and result of the request.\r\n\t */\r\n\t(_url: string, _payload: T, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure handlers from props, with defaults.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function putRequest\r\n\t * @description Executes a PUT HTTP request and updates state accordingly.\r\n\t * @param url - The endpoint URL to which the PUT request is made.\r\n\t * @param payload - The request body data.\r\n\t * @param config - Optional Axios request config object.\r\n\t */\r\n\tconst putRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\r\n\t\t\t/**\r\n\t\t\t * Execute the PUT request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.put(url, payload, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, payload);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, payload);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the PUT function and the current request state.\r\n\t */\r\n\treturn [putRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `useDeleteRequest` custom hook.\r\n * @description Sends a DELETE request using Axios and manages request state with toast notifications and optional success/error handlers.\r\n *\r\n * @params\r\n * - props: Optional callbacks `onSuccess` and `onError` to handle API response lifecycle events.\r\n *\r\n * @example\r\n * const [deleteUser, state] = useDeleteRequest({\r\n * onSuccess: (res) => console.log(\"Deleted!\", res),\r\n * onError: (err) => console.error(\"Delete failed\", err),\r\n * });\r\n * deleteUser(\"/api/users/1\");\r\n *\r\n * @returns A tuple:\r\n * - deleteRequest: Function to send the DELETE request.\r\n * - state: Object holding request status (`isLoading`, `isSuccess`, `isError`), response data, and error.\r\n */\r\nexport const useDeleteRequest = <T = UseDeleteRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * deleteRequest: Function that initiates the DELETE API call.\r\n\t * state: Object describing the request’s current status and result.\r\n\t */\r\n\t(_url: string, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function deleteRequest\r\n\t * @description Executes a DELETE API call and handles response or errors.\r\n\t *\r\n\t * @param url - The endpoint to delete the resource from.\r\n\t * @param config - Optional Axios request configuration (e.g., headers).\r\n\t */\r\n\tconst deleteRequest = useCallback(\r\n\t\t(url: string, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\r\n\t\t\t/**\r\n\t\t\t * Execute the DELETE request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.delete(url, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, config);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, config);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, config);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the DELETE function and the current request state.\r\n\t */\r\n\treturn [deleteRequest, state];\r\n};\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares the `usePatchRequest` custom hook.\r\n * @description Executes a PATCH request using Axios with built-in state management, error handling, and toast support.\r\n *\r\n * @params\r\n * - props: Optional object containing `onSuccess` and `onError` callback handlers.\r\n *\r\n * @example\r\n * const [patchData, state] = usePatchRequest({\r\n * onSuccess: (res) => console.log(\"Patched successfully\", res),\r\n * onError: (err) => console.error(\"Patch failed\", err),\r\n * });\r\n *\r\n * patchData(\"/api/users/1\", { name: \"Updated Name\" });\r\n *\r\n * @returns A tuple:\r\n * - patchRequest: Function that triggers the PATCH API call.\r\n * - state: Object holding request lifecycle flags, response data, and error.\r\n */\r\nexport const usePatchRequest = <T = UsePatchRequest>(\r\n\t/**\r\n\t * @param props Optional handlers for success and error callbacks.\r\n\t */\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t/**\r\n\t * patchRequest: Function to initiate a PATCH request.\r\n\t * state: The internal state of the request lifecycle.\r\n\t */\r\n\t(_url: string, _payload: T, _config?: AxiosRequestConfig) => void,\r\n\tRequestResult<T>,\r\n] => {\r\n\t/**\r\n\t * Destructure and provide default values for optional success and error handlers.\r\n\t */\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\t/**\r\n\t * Access the toast notification function from a custom toast context.\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * State to manage request lifecycle and request data.\r\n\t */\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\t/**\r\n\t * @function patchRequest\r\n\t * @description Triggers a PATCH HTTP request to the given endpoint with payload and optional config.\r\n\t * @param url - API endpoint for the PATCH request.\r\n\t * @param payload - The data to send in the request body.\r\n\t * @param config - Optional Axios configuration (headers, params, etc.)\r\n\t */\r\n\tconst patchRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\r\n\t\t\t/**\r\n\t\t\t * Set loading state before making the request.\r\n\t\t\t */\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\tpayload: true,\r\n\t\t\t});\r\n\t\t\t/**\r\n\t\t\t * Execute the PATCH request using Axios instance.\r\n\t\t\t */\r\n\t\t\taxiosInstance\r\n\t\t\t\t.patch(url, payload, config)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * On success, store response data and update success state.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\tif (res.data?.success) {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isSuccess\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined success handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\t\tpayload: res.data,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"error\");\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t\t */\r\n\r\n\t\t\t\t\t\tonError?.(res.data, payload);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Construct normalized error object from AxiosError.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\tstatus: err.response?.status ?? 500,\r\n\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\tdata: err.response?.data ?? null,\r\n\t\t\t\t\t\tstatusText: err.response?.statusText ?? \"\",\r\n\t\t\t\t\t\tcode: err?.code ?? \"\",\r\n\t\t\t\t\t\tname: err?.name ?? \"\",\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Show error message via toast system.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tshowToast(error.message, \"error\");\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Update state with error information.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isError\",\r\n\t\t\t\t\t\tpayload: error,\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Invoke user-defined error handler if available.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tonError?.(error, payload);\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\t\tpayload: false,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast] // Dependencies for memoization\r\n\t);\r\n\r\n\t/**\r\n\t * @returns A tuple containing the PATCH function and the current request state.\r\n\t */\r\n\treturn [patchRequest, state];\r\n};\r\n","import { createContext, useContext, useState, ReactNode } from \"react\";\r\nimport { Snackbar, Alert, AlertColor } from \"@mui/material\";\r\n\r\ntype ToastContextType = {\r\n showToast: (message: string, severity?: AlertColor) => void;\r\n};\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nexport const useToast = () => {\r\n const ctx = useContext(ToastContext);\r\n if (!ctx) throw new Error(\"useToast must be used inside ToastProvider\");\r\n return ctx;\r\n};\r\n\r\nexport const ToastProvider = ({ children }: { children: ReactNode }) => {\r\n const [open, setOpen] = useState(false);\r\n const [message, setMessage] = useState(\"\");\r\n const [severity, setSeverity] = useState<AlertColor>(\"info\");\r\n\r\n const showToast = (msg: string, sev: AlertColor = \"info\") => {\r\n setMessage(msg);\r\n setSeverity(sev);\r\n setOpen(true);\r\n };\r\n\r\n return (\r\n <ToastContext.Provider value={{ showToast }}>\r\n {children}\r\n <Snackbar\r\n open={open}\r\n color={severity}\r\n autoHideDuration={3000}\r\n onClose={() => setOpen(false)}\r\n anchorOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n >\r\n <Alert\r\n variant=\"filled\"\r\n severity={severity}\r\n onClose={() => setOpen(false)}\r\n sx={{ width: \"100%\" }}\r\n >\r\n {message}\r\n </Alert>\r\n </Snackbar>\r\n </ToastContext.Provider>\r\n );\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\n/**\r\n * @fileoverview 🎭 Comprehensive Dialog Components for CTI SDK\r\n *\r\n * This file contains all dialog components used in the CTI SDK for various call management operations.\r\n * It includes conference management, call transfer, disposition capture, process selection, and call history dialogs.\r\n * Each dialog provides a complete interface for specific telephony operations with real-time updates and error handling.\r\n *\r\n * 🎯 Key Dialog Components:\r\n * - 👥 ConferenceDialog: Multi-line conference call management\r\n * - 🔄 CallTransferDialog: Call transfer to processes, queues, or agents\r\n * - 📝 EndCallDispositionDialog: Call outcome capture and callback scheduling\r\n * - ⚙️ ProcessorListDialog: Process selection during initialization\r\n * - 📋 CallHistoryDialog: Call history interface (placeholder)\r\n *\r\n * 🚀 Core Features:\r\n * - 🎨 Material-UI dialog components with consistent styling\r\n * - 📡 Real-time API integration with loading states\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🔄 State management integration\r\n * - 📱 Responsive design for different screen sizes\r\n * - 🛡️ Error handling and validation\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\n// 📦 Material-UI Icon Imports - UI icons for dialog components\r\nimport {\r\n\tCall, // 📞 Call initiation icon\r\n\tCallEnd, // 📞 End call icon\r\n\tCallSplit, // 🔀 Call merge/split icon\r\n\tClose, // ❌ Close dialog icon\r\n\tMic, // 🎤 Microphone icon\r\n\tMicOff, // 🔇 Muted microphone icon\r\n\tPause, // ⏸️ Hold call icon\r\n\tPhoneDisabled, // 📵 Disabled phone icon\r\n\tPlayArrow, // ▶️ Resume call icon\r\n\tSupportAgent, // 🎧 Agent/support icon\r\n} from \"@mui/icons-material\";\r\n\r\n// 🎨 Material-UI Component Imports - Core UI components\r\nimport {\r\n\tBox, // 📦 Container component\r\n\tButton, // 🔘 Interactive button component\r\n\tDialog, // 🎭 Modal dialog component\r\n\tIconButton, // 🔘 Icon-only button component\r\n\tPaper, // 📄 Elevated surface component\r\n\tTextField, // 📝 Text input component\r\n\tTypography, // 📝 Text component\r\n\tAutocomplete, // 🔍 Autocomplete input component\r\n\tTooltip, // 💡 Hover tooltip component\r\n\tuseTheme, // 🎨 Theme hook\r\n\tTableContainer, // 📊 Table container component\r\n\tTable, // 📊 Table component\r\n\tTableHead, // 📊 Table header component\r\n\tTableRow, // 📊 Table row component\r\n\tTableCell, // 📊 Table cell component\r\n\tTableBody, // 📊 Table body component\r\n\tCircularProgress, // ⏳ Loading spinner component\r\n} from \"@mui/material\";\r\n\r\n// ⚛️ React Core Imports - Essential React functionality\r\nimport React, { useEffect, useState } from \"react\";\r\n\r\n// 🔧 SDK State Management - Core state management utilities\r\nimport { useSDKState } from \"../hooks/useSDKState\"; // 📊 SDK state hook\r\nimport { sdkStateManager } from \"../hooks/sdk-state\"; // 🗃️ Global state manager\r\n\r\n// 🌐 API Configuration - Endpoint and request management\r\nimport { usePostRequest } from \"../services/request\"; // 📡 HTTP request hook\r\nimport { END_POINT } from \"../services/endPoint\"; // 🔗 API endpoints\r\nimport axiosInstance from \"../services/axios\"; // 📡 Axios HTTP client\r\n\r\n// 🏷️ Type Definitions - TypeScript interfaces and types\r\nimport type { ConferenceLineTypes } from \"../../types\";\r\n\r\n// 🔧 Service Imports - External service integrations\r\nimport { useToast } from \"../services/toastMessage\"; // 🍞 Toast notification service\r\n\r\n// 🎨 Styling - Component styling utilities\r\nimport useStyles from \"./styles\"; // 🎨 Custom styles hook\r\n\r\n/**\r\n * 🔄 Type Definition: Call Transfer Request Payload\r\n *\r\n * @type TransferCallRequest\r\n * @description 📡 Defines the structure for call transfer API request payloads\r\n * Contains all necessary data for transferring calls to different destinations\r\n *\r\n * @properties\r\n * - `mobile_number?: string` - 📱 Customer phone number (optional)\r\n * - `userid?: string` - 👤 Agent identifier (optional)\r\n * - `type?: string` - 🎯 Transfer type: \"PROCESS\", \"QUEUE\", or \"AGENT\" (optional)\r\n * - `transfer_to?: string` - 🎯 Destination identifier (process name, queue name, or agent ID) (optional)\r\n * - `callreferenceid?: string` - 🔗 Unique call reference identifier (optional)\r\n * - `processid?: string` - ⚙️ Process identifier (optional)\r\n * - `process_name?: string` - 📝 Process name (optional)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Transfer to process\r\n * const processTransfer: TransferCallRequest = {\r\n * mobile_number: \"1234567890\",\r\n * userid: \"agent123\",\r\n * type: \"PROCESS\",\r\n * transfer_to: \"Sales Process\",\r\n * callreferenceid: \"call_12345\",\r\n * processid: \"proc_001\",\r\n * process_name: \"Sales Process\"\r\n * };\r\n *\r\n * // Transfer to agent\r\n * const agentTransfer: TransferCallRequest = {\r\n * mobile_number: \"1234567890\",\r\n * userid: \"agent123\",\r\n * type: \"AGENT\",\r\n * transfer_to: \"agent456\",\r\n * callreferenceid: \"call_12345\"\r\n * };\r\n * ```\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\ntype TransferCallRequest = {\r\n\tmobile_number?: string; // 📱 Customer phone number\r\n\tuserid?: string; // 👤 Agent identifier\r\n\ttype?: string; // 🎯 Transfer type (PROCESS/QUEUE/AGENT)\r\n\ttransfer_to?: string; // 🎯 Destination identifier\r\n\tcallreferenceid?: string; // 🔗 Call reference ID\r\n\tprocessid?: string; // ⚙️ Process identifier\r\n\tprocess_name?: string; // 📝 Process name\r\n};\r\n\r\n/**\r\n * 📊 Conference Table Row Component\r\n *\r\n * @component ConferenceTableRow\r\n * @description 🎯 Individual table row component for conference call management. Renders a single conference line\r\n * with comprehensive status display, controls, and action buttons for complete call management operations.\r\n * Each row represents one conference line with real-time status updates and interactive controls.\r\n *\r\n * @param {ConferenceLineTypes} each - 📊 Conference line data object containing:\r\n * - `line: number` - 📞 Line number identifier\r\n * - `status: string` - 📊 Current line status (IDLE, ONCALL, CONFERENCE, etc.)\r\n * - `phone: string` - 📱 Phone number for this line\r\n * - `isCallStart: boolean` - ✅ Whether call is active on this line\r\n * - `isHold: boolean` - ⏸️ Whether line is on hold\r\n * - `isMute: boolean` - 🔇 Whether line is muted\r\n * - `isMergeCall: boolean` - 🔗 Whether line is merged in conference\r\n *\r\n * @returns {JSX.Element} 📊 Complete table row with conference line controls\r\n *\r\n * @example\r\n * ```tsx\r\n * // Conference line for external call\r\n * <ConferenceTableRow each={{\r\n * line: 2,\r\n * status: \"ONCALL\",\r\n * phone: \"1234567890\",\r\n * isCallStart: true,\r\n * isHold: false,\r\n * isMute: false,\r\n * isMergeCall: false\r\n * }} />\r\n *\r\n * // Conference line for internal call (line 1)\r\n * <ConferenceTableRow each={{\r\n * line: 1,\r\n * status: \"CONFERENCE\",\r\n * phone: \"0987654321\",\r\n * isCallStart: true,\r\n * isHold: false,\r\n * isMute: true,\r\n * isMergeCall: true\r\n * }} />\r\n * ```\r\n *\r\n * @features\r\n * - 📞 Line number display with clear identification\r\n * - 📊 Real-time status indicator with color coding\r\n * - 🏷️ Call type classification (Internal/External)\r\n * - 📱 Editable phone number input field\r\n * - 🎛️ Complete action button set (Call, Merge, Hold, Mute, End)\r\n * - ⏳ Loading states for all operations\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🎨 Dynamic styling based on line state\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nconst ConferenceTableRow = ({ each }: any) => {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all conference functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t/**\r\n\t * 🍞 Toast Notification Service\r\n\t * @description Provides user feedback notifications for success, error, and info messages\r\n\t * @type {Function} - Toast notification function with message and type parameters\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t/**\r\n\t * 🎨 Dynamic Style Objects\r\n\t * @description Style objects that adapt based on SDK configuration for different button states\r\n\t * @type {Object} - Contains disabled, enabled, and outlined style configurations\r\n\t */\r\n\tconst { disabled, enabled, outlined } = useStyles({\r\n\t\tdisabled: state.sdkConfig?.disabled || {}, // 🔴 Disabled button styles\r\n\t\tenabled: state.sdkConfig?.enabled || {}, // 🟢 Enabled button styles\r\n\t\toutlined: state.sdkConfig?.outlined || {}, // ⚪ Outlined button styles\r\n\t});\r\n\r\n\t/**\r\n\t * 🎨 Material-UI Theme Object\r\n\t * @description Provides access to Material-UI theme for consistent styling across components\r\n\t * @type {Theme} - Material-UI theme object containing colors, spacing, typography, etc.\r\n\t */\r\n\tconst theme = useTheme();\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ LOADING STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Start Loading State\r\n\t * @description Loading state for conference call start operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during call initiation API requests\r\n\t */\r\n\tconst [conferenceCallStart, setConferenceCallStart] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Merge Loading State\r\n\t * @description Loading state for conference call merge operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during call merge API requests\r\n\t */\r\n\tconst [conferenceCallMerge, setConferenceCallMerge] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Hold/Unhold Loading State\r\n\t * @description Loading state for hold/unhold operations\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during hold/unhold API requests\r\n\t */\r\n\tconst [conferenceCallHoldOrUnHold, setConferenceCallHoldOrUnHold] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call Mute/Unmute Loading State\r\n\t * @description Loading state for mute/unmute operations\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during mute/unmute API requests\r\n\t */\r\n\tconst [conferenceCallMuteOrUnMute, setConferenceCallMuteOrUnMute] = useState(false);\r\n\r\n\t/**\r\n\t * ⏳ Conference Call End Loading State\r\n\t * @description Loading state for conference call end operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during call termination API requests\r\n\t */\r\n\tconst [conferenceCallEnd, setConferenceCallEnd] = useState(false);\r\n\r\n\t// =============================================================================\r\n\t// 🔧 UTILITY FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🔄 Conference Line Data Update Utility\r\n\t *\r\n\t * @function onConferenceLineUpdate\r\n\t * @description 📊 Updates conference line data in the SDK state manager by merging new data\r\n\t * with existing line data. This ensures real-time updates to conference line\r\n\t * properties like phone numbers, status, and control states.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Current conference line data object\r\n\t * @param {any} data - 🔄 New data to merge with existing line data\r\n\t *\r\n\t * @returns {void} No return value - updates SDK state directly\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Update phone number for a conference line\r\n\t * onConferenceLineUpdate(lineData, { phone: \"9876543210\" });\r\n\t *\r\n\t * // Update multiple properties\r\n\t * onConferenceLineUpdate(lineData, {\r\n\t * phone: \"9876543210\",\r\n\t * status: \"ONCALL\",\r\n\t * isMute: true\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔄 Immutable state updates using spread operator\r\n\t * - 📊 Real-time conference line synchronization\r\n\t * - 🎯 Targeted property updates without affecting other properties\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onConferenceLineUpdate = (line: ConferenceLineTypes, data: any) => {\r\n\t\tsdkStateManager.setConferenceLine({ ...line, ...data }); // 🔄 Merge and update line data\r\n\t};\r\n\r\n\t/**\r\n\t * 📞 Conference Call Start Handler\r\n\t *\r\n\t * @function onConferenceCallStart\r\n\t * @description 🎯 Initiates a conference call by making an API request to start an external conference.\r\n\t * This function handles the complete call initiation process including payload construction,\r\n\t * API communication, state updates, and user feedback through toast notifications.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Start conference call on line 2\r\n\t * onConferenceCallStart(lineData, {\r\n\t * isCallStart: true,\r\n\t * status: \"ONCALL\",\r\n\t * phone: \"1234567890\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"CALL{line_number}\" (e.g., \"CALL2\")\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 📊 Conference line state synchronization\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onConferenceCallStart = (line: ConferenceLineTypes, data: any) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallStart(true);\r\n\r\n\t\t// 📦 Prepare API payload for conference call initiation\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: `CALL${line_used.line}`, // 🔧 Operation with line number\r\n\t\t\tline_used: String(line_used.line), // 📞 Line identifier as string\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to initiate conference call\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallStart(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * 🔀 Conference Call Merge Handler\r\n\t *\r\n\t * @function onMergeConferenceCall\r\n\t * @description 🔗 Merges multiple conference calls by making an API request to combine active calls\r\n\t * into a single conference session. This allows multiple participants to be connected\r\n\t * in one conference call with shared audio and controls.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Merge conference calls on line 1\r\n\t * onMergeConferenceCall(lineData, {\r\n\t * isMergeCall: true,\r\n\t * status: \"ONCALL\"\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"CONFERENCE\"\r\n\t * - 📞 Line Used: Line identifier as string\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🔗 Conference call merging functionality\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onMergeConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallMerge(true);\r\n\r\n\t\t// 📦 Prepare API payload for conference call merge\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: `CONFERENCE`, // 🔧 Merge operation\r\n\t\t\tline_used: String(line_used.line), // 📞 Line identifier as string\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to merge conference calls\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallMerge(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * ⏸️ Conference Call Hold/Unhold Handler\r\n\t *\r\n\t * @function onHoldOrUnHoldConferenceCall\r\n\t * @description 🔄 Toggles hold status for conference call lines by making API requests to either\r\n\t * hold or unhold specific conference lines. This allows agents to temporarily\r\n\t * suspend audio for individual participants while maintaining the conference.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t * @param {string} type - 🎯 Operation type: \"HOLDUSER\" to hold or \"UNHOLDUSER\" to unhold\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Hold a conference line\r\n\t * onHoldOrUnHoldConferenceCall(lineData, { isHold: true }, \"HOLDUSER\");\r\n\t *\r\n\t * // Unhold a conference line\r\n\t * onHoldOrUnHoldConferenceCall(lineData, { isHold: false }, \"UNHOLDUSER\");\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"HOLDUSER\" or \"UNHOLDUSER\"\r\n\t * - 📞 Hold Channel: \"hold{line_number}\" or \"unhold{line_number}\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_HOLD_OR_UN_HOLD\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - ⏸️ Individual line hold/unhold control\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onHoldOrUnHoldConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallHoldOrUnHold(true);\r\n\r\n\t\t// 📦 Prepare API payload for hold/unhold operation\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: type, // 🔧 Hold or unhold operation\r\n\t\t\thold_channel_no: type === \"HOLDUSER\" ? `hold${line_used.line}` : `unhold${line_used.line}`, // 📞 Channel identifier\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to hold/unhold conference line\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_HOLD_OR_UN_HOLD, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallHoldOrUnHold(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * 🔇 Conference Call Mute/Unmute Handler\r\n\t *\r\n\t * @function onMuteOrUnMuteConferenceCall\r\n\t * @description 🎤 Toggles mute status for conference call lines by making API requests to either\r\n\t * mute or unmute specific conference lines. This allows agents to control audio\r\n\t * output for individual participants while maintaining the conference connection.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t * @param {string} type - 🎯 Operation type: \"MUTEUSER\" to mute or \"PLAYUSER\" to unmute\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Mute a conference line\r\n\t * onMuteOrUnMuteConferenceCall(lineData, { isMute: true }, \"MUTEUSER\");\r\n\t *\r\n\t * // Unmute a conference line\r\n\t * onMuteOrUnMuteConferenceCall(lineData, { isMute: false }, \"PLAYUSER\");\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"MUTEUSER\" or \"PLAYUSER\"\r\n\t * - 📞 Channel: \"mute{line_number}\" or \"play{line_number}\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_MUTE_OT_UN_MUTE\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🎤 Individual line mute/unmute control\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onMuteOrUnMuteConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallMuteOrUnMute(true);\r\n\r\n\t\t// 📦 Prepare API payload for mute/unmute operation\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: type, // 🔧 Mute or unmute operation\r\n\t\t\tchannel_no: type === \"MUTEUSER\" ? `mute${line_used.line}` : `play${line_used.line}`, // 📞 Channel identifier\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to mute/unmute conference line\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_MUTE_OT_UN_MUTE, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallMuteOrUnMute(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * 📞 Conference Call End Handler\r\n\t *\r\n\t * @function onEndConferenceCall\r\n\t * @description 🔚 Ends a specific conference call line by making an API request to terminate\r\n\t * the connection for that particular line. This allows agents to disconnect\r\n\t * individual participants while maintaining other conference lines.\r\n\t *\r\n\t * @param {ConferenceLineTypes} line - 📊 Conference line data object containing line information\r\n\t * @param {any} data - 🔄 Additional data to merge with line data before making the API call\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // End conference call on line 2\r\n\t * onEndConferenceCall(lineData, {\r\n\t * isCallStart: false,\r\n\t * status: \"LINE USED\",\r\n\t * isMergeCall: false,\r\n\t * isMute: false,\r\n\t * isHold: false\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"HANGUP_CHANNEL\"\r\n\t * - 📞 Line Used: Line identifier minus 1 (e.g., line 2 becomes \"1\")\r\n\t * - 👤 User Type: \"THIRDPARTY{line_number_minus_1}\"\r\n\t * - 📱 Phone: Third party phone number\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_END\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Real-time state updates\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🔚 Individual line termination control\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onEndConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n\t\t// 🔄 Merge line data with additional data\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallEnd(true);\r\n\r\n\t\t// 📦 Prepare API payload for conference call termination\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: \"HANGUP_CHANNEL\", // 🔧 Hangup operation\r\n\t\t\tline_used: String(line_used.line - 1), // 📞 Line identifier (adjusted for API)\r\n\t\t\tuser_type: `THIRDPARTY${line_used.line - 1}`, // 👤 User type identifier\r\n\t\t\tthirdparty_no: line_used.phone, // 📱 Target phone number\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to end conference call\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_END, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Update conference line state\r\n\t\t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallEnd(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\treturn (\r\n\t\t<TableRow\r\n\t\t\tkey={each.line}\r\n\t\t\tsx={{\r\n\t\t\t\tborder: \"2px solid #fff\",\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Typography>Line {each?.line ?? \"\"}. </Typography>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Typography\r\n\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tpx: 1,\r\n\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{each?.status ?? \"\"}\r\n\t\t\t\t</Typography>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Button\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t>\r\n\t\t\t\t\t<Typography variant=\"body2\">{each?.line === 1 ? \"Internal\" : \"External\"}</Typography>\r\n\t\t\t\t</Button>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<TextField\r\n\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\tplaceholder=\"Phone Number\"\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tvalue={each?.phone || \"\"}\r\n\t\t\t\t\tdisabled={each?.line === 1 || each?.status === \"LINE USED\"}\r\n\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\tonConferenceLineUpdate(each, { phone: e.target.value });\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\tjustifyContent: \"space-around\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{/* Conference Call Button */}\r\n\t\t\t\t\t{each.line !== 1 && (\r\n\t\t\t\t\t\t<Tooltip title=\"Call\">\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={each?.status !== \"IDLE\" ? \"outlined\" : \"contained\"}\r\n\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\teach?.status !== \"IDLE\" ?\r\n\t\t\t\t\t\t\t\t\t\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t\t:\t{\r\n\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"success.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `0px 2px 1px ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"success.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonConferenceCallStart(each, {});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={each?.status !== \"IDLE\"}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{conferenceCallStart ?\r\n\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t:\t<Call sx={{ color: each?.status !== \"IDLE\" ? \"default\" : \"#f3f2f2\" }} />}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{/* Merge Call Button */}\r\n\t\t\t\t\t{each.line === 1 && (\r\n\t\t\t\t\t\t<Tooltip title=\"Merge Call\">\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={each?.isMergeCall && each?.status === \"ONCALL\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\teach?.isMergeCall && each?.status === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t{ ...disabled, padding: \"0px 16px\" }\r\n\t\t\t\t\t\t\t\t\t: each?.status === \"ONCALL\" ?\r\n\t\t\t\t\t\t\t\t\t\t{ ...outlined, padding: \"0px 16px\" }\r\n\t\t\t\t\t\t\t\t\t:\t{ ...disabled, padding: \"0px 16px\" }\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonMergeConferenceCall(each, {\r\n\t\t\t\t\t\t\t\t\t\tisMergeCall: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={each?.status !== \"ONCALL\" || conferenceCallMerge}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{each?.isMergeCall ? \"Merged\" : \"Merge\"}\r\n\t\t\t\t\t\t\t\t{conferenceCallMerge ?\r\n\t\t\t\t\t\t\t\t\t<CircularProgress size=\"20px\" />\r\n\t\t\t\t\t\t\t\t:\t<CallSplit />}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t{/* Hold Or Un Hold Call Button */}\r\n\t\t\t\t\t<Tooltip title={each.isHold ? \"Hold\" : \"Un Hold\"}>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant={each?.isHold ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t(each?.isHold && each?.status === \"ONCALL\") || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t: each?.status === \"ONCALL\" || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tif (each.isHold) {\r\n\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: false }, \"UNHOLDUSER\");\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: true }, \"HOLDUSER\");\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t(each?.status !== \"ONCALL\" && each?.status !== \"CONFERENCE\") ||\r\n\t\t\t\t\t\t\t\tconferenceCallHoldOrUnHold\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallHoldOrUnHold ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t: each.isHold ?\r\n\t\t\t\t\t\t\t\t<PlayArrow />\r\n\t\t\t\t\t\t\t:\t<Pause />}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t{/* Mute Or Un Mute Call Button */}\r\n\t\t\t\t\t<Tooltip title={each.isMute ? \"Mute\" : \"Un Mute\"}>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant={each?.isMute ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t(each?.isMute && each?.status === \"ONCALL\") || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...disabled }\r\n\t\t\t\t\t\t\t\t: each?.status === \"ONCALL\" || each?.status === \"CONFERENCE\" ?\r\n\t\t\t\t\t\t\t\t\t{ ...outlined }\r\n\t\t\t\t\t\t\t\t:\t{ ...disabled }\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tif (each.isMute) {\r\n\t\t\t\t\t\t\t\t\tonMuteOrUnMuteConferenceCall(each, { isMute: false }, \"PLAYUSER\");\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tonMuteOrUnMuteConferenceCall(each, { isMute: true }, \"MUTEUSER\");\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t(each?.status !== \"ONCALL\" && each?.status !== \"CONFERENCE\") ||\r\n\t\t\t\t\t\t\t\tconferenceCallMuteOrUnMute\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallMuteOrUnMute ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tcolor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t: each.isMute ?\r\n\t\t\t\t\t\t\t\t<MicOff />\r\n\t\t\t\t\t\t\t:\t<Mic />}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t{/* End Call Button */}\r\n\t\t\t\t\t{each?.line !== 1 ?\r\n\t\t\t\t\t\t<Tooltip title=\"End Call\">\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"CONFERENCE\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"DIALING\"\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\"contained\"\r\n\t\t\t\t\t\t\t\t\t:\t\"outlined\"\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"ONCALL\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"CONFERENCE\" ||\r\n\t\t\t\t\t\t\t\t\t\teach?.status === \"DIALING\"\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `0px 2px 1px ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t:\t{\r\n\t\t\t\t\t\t\t\t\t\t\t...disabled,\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonEndConferenceCall(each, {\r\n\t\t\t\t\t\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\t\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t\t\t\t\t\t\tisMute: false,\r\n\t\t\t\t\t\t\t\t\t\tisHold: false,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\t(each?.status !== \"ONCALL\" &&\r\n\t\t\t\t\t\t\t\t\t\teach?.status !== \"CONFERENCE\" &&\r\n\t\t\t\t\t\t\t\t\t\teach?.status !== \"DIALING\") ||\r\n\t\t\t\t\t\t\t\t\tconferenceCallEnd\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{conferenceCallEnd ?\r\n\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t:\t<CallEnd />}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t:\t<Button\r\n\t\t\t\t\t\t\tvariant={each?.isCallStart ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tdisplay: \"none\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\tonEndConferenceCall(each, {\r\n\t\t\t\t\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t\t\t\t\t\tisMute: false,\r\n\t\t\t\t\t\t\t\t\tisHold: false,\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tdisabled={!each?.isCallStart || conferenceCallEnd}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallEnd ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t:\t<CallEnd />}\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</Box>\r\n\t\t\t</TableCell>\r\n\t\t</TableRow>\r\n\t);\r\n};\r\n\r\n/**\r\n * =============================================================================\r\n * 👥 CONFERENCE DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * 🎭 Main Conference Call Management Dialog\r\n *\r\n * @component ConferenceDialog\r\n * @description 🎯 Main conference call management dialog that provides a comprehensive interface\r\n * for managing multiple conference lines, starting calls, merging calls, and ending\r\n * conferences. This dialog serves as the central hub for all conference-related\r\n * operations with real-time status updates and complete call control functionality.\r\n *\r\n * @returns {JSX.Element} 🎭 Complete conference management interface\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage - renders conference management dialog\r\n * <ConferenceDialog />\r\n * ```\r\n *\r\n * @features\r\n * - 📊 Conference line table with real-time status display\r\n * - 🎛️ Individual line controls (Call, Merge, Hold, Mute, End)\r\n * - 🔚 End all conference button for bulk termination\r\n * - 📱 Phone number input for each conference line\r\n * - ⏳ Loading states for all operations\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🎨 Material-UI styling with consistent design\r\n * - 📊 Real-time status updates via WebSocket\r\n * - 🔄 State management integration\r\n *\r\n * @components\r\n * - 📋 Conference line table with ConferenceTableRow components\r\n * - 🔘 Action buttons for each conference line\r\n * - 📱 Phone number input fields\r\n * - 🔚 End all conference button\r\n * - ❌ Close dialog button\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport function ConferenceDialog() {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all conference functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t/**\r\n\t * 🍞 Toast Notification Service\r\n\t * @description Provides user feedback notifications for success, error, and info messages\r\n\t * @type {Function} - Toast notification function with message and type parameters\r\n\t */\r\n\tconst { showToast } = useToast();\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ LOADING STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ⏳ End All Conference Calls Loading State\r\n\t * @description Loading state for ending all conference calls operation\r\n\t * @type {useState<boolean>} - Boolean flag for loading indicator\r\n\t * @purpose Shows loading spinner during bulk conference termination API requests\r\n\t */\r\n\tconst [conferenceCallEndAll, setConferenceCallEndAll] = useState(false);\r\n\r\n\t// =============================================================================\r\n\t// 🔧 UTILITY FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ❌ Conference Dialog Close Handler\r\n\t *\r\n\t * @function handleClose\r\n\t * @description 🚪 Closes the conference dialog by updating the SDK state manager.\r\n\t * This function provides a simple way to close the dialog and return\r\n\t * to the main call control interface.\r\n\t *\r\n\t * @returns {void} No return value - updates SDK state directly\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when close button is clicked\r\n\t * handleClose();\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔄 Updates SDK state to close dialog\r\n\t * - 🎯 Simple one-line implementation\r\n\t * - 🚪 Provides clean dialog closure\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleClose = () => {\r\n\t\tsdkStateManager.setOpenConferenceDialog(false); // 🚪 Close conference dialog\r\n\t};\r\n\r\n\t/**\r\n\t * 🔚 End All Conference Calls Handler\r\n\t *\r\n\t * @function onEndAllConferenceCalls\r\n\t * @description 🎯 Ends all active conference calls by making an API request to terminate\r\n\t * the entire conference session. This function provides bulk termination\r\n\t * functionality for all conference lines and resets the conference state.\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when \"End Conference\" button is clicked\r\n\t * onEndAllConferenceCalls();\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: \"EXTERNAL_CONFERENCE\"\r\n\t * - 🔧 Operation: \"ENDCONFERENCE\"\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - ⚙️ Process: Current process name\r\n\t * - 📡 Endpoint: CONFERENCE_CALL_END_ALL\r\n\t *\r\n\t * @features\r\n\t * - ⏳ Loading state management during API call\r\n\t * - 🍞 Success/error toast notifications\r\n\t * - 🔄 Conference state reset after successful termination\r\n\t * - 🚪 Automatic dialog closure after completion\r\n\t * - 🛡️ Comprehensive error handling\r\n\t * - 🔚 Bulk conference termination\r\n\t *\r\n\t * @effects\r\n\t * - 🔄 Resets all conference lines to initial state\r\n\t * - 🚪 Closes the conference dialog\r\n\t * - 🍞 Shows success/error notifications\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst onEndAllConferenceCalls = () => {\r\n\t\t// ⏳ Set loading state to show spinner\r\n\t\tsetConferenceCallEndAll(true);\r\n\r\n\t\t// 📦 Prepare API payload for ending all conference calls\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\", // 🎯 API action type\r\n\t\t\toperation: \"ENDCONFERENCE\", // 🔧 End conference operation\r\n\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\tprocess: state.callData?.process_name ?? \"\", // ⚙️ Process name\r\n\t\t};\r\n\r\n\t\t// 📡 Make API call to end all conference calls\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_END_ALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\t// 🍞 Show success notification\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t// 🔄 Reset all conference lines to initial state\r\n\t\t\t\tsdkStateManager.resetConferenceLines();\r\n\t\t\t\t// 🚪 Close the conference dialog\r\n\t\t\t\thandleClose();\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// 🛡️ Extract error message from various possible sources\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\t// 🍞 Show error notification\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// ⏳ Clear loading state\r\n\t\t\t\tsetConferenceCallEndAll(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={state.openConferenceDialog}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"10px 16px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\">{state?.agentId ?? \"\"} conference</Typography>\r\n\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 2px #e7e5e5ff\",\r\n\t\t\t\t\t\t\tmargin: \"0px 15px\",\r\n\t\t\t\t\t\t\tborderRadius: \"20px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<TableContainer\r\n\t\t\t\t\t\t\tcomponent={Paper}\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\toutline: \"0px solid gray !important\",\r\n\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 6px #e7e5e5ff\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<Table\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tborder: \"4px solid #ffffff !important\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<TableHead>\r\n\t\t\t\t\t\t\t\t\t<TableRow\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tborder: \"2px solid #f3f3f3ff !important\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tLine\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tStatus\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tCall Type\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tMobile Number\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tCall Actions\r\n\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t</TableHead>\r\n\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t{state?.conferenceLine.map((each: any) => (\r\n\t\t\t\t\t\t\t\t\t\t<ConferenceTableRow each={each} />\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t</TableBody>\r\n\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t</TableContainer>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t{/* End All Calls */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\ttextAlign=\"center\"\r\n\t\t\t\t\t\tm={2}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\tonClick={onEndAllConferenceCalls}\r\n\t\t\t\t\t\t\tdisabled={conferenceCallEndAll}\r\n\t\t\t\t\t\t\tsx={{ px: 2, borderRadius: \"20px\", textTransform: \"capitalize\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{conferenceCallEndAll ?\r\n\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tmarginRight: \"8px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t:\t<IconButton\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.main\",\r\n\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"error.dark\" },\r\n\t\t\t\t\t\t\t\t\t\tmarginRight: \"8px\",\r\n\t\t\t\t\t\t\t\t\t\twidth: \"28px\",\r\n\t\t\t\t\t\t\t\t\t\theight: \"28px\",\r\n\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\",\r\n\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\tlineHeight: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\tcolor: \"white\",\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"50%\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<PhoneDisabled\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"white\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tEnd Conference\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * 🔄 CALL TRANSFER DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * 🎭 Call Transfer Management Dialog\r\n *\r\n * @component CallTransferDialog\r\n * @description 🔄 Dialog for transferring calls to processes, queues, or agents. Provides a comprehensive\r\n * interface for selecting transfer destinations and executing transfers with real-time\r\n * data loading and user feedback. This dialog supports multiple transfer types with\r\n * tabbed navigation for easy destination selection.\r\n *\r\n * @param {boolean} open - 👁️ Controls dialog visibility state\r\n *\r\n * @returns {JSX.Element} 🎭 Complete call transfer interface\r\n *\r\n * @example\r\n * ```tsx\r\n * // Basic usage - renders call transfer dialog\r\n * <CallTransferDialog open={true} />\r\n *\r\n * // With state management\r\n * const [transferOpen, setTransferOpen] = useState(false);\r\n * <CallTransferDialog open={transferOpen} />\r\n * ```\r\n *\r\n * @features\r\n * - 📋 Tabbed interface for different transfer types (Process, Queue, Agent)\r\n * - 🔄 Real-time data loading for available destinations\r\n * - ⏳ Loading states for all operations\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🎨 Material-UI styling with consistent design\r\n * - 📡 API integration for destination data\r\n * - 🎯 One-click transfer execution\r\n * - 🛡️ Error handling and validation\r\n *\r\n * @components\r\n * - 📋 Transfer destination tabs (Process, Queue, Agent)\r\n * - 📊 Destination selection interface with cards\r\n * - 🔘 Transfer execution buttons\r\n * - ⏳ Loading spinners for data fetching\r\n * - ❌ Close dialog button\r\n *\r\n * @since 1.0.0\r\n * @author CTI SDK Team\r\n */\r\nexport function CallTransferDialog({ open }: any) {\r\n\t// =============================================================================\r\n\t// 🎨 THEME & STYLING SETUP\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 🗃️ SDK State Management Hook\r\n\t * @description Centralized state management for all transfer functionality\r\n\t * @type {SDKState} - Complete SDK state including call data, agent status, configuration\r\n\t */\r\n\tconst state = useSDKState();\r\n\r\n\t// =============================================================================\r\n\t// 📡 API HOOKS & REQUEST MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📞 Call Transfer API Hook\r\n\t * @description Custom hook for making call transfer API requests with automatic success handling\r\n\t * @type {usePostRequest<TransferCallRequest>} - HTTP request hook with TransferCallRequest type\r\n\t * @purpose Handles call transfer operations with loading states and success callbacks\r\n\t */\r\n\tconst [transferCall] = usePostRequest<TransferCallRequest>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setOpenCallTransferDialog(false); // 🚪 Close dialog on successful transfer\r\n\t\t},\r\n\t});\r\n\r\n\t// =============================================================================\r\n\t// 🎛️ UI STATE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📋 Currently Selected Tab State\r\n\t * @description Tracks which tab is currently active in the transfer dialog\r\n\t * @type {useState<string>} - String state for tab identifier\r\n\t * @purpose Controls which transfer destination type is displayed (process, queue, agent)\r\n\t */\r\n\tconst [currentselecteTab, setCurrentselecteTab] = useState(\"process\");\r\n\r\n\t// =============================================================================\r\n\t// 📡 DATA FETCHING HOOKS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 👥 Idle Agents List API Hook\r\n\t * @description Custom hook for fetching available idle agents for transfer\r\n\t * @type {usePostRequest<any>} - HTTP request hook for agents data\r\n\t * @purpose Retrieves list of available agents who can receive transferred calls\r\n\t */\r\n\tconst [getIdelAgentsList, { data: idleAgentsList, isLoading: isIdleAgentsListLoading }] =\r\n\t\tusePostRequest<any>({\r\n\t\t\tdisabledSuccessToast: true, // 🔇 Disable automatic success toast\r\n\t\t});\r\n\r\n\t/**\r\n\t * 📊 Process and Queues List API Hook\r\n\t * @description Custom hook for fetching available processes and queues for transfer\r\n\t * @type {usePostRequest<object>} - HTTP request hook for processes/queues data\r\n\t * @purpose Retrieves list of available processes and queues for call transfer\r\n\t */\r\n\tconst [\r\n\t\tgetProcessAndQueuesList,\r\n\t\t{ data: processAndQueuesList, isLoading: isProcessAndQueuesListLoading },\r\n\t] = usePostRequest<{\r\n\t\tstatus: string; // 📊 Status filter\r\n\t\tactive: boolean; // ✅ Active filter\r\n\t\tprocess?: any[]; // ⚙️ Process list\r\n\t\tqueue?: any[]; // 📋 Queue list\r\n\t}>({\r\n\t\tdisabledSuccessToast: true, // 🔇 Disable automatic success toast\r\n\t});\r\n\r\n\t// =============================================================================\r\n\t// 🔧 UTILITY FUNCTIONS\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * ❌ Call Transfer Dialog Close Handler\r\n\t *\r\n\t * @function handleClose\r\n\t * @description 🚪 Closes the call transfer dialog by updating the SDK state manager.\r\n\t * This function provides a simple way to close the dialog and return\r\n\t * to the main call control interface.\r\n\t *\r\n\t * @returns {void} No return value - updates SDK state directly\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Called when close button is clicked\r\n\t * handleClose();\r\n\t * ```\r\n\t *\r\n\t * @features\r\n\t * - 🔄 Updates SDK state to close dialog\r\n\t * - 🎯 Simple one-line implementation\r\n\t * - 🚪 Provides clean dialog closure\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleClose = () => {\r\n\t\tsdkStateManager.setOpenCallTransferDialog(false); // 🚪 Close transfer dialog\r\n\t};\r\n\r\n\t/**\r\n\t * 🔄 Call Transfer Execution Handler\r\n\t *\r\n\t * @function handleTransferCall\r\n\t * @description 🎯 Executes call transfer to selected destination by constructing appropriate\r\n\t * API payloads based on transfer type and making the transfer request.\r\n\t * Supports three transfer types: Process, Queue, and Agent transfers.\r\n\t *\r\n\t * @param {any} data - 📊 Transfer destination data object containing destination information\r\n\t * @param {string} type - 🎯 Transfer type: \"PROCESS\", \"QUEUE\", or \"AGENT\"\r\n\t *\r\n\t * @returns {void} No return value - makes API call and updates state asynchronously\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Transfer to a process\r\n\t * handleTransferCall(processData, \"PROCESS\");\r\n\t *\r\n\t * // Transfer to a queue\r\n\t * handleTransferCall(queueData, \"QUEUE\");\r\n\t *\r\n\t * // Transfer to an agent\r\n\t * handleTransferCall(agentData, \"AGENT\");\r\n\t * ```\r\n\t *\r\n\t * @api\r\n\t * - 🎯 Action: Varies by transfer type\r\n\t * - 📱 Mobile Number: Customer phone number from call data\r\n\t * - 👤 User ID: Current agent identifier\r\n\t * - 🔗 Call Reference ID: Unique call identifier\r\n\t * - ⚙️ Process ID: Current process identifier\r\n\t * - 📝 Process Name: Current process name\r\n\t * - 📡 Endpoint: TRANSFER_CALL\r\n\t *\r\n\t * @features\r\n\t * - 🎯 Dynamic payload construction based on transfer type\r\n\t * - 📊 Comprehensive call data integration\r\n\t * - 🔄 Automatic dialog closure on success\r\n\t * - 🛡️ Error handling through usePostRequest hook\r\n\t * - 📞 Support for all transfer destination types\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tconst handleTransferCall = (data: any, type: string) => {\r\n\t\tconsole.log(data, \"data34\"); // 📝 Debug log for transfer data\r\n\r\n\t\t// 🔄 Process Transfer Logic\r\n\t\tif (type === \"PROCESS\") {\r\n\t\t\t// 📦 Prepare API payload for process transfer\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\ttype: \"PROCESS\", // 🎯 Transfer type\r\n\t\t\t\ttransfer_to: data?.process_name ?? \"\", // 🎯 Destination process name\r\n\t\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"), // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t};\r\n\t\t\t// 📡 Execute process transfer\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t}\r\n\t\t// 🔄 Queue Transfer Logic\r\n\t\telse if (type === \"QUEUE\") {\r\n\t\t\t// 📦 Prepare API payload for queue transfer\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\ttype: \"QUEUE\", // 🎯 Transfer type\r\n\t\t\t\ttransfer_to: data?.queue_name ?? \"\", // 🎯 Destination queue name\r\n\t\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"), // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t};\r\n\t\t\t// 📡 Execute queue transfer\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t}\r\n\t\t// 🔄 Agent Transfer Logic\r\n\t\telse if (type === \"AGENT\") {\r\n\t\t\t// 📦 Prepare API payload for agent transfer\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\", // 📱 Customer phone number\r\n\t\t\t\tuserid: state.callData?.agent_id ?? \"\", // 👤 Agent identifier\r\n\t\t\t\ttype: \"AGENT\", // 🎯 Transfer type\r\n\t\t\t\ttransfer_to: data?.user_id ?? \"\", // 🎯 Destination agent ID\r\n\t\t\t\tcallreferenceid: state.callData?.convox_id ?? \"\", // 🔗 Call reference ID\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"), // ⚙️ Process ID as string\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\", // 📝 Process name\r\n\t\t\t};\r\n\t\t\t// 📡 Execute agent transfer\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t}\r\n\t};\r\n\r\n\t// =============================================================================\r\n\t// 🔄 EFFECT HOOKS - LIFECYCLE MANAGEMENT\r\n\t// =============================================================================\r\n\r\n\t/**\r\n\t * 📡 Data Fetching Effect Hook\r\n\t *\r\n\t * @hook useEffect - Data Fetching\r\n\t * @description 🔄 Fetches available transfer destinations on component mount to populate\r\n\t * the transfer dialog with current agents, processes, and queues.\r\n\t * This ensures users have access to all available transfer options.\r\n\t *\r\n\t * @dependencies [] - Empty dependency array for component mount only\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * // Automatically runs on component mount\r\n\t * // Fetches idle agents and active processes/queues\r\n\t * ```\r\n\t *\r\n\t * @effects\r\n\t * - 👥 Loads available idle agents for agent transfers\r\n\t * - ⚙️ Loads active processes for process transfers\r\n\t * - 📋 Loads active queues for queue transfers\r\n\t * - 🔄 Populates transfer destination options\r\n\t *\r\n\t * @api\r\n\t * - 📡 Endpoint: AGENTS_LIST - Fetches idle agents\r\n\t * - 📡 Endpoint: TRANSFER_TO_DETAILS - Fetches processes and queues\r\n\t * - 🔍 Filters: Status and active flags for relevant data\r\n\t *\r\n\t * @since 1.0.0\r\n\t * @author CTI SDK Team\r\n\t */\r\n\tuseEffect(() => {\r\n\t\t// 👥 Fetch available idle agents for transfer\r\n\t\tgetIdelAgentsList(END_POINT.AGENTS_LIST, {\r\n\t\t\tstatus: \"IDLE\", // 🔍 Only idle agents\r\n\t\t\tactive: true, // ✅ Only active agents\r\n\t\t});\r\n\r\n\t\t// ⚙️ Fetch available processes and queues for transfer\r\n\t\tgetProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n\t\t\tstatus: \"ACTIVE\", // 🔍 Only active processes/queues\r\n\t\t\tactive: true, // ✅ Only active items\r\n\t\t});\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Call Transfer</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Process and Queues */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"6px 10px\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"process\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCurrentselecteTab(\"process\");\r\n\t\t\t\t\t\t\t\t\tgetProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n\t\t\t\t\t\t\t\t\t\tstatus: \"ACTIVE\",\r\n\t\t\t\t\t\t\t\t\t\tactive: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tProcess\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"queues\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCurrentselecteTab(\"queues\");\r\n\t\t\t\t\t\t\t\t\tgetProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n\t\t\t\t\t\t\t\t\t\tstatus: \"ACTIVE\",\r\n\t\t\t\t\t\t\t\t\t\tactive: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tQueues\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"agents\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCurrentselecteTab(\"agents\");\r\n\t\t\t\t\t\t\t\t\tgetIdelAgentsList(END_POINT.AGENTS_LIST, {\r\n\t\t\t\t\t\t\t\t\t\tstatus: \"IDLE\",\r\n\t\t\t\t\t\t\t\t\t\tactive: true,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tAgents\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t{(isProcessAndQueuesListLoading || isIdleAgentsListLoading) && (\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\theight: \"80px\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<CircularProgress />{\" \"}\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!isIdleAgentsListLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"process\" && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t{(\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process &&\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.length > 0\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.map((process: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.process_name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleTransferCall(process, \"PROCESS\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tNo Process Found\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!isIdleAgentsListLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"queues\" && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t{(\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue &&\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue?.length > 0\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue?.map((queue: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{queue.queue_name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.find(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(process: any) => process.process_id === queue.process_id\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)?.process_name\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\"(\" +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.find(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(process: any) => process.process_id === queue.process_id\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)?.process_name +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\")\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t:\t\"\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleTransferCall(queue, \"QUEUE\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tNo Queues Found\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!isIdleAgentsListLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"agents\" && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t{idleAgentsList?.data && idleAgentsList?.data?.length > 0 ?\r\n\t\t\t\t\t\t\t\t\t\tidleAgentsList?.data?.map((agent: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{agent.name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleTransferCall(agent, \"AGENT\");\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t:\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"60px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tNo Agents Found\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * END CALL DISPOSITION DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * @component EndCallDispositionDialog\r\n * @description Dialog for capturing call disposition data when ending calls. Collects outcome, follow-up requirements, and callback scheduling information.\r\n * @declaration\r\n * ```typescript\r\n * export function EndCallDispositionDialog({ open, setOpen, onSubmitDisposition }: any) {\r\n * ```\r\n * @requiredParams\r\n * - `open: boolean` - Controls dialog visibility\r\n * - `setOpen: (open: boolean) => void` - Function to control dialog state\r\n * - `onSubmitDisposition: (data: any) => void` - Callback for disposition data\r\n * @returnType `JSX.Element` - Call disposition form interface\r\n * @description Renders form for capturing call disposition information\r\n * @example\r\n * ```tsx\r\n * <EndCallDispositionDialog\r\n * open={true}\r\n * setOpen={setOpen}\r\n * onSubmitDisposition={handleDisposition}\r\n * />\r\n * ```\r\n * @return Returns dialog with:\r\n * - Disposition selection dropdown\r\n * - Follow-up selection dropdown\r\n * - Callback date/time inputs\r\n * - Submit and cancel buttons\r\n * @conclusion Main interface for call disposition capture\r\n */\r\nexport function EndCallDispositionDialog({ open, setOpen, onSubmitDisposition }: any) {\r\n\t/**\r\n\t * @variable formData\r\n\t * @description State for end call disposition form data\r\n\t * @type `useState<object>`\r\n\t * @purpose Stores disposition, follow-up, and callback information\r\n\t */\r\n\tconst [formData, setFormData] = useState({\r\n\t\tdisposition: { label: \"Resolved\", value: \"RES\" },\r\n\t\tfollowUp: { label: \"No\", value: \"N\" },\r\n\t\tcallbackDate: \"\",\r\n\t\tcallbackHrs: \"\",\r\n\t\tcallbackMins: \"\",\r\n\t});\r\n\t/**\r\n\t * @variable dispositionOptions\r\n\t * @description Available disposition options for call outcomes\r\n\t * @type `Array<{ label: string; value: string }>`\r\n\t * @purpose Provides predefined disposition choices\r\n\t */\r\n\tconst dispositionOptions = [\r\n\t\t{ label: \"Not Interested\", value: \"NI\" },\r\n\t\t{ label: \"Resolved\", value: \"RES\" },\r\n\t];\r\n\t/**\r\n\t * @variable followUpOptions\r\n\t * @description Available follow-up options for calls\r\n\t * @type `Array<{ label: string; value: string }>`\r\n\t * @purpose Provides follow-up requirement choices\r\n\t */\r\n\tconst followUpOptions = [\r\n\t\t{ label: \"Yes\", value: \"Y\" },\r\n\t\t{ label: \"No\", value: \"N\" },\r\n\t];\r\n\r\n\t/**\r\n\t * @function handleChange\r\n\t * @description Updates form data when input values change\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleChange = (field: keyof typeof formData, value: { label: string } | null | string) => {\r\n\t * setFormData((prev) => ({ ...prev, [field]: value }));\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams\r\n\t * - `field: keyof typeof formData` - Form field to update\r\n\t * - `value: { label: string } | null | string` - New value for the field\r\n\t * @returnType `void`\r\n\t * @description Updates specific form field with new value\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleChange(\"disposition\", { label: \"Resolved\", value: \"RES\" });\r\n\t * handleChange(\"callbackDate\", \"2024-01-15\");\r\n\t * ```\r\n\t * @return No return value - updates form state\r\n\t * @conclusion Generic form field update handler\r\n\t */\r\n\r\n\tconst handleChange = (field: keyof typeof formData, value: { label: string } | null | string) => {\r\n\t\tsetFormData((prev) => ({ ...prev, [field]: value }));\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleReset\r\n\t * @description Resets form data to default values\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleReset = () => {\r\n\t * setFormData({\r\n\t * disposition: { label: \"Resolved\", value: \"RES\" },\r\n\t * followUp: { label: \"No\", value: \"N\" },\r\n\t * callbackDate: \"\",\r\n\t * callbackHrs: \"\",\r\n\t * callbackMins: \"\",\r\n\t * });\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Resets all form fields to default values\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleReset();\r\n\t * ```\r\n\t * @return No return value - resets form state\r\n\t * @conclusion Resets form to initial state\r\n\t */\r\n\r\n\tconst handleReset = () => {\r\n\t\tsetFormData({\r\n\t\t\tdisposition: { label: \"Resolved\", value: \"RES\" },\r\n\t\t\tfollowUp: { label: \"No\", value: \"N\" },\r\n\t\t\tcallbackDate: \"\",\r\n\t\t\tcallbackHrs: \"\",\r\n\t\t\tcallbackMins: \"\",\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * @function handleClose\r\n\t * @description Closes dialog and resets form data\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleClose = () => {\r\n\t * handleReset();\r\n\t * setOpen(false);\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Closes dialog and resets form to default state\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleClose();\r\n\t * ```\r\n\t * @return No return value - closes dialog and resets form\r\n\t * @conclusion Closes dialog with proper cleanup\r\n\t */\r\n\r\n\tconst handleClose = () => {\r\n\t\thandleReset();\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"xs\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\tm={1}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{\" \"}\r\n\t\t\t\t\t\t\tCall Disposition\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\t\t\t\tgap={2}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\tvalue={formData.disposition}\r\n\t\t\t\t\t\t\t\toptions={dispositionOptions}\r\n\t\t\t\t\t\t\t\tgetOptionLabel={(opt) => opt.label}\r\n\t\t\t\t\t\t\t\tonChange={(_, val) => handleChange(\"disposition\", val)}\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\t\t\t\t\tlabel=\"Disposition\"\r\n\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\toptions={followUpOptions}\r\n\t\t\t\t\t\t\t\tgetOptionLabel={(opt) => opt.label}\r\n\t\t\t\t\t\t\t\tvalue={formData.followUp}\r\n\t\t\t\t\t\t\t\tonChange={(_, val) => handleChange(\"followUp\", val)}\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\t\t\t\t\tlabel=\"Follow Up\"\r\n\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t{/* Callback Date + Time */}\r\n\t\t\t\t\t\t{formData?.followUp?.label?.toLowerCase() === \"yes\" && (\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\t\t\t\t\tgap={2}\r\n\t\t\t\t\t\t\t\tmt={2}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\tlabel=\"Callback Date\"\r\n\t\t\t\t\t\t\t\t\ttype=\"date\"\r\n\t\t\t\t\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\t\t\t\t\tinputLabel: { shrink: true },\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackDate}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleChange(\"callbackDate\", e.target.value)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\tlabel=\"Hours (0-23)\"\r\n\t\t\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackHrs}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleChange(\"callbackHrs\", e.target.value)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{formData?.followUp?.label?.toLowerCase() === \"yes\" && (\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\t\t\t\t\tgap={2}\r\n\t\t\t\t\t\t\t\tmt={2}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\tlabel=\"Minutes (0-59)\"\r\n\t\t\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackMins}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleChange(\"callbackMins\", e.target.value)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<Box sx={{ flex: 1 }}></Box>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\ttextAlign=\"right\"\r\n\t\t\t\t\t\tm={2}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\tonClick={handleClose}\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tcancel\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"contained\"\r\n\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\tonClick={() => onSubmitDisposition(formData)}\r\n\t\t\t\t\t\t\tsx={{ px: 2, borderRadius: \"10px\", textTransform: \"capitalize\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tSubmit\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * PROCESSOR LIST DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * @component ProcessorListDialog\r\n * @description Dialog for selecting available processes during SDK initialization. Allows agents to choose their working process from available options.\r\n * @declaration\r\n * ```typescript\r\n * export function ProcessorListDialog({\r\n * open,\r\n * setOpen,\r\n * processList = null,\r\n * handleSelectedProcessor,\r\n * }: any) {\r\n * ```\r\n * @requiredParams\r\n * - `open: boolean` - Controls dialog visibility\r\n * - `setOpen: (open: boolean) => void` - Function to control dialog state\r\n * - `processList: any[]` - Array of available processes\r\n * - `handleSelectedProcessor: (data: any) => void` - Callback for process selection\r\n * @returnType `JSX.Element` - Process selection interface\r\n * @description Renders list of available processes for selection\r\n * @example\r\n * ```tsx\r\n * <ProcessorListDialog\r\n * open={true}\r\n * setOpen={setOpen}\r\n * processList={processes}\r\n * handleSelectedProcessor={handleProcess}\r\n * />\r\n * ```\r\n * @return Returns dialog with:\r\n * - List of available processes\r\n * - Process selection interface\r\n * - Click handlers for process selection\r\n * @conclusion Main interface for process selection during initialization\r\n */\r\nexport function ProcessorListDialog({\r\n\topen,\r\n\tsetOpen,\r\n\tprocessList = null,\r\n\thandleSelectedProcessor,\r\n}: any) {\r\n\t/**\r\n\t * @function handleClose\r\n\t * @description Closes the processor selection dialog\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleClose = () => {\r\n\t * setOpen(false);\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Closes processor selection dialog\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleClose();\r\n\t * ```\r\n\t * @return No return value - closes dialog\r\n\t * @conclusion Simple dialog close handler\r\n\t */\r\n\tconst handleClose = () => {\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tmaxWidth={\"xs\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Process List</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"6px 10px\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{processList.length > 0 ?\r\n\t\t\t\t\t\t\tprocessList?.map((process: any, index: any) => (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\r\n\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\thandleSelectedProcessor(process);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{/* Status */}\r\n\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t{process.process_name}\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t:\tnull}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * CALL HISTORY DIALOG COMPONENT\r\n * =============================================================================\r\n */\r\n\r\n/**\r\n * @component CallHistoryDialog\r\n * @description Placeholder dialog for call history functionality. Currently shows \"Coming Soon\" message as this feature is not yet implemented.\r\n * @declaration\r\n * ```typescript\r\n * export function CallHistoryDialog({ open, setOpen }: any) {\r\n * ```\r\n * @requiredParams\r\n * - `open: boolean` - Controls dialog visibility\r\n * - `setOpen: (open: boolean) => void` - Function to control dialog state\r\n * @returnType `JSX.Element` - Placeholder call history interface\r\n * @description Renders placeholder for future call history functionality\r\n * @example\r\n * ```tsx\r\n * <CallHistoryDialog open={true} setOpen={setOpen} />\r\n * ```\r\n * @return Returns dialog with:\r\n * - \"Coming Soon\" placeholder message\r\n * - Basic dialog structure\r\n * @conclusion Placeholder component for future call history feature\r\n */\r\nexport function CallHistoryDialog({ open, setOpen }: any) {\r\n\t/**\r\n\t * @function handleClose\r\n\t * @description Closes the call history dialog\r\n\t * @declaration\r\n\t * ```typescript\r\n\t * const handleClose = () => {\r\n\t * setOpen(false);\r\n\t * };\r\n\t * ```\r\n\t * @requiredParams None\r\n\t * @returnType `void`\r\n\t * @description Closes call history dialog\r\n\t * @example\r\n\t * ```typescript\r\n\t * handleClose();\r\n\t * ```\r\n\t * @return No return value - closes dialog\r\n\t * @conclusion Simple dialog close handler\r\n\t */\r\n\r\n\tconst handleClose = () => {\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t{/* Header */}\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Call History</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Lines */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\ttextAlign: \"center\",\r\n\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tp={6}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tComing Soon...\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n/**\r\n * =============================================================================\r\n * 📋 COMPREHENSIVE FILE SUMMARY\r\n * =============================================================================\r\n *\r\n * 🎭 This dialog.tsx file contains comprehensive dialog components for CTI functionality:\r\n *\r\n * 📊 **Core Dialog Components:**\r\n * 1. 👥 **ConferenceDialog**: Complete conference call management with line controls\r\n * - Multi-line conference management\r\n * - Individual line controls (Call, Merge, Hold, Mute, End)\r\n * - Bulk conference termination\r\n * - Real-time status updates\r\n *\r\n * 2. 🔄 **CallTransferDialog**: Call transfer to processes, queues, or agents\r\n * - Tabbed interface for different transfer types\r\n * - Real-time destination data loading\r\n * - One-click transfer execution\r\n * - Comprehensive error handling\r\n *\r\n * 3. 📝 **EndCallDispositionDialog**: Call disposition capture and callback scheduling\r\n * - Disposition outcome selection\r\n * - Follow-up requirement tracking\r\n * - Callback date/time scheduling\r\n * - Form validation and submission\r\n *\r\n * 4. ⚙️ **ProcessorListDialog**: Process selection during initialization\r\n * - Available process listing\r\n * - Process selection interface\r\n * - Initialization workflow integration\r\n *\r\n * 5. 📋 **CallHistoryDialog**: Placeholder for future call history feature\r\n * - \"Coming Soon\" placeholder\r\n * - Future call history functionality\r\n *\r\n * 🚀 **Key Technical Features:**\r\n * - 🎨 Material-UI dialog components with consistent styling\r\n * - 📡 Real-time API integration with loading states\r\n * - 🍞 Toast notifications for user feedback\r\n * - 🔄 State management integration with SDK\r\n * - 📱 Responsive design for different screen sizes\r\n * - 🛡️ Comprehensive error handling and validation\r\n * - ⏳ Loading states for all operations\r\n * - 🎯 One-click action execution\r\n * - 📊 Real-time data updates\r\n *\r\n * 🔧 **Technical Implementation:**\r\n * - ⚛️ React functional components with hooks\r\n * - 📡 Custom usePostRequest hooks for API calls\r\n * - 🗃️ Centralized state management via SDK\r\n * - 🎨 Material-UI theming and styling\r\n * - 📝 TypeScript type definitions\r\n * - 🔄 Effect hooks for lifecycle management\r\n * - 🛡️ Error boundary patterns\r\n *\r\n * 📈 **Performance Optimizations:**\r\n * - ⚡ Optimized re-renders with proper dependency arrays\r\n * - 🔄 Efficient state updates\r\n * - 📡 Minimal API calls with caching\r\n * - 🎯 Targeted component updates\r\n * - 💾 Memory-efficient state management\r\n *\r\n * 🎯 **User Experience Features:**\r\n * - 🎨 Consistent visual design language\r\n * - 📱 Mobile-responsive layouts\r\n * - ⏳ Loading indicators for all operations\r\n * - 🍞 Contextual feedback messages\r\n * - 🎯 Intuitive navigation and controls\r\n * - 🔄 Real-time status updates\r\n * - 🛡️ Error recovery mechanisms\r\n *\r\n * 📊 **API Integration:**\r\n * - 📡 RESTful API endpoints for all operations\r\n * - 🔄 Real-time WebSocket updates\r\n * - 🛡️ Error handling and retry logic\r\n * - 📊 Data validation and sanitization\r\n * - 🔐 Secure authentication integration\r\n *\r\n * The components follow React best practices with proper state management,\r\n * error handling, accessibility considerations, and user experience design.\r\n * Each dialog is self-contained with its own state management while integrating\r\n * seamlessly with the overall SDK architecture.\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n","import { SxProps, useTheme } from \"@mui/material\";\r\n\r\nconst useStyles = ({\r\n disabled,\r\n enabled,\r\n outlined,\r\n}: {\r\n disabled: SxProps;\r\n enabled: SxProps;\r\n outlined: SxProps;\r\n}): {\r\n disabled: SxProps;\r\n enabled: SxProps;\r\n outlined: SxProps;\r\n} => {\r\n const theme = useTheme();\r\n return {\r\n disabled: {\r\n padding: \"0px\",\r\n margin: \"0px\",\r\n minWidth: \"40px !important\",\r\n borderRadius: \"16px\",\r\n border: `1px solid rgb(206, 204, 204)`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n boxShadow: \" 0px 2px 2px rgba(0, 0, 0, 0.79)\",\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"primary.main\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n ...disabled,\r\n },\r\n enabled: {\r\n padding: \"0px\",\r\n margin: \"0px\",\r\n minWidth: \"40px !important\",\r\n borderRadius: \"16px\",\r\n boxShadow: \" 0px 2px 1px rgba(0, 0, 0, 0.507)\",\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n boxShadow: \" 0px 2px 1px rgba(0, 0, 0, 0.507)\",\r\n border: `1px solid ${theme.palette.primary.main}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"primary.main\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n ...enabled,\r\n },\r\n outlined: {\r\n padding: \"0px\",\r\n margin: \"0px\",\r\n minWidth: \"40px !important\",\r\n borderRadius: \"16px\",\r\n backgroundColor: theme.palette.grey[200],\r\n boxShadow: `0px 2px 1px ${theme.palette.primary.light}`,\r\n border: `0px solid ${theme.palette.primary.main}`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n boxShadow: `0px 2px 1px ${theme.palette.primary.main}`,\r\n border: `0px solid ${theme.palette.primary.main}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"primary.main\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n ...outlined,\r\n },\r\n };\r\n};\r\n\r\nexport default useStyles;\r\n","/**\r\n * @fileoverview SDKProvider Component\r\n * @description Context provider component that wraps the Call Control SDK with necessary providers.\r\n * Provides toast notifications and other global services to child components.\r\n *\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n\r\nimport { ReactNode, memo } from \"react\";\r\nimport { ToastProvider } from \"../services/toastMessage\";\r\nimport React from \"react\";\r\n\r\n/**\r\n * @interface SDKProviderProps\r\n * @description Props interface for the SDKProvider component\r\n *\r\n * @declaration\r\n * ```typescript\r\n * interface SDKProviderProps {\r\n * children: ReactNode;\r\n * }\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `children: ReactNode` - Child components to be wrapped with providers\r\n *\r\n * @returnType Interface definition\r\n *\r\n * @example\r\n * ```tsx\r\n * <SDKProvider>\r\n * <CallControls />\r\n * </SDKProvider>\r\n * ```\r\n *\r\n * @return Interface definition for provider props\r\n *\r\n * @conclusion Simple interface for wrapping child components with SDK providers.\r\n */\r\ninterface SDKProviderProps {\r\n\t/** Child components to be wrapped with SDK providers */\r\n\tchildren: ReactNode;\r\n}\r\n\r\n/**\r\n * @function SDKProvider\r\n * @description Context provider component that wraps child components with necessary SDK services.\r\n * Provides toast notifications and other global services required by the Call Control SDK.\r\n *\r\n * @declaration\r\n * ```typescript\r\n * function SDKProvider(props: SDKProviderProps): JSX.Element\r\n * ```\r\n *\r\n * @requiredParams\r\n * - `props: SDKProviderProps` - Component props containing children to wrap\r\n *\r\n * @returnType `JSX.Element`\r\n *\r\n * @example\r\n * ```tsx\r\n * <SDKProvider>\r\n * <CallControls onDataChange={handleDataChange} />\r\n * </SDKProvider>\r\n * ```\r\n *\r\n * @return React component providing SDK context and services\r\n *\r\n * @conclusion Essential wrapper component that provides global services to the Call Control SDK.\r\n */\r\nexport const SDKProvider = memo<SDKProviderProps>(({ children }) => {\r\n\treturn <ToastProvider>{children}</ToastProvider>;\r\n});\r\n\r\n// Set display name for debugging\r\nSDKProvider.displayName = \"SDKProvider\";\r\n\r\n/**\r\n * @author CTI SDK Team\r\n * @version 5.4.8\r\n * @since 1.0.0\r\n */\r\n"],"mappings":"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","names":["index_exports","__export","CallControlPanel","getSDKVersion","initSDK","isSDKInitialized","useClickToCall","useEndCall","useLogout","__toCommonJS","SDKStateManager","__publicField","stored","parsedState","__spreadProps","__spreadValues","error","persistentState","listener","apiKey","agentId","sdkConfig","index","isHolding","isMuted","status","process","position","open","data","line","_a","conferenceLineData","each","sdkStateManager","EventTrackerSDK","__publicField","config","__spreadValues","ticket","response","sdkStateManager","data","error","eventType","eventData","event","index","e","eventsToFlush","retryItems","retryFn","url","options","_a","fullUrl","maxRetries","attempt","delay","resolve","autoTrackConfig","target","formData","formFields","value","key","inputTimer","sessionStartTime","sessionDuration","navigation","timing","interval","eventTracker","import_react","IP","BASE_URL","WS_BASE_URL","VERSION","END_POINT","WS_END_POINT","import_axios","DEFAULT_TOKEN","REQUEST_TIMEOUT","getAuthToken","createAxiosInstance","instance","axios","BASE_URL","config","token","error","response","_a","endTime","startTime","originalRequest","axiosInstance","axios_default","useLogout","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","state","payload","axios_default","END_POINT","res","sdkStateManager","err","import_react","useEndCall","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","state","payload","axios_default","END_POINT","res","sdkStateManager","err","import_react","useClickToCall","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","_b","_c","_d","_e","_f","_g","_h","_i","state","payload","axios_default","END_POINT","res","err","line_used","each","sdkStateManager","__spreadProps","__spreadValues","import_react","import_icons_material","import_material","import_react","import_react","useDraggable","initialPosition","onPositionChange","position","setPosition","isDragging","setIsDragging","dragRef","dragStart","elementStart","updatePosition","newPosition","element","rect","viewportWidth","viewportHeight","constrainedPosition","handleStart","clientX","clientY","handleMove","moveClientX","moveClientY","deltaX","deltaY","handleMouseMove","e","handleTouchMove","touch","handleEnd","handleMouseDown","handleTouchStart","import_react","useSDKState","state","setState","sdkStateManager","import_react","import_react","import_material","import_jsx_runtime","ToastContext","useToast","ctx","ToastProvider","children","open","setOpen","message","setMessage","severity","setSeverity","showToast","msg","sev","initialState","reducer","state","action","__spreadProps","__spreadValues","usePostRequest","props","onSuccess","onError","disabledSuccessToast","showToast","useToast","state","dispatch","reducer","initialState","url","payload","config","axios_default","res","_a","_b","err","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","error","import_icons_material","import_material","import_react","import_material","useStyles","disabled","enabled","outlined","theme","__spreadValues","styles_default","import_jsx_runtime","ConferenceTableRow","each","_a","_b","_c","_d","_e","state","useSDKState","showToast","useToast","disabled","enabled","outlined","styles_default","theme","conferenceCallStart","setConferenceCallStart","conferenceCallMerge","setConferenceCallMerge","conferenceCallHoldOrUnHold","setConferenceCallHoldOrUnHold","conferenceCallMuteOrUnMute","setConferenceCallMuteOrUnMute","conferenceCallEnd","setConferenceCallEnd","onConferenceLineUpdate","line","data","sdkStateManager","__spreadValues","onConferenceCallStart","line_used","payload","axios_default","END_POINT","res","err","message","onMergeConferenceCall","onHoldOrUnHoldConferenceCall","type","onMuteOrUnMuteConferenceCall","onEndConferenceCall","e","__spreadProps","ConferenceDialog","conferenceCallEndAll","setConferenceCallEndAll","handleClose","onEndAllConferenceCalls","CallTransferDialog","open","_f","_g","_h","_i","_j","_k","_l","transferCall","usePostRequest","currentselecteTab","setCurrentselecteTab","getIdelAgentsList","idleAgentsList","isIdleAgentsListLoading","getProcessAndQueuesList","processAndQueuesList","isProcessAndQueuesListLoading","handleTransferCall","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","_G","process","index","queue","agent","EndCallDispositionDialog","setOpen","onSubmitDisposition","formData","setFormData","dispositionOptions","followUpOptions","handleChange","field","value","prev","handleReset","opt","_","val","params","ProcessorListDialog","processList","handleSelectedProcessor","CallHistoryDialog","import_jsx_runtime","getCombineConfrenceData","conferenceData","apiData","data","item","_a","_b","_c","statusKey","phoneKey","__spreadProps","__spreadValues","formatDuration","seconds","mins","secs","CallControls","onDataChange","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","_A","_B","_C","_D","_E","_F","_G","_H","_I","_J","_K","_L","_M","_N","_O","_P","_Q","_R","_S","_T","_U","_V","_W","_X","_Y","_Z","__","_$","_aa","_ba","_ca","_da","_ea","_fa","_ga","_ha","_ia","_ja","_ka","_la","_ma","_na","_oa","_pa","_qa","_ra","_sa","_ta","_ua","_va","_wa","_xa","_ya","_za","_Aa","theme","state","useSDKState","showToast","useToast","disabled","enabled","outlined","styles_default","webSocketRef","anchorEl","setAnchorEl","showIframe","setShowIframe","statusAnchorEl","setStatusAnchorEl","dialerAnchorEl","setDialerAnchorEl","openCallDisposition","setOpenCallDisposition","openProcessorDialog","setOpenProcessorDialog","openCallHistoryDialog","setOpenCallHistoryDialog","processList","setProcessList","phoneNumber","setPhoneNumber","callDuration","setCallDuration","position","isDragging","dragRef","handleMouseDown","handleTouchStart","useDraggable","newPosition","sdkStateManager","iframePosition","iframeIsDragging","iframeDragRef","iframeHandleMouseDown","iframeHandleTouchStart","clickToCall","clickToCallLoading","usePostRequest","holdOrUnHold","holdOrUnHoldLoading","error","muteOrUnMute","muteOrUnMuteLoading","readyAgentStatus","agentReadyLoading","updateAgentStatus","isLoading","endCall","endCallLoading","handleCloseQueueCounts","handleOpenDialer","event","handleCloseDialer","handleOpenAgentStatus","handleCloseAgentStatus","handleAgentReady","payload","END_POINT","handleUpdateAgentStatus","status","handleStartCall","number","handleHoldToggle","handleMuteToggle","handleEndCall","handleBeforeUnload","e","interval","elapsed","process_id","process_name","phone_number","agent_id","convox_id","axios_default","res","err","WS_END_POINT","confrence","ProcessorListDialog","IP","ConferenceDialog","CallTransferDialog","EndCallDispositionDialog","CallHistoryDialog","import_react","import_jsx_runtime","SDKProvider","children","ToastProvider","import_jsx_runtime","CallControlPanel","onDataChange","handleDataChange","data","error","SDKProvider","CallControls","initSDK","apiKey","tenantId","agentId","sdkConfig","eventTracker","BASE_URL","sdkStateManager","error","getSDKVersion","isSDKInitialized"]}