call-control-sdk 5.3.6 → 5.3.8
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 +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/index.ts","../call-control-sdk/lib/hooks/eventsTracker.ts","../call-control-sdk/lib/hooks/sdk-state.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/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","../call-control-sdk/lib/components/callControlPanel.tsx"],"sourcesContent":["import { 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\nexport { CallControlPanel } from \"./lib/components/callControlPanel\";\r\n\r\nexport type { CallControlPanelProps, CallData, CallStatus } from \"./types\";\r\n\r\n/**\r\n * Initialize the Call Control SDK with an API key\r\n * @param sdkApiKey - The API key for SDK authentication\r\n * @throws {Error} When API key is missing or invalid\r\n */\r\n\r\ntype intiSDKParams = {\r\n apiKey: string;\r\n tenantId: string;\r\n agentId: string;\r\n sdkConfig?: SDKConfig;\r\n};\r\nexport function initSDK({\r\n apiKey,\r\n tenantId,\r\n agentId,\r\n sdkConfig,\r\n}: intiSDKParams): void {\r\n eventTracker\r\n .init({\r\n apiKey: apiKey,\r\n tenantId: tenantId,\r\n agentId: agentId,\r\n baseUrl: BASE_URL,\r\n })\r\n .then((res) => {\r\n if (res) {\r\n sdkStateManager.initialize(apiKey, agentId, sdkConfig);\r\n console.log(\"SDK initialized successfully\");\r\n } else {\r\n console.log(\"SDK initialization failed\");\r\n }\r\n });\r\n}\r\n\r\nexport { useLogout, useEndCall };\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\nexport interface EventTrackerConfig {\r\n apiKey: string;\r\n tenantId: string;\r\n agentId: string;\r\n sessionId?: string;\r\n baseUrl?: string;\r\n autoTrack?:\r\n | boolean\r\n | {\r\n pageVisits?: boolean;\r\n clicks?: boolean;\r\n forms?: boolean;\r\n inputs?: boolean;\r\n scrolling?: boolean;\r\n performance?: boolean;\r\n errors?: boolean;\r\n visibility?: boolean;\r\n };\r\n retryAttempts?: number;\r\n queueSize?: number;\r\n flushInterval?: number;\r\n}\r\n\r\nexport interface EventData {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface EventTrackerInstance {\r\n init(config: EventTrackerConfig): Promise<string | null>;\r\n logEvent(eventType: string, eventData?: EventData): Promise<void>;\r\n closeTicket(): Promise<void>;\r\n isInitialized(): boolean;\r\n getConfig(): EventTrackerConfig | null;\r\n getTicketId(): string | null;\r\n flush(): Promise<void>;\r\n}\r\n\r\nclass EventTrackerSDK implements EventTrackerInstance {\r\n private config: EventTrackerConfig | null = null;\r\n private ticketId: string | null = null;\r\n private baseUrl: string = \"\";\r\n private eventQueue: Array<{\r\n eventType: string;\r\n eventData?: EventData;\r\n timestamp: number;\r\n }> = [];\r\n private isOnline: boolean = true;\r\n private retryQueue: Array<() => Promise<void>> = [];\r\n private flushTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n /**\r\n * Initialize the EventTracker SDK\r\n * @param config Configuration object\r\n */\r\n async init(config: EventTrackerConfig): Promise<string | null> {\r\n this.config = {\r\n autoTrack: true,\r\n retryAttempts: 3,\r\n queueSize: 100,\r\n flushInterval: 5000,\r\n ...config,\r\n };\r\n\r\n this.baseUrl =\r\n config.baseUrl ||\r\n (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n // Set up online/offline detection\r\n this.setupNetworkDetection();\r\n\r\n // Create ticket and set up auto-tracking\r\n const ticket = await this.createTicket();\r\n\r\n // Start periodic flush\r\n this.startPeriodicFlush();\r\n\r\n console.log(\"EventTracker SDK initialized successfully\");\r\n return ticket;\r\n }\r\n\r\n /**\r\n * Check if the SDK is initialized\r\n */\r\n isInitialized(): boolean {\r\n return this.config !== null && this.ticketId !== null;\r\n }\r\n\r\n /**\r\n * Get the current configuration\r\n */\r\n getConfig(): EventTrackerConfig | null {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Get the current ticket ID\r\n */\r\n getTicketId(): string | null {\r\n return this.ticketId;\r\n }\r\n\r\n /**\r\n * Create a new ticket\r\n */\r\n private async createTicket(): Promise<string | null> {\r\n if (!this.config) {\r\n throw new Error(\"EventTracker not initialized\");\r\n }\r\n\r\n try {\r\n const response = await this.makeRequest(\"/api/v1/et/init\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n agentId: this.config.agentId,\r\n sessionId: this.config.sessionId,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to initialize: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n const data = await response.json();\r\n this.ticketId = data.ticketId;\r\n\r\n // Set up auto-tracking if enabled\r\n if (this.config.autoTrack) {\r\n this.setupAutoTracking();\r\n }\r\n return this.ticketId;\r\n } catch (error) {\r\n console.error(\"EventTracker initialization failed:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Log an event\r\n * @param eventType The type of event\r\n * @param eventData Optional event data\r\n */\r\n async logEvent(eventType: string, eventData?: EventData): Promise<void> {\r\n if (!this.config || !this.ticketId) {\r\n console.warn(\"EventTracker not initialized, skipping event:\", eventType);\r\n return;\r\n }\r\n\r\n const event = {\r\n eventType,\r\n eventData,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // Add to queue for offline support\r\n this.eventQueue.push(event);\r\n\r\n // Trim queue if too large\r\n if (this.eventQueue.length > (this.config.queueSize || 100)) {\r\n this.eventQueue.shift();\r\n }\r\n\r\n // Try to send immediately if online\r\n if (this.isOnline) {\r\n try {\r\n await this.sendEvent(event);\r\n } catch (error) {\r\n console.warn(\"Failed to send event, will retry later:\", error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Send an event to the server\r\n */\r\n private async sendEvent(event: {\r\n eventType: string;\r\n eventData?: EventData;\r\n timestamp: number;\r\n }): Promise<void> {\r\n if (!this.config || !this.ticketId) return;\r\n\r\n try {\r\n const response = await this.makeRequest(\"/api/v1/et/event\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n ticketId: this.ticketId,\r\n eventType: event.eventType,\r\n eventData: event.eventData,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to log event: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n // Remove from queue if successful\r\n const index = this.eventQueue.findIndex(\r\n (e) => e.timestamp === event.timestamp\r\n );\r\n if (index > -1) {\r\n this.eventQueue.splice(index, 1);\r\n }\r\n } catch (error) {\r\n console.error(\"Event logging failed:\", error);\r\n\r\n // Add to retry queue\r\n this.retryQueue.push(() => this.sendEvent(event));\r\n }\r\n }\r\n\r\n /**\r\n * Close the current ticket\r\n */\r\n async closeTicket(): Promise<void> {\r\n if (!this.config || !this.ticketId) {\r\n throw new Error(\"EventTracker not initialized\");\r\n }\r\n\r\n // Flush any pending events\r\n await this.flush();\r\n\r\n try {\r\n const response = await this.makeRequest(\"/api/v1/et/close\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n ticketId: this.ticketId,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to close ticket: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n this.ticketId = null;\r\n this.stopPeriodicFlush();\r\n\r\n console.log(\"Ticket closed successfully\");\r\n } catch (error) {\r\n console.error(\"Ticket close failed:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Flush all pending events\r\n */\r\n async flush(): Promise<void> {\r\n if (!this.isOnline || this.eventQueue.length === 0) return;\r\n\r\n const eventsToFlush = [...this.eventQueue];\r\n\r\n for (const event of eventsToFlush) {\r\n await this.sendEvent(event);\r\n }\r\n\r\n // Process retry queue\r\n const retryItems = [...this.retryQueue];\r\n this.retryQueue = [];\r\n\r\n for (const retryFn of retryItems) {\r\n try {\r\n await retryFn();\r\n } catch (error) {\r\n console.error(\"Retry failed:\", error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Make an HTTP request with retry logic\r\n */\r\n private async makeRequest(\r\n url: string,\r\n options: RequestInit\r\n ): Promise<Response> {\r\n const fullUrl = `${this.baseUrl}${url}`;\r\n const maxRetries = this.config?.retryAttempts || 3;\r\n\r\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\r\n try {\r\n const response = await fetch(fullUrl, options);\r\n return response;\r\n } catch (error) {\r\n if (attempt === maxRetries) {\r\n throw error;\r\n }\r\n\r\n // Exponential backoff\r\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n }\r\n\r\n throw new Error(\"Max retries exceeded\");\r\n }\r\n\r\n /**\r\n * Set up automatic event tracking\r\n */\r\n private setupAutoTracking(): void {\r\n if (typeof window === \"undefined\" || !this.config?.autoTrack) return;\r\n\r\n const autoTrackConfig =\r\n this.config.autoTrack === true ? {} : this.config.autoTrack;\r\n\r\n // Track page visits\r\n if (autoTrackConfig.pageVisits !== false) {\r\n this.logEvent(\"pageVisit\", {\r\n url: window.location.href,\r\n title: document.title,\r\n referrer: document.referrer,\r\n userAgent: navigator.userAgent,\r\n viewport: {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) => console.warn(\"Failed to track page visit:\", error));\r\n }\r\n\r\n // Track clicks on any clickable element\r\n if (autoTrackConfig.clicks !== false) {\r\n document.addEventListener(\"click\", (event) => {\r\n const target = event.target as HTMLElement | HTMLButtonElement;\r\n\r\n // Track all clickable elements\r\n if (\r\n target.tagName === \"BUTTON\" ||\r\n target.tagName === \"A\" ||\r\n target.onclick ||\r\n target.getAttribute(\"role\") === \"button\" ||\r\n (target instanceof HTMLButtonElement && target.type === \"button\")\r\n ) {\r\n this.logEvent(\"click\", {\r\n element: target.tagName,\r\n text: target.textContent?.trim().substring(0, 100), // Limit text length\r\n href: target.getAttribute(\"href\"),\r\n id: target.id,\r\n className: target.className,\r\n role: target.getAttribute(\"role\"),\r\n position: {\r\n x: event.clientX,\r\n y: event.clientY,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) => console.warn(\"Failed to track click:\", error));\r\n }\r\n });\r\n }\r\n\r\n // Track form submissions\r\n if (autoTrackConfig.forms !== false) {\r\n document.addEventListener(\"submit\", (event) => {\r\n const target = event.target as HTMLFormElement;\r\n const formData = new FormData(target);\r\n const formFields: Record<string, string> = {};\r\n\r\n // Convert FormData to plain object\r\n formData.forEach((value, key) => {\r\n formFields[key] = value.toString();\r\n });\r\n\r\n this.logEvent(\"formSubmission\", {\r\n formId: target.id,\r\n action: target.action,\r\n method: target.method,\r\n fields: Object.keys(formFields),\r\n fieldCount: Object.keys(formFields).length,\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) =>\r\n console.warn(\"Failed to track form submission:\", error)\r\n );\r\n });\r\n }\r\n\r\n // Track input changes (debounced)\r\n if (autoTrackConfig.inputs !== false) {\r\n let inputTimer: ReturnType<typeof setInterval>;\r\n document.addEventListener(\"input\", (event) => {\r\n const target = event.target as HTMLInputElement;\r\n if (\r\n target.tagName === \"INPUT\" ||\r\n target.tagName === \"TEXTAREA\" ||\r\n target.tagName === \"SELECT\"\r\n ) {\r\n clearTimeout(inputTimer);\r\n inputTimer = setTimeout(() => {\r\n this.logEvent(\"fieldChange\", {\r\n element: target.tagName,\r\n type: target.getAttribute(\"type\"),\r\n name: target.getAttribute(\"name\"),\r\n id: target.id,\r\n valueLength: target.value?.length || 0,\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) =>\r\n console.warn(\"Failed to track field change:\", error)\r\n );\r\n }, 1000); // Debounce for 1 second\r\n }\r\n });\r\n }\r\n\r\n // Track page unload and session duration\r\n const sessionStartTime = Date.now();\r\n window.addEventListener(\"beforeunload\", () => {\r\n const sessionDuration = Date.now() - sessionStartTime;\r\n\r\n this.logEvent(\"pageUnload\", {\r\n url: window.location.href,\r\n sessionDuration: sessionDuration,\r\n timestamp: new Date().toISOString(),\r\n });\r\n\r\n // Close ticket synchronously\r\n if (this.ticketId) {\r\n navigator.sendBeacon(\r\n `${this.baseUrl}/api/v1/et/close`,\r\n JSON.stringify({\r\n ticketId: this.ticketId,\r\n })\r\n );\r\n }\r\n });\r\n\r\n // Track visibility changes\r\n if (autoTrackConfig.visibility !== false) {\r\n document.addEventListener(\"visibilitychange\", () => {\r\n this.logEvent(\"visibilityChange\", {\r\n hidden: document.hidden,\r\n visibilityState: document.visibilityState,\r\n timestamp: new Date().toISOString(),\r\n });\r\n });\r\n }\r\n\r\n // Track errors\r\n if (autoTrackConfig.errors !== false) {\r\n window.addEventListener(\"error\", (event) => {\r\n this.logEvent(\"jsError\", {\r\n message: event.message,\r\n filename: event.filename,\r\n lineno: event.lineno,\r\n colno: event.colno,\r\n timestamp: new Date().toISOString(),\r\n });\r\n });\r\n\r\n // Track unhandled promise rejections\r\n window.addEventListener(\"unhandledrejection\", (event) => {\r\n this.logEvent(\"unhandledRejection\", {\r\n reason: event.reason?.toString(),\r\n timestamp: new Date().toISOString(),\r\n });\r\n });\r\n }\r\n\r\n // Track performance metrics (if available)\r\n if (\r\n autoTrackConfig.performance !== false &&\r\n typeof window.performance !== \"undefined\" &&\r\n window.performance.navigation\r\n ) {\r\n window.addEventListener(\"load\", () => {\r\n setTimeout(() => {\r\n const navigation = window.performance.navigation;\r\n const timing = window.performance.timing;\r\n\r\n this.logEvent(\"performanceMetrics\", {\r\n navigationTime: timing.navigationStart,\r\n loadTime: timing.loadEventEnd - timing.navigationStart,\r\n domReady: timing.domContentLoadedEventEnd - timing.navigationStart,\r\n renderTime: timing.loadEventEnd - timing.domContentLoadedEventEnd,\r\n navigationType: navigation.type,\r\n redirectCount: navigation.redirectCount,\r\n timestamp: new Date().toISOString(),\r\n });\r\n }, 1000);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set up network detection\r\n */\r\n private setupNetworkDetection(): void {\r\n if (typeof window === \"undefined\") return;\r\n\r\n this.isOnline = navigator.onLine;\r\n\r\n window.addEventListener(\"online\", () => {\r\n this.isOnline = true;\r\n console.log(\"EventTracker: Back online, flushing queued events\");\r\n this.flush();\r\n });\r\n\r\n window.addEventListener(\"offline\", () => {\r\n this.isOnline = false;\r\n console.log(\"EventTracker: Offline, queueing events\");\r\n });\r\n }\r\n\r\n /**\r\n * Start periodic flush timer\r\n */\r\n private startPeriodicFlush(): void {\r\n if (this.flushTimer) {\r\n clearInterval(this.flushTimer);\r\n }\r\n\r\n const interval = this.config?.flushInterval || 5000;\r\n this.flushTimer = setInterval(() => {\r\n this.flush();\r\n }, interval);\r\n }\r\n\r\n /**\r\n * Stop periodic flush timer\r\n */\r\n private stopPeriodicFlush(): void {\r\n if (this.flushTimer) {\r\n clearInterval(this.flushTimer);\r\n this.flushTimer = null;\r\n }\r\n }\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 (window as any).EventTracker = eventTracker;\r\n}\r\n","import type {\r\n SDKState,\r\n CallData,\r\n CallStatus,\r\n ConferenceLineTypes,\r\n SDKConfig,\r\n} from \"../../types\";\r\n\r\nclass SDKStateManager {\r\n private state: SDKState;\r\n private listeners: Array<() => void> = [];\r\n private readonly STORAGE_KEY = \"call-control-sdk-state\";\r\n\r\n constructor() {\r\n this.state = this.getInitialState();\r\n this.loadFromStorage();\r\n }\r\n\r\n private getInitialState(): SDKState {\r\n return {\r\n apiKey: null,\r\n process: null,\r\n agentId: \"\",\r\n isInitialized: false,\r\n sdkConfig: {\r\n showEndCallButton: true,\r\n showTransferButton: true,\r\n showConferenceButton: true,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n },\r\n isHolding: false,\r\n isMuted: false,\r\n status: \"idle\",\r\n callStartTime: null,\r\n controlPanelPosition: { x: 10, y: 10 },\r\n iframePosition: { x: 10, y: 80 },\r\n callData: {\r\n agent_id: \"\",\r\n status: \"\",\r\n type: \"\",\r\n event_time: \"\",\r\n phone_number: \"\",\r\n },\r\n conferenceLine: [\r\n {\r\n line: 1,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 2,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 3,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 4,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 5,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n private loadFromStorage(): void {\r\n try {\r\n const stored = localStorage.getItem(this.STORAGE_KEY);\r\n if (stored) {\r\n const parsedState = JSON.parse(stored);\r\n // Only restore persistent data, not initialization state\r\n this.state = {\r\n ...this.state,\r\n apiKey: parsedState.apiKey || \"\",\r\n agentId: parsedState.agentId || \"\",\r\n process: parsedState.process || null,\r\n isInitialized: parsedState.isInitialized || false,\r\n sdkConfig: parsedState.sdkConfig || {\r\n showEndCallButton: true,\r\n showTransferButton: true,\r\n showConferenceButton: true,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n },\r\n isHolding: parsedState.isHolding || false,\r\n isMuted: parsedState.isMuted || false,\r\n status: parsedState.status || \"idle\",\r\n callStartTime: parsedState.callStartTime || null,\r\n controlPanelPosition: parsedState.controlPanelPosition || {\r\n x: 10,\r\n y: 10,\r\n },\r\n iframePosition: parsedState.iframePosition || { x: 10, y: 80 },\r\n callData: parsedState.callData || {\r\n mobileNumber: \"\",\r\n callReferenceId: \"\",\r\n agent_id: \"\",\r\n status: \"\",\r\n type: \"\",\r\n event_time: \"\",\r\n phone_number: \"\",\r\n },\r\n // Fix: Properly handle conferenceLine with fallback to initial state\r\n conferenceLine:\r\n parsedState.conferenceLine &&\r\n Array.isArray(parsedState.conferenceLine) &&\r\n parsedState.conferenceLine.length > 0\r\n ? parsedState.conferenceLine\r\n : this.state.conferenceLine,\r\n };\r\n }\r\n } catch (error) {\r\n console.warn(\"Failed to load SDK state from localStorage:\", error);\r\n // If loading fails, keep the initial state\r\n }\r\n }\r\n\r\n private saveToStorage(): void {\r\n try {\r\n const persistentState = {\r\n apiKey: this.state.apiKey,\r\n agentId: this.state.agentId,\r\n process: this.state.process,\r\n isInitialized: this.state.isInitialized,\r\n sdkConfig: this.state.sdkConfig,\r\n isHolding: this.state.isHolding,\r\n isMuted: this.state.isMuted,\r\n status: this.state.status,\r\n callStartTime: this.state.callStartTime,\r\n controlPanelPosition: this.state.controlPanelPosition,\r\n iframePosition: this.state.iframePosition,\r\n callData: this.state.callData,\r\n conferenceLine: this.state.conferenceLine,\r\n };\r\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(persistentState));\r\n } catch (error) {\r\n console.warn(\"Failed to save SDK state to localStorage:\", error);\r\n }\r\n }\r\n\r\n private notifyListeners(): void {\r\n this.listeners.forEach((listener) => listener());\r\n }\r\n\r\n public initialize(\r\n apiKey: string,\r\n agentId: string,\r\n sdkConfig?: SDKConfig\r\n ): void {\r\n if (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n throw new Error(\"API key not available\");\r\n }\r\n\r\n this.state.apiKey = apiKey;\r\n this.state.agentId = agentId;\r\n this.state.sdkConfig = {\r\n showEndCallButton: true,\r\n showTransferButton: true,\r\n showConferenceButton: true,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n ...sdkConfig,\r\n };\r\n this.state.isInitialized = true;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public getState(): SDKState {\r\n return { ...this.state };\r\n }\r\n\r\n public subscribe(listener: () => void): () => void {\r\n this.listeners.push(listener);\r\n return () => {\r\n const index = this.listeners.indexOf(listener);\r\n if (index > -1) {\r\n this.listeners.splice(index, 1);\r\n }\r\n };\r\n }\r\n\r\n public setHolding(isHolding: boolean): void {\r\n this.state.isHolding = isHolding;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setMuted(isMuted: boolean): void {\r\n this.state.isMuted = isMuted;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setStatus(status: CallStatus): void {\r\n this.state.status = status;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setProcess(process: {\r\n process_id: number;\r\n process_name: string;\r\n }): void {\r\n this.state.process = process;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setControlPanelPosition(position: { x: number; y: number }): void {\r\n this.state.controlPanelPosition = position;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setIframePosition(position: { x: number; y: number }): void {\r\n this.state.iframePosition = position;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public startCall(): void {\r\n this.state.callStartTime = Date.now();\r\n this.state.status = \"on call\";\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public endCall(): void {\r\n this.state.callStartTime = null;\r\n this.state.status = \"idle\";\r\n this.state.isHolding = false;\r\n this.state.isMuted = false;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public updateCallData(data: Partial<CallData>): void {\r\n this.state.callData = { ...this.state.callData, ...data };\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setConferenceLine(line: ConferenceLineTypes): void {\r\n // Fix: Check if conferenceLine is corrupted and reset if needed\r\n if (\r\n !this.state.conferenceLine ||\r\n !Array.isArray(this.state.conferenceLine)\r\n ) {\r\n console.warn(\r\n \"Conference line data corrupted, resetting to initial state\"\r\n );\r\n this.state.conferenceLine = this.getInitialState().conferenceLine;\r\n }\r\n\r\n const conferenceLineData = this.state.conferenceLine?.map(\r\n (each: ConferenceLineTypes) => {\r\n if (each.line === line.line) {\r\n return line;\r\n }\r\n return each;\r\n }\r\n );\r\n this.state.conferenceLine = conferenceLineData;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public resetConferenceLines(): void {\r\n this.state.conferenceLine = this.getInitialState().conferenceLine;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public clearStorageAndReset(): void {\r\n try {\r\n localStorage.removeItem(this.STORAGE_KEY);\r\n this.state = this.getInitialState();\r\n this.notifyListeners();\r\n } catch (error) {\r\n console.warn(\"Failed to clear localStorage:\", error);\r\n }\r\n }\r\n\r\n // Debug methods\r\n public debugStorage(): void {\r\n try {\r\n const stored = localStorage.getItem(this.STORAGE_KEY);\r\n console.log(\"Current localStorage data:\", stored);\r\n if (stored) {\r\n console.log(\"Parsed localStorage data:\", JSON.parse(stored));\r\n }\r\n console.log(\"Current state:\", this.state);\r\n } catch (error) {\r\n console.error(\"Error debugging storage:\", error);\r\n }\r\n }\r\n\r\n public getConferenceLines(): ConferenceLineTypes[] {\r\n return this.state.conferenceLine || [];\r\n }\r\n}\r\n\r\n// SDK State Manager Instance\r\nexport const sdkStateManager = new SDKStateManager();\r\n","import { useCallback, useState } from \"react\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\n// Types for logout functionality\r\nexport interface LogoutPayload {\r\n action: string;\r\n userId: string;\r\n}\r\n\r\n/**\r\n * Custom hook for handling agent logout functionality\r\n * @param options - Optional callbacks for success, error, and completion\r\n * @returns Object containing logout function and loading state\r\n */\r\nconst useLogout = () => {\r\n const [loading, setLoading] = useState(false);\r\n const [success, setSuccess] = useState(false);\r\n const [isError, setIsError] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [data, setData] = useState(null);\r\n\r\n /**\r\n * Handles logout with current agent data\r\n * @param agentData - Object containing agent information\r\n */\r\n\r\n const handleLogout = useCallback(async () => {\r\n const state = JSON.parse(\r\n localStorage.getItem(\"call-control-sdk-state\") ?? \"\"\r\n );\r\n setLoading(true);\r\n const payload: LogoutPayload = {\r\n action: \"LOGOUTUSER\",\r\n userId: state.agentId || \"\",\r\n };\r\n\r\n return axiosInstance\r\n .post(END_POINT.LOGOUT, payload)\r\n .then((res) => {\r\n sdkStateManager.clearStorageAndReset();\r\n localStorage.clear();\r\n sessionStorage.clear();\r\n setData(res?.data);\r\n setSuccess(true);\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n setIsError(true);\r\n setError(err);\r\n return err?.response?.data;\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, []);\r\n\r\n return {\r\n logout: handleLogout,\r\n isLoading: loading,\r\n isSuccess: success,\r\n isError: isError,\r\n error: error,\r\n data: data,\r\n };\r\n};\r\n\r\nexport default useLogout;\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 v1: \"/api/v1\",\r\n};\r\n\r\nexport const END_POINT = {\r\n LOGIN: `${BASE_URL}${VERSION.v1}/cti/login?provider=convox`,\r\n READY_AGENT: `${BASE_URL}${VERSION.v1}/cti/ready-agent?provider=convox`,\r\n UPDATE_AGENT_BREAK: `${BASE_URL}${VERSION.v1}/cti/update-agent-status?provider=convox`,\r\n CLICK_TO_CALL: `${BASE_URL}${VERSION.v1}/cti/calls?provider=convox`,\r\n HOLD_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/hold?provider=convox`,\r\n MUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/mute?provider=convox`,\r\n UNMUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/unmute-call?provider=convox`,\r\n END_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/end?provider=convox`,\r\n LOGOUT: `${BASE_URL}${VERSION.v1}/cti/logout?provider=convox`,\r\n\r\n CONFERENCE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference?provider=convox`,\r\n CONFERENCE_CALL_HOLD_OR_UN_HOLD: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hold?provider=convox`,\r\n CONFERENCE_CALL_MUTE_OT_UN_MUTE: `${BASE_URL}${VERSION.v1}/cti/calls/conference/mute?provider=convox`,\r\n CONFERENCE_CALL_END: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup?provider=convox`,\r\n CONFERENCE_CALL_END_ALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup/all?provider=convox`,\r\n TRANSFER_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/transfer?provider=convox`,\r\n\r\n AGENTS_LIST: `${BASE_URL}${VERSION.v1}/cti/users`,\r\n PROCESS_LIST: `${BASE_URL}${VERSION.v1}/cti/processes-list`,\r\n TRANSFER_TO_DETAILS: `${BASE_URL}${VERSION.v1}/cti/transfer-to-details?provider=convox`,\r\n\r\n CALL_HISTORY: `${BASE_URL}${VERSION.v1}/dashboard/call-history`,\r\n SENTIMENTAL_ANALYSIS: `${BASE_URL}${VERSION.v1}/users/get_sentiment_analysis`,\r\n};\r\n\r\nexport const WS_END_POINT = {\r\n WS: `${WS_BASE_URL}${VERSION.v1}/cti/ws`,\r\n};\r\n","import axios from \"axios\"; // Axios HTTP client for API communication\r\nimport { BASE_URL } from \"./endPoint\";\r\n\r\n/**\r\n * @here Reads the stored authentication token.\r\n * @description Used to set the initial Authorization header for the axios instance.\r\n */\r\nconst token = \"12345\";\r\n\r\n/**\r\n * @here Creates a configured Axios instance.\r\n * @description Sets base URL, headers, and timeout for all outgoing HTTP requests.\r\n */\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares an Axios HTTP client instance with global configuration.\r\n * @description Configures default headers, timeout, and interceptors for handling request/response behavior globally.\r\n * @params\r\n * - None (but uses token from local storage)\r\n * @example\r\n * import axiosInstance from \"@/lib/axios\";\r\n * axiosInstance.get(\"/endpoint\").then(...).catch(...);\r\n * @returns A customized Axios instance with built-in interceptors and token management.\r\n */\r\n\r\nconst axiosInstance = axios.create({\r\n baseURL: BASE_URL, // Base URL from Vite environment variables\r\n headers: {\r\n \"Content-Type\": \"application/json\", // Default content type for requests\r\n Authorization: token, // Attach token if available (as raw, without Bearer prefix)\r\n },\r\n timeout: 10000, // Request timeout in milliseconds (10 seconds)\r\n});\r\n\r\n/**\r\n * @here Adds a request interceptor to inject Bearer token.\r\n * @description Ensures Authorization header is up-to-date with the latest token before every request.\r\n * @params\r\n * - config: Axios request configuration object.\r\n * @returns The modified request config with updated headers.\r\n */\r\naxiosInstance.interceptors.request.use(\r\n (config) => {\r\n const token = \"12345\"; // Re-fetch token before request\r\n if (token && config.headers) {\r\n config.headers.Authorization = `Bearer ${token}`; // Set Authorization header\r\n }\r\n return config; // Proceed with modified config\r\n },\r\n /**\r\n * @here Handles request errors.\r\n * @description Converts unknown request error types into standardized JavaScript Error.\r\n */\r\n (error) =>\r\n Promise.reject(error instanceof Error ? error : new Error(String(error)))\r\n);\r\n\r\n/**\r\n * @here Adds a response interceptor to handle error responses.\r\n * @description Captures 401 Unauthorized errors and optionally retries the request.\r\n * @params\r\n * - error: Axios response error object.\r\n * @returns The original error or a retry attempt if applicable.\r\n */\r\naxiosInstance.interceptors.response.use(\r\n (response) => response, // Pass through successful response\r\n async (error) => {\r\n const originalRequest = error.config;\r\n\r\n // Retry logic for unauthorized requests (once only)\r\n if (error.response?.status === 401 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n // Optional: trigger refresh logic or logout here\r\n }\r\n\r\n // Normalize error format\r\n return Promise.reject(\r\n error instanceof Error ? error : new Error(String(error))\r\n );\r\n }\r\n);\r\n\r\n/**\r\n * @here Exports the configured Axios instance.\r\n * @description Makes the client available throughout the app via a single import.\r\n */\r\nexport default axiosInstance;\r\n","import { useCallback, useState } from \"react\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\nexport interface EndCallPayload {\r\n action: string;\r\n disposition: string;\r\n userId: string;\r\n processid: string;\r\n mobile_number: string;\r\n set_followUp: string;\r\n callback_date: string;\r\n callback_hrs: string;\r\n callback_mins: string;\r\n refno?: string;\r\n}\r\n\r\n/**\r\n * Custom hook for handling end call functionality\r\n * @param options - Optional callbacks for success, error, and completion\r\n * @returns Object containing logout function and loading state\r\n */\r\n\r\nexport const useEndCall = () => {\r\n const [loading, setLoading] = useState(false);\r\n const [success, setSuccess] = useState(false);\r\n const [isError, setIsError] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [data, setData] = useState(null);\r\n\r\n /**\r\n * Handles call end with current agent call\r\n * @param data - Object containing call disposition information\r\n */\r\n\r\n const handleEndCall = useCallback(\r\n async (data: {\r\n disposition?: string;\r\n followUp?: string;\r\n callbackDate?: string;\r\n callbackHrs?: string;\r\n callbackMins?: string;\r\n }) => {\r\n const state = JSON.parse(\r\n localStorage.getItem(\"call-control-sdk-state\") ?? \"\"\r\n );\r\n setLoading(true);\r\n const payload = {\r\n action: \"ENDCALL\",\r\n userId: state?.agentId,\r\n processid: state?.process?.process_id?.toString() ?? \"\",\r\n process_name: state?.process?.process_name ?? \"\",\r\n callreferenceid: state?.callData?.convox_id ?? \"\",\r\n mobile_number: state?.callData?.phone_number ?? \"\",\r\n\r\n disposition: data?.disposition ?? \"RES\",\r\n set_followUp: data?.followUp ?? \"N\",\r\n callback_date: data?.callbackDate ?? \"\",\r\n callback_hrs: data?.callbackHrs ?? \"\",\r\n callback_mins: data?.callbackMins ?? \"\",\r\n endcall_type: \"CLOSE\",\r\n };\r\n\r\n return axiosInstance\r\n .post(END_POINT.END_CALL, payload)\r\n .then((res) => {\r\n sdkStateManager.endCall();\r\n setData(res?.data);\r\n setSuccess(true);\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n setIsError(true);\r\n setError(err);\r\n return err?.response?.data;\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n },\r\n []\r\n );\r\n\r\n return {\r\n handleEndCall,\r\n isLoading: loading,\r\n isSuccess: success,\r\n isError: isError,\r\n error: error,\r\n data: data,\r\n };\r\n};\r\n","import {\r\n ArrowDropDown,\r\n CallEnd,\r\n Close,\r\n DragIndicator,\r\n Group,\r\n Layers,\r\n Mic,\r\n MicOff,\r\n Pause,\r\n Pending,\r\n Phone,\r\n PlayArrow,\r\n SupportAgent,\r\n TransferWithinAStation,\r\n Upcoming,\r\n WifiCalling3,\r\n} from \"@mui/icons-material\";\r\nimport {\r\n Box,\r\n Button,\r\n Chip,\r\n CircularProgress,\r\n Fade,\r\n IconButton,\r\n Menu,\r\n MenuItem,\r\n Paper,\r\n TextField,\r\n Tooltip,\r\n Typography,\r\n useTheme,\r\n} from \"@mui/material\";\r\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\nimport type { CallControlPanelProps } from \"../../types\";\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport { useDraggable } from \"../hooks/useDraggable\";\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport { END_POINT, IP, WS_END_POINT } from \"../services/endPoint\";\r\nimport { usePostRequest } from \"../services/request\";\r\n\r\nimport {\r\n CallHistoryDialog,\r\n CallTransferDialog,\r\n ConferenceDialog,\r\n EndCallDispositionDialog,\r\n ProcessorListDialog,\r\n} from \"./dialog\";\r\nimport useStyles from \"./styles\";\r\n\r\nexport function CallControls({ onDataChange }: CallControlPanelProps) {\r\n const theme = useTheme();\r\n const state = useSDKState();\r\n const { disabled, enabled, outlined } = useStyles({\r\n disabled: state.sdkConfig?.disabled || {},\r\n enabled: state.sdkConfig?.enabled || {},\r\n outlined: state.sdkConfig?.outlined || {},\r\n });\r\n\r\n const webSocketRef = useRef<WebSocket | null>(null);\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const [showIframe, setShowIframe] = useState<boolean>(true);\r\n const [statusAnchorEl, setStatusAnchorEl] = useState<null | HTMLElement>(\r\n null\r\n );\r\n const [dialerAnchorEl, setDialerAnchorEl] = useState<null | HTMLElement>(\r\n null\r\n );\r\n const [open, setOpen] = useState(false);\r\n const [openCallTransfer, setOpenCallTransfer] = useState(false);\r\n const [openCallDisposition, setOpenCallDisposition] = useState(false);\r\n const [openProcessorDialog, setOpenProcessorDialog] = useState(false);\r\n const [openCallHistoryDialog, setOpenCallHistoryDialog] = useState(false);\r\n\r\n const [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n const [callDuration, setCallDuration] = useState(0);\r\n\r\n const { position, isDragging, dragRef, handleMouseDown, handleTouchStart } =\r\n useDraggable(state.controlPanelPosition, (newPosition) =>\r\n sdkStateManager.setControlPanelPosition(newPosition)\r\n );\r\n\r\n const {\r\n position: iframePosition,\r\n isDragging: iframeIsDragging,\r\n dragRef: iframeDragRef,\r\n handleMouseDown: iframeHandleMouseDown,\r\n handleTouchStart: iframeHandleTouchStart,\r\n } = useDraggable(state.iframePosition, (newPosition) =>\r\n sdkStateManager.setIframePosition(newPosition)\r\n );\r\n\r\n const [getProcessList, { data: processList }] = usePostRequest<any>({\r\n onSuccess: (res: any) => {\r\n console.log(\"res\", res);\r\n if (res && res.data && res?.data?.length > 1) {\r\n setOpenProcessorDialog(true);\r\n } else {\r\n sdkStateManager.setProcess(res?.data[0]);\r\n setOpenProcessorDialog(false);\r\n }\r\n },\r\n onError: () => {\r\n setOpenProcessorDialog(false);\r\n },\r\n });\r\n\r\n const [clickToCall, { isLoading: clickToCallLoading }] = usePostRequest<{\r\n action: string;\r\n phone_number: string;\r\n userId: string;\r\n }>();\r\n\r\n const [holdOrUnHold, { isLoading: holdOrUnHoldLoading }] = usePostRequest<{\r\n action: string;\r\n userId: string;\r\n refno?: string;\r\n }>({\r\n onSuccess: () => {\r\n sdkStateManager.setHolding(!state.isHolding);\r\n },\r\n onError: (error) => {\r\n console.log(\"error\", error);\r\n },\r\n });\r\n\r\n const [muteOrUnMute, { isLoading: muteOrUnMuteLoading }] = usePostRequest<{\r\n action: string;\r\n userId: string;\r\n refno?: string;\r\n }>({\r\n onSuccess: () => {\r\n sdkStateManager.setMuted(!state.isMuted);\r\n },\r\n onError: (error) => {\r\n console.log(\"error\", error);\r\n },\r\n });\r\n\r\n const [readyAgentStatus, { isLoading: agentReadyLoading }] = usePostRequest<{\r\n action: string;\r\n refno?: string;\r\n userId: string;\r\n }>();\r\n\r\n const [updateAgentStatus, { isLoading }] = usePostRequest<{\r\n action: string;\r\n break_type: string;\r\n userId: string;\r\n }>();\r\n\r\n const [endCall, { isLoading: endCallLoading }] = usePostRequest<{\r\n action: string;\r\n // convoxid: string;\r\n disposition: string;\r\n userId: string;\r\n processid: string;\r\n mobile_number: string;\r\n set_followUp: string;\r\n callback_date: string;\r\n callback_hrs: string;\r\n callback_mins: string;\r\n refno?: string;\r\n }>();\r\n\r\n const formatDuration = useCallback((seconds: number): string => {\r\n const mins = Math.floor(seconds / 60);\r\n const secs = seconds % 60;\r\n return `${mins.toString().padStart(2, \"0\")}:${secs.toString().padStart(2, \"0\")}`;\r\n }, []);\r\n\r\n const handleCloseQueueCounts = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleOpenDialer = (event: React.MouseEvent<HTMLElement>) => {\r\n setShowIframe(true);\r\n setDialerAnchorEl(event.currentTarget);\r\n sdkStateManager.setStatus(\"dial\");\r\n };\r\n\r\n const handleCloseDialer = () => {\r\n if (state.status !== \"on call\") {\r\n sdkStateManager.setStatus(\"idle\");\r\n }\r\n\r\n setDialerAnchorEl(null);\r\n };\r\n\r\n const handleOpenAgentStatus = (event: React.MouseEvent<HTMLElement>) => {\r\n setStatusAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleCloseAgentStatus = () => {\r\n setStatusAnchorEl(null);\r\n };\r\n\r\n // // call control API's // //\r\n //------------------------------//\r\n\r\n const handleAgentReady = () => {\r\n const payload = {\r\n action: \"READYAGENT\",\r\n userId: state.agentId,\r\n };\r\n readyAgentStatus(END_POINT.READY_AGENT, payload);\r\n };\r\n\r\n const handleUpdateAgentStatus = (status: string) => {\r\n setStatusAnchorEl(null);\r\n const payload = {\r\n action: \"AGENTBREAK\",\r\n break_type: status,\r\n userId: state.agentId,\r\n };\r\n updateAgentStatus(END_POINT.UPDATE_AGENT_BREAK, payload);\r\n };\r\n\r\n const handleStartCall = (number: string) => {\r\n if (number.length !== 10) {\r\n alert(\"Invalid phone number\");\r\n } else if (!/^\\d+$/.test(number)) {\r\n } else {\r\n const payload = {\r\n action: \"CALL\",\r\n phone_number: number,\r\n userId: state.agentId,\r\n };\r\n clickToCall(END_POINT.CLICK_TO_CALL, payload);\r\n }\r\n };\r\n\r\n const handleHoldToggle = () => {\r\n const payload = {\r\n action: state.isHolding ? \"UNHOLD\" : \"HOLD\",\r\n userId: state.agentId,\r\n };\r\n holdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n };\r\n\r\n const handleMuteToggle = () => {\r\n const payload = {\r\n action: state.isMuted ? \"UNMUTE\" : \"MUTE\",\r\n userId: state.agentId,\r\n };\r\n\r\n muteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n };\r\n\r\n const handleEndCall = (data: {\r\n disposition: { label: string; value: string };\r\n followUp: { label: string; value: string };\r\n callbackDate: string;\r\n callbackHrs: string;\r\n callbackMins: string;\r\n }) => {\r\n console.log(\"data\", data);\r\n const payload = {\r\n action: \"ENDCALL\",\r\n userId: state.agentId,\r\n processid: state.process?.process_id?.toString() ?? \"\",\r\n process_name: state.process?.process_name ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n\r\n disposition: data?.disposition?.value ?? \"\",\r\n set_followUp: data?.followUp?.value ?? \"\",\r\n callback_date: data?.callbackDate ?? \"\",\r\n callback_hrs: data?.callbackHrs ?? \"\",\r\n callback_mins: data?.callbackMins ?? \"\",\r\n endcall_type: \"CLOSE\",\r\n };\r\n setPhoneNumber(\"\");\r\n endCall(END_POINT.END_CALL, payload);\r\n sdkStateManager.endCall();\r\n setOpenCallDisposition(false);\r\n };\r\n\r\n // Call duration timer\r\n useEffect(() => {\r\n let interval: ReturnType<typeof setInterval>;\r\n\r\n if (state.callData.status && state.callData.status === \"ONCALL\") {\r\n interval = setInterval(() => {\r\n const elapsed = Math.floor((Date.now() - state.callStartTime!) / 1000);\r\n setCallDuration(elapsed);\r\n }, 1000);\r\n } else {\r\n setCallDuration(0);\r\n }\r\n\r\n return () => {\r\n if (interval) clearInterval(interval);\r\n };\r\n }, [state.callData.status]);\r\n\r\n // Notify parent of data changes\r\n useEffect(() => {\r\n if (onDataChange) {\r\n onDataChange(state.callData);\r\n }\r\n }, [state.callData, onDataChange]);\r\n\r\n useEffect(() => {\r\n if (state.agentId) {\r\n getProcessList(END_POINT.PROCESS_LIST, {\r\n userId: state.agentId,\r\n action: \"GETAGENTPROCESSLIST\",\r\n refno: \"1234221233\",\r\n });\r\n } else {\r\n console.log(\"No agentId available, skipping API call\");\r\n }\r\n }, [state.agentId]);\r\n\r\n useEffect(() => {\r\n if (state.agentId) {\r\n webSocketRef.current = new WebSocket(\r\n `${WS_END_POINT.WS}?agent_id=${state.agentId}`\r\n );\r\n\r\n webSocketRef.current.onopen = () => {\r\n console.log(\"WebSocket connection established\");\r\n };\r\n\r\n webSocketRef.current.onmessage = (event) => {\r\n try {\r\n const data = JSON.parse(event.data);\r\n console.log(\"parsedJSON:\", data);\r\n sdkStateManager.updateCallData(data);\r\n if (data.status === \"ONCALL\") {\r\n sdkStateManager.startCall();\r\n }\r\n if (data.status === \"WRAPUP\") {\r\n sdkStateManager.endCall();\r\n }\r\n } catch {\r\n console.log(\"Raw message:\", event.data);\r\n }\r\n };\r\n\r\n webSocketRef.current.onclose = () => {\r\n console.log(\"WebSocket connection closed\");\r\n };\r\n\r\n webSocketRef.current.onerror = (error) => {\r\n console.error(\"WebSocket error:\", error);\r\n };\r\n }\r\n\r\n return () => {\r\n webSocketRef.current?.close();\r\n };\r\n }, [state.agentId]);\r\n\r\n if (!state.isInitialized || !state.process) {\r\n return (\r\n <Box>\r\n {/* Processor List Dialog */}\r\n {Boolean(openProcessorDialog) && (\r\n <ProcessorListDialog\r\n processList={processList}\r\n open={openProcessorDialog}\r\n setOpen={setOpenProcessorDialog}\r\n handleSelectedProcessor={(data: {\r\n process_id: number;\r\n process_name: string;\r\n }) => {\r\n sdkStateManager.setProcess(data);\r\n }}\r\n />\r\n )}\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <Fade in={true} timeout={300}>\r\n <Paper\r\n ref={dragRef}\r\n elevation={isDragging ? 4 : 1}\r\n sx={{\r\n position: \"fixed\",\r\n left: position.x,\r\n top: position.y,\r\n p: 0.5,\r\n borderRadius: 3,\r\n bgcolor: \"background.paper\",\r\n zIndex: 99999,\r\n transition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n duration: theme.transitions.duration.short,\r\n }),\r\n userSelect: \"none\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {/* Status and Timer Row */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n // justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <IconButton\r\n component=\"div\"\r\n size=\"small\"\r\n sx={{\r\n cursor: \"all-scroll\",\r\n }}\r\n onMouseDown={handleMouseDown}\r\n onTouchStart={handleTouchStart}\r\n >\r\n <DragIndicator />{\" \"}\r\n </IconButton>\r\n\r\n <Box\r\n sx={{\r\n marginRight: \"10px\",\r\n }}\r\n >\r\n {/* Dial Button */}\r\n <Tooltip title=\"Dial\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n if (\r\n state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n state.callData?.status?.toUpperCase() !== \"BREAK\" &&\r\n state.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n state.callData?.status?.toUpperCase() !== \"WRAPUP\"\r\n ) {\r\n handleOpenDialer(e);\r\n }\r\n }}\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": {\r\n bgcolor: \"warning\",\r\n },\r\n }}\r\n >\r\n <WifiCalling3\r\n sx={{\r\n color:\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ? \"action.selected\"\r\n : \"success.main\",\r\n }}\r\n />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n {/* Call Duration */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" ? */}\r\n <Typography\r\n sx={{\r\n color: \"success.main\",\r\n width: \"40px\",\r\n marginRight: \"10px\",\r\n }}\r\n >\r\n {formatDuration(callDuration)}\r\n </Typography>\r\n {/* :\tnull} */}\r\n\r\n {/* Agent Status Button */}\r\n\r\n {/* Agent Status */}\r\n {isLoading || agentReadyLoading ? (\r\n <Box\r\n sx={{\r\n fontWeight: \"bold\",\r\n // width: \"50px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <CircularProgress size=\"20px\" />\r\n </Box>\r\n ) : (\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n fontWeight: \"bold\",\r\n // width: \"50px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {state.callData?.status?.toUpperCase() ?? \"N/A\"}\r\n </Typography>\r\n )}\r\n <Box\r\n // size=\"small\"\r\n // variant=\"text\"\r\n onClick={handleOpenAgentStatus}\r\n // disabled={Boolean(state.callStartTime)}\r\n sx={{\r\n // backgroundColor: \"red\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n margin: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <ArrowDropDown />\r\n </Box>\r\n </Box>\r\n\r\n {/* Control Buttons */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n gap: 1,\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {/* Agent Ready */}\r\n {/* {state.callData?.status?.toUpperCase() === \"BREAK\" && ( */}\r\n <Tooltip title={\"Agent Ready\"}>\r\n <Button\r\n variant={\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ? \"outlined\"\r\n : \"contained\"\r\n }\r\n onClick={(e) => {\r\n if (\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ) {\r\n e.stopPropagation();\r\n handleAgentReady();\r\n }\r\n }}\r\n classes={{\r\n root:\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ? \"outlined\"\r\n : \"enabled\",\r\n }}\r\n sx={{\r\n ...(state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ? outlined\r\n : enabled),\r\n }}\r\n disabled={agentReadyLoading}\r\n >\r\n <SupportAgent />\r\n </Button>\r\n </Tooltip>\r\n {/* )} */}\r\n\r\n {/* Hold Button */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" && ( */}\r\n <Tooltip title={state.isHolding ? \"Resume\" : \"Hold\"}>\r\n <Button\r\n variant={\r\n state.isHolding &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? \"contained\"\r\n : \"outlined\"\r\n }\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleHoldToggle();\r\n }}\r\n sx={\r\n state.isHolding &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n (state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n !state.isHolding) ||\r\n holdOrUnHoldLoading\r\n }\r\n >\r\n {holdOrUnHoldLoading ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : state.isHolding ? (\r\n <PlayArrow />\r\n ) : (\r\n <Pause />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* )} */}\r\n\r\n {/* Mute Button */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" && ( */}\r\n <Tooltip title={state.isMuted ? \"Unmute\" : \"Mute\"}>\r\n <Button\r\n variant={\r\n state.isMuted &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? \"contained\"\r\n : \"outlined\"\r\n }\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleMuteToggle();\r\n }}\r\n sx={\r\n state.isMuted &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n (state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n !state.isMuted) ||\r\n muteOrUnMuteLoading\r\n }\r\n >\r\n {muteOrUnMuteLoading ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : state.isMuted ? (\r\n <MicOff />\r\n ) : (\r\n <Mic />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* )} */}\r\n\r\n {/* Call Transfer */}\r\n {state.sdkConfig?.showTransferButton && (\r\n <Tooltip title={\"Transfer Call\"}>\r\n <Button\r\n variant={openCallTransfer ? \"contained\" : \"outlined\"}\r\n onClick={(e) => {\r\n if (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n e.stopPropagation();\r\n setOpenCallTransfer(true);\r\n }\r\n }}\r\n sx={\r\n openCallTransfer\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n state.callData?.status?.toUpperCase() !== \"ONCALL\"\r\n }\r\n >\r\n <TransferWithinAStation />\r\n </Button>\r\n </Tooltip>\r\n )}\r\n\r\n {/* Call Conference Button */}\r\n {state.sdkConfig?.showConferenceButton && (\r\n <Tooltip title={\"Conference Call\"}>\r\n <Button\r\n variant={open ? \"contained\" : \"outlined\"}\r\n onClick={(e) => {\r\n if (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n e.stopPropagation();\r\n setOpen(true);\r\n }\r\n }}\r\n sx={\r\n open\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n state.callData?.status?.toUpperCase() !== \"ONCALL\"\r\n }\r\n >\r\n <Group />\r\n </Button>\r\n </Tooltip>\r\n )}\r\n\r\n {/* Call History */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" && ( */}\r\n {/* <Tooltip title={\"Call History\"}>\r\n <Button\r\n variant={openCallHistoryDialog ? \"contained\" : \"outlined\"}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setOpenCallHistoryDialog(true);\r\n }}\r\n sx={openCallHistoryDialog ? { ...enabled } : { ...outlined }}\r\n >\r\n <History />\r\n </Button>\r\n </Tooltip> */}\r\n {/* )} */}\r\n\r\n {/* End Call Button */}\r\n {state.sdkConfig?.showEndCallButton && (\r\n <Tooltip title={\"End Call\"}>\r\n <Button\r\n variant={\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ? \"contained\"\r\n : \"outlined\"\r\n }\r\n onClick={(e) => {\r\n if (\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ) {\r\n e.stopPropagation();\r\n setOpenCallDisposition(true);\r\n }\r\n }}\r\n sx={\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ? {\r\n ...enabled,\r\n borderRight: \"1px\",\r\n backgroundColor: \"error.main\",\r\n minWidth: \"60px !important\",\r\n boxShadow: \" 0px 2px 1px #5f3f3f\",\r\n border: `1px solid ${theme.palette.error.light}`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: \" 0px 2px 1px #5f3f3f\",\r\n border: `0px solid ${theme.palette.error.light}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n }\r\n : {\r\n ...disabled,\r\n minWidth: \"60px !important\",\r\n }\r\n }\r\n disabled={\r\n (state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n state.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n state.callData?.status?.toUpperCase() !== \"WRAPUP\") ||\r\n endCallLoading\r\n }\r\n >\r\n {endCallLoading ? (\r\n <CircularProgress size=\"20px\" color=\"error\" />\r\n ) : (\r\n <CallEnd />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n )}\r\n </Box>\r\n </Box>\r\n </Paper>\r\n </Fade>\r\n\r\n <Fade in={true} timeout={300}>\r\n <Paper\r\n ref={iframeDragRef}\r\n elevation={iframeIsDragging ? 4 : 1}\r\n sx={{\r\n position: \"fixed\",\r\n left: iframePosition.x,\r\n top: iframePosition.y,\r\n p: 1,\r\n height: \"auto\",\r\n borderRadius: 2,\r\n bgcolor: \"background.paper\",\r\n zIndex: 99999,\r\n transition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n duration: theme.transitions.duration.short,\r\n }),\r\n visibility: showIframe ? \"visible\" : \"hidden\",\r\n userSelect: \"none\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n cursor: \"all-scroll\",\r\n }}\r\n onMouseDown={iframeHandleMouseDown}\r\n onTouchStart={iframeHandleTouchStart}\r\n >\r\n <DragIndicator\r\n sx={{\r\n transform: \"rotate(90deg)\",\r\n }}\r\n />{\" \"}\r\n <IconButton onClick={() => setShowIframe(false)}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n <iframe\r\n src={`https://${IP}/ConVoxCCS/iframe?agent_id=${state.agentId}&process_id=${state.process?.process_id}`}\r\n height={380}\r\n width={420}\r\n allow=\"camera; microphone; autoplay\"\r\n style={{\r\n border: \"none\",\r\n }}\r\n ></iframe>\r\n </Paper>\r\n </Fade>\r\n\r\n {/* Dialer */}\r\n <Menu\r\n anchorEl={dialerAnchorEl}\r\n open={Boolean(dialerAnchorEl)}\r\n onClose={handleCloseDialer}\r\n onClick={(e) => e.stopPropagation()}\r\n sx={{\r\n zIndex: 99999,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n all: \"unset\",\r\n padding: \"10px\",\r\n \"&hover\": {\r\n backgroundColor: \"white\",\r\n },\r\n }}\r\n >\r\n <TextField\r\n size=\"small\"\r\n value={phoneNumber}\r\n placeholder=\"Enter Mobile No.\"\r\n onChange={(e) => {\r\n setPhoneNumber(e.target.value);\r\n }}\r\n />\r\n <IconButton\r\n color=\"info\"\r\n onClick={() => {\r\n handleStartCall(phoneNumber);\r\n }}\r\n >\r\n {clickToCallLoading ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.success.main,\r\n }}\r\n />\r\n ) : (\r\n <Phone color=\"success\" />\r\n )}\r\n </IconButton>\r\n </Box>\r\n </Menu>\r\n\r\n {/* Status */}\r\n <Menu\r\n anchorEl={statusAnchorEl}\r\n open={Boolean(statusAnchorEl)}\r\n onClose={handleCloseAgentStatus}\r\n onClick={(e) => e.stopPropagation()}\r\n sx={{\r\n zIndex: 99999,\r\n }}\r\n >\r\n <MenuItem onClick={() => handleUpdateAgentStatus(\"Lunch\")}>\r\n - Lunch\r\n </MenuItem>\r\n <MenuItem onClick={() => handleUpdateAgentStatus(\"Tea\")}>\r\n - Tea\r\n </MenuItem>\r\n </Menu>\r\n\r\n {/* Queue Count */}\r\n <Menu\r\n anchorEl={anchorEl}\r\n open={Boolean(anchorEl)}\r\n onClose={handleCloseQueueCounts}\r\n onClick={(e) => e.stopPropagation()}\r\n sx={{\r\n zIndex: 99999,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"flex-start\",\r\n flexDirection: \"column\",\r\n padding: \"0px 10px\",\r\n \"&hover\": {\r\n backgroundColor: \"white\",\r\n },\r\n }}\r\n >\r\n <Chip\r\n icon={<Layers color=\"secondary\" />}\r\n variant=\"outlined\"\r\n label=\"Waiting - 25\"\r\n sx={{\r\n margin: \"4px 2px\",\r\n }}\r\n />\r\n\r\n <Chip\r\n icon={<Pending color=\"info\" />}\r\n label=\"Pending - 99+\"\r\n variant=\"outlined\"\r\n sx={{\r\n margin: \"4px 2px\",\r\n }}\r\n />\r\n\r\n <Chip\r\n icon={<Upcoming color=\"success\" />}\r\n variant=\"outlined\"\r\n label=\"Upcoming - 66\"\r\n sx={{\r\n margin: \"4px 2px\",\r\n }}\r\n />\r\n </Box>\r\n </Menu>\r\n\r\n {/* Conference Call Dialog */}\r\n {Boolean(open) && <ConferenceDialog open={open} setOpen={setOpen} />}\r\n\r\n {/* Call Transfer Dialog */}\r\n {Boolean(openCallTransfer) && (\r\n <CallTransferDialog\r\n open={openCallTransfer}\r\n setOpen={setOpenCallTransfer}\r\n />\r\n )}\r\n\r\n {/* Call Disposition Dialog */}\r\n {Boolean(openCallDisposition) && (\r\n <EndCallDispositionDialog\r\n open={openCallDisposition}\r\n setOpen={setOpenCallDisposition}\r\n onSubmitDisposition={handleEndCall}\r\n />\r\n )}\r\n\r\n {/* Call Disposition Dialog */}\r\n {Boolean(openCallHistoryDialog) && (\r\n <CallHistoryDialog\r\n open={openCallHistoryDialog}\r\n setOpen={setOpenCallHistoryDialog}\r\n />\r\n )}\r\n </>\r\n );\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 /**\r\n * Local React state holding the current SDK state.\r\n * Initialized from the sdkStateManager's current state.\r\n */\r\n const [state, setState] = useState<SDKState>(sdkStateManager.getState());\r\n\r\n /**\r\n * Sets up a subscription to the sdkStateManager on component mount.\r\n * Whenever the SDK state changes, this updates the local `state`.\r\n * Cleans up the subscription on component unmount.\r\n */\r\n useEffect(() => {\r\n // Subscribe to state changes from the sdkStateManager\r\n const unsubscribe = sdkStateManager.subscribe(() => {\r\n // Update local React state with the latest SDK state\r\n setState(sdkStateManager.getState());\r\n });\r\n\r\n // Return the unsubscribe function to clean up\r\n return unsubscribe;\r\n }, []);\r\n\r\n /**\r\n * Return the current SDK state to the calling component.\r\n */\r\n return 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 } = 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\tshowToast(res.data?.message, \"success\");\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\tshowToast: (message: string, severity?: AlertColor) => void;\r\n};\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nexport const useToast = () => {\r\n\tconst ctx = useContext(ToastContext);\r\n\tif (!ctx) throw new Error(\"useToast must be used inside ToastProvider\");\r\n\treturn ctx;\r\n};\r\n\r\nexport const ToastProvider = ({ children }: { children: ReactNode }) => {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst [message, setMessage] = useState(\"\");\r\n\tconst [severity, setSeverity] = useState<AlertColor>(\"info\");\r\n\r\n\tconst showToast = (msg: string, sev: AlertColor = \"info\") => {\r\n\t\tsetMessage(msg);\r\n\t\tsetSeverity(sev);\r\n\t\tsetOpen(true);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<ToastContext.Provider value={{ showToast }}>\r\n\t\t\t{children}\r\n\t\t\t<Snackbar\r\n\t\t\t\topen={open}\r\n\t\t\t\tcolor={severity}\r\n\t\t\t\tautoHideDuration={3000}\r\n\t\t\t\tonClose={() => setOpen(false)}\r\n\t\t\t\tanchorOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n\t\t\t>\r\n\t\t\t\t<Alert\r\n\t\t\t\t\tvariant=\"filled\"\r\n\t\t\t\t\t// color={severity}\r\n\t\t\t\t\tseverity={severity}\r\n\t\t\t\t\tonClose={() => setOpen(false)}\r\n\t\t\t\t\tsx={{ width: \"100%\" }}\r\n\t\t\t\t>\r\n\t\t\t\t\t{message}\r\n\t\t\t\t</Alert>\r\n\t\t\t</Snackbar>\r\n\t\t</ToastContext.Provider>\r\n\t);\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n Call,\r\n CallEnd,\r\n CallSplit,\r\n Close,\r\n Mic,\r\n MicOff,\r\n Pause,\r\n PhoneDisabled,\r\n PlayArrow,\r\n SupportAgent,\r\n} from \"@mui/icons-material\";\r\nimport {\r\n Box,\r\n Button,\r\n Dialog,\r\n IconButton,\r\n Paper,\r\n TextField,\r\n Typography,\r\n Autocomplete,\r\n Grid,\r\n Tooltip,\r\n useTheme,\r\n TableContainer,\r\n Table,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableBody,\r\n CircularProgress,\r\n} from \"@mui/material\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { usePostRequest } from \"../services/request\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport type { ConferenceLineTypes } from \"../../types\";\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport axiosInstance from \"../services/axios\";\r\nimport { useToast } from \"../services/toastMessage\";\r\nimport useStyles from \"./styles\";\r\n\r\ntype TransferCallRequest = {\r\n mobile_number?: string;\r\n userid?: string;\r\n type?: string;\r\n transfer_to?: string;\r\n callreferenceid?: string;\r\n processid?: string;\r\n process_name?: string;\r\n};\r\n\r\nconst ConferenceTableRow = ({ each }: any) => {\r\n const state = useSDKState();\r\n const { showToast } = useToast();\r\n const { disabled, enabled, outlined } = useStyles({\r\n disabled: state.sdkConfig?.disabled || {},\r\n enabled: state.sdkConfig?.enabled || {},\r\n outlined: state.sdkConfig?.outlined || {},\r\n });\r\n const theme = useTheme();\r\n\r\n // Loading States\r\n const [conferenceCallStart, setConferenceCallStart] = useState(false);\r\n const [conferenceCallMerge, setConferenceCallMerge] = useState(false);\r\n const [conferenceCallHoldOrUnHold, setConferenceCallHoldOrUnHold] =\r\n useState(false);\r\n const [conferenceCallMuteOrUnMute, setConferenceCallMuteOrUnMute] =\r\n useState(false);\r\n const [conferenceCallEnd, setConferenceCallEnd] = useState(false);\r\n\r\n const onConferenceLineUpdate = (line: ConferenceLineTypes, data: any) => {\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n };\r\n\r\n const onConferenceCallStart = (line: ConferenceLineTypes, data: any) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallStart(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: `CALL${line_used.line}`,\r\n line_used: String(line_used.line),\r\n thirdparty_no: line_used.phone,\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallStart(false);\r\n });\r\n };\r\n\r\n const onMergeConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallMerge(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: `CONFERENCE`,\r\n line_used: String(line_used.line),\r\n thirdparty_no: line_used.phone,\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallMerge(false);\r\n });\r\n };\r\n\r\n const onHoldOrUnHoldConferenceCall = (\r\n line: ConferenceLineTypes,\r\n data: any,\r\n type: string\r\n ) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallHoldOrUnHold(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: type,\r\n hold_channel_no:\r\n type === \"HOLDUSER\"\r\n ? `hold${line_used.line}`\r\n : `unhold${line_used.line}`, // Change the line according where u intiated firstly\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_HOLD_OR_UN_HOLD, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallHoldOrUnHold(false);\r\n });\r\n };\r\n\r\n const onMuteOrUnMuteConferenceCall = (\r\n line: ConferenceLineTypes,\r\n data: any,\r\n type: string\r\n ) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallMuteOrUnMute(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: type,\r\n channel_no:\r\n type === \"MUTEUSER\" ? `mute${line_used.line}` : `play${line_used.line}`,\r\n userid: state.callData?.agent_id ?? \"\",\r\n thirdparty_no: line_used.phone,\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_MUTE_OT_UN_MUTE, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallMuteOrUnMute(false);\r\n });\r\n };\r\n\r\n const onEndConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallEnd(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: \"HANGUP_CHANNEL\",\r\n line_used: String(line_used.line - 1),\r\n user_type: `THIRDPARTY${line_used.line - 1}`,\r\n thirdparty_no: line_used.phone,\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_END, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallEnd(false);\r\n });\r\n };\r\n\r\n return (\r\n <TableRow\r\n key={each.line}\r\n sx={{\r\n border: \"2px solid #fff\",\r\n }}\r\n >\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Typography>Line {each?.line ?? \"\"}. </Typography>\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n px: 1,\r\n // border: \"2px solid gray\",\r\n borderRadius: \"10px\",\r\n // textAlign: \"center\",\r\n width: \"80px\",\r\n maxWidth: \"100px\",\r\n }}\r\n >\r\n {each?.status ?? \"\"}\r\n </Typography>\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Button\r\n sx={{\r\n textTransform: \"capitalize\",\r\n }}\r\n size=\"small\"\r\n >\r\n <Typography variant=\"body2\">\r\n {each?.line === 1 ? \"Internal\" : \"External\"}\r\n </Typography>\r\n </Button>\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <TextField\r\n size=\"small\"\r\n placeholder=\"Phone Number\"\r\n value={each?.phone || \"\"}\r\n disabled={each?.line === 1}\r\n onChange={(e) => {\r\n onConferenceLineUpdate(each, { phone: e.target.value });\r\n }}\r\n />\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-around\",\r\n }}\r\n >\r\n {/* Action Buttons */}\r\n {/* Conference Call Button */}\r\n <Tooltip title=\"Call\">\r\n <Button\r\n variant={each?.isCallStart ? \"outlined\" : \"contained\"}\r\n color=\"success\"\r\n sx={\r\n each?.isCallStart\r\n ? { ...disabled }\r\n : {\r\n ...enabled,\r\n border: `0px solid ${theme.palette.success.light}`,\r\n \"&:hover\": {\r\n bgcolor: \"success.light\",\r\n boxShadow: `0px 2px 1px ${theme.palette.success.light}`,\r\n border: `0px solid ${theme.palette.success.light}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"success.light\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n }\r\n }\r\n onClick={() => {\r\n onConferenceCallStart(each, {\r\n isCallStart: true,\r\n status: \"ONCALL\",\r\n });\r\n }}\r\n disabled={each?.isCallStart || conferenceCallStart}\r\n >\r\n {conferenceCallStart ? (\r\n <CircularProgress size=\"20px\" color=\"success\" />\r\n ) : (\r\n <Call\r\n sx={{ color: each?.isCallStart ? \"default\" : \"#e7e7e7ff\" }}\r\n />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* Merge Call Button */}\r\n <Tooltip title=\"Merge Call\">\r\n <Button\r\n variant={each?.isMergeCall ? \"contained\" : \"outlined\"}\r\n sx={\r\n each?.isMergeCall && each?.isCallStart\r\n ? { ...disabled }\r\n : each?.isCallStart\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n onClick={() => {\r\n onMergeConferenceCall(each, {\r\n isMergeCall: true,\r\n status: \"ONCALL\",\r\n });\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallMerge}\r\n >\r\n {conferenceCallMerge ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: each?.isMergeCall\r\n ? \"#e7e7e7ff\"\r\n : theme.palette.primary.main,\r\n }}\r\n />\r\n ) : (\r\n <CallSplit />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* Hold Or Un Hold Call Button */}\r\n <Tooltip title={each.isHold ? \"Hold\" : \"Un Hold\"}>\r\n <Button\r\n variant={each?.isHold ? \"contained\" : \"outlined\"}\r\n sx={\r\n each?.isHold && each?.isCallStart\r\n ? { ...disabled }\r\n : each?.isCallStart\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n onClick={() => {\r\n if (each.isHold) {\r\n onHoldOrUnHoldConferenceCall(\r\n each,\r\n { isHold: false },\r\n \"UNHOLDUSER\"\r\n );\r\n } else {\r\n onHoldOrUnHoldConferenceCall(\r\n each,\r\n { isHold: true },\r\n \"HOLDUSER\"\r\n );\r\n }\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallHoldOrUnHold}\r\n >\r\n {conferenceCallHoldOrUnHold ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : each.isHold ? (\r\n <PlayArrow />\r\n ) : (\r\n <Pause />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* Mute Or Un Mute Call Button */}\r\n <Tooltip title={each.isMute ? \"Mute\" : \"Un Mute\"}>\r\n <Button\r\n variant={each?.isMute ? \"contained\" : \"outlined\"}\r\n sx={\r\n each?.isMute && each?.isCallStart\r\n ? { ...disabled }\r\n : each?.isCallStart\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n onClick={() => {\r\n if (each.isMute) {\r\n onMuteOrUnMuteConferenceCall(\r\n each,\r\n { isMute: false },\r\n \"PLAYUSER\"\r\n );\r\n } else {\r\n onMuteOrUnMuteConferenceCall(\r\n each,\r\n { isMute: true },\r\n \"MUTEUSER\"\r\n );\r\n }\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallMuteOrUnMute}\r\n >\r\n {conferenceCallMuteOrUnMute ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : each.isMute ? (\r\n <MicOff />\r\n ) : (\r\n <Mic />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* End Call Button */}\r\n <Tooltip title=\"End Call\">\r\n {each?.line !== 1 ? (\r\n <Button\r\n variant={each?.isCallStart ? \"contained\" : \"outlined\"}\r\n color=\"error\"\r\n sx={\r\n each?.isCallStart\r\n ? {\r\n ...enabled,\r\n minWidth: \"60px !important\",\r\n border: `0px solid ${theme.palette.error.light}`,\r\n \"&:hover\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: `0px 2px 1px ${theme.palette.error.light}`,\r\n border: `0px solid ${theme.palette.error.light}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n }\r\n : { ...disabled, minWidth: \"60px !important\" }\r\n }\r\n onClick={() => {\r\n onEndConferenceCall(each, {\r\n isCallStart: false,\r\n isMergeCall: false,\r\n isMute: false,\r\n isHold: false,\r\n status: \"IDLE\",\r\n phone: \"\",\r\n });\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallEnd}\r\n >\r\n {conferenceCallEnd ? (\r\n <CircularProgress size=\"20px\" color=\"error\" />\r\n ) : (\r\n <CallEnd />\r\n )}\r\n </Button>\r\n ) : (\r\n <Button\r\n variant={each?.isCallStart ? \"contained\" : \"outlined\"}\r\n sx={{\r\n ...disabled,\r\n visibility: \"hidden\",\r\n minWidth: \"60px !important\",\r\n }}\r\n onClick={() => {\r\n onEndConferenceCall(each, {\r\n isCallStart: false,\r\n isMergeCall: false,\r\n isMute: false,\r\n isHold: false,\r\n status: \"IDLE\",\r\n phone: \"\",\r\n });\r\n }}\r\n disabled={!each?.isCallStart}\r\n >\r\n <Typography>\r\n <CallEnd\r\n sx={{\r\n visibility: \"hidden\",\r\n }}\r\n />\r\n </Typography>\r\n </Button>\r\n )}\r\n </Tooltip>\r\n </Box>\r\n </TableCell>\r\n </TableRow>\r\n );\r\n};\r\n\r\nexport function ConferenceDialog({ open, setOpen }: any) {\r\n const state = useSDKState();\r\n const { showToast } = useToast();\r\n const [conferenceCallEndAll, setConferenceCallEndAll] = useState(false);\r\n\r\n // const { disabled, enabled, outlined } = useMyStyles();\r\n // const theme = useTheme();\r\n\r\n // // Loading States\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n // const onConferenceLineUpdate = (line: ConferenceLineTypes, data: any) => {\r\n // \tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // };\r\n\r\n // const onConferenceCallStart = (line: ConferenceLineTypes, data: any) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: `CALL${line_used.line}`,\r\n // \t\tline_used: String(line_used.line),\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onMergeConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n // \tconst line_used = { ...line, ...data };\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: `CONFERENCE`,\r\n // \t\tline_used: String(line_used.line),\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onHoldOrUnHoldConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: type,\r\n // \t\thold_channel_no: type === \"HOLDUSER\" ? `hold${line_used.line}` : `unhold${line_used.line}`, // Change the line according where u intiated firstly\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL_HOLD_OR_UN_HOLD, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onMuteOrUnMuteConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: type,\r\n // \t\tchannel_no: type === \"MUTEUSER\" ? `mute${line_used.line}` : `play${line_used.line}`,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL_MUTE_OT_UN_MUTE, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onEndConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: \"HANGUP_CHANNEL\",\r\n // \t\tline_used: String(line_used.line - 1),\r\n // \t\tuser_type: `THIRDPARTY${line_used.line - 1}`,\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL_END, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n const onEndAllConferenceCalls = () => {\r\n setConferenceCallEndAll(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: \"ENDCONFERENCE\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_END_ALL, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.resetConferenceLines();\r\n handleClose();\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallEndAll(false);\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n const obj = {\r\n line: 1,\r\n status: state.callData?.status ?? \"\",\r\n type: \"internal\" as \"internal\" | \"external\" | \"\",\r\n phone: state.callData?.phone_number ?? \"\",\r\n isMute: false,\r\n isHold: false,\r\n isMergeCall: false,\r\n isCallStart: true,\r\n };\r\n sdkStateManager.setConferenceLine(obj);\r\n }, []);\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"md\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n }}\r\n >\r\n <Typography variant=\"body1\">\r\n {state?.agentId ?? \"\"} conference\r\n </Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 2px #e7e5e5ff\",\r\n margin: \"0px 15px\",\r\n borderRadius: \"20px\",\r\n }}\r\n >\r\n <TableContainer\r\n component={Paper}\r\n sx={{\r\n outline: \"0px solid gray !important\",\r\n boxShadow: \"1px 1px 6px #e7e5e5ff\",\r\n }}\r\n >\r\n <Table\r\n sx={{\r\n border: \"4px solid #ffffff !important\",\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow\r\n sx={{\r\n border: \"2px solid #f3f3f3ff !important\",\r\n }}\r\n >\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Line\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Status\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Call Type\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Mobile Number\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Call Actions\r\n </TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {state?.conferenceLine.map((each: any) => (\r\n <ConferenceTableRow each={each} />\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </Box>\r\n {/* End All Calls */}\r\n <Box textAlign=\"center\" m={2}>\r\n <Button\r\n variant=\"outlined\"\r\n color=\"error\"\r\n size=\"large\"\r\n onClick={onEndAllConferenceCalls}\r\n disabled={conferenceCallEndAll}\r\n sx={{ px: 2, borderRadius: \"20px\", textTransform: \"capitalize\" }}\r\n >\r\n {conferenceCallEndAll ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n color=\"error\"\r\n sx={{\r\n marginRight: \"8px\",\r\n }}\r\n />\r\n ) : (\r\n <IconButton\r\n sx={{\r\n bgcolor: \"error.main\",\r\n \"&:hover\": { bgcolor: \"error.dark\" },\r\n marginRight: \"8px\",\r\n width: \"28px\",\r\n height: \"28px\",\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n lineHeight: \"16px\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n color: \"white\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: \"50%\",\r\n }}\r\n >\r\n <PhoneDisabled\r\n sx={{\r\n color: \"white\",\r\n fontSize: \"16px\",\r\n fontWeight: \"600\",\r\n }}\r\n />\r\n </IconButton>\r\n )}\r\n End Conference\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function CallTransferDialog({ open, setOpen }: any) {\r\n const [transferCall] = usePostRequest<TransferCallRequest>({\r\n onSuccess: (res) => {\r\n console.log(\"res\", res);\r\n setOpen(false);\r\n },\r\n onError: (error) => {\r\n console.log(\"error\", error);\r\n },\r\n });\r\n const state = useSDKState();\r\n const [currentselecteTab, setCurrentselecteTab] = useState(\"process\");\r\n\r\n const [getIdelAgentsList, { data: idleAgentsList }] = usePostRequest<any>();\r\n\r\n const [getProcessAndQueuesList, { data: processAndQueuesList }] =\r\n usePostRequest<{\r\n status: string;\r\n active: boolean;\r\n process?: any[];\r\n queue?: any[];\r\n }>();\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const handleTransferCall = (data: any, type: string) => {\r\n console.log(data, \"data34\");\r\n if (type === \"PROCESS\") {\r\n const payload = {\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n type: \"PROCESS\",\r\n transfer_to: data?.process_name ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n processid: String(state.callData?.process_id ?? \"\"),\r\n process_name: state.callData?.process_name ?? \"\",\r\n };\r\n transferCall(END_POINT.TRANSFER_CALL, payload);\r\n } else if (type === \"QUEUE\") {\r\n const payload = {\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n type: \"QUEUE\",\r\n transfer_to: data?.queue_name ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n processid: String(state.callData?.process_id ?? \"\"),\r\n process_name: state.callData?.process_name ?? \"\",\r\n };\r\n transferCall(END_POINT.TRANSFER_CALL, payload);\r\n } else if (type === \"AGENT\") {\r\n const payload = {\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n type: \"AGENT\",\r\n transfer_to: data?.user_id ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n processid: String(state.callData?.process_id ?? \"\"),\r\n process_name: state.callData?.process_name ?? \"\",\r\n };\r\n transferCall(END_POINT.TRANSFER_CALL, payload);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n getIdelAgentsList(END_POINT.AGENTS_LIST, {\r\n status: \"IDLE\",\r\n active: true,\r\n });\r\n getProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n status: \"ACTIVE\",\r\n active: true,\r\n });\r\n }, []);\r\n\r\n console.log(idleAgentsList, \"idleAgentsList\");\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"md\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\"> Call Transfer</Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px 10px\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n }}\r\n >\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n <Button\r\n variant={\r\n currentselecteTab === \"process\" ? \"contained\" : \"outlined\"\r\n }\r\n onClick={() => setCurrentselecteTab(\"process\")}\r\n >\r\n Process\r\n </Button>\r\n <Button\r\n variant={\r\n currentselecteTab === \"queues\" ? \"contained\" : \"outlined\"\r\n }\r\n onClick={() => setCurrentselecteTab(\"queues\")}\r\n >\r\n Queues\r\n </Button>\r\n <Button\r\n variant={\r\n currentselecteTab === \"agents\" ? \"contained\" : \"outlined\"\r\n }\r\n onClick={() => setCurrentselecteTab(\"agents\")}\r\n >\r\n Agents\r\n </Button>\r\n </Box>\r\n {currentselecteTab === \"process\" && (\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n {processAndQueuesList?.data?.process &&\r\n processAndQueuesList?.data?.process?.length > 0 ? (\r\n processAndQueuesList?.data?.process?.map(\r\n (process: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {process.process_name}\r\n </Typography>\r\n\r\n <IconButton\r\n color=\"success\"\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleTransferCall(process, \"PROCESS\");\r\n }}\r\n >\r\n <Call />\r\n </IconButton>\r\n </Box>\r\n )\r\n )\r\n ) : (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n margin: \"10px 0px\",\r\n color: \"gray\",\r\n }}\r\n >\r\n No Process Found\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n {currentselecteTab === \"queues\" && (\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n {processAndQueuesList?.data?.queue &&\r\n processAndQueuesList?.data?.queue?.length > 0 ? (\r\n processAndQueuesList?.data?.queue?.map(\r\n (queue: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {queue.queue_name}\r\n {processAndQueuesList?.data?.process?.find(\r\n (process: any) =>\r\n process.process_id === queue.process_id\r\n )?.process_name ? (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n color: \"gray\",\r\n }}\r\n >\r\n {\"(\" +\r\n processAndQueuesList?.data?.process?.find(\r\n (process: any) =>\r\n process.process_id === queue.process_id\r\n )?.process_name +\r\n \")\"}\r\n </Typography>\r\n ) : (\r\n \"\"\r\n )}\r\n </Typography>\r\n\r\n <IconButton\r\n color=\"success\"\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleTransferCall(queue, \"QUEUE\");\r\n }}\r\n >\r\n <Call />\r\n </IconButton>\r\n </Box>\r\n )\r\n )\r\n ) : (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n margin: \"10px 0px\",\r\n color: \"gray\",\r\n }}\r\n >\r\n No Queues Found\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n {currentselecteTab === \"agents\" && (\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n {idleAgentsList?.data && idleAgentsList?.data?.length > 0 ? (\r\n idleAgentsList?.data?.map((agent: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {agent.name}\r\n </Typography>\r\n\r\n <IconButton\r\n color=\"success\"\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleTransferCall(agent, \"AGENT\");\r\n }}\r\n >\r\n <Call />\r\n </IconButton>\r\n </Box>\r\n ))\r\n ) : (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n margin: \"10px 0px\",\r\n color: \"gray\",\r\n }}\r\n >\r\n No Agents Found\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function EndCallDispositionDialog({\r\n open,\r\n setOpen,\r\n onSubmitDisposition,\r\n}: any) {\r\n const [formData, setFormData] = useState({\r\n disposition: { label: \"Resolved\", value: \"RES\" },\r\n followUp: { label: \"No\", value: \"N\" },\r\n callbackDate: \"\",\r\n callbackHrs: \"\",\r\n callbackMins: \"\",\r\n });\r\n\r\n const dispositionOptions = [\r\n { label: \"Not Interested\", value: \"NI\" },\r\n { label: \"Resolved\", value: \"RES\" },\r\n ];\r\n\r\n const followUpOptions = [\r\n { label: \"Yes\", value: \"Y\" },\r\n { label: \"No\", value: \"N\" },\r\n ];\r\n const handleChange = (\r\n field: keyof typeof formData,\r\n value: { label: string } | null | string\r\n ) => {\r\n setFormData((prev) => ({ ...prev, [field]: value }));\r\n };\r\n\r\n const handleReset = () => {\r\n setFormData({\r\n disposition: { label: \"Resolved\", value: \"RES\" },\r\n followUp: { label: \"No\", value: \"N\" },\r\n callbackDate: \"\",\r\n callbackHrs: \"\",\r\n callbackMins: \"\",\r\n });\r\n };\r\n const handleClose = () => {\r\n handleReset();\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"xs\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\" m={1}>\r\n {\" \"}\r\n Call Disposition\r\n </Typography>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"10px\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n }}\r\n >\r\n <Grid container spacing={2}>\r\n {/* Disposition */}\r\n <Grid size={6}>\r\n <Autocomplete\r\n value={formData.disposition}\r\n options={dispositionOptions}\r\n getOptionLabel={(opt) => opt.label}\r\n onChange={(_, val) => handleChange(\"disposition\", val)}\r\n size=\"small\"\r\n renderInput={(params) => (\r\n <TextField {...params} label=\"Disposition\" fullWidth />\r\n )}\r\n />\r\n </Grid>\r\n\r\n <Grid size={6}>\r\n <Autocomplete\r\n options={followUpOptions}\r\n getOptionLabel={(opt) => opt.label}\r\n value={formData.followUp}\r\n onChange={(_, val) => handleChange(\"followUp\", val)}\r\n size=\"small\"\r\n renderInput={(params) => (\r\n <TextField {...params} label=\"Follow Up\" fullWidth />\r\n )}\r\n />\r\n </Grid>\r\n\r\n {/* Callback Date + Time */}\r\n {formData?.followUp?.label?.toLowerCase() === \"yes\" && (\r\n <>\r\n <Grid size={6}>\r\n <TextField\r\n size=\"small\"\r\n label=\"Callback Date\"\r\n type=\"date\"\r\n slotProps={{\r\n inputLabel: { shrink: true },\r\n }}\r\n value={formData.callbackDate}\r\n onChange={(e) =>\r\n handleChange(\"callbackDate\", e.target.value)\r\n }\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid size={6}>\r\n <TextField\r\n size=\"small\"\r\n label=\"Hours (0-23)\"\r\n type=\"text\"\r\n inputProps={{ min: 0, max: 23 }}\r\n value={formData.callbackHrs}\r\n onChange={(e) =>\r\n handleChange(\"callbackHrs\", e.target.value)\r\n }\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid size={6}>\r\n <TextField\r\n size=\"small\"\r\n label=\"Minutes (0-59)\"\r\n type=\"text\"\r\n inputProps={{ min: 0, max: 59 }}\r\n value={formData.callbackMins}\r\n onChange={(e) =>\r\n handleChange(\"callbackMins\", e.target.value)\r\n }\r\n fullWidth\r\n />\r\n </Grid>\r\n </>\r\n )}\r\n </Grid>\r\n </Box>\r\n\r\n <Box textAlign=\"right\" m={2}>\r\n <Button\r\n variant=\"outlined\"\r\n color=\"error\"\r\n size=\"large\"\r\n onClick={handleClose}\r\n sx={{\r\n px: 2,\r\n mx: 1,\r\n borderRadius: \"10px\",\r\n textTransform: \"capitalize\",\r\n }}\r\n >\r\n cancel\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n size=\"large\"\r\n onClick={() => onSubmitDisposition(formData)}\r\n sx={{ px: 2, borderRadius: \"10px\", textTransform: \"capitalize\" }}\r\n >\r\n Submit\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function ProcessorListDialog({\r\n open,\r\n setOpen,\r\n processList = null,\r\n handleSelectedProcessor,\r\n}: any) {\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n maxWidth={\"xs\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\"> Process List</Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px 10px\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n }}\r\n >\r\n {processList?.processes?.length > 0\r\n ? processList?.processes?.map((process: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n cursor: \"pointer\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleSelectedProcessor(process);\r\n }}\r\n >\r\n {/* Status */}\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {process.process_name}\r\n </Typography>\r\n </Box>\r\n ))\r\n : null}\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function CallHistoryDialog({ open, setOpen }: any) {\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"md\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\"> Call History</Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n textAlign: \"center\",\r\n fontSize: \"16px\",\r\n fontWeight: \"bold\",\r\n }}\r\n p={6}\r\n >\r\n Coming Soon...\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\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","import { ReactNode } from \"react\";\r\nimport { ToastProvider } from \"../services/toastMessage\";\r\n\r\nexport const SDKProvider = ({ children }: { children: ReactNode }) => {\r\n return <ToastProvider>{children}</ToastProvider>;\r\n};\r\n","import type { CallControlPanelProps } from \"../../types\";\r\n\r\nimport { CallControls } from \"./callControls\";\r\nimport { SDKProvider } from \"./SDKProvider\";\r\n\r\nexport function CallControlPanel({ onDataChange }: CallControlPanelProps) {\r\n return (\r\n <SDKProvider>\r\n <CallControls onDataChange={onDataChange} />\r\n </SDKProvider>\r\n );\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","CallControlPanel","initSDK","useEndCall","useLogout_default","__toCommonJS","EventTrackerSDK","__publicField","config","__spreadValues","ticket","response","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","SDKStateManager","__publicField","stored","parsedState","__spreadProps","__spreadValues","error","persistentState","listener","apiKey","agentId","sdkConfig","index","isHolding","isMuted","status","process","position","data","line","_a","conferenceLineData","each","sdkStateManager","import_react","IP","BASE_URL","WS_BASE_URL","VERSION","END_POINT","WS_END_POINT","import_axios","token","axiosInstance","axios","BASE_URL","config","error","response","_a","originalRequest","axios_default","useLogout","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","state","payload","axios_default","END_POINT","res","sdkStateManager","err","useLogout_default","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_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","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","open","setOpen","conferenceCallEndAll","setConferenceCallEndAll","handleClose","onEndAllConferenceCalls","obj","CallTransferDialog","_f","_g","_h","_i","_j","_k","_l","transferCall","usePostRequest","error","currentselecteTab","setCurrentselecteTab","getIdelAgentsList","idleAgentsList","getProcessAndQueuesList","processAndQueuesList","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","onSubmitDisposition","formData","setFormData","dispositionOptions","followUpOptions","handleChange","field","value","prev","handleReset","opt","_","val","params","ProcessorListDialog","processList","handleSelectedProcessor","CallHistoryDialog","import_jsx_runtime","CallControls","onDataChange","_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","_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","theme","state","useSDKState","disabled","enabled","outlined","styles_default","webSocketRef","anchorEl","setAnchorEl","showIframe","setShowIframe","statusAnchorEl","setStatusAnchorEl","dialerAnchorEl","setDialerAnchorEl","open","setOpen","openCallTransfer","setOpenCallTransfer","openCallDisposition","setOpenCallDisposition","openProcessorDialog","setOpenProcessorDialog","openCallHistoryDialog","setOpenCallHistoryDialog","phoneNumber","setPhoneNumber","callDuration","setCallDuration","position","isDragging","dragRef","handleMouseDown","handleTouchStart","useDraggable","newPosition","sdkStateManager","iframePosition","iframeIsDragging","iframeDragRef","iframeHandleMouseDown","iframeHandleTouchStart","getProcessList","processList","usePostRequest","res","clickToCall","clickToCallLoading","holdOrUnHold","holdOrUnHoldLoading","error","muteOrUnMute","muteOrUnMuteLoading","readyAgentStatus","agentReadyLoading","updateAgentStatus","isLoading","endCall","endCallLoading","formatDuration","seconds","mins","secs","handleCloseQueueCounts","handleOpenDialer","event","handleCloseDialer","handleOpenAgentStatus","handleCloseAgentStatus","handleAgentReady","payload","END_POINT","handleUpdateAgentStatus","status","handleStartCall","number","handleHoldToggle","handleMuteToggle","handleEndCall","data","interval","elapsed","WS_END_POINT","e","ProcessorListDialog","__spreadValues","__spreadProps","IP","ConferenceDialog","CallTransferDialog","EndCallDispositionDialog","CallHistoryDialog","import_jsx_runtime","SDKProvider","children","ToastProvider","import_jsx_runtime","CallControlPanel","onDataChange","SDKProvider","CallControls","initSDK","apiKey","tenantId","agentId","sdkConfig","eventTracker","BASE_URL","res","sdkStateManager"]}
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/index.ts","../call-control-sdk/lib/hooks/eventsTracker.ts","../call-control-sdk/lib/hooks/sdk-state.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/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","../call-control-sdk/lib/components/callControlPanel.tsx"],"sourcesContent":["import { 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\nexport { CallControlPanel } from \"./lib/components/callControlPanel\";\r\n\r\nexport type { CallControlPanelProps, CallData, CallStatus } from \"./types\";\r\n\r\n/**\r\n * Initialize the Call Control SDK with an API key\r\n * @param sdkApiKey - The API key for SDK authentication\r\n * @throws {Error} When API key is missing or invalid\r\n */\r\n\r\ntype intiSDKParams = {\r\n apiKey: string;\r\n tenantId: string;\r\n agentId: string;\r\n sdkConfig?: SDKConfig;\r\n};\r\nexport function initSDK({\r\n apiKey,\r\n tenantId,\r\n agentId,\r\n sdkConfig,\r\n}: intiSDKParams): void {\r\n eventTracker\r\n .init({\r\n apiKey: apiKey,\r\n tenantId: tenantId,\r\n agentId: agentId,\r\n baseUrl: BASE_URL,\r\n })\r\n .then((res) => {\r\n if (res) {\r\n sdkStateManager.initialize(apiKey, agentId, sdkConfig);\r\n console.log(\"SDK initialized successfully\");\r\n } else {\r\n console.log(\"SDK initialization failed\");\r\n }\r\n });\r\n}\r\n\r\nexport { useLogout, useEndCall };\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\nexport interface EventTrackerConfig {\r\n apiKey: string;\r\n tenantId: string;\r\n agentId: string;\r\n sessionId?: string;\r\n baseUrl?: string;\r\n autoTrack?:\r\n | boolean\r\n | {\r\n pageVisits?: boolean;\r\n clicks?: boolean;\r\n forms?: boolean;\r\n inputs?: boolean;\r\n scrolling?: boolean;\r\n performance?: boolean;\r\n errors?: boolean;\r\n visibility?: boolean;\r\n };\r\n retryAttempts?: number;\r\n queueSize?: number;\r\n flushInterval?: number;\r\n}\r\n\r\nexport interface EventData {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface EventTrackerInstance {\r\n init(config: EventTrackerConfig): Promise<string | null>;\r\n logEvent(eventType: string, eventData?: EventData): Promise<void>;\r\n closeTicket(): Promise<void>;\r\n isInitialized(): boolean;\r\n getConfig(): EventTrackerConfig | null;\r\n getTicketId(): string | null;\r\n flush(): Promise<void>;\r\n}\r\n\r\nclass EventTrackerSDK implements EventTrackerInstance {\r\n private config: EventTrackerConfig | null = null;\r\n private ticketId: string | null = null;\r\n private baseUrl: string = \"\";\r\n private eventQueue: Array<{\r\n eventType: string;\r\n eventData?: EventData;\r\n timestamp: number;\r\n }> = [];\r\n private isOnline: boolean = true;\r\n private retryQueue: Array<() => Promise<void>> = [];\r\n private flushTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n /**\r\n * Initialize the EventTracker SDK\r\n * @param config Configuration object\r\n */\r\n async init(config: EventTrackerConfig): Promise<string | null> {\r\n this.config = {\r\n autoTrack: true,\r\n retryAttempts: 3,\r\n queueSize: 100,\r\n flushInterval: 5000,\r\n ...config,\r\n };\r\n\r\n this.baseUrl =\r\n config.baseUrl ||\r\n (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n // Set up online/offline detection\r\n this.setupNetworkDetection();\r\n\r\n // Create ticket and set up auto-tracking\r\n const ticket = await this.createTicket();\r\n\r\n // Start periodic flush\r\n this.startPeriodicFlush();\r\n\r\n console.log(\"EventTracker SDK initialized successfully\");\r\n return ticket;\r\n }\r\n\r\n /**\r\n * Check if the SDK is initialized\r\n */\r\n isInitialized(): boolean {\r\n return this.config !== null && this.ticketId !== null;\r\n }\r\n\r\n /**\r\n * Get the current configuration\r\n */\r\n getConfig(): EventTrackerConfig | null {\r\n return this.config;\r\n }\r\n\r\n /**\r\n * Get the current ticket ID\r\n */\r\n getTicketId(): string | null {\r\n return this.ticketId;\r\n }\r\n\r\n /**\r\n * Create a new ticket\r\n */\r\n private async createTicket(): Promise<string | null> {\r\n if (!this.config) {\r\n throw new Error(\"EventTracker not initialized\");\r\n }\r\n\r\n try {\r\n const response = await this.makeRequest(\"/api/v1/et/init\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n agentId: this.config.agentId,\r\n sessionId: this.config.sessionId,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to initialize: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n const data = await response.json();\r\n this.ticketId = data.ticketId;\r\n\r\n // Set up auto-tracking if enabled\r\n if (this.config.autoTrack) {\r\n this.setupAutoTracking();\r\n }\r\n return this.ticketId;\r\n } catch (error) {\r\n console.error(\"EventTracker initialization failed:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Log an event\r\n * @param eventType The type of event\r\n * @param eventData Optional event data\r\n */\r\n async logEvent(eventType: string, eventData?: EventData): Promise<void> {\r\n if (!this.config || !this.ticketId) {\r\n console.warn(\"EventTracker not initialized, skipping event:\", eventType);\r\n return;\r\n }\r\n\r\n const event = {\r\n eventType,\r\n eventData,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // Add to queue for offline support\r\n this.eventQueue.push(event);\r\n\r\n // Trim queue if too large\r\n if (this.eventQueue.length > (this.config.queueSize || 100)) {\r\n this.eventQueue.shift();\r\n }\r\n\r\n // Try to send immediately if online\r\n if (this.isOnline) {\r\n try {\r\n await this.sendEvent(event);\r\n } catch (error) {\r\n console.warn(\"Failed to send event, will retry later:\", error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Send an event to the server\r\n */\r\n private async sendEvent(event: {\r\n eventType: string;\r\n eventData?: EventData;\r\n timestamp: number;\r\n }): Promise<void> {\r\n if (!this.config || !this.ticketId) return;\r\n\r\n try {\r\n const response = await this.makeRequest(\"/api/v1/et/event\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n ticketId: this.ticketId,\r\n eventType: event.eventType,\r\n eventData: event.eventData,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to log event: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n // Remove from queue if successful\r\n const index = this.eventQueue.findIndex(\r\n (e) => e.timestamp === event.timestamp\r\n );\r\n if (index > -1) {\r\n this.eventQueue.splice(index, 1);\r\n }\r\n } catch (error) {\r\n console.error(\"Event logging failed:\", error);\r\n\r\n // Add to retry queue\r\n this.retryQueue.push(() => this.sendEvent(event));\r\n }\r\n }\r\n\r\n /**\r\n * Close the current ticket\r\n */\r\n async closeTicket(): Promise<void> {\r\n if (!this.config || !this.ticketId) {\r\n throw new Error(\"EventTracker not initialized\");\r\n }\r\n\r\n // Flush any pending events\r\n await this.flush();\r\n\r\n try {\r\n const response = await this.makeRequest(\"/api/v1/et/close\", {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-API-Key\": this.config.apiKey,\r\n },\r\n body: JSON.stringify({\r\n ticketId: this.ticketId,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to close ticket: ${response.status} ${response.statusText}`\r\n );\r\n }\r\n\r\n this.ticketId = null;\r\n this.stopPeriodicFlush();\r\n\r\n console.log(\"Ticket closed successfully\");\r\n } catch (error) {\r\n console.error(\"Ticket close failed:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Flush all pending events\r\n */\r\n async flush(): Promise<void> {\r\n if (!this.isOnline || this.eventQueue.length === 0) return;\r\n\r\n const eventsToFlush = [...this.eventQueue];\r\n\r\n for (const event of eventsToFlush) {\r\n await this.sendEvent(event);\r\n }\r\n\r\n // Process retry queue\r\n const retryItems = [...this.retryQueue];\r\n this.retryQueue = [];\r\n\r\n for (const retryFn of retryItems) {\r\n try {\r\n await retryFn();\r\n } catch (error) {\r\n console.error(\"Retry failed:\", error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Make an HTTP request with retry logic\r\n */\r\n private async makeRequest(\r\n url: string,\r\n options: RequestInit\r\n ): Promise<Response> {\r\n const fullUrl = `${this.baseUrl}${url}`;\r\n const maxRetries = this.config?.retryAttempts || 3;\r\n\r\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\r\n try {\r\n const response = await fetch(fullUrl, options);\r\n return response;\r\n } catch (error) {\r\n if (attempt === maxRetries) {\r\n throw error;\r\n }\r\n\r\n // Exponential backoff\r\n const delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\r\n await new Promise((resolve) => setTimeout(resolve, delay));\r\n }\r\n }\r\n\r\n throw new Error(\"Max retries exceeded\");\r\n }\r\n\r\n /**\r\n * Set up automatic event tracking\r\n */\r\n private setupAutoTracking(): void {\r\n if (typeof window === \"undefined\" || !this.config?.autoTrack) return;\r\n\r\n const autoTrackConfig =\r\n this.config.autoTrack === true ? {} : this.config.autoTrack;\r\n\r\n // Track page visits\r\n if (autoTrackConfig.pageVisits !== false) {\r\n this.logEvent(\"pageVisit\", {\r\n url: window.location.href,\r\n title: document.title,\r\n referrer: document.referrer,\r\n userAgent: navigator.userAgent,\r\n viewport: {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) => console.warn(\"Failed to track page visit:\", error));\r\n }\r\n\r\n // Track clicks on any clickable element\r\n if (autoTrackConfig.clicks !== false) {\r\n document.addEventListener(\"click\", (event) => {\r\n const target = event.target as HTMLElement | HTMLButtonElement;\r\n\r\n // Track all clickable elements\r\n if (\r\n target.tagName === \"BUTTON\" ||\r\n target.tagName === \"A\" ||\r\n target.onclick ||\r\n target.getAttribute(\"role\") === \"button\" ||\r\n (target instanceof HTMLButtonElement && target.type === \"button\")\r\n ) {\r\n this.logEvent(\"click\", {\r\n element: target.tagName,\r\n text: target.textContent?.trim().substring(0, 100), // Limit text length\r\n href: target.getAttribute(\"href\"),\r\n id: target.id,\r\n className: target.className,\r\n role: target.getAttribute(\"role\"),\r\n position: {\r\n x: event.clientX,\r\n y: event.clientY,\r\n },\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) => console.warn(\"Failed to track click:\", error));\r\n }\r\n });\r\n }\r\n\r\n // Track form submissions\r\n if (autoTrackConfig.forms !== false) {\r\n document.addEventListener(\"submit\", (event) => {\r\n const target = event.target as HTMLFormElement;\r\n const formData = new FormData(target);\r\n const formFields: Record<string, string> = {};\r\n\r\n // Convert FormData to plain object\r\n formData.forEach((value, key) => {\r\n formFields[key] = value.toString();\r\n });\r\n\r\n this.logEvent(\"formSubmission\", {\r\n formId: target.id,\r\n action: target.action,\r\n method: target.method,\r\n fields: Object.keys(formFields),\r\n fieldCount: Object.keys(formFields).length,\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) =>\r\n console.warn(\"Failed to track form submission:\", error)\r\n );\r\n });\r\n }\r\n\r\n // Track input changes (debounced)\r\n if (autoTrackConfig.inputs !== false) {\r\n let inputTimer: ReturnType<typeof setInterval>;\r\n document.addEventListener(\"input\", (event) => {\r\n const target = event.target as HTMLInputElement;\r\n if (\r\n target.tagName === \"INPUT\" ||\r\n target.tagName === \"TEXTAREA\" ||\r\n target.tagName === \"SELECT\"\r\n ) {\r\n clearTimeout(inputTimer);\r\n inputTimer = setTimeout(() => {\r\n this.logEvent(\"fieldChange\", {\r\n element: target.tagName,\r\n type: target.getAttribute(\"type\"),\r\n name: target.getAttribute(\"name\"),\r\n id: target.id,\r\n valueLength: target.value?.length || 0,\r\n timestamp: new Date().toISOString(),\r\n }).catch((error) =>\r\n console.warn(\"Failed to track field change:\", error)\r\n );\r\n }, 1000); // Debounce for 1 second\r\n }\r\n });\r\n }\r\n\r\n // Track page unload and session duration\r\n const sessionStartTime = Date.now();\r\n window.addEventListener(\"beforeunload\", () => {\r\n const sessionDuration = Date.now() - sessionStartTime;\r\n\r\n this.logEvent(\"pageUnload\", {\r\n url: window.location.href,\r\n sessionDuration: sessionDuration,\r\n timestamp: new Date().toISOString(),\r\n });\r\n\r\n // Close ticket synchronously\r\n if (this.ticketId) {\r\n navigator.sendBeacon(\r\n `${this.baseUrl}/api/v1/et/close`,\r\n JSON.stringify({\r\n ticketId: this.ticketId,\r\n })\r\n );\r\n }\r\n });\r\n\r\n // Track visibility changes\r\n if (autoTrackConfig.visibility !== false) {\r\n document.addEventListener(\"visibilitychange\", () => {\r\n this.logEvent(\"visibilityChange\", {\r\n hidden: document.hidden,\r\n visibilityState: document.visibilityState,\r\n timestamp: new Date().toISOString(),\r\n });\r\n });\r\n }\r\n\r\n // Track errors\r\n if (autoTrackConfig.errors !== false) {\r\n window.addEventListener(\"error\", (event) => {\r\n this.logEvent(\"jsError\", {\r\n message: event.message,\r\n filename: event.filename,\r\n lineno: event.lineno,\r\n colno: event.colno,\r\n timestamp: new Date().toISOString(),\r\n });\r\n });\r\n\r\n // Track unhandled promise rejections\r\n window.addEventListener(\"unhandledrejection\", (event) => {\r\n this.logEvent(\"unhandledRejection\", {\r\n reason: event.reason?.toString(),\r\n timestamp: new Date().toISOString(),\r\n });\r\n });\r\n }\r\n\r\n // Track performance metrics (if available)\r\n if (\r\n autoTrackConfig.performance !== false &&\r\n typeof window.performance !== \"undefined\" &&\r\n window.performance.navigation\r\n ) {\r\n window.addEventListener(\"load\", () => {\r\n setTimeout(() => {\r\n const navigation = window.performance.navigation;\r\n const timing = window.performance.timing;\r\n\r\n this.logEvent(\"performanceMetrics\", {\r\n navigationTime: timing.navigationStart,\r\n loadTime: timing.loadEventEnd - timing.navigationStart,\r\n domReady: timing.domContentLoadedEventEnd - timing.navigationStart,\r\n renderTime: timing.loadEventEnd - timing.domContentLoadedEventEnd,\r\n navigationType: navigation.type,\r\n redirectCount: navigation.redirectCount,\r\n timestamp: new Date().toISOString(),\r\n });\r\n }, 1000);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set up network detection\r\n */\r\n private setupNetworkDetection(): void {\r\n if (typeof window === \"undefined\") return;\r\n\r\n this.isOnline = navigator.onLine;\r\n\r\n window.addEventListener(\"online\", () => {\r\n this.isOnline = true;\r\n console.log(\"EventTracker: Back online, flushing queued events\");\r\n this.flush();\r\n });\r\n\r\n window.addEventListener(\"offline\", () => {\r\n this.isOnline = false;\r\n console.log(\"EventTracker: Offline, queueing events\");\r\n });\r\n }\r\n\r\n /**\r\n * Start periodic flush timer\r\n */\r\n private startPeriodicFlush(): void {\r\n if (this.flushTimer) {\r\n clearInterval(this.flushTimer);\r\n }\r\n\r\n const interval = this.config?.flushInterval || 5000;\r\n this.flushTimer = setInterval(() => {\r\n this.flush();\r\n }, interval);\r\n }\r\n\r\n /**\r\n * Stop periodic flush timer\r\n */\r\n private stopPeriodicFlush(): void {\r\n if (this.flushTimer) {\r\n clearInterval(this.flushTimer);\r\n this.flushTimer = null;\r\n }\r\n }\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 (window as any).EventTracker = eventTracker;\r\n}\r\n","import type {\r\n SDKState,\r\n CallData,\r\n CallStatus,\r\n ConferenceLineTypes,\r\n SDKConfig,\r\n} from \"../../types\";\r\n\r\nclass SDKStateManager {\r\n private state: SDKState;\r\n private listeners: Array<() => void> = [];\r\n private readonly STORAGE_KEY = \"call-control-sdk-state\";\r\n\r\n constructor() {\r\n this.state = this.getInitialState();\r\n this.loadFromStorage();\r\n }\r\n\r\n private getInitialState(): SDKState {\r\n return {\r\n apiKey: null,\r\n process: null,\r\n agentId: \"\",\r\n isInitialized: false,\r\n sdkConfig: {\r\n showEndCallButton: true,\r\n showTransferButton: true,\r\n showConferenceButton: true,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n },\r\n isHolding: false,\r\n isMuted: false,\r\n status: \"idle\",\r\n callStartTime: null,\r\n controlPanelPosition: { x: 10, y: 10 },\r\n iframePosition: { x: 10, y: 80 },\r\n callData: {\r\n agent_id: \"\",\r\n status: \"\",\r\n type: \"\",\r\n event_time: \"\",\r\n phone_number: \"\",\r\n },\r\n conferenceLine: [\r\n {\r\n line: 1,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 2,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 3,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 4,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 5,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n private loadFromStorage(): void {\r\n try {\r\n const stored = localStorage.getItem(this.STORAGE_KEY);\r\n if (stored) {\r\n const parsedState = JSON.parse(stored);\r\n // Only restore persistent data, not initialization state\r\n this.state = {\r\n ...this.state,\r\n apiKey: parsedState.apiKey || \"\",\r\n agentId: parsedState.agentId || \"\",\r\n process: parsedState.process || null,\r\n isInitialized: parsedState.isInitialized || false,\r\n sdkConfig: parsedState.sdkConfig || {\r\n showEndCallButton: true,\r\n showTransferButton: true,\r\n showConferenceButton: true,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n },\r\n isHolding: parsedState.isHolding || false,\r\n isMuted: parsedState.isMuted || false,\r\n status: parsedState.status || \"idle\",\r\n callStartTime: parsedState.callStartTime || null,\r\n controlPanelPosition: parsedState.controlPanelPosition || {\r\n x: 10,\r\n y: 10,\r\n },\r\n iframePosition: parsedState.iframePosition || { x: 10, y: 80 },\r\n callData: parsedState.callData || {\r\n mobileNumber: \"\",\r\n callReferenceId: \"\",\r\n agent_id: \"\",\r\n status: \"\",\r\n type: \"\",\r\n event_time: \"\",\r\n phone_number: \"\",\r\n },\r\n // Fix: Properly handle conferenceLine with fallback to initial state\r\n conferenceLine:\r\n parsedState.conferenceLine &&\r\n Array.isArray(parsedState.conferenceLine) &&\r\n parsedState.conferenceLine.length > 0\r\n ? parsedState.conferenceLine\r\n : this.state.conferenceLine,\r\n };\r\n }\r\n } catch (error) {\r\n console.warn(\"Failed to load SDK state from localStorage:\", error);\r\n // If loading fails, keep the initial state\r\n }\r\n }\r\n\r\n private saveToStorage(): void {\r\n try {\r\n const persistentState = {\r\n apiKey: this.state.apiKey,\r\n agentId: this.state.agentId,\r\n process: this.state.process,\r\n isInitialized: this.state.isInitialized,\r\n sdkConfig: this.state.sdkConfig,\r\n isHolding: this.state.isHolding,\r\n isMuted: this.state.isMuted,\r\n status: this.state.status,\r\n callStartTime: this.state.callStartTime,\r\n controlPanelPosition: this.state.controlPanelPosition,\r\n iframePosition: this.state.iframePosition,\r\n callData: this.state.callData,\r\n conferenceLine: this.state.conferenceLine,\r\n };\r\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(persistentState));\r\n } catch (error) {\r\n console.warn(\"Failed to save SDK state to localStorage:\", error);\r\n }\r\n }\r\n\r\n private notifyListeners(): void {\r\n this.listeners.forEach((listener) => listener());\r\n }\r\n\r\n public initialize(\r\n apiKey: string,\r\n agentId: string,\r\n sdkConfig?: SDKConfig\r\n ): void {\r\n if (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n throw new Error(\"API key not available\");\r\n }\r\n\r\n this.state.apiKey = apiKey;\r\n this.state.agentId = agentId;\r\n this.state.sdkConfig = {\r\n showEndCallButton: true,\r\n showTransferButton: true,\r\n showConferenceButton: true,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n ...sdkConfig,\r\n };\r\n this.state.isInitialized = true;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public getState(): SDKState {\r\n return { ...this.state };\r\n }\r\n\r\n public subscribe(listener: () => void): () => void {\r\n this.listeners.push(listener);\r\n return () => {\r\n const index = this.listeners.indexOf(listener);\r\n if (index > -1) {\r\n this.listeners.splice(index, 1);\r\n }\r\n };\r\n }\r\n\r\n public setHolding(isHolding: boolean): void {\r\n this.state.isHolding = isHolding;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setMuted(isMuted: boolean): void {\r\n this.state.isMuted = isMuted;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setStatus(status: CallStatus): void {\r\n this.state.status = status;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setProcess(process: {\r\n process_id: number;\r\n process_name: string;\r\n }): void {\r\n this.state.process = process;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setControlPanelPosition(position: { x: number; y: number }): void {\r\n this.state.controlPanelPosition = position;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setIframePosition(position: { x: number; y: number }): void {\r\n this.state.iframePosition = position;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public startCall(): void {\r\n this.state.callStartTime = Date.now();\r\n this.state.status = \"on call\";\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public endCall(): void {\r\n this.state.callStartTime = null;\r\n this.state.status = \"idle\";\r\n this.state.isHolding = false;\r\n this.state.isMuted = false;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public updateCallData(data: Partial<CallData>): void {\r\n this.state.callData = { ...this.state.callData, ...data };\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setConferenceLine(line: ConferenceLineTypes): void {\r\n // Fix: Check if conferenceLine is corrupted and reset if needed\r\n if (\r\n !this.state.conferenceLine ||\r\n !Array.isArray(this.state.conferenceLine)\r\n ) {\r\n console.warn(\r\n \"Conference line data corrupted, resetting to initial state\"\r\n );\r\n this.state.conferenceLine = this.getInitialState().conferenceLine;\r\n }\r\n\r\n const conferenceLineData = this.state.conferenceLine?.map(\r\n (each: ConferenceLineTypes) => {\r\n if (each.line === line.line) {\r\n return line;\r\n }\r\n return each;\r\n }\r\n );\r\n this.state.conferenceLine = conferenceLineData;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public resetConferenceLines(): void {\r\n this.state.conferenceLine = this.getInitialState().conferenceLine;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public clearStorageAndReset(): void {\r\n try {\r\n localStorage.removeItem(this.STORAGE_KEY);\r\n this.state = this.getInitialState();\r\n this.notifyListeners();\r\n } catch (error) {\r\n console.warn(\"Failed to clear localStorage:\", error);\r\n }\r\n }\r\n\r\n // Debug methods\r\n public debugStorage(): void {\r\n try {\r\n const stored = localStorage.getItem(this.STORAGE_KEY);\r\n console.log(\"Current localStorage data:\", stored);\r\n if (stored) {\r\n console.log(\"Parsed localStorage data:\", JSON.parse(stored));\r\n }\r\n console.log(\"Current state:\", this.state);\r\n } catch (error) {\r\n console.error(\"Error debugging storage:\", error);\r\n }\r\n }\r\n\r\n public getConferenceLines(): ConferenceLineTypes[] {\r\n return this.state.conferenceLine || [];\r\n }\r\n}\r\n\r\n// SDK State Manager Instance\r\nexport const sdkStateManager = new SDKStateManager();\r\n","import { useCallback, useState } from \"react\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\n// Types for logout functionality\r\nexport interface LogoutPayload {\r\n action: string;\r\n userId: string;\r\n}\r\n\r\n/**\r\n * Custom hook for handling agent logout functionality\r\n * @param options - Optional callbacks for success, error, and completion\r\n * @returns Object containing logout function and loading state\r\n */\r\nconst useLogout = () => {\r\n const [loading, setLoading] = useState(false);\r\n const [success, setSuccess] = useState(false);\r\n const [isError, setIsError] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [data, setData] = useState(null);\r\n\r\n /**\r\n * Handles logout with current agent data\r\n * @param agentData - Object containing agent information\r\n */\r\n\r\n const handleLogout = useCallback(async () => {\r\n const state = JSON.parse(\r\n localStorage.getItem(\"call-control-sdk-state\") ?? \"\"\r\n );\r\n setLoading(true);\r\n const payload: LogoutPayload = {\r\n action: \"LOGOUTUSER\",\r\n userId: state.agentId || \"\",\r\n };\r\n\r\n return axiosInstance\r\n .post(END_POINT.LOGOUT, payload)\r\n .then((res) => {\r\n sdkStateManager.clearStorageAndReset();\r\n localStorage.clear();\r\n sessionStorage.clear();\r\n setData(res?.data);\r\n setSuccess(true);\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n setIsError(true);\r\n setError(err);\r\n return err?.response?.data;\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n }, []);\r\n\r\n return {\r\n logout: handleLogout,\r\n isLoading: loading,\r\n isSuccess: success,\r\n isError: isError,\r\n error: error,\r\n data: data,\r\n };\r\n};\r\n\r\nexport default useLogout;\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 v1: \"/api/v1\",\r\n};\r\n\r\nexport const END_POINT = {\r\n LOGIN: `${BASE_URL}${VERSION.v1}/cti/login?provider=convox`,\r\n READY_AGENT: `${BASE_URL}${VERSION.v1}/cti/ready-agent?provider=convox`,\r\n UPDATE_AGENT_BREAK: `${BASE_URL}${VERSION.v1}/cti/update-agent-status?provider=convox`,\r\n CLICK_TO_CALL: `${BASE_URL}${VERSION.v1}/cti/calls?provider=convox`,\r\n HOLD_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/hold?provider=convox`,\r\n MUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/mute?provider=convox`,\r\n UNMUTE_CALL: `${BASE_URL}${VERSION.v1}/cti/unmute-call?provider=convox`,\r\n END_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/end?provider=convox`,\r\n LOGOUT: `${BASE_URL}${VERSION.v1}/cti/logout?provider=convox`,\r\n\r\n CONFERENCE_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference?provider=convox`,\r\n CONFERENCE_CALL_HOLD_OR_UN_HOLD: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hold?provider=convox`,\r\n CONFERENCE_CALL_MUTE_OT_UN_MUTE: `${BASE_URL}${VERSION.v1}/cti/calls/conference/mute?provider=convox`,\r\n CONFERENCE_CALL_END: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup?provider=convox`,\r\n CONFERENCE_CALL_END_ALL: `${BASE_URL}${VERSION.v1}/cti/calls/conference/hangup/all?provider=convox`,\r\n TRANSFER_CALL: `${BASE_URL}${VERSION.v1}/cti/calls/transfer?provider=convox`,\r\n\r\n AGENTS_LIST: `${BASE_URL}${VERSION.v1}/cti/users`,\r\n PROCESS_LIST: `${BASE_URL}${VERSION.v1}/cti/processes-list`,\r\n TRANSFER_TO_DETAILS: `${BASE_URL}${VERSION.v1}/cti/transfer-to-details?provider=convox`,\r\n\r\n CALL_HISTORY: `${BASE_URL}${VERSION.v1}/dashboard/call-history`,\r\n SENTIMENTAL_ANALYSIS: `${BASE_URL}${VERSION.v1}/users/get_sentiment_analysis`,\r\n};\r\n\r\nexport const WS_END_POINT = {\r\n WS: `${WS_BASE_URL}${VERSION.v1}/cti/ws`,\r\n};\r\n","import axios from \"axios\"; // Axios HTTP client for API communication\r\nimport { BASE_URL } from \"./endPoint\";\r\n\r\n/**\r\n * @here Reads the stored authentication token.\r\n * @description Used to set the initial Authorization header for the axios instance.\r\n */\r\nconst token = \"12345\";\r\n\r\n/**\r\n * @here Creates a configured Axios instance.\r\n * @description Sets base URL, headers, and timeout for all outgoing HTTP requests.\r\n */\r\n\r\n/**\r\n * @author Achala IT Solutions\r\n * @here Declares an Axios HTTP client instance with global configuration.\r\n * @description Configures default headers, timeout, and interceptors for handling request/response behavior globally.\r\n * @params\r\n * - None (but uses token from local storage)\r\n * @example\r\n * import axiosInstance from \"@/lib/axios\";\r\n * axiosInstance.get(\"/endpoint\").then(...).catch(...);\r\n * @returns A customized Axios instance with built-in interceptors and token management.\r\n */\r\n\r\nconst axiosInstance = axios.create({\r\n baseURL: BASE_URL, // Base URL from Vite environment variables\r\n headers: {\r\n \"Content-Type\": \"application/json\", // Default content type for requests\r\n Authorization: token, // Attach token if available (as raw, without Bearer prefix)\r\n },\r\n timeout: 10000, // Request timeout in milliseconds (10 seconds)\r\n});\r\n\r\n/**\r\n * @here Adds a request interceptor to inject Bearer token.\r\n * @description Ensures Authorization header is up-to-date with the latest token before every request.\r\n * @params\r\n * - config: Axios request configuration object.\r\n * @returns The modified request config with updated headers.\r\n */\r\naxiosInstance.interceptors.request.use(\r\n (config) => {\r\n const token = \"12345\"; // Re-fetch token before request\r\n if (token && config.headers) {\r\n config.headers.Authorization = `Bearer ${token}`; // Set Authorization header\r\n }\r\n return config; // Proceed with modified config\r\n },\r\n /**\r\n * @here Handles request errors.\r\n * @description Converts unknown request error types into standardized JavaScript Error.\r\n */\r\n (error) =>\r\n Promise.reject(error instanceof Error ? error : new Error(String(error)))\r\n);\r\n\r\n/**\r\n * @here Adds a response interceptor to handle error responses.\r\n * @description Captures 401 Unauthorized errors and optionally retries the request.\r\n * @params\r\n * - error: Axios response error object.\r\n * @returns The original error or a retry attempt if applicable.\r\n */\r\naxiosInstance.interceptors.response.use(\r\n (response) => response, // Pass through successful response\r\n async (error) => {\r\n const originalRequest = error.config;\r\n\r\n // Retry logic for unauthorized requests (once only)\r\n if (error.response?.status === 401 && !originalRequest._retry) {\r\n originalRequest._retry = true;\r\n // Optional: trigger refresh logic or logout here\r\n }\r\n\r\n // Normalize error format\r\n return Promise.reject(\r\n error instanceof Error ? error : new Error(String(error))\r\n );\r\n }\r\n);\r\n\r\n/**\r\n * @here Exports the configured Axios instance.\r\n * @description Makes the client available throughout the app via a single import.\r\n */\r\nexport default axiosInstance;\r\n","import { useCallback, useState } from \"react\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\nexport interface EndCallPayload {\r\n action: string;\r\n disposition: string;\r\n userId: string;\r\n processid: string;\r\n mobile_number: string;\r\n set_followUp: string;\r\n callback_date: string;\r\n callback_hrs: string;\r\n callback_mins: string;\r\n refno?: string;\r\n}\r\n\r\n/**\r\n * Custom hook for handling end call functionality\r\n * @param options - Optional callbacks for success, error, and completion\r\n * @returns Object containing logout function and loading state\r\n */\r\n\r\nexport const useEndCall = () => {\r\n const [loading, setLoading] = useState(false);\r\n const [success, setSuccess] = useState(false);\r\n const [isError, setIsError] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [data, setData] = useState(null);\r\n\r\n /**\r\n * Handles call end with current agent call\r\n * @param data - Object containing call disposition information\r\n */\r\n\r\n const handleEndCall = useCallback(\r\n async (data: {\r\n disposition?: string;\r\n followUp?: string;\r\n callbackDate?: string;\r\n callbackHrs?: string;\r\n callbackMins?: string;\r\n }) => {\r\n const state = JSON.parse(\r\n localStorage.getItem(\"call-control-sdk-state\") ?? \"\"\r\n );\r\n setLoading(true);\r\n const payload = {\r\n action: \"ENDCALL\",\r\n userId: state?.agentId,\r\n processid: state?.process?.process_id?.toString() ?? \"\",\r\n process_name: state?.process?.process_name ?? \"\",\r\n callreferenceid: state?.callData?.convox_id ?? \"\",\r\n mobile_number: state?.callData?.phone_number ?? \"\",\r\n\r\n disposition: data?.disposition ?? \"RES\",\r\n set_followUp: data?.followUp ?? \"N\",\r\n callback_date: data?.callbackDate ?? \"\",\r\n callback_hrs: data?.callbackHrs ?? \"\",\r\n callback_mins: data?.callbackMins ?? \"\",\r\n endcall_type: \"CLOSE\",\r\n };\r\n\r\n return axiosInstance\r\n .post(END_POINT.END_CALL, payload)\r\n .then((res) => {\r\n sdkStateManager.endCall();\r\n setData(res?.data);\r\n setSuccess(true);\r\n return res?.data;\r\n })\r\n .catch((err) => {\r\n setIsError(true);\r\n setError(err);\r\n return err?.response?.data;\r\n })\r\n .finally(() => {\r\n setLoading(false);\r\n });\r\n },\r\n []\r\n );\r\n\r\n return {\r\n handleEndCall,\r\n isLoading: loading,\r\n isSuccess: success,\r\n isError: isError,\r\n error: error,\r\n data: data,\r\n };\r\n};\r\n","import {\r\n ArrowDropDown,\r\n CallEnd,\r\n Close,\r\n DragIndicator,\r\n Group,\r\n Layers,\r\n Mic,\r\n MicOff,\r\n Pause,\r\n Pending,\r\n Phone,\r\n PlayArrow,\r\n SupportAgent,\r\n TransferWithinAStation,\r\n Upcoming,\r\n WifiCalling3,\r\n} from \"@mui/icons-material\";\r\nimport {\r\n Box,\r\n Button,\r\n Chip,\r\n CircularProgress,\r\n Fade,\r\n IconButton,\r\n Menu,\r\n MenuItem,\r\n Paper,\r\n TextField,\r\n Tooltip,\r\n Typography,\r\n useTheme,\r\n} from \"@mui/material\";\r\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\nimport type { CallControlPanelProps } from \"../../types\";\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport { useDraggable } from \"../hooks/useDraggable\";\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport { END_POINT, IP, WS_END_POINT } from \"../services/endPoint\";\r\nimport { usePostRequest } from \"../services/request\";\r\n\r\nimport {\r\n CallHistoryDialog,\r\n CallTransferDialog,\r\n ConferenceDialog,\r\n EndCallDispositionDialog,\r\n ProcessorListDialog,\r\n} from \"./dialog\";\r\nimport useStyles from \"./styles\";\r\n\r\nexport function CallControls({ onDataChange }: CallControlPanelProps) {\r\n const theme = useTheme();\r\n const state = useSDKState();\r\n const { disabled, enabled, outlined } = useStyles({\r\n disabled: state.sdkConfig?.disabled || {},\r\n enabled: state.sdkConfig?.enabled || {},\r\n outlined: state.sdkConfig?.outlined || {},\r\n });\r\n\r\n const webSocketRef = useRef<WebSocket | null>(null);\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const [showIframe, setShowIframe] = useState<boolean>(true);\r\n const [statusAnchorEl, setStatusAnchorEl] = useState<null | HTMLElement>(\r\n null\r\n );\r\n const [dialerAnchorEl, setDialerAnchorEl] = useState<null | HTMLElement>(\r\n null\r\n );\r\n const [open, setOpen] = useState(false);\r\n const [openCallTransfer, setOpenCallTransfer] = useState(false);\r\n const [openCallDisposition, setOpenCallDisposition] = useState(false);\r\n const [openProcessorDialog, setOpenProcessorDialog] = useState(false);\r\n const [openCallHistoryDialog, setOpenCallHistoryDialog] = useState(false);\r\n\r\n const [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n const [callDuration, setCallDuration] = useState(0);\r\n\r\n const { position, isDragging, dragRef, handleMouseDown, handleTouchStart } =\r\n useDraggable(state.controlPanelPosition, (newPosition) =>\r\n sdkStateManager.setControlPanelPosition(newPosition)\r\n );\r\n\r\n const {\r\n position: iframePosition,\r\n isDragging: iframeIsDragging,\r\n dragRef: iframeDragRef,\r\n handleMouseDown: iframeHandleMouseDown,\r\n handleTouchStart: iframeHandleTouchStart,\r\n } = useDraggable(state.iframePosition, (newPosition) =>\r\n sdkStateManager.setIframePosition(newPosition)\r\n );\r\n\r\n const [getProcessList, { data: processList }] = usePostRequest<any>({\r\n onSuccess: (res: any) => {\r\n console.log(\"res\", res);\r\n if (res && res.data && res?.data?.length > 1) {\r\n setOpenProcessorDialog(true);\r\n } else {\r\n sdkStateManager.setProcess(res?.data[0]);\r\n setOpenProcessorDialog(false);\r\n }\r\n },\r\n onError: () => {\r\n setOpenProcessorDialog(false);\r\n },\r\n });\r\n\r\n const [clickToCall, { isLoading: clickToCallLoading }] = usePostRequest<{\r\n action: string;\r\n phone_number: string;\r\n userId: string;\r\n }>();\r\n\r\n const [holdOrUnHold, { isLoading: holdOrUnHoldLoading }] = usePostRequest<{\r\n action: string;\r\n userId: string;\r\n refno?: string;\r\n }>({\r\n onSuccess: () => {\r\n sdkStateManager.setHolding(!state.isHolding);\r\n },\r\n onError: (error) => {\r\n console.log(\"error\", error);\r\n },\r\n });\r\n\r\n const [muteOrUnMute, { isLoading: muteOrUnMuteLoading }] = usePostRequest<{\r\n action: string;\r\n userId: string;\r\n refno?: string;\r\n }>({\r\n onSuccess: () => {\r\n sdkStateManager.setMuted(!state.isMuted);\r\n },\r\n onError: (error) => {\r\n console.log(\"error\", error);\r\n },\r\n });\r\n\r\n const [readyAgentStatus, { isLoading: agentReadyLoading }] = usePostRequest<{\r\n action: string;\r\n refno?: string;\r\n userId: string;\r\n }>();\r\n\r\n const [updateAgentStatus, { isLoading }] = usePostRequest<{\r\n action: string;\r\n break_type: string;\r\n userId: string;\r\n }>();\r\n\r\n const [endCall, { isLoading: endCallLoading }] = usePostRequest<{\r\n action: string;\r\n // convoxid: string;\r\n disposition: string;\r\n userId: string;\r\n processid: string;\r\n mobile_number: string;\r\n set_followUp: string;\r\n callback_date: string;\r\n callback_hrs: string;\r\n callback_mins: string;\r\n refno?: string;\r\n }>();\r\n\r\n const formatDuration = useCallback((seconds: number): string => {\r\n const mins = Math.floor(seconds / 60);\r\n const secs = seconds % 60;\r\n return `${mins.toString().padStart(2, \"0\")}:${secs.toString().padStart(2, \"0\")}`;\r\n }, []);\r\n\r\n const handleCloseQueueCounts = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleOpenDialer = (event: React.MouseEvent<HTMLElement>) => {\r\n setShowIframe(true);\r\n setDialerAnchorEl(event.currentTarget);\r\n sdkStateManager.setStatus(\"dial\");\r\n };\r\n\r\n const handleCloseDialer = () => {\r\n if (state.status !== \"on call\") {\r\n sdkStateManager.setStatus(\"idle\");\r\n }\r\n\r\n setDialerAnchorEl(null);\r\n };\r\n\r\n const handleOpenAgentStatus = (event: React.MouseEvent<HTMLElement>) => {\r\n setStatusAnchorEl(event.currentTarget);\r\n };\r\n\r\n const handleCloseAgentStatus = () => {\r\n setStatusAnchorEl(null);\r\n };\r\n\r\n // // call control API's // //\r\n //------------------------------//\r\n\r\n const handleAgentReady = () => {\r\n const payload = {\r\n action: \"READYAGENT\",\r\n userId: state.agentId,\r\n };\r\n readyAgentStatus(END_POINT.READY_AGENT, payload);\r\n };\r\n\r\n const handleUpdateAgentStatus = (status: string) => {\r\n setStatusAnchorEl(null);\r\n const payload = {\r\n action: \"AGENTBREAK\",\r\n break_type: status,\r\n userId: state.agentId,\r\n };\r\n updateAgentStatus(END_POINT.UPDATE_AGENT_BREAK, payload);\r\n };\r\n\r\n const handleStartCall = (number: string) => {\r\n if (number.length !== 10) {\r\n alert(\"Invalid phone number\");\r\n } else if (!/^\\d+$/.test(number)) {\r\n } else {\r\n const payload = {\r\n action: \"CALL\",\r\n phone_number: number,\r\n userId: state.agentId,\r\n };\r\n clickToCall(END_POINT.CLICK_TO_CALL, payload);\r\n }\r\n };\r\n\r\n const handleHoldToggle = () => {\r\n const payload = {\r\n action: state.isHolding ? \"UNHOLD\" : \"HOLD\",\r\n userId: state.agentId,\r\n };\r\n holdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n };\r\n\r\n const handleMuteToggle = () => {\r\n const payload = {\r\n action: state.isMuted ? \"UNMUTE\" : \"MUTE\",\r\n userId: state.agentId,\r\n };\r\n\r\n muteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n };\r\n\r\n const handleEndCall = (data: {\r\n disposition: { label: string; value: string };\r\n followUp: { label: string; value: string };\r\n callbackDate: string;\r\n callbackHrs: string;\r\n callbackMins: string;\r\n }) => {\r\n console.log(\"data\", data);\r\n const payload = {\r\n action: \"ENDCALL\",\r\n userId: state.agentId,\r\n processid: state.process?.process_id?.toString() ?? \"\",\r\n process_name: state.process?.process_name ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n\r\n disposition: data?.disposition?.value ?? \"\",\r\n set_followUp: data?.followUp?.value ?? \"\",\r\n callback_date: data?.callbackDate ?? \"\",\r\n callback_hrs: data?.callbackHrs ?? \"\",\r\n callback_mins: data?.callbackMins ?? \"\",\r\n endcall_type: \"CLOSE\",\r\n };\r\n setPhoneNumber(\"\");\r\n endCall(END_POINT.END_CALL, payload);\r\n sdkStateManager.endCall();\r\n setOpenCallDisposition(false);\r\n };\r\n\r\n // Call duration timer\r\n useEffect(() => {\r\n let interval: ReturnType<typeof setInterval>;\r\n\r\n if (state.callData.status && state.callData.status === \"ONCALL\") {\r\n interval = setInterval(() => {\r\n const elapsed = Math.floor((Date.now() - state.callStartTime!) / 1000);\r\n setCallDuration(elapsed);\r\n }, 1000);\r\n } else {\r\n setCallDuration(0);\r\n }\r\n\r\n return () => {\r\n if (interval) clearInterval(interval);\r\n };\r\n }, [state.callData.status]);\r\n\r\n // Notify parent of data changes\r\n useEffect(() => {\r\n if (onDataChange) {\r\n onDataChange(state.callData);\r\n }\r\n }, [state.callData, onDataChange]);\r\n\r\n useEffect(() => {\r\n if (state.agentId) {\r\n getProcessList(END_POINT.PROCESS_LIST, {\r\n userId: state.agentId,\r\n action: \"GETAGENTPROCESSLIST\",\r\n refno: \"1234221233\",\r\n });\r\n } else {\r\n console.log(\"No agentId available, skipping API call\");\r\n }\r\n }, [state.agentId]);\r\n\r\n useEffect(() => {\r\n if (state.agentId) {\r\n webSocketRef.current = new WebSocket(\r\n `${WS_END_POINT.WS}?agent_id=${state.agentId}`\r\n );\r\n\r\n webSocketRef.current.onopen = () => {\r\n console.log(\"WebSocket connection established\");\r\n };\r\n\r\n webSocketRef.current.onmessage = (event) => {\r\n try {\r\n const data = JSON.parse(event.data);\r\n console.log(\"parsedJSON:\", data);\r\n sdkStateManager.updateCallData(data);\r\n if (data.status === \"ONCALL\") {\r\n sdkStateManager.startCall();\r\n }\r\n if (data.status === \"WRAPUP\") {\r\n sdkStateManager.endCall();\r\n }\r\n } catch {\r\n console.log(\"Raw message:\", event.data);\r\n }\r\n };\r\n\r\n webSocketRef.current.onclose = () => {\r\n console.log(\"WebSocket connection closed\");\r\n };\r\n\r\n webSocketRef.current.onerror = (error) => {\r\n console.error(\"WebSocket error:\", error);\r\n };\r\n }\r\n\r\n return () => {\r\n webSocketRef.current?.close();\r\n };\r\n }, [state.agentId]);\r\n\r\n if (!state.isInitialized || !state.process) {\r\n return (\r\n <Box>\r\n {/* Processor List Dialog */}\r\n {Boolean(openProcessorDialog) && (\r\n <ProcessorListDialog\r\n processList={processList}\r\n open={openProcessorDialog}\r\n setOpen={setOpenProcessorDialog}\r\n handleSelectedProcessor={(data: {\r\n process_id: number;\r\n process_name: string;\r\n }) => {\r\n sdkStateManager.setProcess(data);\r\n }}\r\n />\r\n )}\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n <Fade in={true} timeout={300}>\r\n <Paper\r\n ref={dragRef}\r\n elevation={isDragging ? 4 : 1}\r\n sx={{\r\n position: \"fixed\",\r\n left: position.x,\r\n top: position.y,\r\n p: 0.5,\r\n borderRadius: 3,\r\n bgcolor: \"background.paper\",\r\n zIndex: 99999,\r\n transition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n duration: theme.transitions.duration.short,\r\n }),\r\n userSelect: \"none\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {/* Status and Timer Row */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n // justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <IconButton\r\n component=\"div\"\r\n size=\"small\"\r\n sx={{\r\n cursor: \"all-scroll\",\r\n }}\r\n onMouseDown={handleMouseDown}\r\n onTouchStart={handleTouchStart}\r\n >\r\n <DragIndicator />{\" \"}\r\n </IconButton>\r\n\r\n <Box\r\n sx={{\r\n marginRight: \"10px\",\r\n }}\r\n >\r\n {/* Dial Button */}\r\n <Tooltip title=\"Dial\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={(e) => {\r\n if (\r\n state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n state.callData?.status?.toUpperCase() !== \"BREAK\" &&\r\n state.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n state.callData?.status?.toUpperCase() !== \"WRAPUP\"\r\n ) {\r\n handleOpenDialer(e);\r\n }\r\n }}\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": {\r\n bgcolor: \"warning\",\r\n },\r\n }}\r\n >\r\n <WifiCalling3\r\n sx={{\r\n color:\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ? \"action.selected\"\r\n : \"success.main\",\r\n }}\r\n />\r\n </IconButton>\r\n </Tooltip>\r\n </Box>\r\n {/* Call Duration */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" ? */}\r\n <Typography\r\n sx={{\r\n color: \"success.main\",\r\n width: \"40px\",\r\n marginRight: \"10px\",\r\n }}\r\n >\r\n {formatDuration(callDuration)}\r\n </Typography>\r\n {/* :\tnull} */}\r\n\r\n {/* Agent Status Button */}\r\n\r\n {/* Agent Status */}\r\n {isLoading || agentReadyLoading ? (\r\n <Box\r\n sx={{\r\n fontWeight: \"bold\",\r\n // width: \"50px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n }}\r\n >\r\n <CircularProgress size=\"20px\" />\r\n </Box>\r\n ) : (\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n fontWeight: \"bold\",\r\n // width: \"50px\",\r\n textAlign: \"right\",\r\n }}\r\n >\r\n {state.callData?.status?.toUpperCase() ?? \"N/A\"}\r\n </Typography>\r\n )}\r\n <Box\r\n // size=\"small\"\r\n // variant=\"text\"\r\n onClick={handleOpenAgentStatus}\r\n // disabled={Boolean(state.callStartTime)}\r\n sx={{\r\n // backgroundColor: \"red\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n margin: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n <ArrowDropDown />\r\n </Box>\r\n </Box>\r\n\r\n {/* Control Buttons */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n gap: 1,\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n {/* Agent Ready */}\r\n {/* {state.callData?.status?.toUpperCase() === \"BREAK\" && ( */}\r\n <Tooltip title={\"Agent Ready\"}>\r\n <Button\r\n variant={\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ? \"outlined\"\r\n : \"contained\"\r\n }\r\n onClick={(e) => {\r\n if (\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ) {\r\n e.stopPropagation();\r\n handleAgentReady();\r\n }\r\n }}\r\n classes={{\r\n root:\r\n state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ? \"outlined\"\r\n : \"enabled\",\r\n }}\r\n sx={{\r\n ...(state.callData?.status?.toUpperCase() === \"BREAK\" ||\r\n state.callData?.status?.toUpperCase() === \"MISSED\"\r\n ? outlined\r\n : enabled),\r\n }}\r\n disabled={agentReadyLoading}\r\n >\r\n <SupportAgent />\r\n </Button>\r\n </Tooltip>\r\n {/* )} */}\r\n\r\n {/* Hold Button */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" && ( */}\r\n <Tooltip title={state.isHolding ? \"Resume\" : \"Hold\"}>\r\n <Button\r\n variant={\r\n state.isHolding &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? \"contained\"\r\n : \"outlined\"\r\n }\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleHoldToggle();\r\n }}\r\n sx={\r\n state.isHolding &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n (state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n !state.isHolding) ||\r\n holdOrUnHoldLoading\r\n }\r\n >\r\n {holdOrUnHoldLoading ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : state.isHolding ? (\r\n <PlayArrow />\r\n ) : (\r\n <Pause />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* )} */}\r\n\r\n {/* Mute Button */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" && ( */}\r\n <Tooltip title={state.isMuted ? \"Unmute\" : \"Mute\"}>\r\n <Button\r\n variant={\r\n state.isMuted &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? \"contained\"\r\n : \"outlined\"\r\n }\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n handleMuteToggle();\r\n }}\r\n sx={\r\n state.isMuted &&\r\n state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n (state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n !state.isMuted) ||\r\n muteOrUnMuteLoading\r\n }\r\n >\r\n {muteOrUnMuteLoading ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : state.isMuted ? (\r\n <MicOff />\r\n ) : (\r\n <Mic />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* )} */}\r\n\r\n {/* Call Transfer */}\r\n {state.sdkConfig?.showTransferButton && (\r\n <Tooltip title={\"Transfer Call\"}>\r\n <Button\r\n variant={openCallTransfer ? \"contained\" : \"outlined\"}\r\n onClick={(e) => {\r\n if (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n e.stopPropagation();\r\n setOpenCallTransfer(true);\r\n }\r\n }}\r\n sx={\r\n openCallTransfer\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n state.callData?.status?.toUpperCase() !== \"ONCALL\"\r\n }\r\n >\r\n <TransferWithinAStation />\r\n </Button>\r\n </Tooltip>\r\n )}\r\n\r\n {/* Call Conference Button */}\r\n {state.sdkConfig?.showConferenceButton && (\r\n <Tooltip title={\"Conference Call\"}>\r\n <Button\r\n variant={open ? \"contained\" : \"outlined\"}\r\n onClick={(e) => {\r\n if (state.callData?.status?.toUpperCase() === \"ONCALL\") {\r\n e.stopPropagation();\r\n setOpen(true);\r\n }\r\n }}\r\n sx={\r\n open\r\n ? { ...enabled }\r\n : state.callData?.status?.toUpperCase() === \"ONCALL\"\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n disabled={\r\n state.callData?.status?.toUpperCase() !== \"ONCALL\"\r\n }\r\n >\r\n <Group />\r\n </Button>\r\n </Tooltip>\r\n )}\r\n\r\n {/* Call History */}\r\n {/* {state.callData?.status?.toUpperCase() === \"ONCALL\" && ( */}\r\n {/* <Tooltip title={\"Call History\"}>\r\n <Button\r\n variant={openCallHistoryDialog ? \"contained\" : \"outlined\"}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n setOpenCallHistoryDialog(true);\r\n }}\r\n sx={openCallHistoryDialog ? { ...enabled } : { ...outlined }}\r\n >\r\n <History />\r\n </Button>\r\n </Tooltip> */}\r\n {/* )} */}\r\n\r\n {/* End Call Button */}\r\n {state.sdkConfig?.showEndCallButton && (\r\n <Tooltip title={\"End Call\"}>\r\n <Button\r\n variant={\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ? \"contained\"\r\n : \"outlined\"\r\n }\r\n onClick={(e) => {\r\n if (\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ) {\r\n e.stopPropagation();\r\n setOpenCallDisposition(true);\r\n }\r\n }}\r\n sx={\r\n state.callData?.status?.toUpperCase() === \"ONCALL\" ||\r\n state.callData?.status?.toUpperCase() === \"RINGING\" ||\r\n state.callData?.status?.toUpperCase() === \"WRAPUP\"\r\n ? {\r\n ...enabled,\r\n borderRight: \"1px\",\r\n backgroundColor: \"error.main\",\r\n minWidth: \"60px !important\",\r\n boxShadow: \" 0px 2px 1px #5f3f3f\",\r\n border: `1px solid ${theme.palette.error.light}`,\r\n height: \"40px\",\r\n \"&:hover\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: \" 0px 2px 1px #5f3f3f\",\r\n border: `0px solid ${theme.palette.error.light}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n }\r\n : {\r\n ...disabled,\r\n minWidth: \"60px !important\",\r\n }\r\n }\r\n disabled={\r\n (state.callData?.status?.toUpperCase() !== \"ONCALL\" &&\r\n state.callData?.status?.toUpperCase() !== \"RINGING\" &&\r\n state.callData?.status?.toUpperCase() !== \"WRAPUP\") ||\r\n endCallLoading\r\n }\r\n >\r\n {endCallLoading ? (\r\n <CircularProgress size=\"20px\" color=\"error\" />\r\n ) : (\r\n <CallEnd />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n )}\r\n </Box>\r\n </Box>\r\n </Paper>\r\n </Fade>\r\n\r\n <Fade in={true} timeout={300}>\r\n <Paper\r\n ref={iframeDragRef}\r\n elevation={iframeIsDragging ? 4 : 1}\r\n sx={{\r\n position: \"fixed\",\r\n left: iframePosition.x,\r\n top: iframePosition.y,\r\n p: 1,\r\n height: \"auto\",\r\n borderRadius: 2,\r\n bgcolor: \"background.paper\",\r\n zIndex: 99999,\r\n transition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n duration: theme.transitions.duration.short,\r\n }),\r\n visibility: showIframe ? \"visible\" : \"hidden\",\r\n userSelect: \"none\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n cursor: \"all-scroll\",\r\n }}\r\n onMouseDown={iframeHandleMouseDown}\r\n onTouchStart={iframeHandleTouchStart}\r\n >\r\n <DragIndicator\r\n sx={{\r\n transform: \"rotate(90deg)\",\r\n }}\r\n />{\" \"}\r\n <IconButton onClick={() => setShowIframe(false)}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n <iframe\r\n src={`https://${IP}/ConVoxCCS/iframe?agent_id=${state.agentId}&process_id=${state.process?.process_id}`}\r\n height={380}\r\n width={420}\r\n allow=\"camera; microphone; autoplay\"\r\n style={{\r\n border: \"none\",\r\n }}\r\n ></iframe>\r\n </Paper>\r\n </Fade>\r\n\r\n {/* Dialer */}\r\n <Menu\r\n anchorEl={dialerAnchorEl}\r\n open={Boolean(dialerAnchorEl)}\r\n onClose={handleCloseDialer}\r\n onClick={(e) => e.stopPropagation()}\r\n sx={{\r\n zIndex: 99999,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n all: \"unset\",\r\n padding: \"10px\",\r\n \"&hover\": {\r\n backgroundColor: \"white\",\r\n },\r\n }}\r\n >\r\n <TextField\r\n size=\"small\"\r\n value={phoneNumber}\r\n placeholder=\"Enter Mobile No.\"\r\n onChange={(e) => {\r\n setPhoneNumber(e.target.value);\r\n }}\r\n />\r\n <IconButton\r\n color=\"info\"\r\n onClick={() => {\r\n handleStartCall(phoneNumber);\r\n }}\r\n >\r\n {clickToCallLoading ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.success.main,\r\n }}\r\n />\r\n ) : (\r\n <Phone color=\"success\" />\r\n )}\r\n </IconButton>\r\n </Box>\r\n </Menu>\r\n\r\n {/* Status */}\r\n <Menu\r\n anchorEl={statusAnchorEl}\r\n open={Boolean(statusAnchorEl)}\r\n onClose={handleCloseAgentStatus}\r\n onClick={(e) => e.stopPropagation()}\r\n sx={{\r\n zIndex: 99999,\r\n }}\r\n >\r\n <MenuItem onClick={() => handleUpdateAgentStatus(\"Lunch\")}>\r\n - Lunch\r\n </MenuItem>\r\n <MenuItem onClick={() => handleUpdateAgentStatus(\"Tea\")}>\r\n - Tea\r\n </MenuItem>\r\n </Menu>\r\n\r\n {/* Queue Count */}\r\n <Menu\r\n anchorEl={anchorEl}\r\n open={Boolean(anchorEl)}\r\n onClose={handleCloseQueueCounts}\r\n onClick={(e) => e.stopPropagation()}\r\n sx={{\r\n zIndex: 99999,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"flex-start\",\r\n flexDirection: \"column\",\r\n padding: \"0px 10px\",\r\n \"&hover\": {\r\n backgroundColor: \"white\",\r\n },\r\n }}\r\n >\r\n <Chip\r\n icon={<Layers color=\"secondary\" />}\r\n variant=\"outlined\"\r\n label=\"Waiting - 25\"\r\n sx={{\r\n margin: \"4px 2px\",\r\n }}\r\n />\r\n\r\n <Chip\r\n icon={<Pending color=\"info\" />}\r\n label=\"Pending - 99+\"\r\n variant=\"outlined\"\r\n sx={{\r\n margin: \"4px 2px\",\r\n }}\r\n />\r\n\r\n <Chip\r\n icon={<Upcoming color=\"success\" />}\r\n variant=\"outlined\"\r\n label=\"Upcoming - 66\"\r\n sx={{\r\n margin: \"4px 2px\",\r\n }}\r\n />\r\n </Box>\r\n </Menu>\r\n\r\n {/* Conference Call Dialog */}\r\n {Boolean(open) && <ConferenceDialog open={open} setOpen={setOpen} />}\r\n\r\n {/* Call Transfer Dialog */}\r\n {Boolean(openCallTransfer) && (\r\n <CallTransferDialog\r\n open={openCallTransfer}\r\n setOpen={setOpenCallTransfer}\r\n />\r\n )}\r\n\r\n {/* Call Disposition Dialog */}\r\n {Boolean(openCallDisposition) && (\r\n <EndCallDispositionDialog\r\n open={openCallDisposition}\r\n setOpen={setOpenCallDisposition}\r\n onSubmitDisposition={handleEndCall}\r\n />\r\n )}\r\n\r\n {/* Call Disposition Dialog */}\r\n {Boolean(openCallHistoryDialog) && (\r\n <CallHistoryDialog\r\n open={openCallHistoryDialog}\r\n setOpen={setOpenCallHistoryDialog}\r\n />\r\n )}\r\n </>\r\n );\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 /**\r\n * Local React state holding the current SDK state.\r\n * Initialized from the sdkStateManager's current state.\r\n */\r\n const [state, setState] = useState<SDKState>(sdkStateManager.getState());\r\n\r\n /**\r\n * Sets up a subscription to the sdkStateManager on component mount.\r\n * Whenever the SDK state changes, this updates the local `state`.\r\n * Cleans up the subscription on component unmount.\r\n */\r\n useEffect(() => {\r\n // Subscribe to state changes from the sdkStateManager\r\n const unsubscribe = sdkStateManager.subscribe(() => {\r\n // Update local React state with the latest SDK state\r\n setState(sdkStateManager.getState());\r\n });\r\n\r\n // Return the unsubscribe function to clean up\r\n return unsubscribe;\r\n }, []);\r\n\r\n /**\r\n * Return the current SDK state to the calling component.\r\n */\r\n return 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 } = 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\tshowToast(res.data?.message, \"success\");\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\tshowToast: (message: string, severity?: AlertColor) => void;\r\n};\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nexport const useToast = () => {\r\n\tconst ctx = useContext(ToastContext);\r\n\tif (!ctx) throw new Error(\"useToast must be used inside ToastProvider\");\r\n\treturn ctx;\r\n};\r\n\r\nexport const ToastProvider = ({ children }: { children: ReactNode }) => {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst [message, setMessage] = useState(\"\");\r\n\tconst [severity, setSeverity] = useState<AlertColor>(\"info\");\r\n\r\n\tconst showToast = (msg: string, sev: AlertColor = \"info\") => {\r\n\t\tsetMessage(msg);\r\n\t\tsetSeverity(sev);\r\n\t\tsetOpen(true);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<ToastContext.Provider value={{ showToast }}>\r\n\t\t\t{children}\r\n\t\t\t<Snackbar\r\n\t\t\t\topen={open}\r\n\t\t\t\tcolor={severity}\r\n\t\t\t\tautoHideDuration={3000}\r\n\t\t\t\tonClose={() => setOpen(false)}\r\n\t\t\t\tanchorOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n\t\t\t>\r\n\t\t\t\t<Alert\r\n\t\t\t\t\tvariant=\"filled\"\r\n\t\t\t\t\t// color={severity}\r\n\t\t\t\t\tseverity={severity}\r\n\t\t\t\t\tonClose={() => setOpen(false)}\r\n\t\t\t\t\tsx={{ width: \"100%\" }}\r\n\t\t\t\t>\r\n\t\t\t\t\t{message}\r\n\t\t\t\t</Alert>\r\n\t\t\t</Snackbar>\r\n\t\t</ToastContext.Provider>\r\n\t);\r\n};\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n Call,\r\n CallEnd,\r\n CallSplit,\r\n Close,\r\n Mic,\r\n MicOff,\r\n Pause,\r\n PhoneDisabled,\r\n PlayArrow,\r\n SupportAgent,\r\n} from \"@mui/icons-material\";\r\nimport {\r\n Box,\r\n Button,\r\n Dialog,\r\n IconButton,\r\n Paper,\r\n TextField,\r\n Typography,\r\n Autocomplete,\r\n Grid,\r\n Tooltip,\r\n useTheme,\r\n TableContainer,\r\n Table,\r\n TableHead,\r\n TableRow,\r\n TableCell,\r\n TableBody,\r\n CircularProgress,\r\n} from \"@mui/material\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { usePostRequest } from \"../services/request\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport type { ConferenceLineTypes } from \"../../types\";\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport axiosInstance from \"../services/axios\";\r\nimport { useToast } from \"../services/toastMessage\";\r\nimport useStyles from \"./styles\";\r\n\r\ntype TransferCallRequest = {\r\n mobile_number?: string;\r\n userid?: string;\r\n type?: string;\r\n transfer_to?: string;\r\n callreferenceid?: string;\r\n processid?: string;\r\n process_name?: string;\r\n};\r\n\r\nconst ConferenceTableRow = ({ each }: any) => {\r\n const state = useSDKState();\r\n const { showToast } = useToast();\r\n const { disabled, enabled, outlined } = useStyles({\r\n disabled: state.sdkConfig?.disabled || {},\r\n enabled: state.sdkConfig?.enabled || {},\r\n outlined: state.sdkConfig?.outlined || {},\r\n });\r\n const theme = useTheme();\r\n\r\n // Loading States\r\n const [conferenceCallStart, setConferenceCallStart] = useState(false);\r\n const [conferenceCallMerge, setConferenceCallMerge] = useState(false);\r\n const [conferenceCallHoldOrUnHold, setConferenceCallHoldOrUnHold] =\r\n useState(false);\r\n const [conferenceCallMuteOrUnMute, setConferenceCallMuteOrUnMute] =\r\n useState(false);\r\n const [conferenceCallEnd, setConferenceCallEnd] = useState(false);\r\n\r\n const onConferenceLineUpdate = (line: ConferenceLineTypes, data: any) => {\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n };\r\n\r\n const onConferenceCallStart = (line: ConferenceLineTypes, data: any) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallStart(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: `CALL${line_used.line}`,\r\n line_used: String(line_used.line),\r\n thirdparty_no: line_used.phone,\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallStart(false);\r\n });\r\n };\r\n\r\n const onMergeConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallMerge(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: `CONFERENCE`,\r\n line_used: String(line_used.line),\r\n thirdparty_no: line_used.phone,\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallMerge(false);\r\n });\r\n };\r\n\r\n const onHoldOrUnHoldConferenceCall = (\r\n line: ConferenceLineTypes,\r\n data: any,\r\n type: string\r\n ) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallHoldOrUnHold(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: type,\r\n hold_channel_no:\r\n type === \"HOLDUSER\"\r\n ? `hold${line_used.line}`\r\n : `unhold${line_used.line}`, // Change the line according where u intiated firstly\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_HOLD_OR_UN_HOLD, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallHoldOrUnHold(false);\r\n });\r\n };\r\n\r\n const onMuteOrUnMuteConferenceCall = (\r\n line: ConferenceLineTypes,\r\n data: any,\r\n type: string\r\n ) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallMuteOrUnMute(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: type,\r\n channel_no:\r\n type === \"MUTEUSER\" ? `mute${line_used.line}` : `play${line_used.line}`,\r\n userid: state.callData?.agent_id ?? \"\",\r\n thirdparty_no: line_used.phone,\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_MUTE_OT_UN_MUTE, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallMuteOrUnMute(false);\r\n });\r\n };\r\n\r\n const onEndConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n const line_used = { ...line, ...data };\r\n setConferenceCallEnd(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: \"HANGUP_CHANNEL\",\r\n line_used: String(line_used.line - 1),\r\n user_type: `THIRDPARTY${line_used.line - 1}`,\r\n thirdparty_no: line_used.phone,\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_END, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.setConferenceLine({ ...line, ...data });\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallEnd(false);\r\n });\r\n };\r\n\r\n return (\r\n <TableRow\r\n key={each.line}\r\n sx={{\r\n border: \"2px solid #fff\",\r\n }}\r\n >\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Typography>Line {each?.line ?? \"\"}. </Typography>\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n px: 1,\r\n // border: \"2px solid gray\",\r\n borderRadius: \"10px\",\r\n // textAlign: \"center\",\r\n width: \"80px\",\r\n maxWidth: \"100px\",\r\n }}\r\n >\r\n {each?.status ?? \"\"}\r\n </Typography>\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Button\r\n sx={{\r\n textTransform: \"capitalize\",\r\n }}\r\n size=\"small\"\r\n >\r\n <Typography variant=\"body2\">\r\n {each?.line === 1 ? \"Internal\" : \"External\"}\r\n </Typography>\r\n </Button>\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <TextField\r\n size=\"small\"\r\n placeholder=\"Phone Number\"\r\n value={each?.phone || \"\"}\r\n disabled={each?.line === 1}\r\n onChange={(e) => {\r\n onConferenceLineUpdate(each, { phone: e.target.value });\r\n }}\r\n />\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n // margin: 0,\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-around\",\r\n }}\r\n >\r\n {/* Action Buttons */}\r\n {/* Conference Call Button */}\r\n <Tooltip title=\"Call\">\r\n <Button\r\n variant={each?.isCallStart ? \"outlined\" : \"contained\"}\r\n color=\"success\"\r\n sx={\r\n each?.isCallStart\r\n ? { ...disabled }\r\n : {\r\n ...enabled,\r\n border: `0px solid ${theme.palette.success.light}`,\r\n \"&:hover\": {\r\n bgcolor: \"success.light\",\r\n boxShadow: `0px 2px 1px ${theme.palette.success.light}`,\r\n border: `0px solid ${theme.palette.success.light}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"success.light\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n }\r\n }\r\n onClick={() => {\r\n onConferenceCallStart(each, {\r\n isCallStart: true,\r\n status: \"ONCALL\",\r\n });\r\n }}\r\n disabled={each?.isCallStart || conferenceCallStart}\r\n >\r\n {conferenceCallStart ? (\r\n <CircularProgress size=\"20px\" color=\"success\" />\r\n ) : (\r\n <Call\r\n sx={{ color: each?.isCallStart ? \"default\" : \"#e7e7e7ff\" }}\r\n />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* Merge Call Button */}\r\n <Tooltip title=\"Merge Call\">\r\n <Button\r\n variant={each?.isMergeCall ? \"contained\" : \"outlined\"}\r\n sx={\r\n each?.isMergeCall && each?.isCallStart\r\n ? { ...disabled }\r\n : each?.isCallStart\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n onClick={() => {\r\n onMergeConferenceCall(each, {\r\n isMergeCall: true,\r\n status: \"ONCALL\",\r\n });\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallMerge}\r\n >\r\n {conferenceCallMerge ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: each?.isMergeCall\r\n ? \"#e7e7e7ff\"\r\n : theme.palette.primary.main,\r\n }}\r\n />\r\n ) : (\r\n <CallSplit />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* Hold Or Un Hold Call Button */}\r\n <Tooltip title={each.isHold ? \"Hold\" : \"Un Hold\"}>\r\n <Button\r\n variant={each?.isHold ? \"contained\" : \"outlined\"}\r\n sx={\r\n each?.isHold && each?.isCallStart\r\n ? { ...disabled }\r\n : each?.isCallStart\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n onClick={() => {\r\n if (each.isHold) {\r\n onHoldOrUnHoldConferenceCall(\r\n each,\r\n { isHold: false },\r\n \"UNHOLDUSER\"\r\n );\r\n } else {\r\n onHoldOrUnHoldConferenceCall(\r\n each,\r\n { isHold: true },\r\n \"HOLDUSER\"\r\n );\r\n }\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallHoldOrUnHold}\r\n >\r\n {conferenceCallHoldOrUnHold ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : each.isHold ? (\r\n <PlayArrow />\r\n ) : (\r\n <Pause />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* Mute Or Un Mute Call Button */}\r\n <Tooltip title={each.isMute ? \"Mute\" : \"Un Mute\"}>\r\n <Button\r\n variant={each?.isMute ? \"contained\" : \"outlined\"}\r\n sx={\r\n each?.isMute && each?.isCallStart\r\n ? { ...disabled }\r\n : each?.isCallStart\r\n ? { ...outlined }\r\n : { ...disabled }\r\n }\r\n onClick={() => {\r\n if (each.isMute) {\r\n onMuteOrUnMuteConferenceCall(\r\n each,\r\n { isMute: false },\r\n \"PLAYUSER\"\r\n );\r\n } else {\r\n onMuteOrUnMuteConferenceCall(\r\n each,\r\n { isMute: true },\r\n \"MUTEUSER\"\r\n );\r\n }\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallMuteOrUnMute}\r\n >\r\n {conferenceCallMuteOrUnMute ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n sx={{\r\n color: theme.palette.primary.main,\r\n }}\r\n />\r\n ) : each.isMute ? (\r\n <MicOff />\r\n ) : (\r\n <Mic />\r\n )}\r\n </Button>\r\n </Tooltip>\r\n {/* End Call Button */}\r\n <Tooltip title=\"End Call\">\r\n {each?.line !== 1 ? (\r\n <Button\r\n variant={each?.isCallStart ? \"contained\" : \"outlined\"}\r\n color=\"error\"\r\n sx={\r\n each?.isCallStart\r\n ? {\r\n ...enabled,\r\n minWidth: \"60px !important\",\r\n border: `0px solid ${theme.palette.error.light}`,\r\n \"&:hover\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: `0px 2px 1px ${theme.palette.error.light}`,\r\n border: `0px solid ${theme.palette.error.light}`,\r\n },\r\n \"&:active\": {\r\n bgcolor: \"error.light\",\r\n boxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n },\r\n }\r\n : { ...disabled, minWidth: \"60px !important\" }\r\n }\r\n onClick={() => {\r\n onEndConferenceCall(each, {\r\n isCallStart: false,\r\n isMergeCall: false,\r\n isMute: false,\r\n isHold: false,\r\n status: \"IDLE\",\r\n phone: \"\",\r\n });\r\n }}\r\n disabled={!each?.isCallStart || conferenceCallEnd}\r\n >\r\n {conferenceCallEnd ? (\r\n <CircularProgress size=\"20px\" color=\"error\" />\r\n ) : (\r\n <CallEnd />\r\n )}\r\n </Button>\r\n ) : (\r\n <Button\r\n variant={each?.isCallStart ? \"contained\" : \"outlined\"}\r\n sx={{\r\n ...disabled,\r\n visibility: \"hidden\",\r\n minWidth: \"60px !important\",\r\n }}\r\n onClick={() => {\r\n onEndConferenceCall(each, {\r\n isCallStart: false,\r\n isMergeCall: false,\r\n isMute: false,\r\n isHold: false,\r\n status: \"IDLE\",\r\n phone: \"\",\r\n });\r\n }}\r\n disabled={!each?.isCallStart}\r\n >\r\n <Typography>\r\n <CallEnd\r\n sx={{\r\n visibility: \"hidden\",\r\n }}\r\n />\r\n </Typography>\r\n </Button>\r\n )}\r\n </Tooltip>\r\n </Box>\r\n </TableCell>\r\n </TableRow>\r\n );\r\n};\r\n\r\nexport function ConferenceDialog({ open, setOpen }: any) {\r\n const state = useSDKState();\r\n const { showToast } = useToast();\r\n const [conferenceCallEndAll, setConferenceCallEndAll] = useState(false);\r\n\r\n // const { disabled, enabled, outlined } = useMyStyles();\r\n // const theme = useTheme();\r\n\r\n // // Loading States\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n // const onConferenceLineUpdate = (line: ConferenceLineTypes, data: any) => {\r\n // \tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // };\r\n\r\n // const onConferenceCallStart = (line: ConferenceLineTypes, data: any) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: `CALL${line_used.line}`,\r\n // \t\tline_used: String(line_used.line),\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onMergeConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n // \tconst line_used = { ...line, ...data };\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: `CONFERENCE`,\r\n // \t\tline_used: String(line_used.line),\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onHoldOrUnHoldConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: type,\r\n // \t\thold_channel_no: type === \"HOLDUSER\" ? `hold${line_used.line}` : `unhold${line_used.line}`, // Change the line according where u intiated firstly\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL_HOLD_OR_UN_HOLD, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onMuteOrUnMuteConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: type,\r\n // \t\tchannel_no: type === \"MUTEUSER\" ? `mute${line_used.line}` : `play${line_used.line}`,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL_MUTE_OT_UN_MUTE, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n // const onEndConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n // \tconst line_used = { ...line, ...data };\r\n\r\n // \tconst payload = {\r\n // \t\taction: \"EXTERNAL_CONFERENCE\",\r\n // \t\toperation: \"HANGUP_CHANNEL\",\r\n // \t\tline_used: String(line_used.line - 1),\r\n // \t\tuser_type: `THIRDPARTY${line_used.line - 1}`,\r\n // \t\tthirdparty_no: line_used.phone,\r\n // \t\tuserid: state.callData?.agent_id ?? \"\",\r\n // \t\tprocess: state.callData?.process_name ?? \"\",\r\n // \t};\r\n\r\n // \taxiosInstance\r\n // \t\t.post(END_POINT.CONFERENCE_CALL_END, payload)\r\n // \t\t.then((res) => {\r\n // \t\t\tshowToast(res.data?.message, \"success\");\r\n // \t\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n // \t\t})\r\n // \t\t.catch((err) => {\r\n // \t\t\tconst message =\r\n // \t\t\t\terr.response?.data?.detail ||\r\n // \t\t\t\terr.response?.data?.message ||\r\n // \t\t\t\terr.message ||\r\n // \t\t\t\t\"An unknown error occurred\";\r\n // \t\t\tshowToast(message, \"error\");\r\n // \t\t});\r\n // };\r\n\r\n const onEndAllConferenceCalls = () => {\r\n setConferenceCallEndAll(true);\r\n const payload = {\r\n action: \"EXTERNAL_CONFERENCE\",\r\n operation: \"ENDCONFERENCE\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n process: state.callData?.process_name ?? \"\",\r\n };\r\n\r\n axiosInstance\r\n .post(END_POINT.CONFERENCE_CALL_END_ALL, payload)\r\n .then((res) => {\r\n showToast(res.data?.message, \"success\");\r\n sdkStateManager.resetConferenceLines();\r\n handleClose();\r\n })\r\n .catch((err) => {\r\n const message =\r\n err.response?.data?.detail ||\r\n err.response?.data?.message ||\r\n err.message ||\r\n \"An unknown error occurred\";\r\n showToast(message, \"error\");\r\n })\r\n .finally(() => {\r\n setConferenceCallEndAll(false);\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n const obj = {\r\n line: 1,\r\n status: state.callData?.status ?? \"\",\r\n type: \"internal\" as \"internal\" | \"external\" | \"\",\r\n phone: state.callData?.phone_number ?? \"\",\r\n isMute: false,\r\n isHold: false,\r\n isMergeCall: false,\r\n isCallStart: true,\r\n };\r\n sdkStateManager.setConferenceLine(obj);\r\n }, []);\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"md\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n }}\r\n >\r\n <Typography variant=\"body1\">\r\n {state?.agentId ?? \"\"} conference\r\n </Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 2px #e7e5e5ff\",\r\n margin: \"0px 15px\",\r\n borderRadius: \"20px\",\r\n }}\r\n >\r\n <TableContainer\r\n component={Paper}\r\n sx={{\r\n outline: \"0px solid gray !important\",\r\n boxShadow: \"1px 1px 6px #e7e5e5ff\",\r\n }}\r\n >\r\n <Table\r\n sx={{\r\n border: \"4px solid #ffffff !important\",\r\n }}\r\n >\r\n <TableHead>\r\n <TableRow\r\n sx={{\r\n border: \"2px solid #f3f3f3ff !important\",\r\n }}\r\n >\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Line\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Status\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Call Type\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Mobile Number\r\n </TableCell>\r\n <TableCell\r\n sx={{\r\n padding: \"6px\",\r\n }}\r\n >\r\n Call Actions\r\n </TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {state?.conferenceLine.map((each: any) => (\r\n <ConferenceTableRow each={each} />\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </Box>\r\n {/* End All Calls */}\r\n <Box textAlign=\"center\" m={2}>\r\n <Button\r\n variant=\"outlined\"\r\n color=\"error\"\r\n size=\"large\"\r\n onClick={onEndAllConferenceCalls}\r\n disabled={conferenceCallEndAll}\r\n sx={{ px: 2, borderRadius: \"20px\", textTransform: \"capitalize\" }}\r\n >\r\n {conferenceCallEndAll ? (\r\n <CircularProgress\r\n size=\"20px\"\r\n color=\"error\"\r\n sx={{\r\n marginRight: \"8px\",\r\n }}\r\n />\r\n ) : (\r\n <IconButton\r\n sx={{\r\n bgcolor: \"error.main\",\r\n \"&:hover\": { bgcolor: \"error.dark\" },\r\n marginRight: \"8px\",\r\n width: \"28px\",\r\n height: \"28px\",\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n lineHeight: \"16px\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n color: \"white\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n borderRadius: \"50%\",\r\n }}\r\n >\r\n <PhoneDisabled\r\n sx={{\r\n color: \"white\",\r\n fontSize: \"16px\",\r\n fontWeight: \"600\",\r\n }}\r\n />\r\n </IconButton>\r\n )}\r\n End Conference\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function CallTransferDialog({ open, setOpen }: any) {\r\n const [transferCall] = usePostRequest<TransferCallRequest>({\r\n onSuccess: (res) => {\r\n console.log(\"res\", res);\r\n setOpen(false);\r\n },\r\n onError: (error) => {\r\n console.log(\"error\", error);\r\n },\r\n });\r\n const state = useSDKState();\r\n const [currentselecteTab, setCurrentselecteTab] = useState(\"process\");\r\n\r\n const [getIdelAgentsList, { data: idleAgentsList }] = usePostRequest<any>();\r\n\r\n const [getProcessAndQueuesList, { data: processAndQueuesList }] =\r\n usePostRequest<{\r\n status: string;\r\n active: boolean;\r\n process?: any[];\r\n queue?: any[];\r\n }>();\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const handleTransferCall = (data: any, type: string) => {\r\n console.log(data, \"data34\");\r\n if (type === \"PROCESS\") {\r\n const payload = {\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n type: \"PROCESS\",\r\n transfer_to: data?.process_name ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n processid: String(state.callData?.process_id ?? \"\"),\r\n process_name: state.callData?.process_name ?? \"\",\r\n };\r\n transferCall(END_POINT.TRANSFER_CALL, payload);\r\n } else if (type === \"QUEUE\") {\r\n const payload = {\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n type: \"QUEUE\",\r\n transfer_to: data?.queue_name ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n processid: String(state.callData?.process_id ?? \"\"),\r\n process_name: state.callData?.process_name ?? \"\",\r\n };\r\n transferCall(END_POINT.TRANSFER_CALL, payload);\r\n } else if (type === \"AGENT\") {\r\n const payload = {\r\n mobile_number: state.callData?.phone_number ?? \"\",\r\n userid: state.callData?.agent_id ?? \"\",\r\n type: \"AGENT\",\r\n transfer_to: data?.user_id ?? \"\",\r\n callreferenceid: state.callData?.convox_id ?? \"\",\r\n processid: String(state.callData?.process_id ?? \"\"),\r\n process_name: state.callData?.process_name ?? \"\",\r\n };\r\n transferCall(END_POINT.TRANSFER_CALL, payload);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n getIdelAgentsList(END_POINT.AGENTS_LIST, {\r\n status: \"IDLE\",\r\n active: true,\r\n });\r\n getProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, {\r\n status: \"ACTIVE\",\r\n active: true,\r\n });\r\n }, []);\r\n\r\n console.log(idleAgentsList, \"idleAgentsList\");\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"md\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\"> Call Transfer</Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px 10px\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n }}\r\n >\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n <Button\r\n variant={\r\n currentselecteTab === \"process\" ? \"contained\" : \"outlined\"\r\n }\r\n onClick={() => setCurrentselecteTab(\"process\")}\r\n >\r\n Process\r\n </Button>\r\n <Button\r\n variant={\r\n currentselecteTab === \"queues\" ? \"contained\" : \"outlined\"\r\n }\r\n onClick={() => setCurrentselecteTab(\"queues\")}\r\n >\r\n Queues\r\n </Button>\r\n <Button\r\n variant={\r\n currentselecteTab === \"agents\" ? \"contained\" : \"outlined\"\r\n }\r\n onClick={() => setCurrentselecteTab(\"agents\")}\r\n >\r\n Agents\r\n </Button>\r\n </Box>\r\n {currentselecteTab === \"process\" && (\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n {processAndQueuesList?.data?.process &&\r\n processAndQueuesList?.data?.process?.length > 0 ? (\r\n processAndQueuesList?.data?.process?.map(\r\n (process: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {process.process_name}\r\n </Typography>\r\n\r\n <IconButton\r\n color=\"success\"\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleTransferCall(process, \"PROCESS\");\r\n }}\r\n >\r\n <Call />\r\n </IconButton>\r\n </Box>\r\n )\r\n )\r\n ) : (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n margin: \"10px 0px\",\r\n color: \"gray\",\r\n }}\r\n >\r\n No Process Found\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n {currentselecteTab === \"queues\" && (\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n {processAndQueuesList?.data?.queue &&\r\n processAndQueuesList?.data?.queue?.length > 0 ? (\r\n processAndQueuesList?.data?.queue?.map(\r\n (queue: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {queue.queue_name}\r\n {processAndQueuesList?.data?.process?.find(\r\n (process: any) =>\r\n process.process_id === queue.process_id\r\n )?.process_name ? (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n color: \"gray\",\r\n }}\r\n >\r\n {\"(\" +\r\n processAndQueuesList?.data?.process?.find(\r\n (process: any) =>\r\n process.process_id === queue.process_id\r\n )?.process_name +\r\n \")\"}\r\n </Typography>\r\n ) : (\r\n \"\"\r\n )}\r\n </Typography>\r\n\r\n <IconButton\r\n color=\"success\"\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleTransferCall(queue, \"QUEUE\");\r\n }}\r\n >\r\n <Call />\r\n </IconButton>\r\n </Box>\r\n )\r\n )\r\n ) : (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n margin: \"10px 0px\",\r\n color: \"gray\",\r\n }}\r\n >\r\n No Queues Found\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n {currentselecteTab === \"agents\" && (\r\n <Box sx={{ display: \"flex\", gap: 1 }}>\r\n {idleAgentsList?.data && idleAgentsList?.data?.length > 0 ? (\r\n idleAgentsList?.data?.map((agent: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n >\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {agent.name}\r\n </Typography>\r\n\r\n <IconButton\r\n color=\"success\"\r\n sx={{\r\n bgcolor: \"action.hover\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleTransferCall(agent, \"AGENT\");\r\n }}\r\n >\r\n <Call />\r\n </IconButton>\r\n </Box>\r\n ))\r\n ) : (\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n letterSpacing: \"0.02em\",\r\n textTransform: \"capitalize\",\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n margin: \"10px 0px\",\r\n color: \"gray\",\r\n }}\r\n >\r\n No Agents Found\r\n </Typography>\r\n )}\r\n </Box>\r\n )}\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function EndCallDispositionDialog({\r\n open,\r\n setOpen,\r\n onSubmitDisposition,\r\n}: any) {\r\n const [formData, setFormData] = useState({\r\n disposition: { label: \"Resolved\", value: \"RES\" },\r\n followUp: { label: \"No\", value: \"N\" },\r\n callbackDate: \"\",\r\n callbackHrs: \"\",\r\n callbackMins: \"\",\r\n });\r\n\r\n const dispositionOptions = [\r\n { label: \"Not Interested\", value: \"NI\" },\r\n { label: \"Resolved\", value: \"RES\" },\r\n ];\r\n\r\n const followUpOptions = [\r\n { label: \"Yes\", value: \"Y\" },\r\n { label: \"No\", value: \"N\" },\r\n ];\r\n const handleChange = (\r\n field: keyof typeof formData,\r\n value: { label: string } | null | string\r\n ) => {\r\n setFormData((prev) => ({ ...prev, [field]: value }));\r\n };\r\n\r\n const handleReset = () => {\r\n setFormData({\r\n disposition: { label: \"Resolved\", value: \"RES\" },\r\n followUp: { label: \"No\", value: \"N\" },\r\n callbackDate: \"\",\r\n callbackHrs: \"\",\r\n callbackMins: \"\",\r\n });\r\n };\r\n const handleClose = () => {\r\n handleReset();\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"xs\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\" m={1}>\r\n {\" \"}\r\n Call Disposition\r\n </Typography>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"10px\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n }}\r\n >\r\n <Grid container spacing={2}>\r\n {/* Disposition */}\r\n <Grid size={6}>\r\n <Autocomplete\r\n value={formData.disposition}\r\n options={dispositionOptions}\r\n getOptionLabel={(opt) => opt.label}\r\n onChange={(_, val) => handleChange(\"disposition\", val)}\r\n size=\"small\"\r\n renderInput={(params) => (\r\n <TextField {...params} label=\"Disposition\" fullWidth />\r\n )}\r\n />\r\n </Grid>\r\n\r\n <Grid size={6}>\r\n <Autocomplete\r\n options={followUpOptions}\r\n getOptionLabel={(opt) => opt.label}\r\n value={formData.followUp}\r\n onChange={(_, val) => handleChange(\"followUp\", val)}\r\n size=\"small\"\r\n renderInput={(params) => (\r\n <TextField {...params} label=\"Follow Up\" fullWidth />\r\n )}\r\n />\r\n </Grid>\r\n\r\n {/* Callback Date + Time */}\r\n {formData?.followUp?.label?.toLowerCase() === \"yes\" && (\r\n <>\r\n <Grid size={6}>\r\n <TextField\r\n size=\"small\"\r\n label=\"Callback Date\"\r\n type=\"date\"\r\n slotProps={{\r\n inputLabel: { shrink: true },\r\n }}\r\n value={formData.callbackDate}\r\n onChange={(e) =>\r\n handleChange(\"callbackDate\", e.target.value)\r\n }\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid size={6}>\r\n <TextField\r\n size=\"small\"\r\n label=\"Hours (0-23)\"\r\n type=\"text\"\r\n inputProps={{ min: 0, max: 23 }}\r\n value={formData.callbackHrs}\r\n onChange={(e) =>\r\n handleChange(\"callbackHrs\", e.target.value)\r\n }\r\n fullWidth\r\n />\r\n </Grid>\r\n\r\n <Grid size={6}>\r\n <TextField\r\n size=\"small\"\r\n label=\"Minutes (0-59)\"\r\n type=\"text\"\r\n inputProps={{ min: 0, max: 59 }}\r\n value={formData.callbackMins}\r\n onChange={(e) =>\r\n handleChange(\"callbackMins\", e.target.value)\r\n }\r\n fullWidth\r\n />\r\n </Grid>\r\n </>\r\n )}\r\n </Grid>\r\n </Box>\r\n\r\n <Box textAlign=\"right\" m={2}>\r\n <Button\r\n variant=\"outlined\"\r\n color=\"error\"\r\n size=\"large\"\r\n onClick={handleClose}\r\n sx={{\r\n px: 2,\r\n mx: 1,\r\n borderRadius: \"10px\",\r\n textTransform: \"capitalize\",\r\n }}\r\n >\r\n cancel\r\n </Button>\r\n <Button\r\n variant=\"contained\"\r\n color=\"primary\"\r\n size=\"large\"\r\n onClick={() => onSubmitDisposition(formData)}\r\n sx={{ px: 2, borderRadius: \"10px\", textTransform: \"capitalize\" }}\r\n >\r\n Submit\r\n </Button>\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function ProcessorListDialog({\r\n open,\r\n setOpen,\r\n processList = null,\r\n handleSelectedProcessor,\r\n}: any) {\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n maxWidth={\"xs\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\"> Process List</Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px 10px\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n }}\r\n >\r\n {processList?.processes?.length > 0\r\n ? processList?.processes?.map((process: any, index: any) => (\r\n <Box\r\n key={index}\r\n sx={{\r\n p: 1,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n padding: \"6px\",\r\n margin: \"10px 0px\",\r\n borderRadius: \"10px\",\r\n cursor: \"pointer\",\r\n \"&:hover\": { bgcolor: \"action.selected\" },\r\n }}\r\n onClick={() => {\r\n handleSelectedProcessor(process);\r\n }}\r\n >\r\n {/* Status */}\r\n <Typography\r\n variant=\"body1\"\r\n sx={{\r\n mx: 1,\r\n width: \"200px\",\r\n maxWidth: \"250px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n }}\r\n >\r\n <SupportAgent sx={{ marginRight: \"4px\" }} />\r\n {process.process_name}\r\n </Typography>\r\n </Box>\r\n ))\r\n : null}\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\r\n}\r\n\r\nexport function CallHistoryDialog({ open, setOpen }: any) {\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n <>\r\n <Dialog\r\n open={open}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n fullWidth\r\n maxWidth={\"md\"}\r\n >\r\n <Paper sx={{ borderRadius: 2 }}>\r\n {/* Header */}\r\n\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n padding: \"4px 16px\",\r\n boxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n }}\r\n >\r\n <Typography variant=\"body1\"> Call History</Typography>\r\n <IconButton onClick={handleClose}>\r\n <Close />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Lines */}\r\n <Box\r\n sx={{\r\n boxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n margin: \"10px\",\r\n borderRadius: \"10px\",\r\n textAlign: \"center\",\r\n fontSize: \"16px\",\r\n fontWeight: \"bold\",\r\n }}\r\n p={6}\r\n >\r\n Coming Soon...\r\n </Box>\r\n </Paper>\r\n </Dialog>\r\n </>\r\n );\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","import React, { ReactNode } from \"react\";\r\nimport { ToastProvider } from \"../services/toastMessage\";\r\n\r\nexport const SDKProvider = ({ children }: { children: ReactNode }) => {\r\n return <ToastProvider>{children}</ToastProvider>;\r\n};\r\n","import type { CallControlPanelProps } from \"../../types\";\r\n\r\nimport { CallControls } from \"./callControls\";\r\nimport { SDKProvider } from \"./SDKProvider\";\r\n\r\nexport function CallControlPanel({ onDataChange }: CallControlPanelProps) {\r\n return (\r\n <SDKProvider>\r\n <CallControls onDataChange={onDataChange} />\r\n </SDKProvider>\r\n );\r\n}\r\n"],"mappings":"s+BAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,sBAAAE,GAAA,YAAAC,GAAA,eAAAC,GAAA,cAAAC,KAAA,eAAAC,GAAAN,ICsDA,IAAMO,GAAN,KAAsD,CAAtD,cACEC,GAAA,KAAQ,SAAoC,MAC5CA,GAAA,KAAQ,WAA0B,MAClCA,GAAA,KAAQ,UAAkB,IAC1BA,GAAA,KAAQ,aAIH,CAAC,GACNA,GAAA,KAAQ,WAAoB,IAC5BA,GAAA,KAAQ,aAAyC,CAAC,GAClDA,GAAA,KAAQ,aAAoD,MAM5D,MAAM,KAAKC,EAAoD,CAC7D,KAAK,OAASC,EAAA,CACZ,UAAW,GACX,cAAe,EACf,UAAW,IACX,cAAe,KACZD,GAGL,KAAK,QACHA,EAAO,UACN,OAAO,QAAW,YAAc,OAAO,SAAS,OAAS,IAG5D,KAAK,sBAAsB,EAG3B,IAAME,EAAS,MAAM,KAAK,aAAa,EAGvC,YAAK,mBAAmB,EAExB,QAAQ,IAAI,2CAA2C,EAChDA,CACT,CAKA,eAAyB,CACvB,OAAO,KAAK,SAAW,MAAQ,KAAK,WAAa,IACnD,CAKA,WAAuC,CACrC,OAAO,KAAK,MACd,CAKA,aAA6B,CAC3B,OAAO,KAAK,QACd,CAKA,MAAc,cAAuC,CACnD,GAAI,CAAC,KAAK,OACR,MAAM,IAAI,MAAM,8BAA8B,EAGhD,GAAI,CACF,IAAMC,EAAW,MAAM,KAAK,YAAY,kBAAmB,CACzD,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,YAAa,KAAK,OAAO,MAC3B,EACA,KAAM,KAAK,UAAU,CACnB,QAAS,KAAK,OAAO,QACrB,UAAW,KAAK,OAAO,SACzB,CAAC,CACH,CAAC,EAED,GAAI,CAACA,EAAS,GACZ,MAAM,IAAI,MACR,yBAAyBA,EAAS,MAAM,IAAIA,EAAS,UAAU,EACjE,EAGF,IAAMC,EAAO,MAAMD,EAAS,KAAK,EACjC,YAAK,SAAWC,EAAK,SAGjB,KAAK,OAAO,WACd,KAAK,kBAAkB,EAElB,KAAK,QACd,OAASC,EAAO,CACd,cAAQ,MAAM,sCAAuCA,CAAK,EACpDA,CACR,CACF,CAOA,MAAM,SAASC,EAAmBC,EAAsC,CACtE,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,SAAU,CAClC,QAAQ,KAAK,gDAAiDD,CAAS,EACvE,MACF,CAEA,IAAME,EAAQ,CACZ,UAAAF,EACA,UAAAC,EACA,UAAW,KAAK,IAAI,CACtB,EAWA,GARA,KAAK,WAAW,KAAKC,CAAK,EAGtB,KAAK,WAAW,QAAU,KAAK,OAAO,WAAa,MACrD,KAAK,WAAW,MAAM,EAIpB,KAAK,SACP,GAAI,CACF,MAAM,KAAK,UAAUA,CAAK,CAC5B,OAASH,EAAO,CACd,QAAQ,KAAK,0CAA2CA,CAAK,CAC/D,CAEJ,CAKA,MAAc,UAAUG,EAIN,CAChB,GAAI,GAAC,KAAK,QAAU,CAAC,KAAK,UAE1B,GAAI,CACF,IAAML,EAAW,MAAM,KAAK,YAAY,mBAAoB,CAC1D,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,YAAa,KAAK,OAAO,MAC3B,EACA,KAAM,KAAK,UAAU,CACnB,SAAU,KAAK,SACf,UAAWK,EAAM,UACjB,UAAWA,EAAM,SACnB,CAAC,CACH,CAAC,EAED,GAAI,CAACL,EAAS,GACZ,MAAM,IAAI,MACR,wBAAwBA,EAAS,MAAM,IAAIA,EAAS,UAAU,EAChE,EAIF,IAAMM,EAAQ,KAAK,WAAW,UAC3BC,GAAMA,EAAE,YAAcF,EAAM,SAC/B,EACIC,EAAQ,IACV,KAAK,WAAW,OAAOA,EAAO,CAAC,CAEnC,OAASJ,EAAO,CACd,QAAQ,MAAM,wBAAyBA,CAAK,EAG5C,KAAK,WAAW,KAAK,IAAM,KAAK,UAAUG,CAAK,CAAC,CAClD,CACF,CAKA,MAAM,aAA6B,CACjC,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,SACxB,MAAM,IAAI,MAAM,8BAA8B,EAIhD,MAAM,KAAK,MAAM,EAEjB,GAAI,CACF,IAAML,EAAW,MAAM,KAAK,YAAY,mBAAoB,CAC1D,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,YAAa,KAAK,OAAO,MAC3B,EACA,KAAM,KAAK,UAAU,CACnB,SAAU,KAAK,QACjB,CAAC,CACH,CAAC,EAED,GAAI,CAACA,EAAS,GACZ,MAAM,IAAI,MACR,2BAA2BA,EAAS,MAAM,IAAIA,EAAS,UAAU,EACnE,EAGF,KAAK,SAAW,KAChB,KAAK,kBAAkB,EAEvB,QAAQ,IAAI,4BAA4B,CAC1C,OAASE,EAAO,CACd,cAAQ,MAAM,uBAAwBA,CAAK,EACrCA,CACR,CACF,CAKA,MAAM,OAAuB,CAC3B,GAAI,CAAC,KAAK,UAAY,KAAK,WAAW,SAAW,EAAG,OAEpD,IAAMM,EAAgB,CAAC,GAAG,KAAK,UAAU,EAEzC,QAAWH,KAASG,EAClB,MAAM,KAAK,UAAUH,CAAK,EAI5B,IAAMI,EAAa,CAAC,GAAG,KAAK,UAAU,EACtC,KAAK,WAAa,CAAC,EAEnB,QAAWC,KAAWD,EACpB,GAAI,CACF,MAAMC,EAAQ,CAChB,OAASR,EAAO,CACd,QAAQ,MAAM,gBAAiBA,CAAK,CACtC,CAEJ,CAKA,MAAc,YACZS,EACAC,EACmB,CArTvB,IAAAC,EAsTI,IAAMC,EAAU,GAAG,KAAK,OAAO,GAAGH,CAAG,GAC/BI,IAAaF,EAAA,KAAK,SAAL,YAAAA,EAAa,gBAAiB,EAEjD,QAASG,EAAU,EAAGA,GAAWD,EAAYC,IAC3C,GAAI,CAEF,OADiB,MAAM,MAAMF,EAASF,CAAO,CAE/C,OAASV,EAAO,CACd,GAAIc,IAAYD,EACd,MAAMb,EAIR,IAAMe,EAAQ,KAAK,IAAI,IAAO,KAAK,IAAI,EAAGD,EAAU,CAAC,EAAG,GAAK,EAC7D,MAAM,IAAI,QAASE,GAAY,WAAWA,EAASD,CAAK,CAAC,CAC3D,CAGF,MAAM,IAAI,MAAM,sBAAsB,CACxC,CAKQ,mBAA0B,CA9UpC,IAAAJ,EA+UI,GAAI,OAAO,QAAW,aAAe,GAACA,EAAA,KAAK,SAAL,MAAAA,EAAa,WAAW,OAE9D,IAAMM,EACJ,KAAK,OAAO,YAAc,GAAO,CAAC,EAAI,KAAK,OAAO,UAyEpD,GAtEIA,EAAgB,aAAe,IACjC,KAAK,SAAS,YAAa,CACzB,IAAK,OAAO,SAAS,KACrB,MAAO,SAAS,MAChB,SAAU,SAAS,SACnB,UAAW,UAAU,UACrB,SAAU,CACR,MAAO,OAAO,WACd,OAAQ,OAAO,WACjB,EACA,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,EAAE,MAAOjB,GAAU,QAAQ,KAAK,8BAA+BA,CAAK,CAAC,EAIpEiB,EAAgB,SAAW,IAC7B,SAAS,iBAAiB,QAAUd,GAAU,CArWpD,IAAAQ,EAsWQ,IAAMO,EAASf,EAAM,QAInBe,EAAO,UAAY,UACnBA,EAAO,UAAY,KACnBA,EAAO,SACPA,EAAO,aAAa,MAAM,IAAM,UAC/BA,aAAkB,mBAAqBA,EAAO,OAAS,WAExD,KAAK,SAAS,QAAS,CACrB,QAASA,EAAO,QAChB,MAAMP,EAAAO,EAAO,cAAP,YAAAP,EAAoB,OAAO,UAAU,EAAG,KAC9C,KAAMO,EAAO,aAAa,MAAM,EAChC,GAAIA,EAAO,GACX,UAAWA,EAAO,UAClB,KAAMA,EAAO,aAAa,MAAM,EAChC,SAAU,CACR,EAAGf,EAAM,QACT,EAAGA,EAAM,OACX,EACA,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,EAAE,MAAOH,GAAU,QAAQ,KAAK,yBAA0BA,CAAK,CAAC,CAErE,CAAC,EAICiB,EAAgB,QAAU,IAC5B,SAAS,iBAAiB,SAAWd,GAAU,CAC7C,IAAMe,EAASf,EAAM,OACfgB,EAAW,IAAI,SAASD,CAAM,EAC9BE,EAAqC,CAAC,EAG5CD,EAAS,QAAQ,CAACE,EAAOC,IAAQ,CAC/BF,EAAWE,CAAG,EAAID,EAAM,SAAS,CACnC,CAAC,EAED,KAAK,SAAS,iBAAkB,CAC9B,OAAQH,EAAO,GACf,OAAQA,EAAO,OACf,OAAQA,EAAO,OACf,OAAQ,OAAO,KAAKE,CAAU,EAC9B,WAAY,OAAO,KAAKA,CAAU,EAAE,OACpC,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,EAAE,MAAOpB,GACR,QAAQ,KAAK,mCAAoCA,CAAK,CACxD,CACF,CAAC,EAICiB,EAAgB,SAAW,GAAO,CACpC,IAAIM,EACJ,SAAS,iBAAiB,QAAUpB,GAAU,CAC5C,IAAMe,EAASf,EAAM,QAEnBe,EAAO,UAAY,SACnBA,EAAO,UAAY,YACnBA,EAAO,UAAY,YAEnB,aAAaK,CAAU,EACvBA,EAAa,WAAW,IAAM,CAraxC,IAAAZ,EAsaY,KAAK,SAAS,cAAe,CAC3B,QAASO,EAAO,QAChB,KAAMA,EAAO,aAAa,MAAM,EAChC,KAAMA,EAAO,aAAa,MAAM,EAChC,GAAIA,EAAO,GACX,cAAaP,EAAAO,EAAO,QAAP,YAAAP,EAAc,SAAU,EACrC,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,EAAE,MAAOX,GACR,QAAQ,KAAK,gCAAiCA,CAAK,CACrD,CACF,EAAG,GAAI,EAEX,CAAC,CACH,CAGA,IAAMwB,EAAmB,KAAK,IAAI,EAClC,OAAO,iBAAiB,eAAgB,IAAM,CAC5C,IAAMC,EAAkB,KAAK,IAAI,EAAID,EAErC,KAAK,SAAS,aAAc,CAC1B,IAAK,OAAO,SAAS,KACrB,gBAAiBC,EACjB,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,EAGG,KAAK,UACP,UAAU,WACR,GAAG,KAAK,OAAO,mBACf,KAAK,UAAU,CACb,SAAU,KAAK,QACjB,CAAC,CACH,CAEJ,CAAC,EAGGR,EAAgB,aAAe,IACjC,SAAS,iBAAiB,mBAAoB,IAAM,CAClD,KAAK,SAAS,mBAAoB,CAChC,OAAQ,SAAS,OACjB,gBAAiB,SAAS,gBAC1B,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,CACH,CAAC,EAICA,EAAgB,SAAW,KAC7B,OAAO,iBAAiB,QAAUd,GAAU,CAC1C,KAAK,SAAS,UAAW,CACvB,QAASA,EAAM,QACf,SAAUA,EAAM,SAChB,OAAQA,EAAM,OACd,MAAOA,EAAM,MACb,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,CACH,CAAC,EAGD,OAAO,iBAAiB,qBAAuBA,GAAU,CAne/D,IAAAQ,EAoeQ,KAAK,SAAS,qBAAsB,CAClC,QAAQA,EAAAR,EAAM,SAAN,YAAAQ,EAAc,WACtB,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,CACH,CAAC,GAKDM,EAAgB,cAAgB,IAChC,OAAO,OAAO,aAAgB,aAC9B,OAAO,YAAY,YAEnB,OAAO,iBAAiB,OAAQ,IAAM,CACpC,WAAW,IAAM,CACf,IAAMS,EAAa,OAAO,YAAY,WAChCC,EAAS,OAAO,YAAY,OAElC,KAAK,SAAS,qBAAsB,CAClC,eAAgBA,EAAO,gBACvB,SAAUA,EAAO,aAAeA,EAAO,gBACvC,SAAUA,EAAO,yBAA2BA,EAAO,gBACnD,WAAYA,EAAO,aAAeA,EAAO,yBACzC,eAAgBD,EAAW,KAC3B,cAAeA,EAAW,cAC1B,UAAW,IAAI,KAAK,EAAE,YAAY,CACpC,CAAC,CACH,EAAG,GAAI,CACT,CAAC,CAEL,CAKQ,uBAA8B,CAChC,OAAO,QAAW,cAEtB,KAAK,SAAW,UAAU,OAE1B,OAAO,iBAAiB,SAAU,IAAM,CACtC,KAAK,SAAW,GAChB,QAAQ,IAAI,mDAAmD,EAC/D,KAAK,MAAM,CACb,CAAC,EAED,OAAO,iBAAiB,UAAW,IAAM,CACvC,KAAK,SAAW,GAChB,QAAQ,IAAI,wCAAwC,CACtD,CAAC,EACH,CAKQ,oBAA2B,CA3hBrC,IAAAf,EA4hBQ,KAAK,YACP,cAAc,KAAK,UAAU,EAG/B,IAAMiB,IAAWjB,EAAA,KAAK,SAAL,YAAAA,EAAa,gBAAiB,IAC/C,KAAK,WAAa,YAAY,IAAM,CAClC,KAAK,MAAM,CACb,EAAGiB,CAAQ,CACb,CAKQ,mBAA0B,CAC5B,KAAK,aACP,cAAc,KAAK,UAAU,EAC7B,KAAK,WAAa,KAEtB,CACF,EAGaC,GAAe,IAAIpC,GAG5B,OAAO,QAAW,cACnB,OAAe,aAAeoC,IC9iBjC,IAAMC,GAAN,KAAsB,CAKpB,aAAc,CAJdC,GAAA,KAAQ,SACRA,GAAA,KAAQ,YAA+B,CAAC,GACxCA,GAAA,KAAiB,cAAc,0BAG7B,KAAK,MAAQ,KAAK,gBAAgB,EAClC,KAAK,gBAAgB,CACvB,CAEQ,iBAA4B,CAClC,MAAO,CACL,OAAQ,KACR,QAAS,KACT,QAAS,GACT,cAAe,GACf,UAAW,CACT,kBAAmB,GACnB,mBAAoB,GACpB,qBAAsB,GACtB,SAAU,CAAC,EACX,QAAS,CAAC,EACV,SAAU,CAAC,CACb,EACA,UAAW,GACX,QAAS,GACT,OAAQ,OACR,cAAe,KACf,qBAAsB,CAAE,EAAG,GAAI,EAAG,EAAG,EACrC,eAAgB,CAAE,EAAG,GAAI,EAAG,EAAG,EAC/B,SAAU,CACR,SAAU,GACV,OAAQ,GACR,KAAM,GACN,WAAY,GACZ,aAAc,EAChB,EACA,eAAgB,CACd,CACE,KAAM,EACN,OAAQ,OACR,KAAM,GACN,MAAO,GACP,OAAQ,GACR,OAAQ,GACR,YAAa,GACb,YAAa,EACf,EACA,CACE,KAAM,EACN,OAAQ,OACR,KAAM,GACN,MAAO,GACP,OAAQ,GACR,OAAQ,GACR,YAAa,GACb,YAAa,EACf,EACA,CACE,KAAM,EACN,OAAQ,OACR,KAAM,GACN,MAAO,GACP,OAAQ,GACR,OAAQ,GACR,YAAa,GACb,YAAa,EACf,EACA,CACE,KAAM,EACN,OAAQ,OACR,KAAM,GACN,MAAO,GACP,OAAQ,GACR,OAAQ,GACR,YAAa,GACb,YAAa,EACf,EACA,CACE,KAAM,EACN,OAAQ,OACR,KAAM,GACN,MAAO,GACP,OAAQ,GACR,OAAQ,GACR,YAAa,GACb,YAAa,EACf,CACF,CACF,CACF,CAEQ,iBAAwB,CAC9B,GAAI,CACF,IAAMC,EAAS,aAAa,QAAQ,KAAK,WAAW,EACpD,GAAIA,EAAQ,CACV,IAAMC,EAAc,KAAK,MAAMD,CAAM,EAErC,KAAK,MAAQE,EAAAC,EAAA,GACR,KAAK,OADG,CAEX,OAAQF,EAAY,QAAU,GAC9B,QAASA,EAAY,SAAW,GAChC,QAASA,EAAY,SAAW,KAChC,cAAeA,EAAY,eAAiB,GAC5C,UAAWA,EAAY,WAAa,CAClC,kBAAmB,GACnB,mBAAoB,GACpB,qBAAsB,GACtB,SAAU,CAAC,EACX,QAAS,CAAC,EACV,SAAU,CAAC,CACb,EACA,UAAWA,EAAY,WAAa,GACpC,QAASA,EAAY,SAAW,GAChC,OAAQA,EAAY,QAAU,OAC9B,cAAeA,EAAY,eAAiB,KAC5C,qBAAsBA,EAAY,sBAAwB,CACxD,EAAG,GACH,EAAG,EACL,EACA,eAAgBA,EAAY,gBAAkB,CAAE,EAAG,GAAI,EAAG,EAAG,EAC7D,SAAUA,EAAY,UAAY,CAChC,aAAc,GACd,gBAAiB,GACjB,SAAU,GACV,OAAQ,GACR,KAAM,GACN,WAAY,GACZ,aAAc,EAChB,EAEA,eACEA,EAAY,gBACZ,MAAM,QAAQA,EAAY,cAAc,GACxCA,EAAY,eAAe,OAAS,EAChCA,EAAY,eACZ,KAAK,MAAM,cACnB,EACF,CACF,OAASG,EAAO,CACd,QAAQ,KAAK,8CAA+CA,CAAK,CAEnE,CACF,CAEQ,eAAsB,CAC5B,GAAI,CACF,IAAMC,EAAkB,CACtB,OAAQ,KAAK,MAAM,OACnB,QAAS,KAAK,MAAM,QACpB,QAAS,KAAK,MAAM,QACpB,cAAe,KAAK,MAAM,cAC1B,UAAW,KAAK,MAAM,UACtB,UAAW,KAAK,MAAM,UACtB,QAAS,KAAK,MAAM,QACpB,OAAQ,KAAK,MAAM,OACnB,cAAe,KAAK,MAAM,cAC1B,qBAAsB,KAAK,MAAM,qBACjC,eAAgB,KAAK,MAAM,eAC3B,SAAU,KAAK,MAAM,SACrB,eAAgB,KAAK,MAAM,cAC7B,EACA,aAAa,QAAQ,KAAK,YAAa,KAAK,UAAUA,CAAe,CAAC,CACxE,OAASD,EAAO,CACd,QAAQ,KAAK,4CAA6CA,CAAK,CACjE,CACF,CAEQ,iBAAwB,CAC9B,KAAK,UAAU,QAASE,GAAaA,EAAS,CAAC,CACjD,CAEO,WACLC,EACAC,EACAC,EACM,CACN,GAAI,CAACF,GAAU,OAAOA,GAAW,UAAYA,EAAO,KAAK,EAAE,SAAW,EACpE,MAAM,IAAI,MAAM,uBAAuB,EAGzC,KAAK,MAAM,OAASA,EACpB,KAAK,MAAM,QAAUC,EACrB,KAAK,MAAM,UAAYL,EAAA,CACrB,kBAAmB,GACnB,mBAAoB,GACpB,qBAAsB,GACtB,SAAU,CAAC,EACX,QAAS,CAAC,EACV,SAAU,CAAC,GACRM,GAEL,KAAK,MAAM,cAAgB,GAC3B,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,UAAqB,CAC1B,OAAON,EAAA,GAAK,KAAK,MACnB,CAEO,UAAUG,EAAkC,CACjD,YAAK,UAAU,KAAKA,CAAQ,EACrB,IAAM,CACX,IAAMI,EAAQ,KAAK,UAAU,QAAQJ,CAAQ,EACzCI,EAAQ,IACV,KAAK,UAAU,OAAOA,EAAO,CAAC,CAElC,CACF,CAEO,WAAWC,EAA0B,CAC1C,KAAK,MAAM,UAAYA,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,SAASC,EAAwB,CACtC,KAAK,MAAM,QAAUA,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,UAAUC,EAA0B,CACzC,KAAK,MAAM,OAASA,EACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,WAAWC,EAGT,CACP,KAAK,MAAM,QAAUA,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,wBAAwBC,EAA0C,CACvE,KAAK,MAAM,qBAAuBA,EAClC,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,kBAAkBA,EAA0C,CACjE,KAAK,MAAM,eAAiBA,EAC5B,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,WAAkB,CACvB,KAAK,MAAM,cAAgB,KAAK,IAAI,EACpC,KAAK,MAAM,OAAS,UACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,SAAgB,CACrB,KAAK,MAAM,cAAgB,KAC3B,KAAK,MAAM,OAAS,OACpB,KAAK,MAAM,UAAY,GACvB,KAAK,MAAM,QAAU,GACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,eAAeC,EAA+B,CACnD,KAAK,MAAM,SAAWb,IAAA,GAAK,KAAK,MAAM,UAAaa,GACnD,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,kBAAkBC,EAAiC,CAxR5D,IAAAC,GA2RM,CAAC,KAAK,MAAM,gBACZ,CAAC,MAAM,QAAQ,KAAK,MAAM,cAAc,KAExC,QAAQ,KACN,4DACF,EACA,KAAK,MAAM,eAAiB,KAAK,gBAAgB,EAAE,gBAGrD,IAAMC,GAAqBD,EAAA,KAAK,MAAM,iBAAX,YAAAA,EAA2B,IACnDE,GACKA,EAAK,OAASH,EAAK,KACdA,EAEFG,GAGX,KAAK,MAAM,eAAiBD,EAC5B,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,sBAA6B,CAClC,KAAK,MAAM,eAAiB,KAAK,gBAAgB,EAAE,eACnD,KAAK,cAAc,EACnB,KAAK,gBAAgB,CACvB,CAEO,sBAA6B,CAClC,GAAI,CACF,aAAa,WAAW,KAAK,WAAW,EACxC,KAAK,MAAQ,KAAK,gBAAgB,EAClC,KAAK,gBAAgB,CACvB,OAASf,EAAO,CACd,QAAQ,KAAK,gCAAiCA,CAAK,CACrD,CACF,CAGO,cAAqB,CAC1B,GAAI,CACF,IAAMJ,EAAS,aAAa,QAAQ,KAAK,WAAW,EACpD,QAAQ,IAAI,6BAA8BA,CAAM,EAC5CA,GACF,QAAQ,IAAI,4BAA6B,KAAK,MAAMA,CAAM,CAAC,EAE7D,QAAQ,IAAI,iBAAkB,KAAK,KAAK,CAC1C,OAASI,EAAO,CACd,QAAQ,MAAM,2BAA4BA,CAAK,CACjD,CACF,CAEO,oBAA4C,CACjD,OAAO,KAAK,MAAM,gBAAkB,CAAC,CACvC,CACF,EAGaiB,EAAkB,IAAIvB,GCrVnC,IAAAwB,GAAsC,iBCA/B,IAAMC,GAAK,eACLC,EAAW,UAAUD,EAAE,QACvBE,GAAc,QAAQF,EAAE,QACxBG,EAAU,CACrB,GAAI,SACN,EAEaC,EAAY,CACvB,MAAO,GAAGH,CAAQ,GAAGE,EAAQ,EAAE,6BAC/B,YAAa,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,mCACrC,mBAAoB,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,2CAC5C,cAAe,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,6BACvC,UAAW,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,kCACnC,UAAW,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,kCACnC,YAAa,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,mCACrC,SAAU,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,iCAClC,OAAQ,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,8BAEhC,gBAAiB,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,wCACzC,gCAAiC,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,6CACzD,gCAAiC,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,6CACzD,oBAAqB,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,+CAC7C,wBAAyB,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,mDACjD,cAAe,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,sCAEvC,YAAa,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,aACrC,aAAc,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,sBACtC,oBAAqB,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,2CAE7C,aAAc,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,0BACtC,qBAAsB,GAAGF,CAAQ,GAAGE,EAAQ,EAAE,+BAChD,EAEaE,GAAe,CAC1B,GAAI,GAAGH,EAAW,GAAGC,EAAQ,EAAE,SACjC,ECnCA,IAAAG,GAAkB,qBAOlB,IAAMC,GAAQ,QAmBRC,GAAgB,GAAAC,QAAM,OAAO,CACjC,QAASC,EACT,QAAS,CACP,eAAgB,mBAChB,cAAeH,EACjB,EACA,QAAS,GACX,CAAC,EASDC,GAAc,aAAa,QAAQ,IAChCG,GAAW,CACV,IAAMJ,EAAQ,QACd,OAAIA,GAASI,EAAO,UAClBA,EAAO,QAAQ,cAAgB,UAAUJ,CAAK,IAEzCI,CACT,EAKCC,GACC,QAAQ,OAAOA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC,CAC5E,EASAJ,GAAc,aAAa,SAAS,IACjCK,GAAaA,EACd,MAAOD,GAAU,CAnEnB,IAAAE,EAoEI,IAAMC,EAAkBH,EAAM,OAG9B,QAAIE,EAAAF,EAAM,WAAN,YAAAE,EAAgB,UAAW,KAAO,CAACC,EAAgB,SACrDA,EAAgB,OAAS,IAKpB,QAAQ,OACbH,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAC1D,CACF,CACF,EAMA,IAAOI,GAAQR,GFvEf,IAAMS,GAAY,IAAM,CACtB,GAAM,CAACC,EAASC,CAAU,KAAI,aAAS,EAAK,EACtC,CAACC,EAASC,CAAU,KAAI,aAAS,EAAK,EACtC,CAACC,EAASC,CAAU,KAAI,aAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,KAAI,aAAS,IAAI,EACjC,CAACC,EAAMC,CAAO,KAAI,aAAS,IAAI,EAqCrC,MAAO,CACL,UA/BmB,gBAAY,SAAY,CA5B/C,IAAAC,EA6BI,IAAMC,EAAQ,KAAK,OACjBD,EAAA,aAAa,QAAQ,wBAAwB,IAA7C,KAAAA,EAAkD,EACpD,EACAT,EAAW,EAAI,EACf,IAAMW,EAAyB,CAC7B,OAAQ,aACR,OAAQD,EAAM,SAAW,EAC3B,EAEA,OAAOE,GACJ,KAAKC,EAAU,OAAQF,CAAO,EAC9B,KAAMG,IACLC,EAAgB,qBAAqB,EACrC,aAAa,MAAM,EACnB,eAAe,MAAM,EACrBP,EAAQM,GAAA,YAAAA,EAAK,IAAI,EACjBZ,EAAW,EAAI,EACRY,GAAA,YAAAA,EAAK,KACb,EACA,MAAOE,GAAQ,CAhDtB,IAAAP,EAiDQ,OAAAL,EAAW,EAAI,EACfE,EAASU,CAAG,GACLP,EAAAO,GAAA,YAAAA,EAAK,WAAL,YAAAP,EAAe,IACxB,CAAC,EACA,QAAQ,IAAM,CACbT,EAAW,EAAK,CAClB,CAAC,CACL,EAAG,CAAC,CAAC,EAIH,UAAWD,EACX,UAAWE,EACX,QAASE,EACT,MAAOE,EACP,KAAME,CACR,CACF,EAEOU,GAAQnB,GGpEf,IAAAoB,GAAsC,iBAwB/B,IAAMC,GAAa,IAAM,CAC9B,GAAM,CAACC,EAASC,CAAU,KAAI,aAAS,EAAK,EACtC,CAACC,EAASC,CAAU,KAAI,aAAS,EAAK,EACtC,CAACC,EAASC,CAAU,KAAI,aAAS,EAAK,EACtC,CAACC,EAAOC,CAAQ,KAAI,aAAS,IAAI,EACjC,CAACC,EAAMC,CAAO,KAAI,aAAS,IAAI,EAuDrC,MAAO,CACL,iBAjDoB,gBACpB,MAAOD,GAMD,CA3CV,IAAAE,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAAAC,EAAAC,EAAAC,GAAAC,GAAAC,EA4CM,IAAMC,EAAQ,KAAK,OACjBf,EAAA,aAAa,QAAQ,wBAAwB,IAA7C,KAAAA,EAAkD,EACpD,EACAT,EAAW,EAAI,EACf,IAAMyB,EAAU,CACd,OAAQ,UACR,OAAQD,GAAA,YAAAA,EAAO,QACf,WAAWZ,GAAAD,GAAAD,EAAAc,GAAA,YAAAA,EAAO,UAAP,YAAAd,EAAgB,aAAhB,YAAAC,EAA4B,aAA5B,KAAAC,EAA0C,GACrD,cAAcE,GAAAD,EAAAW,GAAA,YAAAA,EAAO,UAAP,YAAAX,EAAgB,eAAhB,KAAAC,EAAgC,GAC9C,iBAAiBE,IAAAD,EAAAS,GAAA,YAAAA,EAAO,WAAP,YAAAT,EAAiB,YAAjB,KAAAC,GAA8B,GAC/C,eAAeE,IAAAD,EAAAO,GAAA,YAAAA,EAAO,WAAP,YAAAP,EAAiB,eAAjB,KAAAC,GAAiC,GAEhD,aAAaC,EAAAZ,GAAA,YAAAA,EAAM,cAAN,KAAAY,EAAqB,MAClC,cAAcC,EAAAb,GAAA,YAAAA,EAAM,WAAN,KAAAa,EAAkB,IAChC,eAAeC,GAAAd,GAAA,YAAAA,EAAM,eAAN,KAAAc,GAAsB,GACrC,cAAcC,GAAAf,GAAA,YAAAA,EAAM,cAAN,KAAAe,GAAqB,GACnC,eAAeC,EAAAhB,GAAA,YAAAA,EAAM,eAAN,KAAAgB,EAAsB,GACrC,aAAc,OAChB,EAEA,OAAOG,GACJ,KAAKC,EAAU,SAAUF,CAAO,EAChC,KAAMG,IACLC,EAAgB,QAAQ,EACxBrB,EAAQoB,GAAA,YAAAA,EAAK,IAAI,EACjB1B,EAAW,EAAI,EACR0B,GAAA,YAAAA,EAAK,KACb,EACA,MAAOE,GAAQ,CAxExB,IAAArB,EAyEU,OAAAL,EAAW,EAAI,EACfE,EAASwB,CAAG,GACLrB,EAAAqB,GAAA,YAAAA,EAAK,WAAL,YAAArB,EAAe,IACxB,CAAC,EACA,QAAQ,IAAM,CACbT,EAAW,EAAK,CAClB,CAAC,CACL,EACA,CAAC,CACH,EAIE,UAAWD,EACX,UAAWE,EACX,QAASE,EACT,MAAOE,EACP,KAAME,CACR,CACF,EC5FA,IAAAwB,EAiBO,+BACPC,EAcO,yBACPC,EAAgE,iBChChE,IAAAC,GAAgF,iBAsEzE,SAASC,GACfC,EACAC,EACqB,CAErB,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAmBH,CAAe,EAG5D,CAACI,EAAYC,CAAa,KAAI,aAAS,EAAK,EAG5CC,KAAU,WAAuB,EAGjCC,KAAY,WAAiB,CAAE,EAAG,EAAG,EAAG,CAAE,CAAC,EAG3CC,KAAe,WAAiB,CAAE,EAAG,EAAG,EAAG,CAAE,CAAC,EAM9CC,KAAiB,gBACrBC,GAA0B,CAC1B,IAAMC,EAAUL,EAAQ,QACxB,GAAI,CAACK,EAAS,OAEd,IAAMC,EAAOD,EAAQ,sBAAsB,EACrCE,EAAgB,OAAO,WACvBC,EAAiB,OAAO,YAExBC,EAAsB,CAC3B,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIL,EAAY,EAAGG,EAAgBD,EAAK,KAAK,CAAC,EAClE,EAAG,KAAK,IAAI,EAAG,KAAK,IAAIF,EAAY,EAAGI,EAAiBF,EAAK,MAAM,CAAC,CACrE,EAEAT,EAAYY,CAAmB,EAC/Bd,GAAA,MAAAA,EAAmBc,EACpB,EACA,CAACd,CAAgB,CAClB,EAKMe,KAAc,gBACnB,CAACC,EAAiBC,IAAoB,CACrCb,EAAc,EAAI,EAClBE,EAAU,QAAU,CAAE,EAAGU,EAAS,EAAGC,CAAQ,EAC7CV,EAAa,QAAUN,EAGvB,IAAMiB,EAAa,CAACC,EAAqBC,IAAwB,CAChE,IAAMC,GAASF,EAAcb,EAAU,QAAQ,EACzCgB,EAASF,EAAcd,EAAU,QAAQ,EAE/CE,EAAe,CACd,EAAGD,EAAa,QAAQ,EAAIc,GAC5B,EAAGd,EAAa,QAAQ,EAAIe,CAC7B,CAAC,CACF,EAGMC,EAAmBC,GAA6B,CACrDA,EAAE,eAAe,EACjBN,EAAWM,EAAE,QAASA,EAAE,OAAO,CAChC,EAGMC,EAAmBD,GAA6B,CACrDA,EAAE,eAAe,EACjB,IAAME,EAAQF,EAAE,QAAQ,CAAC,EACrBE,GACHR,EAAWQ,EAAM,QAASA,EAAM,OAAO,CAEzC,EAGMC,EAAY,IAAM,CACvBvB,EAAc,EAAK,EACnB,SAAS,oBAAoB,YAAamB,CAAe,EACzD,SAAS,oBAAoB,UAAWI,CAAS,EACjD,SAAS,oBAAoB,YAAaF,CAAe,EACzD,SAAS,oBAAoB,WAAYE,CAAS,CACnD,EAGA,SAAS,iBAAiB,YAAaJ,CAAe,EACtD,SAAS,iBAAiB,UAAWI,CAAS,EAC9C,SAAS,iBAAiB,YAAaF,EAAiB,CACvD,QAAS,EACV,CAAC,EACD,SAAS,iBAAiB,WAAYE,CAAS,CAChD,EACA,CAAC1B,EAAUO,CAAc,CAC1B,EAKMoB,KAAkB,gBACtBJ,GAAkC,CAClCA,EAAE,eAAe,EACjBT,EAAYS,EAAE,QAASA,EAAE,OAAO,CACjC,EACA,CAACT,CAAW,CACb,EAKMc,KAAmB,gBACvBL,GAAkC,CAClCA,EAAE,eAAe,EACjB,IAAME,EAAQF,EAAE,QAAQ,CAAC,EACrBE,GACHX,EAAYW,EAAM,QAASA,EAAM,OAAO,CAE1C,EACA,CAACX,CAAW,CACb,EAEA,MAAO,CACN,SAAAd,EACA,WAAAE,EACA,QAAAE,EACA,gBAAAuB,EACA,iBAAAC,CACD,CACD,CCzMA,IAAAC,GAAoC,iBA8B7B,SAASC,IAAwB,CAKtC,GAAM,CAACC,EAAOC,CAAQ,KAAI,aAAmBC,EAAgB,SAAS,CAAC,EAOvE,uBAAU,IAEYA,EAAgB,UAAU,IAAM,CAElDD,EAASC,EAAgB,SAAS,CAAC,CACrC,CAAC,EAIA,CAAC,CAAC,EAKEF,CACT,CCvDA,IAAAG,GAAwC,iBCFxC,IAAAC,GAA+D,iBAC/DC,GAA4C,yBA0B1CC,GAAA,6BApBIC,MAAe,kBAA4C,MAAS,EAE7DC,GAAW,IAAM,CAC7B,IAAMC,KAAM,eAAWF,EAAY,EACnC,GAAI,CAACE,EAAK,MAAM,IAAI,MAAM,4CAA4C,EACtE,OAAOA,CACR,EAEaC,GAAgB,CAAC,CAAE,SAAAC,CAAS,IAA+B,CACvE,GAAM,CAACC,EAAMC,CAAO,KAAI,aAAS,EAAK,EAChC,CAACC,EAASC,CAAU,KAAI,aAAS,EAAE,EACnC,CAACC,EAAUC,CAAW,KAAI,aAAqB,MAAM,EAErDC,EAAY,CAACC,EAAaC,EAAkB,SAAW,CAC5DL,EAAWI,CAAG,EACdF,EAAYG,CAAG,EACfP,EAAQ,EAAI,CACb,EAEA,SACC,SAACN,GAAa,SAAb,CAAsB,MAAO,CAAE,UAAAW,CAAU,EACxC,UAAAP,KACD,QAAC,aACA,KAAMC,EACN,MAAOI,EACP,iBAAkB,IAClB,QAAS,IAAMH,EAAQ,EAAK,EAC5B,aAAc,CAAE,SAAU,MAAO,WAAY,OAAQ,EAErD,oBAAC,UACA,QAAQ,SAER,SAAUG,EACV,QAAS,IAAMH,EAAQ,EAAK,EAC5B,GAAI,CAAE,MAAO,MAAO,EAEnB,SAAAC,EACF,EACD,GACD,CAEF,EDhCA,IAAMO,GAAe,CACpB,UAAW,GACX,UAAW,GACX,QAAS,GACT,MAAO,KACP,KAAM,IACP,EAEMC,GAAU,CAACC,EAA4BC,IAA2C,CACvF,GAAIA,EAAO,OAAS,YACnB,OAAOC,EAAAC,EAAA,GACHH,GADG,CAEN,UAAWC,EAAO,OACnB,GACM,GAAIA,EAAO,OAAS,YAC1B,OAAOC,EAAAC,EAAA,GACHH,GADG,CAEN,UAAW,GACX,KAAMC,EAAO,OACd,GACM,GAAIA,EAAO,OAAS,UAC1B,OAAOC,EAAAC,EAAA,GACHH,GADG,CAEN,QAAS,GACT,MAAOC,EAAO,OACf,GACM,GAAIA,EAAO,OAAS,QAC1B,MAAO,CACN,UAAW,GACX,UAAW,GACX,QAAS,GACT,MAAO,KACP,KAAM,IACP,EAED,MAAM,MAAM,iBAAiB,CAC9B,EAkLO,IAAMG,GAAiB,CAI7BC,EAAwB,CAAC,IAQrB,CAIJ,GAAM,CAAE,UAAAC,EAAY,KAAM,QAAAC,EAAU,IAAK,EAAIF,EAKvC,CAAE,UAAAG,CAAU,EAAIC,GAAS,EAKzB,CAACC,EAAOC,CAAQ,KAAI,eAAWC,GAASC,EAAY,EAiH1D,MAAO,IAxGa,gBACnB,CAACC,EAAaC,EAAYC,EAAS,CAAC,IAAM,CAIzCL,EAAS,CACR,KAAM,YACN,QAAS,EACV,CAAC,EAKDM,GACE,KAAKH,EAAKC,EAASC,CAAM,EACzB,KAAME,GAAQ,CAxRnB,IAAAC,EAAAC,EA8RKT,EAAS,CACR,KAAM,YACN,QAASO,EAAI,IACd,CAAC,EAMDZ,GAAA,MAAAA,EAAYY,EAAI,KAAMH,GACtB,QAAQ,KAAII,EAAAD,EAAI,OAAJ,YAAAC,EAAU,QAAS,OAAO,EACtCX,GAAUY,EAAAF,EAAI,OAAJ,YAAAE,EAAU,QAAS,SAAS,CAuBvC,CAAC,EACA,MAAOC,GAAQ,CAjUpB,IAAAF,EAAAC,EAAAE,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAqUK,IAAMC,EAAQ,CACb,QAAQZ,GAAAD,EAAAE,EAAI,WAAJ,YAAAF,EAAc,SAAd,KAAAC,EAAwB,IAChC,UACCG,GAAAD,EAAAD,EAAI,WAAJ,YAAAC,EAAc,OAAd,YAAAC,EAAoB,WACpBE,GAAAD,EAAAH,EAAI,WAAJ,YAAAG,EAAc,OAAd,YAAAC,EAAoB,UACpBJ,EAAI,SACJ,4BACD,MAAMM,GAAAD,EAAAL,EAAI,WAAJ,YAAAK,EAAc,OAAd,KAAAC,EAAsB,KAC5B,YAAYE,IAAAD,EAAAP,EAAI,WAAJ,YAAAO,EAAc,aAAd,KAAAC,GAA4B,GACxC,MAAMC,EAAAT,GAAA,YAAAA,EAAK,OAAL,KAAAS,EAAa,GACnB,MAAMC,GAAAV,GAAA,YAAAA,EAAK,OAAL,KAAAU,GAAa,EACpB,EAKAvB,EAAUwB,EAAM,QAAS,OAAO,EAKhCrB,EAAS,CACR,KAAM,UACN,QAASqB,CACV,CAAC,EAKDzB,GAAA,MAAAA,EAAUyB,EAAOjB,EAClB,CAAC,EACA,QAAQ,IAAM,CACdJ,EAAS,CACR,KAAM,YACN,QAAS,EACV,CAAC,CACF,CAAC,CACH,EACA,CAACL,EAAWC,EAASC,CAAS,CAC/B,EAKqBE,CAAK,CAC3B,EEjXA,IAAAuB,EAWO,+BACPC,EAmBO,yBACPC,GAA2C,iBCjC3C,IAAAC,GAAkC,yBAElC,IAAMC,GAAY,CAAC,CACjB,SAAAC,EACA,QAAAC,EACA,SAAAC,CACF,IAQK,CACH,IAAMC,KAAQ,aAAS,EACvB,MAAO,CACL,SAAUC,EAAA,CACR,QAAS,MACT,OAAQ,MACR,SAAU,kBACV,aAAc,OACd,OAAQ,+BACR,OAAQ,OACR,UAAW,CACT,UAAW,mCACX,OAAQ,aAAaD,EAAM,QAAQ,QAAQ,IAAI,EACjD,EACA,WAAY,CACV,QAAS,eACT,UAAW,sBAAsBA,EAAM,QAAQ,QAAQ,KAAK,EAC9D,GACGH,GAEL,QAASI,EAAA,CACP,QAAS,MACT,OAAQ,MACR,SAAU,kBACV,aAAc,OACd,UAAW,oCACX,OAAQ,aAAaD,EAAM,QAAQ,QAAQ,IAAI,GAC/C,OAAQ,OACR,UAAW,CACT,UAAW,oCACX,OAAQ,aAAaA,EAAM,QAAQ,QAAQ,IAAI,EACjD,EACA,WAAY,CACV,QAAS,eACT,UAAW,sBAAsBA,EAAM,QAAQ,QAAQ,KAAK,EAC9D,GACGF,GAEL,SAAUG,EAAA,CACR,QAAS,MACT,OAAQ,MACR,SAAU,kBACV,aAAc,OACd,gBAAiBD,EAAM,QAAQ,KAAK,GAAG,EACvC,UAAW,eAAeA,EAAM,QAAQ,QAAQ,KAAK,GACrD,OAAQ,aAAaA,EAAM,QAAQ,QAAQ,IAAI,GAC/C,OAAQ,OACR,UAAW,CACT,UAAW,eAAeA,EAAM,QAAQ,QAAQ,IAAI,GACpD,OAAQ,aAAaA,EAAM,QAAQ,QAAQ,IAAI,EACjD,EACA,WAAY,CACV,QAAS,eACT,UAAW,sBAAsBA,EAAM,QAAQ,QAAQ,KAAK,EAC9D,GACGD,EAEP,CACF,EAEOG,GAAQN,GDgLT,IAAAO,EAAA,6BArMAC,GAAqB,CAAC,CAAE,KAAAC,CAAK,IAAW,CArD9C,IAAAC,GAAAC,EAAAC,EAAAC,GAAAC,GAsDE,IAAMC,EAAQC,GAAY,EACpB,CAAE,UAAAC,CAAU,EAAIC,GAAS,EACzB,CAAE,SAAAC,EAAU,QAAAC,EAAS,SAAAC,CAAS,EAAIC,GAAU,CAChD,WAAUZ,GAAAK,EAAM,YAAN,YAAAL,GAAiB,WAAY,CAAC,EACxC,UAASC,EAAAI,EAAM,YAAN,YAAAJ,EAAiB,UAAW,CAAC,EACtC,WAAUC,EAAAG,EAAM,YAAN,YAAAH,EAAiB,WAAY,CAAC,CAC1C,CAAC,EACKW,KAAQ,YAAS,EAGjB,CAACC,EAAqBC,CAAsB,KAAI,aAAS,EAAK,EAC9D,CAACC,EAAqBC,CAAsB,KAAI,aAAS,EAAK,EAC9D,CAACC,EAA4BC,CAA6B,KAC9D,aAAS,EAAK,EACV,CAACC,EAA4BC,CAA6B,KAC9D,aAAS,EAAK,EACV,CAACC,EAAmBC,CAAoB,KAAI,aAAS,EAAK,EAE1DC,EAAyB,CAACC,EAA2BC,IAAc,CACvEC,EAAgB,kBAAkBC,IAAA,GAAKH,GAASC,EAAM,CACxD,EAEMG,EAAwB,CAACJ,EAA2BC,IAAc,CA5E1E,IAAA1B,EAAAC,EAAAC,EAAAC,EA6EI,IAAM2B,EAAYF,IAAA,GAAKH,GAASC,GAChCX,EAAuB,EAAI,EAC3B,IAAMgB,EAAU,CACd,OAAQ,sBACR,UAAW,OAAOD,EAAU,IAAI,GAChC,UAAW,OAAOA,EAAU,IAAI,EAChC,cAAeA,EAAU,MACzB,QAAQ7B,GAAAD,EAAAK,EAAM,WAAN,YAAAL,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,SAASE,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,eAAhB,KAAAC,EAAgC,EAC3C,EAEA6B,GACG,KAAKC,EAAU,gBAAiBF,CAAO,EACvC,KAAMG,GAAQ,CA1FrB,IAAAlC,EA2FQO,GAAUP,EAAAkC,EAAI,OAAJ,YAAAlC,EAAU,QAAS,SAAS,EACtC2B,EAAgB,kBAAkBC,IAAA,GAAKH,GAASC,EAAM,CACxD,CAAC,EACA,MAAOS,GAAQ,CA9FtB,IAAAnC,EAAAC,EAAAC,EAAAC,EA+FQ,IAAMiC,IACJnC,GAAAD,EAAAmC,EAAI,WAAJ,YAAAnC,EAAc,OAAd,YAAAC,EAAoB,WACpBE,GAAAD,EAAAiC,EAAI,WAAJ,YAAAjC,EAAc,OAAd,YAAAC,EAAoB,UACpBgC,EAAI,SACJ,4BACF5B,EAAU6B,EAAS,OAAO,CAC5B,CAAC,EACA,QAAQ,IAAM,CACbrB,EAAuB,EAAK,CAC9B,CAAC,CACL,EAEMsB,EAAwB,CAACZ,EAA2BC,IAAc,CA3G1E,IAAA1B,EAAAC,EAAAC,EAAAC,EA4GI,IAAM2B,EAAYF,IAAA,GAAKH,GAASC,GAChCT,EAAuB,EAAI,EAC3B,IAAMc,EAAU,CACd,OAAQ,sBACR,UAAW,aACX,UAAW,OAAOD,EAAU,IAAI,EAChC,cAAeA,EAAU,MACzB,QAAQ7B,GAAAD,EAAAK,EAAM,WAAN,YAAAL,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,SAASE,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,eAAhB,KAAAC,EAAgC,EAC3C,EAEA6B,GACG,KAAKC,EAAU,gBAAiBF,CAAO,EACvC,KAAMG,GAAQ,CAzHrB,IAAAlC,EA0HQO,GAAUP,EAAAkC,EAAI,OAAJ,YAAAlC,EAAU,QAAS,SAAS,EACtC2B,EAAgB,kBAAkBC,IAAA,GAAKH,GAASC,EAAM,CACxD,CAAC,EACA,MAAOS,GAAQ,CA7HtB,IAAAnC,EAAAC,EAAAC,EAAAC,EA8HQ,IAAMiC,IACJnC,GAAAD,EAAAmC,EAAI,WAAJ,YAAAnC,EAAc,OAAd,YAAAC,EAAoB,WACpBE,GAAAD,EAAAiC,EAAI,WAAJ,YAAAjC,EAAc,OAAd,YAAAC,EAAoB,UACpBgC,EAAI,SACJ,4BACF5B,EAAU6B,EAAS,OAAO,CAC5B,CAAC,EACA,QAAQ,IAAM,CACbnB,EAAuB,EAAK,CAC9B,CAAC,CACL,EAEMqB,EAA+B,CACnCb,EACAC,EACAa,IACG,CA9IP,IAAAvC,EAAAC,EAAAC,EAAAC,EA+II,IAAM2B,EAAYF,IAAA,GAAKH,GAASC,GAChCP,EAA8B,EAAI,EAClC,IAAMY,EAAU,CACd,OAAQ,sBACR,UAAWQ,EACX,gBACEA,IAAS,WACL,OAAOT,EAAU,IAAI,GACrB,SAASA,EAAU,IAAI,GAC7B,QAAQ7B,GAAAD,EAAAK,EAAM,WAAN,YAAAL,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,SAASE,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,eAAhB,KAAAC,EAAgC,EAC3C,EAEA6B,GACG,KAAKC,EAAU,gCAAiCF,CAAO,EACvD,KAAMG,GAAQ,CA9JrB,IAAAlC,EA+JQO,GAAUP,EAAAkC,EAAI,OAAJ,YAAAlC,EAAU,QAAS,SAAS,EACtC2B,EAAgB,kBAAkBC,IAAA,GAAKH,GAASC,EAAM,CACxD,CAAC,EACA,MAAOS,GAAQ,CAlKtB,IAAAnC,EAAAC,EAAAC,EAAAC,GAmKQ,IAAMiC,IACJnC,GAAAD,EAAAmC,EAAI,WAAJ,YAAAnC,EAAc,OAAd,YAAAC,EAAoB,WACpBE,IAAAD,EAAAiC,EAAI,WAAJ,YAAAjC,EAAc,OAAd,YAAAC,GAAoB,UACpBgC,EAAI,SACJ,4BACF5B,EAAU6B,EAAS,OAAO,CAC5B,CAAC,EACA,QAAQ,IAAM,CACbjB,EAA8B,EAAK,CACrC,CAAC,CACL,EAEMqB,GAA+B,CACnCf,EACAC,EACAa,IACG,CAnLP,IAAAvC,EAAAC,EAAAC,EAAAC,EAoLI,IAAM2B,EAAYF,IAAA,GAAKH,GAASC,GAChCL,EAA8B,EAAI,EAClC,IAAMU,EAAU,CACd,OAAQ,sBACR,UAAWQ,EACX,WACEA,IAAS,WAAa,OAAOT,EAAU,IAAI,GAAK,OAAOA,EAAU,IAAI,GACvE,QAAQ7B,GAAAD,EAAAK,EAAM,WAAN,YAAAL,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,cAAe6B,EAAU,MACzB,SAAS3B,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,eAAhB,KAAAC,EAAgC,EAC3C,EAEA6B,GACG,KAAKC,EAAU,gCAAiCF,CAAO,EACvD,KAAMG,GAAQ,CAlMrB,IAAAlC,EAmMQO,GAAUP,EAAAkC,EAAI,OAAJ,YAAAlC,EAAU,QAAS,SAAS,EACtC2B,EAAgB,kBAAkBC,IAAA,GAAKH,GAASC,EAAM,CACxD,CAAC,EACA,MAAOS,GAAQ,CAtMtB,IAAAnC,EAAAC,EAAAC,EAAAC,GAuMQ,IAAMiC,IACJnC,GAAAD,EAAAmC,EAAI,WAAJ,YAAAnC,EAAc,OAAd,YAAAC,EAAoB,WACpBE,IAAAD,EAAAiC,EAAI,WAAJ,YAAAjC,EAAc,OAAd,YAAAC,GAAoB,UACpBgC,EAAI,SACJ,4BACF5B,EAAU6B,EAAS,OAAO,CAC5B,CAAC,EACA,QAAQ,IAAM,CACbf,EAA8B,EAAK,CACrC,CAAC,CACL,EAEMoB,EAAsB,CAAChB,EAA2BC,IAAc,CAnNxE,IAAA1B,EAAAC,EAAAC,EAAAC,EAoNI,IAAM2B,EAAYF,IAAA,GAAKH,GAASC,GAChCH,EAAqB,EAAI,EACzB,IAAMQ,EAAU,CACd,OAAQ,sBACR,UAAW,iBACX,UAAW,OAAOD,EAAU,KAAO,CAAC,EACpC,UAAW,aAAaA,EAAU,KAAO,CAAC,GAC1C,cAAeA,EAAU,MACzB,QAAQ7B,GAAAD,EAAAK,EAAM,WAAN,YAAAL,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,SAASE,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,eAAhB,KAAAC,EAAgC,EAC3C,EAEA6B,GACG,KAAKC,EAAU,oBAAqBF,CAAO,EAC3C,KAAMG,GAAQ,CAlOrB,IAAAlC,EAmOQO,GAAUP,EAAAkC,EAAI,OAAJ,YAAAlC,EAAU,QAAS,SAAS,EACtC2B,EAAgB,kBAAkBC,IAAA,GAAKH,GAASC,EAAM,CACxD,CAAC,EACA,MAAOS,GAAQ,CAtOtB,IAAAnC,EAAAC,EAAAC,EAAAC,EAuOQ,IAAMiC,IACJnC,GAAAD,EAAAmC,EAAI,WAAJ,YAAAnC,EAAc,OAAd,YAAAC,EAAoB,WACpBE,GAAAD,EAAAiC,EAAI,WAAJ,YAAAjC,EAAc,OAAd,YAAAC,EAAoB,UACpBgC,EAAI,SACJ,4BACF5B,EAAU6B,EAAS,OAAO,CAC5B,CAAC,EACA,QAAQ,IAAM,CACbb,EAAqB,EAAK,CAC5B,CAAC,CACL,EAEA,SACE,QAAC,YAEC,GAAI,CACF,OAAQ,gBACV,EAEA,oBAAC,aACC,GAAI,CACF,QAAS,KAEX,EAEA,oBAAC,cAAW,mBAAMpB,GAAAJ,GAAA,YAAAA,EAAM,OAAN,KAAAI,GAAc,GAAG,MAAE,EACvC,KACA,OAAC,aACC,GAAI,CACF,QAAS,KAEX,EAEA,mBAAC,cACC,QAAQ,QACR,GAAI,CACF,GAAI,EAEJ,aAAc,OAEd,MAAO,OACP,SAAU,OACZ,EAEC,UAAAC,GAAAL,GAAA,YAAAA,EAAM,SAAN,KAAAK,GAAgB,GACnB,EACF,KACA,OAAC,aACC,GAAI,CACF,QAAS,KAEX,EAEA,mBAAC,UACC,GAAI,CACF,cAAe,YACjB,EACA,KAAK,QAEL,mBAAC,cAAW,QAAQ,QACjB,UAAAL,GAAA,YAAAA,EAAM,QAAS,EAAI,WAAa,WACnC,EACF,EACF,KACA,OAAC,aACC,GAAI,CACF,QAAS,KAEX,EAEA,mBAAC,aACC,KAAK,QACL,YAAY,eACZ,OAAOA,GAAA,YAAAA,EAAM,QAAS,GACtB,UAAUA,GAAA,YAAAA,EAAM,QAAS,EACzB,SAAW2C,GAAM,CACflB,EAAuBzB,EAAM,CAAE,MAAO2C,EAAE,OAAO,KAAM,CAAC,CACxD,EACF,EACF,KACA,OAAC,aACC,GAAI,CACF,QAAS,KAEX,EAEA,oBAAC,OACC,GAAI,CACF,QAAS,OACT,WAAY,SACZ,eAAgB,cAClB,EAIA,oBAAC,WAAQ,MAAM,OACb,mBAAC,UACC,QAAS3C,GAAA,MAAAA,EAAM,YAAc,WAAa,YAC1C,MAAM,UACN,GACEA,GAAA,MAAAA,EAAM,YACF6B,EAAA,GAAKnB,GACLkC,EAAAf,EAAA,GACKlB,GADL,CAEE,OAAQ,aAAaG,EAAM,QAAQ,QAAQ,KAAK,GAChD,UAAW,CACT,QAAS,gBACT,UAAW,eAAeA,EAAM,QAAQ,QAAQ,KAAK,GACrD,OAAQ,aAAaA,EAAM,QAAQ,QAAQ,KAAK,EAClD,EACA,WAAY,CACV,QAAS,gBACT,UAAW,sBAAsBA,EAAM,QAAQ,QAAQ,KAAK,EAC9D,CACF,GAEN,QAAS,IAAM,CACbgB,EAAsB9B,EAAM,CAC1B,YAAa,GACb,OAAQ,QACV,CAAC,CACH,EACA,UAAUA,GAAA,YAAAA,EAAM,cAAee,EAE9B,SAAAA,KACC,OAAC,oBAAiB,KAAK,OAAO,MAAM,UAAU,KAE9C,OAAC,QACC,GAAI,CAAE,MAAOf,GAAA,MAAAA,EAAM,YAAc,UAAY,WAAY,EAC3D,EAEJ,EACF,KAEA,OAAC,WAAQ,MAAM,aACb,mBAAC,UACC,QAASA,GAAA,MAAAA,EAAM,YAAc,YAAc,WAC3C,GACEA,GAAA,MAAAA,EAAM,cAAeA,GAAA,MAAAA,EAAM,aACvB6B,EAAA,GAAKnB,GACLV,GAAA,MAAAA,EAAM,YACJ6B,EAAA,GAAKjB,GACLiB,EAAA,GAAKnB,GAEb,QAAS,IAAM,CACb4B,EAAsBtC,EAAM,CAC1B,YAAa,GACb,OAAQ,QACV,CAAC,CACH,EACA,SAAU,EAACA,GAAA,MAAAA,EAAM,cAAeiB,EAE/B,SAAAA,KACC,OAAC,oBACC,KAAK,OACL,GAAI,CACF,MAAOjB,GAAA,MAAAA,EAAM,YACT,YACAc,EAAM,QAAQ,QAAQ,IAC5B,EACF,KAEA,OAAC,cAAU,EAEf,EACF,KAEA,OAAC,WAAQ,MAAOd,EAAK,OAAS,OAAS,UACrC,mBAAC,UACC,QAASA,GAAA,MAAAA,EAAM,OAAS,YAAc,WACtC,GACEA,GAAA,MAAAA,EAAM,SAAUA,GAAA,MAAAA,EAAM,aAClB6B,EAAA,GAAKnB,GACLV,GAAA,MAAAA,EAAM,YACJ6B,EAAA,GAAKjB,GACLiB,EAAA,GAAKnB,GAEb,QAAS,IAAM,CACTV,EAAK,OACPuC,EACEvC,EACA,CAAE,OAAQ,EAAM,EAChB,YACF,EAEAuC,EACEvC,EACA,CAAE,OAAQ,EAAK,EACf,UACF,CAEJ,EACA,SAAU,EAACA,GAAA,MAAAA,EAAM,cAAemB,EAE/B,SAAAA,KACC,OAAC,oBACC,KAAK,OACL,GAAI,CACF,MAAOL,EAAM,QAAQ,QAAQ,IAC/B,EACF,EACEd,EAAK,UACP,OAAC,cAAU,KAEX,OAAC,UAAM,EAEX,EACF,KAEA,OAAC,WAAQ,MAAOA,EAAK,OAAS,OAAS,UACrC,mBAAC,UACC,QAASA,GAAA,MAAAA,EAAM,OAAS,YAAc,WACtC,GACEA,GAAA,MAAAA,EAAM,SAAUA,GAAA,MAAAA,EAAM,aAClB6B,EAAA,GAAKnB,GACLV,GAAA,MAAAA,EAAM,YACJ6B,EAAA,GAAKjB,GACLiB,EAAA,GAAKnB,GAEb,QAAS,IAAM,CACTV,EAAK,OACPyC,GACEzC,EACA,CAAE,OAAQ,EAAM,EAChB,UACF,EAEAyC,GACEzC,EACA,CAAE,OAAQ,EAAK,EACf,UACF,CAEJ,EACA,SAAU,EAACA,GAAA,MAAAA,EAAM,cAAeqB,EAE/B,SAAAA,KACC,OAAC,oBACC,KAAK,OACL,GAAI,CACF,MAAOP,EAAM,QAAQ,QAAQ,IAC/B,EACF,EACEd,EAAK,UACP,OAAC,WAAO,KAER,OAAC,QAAI,EAET,EACF,KAEA,OAAC,WAAQ,MAAM,WACZ,UAAAA,GAAA,YAAAA,EAAM,QAAS,KACd,OAAC,UACC,QAASA,GAAA,MAAAA,EAAM,YAAc,YAAc,WAC3C,MAAM,QACN,GACEA,GAAA,MAAAA,EAAM,YACF4C,EAAAf,EAAA,GACKlB,GADL,CAEE,SAAU,kBACV,OAAQ,aAAaG,EAAM,QAAQ,MAAM,KAAK,GAC9C,UAAW,CACT,QAAS,cACT,UAAW,eAAeA,EAAM,QAAQ,MAAM,KAAK,GACnD,OAAQ,aAAaA,EAAM,QAAQ,MAAM,KAAK,EAChD,EACA,WAAY,CACV,QAAS,cACT,UAAW,sBAAsBA,EAAM,QAAQ,QAAQ,KAAK,EAC9D,CACF,GACA8B,EAAAf,EAAA,GAAKnB,GAAL,CAAe,SAAU,iBAAkB,GAEjD,QAAS,IAAM,CACbgC,EAAoB1C,EAAM,CACxB,YAAa,GACb,YAAa,GACb,OAAQ,GACR,OAAQ,GACR,OAAQ,OACR,MAAO,EACT,CAAC,CACH,EACA,SAAU,EAACA,GAAA,MAAAA,EAAM,cAAeuB,EAE/B,SAAAA,KACC,OAAC,oBAAiB,KAAK,OAAO,MAAM,QAAQ,KAE5C,OAAC,YAAQ,EAEb,KAEA,OAAC,UACC,QAASvB,GAAA,MAAAA,EAAM,YAAc,YAAc,WAC3C,GAAI4C,EAAAf,EAAA,GACCnB,GADD,CAEF,WAAY,SACZ,SAAU,iBACZ,GACA,QAAS,IAAM,CACbgC,EAAoB1C,EAAM,CACxB,YAAa,GACb,YAAa,GACb,OAAQ,GACR,OAAQ,GACR,OAAQ,OACR,MAAO,EACT,CAAC,CACH,EACA,SAAU,EAACA,GAAA,MAAAA,EAAM,aAEjB,mBAAC,cACC,mBAAC,WACC,GAAI,CACF,WAAY,QACd,EACF,EACF,EACF,EAEJ,GACF,EACF,IArTKA,EAAK,IAsTZ,CAEJ,EAEO,SAAS6C,GAAiB,CAAE,KAAAC,EAAM,QAAAC,CAAQ,EAAQ,CA/iBzD,IAAA9C,EAgjBE,IAAMK,EAAQC,GAAY,EACpB,CAAE,UAAAC,CAAU,EAAIC,GAAS,EACzB,CAACuC,EAAsBC,CAAuB,KAAI,aAAS,EAAK,EAOhEC,EAAc,IAAM,CACxBH,EAAQ,EAAK,CACf,EAiJMI,EAA0B,IAAM,CA5sBxC,IAAAlD,EAAAC,EAAAC,EAAAC,EA6sBI6C,EAAwB,EAAI,EAC5B,IAAMjB,EAAU,CACd,OAAQ,sBACR,UAAW,gBACX,QAAQ9B,GAAAD,EAAAK,EAAM,WAAN,YAAAL,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,SAASE,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,eAAhB,KAAAC,EAAgC,EAC3C,EAEA6B,GACG,KAAKC,EAAU,wBAAyBF,CAAO,EAC/C,KAAMG,GAAQ,CAvtBrB,IAAAlC,EAwtBQO,GAAUP,EAAAkC,EAAI,OAAJ,YAAAlC,EAAU,QAAS,SAAS,EACtC2B,EAAgB,qBAAqB,EACrCsB,EAAY,CACd,CAAC,EACA,MAAOd,GAAQ,CA5tBtB,IAAAnC,EAAAC,EAAAC,EAAAC,EA6tBQ,IAAMiC,IACJnC,GAAAD,EAAAmC,EAAI,WAAJ,YAAAnC,EAAc,OAAd,YAAAC,EAAoB,WACpBE,GAAAD,EAAAiC,EAAI,WAAJ,YAAAjC,EAAc,OAAd,YAAAC,EAAoB,UACpBgC,EAAI,SACJ,4BACF5B,EAAU6B,EAAS,OAAO,CAC5B,CAAC,EACA,QAAQ,IAAM,CACbY,EAAwB,EAAK,CAC/B,CAAC,CACL,EAEA,uBAAU,IAAM,CAzuBlB,IAAAhD,EAAAC,EAAAC,EAAAC,EA0uBI,IAAMgD,EAAM,CACV,KAAM,EACN,QAAQlD,GAAAD,EAAAK,EAAM,WAAN,YAAAL,EAAgB,SAAhB,KAAAC,EAA0B,GAClC,KAAM,WACN,OAAOE,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,eAAhB,KAAAC,EAAgC,GACvC,OAAQ,GACR,OAAQ,GACR,YAAa,GACb,YAAa,EACf,EACAwB,EAAgB,kBAAkBwB,CAAG,CACvC,EAAG,CAAC,CAAC,KAGH,mBACE,mBAAC,UACC,KAAMN,EACN,kBAAgB,qBAChB,mBAAiB,2BACjB,UAAS,GACT,SAAU,KAEV,oBAAC,SAAM,GAAI,CAAE,aAAc,CAAE,EAE3B,qBAAC,OACC,GAAI,CACF,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,UACX,EAEA,qBAAC,cAAW,QAAQ,QACjB,WAAA7C,EAAAK,GAAA,YAAAA,EAAO,UAAP,KAAAL,EAAkB,GAAG,eACxB,KACA,OAAC,cAAW,QAASiD,EACnB,mBAAC,UAAM,EACT,GACF,KAGA,OAAC,OACC,GAAI,CACF,UAAW,wBACX,OAAQ,WACR,aAAc,MAChB,EAEA,mBAAC,kBACC,UAAW,QACX,GAAI,CACF,QAAS,4BACT,UAAW,uBACb,EAEA,oBAAC,SACC,GAAI,CACF,OAAQ,8BACV,EAEA,oBAAC,aACC,oBAAC,YACC,GAAI,CACF,OAAQ,gCACV,EAEA,oBAAC,aACC,GAAI,CACF,QAAS,KACX,EACD,gBAED,KACA,OAAC,aACC,GAAI,CACF,QAAS,KACX,EACD,kBAED,KACA,OAAC,aACC,GAAI,CACF,QAAS,KACX,EACD,qBAED,KACA,OAAC,aACC,GAAI,CACF,QAAS,KACX,EACD,yBAED,KACA,OAAC,aACC,GAAI,CACF,QAAS,KACX,EACD,wBAED,GACF,EACF,KACA,OAAC,aACE,SAAA5C,GAAA,YAAAA,EAAO,eAAe,IAAKN,MAC1B,OAACD,GAAA,CAAmB,KAAMC,EAAM,GAEpC,GACF,EACF,EACF,KAEA,OAAC,OAAI,UAAU,SAAS,EAAG,EACzB,oBAAC,UACC,QAAQ,WACR,MAAM,QACN,KAAK,QACL,QAASmD,EACT,SAAUH,EACV,GAAI,CAAE,GAAI,EAAG,aAAc,OAAQ,cAAe,YAAa,EAE9D,UAAAA,KACC,OAAC,oBACC,KAAK,OACL,MAAM,QACN,GAAI,CACF,YAAa,KACf,EACF,KAEA,OAAC,cACC,GAAI,CACF,QAAS,aACT,UAAW,CAAE,QAAS,YAAa,EACnC,YAAa,MACb,MAAO,OACP,OAAQ,OACR,SAAU,OACV,WAAY,MACZ,WAAY,OACZ,cAAe,SACf,cAAe,aACf,MAAO,QACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,aAAc,KAChB,EAEA,mBAAC,iBACC,GAAI,CACF,MAAO,QACP,SAAU,OACV,WAAY,KACd,EACF,EACF,EACA,kBAEJ,EACF,GACF,EACF,EACF,CAEJ,CAEO,SAASK,GAAmB,CAAE,KAAAP,EAAM,QAAAC,CAAQ,EAAQ,CAj5B3D,IAAA9C,EAAAC,EAAAC,EAAAC,EAAAC,EAAAiD,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,EAAAC,GAk5BE,GAAM,CAACC,CAAY,EAAIC,GAAoC,CACzD,UAAY3B,GAAQ,CAClB,QAAQ,IAAI,MAAOA,CAAG,EACtBY,EAAQ,EAAK,CACf,EACA,QAAUgB,GAAU,CAClB,QAAQ,IAAI,QAASA,CAAK,CAC5B,CACF,CAAC,EACKzD,EAAQC,GAAY,EACpB,CAACyD,EAAmBC,CAAoB,KAAI,aAAS,SAAS,EAE9D,CAACC,EAAmB,CAAE,KAAMC,CAAe,CAAC,EAAIL,GAAoB,EAEpE,CAACM,EAAyB,CAAE,KAAMC,CAAqB,CAAC,EAC5DP,GAKG,EAECZ,EAAc,IAAM,CACxBH,EAAQ,EAAK,CACf,EAEMuB,EAAqB,CAAC3C,EAAWa,IAAiB,CA56B1D,IAAAvC,GAAAC,GAAAC,EAAAC,EAAAC,EAAAiD,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAW,EAAAC,EAAAC,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GA86BI,GADA,QAAQ,IAAIhE,EAAM,QAAQ,EACtBa,IAAS,UAAW,CACtB,IAAMR,GAAU,CACd,eAAe9B,IAAAD,GAAAK,EAAM,WAAN,YAAAL,GAAgB,eAAhB,KAAAC,GAAgC,GAC/C,QAAQE,GAAAD,EAAAG,EAAM,WAAN,YAAAH,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,KAAM,UACN,aAAaC,EAAAsB,GAAA,YAAAA,EAAM,eAAN,KAAAtB,EAAsB,GACnC,iBAAiBkD,GAAAD,EAAAhD,EAAM,WAAN,YAAAgD,EAAgB,YAAhB,KAAAC,EAA6B,GAC9C,UAAW,QAAOE,GAAAD,EAAAlD,EAAM,WAAN,YAAAkD,EAAgB,aAAhB,KAAAC,EAA8B,EAAE,EAClD,cAAcE,GAAAD,EAAApD,EAAM,WAAN,YAAAoD,EAAgB,eAAhB,KAAAC,EAAgC,EAChD,EACAE,EAAa3B,EAAU,cAAeF,EAAO,CAC/C,SAAWQ,IAAS,QAAS,CAC3B,IAAMR,GAAU,CACd,eAAeuC,GAAAX,EAAAtD,EAAM,WAAN,YAAAsD,EAAgB,eAAhB,KAAAW,EAAgC,GAC/C,QAAQE,GAAAD,EAAAlE,EAAM,WAAN,YAAAkE,EAAgB,WAAhB,KAAAC,EAA4B,GACpC,KAAM,QACN,aAAaC,EAAA/C,GAAA,YAAAA,EAAM,aAAN,KAAA+C,EAAoB,GACjC,iBAAiBE,IAAAD,GAAArE,EAAM,WAAN,YAAAqE,GAAgB,YAAhB,KAAAC,GAA6B,GAC9C,UAAW,QAAOE,IAAAD,GAAAvE,EAAM,WAAN,YAAAuE,GAAgB,aAAhB,KAAAC,GAA8B,EAAE,EAClD,cAAcE,IAAAD,GAAAzE,EAAM,WAAN,YAAAyE,GAAgB,eAAhB,KAAAC,GAAgC,EAChD,EACAnB,EAAa3B,EAAU,cAAeF,EAAO,CAC/C,SAAWQ,IAAS,QAAS,CAC3B,IAAMR,GAAU,CACd,eAAekD,IAAAD,GAAA3E,EAAM,WAAN,YAAA2E,GAAgB,eAAhB,KAAAC,GAAgC,GAC/C,QAAQE,IAAAD,GAAA7E,EAAM,WAAN,YAAA6E,GAAgB,WAAhB,KAAAC,GAA4B,GACpC,KAAM,QACN,aAAaC,GAAA1D,GAAA,YAAAA,EAAM,UAAN,KAAA0D,GAAiB,GAC9B,iBAAiBE,IAAAD,GAAAhF,EAAM,WAAN,YAAAgF,GAAgB,YAAhB,KAAAC,GAA6B,GAC9C,UAAW,QAAOE,IAAAD,GAAAlF,EAAM,WAAN,YAAAkF,GAAgB,aAAhB,KAAAC,GAA8B,EAAE,EAClD,cAAcE,IAAAD,GAAApF,EAAM,WAAN,YAAAoF,GAAgB,eAAhB,KAAAC,GAAgC,EAChD,EACA9B,EAAa3B,EAAU,cAAeF,EAAO,CAC/C,CACF,EAEA,uBAAU,IAAM,CACdkC,EAAkBhC,EAAU,YAAa,CACvC,OAAQ,OACR,OAAQ,EACV,CAAC,EACDkC,EAAwBlC,EAAU,oBAAqB,CACrD,OAAQ,SACR,OAAQ,EACV,CAAC,CACH,EAAG,CAAC,CAAC,EAEL,QAAQ,IAAIiC,EAAgB,gBAAgB,KAE1C,mBACE,mBAAC,UACC,KAAMrB,EACN,kBAAgB,qBAChB,mBAAiB,2BACjB,UAAS,GACT,SAAU,KAEV,oBAAC,SAAM,GAAI,CAAE,aAAc,CAAE,EAG3B,qBAAC,OACC,GAAI,CACF,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,WACT,UAAW,uBACb,EAEA,oBAAC,cAAW,QAAQ,QAAQ,0BAAc,KAC1C,OAAC,cAAW,QAASI,EACnB,mBAAC,UAAM,EACT,GACF,KAGA,QAAC,OACC,GAAI,CACF,UAAW,wBACX,QAAS,WACT,OAAQ,OACR,aAAc,MAChB,EAEA,qBAAC,OAAI,GAAI,CAAE,QAAS,OAAQ,IAAK,CAAE,EACjC,oBAAC,UACC,QACEc,IAAsB,UAAY,YAAc,WAElD,QAAS,IAAMC,EAAqB,SAAS,EAC9C,mBAED,KACA,OAAC,UACC,QACED,IAAsB,SAAW,YAAc,WAEjD,QAAS,IAAMC,EAAqB,QAAQ,EAC7C,kBAED,KACA,OAAC,UACC,QACED,IAAsB,SAAW,YAAc,WAEjD,QAAS,IAAMC,EAAqB,QAAQ,EAC7C,kBAED,GACF,EACCD,IAAsB,cACrB,OAAC,OAAI,GAAI,CAAE,QAAS,OAAQ,IAAK,CAAE,EAChC,UAAA/D,EAAAoE,GAAA,YAAAA,EAAsB,OAAtB,MAAApE,EAA4B,WAC7BE,GAAAD,EAAAmE,GAAA,YAAAA,EAAsB,OAAtB,YAAAnE,EAA4B,UAA5B,YAAAC,EAAqC,QAAS,GAC5CE,GAAAD,EAAAiE,GAAA,YAAAA,EAAsB,OAAtB,YAAAjE,EAA4B,UAA5B,YAAAC,EAAqC,IACnC,CAACuF,EAAcC,OACb,QAAC,OAEC,GAAI,CACF,EAAG,EACH,QAAS,OACT,WAAY,SACZ,UAAW,wBACX,QAAS,MACT,OAAQ,WACR,aAAc,OACd,UAAW,CAAE,QAAS,iBAAkB,CAC1C,EAEA,qBAAC,cACC,QAAQ,QACR,GAAI,CACF,GAAI,EACJ,MAAO,QACP,SAAU,QACV,QAAS,OACT,WAAY,QACd,EAEA,oBAAC,gBAAa,GAAI,CAAE,YAAa,KAAM,EAAG,EACzCD,EAAQ,cACX,KAEA,OAAC,cACC,MAAM,UACN,GAAI,CACF,QAAS,eACT,UAAW,CAAE,QAAS,iBAAkB,CAC1C,EACA,QAAS,IAAM,CACbtB,EAAmBsB,EAAS,SAAS,CACvC,EAEA,mBAAC,SAAK,EACR,IArCKC,CAsCP,MAIJ,OAAC,cACC,QAAQ,QACR,GAAI,CACF,SAAU,OACV,WAAY,MACZ,cAAe,SACf,cAAe,aACf,UAAW,SACX,MAAO,OACP,OAAQ,WACR,MAAO,MACT,EACD,4BAED,EAEJ,EAED7B,IAAsB,aACrB,OAAC,OAAI,GAAI,CAAE,QAAS,OAAQ,IAAK,CAAE,EAChC,UAAAV,EAAAe,GAAA,YAAAA,EAAsB,OAAtB,MAAAf,EAA4B,SAC7BE,GAAAD,EAAAc,GAAA,YAAAA,EAAsB,OAAtB,YAAAd,EAA4B,QAA5B,YAAAC,EAAmC,QAAS,GAC1CE,IAAAD,EAAAY,GAAA,YAAAA,EAAsB,OAAtB,YAAAZ,EAA4B,QAA5B,YAAAC,GAAmC,IACjC,CAACoC,EAAYD,IAAY,CApmC7C,IAAA5F,GAAAC,GAAAC,EAAAC,EAAAC,EAAAiD,EAqmCsB,iBAAC,OAEC,GAAI,CACF,EAAG,EACH,QAAS,OACT,WAAY,SACZ,UAAW,wBACX,QAAS,MACT,OAAQ,WACR,aAAc,OACd,UAAW,CAAE,QAAS,iBAAkB,CAC1C,EAEA,qBAAC,cACC,QAAQ,QACR,GAAI,CACF,GAAI,EACJ,MAAO,QACP,SAAU,QACV,QAAS,OACT,WAAY,QACd,EAEA,oBAAC,gBAAa,GAAI,CAAE,YAAa,KAAM,EAAG,EACzCwC,EAAM,YACN3F,GAAAD,IAAAD,GAAAoE,GAAA,YAAAA,EAAsB,OAAtB,YAAApE,GAA4B,UAA5B,YAAAC,GAAqC,KACnC0F,GACCA,EAAQ,aAAeE,EAAM,cAFhC,MAAA3F,EAGE,gBACD,OAAC,cACC,QAAQ,QACR,GAAI,CACF,SAAU,OACV,WAAY,MACZ,cAAe,SACf,cAAe,aACf,MAAO,MACT,EAEC,eACCmD,GAAAjD,GAAAD,EAAAiE,GAAA,YAAAA,EAAsB,OAAtB,YAAAjE,EAA4B,UAA5B,YAAAC,EAAqC,KAClCuF,GACCA,EAAQ,aAAeE,EAAM,cAFjC,YAAAxC,EAGG,cACH,IACJ,EAEA,IAEJ,KAEA,OAAC,cACC,MAAM,UACN,GAAI,CACF,QAAS,eACT,UAAW,CAAE,QAAS,iBAAkB,CAC1C,EACA,QAAS,IAAM,CACbgB,EAAmBwB,EAAO,OAAO,CACnC,EAEA,mBAAC,SAAK,EACR,IA7DKD,CA8DP,OAIJ,OAAC,cACC,QAAQ,QACR,GAAI,CACF,SAAU,OACV,WAAY,MACZ,cAAe,SACf,cAAe,aACf,UAAW,SACX,MAAO,OACP,OAAQ,WACR,MAAO,MACT,EACD,2BAED,EAEJ,EAED7B,IAAsB,aACrB,OAAC,OAAI,GAAI,CAAE,QAAS,OAAQ,IAAK,CAAE,EAChC,SAAAG,GAAA,MAAAA,EAAgB,QAAQR,EAAAQ,GAAA,YAAAA,EAAgB,OAAhB,YAAAR,EAAsB,QAAS,GACtDC,GAAAO,GAAA,YAAAA,EAAgB,OAAhB,YAAAP,GAAsB,IAAI,CAACmC,EAAYF,OACrC,QAAC,OAEC,GAAI,CACF,EAAG,EACH,QAAS,OACT,WAAY,SACZ,UAAW,wBACX,QAAS,MACT,OAAQ,WACR,aAAc,OACd,UAAW,CAAE,QAAS,iBAAkB,CAC1C,EAEA,qBAAC,cACC,QAAQ,QACR,GAAI,CACF,GAAI,EACJ,MAAO,QACP,SAAU,QACV,QAAS,OACT,WAAY,QACd,EAEA,oBAAC,gBAAa,GAAI,CAAE,YAAa,KAAM,EAAG,EACzCE,EAAM,MACT,KAEA,OAAC,cACC,MAAM,UACN,GAAI,CACF,QAAS,eACT,UAAW,CAAE,QAAS,iBAAkB,CAC1C,EACA,QAAS,IAAM,CACbzB,EAAmByB,EAAO,OAAO,CACnC,EAEA,mBAAC,SAAK,EACR,IArCKF,CAsCP,MAGF,OAAC,cACC,QAAQ,QACR,GAAI,CACF,SAAU,OACV,WAAY,MACZ,cAAe,SACf,cAAe,aACf,UAAW,SACX,MAAO,OACP,OAAQ,WACR,MAAO,MACT,EACD,2BAED,EAEJ,GAEJ,GACF,EACF,EACF,CAEJ,CAEO,SAASG,GAAyB,CACvC,KAAAlD,EACA,QAAAC,EACA,oBAAAkD,CACF,EAAQ,CArwCR,IAAAhG,EAAAC,EAswCE,GAAM,CAACgG,EAAUC,CAAW,KAAI,aAAS,CACvC,YAAa,CAAE,MAAO,WAAY,MAAO,KAAM,EAC/C,SAAU,CAAE,MAAO,KAAM,MAAO,GAAI,EACpC,aAAc,GACd,YAAa,GACb,aAAc,EAChB,CAAC,EAEKC,EAAqB,CACzB,CAAE,MAAO,iBAAkB,MAAO,IAAK,EACvC,CAAE,MAAO,WAAY,MAAO,KAAM,CACpC,EAEMC,EAAkB,CACtB,CAAE,MAAO,MAAO,MAAO,GAAI,EAC3B,CAAE,MAAO,KAAM,MAAO,GAAI,CAC5B,EACMC,EAAe,CACnBC,EACAC,IACG,CACHL,EAAaM,GAAU7D,EAAAf,EAAA,GAAK4E,GAAL,CAAW,CAACF,CAAK,EAAGC,CAAM,EAAE,CACrD,EAEME,EAAc,IAAM,CACxBP,EAAY,CACV,YAAa,CAAE,MAAO,WAAY,MAAO,KAAM,EAC/C,SAAU,CAAE,MAAO,KAAM,MAAO,GAAI,EACpC,aAAc,GACd,YAAa,GACb,aAAc,EAChB,CAAC,CACH,EACMjD,EAAc,IAAM,CACxBwD,EAAY,EACZ3D,EAAQ,EAAK,CACf,EAEA,SACE,mBACE,mBAAC,UACC,KAAMD,EACN,kBAAgB,qBAChB,mBAAiB,2BACjB,UAAS,GACT,SAAU,KAEV,oBAAC,SAAM,GAAI,CAAE,aAAc,CAAE,EAE3B,oBAAC,OACC,GAAI,CACF,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,QAAS,WACT,UAAW,uBACb,EAEA,oBAAC,cAAW,QAAQ,QAAQ,EAAG,EAC5B,cAAI,oBAEP,EACF,KAGA,OAAC,OACC,GAAI,CACF,UAAW,wBACX,QAAS,OACT,OAAQ,OACR,aAAc,MAChB,EAEA,oBAAC,QAAK,UAAS,GAAC,QAAS,EAEvB,oBAAC,QAAK,KAAM,EACV,mBAAC,gBACC,MAAOoD,EAAS,YAChB,QAASE,EACT,eAAiBO,GAAQA,EAAI,MAC7B,SAAU,CAACC,EAAGC,IAAQP,EAAa,cAAeO,CAAG,EACrD,KAAK,QACL,YAAcC,MACZ,OAAC,YAAAlE,EAAAf,EAAA,GAAciF,GAAd,CAAsB,MAAM,cAAc,UAAS,IAAC,EAEzD,EACF,KAEA,OAAC,QAAK,KAAM,EACV,mBAAC,gBACC,QAAST,EACT,eAAiBM,GAAQA,EAAI,MAC7B,MAAOT,EAAS,SAChB,SAAU,CAACU,EAAGC,IAAQP,EAAa,WAAYO,CAAG,EAClD,KAAK,QACL,YAAcC,MACZ,OAAC,YAAAlE,EAAAf,EAAA,GAAciF,GAAd,CAAsB,MAAM,YAAY,UAAS,IAAC,EAEvD,EACF,IAGC5G,GAAAD,EAAAiG,GAAA,YAAAA,EAAU,WAAV,YAAAjG,EAAoB,QAApB,YAAAC,EAA2B,iBAAkB,UAC5C,oBACE,oBAAC,QAAK,KAAM,EACV,mBAAC,aACC,KAAK,QACL,MAAM,gBACN,KAAK,OACL,UAAW,CACT,WAAY,CAAE,OAAQ,EAAK,CAC7B,EACA,MAAOgG,EAAS,aAChB,SAAWvD,GACT2D,EAAa,eAAgB3D,EAAE,OAAO,KAAK,EAE7C,UAAS,GACX,EACF,KAEA,OAAC,QAAK,KAAM,EACV,mBAAC,aACC,KAAK,QACL,MAAM,eACN,KAAK,OACL,WAAY,CAAE,IAAK,EAAG,IAAK,EAAG,EAC9B,MAAOuD,EAAS,YAChB,SAAWvD,GACT2D,EAAa,cAAe3D,EAAE,OAAO,KAAK,EAE5C,UAAS,GACX,EACF,KAEA,OAAC,QAAK,KAAM,EACV,mBAAC,aACC,KAAK,QACL,MAAM,iBACN,KAAK,OACL,WAAY,CAAE,IAAK,EAAG,IAAK,EAAG,EAC9B,MAAOuD,EAAS,aAChB,SAAWvD,GACT2D,EAAa,eAAgB3D,EAAE,OAAO,KAAK,EAE7C,UAAS,GACX,EACF,GACF,GAEJ,EACF,KAEA,QAAC,OAAI,UAAU,QAAQ,EAAG,EACxB,oBAAC,UACC,QAAQ,WACR,MAAM,QACN,KAAK,QACL,QAASO,EACT,GAAI,CACF,GAAI,EACJ,GAAI,EACJ,aAAc,OACd,cAAe,YACjB,EACD,kBAED,KACA,OAAC,UACC,QAAQ,YACR,MAAM,UACN,KAAK,QACL,QAAS,IAAM+C,EAAoBC,CAAQ,EAC3C,GAAI,CAAE,GAAI,EAAG,aAAc,OAAQ,cAAe,YAAa,EAChE,kBAED,GACF,GACF,EACF,EACF,CAEJ,CAEO,SAASa,GAAoB,CAClC,KAAAjE,EACA,QAAAC,EACA,YAAAiE,EAAc,KACd,wBAAAC,CACF,EAAQ,CAl8CR,IAAAhH,EAAAC,EAu8CE,SACE,mBACE,mBAAC,UACC,KAAM4C,EACN,kBAAgB,qBAChB,mBAAiB,2BACjB,SAAU,KAEV,oBAAC,SAAM,GAAI,CAAE,aAAc,CAAE,EAG3B,qBAAC,OACC,GAAI,CACF,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,WACT,UAAW,uBACb,EAEA,oBAAC,cAAW,QAAQ,QAAQ,yBAAa,KACzC,OAAC,cAAW,QAzBF,IAAM,CACxBC,EAAQ,EAAK,CACf,EAwBY,mBAAC,UAAM,EACT,GACF,KAGA,OAAC,OACC,GAAI,CACF,UAAW,wBACX,QAAS,WACT,OAAQ,OACR,aAAc,MAChB,EAEC,WAAA9C,EAAA+G,GAAA,YAAAA,EAAa,YAAb,YAAA/G,EAAwB,QAAS,GAC9BC,EAAA8G,GAAA,YAAAA,EAAa,YAAb,YAAA9G,EAAwB,IAAI,CAAC0F,EAAcC,OACzC,OAAC,OAEC,GAAI,CACF,EAAG,EACH,QAAS,OACT,WAAY,SACZ,UAAW,wBACX,QAAS,MACT,OAAQ,WACR,aAAc,OACd,OAAQ,UACR,UAAW,CAAE,QAAS,iBAAkB,CAC1C,EACA,QAAS,IAAM,CACboB,EAAwBrB,CAAO,CACjC,EAGA,oBAAC,cACC,QAAQ,QACR,GAAI,CACF,GAAI,EACJ,MAAO,QACP,SAAU,QACV,QAAS,OACT,WAAY,QACd,EAEA,oBAAC,gBAAa,GAAI,CAAE,YAAa,KAAM,EAAG,EACzCA,EAAQ,cACX,GA7BKC,CA8BP,GAEF,KACN,GACF,EACF,EACF,CAEJ,CAEO,SAASqB,GAAkB,CAAE,KAAApE,EAAM,QAAAC,CAAQ,EAAQ,CAKxD,SACE,mBACE,mBAAC,UACC,KAAMD,EACN,kBAAgB,qBAChB,mBAAiB,2BACjB,UAAS,GACT,SAAU,KAEV,oBAAC,SAAM,GAAI,CAAE,aAAc,CAAE,EAG3B,qBAAC,OACC,GAAI,CACF,QAAS,OACT,eAAgB,gBAChB,WAAY,SACZ,QAAS,WACT,UAAW,uBACb,EAEA,oBAAC,cAAW,QAAQ,QAAQ,yBAAa,KACzC,OAAC,cAAW,QA1BF,IAAM,CACxBC,EAAQ,EAAK,CACf,EAyBY,mBAAC,UAAM,EACT,GACF,KAGA,OAAC,OACC,GAAI,CACF,UAAW,wBACX,OAAQ,OACR,aAAc,OACd,UAAW,SACX,SAAU,OACV,WAAY,MACd,EACA,EAAG,EACJ,0BAED,GACF,EACF,EACF,CAEJ,CL9tCU,IAAAoE,EAAA,6BAtTH,SAASC,GAAa,CAAE,aAAAC,CAAa,EAA0B,CAnDtE,IAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAoDE,IAAMC,KAAQ,YAAS,EACjBC,EAAQC,GAAY,EACpB,CAAE,SAAAC,EAAU,QAAAC,EAAS,SAAAC,CAAS,EAAIC,GAAU,CAChD,WAAU9E,GAAAyE,EAAM,YAAN,YAAAzE,GAAiB,WAAY,CAAC,EACxC,UAASC,GAAAwE,EAAM,YAAN,YAAAxE,GAAiB,UAAW,CAAC,EACtC,WAAUC,GAAAuE,EAAM,YAAN,YAAAvE,GAAiB,WAAY,CAAC,CAC1C,CAAC,EAEK6E,KAAe,UAAyB,IAAI,EAC5C,CAACC,EAAUC,CAAW,KAAI,YAA6B,IAAI,EAC3D,CAACC,EAAYC,CAAa,KAAI,YAAkB,EAAI,EACpD,CAACC,EAAgBC,CAAiB,KAAI,YAC1C,IACF,EACM,CAACC,EAAgBC,CAAiB,KAAI,YAC1C,IACF,EACM,CAACC,EAAMC,CAAO,KAAI,YAAS,EAAK,EAChC,CAACC,EAAkBC,CAAmB,KAAI,YAAS,EAAK,EACxD,CAACC,EAAqBC,CAAsB,KAAI,YAAS,EAAK,EAC9D,CAACC,GAAqBC,CAAsB,KAAI,YAAS,EAAK,EAC9D,CAACC,GAAuBC,CAAwB,KAAI,YAAS,EAAK,EAElE,CAACC,EAAaC,EAAc,KAAI,YAAiB,EAAE,EACnD,CAACC,GAAcC,CAAe,KAAI,YAAS,CAAC,EAE5C,CAAE,SAAAC,EAAU,WAAAC,EAAY,QAAAC,EAAS,gBAAAC,EAAiB,iBAAAC,CAAiB,EACvEC,GAAalC,EAAM,qBAAuBmC,GACxCC,EAAgB,wBAAwBD,CAAW,CACrD,EAEI,CACJ,SAAUE,EACV,WAAYC,EACZ,QAASC,EACT,gBAAiBC,EACjB,iBAAkBC,CACpB,EAAIP,GAAalC,EAAM,eAAiBmC,GACtCC,EAAgB,kBAAkBD,CAAW,CAC/C,EAEM,CAACO,EAAgB,CAAE,KAAMC,CAAY,CAAC,EAAIC,GAAoB,CAClE,UAAYC,GAAa,CA9F7B,IAAAtH,EA+FM,QAAQ,IAAI,MAAOsH,CAAG,EAClBA,GAAOA,EAAI,QAAQtH,EAAAsH,GAAA,YAAAA,EAAK,OAAL,YAAAtH,EAAW,QAAS,EACzC+F,EAAuB,EAAI,GAE3Bc,EAAgB,WAAWS,GAAA,YAAAA,EAAK,KAAK,EAAE,EACvCvB,EAAuB,EAAK,EAEhC,EACA,QAAS,IAAM,CACbA,EAAuB,EAAK,CAC9B,CACF,CAAC,EAEK,CAACwB,EAAa,CAAE,UAAWC,EAAmB,CAAC,EAAIH,GAItD,EAEG,CAACI,GAAc,CAAE,UAAWC,EAAoB,CAAC,EAAIL,GAIxD,CACD,UAAW,IAAM,CACfR,EAAgB,WAAW,CAACpC,EAAM,SAAS,CAC7C,EACA,QAAUkD,GAAU,CAClB,QAAQ,IAAI,QAASA,CAAK,CAC5B,CACF,CAAC,EAEK,CAACC,GAAc,CAAE,UAAWC,EAAoB,CAAC,EAAIR,GAIxD,CACD,UAAW,IAAM,CACfR,EAAgB,SAAS,CAACpC,EAAM,OAAO,CACzC,EACA,QAAUkD,GAAU,CAClB,QAAQ,IAAI,QAASA,CAAK,CAC5B,CACF,CAAC,EAEK,CAACG,GAAkB,CAAE,UAAWC,EAAkB,CAAC,EAAIV,GAI1D,EAEG,CAACW,GAAmB,CAAE,UAAAC,EAAU,CAAC,EAAIZ,GAIxC,EAEG,CAACa,GAAS,CAAE,UAAWC,EAAe,CAAC,EAAId,GAY9C,EAEGe,MAAiB,eAAaC,GAA4B,CAC9D,IAAMC,EAAO,KAAK,MAAMD,EAAU,EAAE,EAC9BE,EAAOF,EAAU,GACvB,MAAO,GAAGC,EAAK,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,IAAIC,EAAK,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,EAChF,EAAG,CAAC,CAAC,EAECC,GAAyB,IAAM,CACnCvD,EAAY,IAAI,CAClB,EAEMwD,GAAoBC,GAAyC,CACjEvD,EAAc,EAAI,EAClBI,EAAkBmD,EAAM,aAAa,EACrC7B,EAAgB,UAAU,MAAM,CAClC,EAEM8B,GAAoB,IAAM,CAC1BlE,EAAM,SAAW,WACnBoC,EAAgB,UAAU,MAAM,EAGlCtB,EAAkB,IAAI,CACxB,EAEMqD,GAAyBF,GAAyC,CACtErD,EAAkBqD,EAAM,aAAa,CACvC,EAEMG,GAAyB,IAAM,CACnCxD,EAAkB,IAAI,CACxB,EAKMyD,GAAmB,IAAM,CAC7B,IAAMC,EAAU,CACd,OAAQ,aACR,OAAQtE,EAAM,OAChB,EACAqD,GAAiBkB,EAAU,YAAaD,CAAO,CACjD,EAEME,GAA2BC,GAAmB,CAClD7D,EAAkB,IAAI,EACtB,IAAM0D,EAAU,CACd,OAAQ,aACR,WAAYG,EACZ,OAAQzE,EAAM,OAChB,EACAuD,GAAkBgB,EAAU,mBAAoBD,CAAO,CACzD,EAEMI,GAAmBC,GAAmB,CAC1C,GAAIA,EAAO,SAAW,GACpB,MAAM,sBAAsB,UAClB,QAAQ,KAAKA,CAAM,EACxB,CACL,IAAML,EAAU,CACd,OAAQ,OACR,aAAcK,EACd,OAAQ3E,EAAM,OAChB,EACA8C,EAAYyB,EAAU,cAAeD,CAAO,CAC9C,CACF,EAEMM,GAAmB,IAAM,CAC7B,IAAMN,EAAU,CACd,OAAQtE,EAAM,UAAY,SAAW,OACrC,OAAQA,EAAM,OAChB,EACAgD,GAAauB,EAAU,UAAWD,CAAO,CAC3C,EAEMO,GAAmB,IAAM,CAC7B,IAAMP,EAAU,CACd,OAAQtE,EAAM,QAAU,SAAW,OACnC,OAAQA,EAAM,OAChB,EAEAmD,GAAaoB,EAAU,UAAWD,CAAO,CAC3C,EAEMQ,GAAiBC,GAMjB,CAhQR,IAAAxJ,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAiQI,QAAQ,IAAI,OAAQyI,CAAI,EACxB,IAAMT,EAAU,CACd,OAAQ,UACR,OAAQtE,EAAM,QACd,WAAWvE,IAAAD,IAAAD,EAAAyE,EAAM,UAAN,YAAAzE,EAAe,aAAf,YAAAC,GAA2B,aAA3B,KAAAC,GAAyC,GACpD,cAAcE,IAAAD,GAAAsE,EAAM,UAAN,YAAAtE,GAAe,eAAf,KAAAC,GAA+B,GAC7C,iBAAiBE,IAAAD,GAAAoE,EAAM,WAAN,YAAApE,GAAgB,YAAhB,KAAAC,GAA6B,GAC9C,eAAeE,IAAAD,GAAAkE,EAAM,WAAN,YAAAlE,GAAgB,eAAhB,KAAAC,GAAgC,GAE/C,aAAaE,IAAAD,GAAA+I,GAAA,YAAAA,EAAM,cAAN,YAAA/I,GAAmB,QAAnB,KAAAC,GAA4B,GACzC,cAAcE,IAAAD,GAAA6I,GAAA,YAAAA,EAAM,WAAN,YAAA7I,GAAgB,QAAhB,KAAAC,GAAyB,GACvC,eAAeC,GAAA2I,GAAA,YAAAA,EAAM,eAAN,KAAA3I,GAAsB,GACrC,cAAcC,GAAA0I,GAAA,YAAAA,EAAM,cAAN,KAAA1I,GAAqB,GACnC,eAAeC,GAAAyI,GAAA,YAAAA,EAAM,eAAN,KAAAzI,GAAsB,GACrC,aAAc,OAChB,EACAoF,GAAe,EAAE,EACjB+B,GAAQc,EAAU,SAAUD,CAAO,EACnClC,EAAgB,QAAQ,EACxBhB,EAAuB,EAAK,CAC9B,EA+EA,SA5EA,aAAU,IAAM,CACd,IAAI4D,EAEJ,OAAIhF,EAAM,SAAS,QAAUA,EAAM,SAAS,SAAW,SACrDgF,EAAW,YAAY,IAAM,CAC3B,IAAMC,EAAU,KAAK,OAAO,KAAK,IAAI,EAAIjF,EAAM,eAAkB,GAAI,EACrE4B,EAAgBqD,CAAO,CACzB,EAAG,GAAI,EAEPrD,EAAgB,CAAC,EAGZ,IAAM,CACPoD,GAAU,cAAcA,CAAQ,CACtC,CACF,EAAG,CAAChF,EAAM,SAAS,MAAM,CAAC,KAG1B,aAAU,IAAM,CACV1E,GACFA,EAAa0E,EAAM,QAAQ,CAE/B,EAAG,CAACA,EAAM,SAAU1E,CAAY,CAAC,KAEjC,aAAU,IAAM,CACV0E,EAAM,QACR0C,EAAe6B,EAAU,aAAc,CACrC,OAAQvE,EAAM,QACd,OAAQ,sBACR,MAAO,YACT,CAAC,EAED,QAAQ,IAAI,yCAAyC,CAEzD,EAAG,CAACA,EAAM,OAAO,CAAC,KAElB,aAAU,KACJA,EAAM,UACRM,EAAa,QAAU,IAAI,UACzB,GAAG4E,GAAa,EAAE,aAAalF,EAAM,OAAO,EAC9C,EAEAM,EAAa,QAAQ,OAAS,IAAM,CAClC,QAAQ,IAAI,kCAAkC,CAChD,EAEAA,EAAa,QAAQ,UAAa2D,GAAU,CAC1C,GAAI,CACF,IAAMc,EAAO,KAAK,MAAMd,EAAM,IAAI,EAClC,QAAQ,IAAI,cAAec,CAAI,EAC/B3C,EAAgB,eAAe2C,CAAI,EAC/BA,EAAK,SAAW,UAClB3C,EAAgB,UAAU,EAExB2C,EAAK,SAAW,UAClB3C,EAAgB,QAAQ,CAE5B,OAAQ+C,EAAA,CACN,QAAQ,IAAI,eAAgBlB,EAAM,IAAI,CACxC,CACF,EAEA3D,EAAa,QAAQ,QAAU,IAAM,CACnC,QAAQ,IAAI,6BAA6B,CAC3C,EAEAA,EAAa,QAAQ,QAAW4C,GAAU,CACxC,QAAQ,MAAM,mBAAoBA,CAAK,CACzC,GAGK,IAAM,CA/VjB,IAAA3H,GAgWMA,EAAA+E,EAAa,UAAb,MAAA/E,EAAsB,OACxB,GACC,CAACyE,EAAM,OAAO,CAAC,EAEd,CAACA,EAAM,eAAiB,CAACA,EAAM,WAE/B,OAAC,OAEE,WAAQqB,OACP,OAAC+D,GAAA,CACC,YAAazC,EACb,KAAMtB,GACN,QAASC,EACT,wBAA0ByD,GAGpB,CACJ3C,EAAgB,WAAW2C,CAAI,CACjC,EACF,EAEJ,KAKF,oBACE,oBAAC,QAAK,GAAI,GAAM,QAAS,IACvB,mBAAC,SACC,IAAKhD,EACL,UAAWD,EAAa,EAAI,EAC5B,GAAI,CACF,SAAU,QACV,KAAMD,EAAS,EACf,IAAKA,EAAS,EACd,EAAG,GACH,aAAc,EACd,QAAS,mBACT,OAAQ,MACR,WAAY9B,EAAM,YAAY,OAAO,CAAC,aAAc,WAAW,EAAG,CAChE,SAAUA,EAAM,YAAY,SAAS,KACvC,CAAC,EACD,WAAY,MACd,EAEA,oBAAC,OACC,GAAI,CACF,QAAS,OACT,WAAY,QACd,EAGA,qBAAC,OACC,GAAI,CACF,QAAS,OAET,WAAY,QACd,EAEA,qBAAC,cACC,UAAU,MACV,KAAK,QACL,GAAI,CACF,OAAQ,YACV,EACA,YAAaiC,EACb,aAAcC,EAEd,oBAAC,kBAAc,EAAG,KACpB,KAEA,OAAC,OACC,GAAI,CACF,YAAa,MACf,EAGA,mBAAC,WAAQ,MAAM,OACb,mBAAC,cACC,KAAK,QACL,QAAUkD,GAAM,CAhbpC,IAAA5J,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,KAkbwBN,GAAAD,EAAAyE,EAAM,WAAN,YAAAzE,EAAgB,SAAhB,YAAAC,EAAwB,iBAAkB,YAC1CE,IAAAD,GAAAuE,EAAM,WAAN,YAAAvE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,WAC1CE,IAAAD,GAAAqE,EAAM,WAAN,YAAArE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,aAC1CE,IAAAD,GAAAmE,EAAM,WAAN,YAAAnE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,UAE1CkI,GAAiBmB,CAAC,CAEtB,EACA,GAAI,CACF,QAAS,eACT,UAAW,CACT,QAAS,SACX,CACF,EAEA,mBAAC,gBACC,GAAI,CACF,QACExJ,IAAAD,GAAAsE,EAAM,WAAN,YAAAtE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,YAC1CE,IAAAD,GAAAoE,EAAM,WAAN,YAAApE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,WAC1CE,IAAAD,GAAAkE,EAAM,WAAN,YAAAlE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,aAC1CE,IAAAD,GAAAgE,EAAM,WAAN,YAAAhE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtC,kBACA,cACR,EACF,EACF,EACF,EACF,KAGA,OAAC,cACC,GAAI,CACF,MAAO,eACP,MAAO,OACP,YAAa,MACf,EAEC,SAAA0H,GAAehC,EAAY,EAC9B,EAMC6B,IAAaF,MACZ,OAAC,OACC,GAAI,CACF,WAAY,OAEZ,QAAS,OACT,WAAY,SACZ,eAAgB,QAClB,EAEA,mBAAC,oBAAiB,KAAK,OAAO,EAChC,KAEA,OAAC,cACC,QAAQ,QACR,GAAI,CACF,WAAY,OAEZ,UAAW,OACb,EAEC,UAAAlH,IAAAD,IAAAD,GAAA8D,EAAM,WAAN,YAAA9D,GAAgB,SAAhB,YAAAC,GAAwB,gBAAxB,KAAAC,GAAyC,MAC5C,KAEF,OAAC,OAGC,QAAS+H,GAET,GAAI,CAEF,QAAS,OACT,WAAY,SACZ,OAAQ,MACR,OAAQ,SACV,EAEA,mBAAC,kBAAc,EACjB,GACF,KAGA,QAAC,OACC,GAAI,CACF,QAAS,OACT,IAAK,EACL,eAAgB,SAChB,WAAY,QACd,EAIA,oBAAC,WAAQ,MAAO,cACd,mBAAC,UACC,UACE7H,IAAAD,GAAA2D,EAAM,WAAN,YAAA3D,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,WAC1CE,IAAAD,GAAAyD,EAAM,WAAN,YAAAzD,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtC,WACA,YAEN,QAAU2I,GAAM,CA3hBlC,IAAA5J,EAAAC,EAAAC,GAAAC,MA6hBsBF,GAAAD,EAAAyE,EAAM,WAAN,YAAAzE,EAAgB,SAAhB,YAAAC,EAAwB,iBAAkB,WAC1CE,IAAAD,GAAAuE,EAAM,WAAN,YAAAvE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,YAE1CyJ,EAAE,gBAAgB,EAClBd,GAAiB,EAErB,EACA,QAAS,CACP,OACE3H,IAAAD,GAAAuD,EAAM,WAAN,YAAAvD,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,WAC1CE,IAAAD,GAAAqD,EAAM,WAAN,YAAArD,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtC,WACA,SACR,EACA,GAAIyI,EAAA,KACEvI,IAAAD,GAAAmD,EAAM,WAAN,YAAAnD,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,WAC9CE,IAAAD,GAAAiD,EAAM,WAAN,YAAAjD,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtCoD,EACAD,GAEN,SAAUmD,GAEV,mBAAC,iBAAa,EAChB,EACF,KAKA,OAAC,WAAQ,MAAOtD,EAAM,UAAY,SAAW,OAC3C,mBAAC,UACC,QACEA,EAAM,aACN9C,IAAAD,GAAA+C,EAAM,WAAN,YAAA/C,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtC,YACA,WAEN,QAAUiI,GAAM,CACdA,EAAE,gBAAgB,EAClBP,GAAiB,CACnB,EACA,GACE5E,EAAM,aACN5C,IAAAD,GAAA6C,EAAM,WAAN,YAAA7C,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtCiI,EAAA,GAAKlF,KACL7C,IAAAD,GAAA2C,EAAM,WAAN,YAAA3C,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACxC+H,EAAA,GAAKjF,GACLiF,EAAA,GAAKnF,GAEb,WACG1C,IAAAD,GAAAyC,EAAM,WAAN,YAAAzC,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,UACzC,CAACwC,EAAM,WACTiD,GAGD,SAAAA,MACC,OAAC,oBACC,KAAK,OACL,GAAI,CACF,MAAOlD,EAAM,QAAQ,QAAQ,IAC/B,EACF,EACEC,EAAM,aACR,OAAC,cAAU,KAEX,OAAC,UAAM,EAEX,EACF,KAKA,OAAC,WAAQ,MAAOA,EAAM,QAAU,SAAW,OACzC,mBAAC,UACC,QACEA,EAAM,WACNtC,IAAAD,GAAAuC,EAAM,WAAN,YAAAvC,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtC,YACA,WAEN,QAAUyH,GAAM,CACdA,EAAE,gBAAgB,EAClBN,GAAiB,CACnB,EACA,GACE7E,EAAM,WACNpC,IAAAD,GAAAqC,EAAM,WAAN,YAAArC,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtCyH,EAAA,GAAKlF,KACLrC,IAAAD,GAAAmC,EAAM,WAAN,YAAAnC,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACxCuH,EAAA,GAAKjF,GACLiF,EAAA,GAAKnF,GAEb,WACGlC,IAAAD,GAAAiC,EAAM,WAAN,YAAAjC,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,UACzC,CAACgC,EAAM,SACToD,GAGD,SAAAA,MACC,OAAC,oBACC,KAAK,OACL,GAAI,CACF,MAAOrD,EAAM,QAAQ,QAAQ,IAC/B,EACF,EACEC,EAAM,WACR,OAAC,WAAO,KAER,OAAC,QAAI,EAET,EACF,IAIC/B,GAAA+B,EAAM,YAAN,YAAA/B,GAAiB,wBAChB,OAAC,WAAQ,MAAO,gBACd,mBAAC,UACC,QAASgD,EAAmB,YAAc,WAC1C,QAAUkE,GAAM,CArpBpC,IAAA5J,EAAAC,IAspB0BA,GAAAD,EAAAyE,EAAM,WAAN,YAAAzE,EAAgB,SAAhB,YAAAC,EAAwB,iBAAkB,WAC5C2J,EAAE,gBAAgB,EAClBjE,EAAoB,EAAI,EAE5B,EACA,GACED,EACIoE,EAAA,GAAKlF,KACLhC,IAAAD,GAAA8B,EAAM,WAAN,YAAA9B,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACxCkH,EAAA,GAAKjF,GACLiF,EAAA,GAAKnF,GAEb,WACE7B,IAAAD,GAAA4B,EAAM,WAAN,YAAA5B,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SAG5C,mBAAC,2BAAuB,EAC1B,EACF,IAIDC,GAAA0B,EAAM,YAAN,YAAA1B,GAAiB,0BAChB,OAAC,WAAQ,MAAO,kBACd,mBAAC,UACC,QAASyC,EAAO,YAAc,WAC9B,QAAUoE,GAAM,CAhrBpC,IAAA5J,EAAAC,IAirB0BA,GAAAD,EAAAyE,EAAM,WAAN,YAAAzE,EAAgB,SAAhB,YAAAC,EAAwB,iBAAkB,WAC5C2J,EAAE,gBAAgB,EAClBnE,EAAQ,EAAI,EAEhB,EACA,GACED,EACIsE,EAAA,GAAKlF,KACL3B,IAAAD,GAAAyB,EAAM,WAAN,YAAAzB,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACxC6G,EAAA,GAAKjF,GACLiF,EAAA,GAAKnF,GAEb,WACExB,IAAAD,GAAAuB,EAAM,WAAN,YAAAvB,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SAG5C,mBAAC,UAAM,EACT,EACF,IAoBDC,GAAAqB,EAAM,YAAN,YAAArB,GAAiB,uBAChB,OAAC,WAAQ,MAAO,WACd,mBAAC,UACC,UACEE,IAAAD,GAAAoB,EAAM,WAAN,YAAApB,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,YAC1CE,IAAAD,GAAAkB,EAAM,WAAN,YAAAlB,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,aAC1CE,IAAAD,GAAAgB,EAAM,WAAN,YAAAhB,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtC,YACA,WAEN,QAAUkG,GAAM,CAjuBpC,IAAA5J,EAAAC,EAAAC,GAAAC,GAAAC,GAAAC,MAmuBwBJ,GAAAD,EAAAyE,EAAM,WAAN,YAAAzE,EAAgB,SAAhB,YAAAC,EAAwB,iBAAkB,YAC1CE,IAAAD,GAAAuE,EAAM,WAAN,YAAAvE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,aAC1CE,IAAAD,GAAAqE,EAAM,WAAN,YAAArE,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,YAE1CuJ,EAAE,gBAAgB,EAClB/D,EAAuB,EAAI,EAE/B,EACA,KACEjC,IAAAD,GAAAc,EAAM,WAAN,YAAAd,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,YAC1CE,IAAAD,GAAAY,EAAM,WAAN,YAAAZ,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,aAC1CE,IAAAD,GAAAU,EAAM,WAAN,YAAAV,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,SACtC+F,EAAAD,EAAA,GACKlF,GADL,CAEE,YAAa,MACb,gBAAiB,aACjB,SAAU,kBACV,UAAW,uBACX,OAAQ,aAAaJ,EAAM,QAAQ,MAAM,KAAK,GAC9C,OAAQ,OACR,UAAW,CACT,QAAS,cACT,UAAW,uBACX,OAAQ,aAAaA,EAAM,QAAQ,MAAM,KAAK,EAChD,EACA,WAAY,CACV,QAAS,cACT,UAAW,sBAAsBA,EAAM,QAAQ,QAAQ,KAAK,EAC9D,CACF,GACAuF,EAAAD,EAAA,GACKnF,GADL,CAEE,SAAU,iBACZ,GAEN,WACGT,IAAAD,GAAAQ,EAAM,WAAN,YAAAR,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,YACzCE,IAAAD,GAAAM,EAAM,WAAN,YAAAN,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,aAC1CE,IAAAD,GAAAI,EAAM,WAAN,YAAAJ,GAAgB,SAAhB,YAAAC,GAAwB,iBAAkB,UAC5C6D,GAGD,SAAAA,MACC,OAAC,oBAAiB,KAAK,OAAO,MAAM,QAAQ,KAE5C,OAAC,YAAQ,EAEb,EACF,GAEJ,GACF,EACF,EACF,KAEA,OAAC,QAAK,GAAI,GAAM,QAAS,IACvB,oBAAC,SACC,IAAKnB,EACL,UAAWD,EAAmB,EAAI,EAClC,GAAI,CACF,SAAU,QACV,KAAMD,EAAe,EACrB,IAAKA,EAAe,EACpB,EAAG,EACH,OAAQ,OACR,aAAc,EACd,QAAS,mBACT,OAAQ,MACR,WAAYtC,EAAM,YAAY,OAAO,CAAC,aAAc,WAAW,EAAG,CAChE,SAAUA,EAAM,YAAY,SAAS,KACvC,CAAC,EACD,WAAYU,EAAa,UAAY,SACrC,WAAY,MACd,EAEA,qBAAC,OACC,GAAI,CACF,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,OAAQ,YACV,EACA,YAAa+B,EACb,aAAcC,EAEd,oBAAC,iBACC,GAAI,CACF,UAAW,eACb,EACF,EAAG,OACH,OAAC,cAAW,QAAS,IAAM/B,EAAc,EAAK,EAC5C,mBAAC,UAAM,EACT,GACF,KACA,OAAC,UACC,IAAK,WAAW6E,EAAE,8BAA8BvF,EAAM,OAAO,gBAAeF,GAAAE,EAAM,UAAN,YAAAF,GAAe,UAAU,GACrG,OAAQ,IACR,MAAO,IACP,MAAM,+BACN,MAAO,CACL,OAAQ,MACV,EACD,GACH,EACF,KAGA,OAAC,QACC,SAAUe,EACV,KAAM,EAAQA,EACd,QAASqD,GACT,QAAUiB,GAAMA,EAAE,gBAAgB,EAClC,GAAI,CACF,OAAQ,KACV,EAEA,oBAAC,OACC,GAAI,CACF,IAAK,QACL,QAAS,OACT,SAAU,CACR,gBAAiB,OACnB,CACF,EAEA,oBAAC,aACC,KAAK,QACL,MAAO1D,EACP,YAAY,mBACZ,SAAW0D,GAAM,CACfzD,GAAeyD,EAAE,OAAO,KAAK,CAC/B,EACF,KACA,OAAC,cACC,MAAM,OACN,QAAS,IAAM,CACbT,GAAgBjD,CAAW,CAC7B,EAEC,SAAAsB,MACC,OAAC,oBACC,KAAK,OACL,GAAI,CACF,MAAOhD,EAAM,QAAQ,QAAQ,IAC/B,EACF,KAEA,OAAC,SAAM,MAAM,UAAU,EAE3B,GACF,EACF,KAGA,QAAC,QACC,SAAUY,EACV,KAAM,EAAQA,EACd,QAASyD,GACT,QAAUe,GAAMA,EAAE,gBAAgB,EAClC,GAAI,CACF,OAAQ,KACV,EAEA,oBAAC,YAAS,QAAS,IAAMX,GAAwB,OAAO,EAAG,mBAE3D,KACA,OAAC,YAAS,QAAS,IAAMA,GAAwB,KAAK,EAAG,iBAEzD,GACF,KAGA,OAAC,QACC,SAAUjE,EACV,KAAM,EAAQA,EACd,QAASwD,GACT,QAAUoB,GAAMA,EAAE,gBAAgB,EAClC,GAAI,CACF,OAAQ,KACV,EAEA,oBAAC,OACC,GAAI,CACF,QAAS,OACT,eAAgB,aAChB,cAAe,SACf,QAAS,WACT,SAAU,CACR,gBAAiB,OACnB,CACF,EAEA,oBAAC,QACC,QAAM,OAAC,UAAO,MAAM,YAAY,EAChC,QAAQ,WACR,MAAM,eACN,GAAI,CACF,OAAQ,SACV,EACF,KAEA,OAAC,QACC,QAAM,OAAC,WAAQ,MAAM,OAAO,EAC5B,MAAM,gBACN,QAAQ,WACR,GAAI,CACF,OAAQ,SACV,EACF,KAEA,OAAC,QACC,QAAM,OAAC,YAAS,MAAM,UAAU,EAChC,QAAQ,WACR,MAAM,gBACN,GAAI,CACF,OAAQ,SACV,EACF,GACF,EACF,EAGC,EAAQpE,MAAS,OAACyE,GAAA,CAAiB,KAAMzE,EAAM,QAASC,EAAS,EAGjE,EAAQC,MACP,OAACwE,GAAA,CACC,KAAMxE,EACN,QAASC,EACX,EAID,EAAQC,MACP,OAACuE,GAAA,CACC,KAAMvE,EACN,QAASC,EACT,oBAAqB0D,GACvB,EAID,EAAQvD,OACP,OAACoE,GAAA,CACC,KAAMpE,GACN,QAASC,EACX,GAEJ,CAEJ,COz9BS,IAAAoE,GAAA,6BADIC,GAAc,CAAC,CAAE,SAAAC,CAAS,OAC9B,QAACC,GAAA,CAAe,SAAAD,EAAS,ECI5B,IAAAE,GAAA,6BAHC,SAASC,GAAiB,CAAE,aAAAC,CAAa,EAA0B,CACxE,SACE,QAACC,GAAA,CACC,oBAACC,GAAA,CAAa,aAAcF,EAAc,EAC5C,CAEJ,CfWO,SAASG,GAAQ,CACtB,OAAAC,EACA,SAAAC,EACA,QAAAC,EACA,UAAAC,CACF,EAAwB,CACtBC,GACG,KAAK,CACJ,OAAQJ,EACR,SAAUC,EACV,QAASC,EACT,QAASG,CACX,CAAC,EACA,KAAMC,GAAQ,CACTA,GACFC,EAAgB,WAAWP,EAAQE,EAASC,CAAS,EACrD,QAAQ,IAAI,8BAA8B,GAE1C,QAAQ,IAAI,2BAA2B,CAE3C,CAAC,CACL","names":["index_exports","__export","CallControlPanel","initSDK","useEndCall","useLogout_default","__toCommonJS","EventTrackerSDK","__publicField","config","__spreadValues","ticket","response","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","SDKStateManager","__publicField","stored","parsedState","__spreadProps","__spreadValues","error","persistentState","listener","apiKey","agentId","sdkConfig","index","isHolding","isMuted","status","process","position","data","line","_a","conferenceLineData","each","sdkStateManager","import_react","IP","BASE_URL","WS_BASE_URL","VERSION","END_POINT","WS_END_POINT","import_axios","token","axiosInstance","axios","BASE_URL","config","error","response","_a","originalRequest","axios_default","useLogout","loading","setLoading","success","setSuccess","isError","setIsError","error","setError","data","setData","_a","state","payload","axios_default","END_POINT","res","sdkStateManager","err","useLogout_default","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_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","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","open","setOpen","conferenceCallEndAll","setConferenceCallEndAll","handleClose","onEndAllConferenceCalls","obj","CallTransferDialog","_f","_g","_h","_i","_j","_k","_l","transferCall","usePostRequest","error","currentselecteTab","setCurrentselecteTab","getIdelAgentsList","idleAgentsList","getProcessAndQueuesList","processAndQueuesList","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","onSubmitDisposition","formData","setFormData","dispositionOptions","followUpOptions","handleChange","field","value","prev","handleReset","opt","_","val","params","ProcessorListDialog","processList","handleSelectedProcessor","CallHistoryDialog","import_jsx_runtime","CallControls","onDataChange","_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","_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","theme","state","useSDKState","disabled","enabled","outlined","styles_default","webSocketRef","anchorEl","setAnchorEl","showIframe","setShowIframe","statusAnchorEl","setStatusAnchorEl","dialerAnchorEl","setDialerAnchorEl","open","setOpen","openCallTransfer","setOpenCallTransfer","openCallDisposition","setOpenCallDisposition","openProcessorDialog","setOpenProcessorDialog","openCallHistoryDialog","setOpenCallHistoryDialog","phoneNumber","setPhoneNumber","callDuration","setCallDuration","position","isDragging","dragRef","handleMouseDown","handleTouchStart","useDraggable","newPosition","sdkStateManager","iframePosition","iframeIsDragging","iframeDragRef","iframeHandleMouseDown","iframeHandleTouchStart","getProcessList","processList","usePostRequest","res","clickToCall","clickToCallLoading","holdOrUnHold","holdOrUnHoldLoading","error","muteOrUnMute","muteOrUnMuteLoading","readyAgentStatus","agentReadyLoading","updateAgentStatus","isLoading","endCall","endCallLoading","formatDuration","seconds","mins","secs","handleCloseQueueCounts","handleOpenDialer","event","handleCloseDialer","handleOpenAgentStatus","handleCloseAgentStatus","handleAgentReady","payload","END_POINT","handleUpdateAgentStatus","status","handleStartCall","number","handleHoldToggle","handleMuteToggle","handleEndCall","data","interval","elapsed","WS_END_POINT","e","ProcessorListDialog","__spreadValues","__spreadProps","IP","ConferenceDialog","CallTransferDialog","EndCallDispositionDialog","CallHistoryDialog","import_jsx_runtime","SDKProvider","children","ToastProvider","import_jsx_runtime","CallControlPanel","onDataChange","SDKProvider","CallControls","initSDK","apiKey","tenantId","agentId","sdkConfig","eventTracker","BASE_URL","res","sdkStateManager"]}
|