{"version":3,"sources":["../call-control-sdk/lib/hooks/eventsTracker.ts","../call-control-sdk/lib/utils/breakType.ts","../call-control-sdk/lib/utils/reloadDetection.ts","../call-control-sdk/lib/hooks/useLogout.ts","../call-control-sdk/lib/hooks/useEndCall.ts","../call-control-sdk/lib/hooks/useClickToCall.ts","../call-control-sdk/lib/hooks/useSDKState.ts","../call-control-sdk/lib/components/callControlPanel.tsx","../call-control-sdk/lib/components/callControls.tsx","../call-control-sdk/lib/components/dialog.tsx","../call-control-sdk/lib/utils/disposition.ts","../call-control-sdk/lib/services/request.ts","../call-control-sdk/lib/components/styles.ts","../call-control-sdk/lib/hooks/useDraggable.ts","../call-control-sdk/lib/services/micController.ts","../call-control-sdk/lib/utils/audioLoader.ts","../call-control-sdk/lib/components/callControlIframe.tsx","../call-control-sdk/lib/utils/unloadCallCleanup.ts","../call-control-sdk/lib/pages/sdkPages.tsx","../call-control-sdk/lib/hooks/useClickToConference.ts","../call-control-sdk/lib/angular-services/index.ts","../call-control-sdk/index.ts"],"sourcesContent":["import { sdkStateManager } from \"./sdk-state\";\r\n\r\nexport interface EventTrackerConfig {\r\n\tapiKey: string;\r\n\ttenantId: string;\r\n\tagentId: string;\r\n\tpassword?: string;\r\n\taccessToken?: string;\r\n\tbaseUrl?: string;\r\n\r\n\tretryAttempts?: number;\r\n\tqueueSize?: number;\r\n\tflushInterval?: number;\r\n}\r\n\r\nexport interface EventData {\r\n\t[key: string]: any;\r\n}\r\n\r\nexport interface EventTrackerInstance {\r\n\tinit(config: EventTrackerConfig): Promise<string | null>;\r\n\tisInitialized(): boolean;\r\n\tgetConfig(): EventTrackerConfig | null;\r\n}\r\n\r\nclass EventTrackerSDK implements EventTrackerInstance {\r\n\tprivate config: EventTrackerConfig | null = null;\r\n\tprivate ticketId: string | null = null;\r\n\tprivate baseUrl: string = \"\";\r\n\tprivate flushTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n\tasync init(config: EventTrackerConfig): Promise<any | null> {\r\n\t\tthis.config = {\r\n\t\t\tretryAttempts: 3,\r\n\t\t\tqueueSize: 100,\r\n\t\t\tflushInterval: 5000,\r\n\t\t\t...config,\r\n\t\t};\r\n\r\n\t\tthis.baseUrl = config.baseUrl || (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n\t\tconst ticket = await this.createTicket();\r\n\r\n\t\tthis.startPeriodicFlush();\r\n\r\n\t\treturn ticket;\r\n\t}\r\n\r\n\tisInitialized(): boolean {\r\n\t\treturn this.config !== null && this.ticketId !== null;\r\n\t}\r\n\r\n\tgetConfig(): EventTrackerConfig | null {\r\n\t\treturn this.config;\r\n\t}\r\n\r\n\tgetTicketId(): string | null {\r\n\t\treturn this.ticketId;\r\n\t}\r\n\r\n\tprivate async createTicket(): Promise<any | null> {\r\n\t\tif (!this.config) {\r\n\t\t\tthrow new Error(\"EventTracker not initialized\");\r\n\t\t}\r\n\r\n\t\t// If an accessToken is already provided, skip the login API call\r\n\t\t// if (this.config.accessToken) {\r\n\t\t// \treturn { accessToken: this.config.accessToken };\r\n\t\t// }\r\n\r\n\t\ttry {\r\n\t\t\t// Get device IP from storage for headers\r\n\t\t\tconst device_ip = \r\n\t\t\t\t(typeof sessionStorage !== \"undefined\" ? sessionStorage.getItem(\"device_ip\") : null) ||\r\n\t\t\t\t(typeof localStorage !== \"undefined\" ? localStorage.getItem(\"device_ip\") : null);\r\n\t\t\t\r\n\t\t\tconst headers: Record<string, string> = {\r\n\t\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t// Add x-device-ip header if available\r\n\t\t\tif (device_ip) {\r\n\t\t\t\theaders[\"x-device-ip\"] = device_ip;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tconst response = await this.makeRequest(\"/api/v1/auth/login\", { // login with base url - same as main application\r\n\t\t\t\tmethod: \"POST\",\r\n\t\t\t\theaders,\r\n\t\t\t\tbody: JSON.stringify({\r\n\t\t\t\t\tuserId: String(this.config.agentId ?? \"\"),\r\n\t\t\t\t\t// sessionId: this.config.sessionId,\r\n\t\t\t\t\tpassword: this.config.password\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\r\n\t\t\t// if (!response.ok) {\r\n\t\t\t// \tsdkStateManager.setInitCheck();\r\n\t\t\t// \tthrow new Error(`Failed to initialize: ${response.status} ${response.statusText}`);\r\n\t\t\t// }\r\n\r\n\t\t\tconst data = await response.json();\r\n\t\t\tthis.ticketId = data.ticketId;\r\n\r\n\r\n\t\t\treturn data;\r\n\t\t} catch (error) {\r\n\r\n\t\t\tthrow error;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate async makeRequest(url: string, options: RequestInit): Promise<Response> {\r\n\t\tconst fullUrl = `${this.baseUrl}${url}`;\r\n\t\tconst maxRetries = this.config?.retryAttempts || 3;\r\n\r\n\t\tfor (let attempt = 1; attempt <= maxRetries; attempt++) {\r\n\t\t\ttry {\r\n\t\t\t\tconst response = await fetch(fullUrl, options);\r\n\t\t\t\treturn response;\r\n\t\t\t} catch (error) {\r\n\t\t\t\tif (attempt === maxRetries) {\r\n\t\t\t\t\tthrow error;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst delay = Math.min(1000 * Math.pow(2, attempt - 1), 10000);\r\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthrow new Error(\"Max retries exceeded\");\r\n\t}\r\n\r\n\tprivate startPeriodicFlush(): void {\r\n\t\tif (this.flushTimer) {\r\n\t\t\tclearInterval(this.flushTimer);\r\n\t\t}\r\n\r\n\r\n\t}\r\n\r\n}\r\n\r\nexport const eventTracker = new EventTrackerSDK();\r\n\r\nif (typeof window !== \"undefined\") {\r\n\t(window as any).EventTracker = eventTracker;\r\n}\r\n","/**\n * Break names, backend-only.\n *\n * Every break name this dialer shows or posts has to be one the BACKEND gave —\n * a row of GET /api/v1/cti/breaks, a `break_details` from the agent-events\n * socket, or the break the agent themselves picked. A name invented here does\n * not stay local: it is written to PREVIOUS_AGENT_STATUS, and the unload and\n * reconnect paths post that key back as `break_type`, so the invention becomes\n * a break type in the backend's own records and then comes back down the socket\n * as the agent's break. That is where \"Wrapup Break\" came from.\n *\n * When nothing is known the answer is \"\" — the caller drops `break_details` and\n * leaves `break_type` off the payload (it is nullable in the AGENTBREAK schema).\n * The agent still reads as on break, because that comes from `status`; only the\n * name is missing, and the next socket frame or breaks-list load supplies it.\n */\n\n/** Placeholders the dialer uses for \"no break type\", never actual break types. */\nconst PLACEHOLDERS = [\"BREAK\", \"IDLE\", \"READY\"];\n\n/** The first candidate that is a real backend break name, else \"\". */\nexport const resolveBreakName = (...candidates: unknown[]): string => {\n  for (const candidate of candidates) {\n    const value = String(candidate ?? \"\").trim();\n    if (value && !PLACEHOLDERS.includes(value.toUpperCase())) return value;\n  }\n  return \"\";\n};\n\n/** The break the dialer last posted — itself a backend name when it was set. */\nexport const savedBreakName = (): string => {\n  try {\n    return (sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") || \"\").trim();\n  } catch {\n    return \"\";\n  }\n};\n\n/**\n * Record the break for the unload/reconnect paths to re-post. A blank name is\n * NOT written: the key means \"the backend has this break\", so an empty one must\n * leave whatever is there alone rather than storing a placeholder.\n */\nexport const rememberBreakName = (name: string): void => {\n  if (!name) return;\n  try {\n    sessionStorage.setItem(\"PREVIOUS_AGENT_STATUS\", name);\n  } catch {\n    // Storage is unavailable (private mode / blocked); the socket still names the break.\n  }\n};\n","let isReloading = false;\r\n\r\nif (typeof window !== \"undefined\") {\r\n  // Clear any leftover reload flag immediately on init\r\n  try {\r\n    sessionStorage.removeItem(\"IS_PAGE_RELOAD\");\r\n  } catch {}\r\n\r\n  let reloadTimeout: any = null;\r\n  const setReloadFlag = () => {\r\n    isReloading = true;\r\n    (window as any).__isReloading = true;\r\n\r\n    if (reloadTimeout) clearTimeout(reloadTimeout);\r\n    reloadTimeout = setTimeout(() => {\r\n      isReloading = false;\r\n      (window as any).__isReloading = false;\r\n    }, 5000);\r\n  };\r\n\r\n  // 1. Chromium Navigation API (Chrome 102+, Edge)\r\n  // ONLY fires for actual browser Reload button click\r\n  if ((window as any).navigation) {\r\n    try {\r\n      (window as any).navigation.addEventListener(\"navigate\", (e: any) => {\r\n        if (e?.navigationType === \"reload\") {\r\n          setReloadFlag();\r\n        }\r\n      });\r\n    } catch {}\r\n  }\r\n\r\n  // 2. Keyboard shortcuts for reload (F5, Ctrl+R, Cmd+R)\r\n  window.addEventListener(\r\n    \"keydown\",\r\n    (e: KeyboardEvent) => {\r\n      if (\r\n        e.key === \"F5\" ||\r\n        ((e.ctrlKey || e.metaKey) && (e.key === \"r\" || e.key === \"R\"))\r\n      ) {\r\n        setReloadFlag();\r\n      }\r\n    },\r\n    true\r\n  );\r\n\r\n  // 3. Programmatic reload hook\r\n  try {\r\n    const origReload = window.location.reload.bind(window.location);\r\n    window.location.reload = function () {\r\n      setReloadFlag();\r\n      return origReload();\r\n    };\r\n  } catch {}\r\n}\r\n\r\nexport const checkIsPageReload = (): boolean => {\r\n  return Boolean(isReloading || (typeof window !== \"undefined\" && (window as any).__isReloading));\r\n};\r\n\r\n// How THIS document was loaded, read once. Unlike checkIsPageReload (which has to\r\n// guess while the old page is closing and misses the browser's reload button),\r\n// the navigation entry is reliable for every kind of reload.\r\nconst documentReloaded = (() => {\r\n  try {\r\n    const nav = performance.getEntriesByType?.(\"navigation\")[0] as\r\n      | PerformanceNavigationTiming\r\n      | undefined;\r\n    return nav?.type === \"reload\";\r\n  } catch {\r\n    return false;\r\n  }\r\n})();\r\n\r\n/** True when this document came from a browser refresh (any trigger). */\r\nexport const wasDocumentReloaded = (): boolean => documentReloaded;\r\n\r\n/**\r\n * An id for THIS document. The fresh-login marker is stamped with it, so a marker\r\n * left behind by a login is only honoured in the page the login happened in — a\r\n * refresh is a new document and can never be mistaken for the login.\r\n */\r\nexport const DOCUMENT_ID: string = `${Date.now().toString(36)}-${Math.random()\r\n  .toString(36)\r\n  .slice(2)}`;\r\n\r\nexport const markIsPageReload = (val = true): void => {\r\n  isReloading = val;\r\n  if (typeof window !== \"undefined\") {\r\n    (window as any).__isReloading = val;\r\n  }\r\n};\r\n\r\nexport const RELOAD_PENDING_WRAPUP_KEY = \"RELOAD_PENDING_WRAPUP\";\r\nexport const WRAPUP_REMAINING_SECS_KEY = \"WRAPUP_REMAINING_SECS\";\r\n\r\nexport const readPendingWrapup = (): Record<string, any> | null => {\r\n  if (typeof sessionStorage === \"undefined\") return null;\r\n  try {\r\n    const raw = sessionStorage.getItem(RELOAD_PENDING_WRAPUP_KEY);\r\n    if (!raw) return null;\r\n    const parsed = JSON.parse(raw);\r\n    return parsed && typeof parsed === \"object\" ? parsed : null;\r\n  } catch {\r\n    return null;\r\n  }\r\n};\r\n\r\n/** Merge WRAPUP reload state so a later writer cannot drop remainingTime. */\r\nexport const saveReloadPendingWrapup = (patch: Record<string, unknown>): void => {\r\n  if (typeof sessionStorage === \"undefined\") return;\r\n  const prev = readPendingWrapup() || {};\r\n  const remainingTime = patch.remainingTime ?? prev.remainingTime;\r\n  try {\r\n    sessionStorage.setItem(\r\n      RELOAD_PENDING_WRAPUP_KEY,\r\n      JSON.stringify({\r\n        ...prev,\r\n        ...patch,\r\n        remainingTime,\r\n        status: \"WRAPUP\",\r\n        timestamp: Date.now(),\r\n      }),\r\n    );\r\n  } catch {\r\n    // sessionStorage can be unavailable while the document is closing.\r\n  }\r\n};\r\n\r\nexport const persistWrapupRemainingSecs = (seconds: number | null): void => {\r\n  if (typeof sessionStorage === \"undefined\") return;\r\n  try {\r\n    if (seconds == null || seconds <= 0) {\r\n      sessionStorage.removeItem(WRAPUP_REMAINING_SECS_KEY);\r\n      return;\r\n    }\r\n    sessionStorage.setItem(WRAPUP_REMAINING_SECS_KEY, String(Math.floor(seconds)));\r\n  } catch {\r\n    // Ignore storage failures during teardown.\r\n  }\r\n};\r\n\r\n/** A WRAPUP reload starts a fresh configured auto-wrap-up interval. */\r\nexport const resumedWrapupSeconds = (\r\n  pending: Record<string, any> | null | undefined,\r\n  fallback = 30,\r\n): number => {\r\n  const total = Number(pending?.auto_wrapup_time ?? fallback);\r\n  return Math.max(1, Math.floor(Number.isFinite(total) && total > 0 ? total : fallback));\r\n};\r\n","import { useCallback, useState } from \"react\";\r\n\r\nimport { END_POINT } from \"../services/endPoint\";\r\n\r\nimport { sdkStateManager } from \"./sdk-state\";\r\n\r\nimport axiosInstance from \"../services/axios\";\r\nimport { removeSession } from \"@react-solutions/vault\";\r\n// import { USB_LIGHT_ALL_OFF, USB_LIGHT_REQUEST } from \"../services/usbLight\";\r\nimport { STORAGE_KEY } from \"../utils/storage\";\r\nimport { useToast } from \"../services/toastMessage\";\r\n\r\nexport type LogoutFunction = () => Promise<any>;\r\n\r\nexport type LogoutHookStateTypes = {\r\n\tisLoading: boolean;\r\n\tisSuccess: boolean;\r\n\tisError: boolean;\r\n\terror: any;\r\n\tdata: any;\r\n};\r\n\r\nexport interface UseLogoutReturn extends LogoutHookStateTypes {\r\n\tlogout: LogoutFunction;\r\n}\r\n\r\nexport interface LogoutPayload {\r\n\taction: string;\r\n\tuserId: string;\r\n}\r\n\r\nexport const useLogout = () => {\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\tconst [error, setError] = useState(null);\r\n\r\n\tconst [data, setData] = useState(null);\r\n\r\n\tconst { showToast } = useToast();\r\n\r\n\tconst handleLogout = useCallback(async () => {\r\n\t\tsetLoading(true);\r\n\r\n\t\ttry {\r\n\t\t\tawait axiosInstance.post(END_POINT.AUTH_LOGOUT);\r\n\t\t} catch (err: any) {\r\n\t\t\tconst status = err?.response?.status;\r\n\t\t\t\r\n\t\t\t// 401/403 means session already invalid - treat as successful logout\r\n\t\t\tif (status === 401 || status === 403) {\r\n\t\t\t\tconsole.warn(\"[SDK logout] Session already invalid/expired; treating as already signed out.\", status);\r\n\t\t\t} else {\r\n\t\t\t\t// Only show error for actual failures (network, 500, etc.)\r\n\t\t\t\tconst message = err?.response?.data?.message || \"Logout failed. Please try again.\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\t// Always clear local state regardless of API response\r\n\t\t\tsdkStateManager.clearStorageAndReset();\r\n\t\t\tremoveSession(STORAGE_KEY);\r\n\t\t\tsetSuccess(true);\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\tlogout: handleLogout,\r\n\t\tisLoading: loading,\r\n\t\tisSuccess: success,\r\n\t\tisError: isError,\r\n\t\terror: error,\r\n\t\tdata: data,\r\n\t};\r\n};\r\n","import { useCallback, useState } from \"react\";\r\n\r\nimport { END_POINT } from \"../services/endPoint\";\r\n\r\nimport { sdkStateManager } from \"./sdk-state\";\r\n\r\nimport axiosInstance from \"../services/axios\";\r\nimport { getSession } from \"@react-solutions/vault\";\r\nimport { STORAGE_KEY } from \"../utils/storage\";\r\nimport { rememberBreakName, resolveBreakName, savedBreakName } from \"../utils/breakType\";\r\n\r\nexport type HookStateTypes = {\r\n\tisLoading: boolean;\r\n\tisSuccess: boolean;\r\n\tisError: boolean;\r\n\terror: any;\r\n\tdata: any;\r\n};\r\n\r\nexport interface EndCallPayload {\r\n\tcall_id?: string;\r\n\tagent_id?: string;\r\n\tset_followUp?: string;\r\n\tcallback_date?: string;\r\n\tcallback_hrs?: number;\r\n\tcallback_mins?: number;\r\n\tmobile_number?: string;\r\n\tlist_comments?: string;\r\n\tcall_reference_id?: string;\r\n\tis_mark_as_break?: boolean;\r\n\t/**\r\n\t * Break applied when `is_mark_as_break` is set — a backend break type (a row of\r\n\t * GET /cti/breaks). The hangup route applies it itself; omitted or empty, the\r\n\t * backend falls back to its own post-call break.\r\n\t */\r\n\tbreak_type?: string;\r\n\tdisposition?: string;\r\n\tline_number?: number;\r\n\treason?: string;\r\n\tpatientLog?: any;\r\n}\r\n\r\nexport type CallTerminationFunction = (data: EndCallPayload) => Promise<any>;\r\n\r\nexport interface UseEndCallReturn extends HookStateTypes {\r\n\thandleEndCall: CallTerminationFunction;\r\n}\r\n\r\nexport const useEndCall = () => {\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\tconst [error, setError] = useState(null);\r\n\r\n\tconst [data, setData] = useState(null);\r\n\r\n\tconst handleEndCall = useCallback(\r\n\t\tasync (data: EndCallPayload = {}) => {\r\n\t\t\tconst state = getSession(STORAGE_KEY) as any;\r\n\r\n\t\t\tsetLoading(true);\r\n\r\n\t\t\tconst payload = {\r\n\t\t\t\tcall_id: data?.call_id ?? state?.callData?.call_id ?? \"\",\r\n\t\t\t\tagent_id: data?.agent_id ?? state?.agentId ?? \"\",\r\n\t\t\t\tset_followUp: data?.set_followUp ?? \"N\",\r\n\t\t\t\tcallback_date: data?.callback_date ?? \"\",\r\n\t\t\t\tcallback_hrs: data?.callback_hrs ?? 0,\r\n\t\t\t\tcallback_mins: data?.callback_mins ?? 0,\r\n\t\t\t\tmobile_number: data?.mobile_number ?? state?.callData?.phone_number ?? \"\",\r\n\t\t\t\tlist_comments: data?.list_comments ?? \"\",\r\n\t\t\t\tcall_reference_id: data?.call_reference_id ?? state?.callData?.call_id ?? \"\",\r\n\t\t\t\tis_mark_as_break: data?.is_mark_as_break ?? false,\r\n\t\t\t\tbreak_type: data?.is_mark_as_break ? (data?.break_type ?? \"\") : \"\",\r\n\t\t\t\tdisposition: data?.disposition ?? \"RES\",\r\n\t\t\t\tline_number: data?.line_number ?? 0,\r\n\t\t\t\treason: data?.reason ?? \"normal\",\r\n\t\t\t};\r\n\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.END_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\tsdkStateManager.resetConferenceLines();\r\n\t\t\t\t\tsdkStateManager.endCall();\r\n\r\n\t\t\t\t\tif (payload.is_mark_as_break) {\r\n\t\t\t\t\t\t// The break the caller named on this hangup, else the one the agent\r\n\t\t\t\t\t\t// last took, else none. This used to be the fixed string \"First\r\n\t\t\t\t\t\t// Login\", which the reconnect and unload paths then posted back as a\r\n\t\t\t\t\t\t// real break_type.\r\n\t\t\t\t\t\tconst breakName = resolveBreakName(payload.break_type, savedBreakName());\r\n\t\t\t\t\t\tsdkStateManager.updateCallData({\r\n\t\t\t\t\t\t\tstatus: \"BREAK\",\r\n\t\t\t\t\t\t\tcall_id: \"\",\r\n\t\t\t\t\t\t\tphone_number: \"\",\r\n\t\t\t\t\t\t\tbreak_details: breakName ? { type: breakName, value: breakName } : null,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tsdkStateManager.setAgentStatus(breakName);\r\n\t\t\t\t\t\trememberBreakName(breakName);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsetData(res?.data);\r\n\r\n\t\t\t\t\tsetSuccess(true);\r\n\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\tsetIsError(true);\r\n\r\n\t\t\t\t\tsetError(err);\r\n\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\treturn {\r\n\t\thandleEndCall,\r\n\t\tisLoading: loading,\r\n\t\tisSuccess: success,\r\n\t\tisError: isError,\r\n\t\terror: error,\r\n\t\tdata: data,\r\n\t};\r\n};\r\n","import { useCallback, useState } from \"react\";\r\n\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport { getSession } from \"@react-solutions/vault\";\r\nimport { STORAGE_KEY } from \"../utils/storage\";\r\nimport { da } from \"date-fns/locale\";\r\n\r\nexport interface StartCallPayload {\r\n\tmobileNumber: string;\r\n\tuser?: string;\r\n\tauto_answer?: boolean;\r\n\tcall_id?: string;\r\n\treference_id?: string;\r\n\tcall_source?: string;\r\n\tcaseId?: string;\r\n\tisWrapup?: boolean;\r\n\tparentCallUuid?: string;\r\n}\r\n\r\nexport type CallInitiationFunction = (data: StartCallPayload) => Promise<any>;\r\n\r\nexport type StartCalltHookStateTypes = {\r\n\tisLoading: boolean;\r\n\tisSuccess: boolean;\r\n\tisError: boolean;\r\n\terror: any;\r\n\tdata: any;\r\n};\r\n\r\nexport interface UseClickToCallReturn extends StartCalltHookStateTypes {\r\n\thandleStartCall: CallInitiationFunction;\r\n}\r\n\r\nexport const useClickToCall = () => {\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst [success, setSuccess] = useState(false);\r\n\r\n\tconst [isError, setIsError] = useState(false);\r\n\r\n\tconst [error, setError] = useState(null);\r\n\r\n\tconst [data, setData] = useState(null);\r\n\r\n\tconst handleStartCall = useCallback(async (data: StartCallPayload) => {\r\n\t\tif (loading) return;\r\n\t\tconst state = getSession(STORAGE_KEY) as any;\r\n\t\tconst status = state?.callData?.status;\r\n\r\n\t\tsetLoading(true);\r\n\r\n\t\tif (status === \"IDLE\" || status === \"ONCALL\" || status === \"WRAPUP\") {\r\n\t\t\t// rootCallUuid chaining only runs when disableAlternateDialing is true;\r\n\t\t\t// otherwise parentCallUuid stays \"\" and the chain is cleared.\r\n\t\t\t// Caller-supplied parentCallUuid still wins as an explicit override.\r\n\t\t\tconst liveState = sdkStateManager.getState();\r\n\t\t\tconst isWrapupCall = status === \"WRAPUP\";\r\n\r\n\t\t\tlet parentCallUuid = \"\";\r\n\t\t\tif (data?.parentCallUuid) {\r\n\t\t\t\tparentCallUuid = data.parentCallUuid;\r\n\t\t\t} else if (liveState.sdkConfig?.disableAlternateDialing) {\r\n\t\t\t\tif (isWrapupCall) {\r\n\t\t\t\t\tif (liveState.rootCallUuid) {\r\n\t\t\t\t\t\tparentCallUuid = liveState.rootCallUuid;\r\n\t\t\t\t\t} else if (state?.callData?.call_id) {\r\n\t\t\t\t\t\tparentCallUuid = state.callData.call_id;\r\n\t\t\t\t\t\tsdkStateManager.setRootCallUuid(parentCallUuid);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (liveState.rootCallUuid) {\r\n\t\t\t\t\tsdkStateManager.setRootCallUuid(null);\r\n\t\t\t\t}\r\n\t\t\t} else if (liveState.rootCallUuid) {\r\n\t\t\t\tsdkStateManager.setRootCallUuid(null);\r\n\t\t\t}\r\n\r\n\t\t\tconst payload = {\r\n\t\t\t\tphone_number: data?.mobileNumber,\r\n\t\t\t\tuser: data?.user ?? state?.agentId ?? \"\",\r\n\t\t\t\tauto_answer: data?.auto_answer ?? false,\r\n\t\t\t\tcall_id: state?.callData?.call_id ?? data?.call_id ?? \"\",\r\n\t\t\t\treference_id: data?.reference_id ?? \"\",\r\n\t\t\t\tcall_source: data?.call_source ?? \"\",\r\n\t\t\t\tcaseId: data?.caseId ?? \"\",\r\n\t\t\t\tisWrapup: data?.isWrapup ?? false,\r\n\t\t\t\tparentCallUuid:data?.parentCallUuid ?? data.parentCallUuid ?? parentCallUuid ?? \"\" ,\r\n\t\t\t};\r\n\r\n\t\t\treturn axiosInstance\r\n\t\t\t\t.post(END_POINT.CLICK_TO_CALL, payload)\r\n\t\t\t\t.then((res) => {\r\n\t\t\t\t\tsdkStateManager.resetConferenceLines();\r\n\t\t\t\t\tsetData(res?.data);\r\n\r\n\t\t\t\t\tsetSuccess(true);\r\n\r\n\t\t\t\t\treturn res?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => {\r\n\t\t\t\t\tsetIsError(true);\r\n\r\n\t\t\t\t\tsetError(err);\r\n\r\n\t\t\t\t\treturn err?.response?.data;\r\n\t\t\t\t})\r\n\t\t\t\t.finally(() => {\r\n\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\tsetLoading(false);\r\n\t\t\talert(\"Agent is not ready\");\r\n\t\t}\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\thandleStartCall,\r\n\t\tisLoading: loading,\r\n\t\tisSuccess: success,\r\n\t\tisError: isError,\r\n\t\terror: error,\r\n\t\tdata: data,\r\n\t};\r\n};\r\n\r\n\r\n","import { useState, useEffect } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { SDKState } from \"../../types\";\r\n\r\nexport function useSDKState(): SDKState {\r\n\tconst [state, setState] = useState<SDKState>(sdkStateManager.getState());\r\n\r\n\tuseEffect(() => {\r\n\t\tconst unsubscribe = sdkStateManager.subscribe(() => {\r\n\t\t\tsetState(sdkStateManager.getState());\r\n\t\t});\r\n\r\n\t\treturn unsubscribe;\r\n\t}, []);\r\n\r\n\treturn state;\r\n}\r\n","import { memo, useCallback } from \"react\";\r\nimport type { CallControlPanelProps } from \"../../types\";\r\nimport { CallControls } from \"./callControls\";\r\nimport { SDKProvider } from \"./SDKProvider\";\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport { SDK_PERMISSIONS } from \"../permissions\";\r\n\r\nexport const CallControlPanel = memo<CallControlPanelProps>(({ onDataChange }) => {\r\n\tconst { sdk } = useSDKState();\r\n\r\n\tconst handleDataChange = useCallback(\r\n\t\t(data: any) => {\r\n\t\t\ttry {\r\n\t\t\t\tif (onDataChange && typeof onDataChange === \"function\") {\r\n\t\t\t\t\tonDataChange(data);\r\n\t\t\t\t}\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error(\"Error in CallControlPanel data change handler:\", error);\r\n\t\t\t}\r\n\t\t},\r\n\t\t[onDataChange]\r\n\t);\r\n\r\n\tconst sdkObject = sdk?.calls;\r\n\tconst hasDialerAccess =\r\n\t\tsdkObject?.enabled &&\r\n\t\tsdkObject?.items?.some(\r\n\t\t\t(item: any) =>\r\n\t\t\t\titem.code === SDK_PERMISSIONS.CALL_OUTBOUND ||\r\n\t\t\t\titem.code === SDK_PERMISSIONS.CALL_INBOUND,\r\n\t\t);\r\n\r\n\tif (!hasDialerAccess) return null;\r\n\r\n\treturn (\r\n\t\t<SDKProvider>\r\n\t\t\t<CallControls onDataChange={handleDataChange} />\r\n\t\t</SDKProvider>\r\n\t);\r\n});\r\n\r\nCallControlPanel.displayName = \"CallControlPanel\";\r\n","import AccessTime from \"@mui/icons-material/AccessTime\";\r\nimport CallEnd from \"@mui/icons-material/CallEnd\";\r\nimport CallMade from \"@mui/icons-material/CallMade\";\r\nimport CallReceived from \"@mui/icons-material/CallReceived\";\r\nimport Close from \"@mui/icons-material/Close\";\r\nimport DragIndicator from \"@mui/icons-material/DragIndicator\";\r\nimport Group from \"@mui/icons-material/Group\";\r\nimport KeyboardArrowDown from \"@mui/icons-material/KeyboardArrowDown\";\r\nimport History from \"@mui/icons-material/History\";\r\nimport Layers from \"@mui/icons-material/Layers\";\r\nimport Mic from \"@mui/icons-material/Mic\";\r\nimport MicOff from \"@mui/icons-material/MicOff\";\r\nimport Pause from \"@mui/icons-material/Pause\";\r\nimport Pending from \"@mui/icons-material/Pending\";\r\nimport Phone from \"@mui/icons-material/Phone\";\r\nimport PlayArrow from \"@mui/icons-material/PlayArrow\";\r\nimport SupportAgent from \"@mui/icons-material/SupportAgent\";\r\nimport Timer from \"@mui/icons-material/Timer\";\r\nimport TransferWithinAStation from \"@mui/icons-material/TransferWithinAStation\";\r\nimport Upcoming from \"@mui/icons-material/Upcoming\";\r\nimport WifiCalling3 from \"@mui/icons-material/WifiCalling3\";\r\nimport SendRounded from \"@mui/icons-material/SendRounded\";\r\nimport SmsSharp from \"@mui/icons-material/SmsSharp\";\r\nimport MoreVert from \"@mui/icons-material/MoreVert\";\r\nimport {\r\n  Box,\r\n  Button,\r\n  Chip,\r\n  CircularProgress,\r\n  Dialog,\r\n  DialogContent,\r\n  DialogTitle,\r\n  Divider,\r\n  Fade,\r\n  IconButton,\r\n  InputAdornment,\r\n  List,\r\n  ListItemButton,\r\n  ListItemIcon,\r\n  ListItemText,\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 { alpha } from \"@mui/material/styles\";\r\nimport InfoOutlinedIcon from \"@mui/icons-material/InfoOutlined\";\r\nimport React, { useEffect, useRef, useState } from \"react\";\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 { clearDispoDraft } from \"../utils/disposition\";\r\nimport { rememberBreakName, resolveBreakName, savedBreakName } from \"../utils/breakType\";\r\n\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport { useDraggable } from \"../hooks/useDraggable\";\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport { useSDKPermissions } from \"../hooks/useSDKPermissions\";\r\nimport { SDK_PERMISSIONS } from \"../permissions\";\r\n\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { usePostRequest } from \"../services/request\";\r\nimport axiosInstance from \"../services/axios\";\r\nimport { useToast } from \"../services/toastMessage\";\r\nimport { createMicController, MicController } from \"../services/micController\";\r\nimport useStyles from \"./styles\";\r\n\r\nimport { CallControlPanelProps, CallStatus } from \"../../types\";\r\n\r\nimport {\r\n  createAudioElement,\r\n  cleanupAudioResources,\r\n} from \"../utils/audioLoader\";\r\nimport { getSession } from \"@react-solutions/vault\";\r\n// import { USB_LIGHT_FLASH, USB_LIGHT_ON, USB_LIGHT_REQUEST } from \"../services/usbLight\";\r\nimport { STORAGE_KEY } from \"../utils/storage\";\r\nimport { DOCUMENT_ID, wasDocumentReloaded } from \"../utils/reloadDetection\";\r\n\r\n// ── The break across a browser refresh (refresh only) ──────────────────────────\r\n// The break the dialer showed when the page unloaded, saved on pagehide. After a\r\n// REFRESH it is the one status the dialer shows: a refresh drops the browser's\r\n// WebRTC socket, the backend releases the extension, and the phone's\r\n// /agents/register after the reload assigns it again — resetting the agent to its\r\n// initial \"Not Ready\" break — while the panel's own login-break paths can fall back\r\n// to the first system break. Read ONCE per page, at module load, so every mount of\r\n// the panel and every path that names a break sees the same value.\r\nconst BREAK_BEFORE_RELOAD_KEY = \"AHS_BREAK_BEFORE_RELOAD\";\r\n\r\ntype ReloadBreakGuard = { name: string; restores: number; pending: boolean };\r\n\r\nconst readBreakBeforeReload = (): ReloadBreakGuard | null => {\r\n  if (typeof window === \"undefined\" || !wasDocumentReloaded()) return null;\r\n  let name = \"\";\r\n  try {\r\n    name = resolveBreakName(sessionStorage.getItem(BREAK_BEFORE_RELOAD_KEY));\r\n  } catch {\r\n    return null;\r\n  }\r\n  if (!name) return null;\r\n  // Back on screen before the panel first renders, and made the saved break that\r\n  // every other path (reconnect restore, breaks backfill, frame naming) reads.\r\n  sdkStateManager.updateCallData({\r\n    status: \"BREAK\",\r\n    break_details: { type: name, value: name },\r\n  });\r\n  sdkStateManager.setAgentStatus(name);\r\n  rememberBreakName(name);\r\n  return { name, restores: 0, pending: false };\r\n};\r\n\r\nlet reloadBreakGuard: ReloadBreakGuard | null = readBreakBeforeReload();\r\n\r\n/** The agent changed status themselves, or a call started: the refresh is over. */\r\nconst endReloadBreakGuard = (): void => {\r\n  reloadBreakGuard = null;\r\n  try {\r\n    sessionStorage.removeItem(BREAK_BEFORE_RELOAD_KEY);\r\n  } catch {\r\n    // Storage blocked — pagehide rewrites the key anyway.\r\n  }\r\n};\r\n\r\nconst getCombineConfrenceData = (localState: any, apiData: any) => {\r\n  const localConfrenceData = localState?.conferenceLine;\r\n  const apiConferenceData = apiData?.conferencestatus;\r\n  const updatedConferenceData = localConfrenceData.map((item: any) => {\r\n    if (item?.line === 1) {\r\n      const statusKey = `line_${item.line}_status`;\r\n      return {\r\n        ...item,\r\n        line: 1,\r\n        status: apiConferenceData?.[statusKey] ?? localState?.callData?.status,\r\n        phone: localState?.callData?.phone_number ?? \"\",\r\n      };\r\n    } else {\r\n      const statusKey = `line_${item.line}_status`;\r\n      const phoneKey = `line_${item.line}_phonenumber`;\r\n\r\n      const newStatus = apiConferenceData\r\n        ? (apiConferenceData[statusKey] ?? \"IDLE\")\r\n        : item.status;\r\n      let newPhone = apiConferenceData?.[phoneKey];\r\n\r\n      if (newPhone === null || newPhone === \"0\" || newPhone === undefined) {\r\n        newPhone = newStatus === \"IDLE\" ? \"\" : item.phone;\r\n      }\r\n\r\n      return {\r\n        ...item,\r\n        status: newStatus,\r\n        phone: newPhone,\r\n      };\r\n    }\r\n  });\r\n\r\n  return updatedConferenceData;\r\n};\r\n\r\nconst normalizeDialNumber = (raw: string): string => {\r\n  if (!raw) return \"\";\r\n  const str = String(raw).trim();\r\n  // If it's a short code or contains * or # (e.g. *123#, #101), preserve *, #, + and digits, strip whitespace and formatting separators\r\n  if (str.includes(\"*\") || str.includes(\"#\")) {\r\n    return str.replace(/[\\s\\-\\(\\)\\.\\/\\,]/g, \"\");\r\n  }\r\n  // Remove formatting separators: spaces, hyphens, parentheses, slashes, dots, commas\r\n  let cleaned = str.replace(/[\\s\\-\\(\\)\\.\\/\\,]/g, \"\");\r\n  // If user included +91 country code prefix, normalize by stripping +91\r\n  if (cleaned.startsWith(\"+91\")) {\r\n    cleaned = cleaned.slice(3);\r\n  } else if (cleaned.startsWith(\"+\")) {\r\n    cleaned = cleaned.slice(1);\r\n  }\r\n  // If 12 digits starting with 91, strip 91 country code\r\n  const digitsOnly = cleaned.replace(/\\D/g, \"\");\r\n  if (digitsOnly.length === 12 && digitsOnly.startsWith(\"91\")) {\r\n    return digitsOnly.slice(2);\r\n  }\r\n  return cleaned;\r\n};\r\n\r\n// Outbound manual dialling supports:\r\n// - 10-digit mobile numbers (e.g. 9876543210, +91-98765-43210)\r\n// - 11-digit landline numbers with STD code (e.g. 080-69200202, 01123456789)\r\n// - 3-8 digit local landline / intercom extensions / short codes (*123#, #101)\r\n// - Numbers with special formatting characters (+, -, *, #, (), spaces)\r\nconst MIN_DIAL_DIGITS = 3;\r\nconst MAX_DIAL_DIGITS = 20;\r\n\r\nconst RECENT_NUMBERS_STORAGE_KEY = \"CTI_RECENT_DIALED_NUMBERS\";\r\n\r\nconst getTodayDateKey = (): string => {\r\n  const now = new Date();\r\n  return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}`;\r\n};\r\n\r\ninterface StoredRecentCallItem {\r\n  number: string;\r\n  time: string;\r\n  timestamp: number;\r\n  direction?: \"INBOUND\" | \"OUTBOUND\";\r\n}\r\n\r\ninterface StoredRecentData {\r\n  date: string;\r\n  items?: StoredRecentCallItem[];\r\n  numbers?: string[];\r\n}\r\n\r\nconst getStoredRecentNumbers = (): StoredRecentCallItem[] => {\r\n  try {\r\n    const raw = localStorage.getItem(RECENT_NUMBERS_STORAGE_KEY);\r\n    if (!raw) return [];\r\n    const parsed = JSON.parse(raw) as StoredRecentData;\r\n    const today = getTodayDateKey();\r\n    if (parsed && typeof parsed === \"object\" && parsed.date === today) {\r\n      if (Array.isArray(parsed.items)) {\r\n        return parsed.items;\r\n      }\r\n      if (Array.isArray(parsed.numbers)) {\r\n        const timeStr = new Date().toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\r\n        return parsed.numbers.map((num) => ({\r\n          number: num,\r\n          time: timeStr,\r\n          timestamp: Date.now(),\r\n          direction: \"OUTBOUND\",\r\n        }));\r\n      }\r\n    }\r\n    return [];\r\n  } catch {\r\n    return [];\r\n  }\r\n};\r\n\r\nconst storeRecentNumber = (\r\n  num: string,\r\n  direction: \"INBOUND\" | \"OUTBOUND\" = \"OUTBOUND\"\r\n): void => {\r\n  if (!num || num.trim().length < 3) return;\r\n  try {\r\n    const today = getTodayDateKey();\r\n    const existing = getStoredRecentNumbers();\r\n    const clean = num.trim();\r\n    const now = new Date();\r\n    const timeStr = now.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\r\n    const newItem: StoredRecentCallItem = {\r\n      number: clean,\r\n      time: timeStr,\r\n      timestamp: now.getTime(),\r\n      direction,\r\n    };\r\n    const updatedItems = [\r\n      newItem,\r\n      ...existing.filter((item) => item.number !== clean),\r\n    ].slice(0, 50);\r\n    const data: StoredRecentData = {\r\n      date: today,\r\n      items: updatedItems,\r\n    };\r\n    localStorage.setItem(RECENT_NUMBERS_STORAGE_KEY, JSON.stringify(data));\r\n  } catch (e) {\r\n    console.error(\"Failed to store recent number:\", e);\r\n  }\r\n};\r\n\r\nconst formatDuration = (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// ── Lead-details dialog helpers ──────────────────────────────────────────────\r\n// Turn a snake_case / camelCase key into a readable label.\r\nfunction humanizeLeadKey(k: string): string {\r\n  return k\r\n    .replace(/_/g, \" \")\r\n    .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\r\n    .replace(/\\s+/g, \" \")\r\n    .trim()\r\n    .replace(/\\b\\w/g, (c) => c.toUpperCase());\r\n}\r\n// Keys not worth surfacing in the lead-details dialog (internal ids, timestamps,\r\n// raw references). `displayData` / `customData` are handled conditionally below.\r\nconst LEAD_HIDDEN_KEYS = new Set([\r\n  \"voicemail\",\r\n  \"customData_raw\",\r\n  \"id\",\r\n  \"createdAt\",\r\n  \"updatedAt\",\r\n  \"sourceReference\",\r\n  \"externalReferenceId\",\r\n  \"originalCallId\",\r\n  \"originalQueueId\",\r\n  \"originalWaitTime\",\r\n  \"latestCallId\",\r\n  \"attemptCount\",\r\n  \"lastAttemptAt\",\r\n  \"nextAttemptAt\",\r\n  \"lastOutcome\",\r\n  \"lastReason\",\r\n  \"scheduledAt\",\r\n  \"expiresAt\",\r\n  \"completedAt\",\r\n  \"priority\",\r\n  \"status\",\r\n  \"source_type\",\r\n]);\r\n// Hide internal ids/reference keys (campaignId, tenantId, source_lead_id, …).\r\nfunction isHiddenLeadKey(k: string): boolean {\r\n  if (LEAD_HIDDEN_KEYS.has(k)) return true;\r\n  return /^id$/i.test(k) || /Id$/.test(k) || /_id$/i.test(k);\r\n}\r\n// True when a value carries something worth showing (not null/empty).\r\nfunction hasLeadContent(v: unknown): boolean {\r\n  return (\r\n    v !== null &&\r\n    v !== undefined &&\r\n    v !== \"\" &&\r\n    !(Array.isArray(v) && v.length === 0) &&\r\n    !(typeof v === \"object\" && !Array.isArray(v) && Object.keys(v as object).length === 0)\r\n  );\r\n}\r\n// True only when lead_details has at least one field worth showing (after\r\n// hiding ids/timestamps and applying the displayData/customData rule) — used\r\n// to gate the info icon / dialog so they never open on empty lead data.\r\nfunction leadHasVisibleContent(data: any): boolean {\r\n  if (!data || typeof data !== \"object\") return false;\r\n  const showDisplayData = hasLeadContent(data.displayData);\r\n  return Object.entries(data).some(([k, v]) => {\r\n    if (isHiddenLeadKey(k)) return false;\r\n    if (k === \"displayData\") return showDisplayData && leadHasVisibleContent(v);\r\n    if (k === \"customData\") return !showDisplayData && leadHasVisibleContent(v);\r\n    if (v && typeof v === \"object\" && !Array.isArray(v)) return leadHasVisibleContent(v);\r\n    return hasLeadContent(v);\r\n  });\r\n}\r\n\r\nfunction LeadRow({ label, value }: { label: string; value: string }) {\r\n  return (\r\n    <Box sx={{ display: \"flex\", gap: \"10px\", alignItems: \"baseline\", py: \"1px\" }}>\r\n      <Typography sx={{ fontSize: \"0.74rem\", color: \"text.secondary\", minWidth: 150, flexShrink: 0 }}>{label}</Typography>\r\n      <Typography sx={{ fontSize: \"0.78rem\", color: \"text.primary\", fontWeight: 500, wordBreak: \"break-word\", minWidth: 0 }}>{value}</Typography>\r\n    </Box>\r\n  );\r\n}\r\n\r\n// Recursively renders the socket's lead_details object: primitives as label/value\r\n// rows, arrays joined, nested objects (customData, address, …) as indented sections.\r\nfunction LeadDetailsView({ data }: { data: any }) {\r\n  if (!data || typeof data !== \"object\") return null;\r\n  // Prefer displayData when present; otherwise fall back to customData. Only\r\n  // one of the two is ever shown.\r\n  const showDisplayData = hasLeadContent((data as any).displayData);\r\n  const entries = Object.entries(data).filter(([k, v]) => {\r\n    if (isHiddenLeadKey(k)) return false;\r\n    if (k === \"displayData\") return showDisplayData;\r\n    if (k === \"customData\") return !showDisplayData;\r\n    return hasLeadContent(v);\r\n  });\r\n  if (!entries.length) {\r\n    return <Typography sx={{ fontSize: \"0.8rem\", color: \"text.secondary\" }}>No lead details available.</Typography>;\r\n  }\r\n  return (\r\n    <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: \"5px\" }}>\r\n      {entries.map(([k, v]) => {\r\n        const label = humanizeLeadKey(k);\r\n        if (Array.isArray(v)) {\r\n          return <LeadRow key={k} label={label} value={v.map((x) => String(x)).join(\", \")} />;\r\n        }\r\n        if (v && typeof v === \"object\") {\r\n          return (\r\n            <Box key={k} sx={{ mt: \"6px\" }}>\r\n              <Typography sx={{ fontSize: \"0.72rem\", fontWeight: 700, color: \"primary.main\", textTransform: \"uppercase\", letterSpacing: \"0.04em\", mb: \"4px\" }}>{label}</Typography>\r\n              <Box sx={{ pl: \"10px\", borderLeft: \"2px solid\", borderColor: \"divider\" }}>\r\n                <LeadDetailsView data={v} />\r\n              </Box>\r\n            </Box>\r\n          );\r\n        }\r\n        return <LeadRow key={k} label={label} value={String(v)} />;\r\n      })}\r\n    </Box>\r\n  );\r\n}\r\n\r\nexport function CallControls({ onDataChange }: CallControlPanelProps) {\r\n  const theme = useTheme();\r\n  const state = useSDKState();\r\n  const { showToast } = useToast();\r\n  const { hasPermission } = useSDKPermissions();\r\n  const canBreak =\r\n    !(state.sdkConfig as any)?.disableAgentBreak ||\r\n    hasPermission(SDK_PERMISSIONS.DISPOSITION_MARK_AS_BREAK) ||\r\n    hasPermission(SDK_PERMISSIONS.WILDCARD);\r\n  const canViewIdleCountdown =\r\n    hasPermission(SDK_PERMISSIONS.IDLE_TIME_COUNTDOWN) ||\r\n    hasPermission(SDK_PERMISSIONS.WILDCARD);\r\n  const canViewBreakCountdown =\r\n    hasPermission(SDK_PERMISSIONS.BREAK_TIME_COUNTDOWN) ||\r\n    hasPermission(SDK_PERMISSIONS.WILDCARD);\r\n\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 micRef = useRef<MicController | null>(null);\r\n  const webSocketRef = useRef<WebSocket | null>(null);\r\n  const audioRef = useRef<HTMLAudioElement | null>(null);\r\n  const reconnectTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\r\n    null,\r\n  );\r\n  const pingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\r\n  // Correlation ids already acked (POST /agents/events/ack), so a re-delivered\r\n  // frame isn't acked twice. Bounded — only recent ids matter.\r\n  const ackedEventIdsRef = useRef<string[]>([]);\r\n  const reconnectAttemptsRef = useRef<number>(0);\r\n  const hasFlashedRef = useRef(false);\r\n  const lastEventTimeRef = useRef<string | null>(null);\r\n  const conferenceAutoOpenedRef = useRef<boolean>(false);\r\n  // ── NEW: ref to record when hold started ──────────────────────────────────\r\n  const holdStartTimeRef = useRef<number | null>(null);\r\n  // ── NEW: ref to record when mute started ──────────────────────────────────\r\n  const muteStartTimeRef = useRef<number | null>(null);\r\n  // Start of the current Available (READY/IDLE) stretch — how long the agent has\r\n  // been waiting for a call. Anchored to the LOCAL clock at the first idle render\r\n  // rather than the socket's event_time: that timestamp carries clock skew and,\r\n  // on some events, the call-start instant rather than the state-change instant,\r\n  // so an idle agent would see a wildly wrong \"idle for 3 hours\". Cleared\r\n  // whenever the status leaves Available, so the next stretch counts from zero.\r\n  const idleStartTimeRef = useRef<number | null>(null);\r\n  // Start of the current break, anchored to the LOCAL clock at the first break\r\n  // render for the same reason idleStartTimeRef is — the socket's event_time\r\n  // carries clock skew and, on some events, the call-start instant. Cleared\r\n  // whenever the agent leaves break, or moves to a different break type, so the\r\n  // next one counts from zero.\r\n  const breakStartTimeRef = useRef<number | null>(null);\r\n  // Break type the running break clock belongs to (upper-cased). A different type\r\n  // re-anchors breakStartTimeRef; null while not on a break.\r\n  const breakTypeRef = useRef<string | null>(null);\r\n  const lastWasMarkAsBreakRef = useRef<boolean>(false);\r\n  // The break type that went out with that hangup, as the agent picked it in the\r\n  // disposition dialog's break picker. Read again in endCall's onSuccess, which\r\n  // paints the break a second time once the backend confirms the hangup and no\r\n  // longer has the submitted form to read it from.\r\n  const pickedBreakTypeRef = useRef<string>(\"\");\r\n  // Call the last hangup was posted for, so its autosaved disposition draft can be\r\n  // dropped on success — by then state.callData.call_id has already been blanked.\r\n  const lastEndedCallIdRef = useRef<string>(\"\");\r\n  // Is the disposition dialog on screen? Needed inside the websocket handler,\r\n  // which is installed once per agentId (see the [state.agentId] effect) and so\r\n  // closes over whatever `openCallDisposition` held at connect time. Kept in\r\n  // sync by the effect below rather than at the setState call sites, because the\r\n  // dialog closes itself through its own `setOpen` prop.\r\n  const openCallDispositionRef = useRef<boolean>(false);\r\n  // Call whose wrap-up has already finished — either the socket ended it or the\r\n  // agent dispositioned it. The backend re-announces WRAPUP for a call after the\r\n  // fact, and that must not put the agent back into a wrap-up they are done with.\r\n  const endedWrapupCallIdRef = useRef<string>(\"\");\r\n\r\n  const maxReconnectAttempts = 60;\r\n  const baseReconnectDelay = 2000;\r\n  const maxReconnectDelay = 30000;\r\n\r\n  const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\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 [ambulanceAnchorEl, setAmbulanceAnchorEl] =\r\n    useState<null | HTMLElement>(null);\r\n  const [moreOptionsAnchorEl, setMoreOptionsAnchorEl] =\r\n    useState<null | HTMLElement>(null);\r\n\r\n  const [showIframe, setShowIframe] = useState<boolean>(true);\r\n  const [openCallDisposition, setOpenCallDisposition] =\r\n    useState<boolean>(false);\r\n  useEffect(() => {\r\n    openCallDispositionRef.current = openCallDisposition;\r\n  }, [openCallDisposition]);\r\n  const [openProcessorDialog, setOpenProcessorDialog] =\r\n    useState<boolean>(false);\r\n  const [openCallHistoryDialog, setOpenCallHistoryDialog] =\r\n    useState<boolean>(false);\r\n\r\n  const [processList, setProcessList] = useState<\r\n    | {\r\n        process_id: number;\r\n        process_name: string;\r\n      }[]\r\n    | null\r\n  >(null);\r\n\r\n  // The AGENT-SELECTABLE breaks only — what the presence menu renders. System rows\r\n  // (is_system) are the backend's own break types and are filtered out of this list\r\n  // when it is fetched; they exist only to name the post-login break. See\r\n  // loginBreakTypeRef.\r\n  const [breaksList, setBreaksList] = useState<\r\n    | {\r\n        type: string;\r\n        duration: string;\r\n        description: string;\r\n        active: boolean;\r\n        is_system?: boolean;\r\n        isSystem?: boolean;\r\n      }[]\r\n    | null\r\n  >(null);\r\n  const [phoneNumber, setPhoneNumber] = useState<string>(\"\");\r\n  // Lead-details dialog (opened from the info icon on the call-direction chip).\r\n  const [leadDialogOpen, setLeadDialogOpen] = useState<boolean>(false);\r\n  const [callDuration, setCallDuration] = useState<number>(0);\r\n  const [callWrapuptime, setCallWrapuptime] = useState<number | null>(() => {\r\n    const s = getSession(STORAGE_KEY) as any;\r\n    if (s?.callData?.status === CallStatus.WRAPUP) {\r\n      return (\r\n        s?.callData?.auto_wrapup_time ??\r\n        s?.sdkConfig?.auto_wrapup_time ??\r\n        s?.backendCallControls?.auto_wrapup_time ??\r\n        30\r\n      );\r\n    }\r\n    return null;\r\n  });\r\n  // Hold duration state\r\n  const [holdDuration, setHoldDuration] = useState<number>(0);\r\n  // ── NEW: mute duration state ──────────────────────────────────────────────\r\n  const [muteDuration, setMuteDuration] = useState<number>(0);\r\n  // Seconds the agent has been sitting Available, shown in the timer slot.\r\n  const [idleDuration, setIdleDuration] = useState<number>(0);\r\n  // Seconds the agent has been on their current break, shown in the same slot.\r\n  const [breakDuration, setBreakDuration] = useState<number>(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 [clickToCall, { isLoading: clickToCallLoading }] = usePostRequest<{\r\n    phone_number: string;\r\n    user: string;\r\n    auto_answer: boolean;\r\n    call_id: string;\r\n    reference_id: string;\r\n    call_source: string;\r\n    caseId: string;\r\n    isWrapup: boolean;\r\n    parentCallUuid: string;\r\n  }>({\r\n    onSuccess: () => {\r\n      setPhoneNumber(\"\");\r\n      setDialerAnchorEl(null);\r\n    },\r\n  });\r\n\r\n  const [dialDelayNotice, setDialDelayNotice] = useState(false);\r\n\r\n  useEffect(() => {\r\n    let timer: any;\r\n    if (clickToCallLoading) {\r\n      timer = setTimeout(() => {\r\n        setDialDelayNotice(true);\r\n        showToast(\"Connecting your call, please wait a moment...\", \"info\");\r\n      }, 2500);\r\n    } else {\r\n      setDialDelayNotice(false);\r\n    }\r\n    return () => {\r\n      if (timer) clearTimeout(timer);\r\n    };\r\n  }, [clickToCallLoading, showToast]);\r\n\r\n  const [holdOrUnHold, { isLoading: holdOrUnHoldLoading }] = usePostRequest<{\r\n    action: string;\r\n    user_id: string;\r\n    call_uuid: string;\r\n    line_number: number;\r\n    refno?: string;\r\n  }>();\r\n\r\n  const [muteOrUnMute, { isLoading: muteOrUnMuteLoading }] = usePostRequest<{\r\n    action: string;\r\n    direction: string;\r\n    user_id: string;\r\n    call_uuid: string;\r\n    line_number: number;\r\n    refno?: string;\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    onSuccess: () => {\r\n      lastWasMarkAsBreakRef.current = false;\r\n      sdkStateManager.setAgentStatus(\"\");\r\n\r\n      // Clear previously saved break\r\n      sessionStorage.removeItem(\"PREVIOUS_AGENT_STATUS\");\r\n\r\n      // Flip the local presence back to IDLE here instead of waiting for the\r\n      // agent-events socket to push the transition. Going ON break already\r\n      // updates callData optimistically (see handleUpdateAgentStatus), and the\r\n      // presence pill, the Agent Ready button and the break menu all key off\r\n      // callData.status — so with the socket down, reconnecting, or simply\r\n      // dropping the frame, the READY call succeeded on the backend while the\r\n      // UI sat on BREAK indefinitely and further clicks looked like no-ops.\r\n      // Skipped while a call owns the status: one that arrived between the\r\n      // click and this response must not be wiped back to IDLE.\r\n      const currentStatus = String(\r\n        sdkStateManager.getState().callData?.status ?? \"\",\r\n      ).toUpperCase();\r\n      const isBusy = [\r\n        CallStatus.ONCALL,\r\n        CallStatus.RINGING,\r\n        CallStatus.DIALING,\r\n        CallStatus.HOLD,\r\n        CallStatus.WRAPUP,\r\n      ].includes(currentStatus as CallStatus);\r\n\r\n      if (!isBusy) {\r\n        sdkStateManager.updateCallData({\r\n          status: \"IDLE\",\r\n          break_details: undefined,\r\n        });\r\n      }\r\n    },\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 [sendNotification] = usePostRequest<{\r\n    phone_number: string;\r\n    type: string;\r\n  }>();\r\n\r\n  const [endCall, { isLoading: endCallLoading }] = usePostRequest<{\r\n    call_id: string;\r\n    agent_id: string;\r\n    set_followUp: string;\r\n    callback_date: string;\r\n    callback_hrs: number;\r\n    callback_mins: number;\r\n    mobile_number: string;\r\n    list_comments: string;\r\n    call_reference_id: string;\r\n    is_mark_as_break: boolean;\r\n    disposition: string;\r\n    line_number: number;\r\n    reason: string;\r\n  }>({\r\n    disabledSuccessToast: true,\r\n    onSuccess: (res: any) => {\r\n      // The disposition landed — the draft has nothing left to protect. Kept until\r\n      // this point so a failed hangup still leaves the agent's typing recoverable.\r\n      clearDispoDraft(lastEndedCallIdRef.current);\r\n      // This call is dispositioned and done with, so a WRAPUP the backend\r\n      // re-announces for it later must not pull the agent back in. Recorded even\r\n      // when the reset below is skipped — the call is finished either way.\r\n      if (lastEndedCallIdRef.current) {\r\n        endedWrapupCallIdRef.current = lastEndedCallIdRef.current;\r\n      }\r\n\r\n      // The NEXT call can already own this agent by the time the hangup response\r\n      // gets back here, and during wrap-up that is routine rather than rare: the\r\n      // agent dispositions (or the countdown auto-submits AUTO_WRAPUP), the\r\n      // backend ends the wrap-up and immediately routes the next call, and only\r\n      // then does this response land. Resetting unconditionally then wrote a\r\n      // status the socket never sent —\r\n      //\r\n      //   socket:  WRAPUP → IDLE → RINGING →          ONCALL\r\n      //   UI:      WRAPUP → IDLE → RINGING → *IDLE* → ONCALL\r\n      //\r\n      // — and did worse than flicker: it blanked call_id and phone_number for a\r\n      // call that had just arrived, so everything keyed off them (screen-pop, the\r\n      // disposition draft) pointed at nothing until ONCALL restored them, and\r\n      // sdkStateManager.endCall() cleared a callStartTime that by then belonged\r\n      // to the new call.\r\n      //\r\n      // Same guard, for the same reason, as readyAgentStatus's onSuccess above,\r\n      // but keyed on the call_id rather than the status alone — a live status by\r\n      // itself is NOT evidence of a next call. End Call is offered on\r\n      // ONCALL/RINGING/DIALING as well as WRAPUP (see the button's own gate), so\r\n      // hanging up a LIVE call routinely lands here while the socket still\r\n      // reports that very call as up. That is the case the optimistic write was\r\n      // written for, and it must still go through — otherwise the agent's own\r\n      // hangup leaves the panel stuck on \"On Call\" whenever the socket is slow.\r\n      //\r\n      // So suppress only when the call holding the status is demonstrably a\r\n      // DIFFERENT one from the call just dispositioned. Anything unproven (either\r\n      // id missing) falls through to the old behaviour.\r\n      //\r\n      // WRAPUP is deliberately absent from the busy list too: submitting from\r\n      // inside wrap-up IS the agent ending that wrap-up, so that flip must land.\r\n      const liveCall = sdkStateManager.getState().callData;\r\n      const liveStatus = String(liveCall?.status ?? \"\").toUpperCase();\r\n      const liveCallId = String(liveCall?.call_id ?? \"\");\r\n      const endedCallId = String(lastEndedCallIdRef.current ?? \"\");\r\n      const nextCallOwnsStatus =\r\n        [\r\n          CallStatus.ONCALL,\r\n          CallStatus.RINGING,\r\n          CallStatus.DIALING,\r\n          CallStatus.HOLD,\r\n        ].includes(liveStatus as CallStatus) &&\r\n        !!liveCallId &&\r\n        !!endedCallId &&\r\n        liveCallId !== endedCallId;\r\n\r\n      if (!nextCallOwnsStatus) {\r\n        sdkStateManager.endCall();\r\n        if (lastWasMarkAsBreakRef.current) {\r\n          // The hangup put the agent on break but the response rarely names it, so\r\n          // the name comes from the break they picked on the form — that is the\r\n          // break this very hangup applied — else the backend's own breaks list,\r\n          // else the break the agent last took. \"\" for a tenant with none\r\n          // configured: the panel still reads BREAK from `status`, and the socket\r\n          // supplies the name when it knows it. Never a label made up here — see\r\n          // resolveBreakName.\r\n          const breakName = resolveBreakName(\r\n            pickedBreakTypeRef.current,\r\n            breaksList?.[0]?.type,\r\n            firstBreakTypeRef.current,\r\n            savedBreakName(),\r\n          );\r\n          sdkStateManager.updateCallData({\r\n            status: \"BREAK\",\r\n            call_id: \"\",\r\n            phone_number: \"\",\r\n            break_details: breakName ? { type: breakName, value: breakName } : null,\r\n          });\r\n          sdkStateManager.setAgentStatus(breakName);\r\n          rememberBreakName(breakName);\r\n        } else {\r\n          sdkStateManager.updateCallData({\r\n            status: \"IDLE\",\r\n            call_id: \"\",\r\n            phone_number: \"\",\r\n          });\r\n          sdkStateManager.setAgentStatus(\"\");\r\n          if (typeof sessionStorage !== \"undefined\") {\r\n            sessionStorage.removeItem(\"PREVIOUS_AGENT_STATUS\");\r\n          }\r\n        }\r\n      }\r\n      setOpenCallDisposition(false);\r\n      sdkStateManager.resetConferenceLines();\r\n      showToast(res?.message || \"Call ended successfully\", \"success\");\r\n    },\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  };\r\n  const handleOpenAbulanceServices = (event: React.MouseEvent<HTMLElement>) => {\r\n    setAmbulanceAnchorEl(event.currentTarget);\r\n  };\r\n\r\n  const handleOpenMoreOptions = (event: React.MouseEvent<HTMLElement>) => {\r\n    setMoreOptionsAnchorEl(event.currentTarget);\r\n  };\r\n\r\n  const handleCloseDialer = () => {\r\n    setDialerAnchorEl(null);\r\n  };\r\n  const handleCloseAmbulance = () => {\r\n    setAmbulanceAnchorEl(null);\r\n  };\r\n\r\n  const handleCloseMoreOptions = () => {\r\n    setMoreOptionsAnchorEl(null);\r\n  };\r\n\r\n  const handleOpenAgentStatus = (event: React.MouseEvent<HTMLElement>) => {\r\n    if (!canBreak) return;\r\n    setStatusAnchorEl(event.currentTarget);\r\n  };\r\n\r\n  const handleCloseAgentStatus = () => {\r\n    setStatusAnchorEl(null);\r\n  };\r\n\r\n  const handleAgentReady = () => {\r\n    const payload = {\r\n      action: \"READYAGENT\",\r\n      userId: String(state.agentId ?? \"\"),\r\n    };\r\n\r\n    endReloadBreakGuard();\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 currentStatus = state.callData?.status?.toUpperCase() as CallStatus;\r\n    if (\r\n      [\r\n        CallStatus.ONCALL,\r\n        CallStatus.RINGING,\r\n        CallStatus.DIALING,\r\n        CallStatus.WRAPUP,\r\n      ].includes(currentStatus)\r\n    ) {\r\n      showToast(\"Cannot put agent on break while on a call\", \"error\");\r\n      return;\r\n    }\r\n    const payload = {\r\n      action: \"AGENTBREAK\",\r\n      break_type: status,\r\n      userId: String(state.agentId ?? \"\"),\r\n    };\r\n    endReloadBreakGuard();\r\n    updateAgentStatus(END_POINT.UPDATE_AGENT_BREAK, payload).then(() => {\r\n      sdkStateManager.updateCallData({\r\n        status: \"BREAK\",\r\n        break_details: { type: status, value: status },\r\n      });\r\n      sdkStateManager.setAgentStatus(status);\r\n\r\n      // Save selected status\r\n      sessionStorage.setItem(\"PREVIOUS_AGENT_STATUS\", status);\r\n    });\r\n  };\r\n\r\n  const currentCallStatus = String(state.callData?.status ?? \"\").toUpperCase();\r\n  const isLiveOrWrapup =\r\n    [\r\n      CallStatus.ONCALL,\r\n      CallStatus.RINGING,\r\n      CallStatus.DIALING,\r\n      CallStatus.HOLD,\r\n      CallStatus.UNHOLD,\r\n      CallStatus.MUTE,\r\n      CallStatus.UNMUTE,\r\n      CallStatus.CONFERENCE,\r\n      CallStatus.WRAPUP,\r\n    ].includes(currentCallStatus as CallStatus) ||\r\n    currentCallStatus.includes(\"WRAPUP\") ||\r\n    currentCallStatus.includes(\"RING\") ||\r\n    currentCallStatus.includes(\"ONCALL\") ||\r\n    currentCallStatus.includes(\"TALK\") ||\r\n    currentCallStatus === \"INCALL\" ||\r\n    currentCallStatus === \"ANSWERED\";\r\n\r\n  const isAgentOnBreak =\r\n    !isLiveOrWrapup &&\r\n    (currentCallStatus === CallStatus.BREAK ||\r\n      Boolean(\r\n        state.callData?.break_details?.value ||\r\n          state.callData?.break_details?.type ||\r\n          (state.callData?.break_details as any)?.break_type,\r\n      ) ||\r\n      Boolean(\r\n        state.agentStatus &&\r\n          state.agentStatus.toUpperCase() !== \"IDLE\" &&\r\n          state.agentStatus.toUpperCase() !== \"READY\",\r\n      ) ||\r\n      Boolean(\r\n        typeof sessionStorage !== \"undefined\" &&\r\n          sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") &&\r\n          sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") !== \"IDLE\" &&\r\n          sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") !== \"READY\",\r\n      ) ||\r\n      Boolean(lastWasMarkAsBreakRef.current));\r\n\r\n  const handleStartCall = (number: string) => {\r\n    if (clickToCallLoading) return;\r\n\r\n    const currentStatus = (state.callData?.status ?? \"\").toUpperCase();\r\n    if (currentStatus === CallStatus.BREAK || isAgentOnBreak) {\r\n      showToast(\r\n        \"Agent is currently on break. Please change status to Ready before making calls.\",\r\n        \"warning\",\r\n      );\r\n      return;\r\n    }\r\n\r\n    const cleanNumber = normalizeDialNumber(number);\r\n    if (!cleanNumber) {\r\n      showToast(\"Please enter a phone number\", \"error\");\r\n      return;\r\n    }\r\n    if (!/^[0-9*#+]+$/.test(cleanNumber)) {\r\n      showToast(\"Invalid characters in phone number\", \"error\");\r\n      return;\r\n    }\r\n    if (cleanNumber.length < MIN_DIAL_DIGITS) {\r\n      showToast(`Enter a valid number (at least ${MIN_DIAL_DIGITS} characters)`, \"error\");\r\n      return;\r\n    }\r\n    if (cleanNumber.length > MAX_DIAL_DIGITS) {\r\n      showToast(`Enter a valid phone number (up to ${MAX_DIAL_DIGITS} characters)`, \"error\");\r\n      return;\r\n    }\r\n\r\n    // rootCallUuid chaining only runs when disableAlternateDialing is true\r\n    // (host opts out of the alternate dialog and relies on the built-in flow);\r\n    // otherwise parentCallUuid stays \"\" and the chain is cleared.\r\n    const isWrapupCall = currentStatus === CallStatus.WRAPUP;\r\n\r\n    let parentCallUuid = \"\";\r\n    if (!state.sdkConfig?.disableAlternateDialing) {\r\n      if (isWrapupCall) {\r\n        if (state.rootCallUuid) {\r\n          parentCallUuid = state.rootCallUuid;\r\n        } else if (state.callData?.call_id) {\r\n          parentCallUuid = state.callData.call_id;\r\n          sdkStateManager.setRootCallUuid(parentCallUuid);\r\n        }\r\n      } else if (state.rootCallUuid) {\r\n        sdkStateManager.setRootCallUuid(null);\r\n      }\r\n    } else if (state.rootCallUuid) {\r\n      sdkStateManager.setRootCallUuid(null);\r\n    }\r\n\r\n    const payload = {\r\n      phone_number: cleanNumber,\r\n      user: state.agentId,\r\n      auto_answer: false,\r\n      call_id: \"\",\r\n      reference_id: \"\",\r\n      call_source: \"\",\r\n      caseId: \"\",\r\n      isWrapup: isWrapupCall,\r\n        parentCallUuid,\r\n      };\r\n\r\n    storeRecentNumber(cleanNumber);\r\n    clickToCall(END_POINT.CLICK_TO_CALL, payload);\r\n  };\r\n\r\n  // In WRAPUP the agent can only redial the number that just ended: the dial\r\n  // field is prefilled from the call data and locked (read-only). Once the state\r\n  // falls back to IDLE the field returns to a normal, editable manual dialer.\r\n  const isWrapupState =\r\n    (state.callData?.status?.toUpperCase() as CallStatus) === CallStatus.WRAPUP;\r\n  const dialFieldReadOnly = isWrapupState;\r\n  const dialFieldValue = isWrapupState\r\n    ? (state.callData?.phone_number ?? \"\")\r\n    : phoneNumber;\r\n\r\n  // Recent called numbers and autocomplete suggestions\r\n  const [recentCalls, setRecentCalls] = useState<StoredRecentCallItem[]>([]);\r\n\r\n  useEffect(() => {\r\n    const activeNum =\r\n      state.callData?.phone_number || (state.callData as any)?.mobileNumber;\r\n    if (activeNum) {\r\n      const rawType = (\r\n        state.callData?.type ??\r\n        (state.callData as any)?.call_type ??\r\n        \"\"\r\n      ).toUpperCase();\r\n      const dir: \"INBOUND\" | \"OUTBOUND\" =\r\n        rawType === \"INBOUND\" || state.callData?.is_outbound_call === false\r\n          ? \"INBOUND\"\r\n          : \"OUTBOUND\";\r\n      storeRecentNumber(String(activeNum), dir);\r\n    }\r\n  }, [\r\n    state.callData?.phone_number,\r\n    (state.callData as any)?.mobileNumber,\r\n    state.callData?.type,\r\n    state.callData?.is_outbound_call,\r\n  ]);\r\n\r\n  useEffect(() => {\r\n    if (Boolean(dialerAnchorEl)) {\r\n      setRecentCalls(getStoredRecentNumbers());\r\n    }\r\n  }, [dialerAnchorEl]);\r\n\r\n  const displayedRecentCalls = React.useMemo(() => {\r\n    if (isWrapupState || !dialFieldValue || dialFieldValue.trim().length === 0) {\r\n      return [];\r\n    }\r\n    const cleanInput = dialFieldValue.trim().toLowerCase().replace(/[\\s\\-\\(\\)\\+]/g, \"\");\r\n    return recentCalls\r\n      .filter((item) => {\r\n        const cleanNum = item.number.toLowerCase().replace(/[\\s\\-\\(\\)\\+]/g, \"\");\r\n        return cleanNum.includes(cleanInput);\r\n      })\r\n      .slice(0, 5);\r\n  }, [dialFieldValue, recentCalls, isWrapupState]);\r\n\r\n  const handleHoldToggle = () => {\r\n    const payload = {\r\n      action: state.callData?.hold === 1 ? CallStatus.UNHOLD : CallStatus.HOLD,\r\n      user_id: String(state.agentId ?? \"\"),\r\n      call_uuid: state.callData?.call_id ?? \"\",\r\n      line_number: 0,\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.callData?.mute === 1 ? CallStatus.UNMUTE : CallStatus.MUTE,\r\n      direction: \"both\",\r\n      user_id: String(state.agentId ?? \"\"),\r\n      call_uuid: state.callData?.call_id ?? \"\",\r\n      line_number: 0,\r\n    };\r\n\r\n    muteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n  };\r\n\r\n  // Hold/Mute on the main dialer can be disabled either by SDK permissions\r\n  // (disableHoldButton / disableMuteButton) or, per call, by the backend via the\r\n  // websocket flag `disable_hold_mute` on callData.\r\n  const holdFeatureDisabled =\r\n    !!state.sdkConfig?.disableHoldButton ||\r\n    state.callData?.disable_hold_mute === 1;\r\n  const muteFeatureDisabled =\r\n    !!state.sdkConfig?.disableMuteButton ||\r\n    state.callData?.disable_hold_mute === 1;\r\n\r\n  const handleEndCall = (data: {\r\n    disposition: { label: string; value: string; id?: number };\r\n    followUp: { label: string; value: string };\r\n    callbackDate: string;\r\n    callbackHrs: string;\r\n    callbackMins: string;\r\n    selected_break?: boolean;\r\n    break_type?: string;\r\n    notes?: string;\r\n  }) => {\r\n    const isBreak = Boolean(data?.selected_break);\r\n    // The break the agent picked in the dialog's picker. The hangup applies it\r\n    // itself (see break_type in the payload below), so there is no AGENTBREAK post\r\n    // behind this call — this value is only carried here so both paints, the\r\n    // optimistic one and the one in endCall's onSuccess, can name the break the\r\n    // agent actually chose instead of the first row of the list.\r\n    const pickedBreak = isBreak ? String(data?.break_type ?? \"\").trim() : \"\";\r\n    pickedBreakTypeRef.current = pickedBreak;\r\n    lastWasMarkAsBreakRef.current = isBreak;\r\n    const endedCallId = state.callData?.call_id ?? \"\";\r\n    lastEndedCallIdRef.current = endedCallId;\r\n    if (endedCallId) {\r\n      endedWrapupCallIdRef.current = endedCallId;\r\n    }\r\n    setCallWrapuptime(null);\r\n\r\n    if (isBreak) {\r\n      // Same rule as the end-call path above: a backend name or none at all. The\r\n      // agent's own pick comes first — every other candidate is a guess standing\r\n      // in for the answer they just gave.\r\n      const breakName = resolveBreakName(\r\n        pickedBreak,\r\n        breaksList?.[0]?.type,\r\n        firstBreakTypeRef.current,\r\n        savedBreakName(),\r\n      );\r\n      sdkStateManager.updateCallData({\r\n        status: \"BREAK\",\r\n        call_id: \"\",\r\n        phone_number: \"\",\r\n        break_details: breakName ? { type: breakName, value: breakName } : null,\r\n      });\r\n      sdkStateManager.setAgentStatus(breakName);\r\n      rememberBreakName(breakName);\r\n    }\r\n\r\n    const payload = {\r\n      call_id: state.callData?.call_id ?? \"\",\r\n      agent_id: state.agentId ?? \"\",\r\n      set_followUp: data?.followUp?.value ?? \"\",\r\n      callback_date: data?.callbackDate ?? \"\",\r\n      callback_hrs: Number(data?.callbackHrs) || 0,\r\n      callback_mins: Number(data?.callbackMins) || 0,\r\n      mobile_number: state.callData?.phone_number ?? \"\",\r\n      list_comments: data?.notes ?? \"\",\r\n      call_reference_id: state.callData?.call_id ?? \"\",\r\n      is_mark_as_break: isBreak,\r\n      // The hangup route applies this break itself when is_mark_as_break is set\r\n      // (POST /cti/calls/hangup → update_agent_status). Empty means ticked with\r\n      // nothing picked — a tenant with no breaks configured — and the backend\r\n      // falls back to its own post-call break type.\r\n      break_type: pickedBreak,\r\n      disposition: data?.disposition?.value ?? \"\",\r\n      line_number: 0,\r\n      reason: \"normal\",\r\n    };\r\n\r\n    setPhoneNumber(\"\");\r\n    endCall(END_POINT.END_CALL, payload);\r\n  };\r\n\r\n  useEffect(() => {\r\n    let hasHungUp = false;\r\n    let lastActiveSdkCall: any = null;\r\n\r\n    const sendHangupOnUnload = (currentState: any) => {\r\n      if (hasHungUp) return;\r\n      hasHungUp = true;\r\n\r\n      const stateToUse = currentState || lastActiveSdkCall || sdkStateManager.getState();\r\n      const callId =\r\n        stateToUse?.callData?.call_id ||\r\n        stateToUse?.callData?.call_reference_id ||\r\n        stateToUse?.callData?.callReferenceId ||\r\n        stateToUse?.callData?.call_uuid ||\r\n        \"\";\r\n      const agentId = String(stateToUse?.agentId ?? \"\");\r\n      const phoneNum =\r\n        stateToUse?.callData?.phone_number ||\r\n        stateToUse?.callData?.customer_number ||\r\n        \"\";\r\n\r\n      const currentStatus = String(\r\n        stateToUse?.callData?.status ?? \"\",\r\n      ).toUpperCase();\r\n      const isWrapup = currentStatus === \"WRAPUP\" || currentStatus.includes(\"WRAPUP\");\r\n      // Refresh OR close during ONCALL/RINGING/WRAPUP ends the call and leaves the\r\n      // agent IDLE. A close used to park the agent on a break, but Chrome's reload\r\n      // button can't be told from a close here (checkIsPageReload misses it), so\r\n      // every such refresh wrote a \"Not Ready\" row into the break report. Product\r\n      // decision: never a break on unload.\r\n      const markAsBreak = false;\r\n\r\n      const payload = {\r\n        call_id: callId,\r\n        agent_id: agentId,\r\n        set_followUp: \"\",\r\n        callback_date: \"\",\r\n        callback_hrs: 0,\r\n        callback_mins: 0,\r\n        mobile_number: phoneNum,\r\n        list_comments: \"\",\r\n        call_reference_id: callId,\r\n        is_mark_as_break: markAsBreak,\r\n        disposition: isWrapup ? \"AUTO_WRAPUP\" : \"\",\r\n        line_number: 0,\r\n        reason: \"normal\",\r\n      };\r\n\r\n      // Backend break types only — the break the agent last took, the one the\r\n      // agent-events frame names, or the first row of GET /cti/breaks. No\r\n      // client-side label: whatever goes out here is echoed back as\r\n      // break_details.value and printed as the agent's break on their next login,\r\n      // so an invented string becomes a break type no tenant ever configured.\r\n      // All three empty (a tenant with no breaks) → omit break_type, which the\r\n      // AGENTBREAK schema allows, and let the backend name the break.\r\n      const rawBreakType =\r\n        (typeof sessionStorage !== \"undefined\" ? sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") : null) ||\r\n        stateToUse?.callData?.break_details?.value ||\r\n        stateToUse?.callData?.break_details?.type ||\r\n        breaksList?.[0]?.type ||\r\n        \"\";\r\n      // \"BREAK\"/\"IDLE\" are this dialer's placeholders for \"no type\", not types.\r\n      const breakType = [\"\", \"BREAK\", \"IDLE\"].includes(String(rawBreakType).trim().toUpperCase())\r\n        ? \"\"\r\n        : String(rawBreakType).trim();\r\n\r\n      const statusPayload = markAsBreak\r\n        ? {\r\n            action: \"AGENTBREAK\",\r\n            ...(breakType ? { break_type: breakType } : {}),\r\n            userId: String(agentId),\r\n          }\r\n        : {\r\n            action: \"READYAGENT\",\r\n            userId: String(agentId),\r\n          };\r\n      const statusBodyStr = JSON.stringify(statusPayload);\r\n\r\n      const clean = (val: any) => {\r\n        if (!val) return \"\";\r\n        const s = String(val).trim();\r\n        if ((s.startsWith(\"'\") && s.endsWith(\"'\")) || (s.startsWith('\"') && s.endsWith('\"'))) {\r\n          return s.slice(1, -1).trim();\r\n        }\r\n        return s;\r\n      };\r\n\r\n      const coreUrl =\r\n        clean(sdkStateManager?.getState()?.urlConfig?.coreBaseURL) ||\r\n        clean(sdkStateManager?.getState()?.urlConfig?.baseURL) ||\r\n        (typeof window !== \"undefined\" ? clean((window as any).__ENV__?.VITE_APP_BASE_API_HOST) : \"\") ||\r\n        clean((import.meta as any)?.env?.VITE_APP_BASE_API_HOST) ||\r\n        \"\";\r\n      const fullUrl = coreUrl ? `${coreUrl.replace(/\\/+$/, \"\")}/api/v1/cti/calls/hangup` : \"/api/v1/cti/calls/hangup\";\r\n      const relUrl = \"/api/v1/cti/calls/hangup\";\r\n\r\n      const fullReadyUrl = coreUrl ? `${coreUrl.replace(/\\/+$/, \"\")}/api/v1/agents/ready` : \"/api/v1/agents/ready\";\r\n      const relReadyUrl = \"/api/v1/agents/ready\";\r\n      const fullStatusUrl = coreUrl ? `${coreUrl.replace(/\\/+$/, \"\")}/api/v1/agents/status` : \"/api/v1/agents/status\";\r\n      const relStatusUrl = \"/api/v1/agents/status\";\r\n\r\n      let rawToken =\r\n        sdkStateManager.getSdkAuthToken() ||\r\n        sessionStorage.getItem(\"token\") ||\r\n        localStorage.getItem(\"token\") ||\r\n        \"\";\r\n      rawToken = clean(rawToken);\r\n      const authToken = rawToken\r\n        ? rawToken.startsWith(\"Bearer \")\r\n          ? rawToken\r\n          : `Bearer ${rawToken}`\r\n        : \"\";\r\n\r\n      const creds = sdkStateManager.getCredentials();\r\n      const tenantId = clean(creds?.tenantId || sdkStateManager.getTenantId());\r\n      const apiKey = clean(creds?.apiKey);\r\n\r\n      const deviceIp = clean(\r\n        sessionStorage.getItem(\"device_ip\") ||\r\n        localStorage.getItem(\"device_ip\") ||\r\n        (typeof window !== \"undefined\" ? (window as any).__device_ip : \"\")\r\n      );\r\n\r\n      const headers: Record<string, string> = {\r\n        \"Content-Type\": \"application/json\",\r\n        Accept: \"application/json\",\r\n        ...(authToken ? { Authorization: authToken } : {}),\r\n        ...(tenantId ? { \"x-tenant-id\": tenantId } : {}),\r\n        ...(apiKey ? { \"x-api-key\": apiKey } : {}),\r\n        ...(deviceIp ? { \"x-device-ip\": deviceIp } : {}),\r\n      };\r\n\r\n      try {\r\n        if (typeof fetch !== \"undefined\") {\r\n          fetch(fullUrl, {\r\n            method: \"POST\",\r\n            headers,\r\n            body: JSON.stringify(payload),\r\n            keepalive: true,\r\n          }).catch((err) => {\r\n            console.error(\"Failed to hangup on page unload via fetch (fullUrl):\", err);\r\n          });\r\n\r\n          if (fullUrl !== relUrl) {\r\n            fetch(relUrl, {\r\n              method: \"POST\",\r\n              headers,\r\n              body: JSON.stringify(payload),\r\n              keepalive: true,\r\n            }).catch((err) => {\r\n              console.error(\"Failed to hangup on page unload via fetch (relUrl):\", err);\r\n            });\r\n          }\r\n\r\n          // Trigger ready API only when the agent is not being parked on a break\r\n          if (!markAsBreak) {\r\n            fetch(fullReadyUrl, {\r\n              method: \"POST\",\r\n              headers,\r\n              body: statusBodyStr,\r\n              keepalive: true,\r\n            }).catch((err) => {\r\n              console.error(\"Failed to update ready status on page unload via fetch (fullReadyUrl):\", err);\r\n            });\r\n          }\r\n\r\n          // Status API only for a break. It reads break_type alone, so a READYAGENT\r\n          // body (no break_type) would land as an unnamed BREAK racing the READY.\r\n          if (markAsBreak) fetch(fullStatusUrl, {\r\n            method: \"POST\",\r\n            headers,\r\n            body: statusBodyStr,\r\n            keepalive: true,\r\n          }).catch((err) => {\r\n            console.error(\"Failed to update agent status on page unload via fetch (fullStatusUrl):\", err);\r\n          });\r\n        }\r\n      } catch (err) {\r\n        console.error(\"Hangup on page unload error:\", err);\r\n      }\r\n\r\n      try {\r\n        if (typeof navigator !== \"undefined\" && typeof navigator.sendBeacon === \"function\" && typeof fetch === \"undefined\") {\r\n          const blob = new Blob([JSON.stringify(payload)], { type: \"application/json\" });\r\n          const statusBlob = new Blob([statusBodyStr], { type: \"application/json\" });\r\n\r\n          try { navigator.sendBeacon(fullUrl, blob); } catch {}\r\n          if (!markAsBreak) {\r\n            try { navigator.sendBeacon(fullReadyUrl, statusBlob); } catch {}\r\n            if (fullReadyUrl !== relReadyUrl) {\r\n              try { navigator.sendBeacon(relReadyUrl, statusBlob); } catch {}\r\n            }\r\n          }\r\n          if (markAsBreak) {\r\n            try { navigator.sendBeacon(fullStatusUrl, statusBlob); } catch {}\r\n            if (fullStatusUrl !== relStatusUrl) {\r\n              try { navigator.sendBeacon(relStatusUrl, statusBlob); } catch {}\r\n            }\r\n          }\r\n        }\r\n      } catch (err) {\r\n        console.error(\"sendBeacon hangup error:\", err);\r\n      }\r\n\r\n      // Reset callData status and queue_name so page reload starts clean\r\n      sdkStateManager.updateCallData({\r\n        status: \"IDLE\",\r\n        call_id: \"\",\r\n        phone_number: \"\",\r\n        queue_name: \"\",\r\n        call_details: undefined,\r\n      });\r\n    };\r\n\r\n    (window as any).sendSdkHangup = () => {\r\n      const currentState = sdkStateManager.getState() || lastActiveSdkCall;\r\n      if (!isCallActiveForState(currentState) && !lastActiveSdkCall) return;\r\n      sendHangupOnUnload(currentState);\r\n    };\r\n\r\n    const isCallActiveForState = (currentState: any) => {\r\n      const currentStatus = String(\r\n        currentState?.callData?.status ?? \"\",\r\n      ).toUpperCase();\r\n      const isActive =\r\n        [\r\n          CallStatus.ONCALL,\r\n          CallStatus.RINGING,\r\n          CallStatus.DIALING,\r\n          CallStatus.HOLD,\r\n          \"INCALL\",\r\n          \"ANSWERED\",\r\n          \"TALKING\",\r\n          CallStatus.WRAPUP,\r\n          \"WRAPUP\",\r\n        ].includes(currentStatus as CallStatus) ||\r\n        currentStatus.includes(\"ONCALL\") ||\r\n        currentStatus.includes(\"RING\") ||\r\n        currentStatus.includes(\"DIAL\") ||\r\n        currentStatus.includes(\"HOLD\") ||\r\n        currentStatus.includes(\"TALK\") ||\r\n        currentStatus.includes(\"WRAPUP\") ||\r\n        Boolean(\r\n          currentState?.callData?.call_id &&\r\n            currentStatus !== CallStatus.IDLE &&\r\n            currentStatus !== CallStatus.BREAK,\r\n        );\r\n\r\n      if (isActive) {\r\n        lastActiveSdkCall = currentState;\r\n      } else if (\r\n        [\"IDLE\", \"READY\", \"AVAILABLE\", \"LOGOUT\"].includes(currentStatus) ||\r\n        currentStatus.includes(\"BREAK\") ||\r\n        currentStatus.includes(\"PAUSE\")\r\n      ) {\r\n        // The call is over. Forget it, or every later refresh would \"hang up\" it\r\n        // again — with is_mark_as_break if it ended in wrap-up, which the backend\r\n        // turns into its post-call \"Not Ready\" break over the agent's own break.\r\n        lastActiveSdkCall = null;\r\n      }\r\n      return isActive;\r\n    };\r\n\r\n    const handleBeforeUnload = (e: BeforeUnloadEvent) => {\r\n      const currentState = sdkStateManager.getState();\r\n      if (!isCallActiveForState(currentState)) return undefined;\r\n\r\n      // Only trigger native Chrome reload dialog — do NOT trigger hangup call here.\r\n      // Hangup will only be triggered in pagehide/unload when the user actually confirms reload.\r\n      e.preventDefault();\r\n      e.returnValue = \"\";\r\n      return \"\";\r\n    };\r\n\r\n    const handlePageHide = () => {\r\n      const currentState = sdkStateManager.getState() || lastActiveSdkCall;\r\n      if (!isCallActiveForState(currentState) && !lastActiveSdkCall) return;\r\n      sendHangupOnUnload(currentState);\r\n    };\r\n\r\n    const handleUnload = () => {\r\n      const currentState = sdkStateManager.getState() || lastActiveSdkCall;\r\n      if (!isCallActiveForState(currentState) && !lastActiveSdkCall) return;\r\n      sendHangupOnUnload(currentState);\r\n    };\r\n\r\n    window.onbeforeunload = handleBeforeUnload;\r\n    window.addEventListener(\"beforeunload\", handleBeforeUnload);\r\n    window.addEventListener(\"pagehide\", handlePageHide);\r\n    window.addEventListener(\"unload\", handleUnload);\r\n\r\n    return () => {\r\n      window.removeEventListener(\"beforeunload\", handleBeforeUnload);\r\n      window.removeEventListener(\"pagehide\", handlePageHide);\r\n      window.removeEventListener(\"unload\", handleUnload);\r\n      if (window.onbeforeunload === handleBeforeUnload) {\r\n        window.onbeforeunload = null;\r\n      }\r\n      delete (window as any).sendSdkHangup;\r\n    };\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    const mic = createMicController();\r\n    micRef.current = mic;\r\n\r\n    mic.start().catch((err) => {\r\n      console.error(\"Failed to start mic:\", err);\r\n    });\r\n    const handleKeyDown = (event: KeyboardEvent) => {\r\n      const fullState = getSession(STORAGE_KEY) as any;\r\n      const key = event.key?.toLowerCase();\r\n\r\n      if (!event.altKey || fullState?.callData?.status !== CallStatus.ONCALL) {\r\n        return;\r\n      }\r\n\r\n      if (key === \"m\" && String(fullState?.callData?.mute) === \"0\") {\r\n        event.preventDefault();\r\n        micRef.current?.mute();\r\n        const payload = {\r\n          action: CallStatus.MUTE,\r\n          direction: \"both\",\r\n          user_id: String(fullState.agentId ?? \"\"),\r\n          call_uuid: fullState?.callData?.call_id ?? \"\",\r\n          line_number: 0,\r\n        };\r\n\r\n        muteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n      }\r\n\r\n      if (key === \"u\" && String(fullState?.callData?.mute) === \"1\") {\r\n        event.preventDefault();\r\n        const payload = {\r\n          action: CallStatus.UNMUTE,\r\n          direction: \"both\",\r\n          user_id: String(fullState.agentId ?? \"\"),\r\n          call_uuid: fullState?.callData?.call_id ?? \"\",\r\n          line_number: 0,\r\n        };\r\n\r\n        muteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n        micRef.current?.unmute();\r\n      }\r\n\r\n      if (key === \"h\" && String(fullState?.callData?.hold) === \"0\") {\r\n        event.preventDefault();\r\n        const payload = {\r\n          action: CallStatus.HOLD,\r\n          user_id: String(fullState.agentId ?? \"\"),\r\n          call_uuid: fullState?.callData?.call_id ?? \"\",\r\n          line_number: 0,\r\n        };\r\n\r\n        holdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n      }\r\n\r\n      if (key === \"r\" && String(fullState?.callData?.hold) === \"1\") {\r\n        event.preventDefault();\r\n        const payload = {\r\n          action: CallStatus.UNHOLD,\r\n          user_id: String(fullState.agentId ?? \"\"),\r\n          call_uuid: fullState?.callData?.call_id ?? \"\",\r\n          line_number: 0,\r\n        };\r\n\r\n        holdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n      }\r\n    };\r\n\r\n    window.addEventListener(\"keydown\", handleKeyDown);\r\n\r\n    return () => {\r\n      window.removeEventListener(\"keydown\", handleKeyDown);\r\n    };\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    let interval: ReturnType<typeof setInterval>;\r\n    let wrapUpinterval: ReturnType<typeof setInterval>;\r\n\r\n    if (state.callData.status && state.callData.status === CallStatus.ONCALL) {\r\n      interval = setInterval(() => {\r\n        const elapsed = state.callStartTime\r\n          ? Math.floor((Date.now() - Number(state.callStartTime)) / 1000)\r\n          : 0;\r\n\r\n        setCallDuration(elapsed);\r\n      }, 1000);\r\n    } else {\r\n      setCallDuration(0);\r\n    }\r\n\r\n    if (\r\n      state.callData.status &&\r\n      state.callData.status === CallStatus.WRAPUP\r\n    ) {\r\n      if (callWrapuptime === null) {\r\n        const wrapTime =\r\n          state.callData?.auto_wrapup_time ??\r\n          state.sdkConfig?.auto_wrapup_time ??\r\n          state.backendCallControls?.auto_wrapup_time ??\r\n          30;\r\n        setCallWrapuptime(wrapTime);\r\n      }\r\n      wrapUpinterval = setInterval(() => {\r\n        setCallWrapuptime((prevTime) => {\r\n          if (prevTime === null || prevTime <= 1) {\r\n            clearInterval(wrapUpinterval);\r\n            handleEndCall({\r\n              disposition: { label: \"Auto Wrapup\", value: \"AUTO_WRAPUP\" },\r\n              followUp: { label: \"No\", value: \"N\" },\r\n              callbackDate: \"\",\r\n              callbackHrs: \"\",\r\n              callbackMins: \"\",\r\n              selected_break: false,\r\n            });\r\n            return null;\r\n          }\r\n          return prevTime - 1;\r\n        });\r\n      }, 1000);\r\n    } else if (state.callData.status !== CallStatus.WRAPUP) {\r\n      setCallWrapuptime(null);\r\n    }\r\n\r\n    return () => {\r\n      if (interval) clearInterval(interval);\r\n      if (wrapUpinterval) clearInterval(wrapUpinterval);\r\n    };\r\n  }, [state.callData.status]);\r\n\r\n  // Hold duration timer\r\n  useEffect(() => {\r\n    let holdInterval: ReturnType<typeof setInterval>;\r\n\r\n    const isOnCall =\r\n      (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n      CallStatus.ONCALL;\r\n    const isOnHold = state.callData?.hold === 1;\r\n\r\n    if (isOnHold && isOnCall) {\r\n      if (!holdStartTimeRef.current) {\r\n        holdStartTimeRef.current = Date.now();\r\n      }\r\n      holdInterval = setInterval(() => {\r\n        setHoldDuration(\r\n          Math.floor((Date.now() - holdStartTimeRef.current!) / 1000),\r\n        );\r\n      }, 1000);\r\n    } else {\r\n      holdStartTimeRef.current = null;\r\n      setHoldDuration(0);\r\n    }\r\n\r\n    return () => {\r\n      if (holdInterval) clearInterval(holdInterval);\r\n    };\r\n  }, [state.callData?.hold, state.callData?.status]);\r\n\r\n  // ── NEW: mute duration timer ──────────────────────────────────────────────\r\n  useEffect(() => {\r\n    let muteInterval: ReturnType<typeof setInterval>;\r\n\r\n    const isOnCall =\r\n      (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n      CallStatus.ONCALL;\r\n    const isMuted = state.callData?.mute === 1;\r\n    const isHeld = state.callData?.hold === 1;\r\n\r\n    if (isMuted && isOnCall && !isHeld) {\r\n      // Record start time only once when mute begins\r\n      if (!muteStartTimeRef.current) {\r\n        muteStartTimeRef.current = Date.now();\r\n      }\r\n      muteInterval = setInterval(() => {\r\n        setMuteDuration(\r\n          Math.floor((Date.now() - muteStartTimeRef.current!) / 1000),\r\n        );\r\n      }, 1000);\r\n    } else {\r\n      // Reset when mute is released or call ends\r\n      muteStartTimeRef.current = null;\r\n      setMuteDuration(0);\r\n    }\r\n\r\n    return () => {\r\n      if (muteInterval) clearInterval(muteInterval);\r\n    };\r\n  }, [state.callData?.mute, state.callData?.status]);\r\n  // ─────────────────────────────────────────────────────────────────────────\r\n\r\n  // ── Idle (Available) duration timer ───────────────────────────────────────\r\n  // Parity with the browser-phone iframe: while the agent is Available, the\r\n  // timer slot shows how long they have been waiting. Nothing else on screen\r\n  // carries that — the presence chip names the state but not its age, and there\r\n  // is no call duration to show in this state.\r\n  useEffect(() => {\r\n    let idleInterval: ReturnType<typeof setInterval>;\r\n\r\n    const status = String(state.callData?.status || \"IDLE\").toUpperCase();\r\n    const isAvailable =\r\n      !isAgentOnBreak &&\r\n      (status === CallStatus.READY || status === CallStatus.IDLE || status === \"\");\r\n\r\n    if (isAvailable && canViewIdleCountdown) {\r\n      if (!idleStartTimeRef.current) {\r\n        idleStartTimeRef.current = Date.now();\r\n      }\r\n      setIdleDuration(\r\n        Math.floor((Date.now() - idleStartTimeRef.current) / 1000),\r\n      );\r\n      idleInterval = setInterval(() => {\r\n        if (idleStartTimeRef.current) {\r\n          setIdleDuration(\r\n            Math.floor((Date.now() - idleStartTimeRef.current) / 1000),\r\n          );\r\n        }\r\n      }, 1000);\r\n    } else {\r\n      idleStartTimeRef.current = null;\r\n      setIdleDuration(0);\r\n    }\r\n\r\n    return () => {\r\n      if (idleInterval) clearInterval(idleInterval);\r\n    };\r\n  }, [state.callData?.status, isAgentOnBreak, canViewIdleCountdown]);\r\n  // ─────────────────────────────────────────────────────────────────────────\r\n\r\n  // ── Break duration timer ──────────────────────────────────────────────────\r\n  // The idle counter's twin, for the other waiting state. Parity with the\r\n  // browser-phone iframe: while the agent is on a break the timer slot shows how\r\n  // long they have been away from calls.\r\n  //\r\n  // Counts UP, deliberately — nothing ends a break at zero the way auto-wrap-up\r\n  // ends wrap-up, so a clock that ran out and then sat at 00:00 would say less\r\n  // than a plain elapsed time.\r\n  //\r\n  // The clock is per break TYPE: moving from one break straight to another (tea →\r\n  // lunch) restarts it from zero, so it shows time on the current break. Parity\r\n  // with breakTypeKey in ahs-cti-ui.js.\r\n  //\r\n  // `isAgentOnBreak` is the same test the break-type chip in the timer slot\r\n  // makes, so the chip and the clock always agree about what state this is.\r\n\r\n  // Same resolution order as the break-type chip (specificBreakType). \"BREAK\" /\r\n  // \"IDLE\" are placeholders, not a type — a frame carrying only those must not\r\n  // restart the clock.\r\n  const currentBreakType = (() => {\r\n    if (!isAgentOnBreak) return \"\";\r\n    const raw = String(\r\n      state.callData?.break_details?.value ||\r\n        state.callData?.break_details?.type ||\r\n        state.agentStatus ||\r\n        (typeof sessionStorage !== \"undefined\"\r\n          ? sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\")\r\n          : \"\") ||\r\n        \"\",\r\n    )\r\n      .trim()\r\n      .toUpperCase();\r\n    return raw === \"BREAK\" || raw === \"IDLE\" ? \"\" : raw;\r\n  })();\r\n\r\n  // Declared before the timer effect so a type change re-anchors the clock before\r\n  // that effect reads it. The interval reads breakStartTimeRef every tick, so it\r\n  // picks up the new anchor without being restarted.\r\n  useEffect(() => {\r\n    if (!isAgentOnBreak) {\r\n      breakTypeRef.current = null;\r\n      return;\r\n    }\r\n    if (!currentBreakType) return;\r\n    if (breakTypeRef.current && breakTypeRef.current !== currentBreakType) {\r\n      breakStartTimeRef.current = Date.now();\r\n      setBreakDuration(0);\r\n    }\r\n    breakTypeRef.current = currentBreakType;\r\n  }, [isAgentOnBreak, currentBreakType]);\r\n\r\n  useEffect(() => {\r\n    let breakInterval: ReturnType<typeof setInterval>;\r\n\r\n    if (isAgentOnBreak && canViewBreakCountdown) {\r\n      if (!breakStartTimeRef.current) {\r\n        breakStartTimeRef.current = Date.now();\r\n      }\r\n      setBreakDuration(\r\n        Math.floor((Date.now() - breakStartTimeRef.current) / 1000),\r\n      );\r\n      breakInterval = setInterval(() => {\r\n        if (breakStartTimeRef.current) {\r\n          setBreakDuration(\r\n            Math.floor((Date.now() - breakStartTimeRef.current) / 1000),\r\n          );\r\n        }\r\n      }, 1000);\r\n    } else {\r\n      breakStartTimeRef.current = null;\r\n      setBreakDuration(0);\r\n    }\r\n\r\n    return () => {\r\n      if (breakInterval) clearInterval(breakInterval);\r\n    };\r\n  }, [isAgentOnBreak, canViewBreakCountdown]);\r\n  // ─────────────────────────────────────────────────────────────────────────\r\n\r\n  useEffect(() => {\r\n    createAudioElement()\r\n      .then((audio) => {\r\n        audioRef.current = audio;\r\n      })\r\n      .catch((error) => {\r\n        console.error(\"Failed to load audio element:\", error);\r\n      });\r\n\r\n    return () => {\r\n      if (audioRef.current) {\r\n        audioRef.current.pause();\r\n        audioRef.current.currentTime = 0;\r\n        audioRef.current.src = \"\"; // Clear source\r\n        audioRef.current = null;\r\n      }\r\n      // Cleanup blob URLs\r\n      cleanupAudioResources();\r\n    };\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (onDataChange && state.callData) {\r\n      const {\r\n        process_id,\r\n        process_name,\r\n        status,\r\n        phone_number,\r\n        agent_id,\r\n        call_id,\r\n        call_details,\r\n      } = state.callData;\r\n      const lead_data = sdkStateManager.getTransferLeadData();\r\n      const callData = {\r\n        phone_number,\r\n        status,\r\n        callReferenceId: call_id,\r\n        agent_id,\r\n        process_id,\r\n        process_name,\r\n        call_details,\r\n        auto_wrapup_time: state.backendCallControls?.auto_wrapup_time ?? null,\r\n        ...(lead_data !== undefined && { lead_data }),\r\n        socket_info: state.callData,\r\n      };\r\n      onDataChange(callData);\r\n    }\r\n  }, [state.callData, onDataChange]);\r\n\r\n  // ── The status this panel ASSERTS when it mounts ────────────────────────────\r\n  //\r\n  // A mirror of postLoginStatus in the browser phone (ahs-cti-ui.js), and it is\r\n  // here for the reason that file gives: agent-events sends only status\r\n  // TRANSITIONS. Its AGENT_CONNECTED frame carries agent_id and connection_id and\r\n  // no status at all, so a dialer whose socket connects AFTER a change never\r\n  // learns it and comes up showing whatever it last knew.\r\n  //\r\n  // The phone answers that by asserting rather than reading — every freshly loaded\r\n  // phone document posts /agents/status AGENTBREAK with the first break in the\r\n  // list — so its UI and the backend agree by construction and it never has to\r\n  // know what happened while it was gone.\r\n  //\r\n  // This panel only ever READ. Its one reconciliation is connectWebSocket's onopen\r\n  // below, which restores a break from PREVIOUS_AGENT_STATUS — a sessionStorage key\r\n  // the phone cannot write, since it runs on its own origin. So on the trip back\r\n  // from the iframe the key was absent, onopen did nothing, and the panel painted\r\n  // the IDLE its store was last told about (from before the iframe ran) while the\r\n  // backend sat on the break the phone had asserted on ITS mount. Dialing came back\r\n  //\r\n  //   409: Agent 261 is not available for outbound calls (current status: BREAK)\r\n  //\r\n  // with nothing on screen to explain it — and only ever in the sdk → iframe → sdk\r\n  // direction, because the reverse trip loads a new phone document that re-asserts.\r\n  //\r\n  // Runs on every mount, exactly as the phone runs on every loaded document. That\r\n  // covers the reload and the second tab as well as the switch: initSDK seeds the\r\n  // agent's real status from the register response (see index.ts), but it only runs\r\n  // once per session — `isInitialized` is persisted, so Header skips it after a\r\n  // reload — and it cannot see anything that happened afterwards either way.\r\n  const INITIAL_STATUS_WINDOW_MS = 90000;\r\n  const initialStatusPostedRef = useRef(false);\r\n  const initialStatusDeadlineRef = useRef(0);\r\n  const initialStatusRetryMsRef = useRef(1000);\r\n  const initialStatusTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n  // Whether GET /cti/breaks has answered (success or failure). The status post\r\n  // waits for it and for the agent-events socket, whichever comes last.\r\n  const loginBreaksAnsweredRef = useRef(false);\r\n  const firstBreakTypeRef = useRef<string>(\"\");\r\n  // The break this panel asserts right after login: the system row of GET\r\n  // /cti/breaks when the tenant has one, else the first selectable break. System\r\n  // breaks are the ones the BACKEND manages, so parking a fresh login on one is the\r\n  // backend naming the break rather than us picking whichever row sorts first.\r\n  const loginBreakTypeRef = useRef<string>(\"\");\r\n  // Set once this panel has decided it is going to assert, and painted that\r\n  // decision. Distinguishes the BREAK we put on screen ourselves from a BREAK we\r\n  // actually knew about — the guard below has to skip its own paint, or it would\r\n  // read it as \"the presence is already known\" and never post.\r\n  const initialStatusPaintedRef = useRef(false);\r\n  // Whether this panel came up on a fresh LOGIN rather than a reload, a remount or\r\n  // a second tab. initSDK sets CTI_FRESH_LOGIN once per session (it runs once per\r\n  // session itself); this reads it on the first render and clears it immediately,\r\n  // so exactly one panel in one tab treats itself as the login's panel however\r\n  // many times anything remounts afterwards.\r\n  //\r\n  // On that one mount the panel ASSERTS the login break instead of reading the\r\n  // presence it was given — the browser phone's stance in applyFirstLoginBreak,\r\n  // and the fix for a login response that says BREAK while naming no break.\r\n  //\r\n  // Read when the decision is made, not on first render: the panel mounts while\r\n  // initSDK's login round trip is still in flight, and the marker only exists once\r\n  // it returns (set in the same synchronous step that stores the token the\r\n  // decision waits for). Reading it at render missed every first login.\r\n  const isFreshLoginRef = useRef(false);\r\n  const isFreshLogin = (): boolean => {\r\n    if (isFreshLoginRef.current) return true;\r\n    try {\r\n      const marker =\r\n        typeof sessionStorage !== \"undefined\"\r\n          ? sessionStorage.getItem(\"CTI_FRESH_LOGIN\")\r\n          : null;\r\n      if (marker) {\r\n        // Only the page the login happened in. A marker from an earlier document\r\n        // means this load is a refresh — drop it rather than treat it as a login.\r\n        sessionStorage.removeItem(\"CTI_FRESH_LOGIN\");\r\n        if (marker === DOCUMENT_ID) isFreshLoginRef.current = true;\r\n      }\r\n    } catch {\r\n      // Storage blocked — fall back to the read-only behaviour.\r\n    }\r\n    return isFreshLoginRef.current;\r\n  };\r\n\r\n  // The first socket connection after a refresh must not re-post a status:\r\n  // the backend already holds the agent's status (a refresh with no call changes\r\n  // nothing server-side), and re-asserting a saved break — possibly a stale one —\r\n  // flipped an IDLE agent to BREAK and back.\r\n  const skipStatusRestoreOnOpenRef = useRef<boolean>(wasDocumentReloaded());\r\n\r\n  // Save the break on screen on the way out, for reloadBreakGuard after a refresh.\r\n  useEffect(() => {\r\n    const saveShownBreak = () => {\r\n      try {\r\n        const current = sdkStateManager.getState();\r\n        const status = String(current.callData?.status ?? \"\").toUpperCase();\r\n        const shown =\r\n          status === CallStatus.BREAK\r\n            ? resolveBreakName(\r\n                current.agentStatus,\r\n                current.callData?.break_details?.value,\r\n                current.callData?.break_details?.type,\r\n              )\r\n            : \"\";\r\n        if (shown) sessionStorage.setItem(BREAK_BEFORE_RELOAD_KEY, shown);\r\n        else sessionStorage.removeItem(BREAK_BEFORE_RELOAD_KEY);\r\n      } catch {\r\n        // sessionStorage can be unavailable while the document is closing.\r\n      }\r\n    };\r\n    window.addEventListener(\"pagehide\", saveShownBreak);\r\n    return () => window.removeEventListener(\"pagehide\", saveShownBreak);\r\n  }, []);\r\n\r\n  // Read a break row the same tolerant way the presence menu does: `type` is what\r\n  // the backend sends and what AGENTBREAK expects, the rest are consulted only when\r\n  // it is absent, so an envelope variant the menu renders fine still posts.\r\n  const readBreakType = (row: unknown): string => {\r\n    if (!row) return \"\";\r\n    if (typeof row === \"string\") return row;\r\n    const b = row as Record<string, unknown>;\r\n    return String(b.type || b.break_type || b.name || b.value || \"\");\r\n  };\r\n\r\n  // A system-managed break row. The break schemas are CamelCaseModel, so the flag may\r\n  // arrive either spelling — read both rather than trusting one.\r\n  const isSystemBreakRow = (row: unknown): boolean => {\r\n    if (!row || typeof row === \"string\") return false;\r\n    const b = row as Record<string, unknown>;\r\n    return Boolean(b.is_system || b.isSystem);\r\n  };\r\n\r\n  const clearInitialStatusRetry = () => {\r\n    if (initialStatusTimerRef.current) {\r\n      clearTimeout(initialStatusTimerRef.current);\r\n      initialStatusTimerRef.current = null;\r\n    }\r\n  };\r\n\r\n  const postInitialAgentStatus = () => {\r\n    if (initialStatusPostedRef.current) return;\r\n\r\n    // Read THROUGH the store, not off `state`: the retry below re-enters whichever\r\n    // closure scheduled it, and this can also be reached from a request that\r\n    // outlived the render it started in.\r\n    const currentSdkState = sdkStateManager.getState();\r\n    const agentId = String(currentSdkState.agentId ?? \"\");\r\n    if (!agentId) return;\r\n\r\n    // Never before the agent-events socket is up, and never before the breaks list\r\n    // answered (the post carries its break type). Whichever lands last re-drives\r\n    // this: the breaks call's completion, or connectWebSocket's onopen.\r\n    if (webSocketRef.current?.readyState !== WebSocket.OPEN) return;\r\n    if (!loginBreaksAnsweredRef.current) return;\r\n\r\n    const currentStatus = String(\r\n      currentSdkState.callData?.status ?? \"\",\r\n    ).toUpperCase();\r\n\r\n    // A call owns the status, and asserting a break under one would end it. The\r\n    // phone gives up here for good rather than waiting the call out — by the time\r\n    // it ends the agent is mid-shift, and dropping them into a break the moment\r\n    // they hang up is worse than not posting at all — and so does this.\r\n    if (\r\n      [\r\n        CallStatus.ONCALL,\r\n        CallStatus.RINGING,\r\n        CallStatus.DIALING,\r\n        CallStatus.HOLD,\r\n        CallStatus.WRAPUP,\r\n      ].includes(currentStatus as CallStatus)\r\n    ) {\r\n      initialStatusPostedRef.current = true;\r\n      clearInitialStatusRetry();\r\n      return;\r\n    }\r\n\r\n    // Only the first login asserts a status. A refresh, a remount or a second tab\r\n    // keeps the agent's last status, which the backend already holds.\r\n    if (!isFreshLogin()) {\r\n      initialStatusPostedRef.current = true;\r\n      clearInitialStatusRetry();\r\n      return;\r\n    }\r\n\r\n    // The panel already knows this agent's presence, so it has nothing to assert:\r\n    // a reload rehydrated a break, or this panel set it itself. onopen owns\r\n    // re-posting it. Asserting the login break over any of those would throw away\r\n    // the break the agent actually chose.\r\n    //\r\n    // Skipped once the paint effect has run, because from here the BREAK it wrote\r\n    // is indistinguishable from a break we were told about — and reading our own\r\n    // optimism as knowledge would cancel the very post it is standing in for.\r\n    //\r\n    // Skipped on a FRESH LOGIN too, and that is the whole point of the marker: the\r\n    // login response routinely reports BREAK without naming a break, and this\r\n    // guard read that as \"presence known\" and stayed silent — leaving the agent on\r\n    // whatever nameless break the backend had them in, with no break type on\r\n    // screen. The browser phone has never had this problem because\r\n    // applyFirstLoginBreak asserts on every loaded document and asks nothing about\r\n    // what it already knows; this is the same assertion, narrowed to the one\r\n    // moment where nothing can be thrown away, since a login has no earlier break\r\n    // of the agent's own choosing to lose.\r\n    const savedStatus =\r\n      typeof sessionStorage !== \"undefined\"\r\n        ? sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\")\r\n        : null;\r\n    if (\r\n      !isFreshLoginRef.current &&\r\n      !initialStatusPaintedRef.current &&\r\n      (currentStatus === CallStatus.BREAK || (savedStatus && savedStatus !== \"IDLE\"))\r\n    ) {\r\n      initialStatusPostedRef.current = true;\r\n      clearInitialStatusRetry();\r\n      return;\r\n    }\r\n\r\n    if (!initialStatusDeadlineRef.current) {\r\n      initialStatusDeadlineRef.current = Date.now() + INITIAL_STATUS_WINDOW_MS;\r\n    }\r\n    // Out of time. Stop retrying — the failures were logged as they happened, and a\r\n    // status that is never asserted has no other symptom until the agent dials.\r\n    if (Date.now() >= initialStatusDeadlineRef.current) {\r\n      initialStatusPostedRef.current = true;\r\n      clearInitialStatusRetry();\r\n      return;\r\n    }\r\n\r\n    // Optimistic, in the same way handleUpdateAgentStatus is: this latch exists to\r\n    // stop a second attempt racing this one, not to record that the backend\r\n    // accepted it. Released in the catch so one blip doesn't cost the agent their\r\n    // initial status for the life of the panel.\r\n    initialStatusPostedRef.current = true;\r\n    clearInitialStatusRetry();\r\n\r\n    const breakType = loginBreakTypeRef.current;\r\n    // axiosInstance rather than the usePostRequest hook, as onopen's restore does:\r\n    // the hook toasts on both outcomes, and the agent clicked nothing here — a\r\n    // toast about a break they never asked for is noise, and with a retry behind it\r\n    // repeated noise. The outcome goes to the console instead.\r\n    axiosInstance\r\n      .post(END_POINT.UPDATE_AGENT_BREAK, {\r\n        action: \"AGENTBREAK\",\r\n        break_type: breakType || null,\r\n        userId: agentId,\r\n      })\r\n      .then(() => {\r\n        // `break_type: null` went up for a tenant with no breaks configured, so\r\n        // there is no name to paint either — the backend named the break, and its\r\n        // next frame carries it.\r\n        const activeBreak = resolveBreakName(breakType);\r\n        sdkStateManager.updateCallData({\r\n          status: \"BREAK\",\r\n          break_details: activeBreak ? { type: activeBreak, value: activeBreak } : null,\r\n        });\r\n        sdkStateManager.setAgentStatus(activeBreak);\r\n        rememberBreakName(activeBreak);\r\n      })\r\n      .catch((err) => {\r\n        console.error(\"❌ Failed to assert the initial agent status:\", err);\r\n        initialStatusPostedRef.current = false;\r\n        // Back off rather than hammering a backend that just refused: a 1s loop\r\n        // against a 401 would be ~90 pointless requests inside the window.\r\n        initialStatusRetryMsRef.current = Math.min(\r\n          initialStatusRetryMsRef.current * 2,\r\n          15000,\r\n        );\r\n        clearInitialStatusRetry();\r\n        initialStatusTimerRef.current = setTimeout(() => {\r\n          initialStatusTimerRef.current = null;\r\n          postInitialAgentStatus();\r\n        }, initialStatusRetryMsRef.current);\r\n      });\r\n  };\r\n\r\n  useEffect(() => clearInitialStatusRetry, []);\r\n\r\n  // Paint the assertion when it is DECIDED, not when the POST answers.\r\n  //\r\n  // The post is chained behind the breaks call, so it is two round trips away, and\r\n  // painting only in its `.then()` left the panel sitting on its last-known IDLE\r\n  // for that whole window — the switch showed Available for a fraction of a second\r\n  // and then flipped to Break. Short, but it is the panel claiming a status it does\r\n  // not have, and dialing inside that window brings the 409 straight back.\r\n  //\r\n  // Nothing here needs the network. Every guard reads the store, so the decision\r\n  // can be made the moment the store is trustworthy; only the break TYPE on the\r\n  // wire needs the breaks list, and the pill can carry the fallback name until it\r\n  // lands (the post's `.then()` corrects it).\r\n  //\r\n  // Waits for `authorization` rather than `agentId` alone, and that ordering is\r\n  // load-bearing: initSDK assigns agentId in setSDKPermissions, and only later —\r\n  // synchronously after initialize() sets authorization, with no await between (see\r\n  // index.ts) — seeds the break the login response reported. So a listener that\r\n  // sees a token has already seen that seed, and this cannot paint FirstLogin over\r\n  // a break the agent was genuinely on when they signed in.\r\n  const hasSdkToken = Boolean(state.authorization?.accessToken);\r\n  const paintInitialStatus = () => {\r\n    if (initialStatusPaintedRef.current || initialStatusPostedRef.current) return;\r\n\r\n    const currentSdkState = sdkStateManager.getState();\r\n    const currentStatus = String(\r\n      currentSdkState.callData?.status ?? \"\",\r\n    ).toUpperCase();\r\n    // Same two verdicts postInitialAgentStatus reaches, and for the same reasons —\r\n    // a call owns the status, or the presence is already known. Left to that\r\n    // function to latch: this effect only decides whether to paint.\r\n    //\r\n    // A call owns the status whatever brought this panel up, so that list stands\r\n    // even for a fresh login. \"Presence already known\" does not: on a login there\r\n    // is no break of the agent's own to preserve, and the BREAK being reported is\r\n    // the very one whose name is missing.\r\n    if (\r\n      [\r\n        CallStatus.ONCALL,\r\n        CallStatus.RINGING,\r\n        CallStatus.DIALING,\r\n        CallStatus.HOLD,\r\n        CallStatus.WRAPUP,\r\n      ].includes(currentStatus as CallStatus)\r\n    ) {\r\n      return;\r\n    }\r\n    // Only the first login asserts a status (see postInitialAgentStatus).\r\n    if (!isFreshLogin()) return;\r\n    if (!isFreshLoginRef.current && currentStatus === CallStatus.BREAK) return;\r\n    const savedStatus =\r\n      typeof sessionStorage !== \"undefined\"\r\n        ? sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\")\r\n        : null;\r\n    if (!isFreshLoginRef.current && savedStatus && savedStatus !== \"IDLE\") return;\r\n\r\n    initialStatusPaintedRef.current = true;\r\n    // Optimistic paint before the list has loaded: BREAK with no name rather than\r\n    // a guessed one. The breaks-list effect below backfills the name the moment\r\n    // GET /cti/breaks answers, precisely because agentStatus is left empty here.\r\n    //\r\n    // A name the store already holds is kept rather than blanked — on a fresh\r\n    // login this paint now runs over a BREAK the login response reported, and\r\n    // wiping its name to show nothing for one round trip would be a step back.\r\n    // The assertion's own `.then()` has the last word either way.\r\n    const activeBreak = resolveBreakName(\r\n      loginBreakTypeRef.current,\r\n      currentSdkState.agentStatus,\r\n    );\r\n    sdkStateManager.updateCallData({\r\n      status: \"BREAK\",\r\n      break_details: activeBreak ? { type: activeBreak, value: activeBreak } : null,\r\n    });\r\n    sdkStateManager.setAgentStatus(activeBreak);\r\n    // PREVIOUS_AGENT_STATUS is deliberately NOT written here — only once the post\r\n    // succeeds. connectWebSocket's onopen restores a break from that key, so\r\n    // writing it now would have the socket opening mid-flight post its own\r\n    // AGENTBREAK on top of ours. The key means \"the backend has this break\", and\r\n    // until the post answers that is not yet true.\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (!state.agentId || !hasSdkToken) return;\r\n    paintInitialStatus();\r\n  }, [state.agentId, hasSdkToken]);\r\n\r\n  // ── First login: park the agent on the first system break ─────────────────────\r\n  // initSDK fires `cti:fresh-login` the moment the login answers. The panel is\r\n  // normally mounted before that, and every check it made at mount saw no login\r\n  // yet — so it would stay silent, and the unconsumed marker would then turn the\r\n  // agent's next refresh into a \"first login\". Handling the event here (and the\r\n  // marker on mount, for a panel that comes up after the login) runs the login\r\n  // assertion exactly once, with this session's token: fetch the breaks, take the\r\n  // first system break (else the first break), show it and post it.\r\n  const freshLoginHandledRef = useRef(false);\r\n  const runFreshLoginAssertion = () => {\r\n    if (freshLoginHandledRef.current) return;\r\n    const current = sdkStateManager.getState();\r\n    // Wait for the login itself — the marker is consumed below, so it must not be\r\n    // spent before there is an agent and a token to post with.\r\n    if (!current.agentId || !current.authorization?.accessToken) return;\r\n    if (!isFreshLogin()) return;\r\n    freshLoginHandledRef.current = true;\r\n    // A login is never a refresh: nothing from an earlier refresh may be restored.\r\n    endReloadBreakGuard();\r\n\r\n    initialStatusPostedRef.current = false;\r\n    initialStatusPaintedRef.current = false;\r\n    initialStatusDeadlineRef.current = 0;\r\n    initialStatusRetryMsRef.current = 1000;\r\n    clearInitialStatusRetry();\r\n    paintInitialStatus();\r\n\r\n    axiosInstance\r\n      .get(END_POINT.BREAKS_LIST, { params: { include_system: true } })\r\n      .then((res) => {\r\n        const rows = (Array.isArray(res?.data)\r\n          ? res.data\r\n          : res?.data?.data ?? []) as Array<Record<string, unknown>>;\r\n        if (!rows.length) return;\r\n        const systemRow = rows.find(isSystemBreakRow);\r\n        const selectable = rows.filter((row) => !isSystemBreakRow(row));\r\n        setBreaksList(selectable as NonNullable<typeof breaksList>);\r\n        firstBreakTypeRef.current = readBreakType(selectable[0]);\r\n        loginBreakTypeRef.current =\r\n          readBreakType(systemRow) || firstBreakTypeRef.current;\r\n      })\r\n      .catch(() => undefined)\r\n      .finally(() => {\r\n        loginBreaksAnsweredRef.current = true;\r\n        postInitialAgentStatus();\r\n      });\r\n  };\r\n  const runFreshLoginAssertionRef = useRef(runFreshLoginAssertion);\r\n  runFreshLoginAssertionRef.current = runFreshLoginAssertion;\r\n  useEffect(() => {\r\n    const onFreshLogin = () => runFreshLoginAssertionRef.current();\r\n    onFreshLogin();\r\n    window.addEventListener(\"cti:fresh-login\", onFreshLogin);\r\n    return () => window.removeEventListener(\"cti:fresh-login\", onFreshLogin);\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    if (state.agentId) {\r\n      // axiosInstance\r\n      // \t.post(END_POINT.PROCESS_LIST, {\r\n      // \t\tuserId: state.agentId,\r\n      // \t\taction: \"GETAGENTPROCESSLIST\",\r\n      // \t\trefno: \"1234221233\",\r\n      // \t})\r\n      // \t.then((res) => {\r\n      // \t\t// if (res && res.data?.data && res?.data?.data?.length > 1) {\r\n      // \t\t// \tsetProcessList(res.data.data);\r\n      // \t\t// \tsetOpenProcessorDialog(true);\r\n      // \t\t// } else {\r\n      // \t\t\tconst data = {\r\n      // \t\t\t\"process_id\": 101,\r\n      // \t\t\t\"process_name\": \"ConVoxProcess\"\r\n      // \t\t}\r\n      // \t\t\tsetProcessList([data]);\r\n\r\n      // \t\t\tsdkStateManager.setProcess(data);\r\n      // \t\t\t// setOpenProcessorDialog(false);\r\n      // \t\t// }\r\n      // \t})\r\n      // \t.catch((err) => {\r\n      // \t\t\tconst data = {\r\n      // \t\t\t\"process_id\": 101,\r\n      // \t\t\t\"process_name\": \"ConVoxProcess\"\r\n      // \t\t}\r\n      // \t\t\tsetProcessList([data]);\r\n\r\n      // \t\t\tsdkStateManager.setProcess(data);\r\n      // \t\tshowToast(err.response.data.message, \"error\");\r\n      // \t});\r\n\r\n      // include_system=true — the route defaults it to false, and without the system\r\n      // row there is nothing to park a fresh login on but the first tenant break.\r\n      // The row is kept out of the presence menu below; it is asked for only so the\r\n      // post-login break is the one the backend manages.\r\n      axiosInstance\r\n        .get(END_POINT.BREAKS_LIST, { params: { include_system: true } })\r\n        .then((res) => {\r\n          // { data: [...] } is what this route sends; a bare array is read too so an\r\n          // envelope variant still fills the menu.\r\n          const rows = (Array.isArray(res?.data)\r\n            ? res.data\r\n            : res?.data?.data ?? []) as Array<Record<string, unknown>>;\r\n          if (rows.length) {\r\n            const systemRow = rows.find(isSystemBreakRow);\r\n            // A tenant whose only row is the system one gets an empty menu and still\r\n            // gets a named login break.\r\n            const selectable = rows.filter((row) => !isSystemBreakRow(row));\r\n            setBreaksList(selectable as NonNullable<typeof breaksList>);\r\n            firstBreakTypeRef.current = readBreakType(selectable[0]);\r\n            loginBreakTypeRef.current =\r\n              readBreakType(systemRow) || firstBreakTypeRef.current;\r\n            const currentSdkState = sdkStateManager.getState();\r\n            const currentStatus = String(\r\n              currentSdkState.callData?.status ?? \"\",\r\n            ).toUpperCase();\r\n            if (\r\n              currentStatus === CallStatus.BREAK &&\r\n              (!currentSdkState.agentStatus || currentSdkState.agentStatus === \"BREAK\")\r\n            ) {\r\n              // Backfill for the unnamed break painted above. The list answered, so\r\n              // the login break is a real break type; a row that carries no usable\r\n              // name leaves the break unnamed rather than inventing one.\r\n              // The break the agent was on before a refresh wins over the login\r\n              // break; the login break only names a break nobody chose.\r\n              const loginBreak = resolveBreakName(\r\n                savedBreakName(),\r\n                loginBreakTypeRef.current,\r\n              );\r\n              if (loginBreak) {\r\n                sdkStateManager.setAgentStatus(loginBreak);\r\n                sdkStateManager.updateCallData({\r\n                  status: \"BREAK\",\r\n                  break_details: { type: loginBreak, value: loginBreak },\r\n                });\r\n                rememberBreakName(loginBreak);\r\n              }\r\n            }\r\n          }\r\n          // Chained behind the breaks call so the status post carries a break type,\r\n          // and deliberately OUTSIDE the length check: break_type is nullable in the\r\n          // backend's schema for this endpoint, so \"this tenant has no breaks\r\n          // configured\" is a value to send rather than a reason to stay silent.\r\n          loginBreaksAnsweredRef.current = true;\r\n          postInitialAgentStatus();\r\n        })\r\n        .catch(() => {\r\n          // A failed breaks call is still an answer as far as ordering goes — the\r\n          // status post has waited its turn and must not be lost with it. Same\r\n          // reasoning as fetchBreaks' catch in the browser phone.\r\n          loginBreaksAnsweredRef.current = true;\r\n          postInitialAgentStatus();\r\n        });\r\n    }\r\n  }, [state.agentId]);\r\n\r\n  const connectWebSocket = () => {\r\n    // Read the token and base URL THROUGH THE STORE rather than off `state`.\r\n    // A reconnect is scheduled from onclose as\r\n    // `setTimeout(() => connectWebSocket(), delay)`, which re-enters whichever\r\n    // closure was current when the first connect ran — so reading the render's\r\n    // `state` replayed that render's token on every one of the 60 retries, and a\r\n    // token arriving later could never be picked up.\r\n    const currentState = sdkStateManager.getState();\r\n    const accessToken = currentState.authorization?.accessToken;\r\n    const webSocketURL = currentState.urlConfig?.webSocketURL;\r\n\r\n    // Don't dial out half-initialised. initSDK populates the store in two steps:\r\n    // setSDKPermissions() assigns agentId and notifies listeners, and only then\r\n    // does initialize() set `authorization`. The [state.agentId] effect below\r\n    // fires on that first notification, so without this guard the socket opened\r\n    // in the gap between them and the template literal stringified the missing\r\n    // token into a literal \"?token=undefined\" — which the server accepts through\r\n    // the handshake (101) and then closes, starting a backoff loop that could\r\n    // never recover because the token was frozen in the closure above.\r\n    //\r\n    // The same gap is persisted by setSDKPermissions' own saveToStorage(), so a\r\n    // reload (or an initSDK that throws between the two calls) can rehydrate an\r\n    // agentId with no token and reach here the same way from cold start.\r\n    if (!state.agentId || !accessToken || !webSocketURL) {\r\n      return;\r\n    }\r\n\r\n    if (reconnectTimeoutRef.current) {\r\n      clearTimeout(reconnectTimeoutRef.current);\r\n      reconnectTimeoutRef.current = null;\r\n    }\r\n\r\n    try {\r\n      webSocketRef.current = new WebSocket(\r\n        `${webSocketURL}/api/v1/ws/agent/events?token=${encodeURIComponent(accessToken)}`,\r\n      );\r\n\r\n      webSocketRef.current.onopen = () => {\r\n        console.log(\"🌐 WebSocket connection established\");\r\n\r\n        reconnectAttemptsRef.current = 0;\r\n\r\n        if (pingIntervalRef.current) {\r\n          clearInterval(pingIntervalRef.current);\r\n        }\r\n        pingIntervalRef.current = setInterval(() => {\r\n          if (\r\n            webSocketRef.current &&\r\n            webSocketRef.current.readyState === WebSocket.OPEN\r\n          ) {\r\n            try {\r\n              webSocketRef.current.send(JSON.stringify({ type: \"ping\" }));\r\n            } catch (error) {\r\n              console.error(\"Failed to send ping:\", error);\r\n            }\r\n          }\r\n        }, 30000);\r\n\r\n        const currentCallStatus = (\r\n          sdkStateManager.getState().callData?.status ||\r\n          state.callData?.status ||\r\n          \"\"\r\n        ).toUpperCase();\r\n        const isInActiveCall = [\r\n          CallStatus.ONCALL,\r\n          CallStatus.RINGING,\r\n          CallStatus.DIALING,\r\n          CallStatus.WRAPUP,\r\n          CallStatus.HOLD,\r\n        ].includes(currentCallStatus as CallStatus);\r\n\r\n        if (isInActiveCall) {\r\n          console.log(\r\n            \"Agent is currently in active call state:\",\r\n            currentCallStatus,\r\n            \"- skipping ready/break restore to prevent hangup\",\r\n          );\r\n          return;\r\n        }\r\n\r\n        // A fresh login's status post is still owed — it waits for this\r\n        // connection (see postInitialAgentStatus). Send it now, and skip the\r\n        // restore below: the BREAK painted for that login would otherwise read as\r\n        // a break to restore and post a second AGENTBREAK on top of it.\r\n        if (isFreshLogin() && !initialStatusPostedRef.current) {\r\n          postInitialAgentStatus();\r\n          return;\r\n        }\r\n\r\n        if (skipStatusRestoreOnOpenRef.current) {\r\n          skipStatusRestoreOnOpenRef.current = false;\r\n          console.log(\"Page was refreshed - keeping the backend's status, no restore\");\r\n          return;\r\n        }\r\n\r\n        const previousStatus = sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\");\r\n        console.log(\"Previous saved agent status:\", previousStatus);\r\n\r\n        // On break according to the STORE as well as the key. The key alone used\r\n        // to decide this, and it is written only when a break has a name — so a\r\n        // break the backend applied without naming one (a tenant with no rows in\r\n        // GET /cti/breaks, or a login response that reported BREAK and nothing\r\n        // else) was not re-asserted on reconnect at all.\r\n        const liveCallData = sdkStateManager.getState().callData;\r\n        const isBreak = Boolean(\r\n          (previousStatus && previousStatus !== \"IDLE\") ||\r\n            String(liveCallData?.status ?? \"\").toUpperCase() === CallStatus.BREAK,\r\n        );\r\n\r\n        // The name to re-assert, and never a placeholder. `previousStatus` is a\r\n        // plain sessionStorage string: sessions that ran before this fix can still\r\n        // hold the literal \"BREAK\" in it, and posting THAT put a break type called\r\n        // \"BREAK\" into the backend's records — then painted it back over whatever\r\n        // real name the breaks-list backfill had already worked out, and the break\r\n        // chip (which rejects \"BREAK\" as a name) went blank for the session.\r\n        // Resolving here leaves break_type off the payload instead, which the\r\n        // AGENTBREAK schema allows; the backend then keeps naming the break.\r\n        const restoreBreakName = resolveBreakName(\r\n          previousStatus,\r\n          liveCallData?.break_details?.value,\r\n          liveCallData?.break_details?.type,\r\n          sdkStateManager.getState().agentStatus,\r\n          loginBreakTypeRef.current,\r\n        );\r\n\r\n        if (isBreak) {\r\n          // Restore break status\r\n          axiosInstance\r\n            .post(END_POINT.UPDATE_AGENT_BREAK, {\r\n              action: \"AGENTBREAK\",\r\n              ...(restoreBreakName ? { break_type: restoreBreakName } : {}),\r\n              userId: String(state.agentId ?? \"\"),\r\n            })\r\n            .then((res) => {\r\n              console.log(\"Break restore API response:\", res?.data);\r\n              // Only the status is unconditional. A nameless restore leaves\r\n              // whatever name the store already has alone rather than blanking it\r\n              // — the breaks backfill or the next socket frame may well have named\r\n              // this break already.\r\n              const nameNow = resolveBreakName(\r\n                restoreBreakName,\r\n                sdkStateManager.getState().callData?.break_details?.value,\r\n                sdkStateManager.getState().agentStatus,\r\n              );\r\n              sdkStateManager.updateCallData({\r\n                ...sdkStateManager.getState().callData,\r\n                status: \"BREAK\",\r\n                ...(nameNow\r\n                  ? { break_details: { type: nameNow, value: nameNow } }\r\n                  : {}),\r\n              });\r\n              if (nameNow) {\r\n                sdkStateManager.setAgentStatus(nameNow);\r\n                rememberBreakName(nameNow);\r\n              }\r\n            })\r\n            .catch((err) => {\r\n              console.error(\"❌ Failed to restore break status:\", err);\r\n            });\r\n        }\r\n      };\r\n\r\n      webSocketRef.current.onmessage = (event) => {\r\n        try {\r\n          const data = JSON.parse(event.data);\r\n\r\n          if (data.type === \"pong\") {\r\n            return;\r\n          }\r\n\r\n          // Acknowledge receipt of any frame that carries a correlation id.\r\n          // Fire-and-forget: a failed ack never holds up handling the frame. A 404\r\n          // means the backend has no such event for this agent — nothing to retry.\r\n          //\r\n          // Plain fetch, NOT axiosInstance, on purpose: its response interceptor\r\n          // reports every failure to the UI error log and runs the 401 handling\r\n          // (clearing the token / re-running init). An ack is bookkeeping and must\r\n          // never have either effect.\r\n          const correlationId = data?.correlation_id ?? data?.correlationId;\r\n          const ackToken = sdkStateManager.getState().authorization?.accessToken;\r\n          if (correlationId && ackToken) {\r\n            const cid = String(correlationId);\r\n            const acked = ackedEventIdsRef.current;\r\n            if (!acked.includes(cid)) {\r\n              acked.push(cid);\r\n              if (acked.length > 200) acked.shift();\r\n              // Not acked — forget it so a re-delivery gets another try.\r\n              const forget = () => {\r\n                const i = acked.indexOf(cid);\r\n                if (i >= 0) acked.splice(i, 1);\r\n              };\r\n              let deviceIp = \"\";\r\n              try {\r\n                deviceIp =\r\n                  sessionStorage.getItem(\"device_ip\") ||\r\n                  localStorage.getItem(\"device_ip\") ||\r\n                  (window as any).__device_ip ||\r\n                  \"\";\r\n              } catch {\r\n                // Storage blocked — send without the header.\r\n              }\r\n              fetch(END_POINT.AGENT_EVENT_ACK, {\r\n                method: \"POST\",\r\n                headers: {\r\n                  \"Content-Type\": \"application/json\",\r\n                  Accept: \"application/json\",\r\n                  Authorization: ackToken.startsWith(\"Bearer \") ? ackToken : `Bearer ${ackToken}`,\r\n                  ...(deviceIp ? { \"x-device-ip\": deviceIp } : {}),\r\n                },\r\n                body: JSON.stringify({ correlationId: cid }),\r\n              })\r\n                .then((res) => {\r\n                  if (!res.ok && res.status !== 404) {\r\n                    forget();\r\n                    console.warn(\"Agent event ack failed:\", res.status, cid);\r\n                  }\r\n                })\r\n                .catch((err) => {\r\n                  forget();\r\n                  console.warn(\"Agent event ack not sent:\", cid, err?.message ?? err);\r\n                });\r\n            }\r\n          }\r\n\r\n          // After a refresh, the break the agent was on is the one shown — see\r\n          // reloadBreakGuard. Undoes the extension re-assignment's \"Not Ready\" reset.\r\n          // A logout clears sessionStorage — the key gone means the refresh this\r\n          // guard belonged to is over (the same page may now be a new login).\r\n          try {\r\n            if (reloadBreakGuard && !sessionStorage.getItem(BREAK_BEFORE_RELOAD_KEY)) {\r\n              endReloadBreakGuard();\r\n            }\r\n          } catch {\r\n            // Storage blocked — keep the guard; agent actions still end it.\r\n          }\r\n          const reloadBreak = reloadBreakGuard;\r\n          if (reloadBreak) {\r\n            const frameStatus = String(data?.status ?? \"\").toUpperCase();\r\n            const frameAgentStatus = String(data?.agent_status ?? \"\").toUpperCase();\r\n            const incomingBreak = String(\r\n              data?.break_details?.value ||\r\n                data?.break_details?.type ||\r\n                data?.break_type ||\r\n                data?.break_name ||\r\n                \"\",\r\n            ).trim();\r\n            const isCallFrame = [frameStatus, frameAgentStatus].some((s) =>\r\n              [\"ONCALL\", \"RING\", \"DIAL\", \"HOLD\", \"WRAPUP\", \"INCALL\", \"TALK\", \"ANSWERED\"].some((c) =>\r\n                s.includes(c),\r\n              ),\r\n            );\r\n            const isBreakStatus = [frameStatus, frameAgentStatus].some(\r\n              (s) => s.includes(\"BREAK\") || s.includes(\"PAUSE\"),\r\n            );\r\n            if (isCallFrame) {\r\n              endReloadBreakGuard();\r\n            } else if (\r\n              isBreakStatus &&\r\n              (!incomingBreak || [\"BREAK\", \"IDLE\"].includes(incomingBreak.toUpperCase()))\r\n            ) {\r\n              // A break frame that names no break — show the agent's own. Nothing is\r\n              // posted: a nameless frame can't be told apart from the confirmation.\r\n              data.break_details = { type: reloadBreak.name, value: reloadBreak.name };\r\n              delete data.break_type;\r\n              delete data.break_name;\r\n            } else if (\r\n              isBreakStatus &&\r\n              incomingBreak &&\r\n              ![\"BREAK\", \"IDLE\"].includes(incomingBreak.toUpperCase())\r\n            ) {\r\n              if (incomingBreak.toUpperCase() === reloadBreak.name.toUpperCase()) {\r\n                // The backend holds the agent's break again. Stay armed for a later\r\n                // reset from the same refresh.\r\n                reloadBreak.pending = false;\r\n              } else {\r\n                data.break_details = { type: reloadBreak.name, value: reloadBreak.name };\r\n                delete data.break_type;\r\n                delete data.break_name;\r\n                // One restore in flight at a time, and a cap so a backend that keeps\r\n                // resetting can't loop us.\r\n                if (!reloadBreak.pending && reloadBreak.restores < 5) {\r\n                  reloadBreak.pending = true;\r\n                  reloadBreak.restores += 1;\r\n                  console.log(\r\n                    \"Refresh re-registered the extension and reset the break to\",\r\n                    incomingBreak,\r\n                    \"- restoring\",\r\n                    reloadBreak.name,\r\n                  );\r\n                  axiosInstance\r\n                    .post(END_POINT.UPDATE_AGENT_BREAK, {\r\n                      action: \"AGENTBREAK\",\r\n                      break_type: reloadBreak.name,\r\n                      userId: String(sdkStateManager.getState().agentId ?? \"\"),\r\n                    })\r\n                    .catch((err) => {\r\n                      reloadBreak.pending = false;\r\n                      console.error(\"❌ Failed to restore the break after refresh:\", err);\r\n                    });\r\n                }\r\n              }\r\n            }\r\n          }\r\n\r\n          const sdkState = getSession(STORAGE_KEY) as any;\r\n          const confrence = getCombineConfrenceData(sdkState, data);\r\n          // console.log( \"📊 Parsed JSON:\", data);\r\n\r\n          const rawStatus = String(\r\n            data?.status ?? data?.agent_status ?? \"\",\r\n          ).toUpperCase();\r\n          const rawCallStatus = String(data?.status ?? \"\").toUpperCase();\r\n          const rawAgentStatus = String(data?.agent_status ?? \"\").toUpperCase();\r\n          const isStatusTransition =\r\n            String((data as any)?.event_type ?? \"\").toUpperCase() ===\r\n            \"AGENT_STATUS_CHANGED\";\r\n          const frameBreakName = String(\r\n            data?.break_details?.value ||\r\n              data?.break_details?.type ||\r\n              data?.break_details?.break_type ||\r\n              (typeof data?.break_details === \"string\" ? data?.break_details : \"\") ||\r\n              data?.break_type ||\r\n              data?.break_name ||\r\n              \"\",\r\n          );\r\n\r\n          const isLiveCallBusy =\r\n            [\r\n              CallStatus.ONCALL,\r\n              CallStatus.RINGING,\r\n              CallStatus.DIALING,\r\n              CallStatus.HOLD,\r\n              CallStatus.UNHOLD,\r\n              CallStatus.MUTE,\r\n              CallStatus.UNMUTE,\r\n              CallStatus.CONFERENCE,\r\n            ].includes(rawCallStatus as CallStatus) ||\r\n            rawCallStatus === \"INCALL\" ||\r\n            rawCallStatus === \"ANSWERED\" ||\r\n            rawCallStatus === \"TALKING\" ||\r\n            rawCallStatus.includes(\"RING\") ||\r\n            rawCallStatus.includes(\"ONCALL\") ||\r\n            rawCallStatus.includes(\"TALK\");\r\n\r\n          const currentSdkState = sdkStateManager.getState();\r\n          const isCurrentWrapup =\r\n            String(currentSdkState.callData?.status ?? \"\").toUpperCase() ===\r\n            CallStatus.WRAPUP;\r\n\r\n          const hasMarkAsBreakFlag =\r\n            Boolean(data?.is_mark_as_break) ||\r\n            Boolean(data?.isBreak) ||\r\n            Boolean(data?.selected_break);\r\n\r\n          const isSavedBreak = Boolean(\r\n            (typeof sessionStorage !== \"undefined\" &&\r\n              sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") &&\r\n              sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") !== \"IDLE\" &&\r\n              sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\") !== \"READY\") ||\r\n            (currentSdkState.agentStatus &&\r\n              currentSdkState.agentStatus.toUpperCase() !== \"IDLE\" &&\r\n              currentSdkState.agentStatus.toUpperCase() !== \"READY\")\r\n          );\r\n\r\n          const isBreakFrame =\r\n            !isLiveCallBusy &&\r\n            rawCallStatus !== CallStatus.WRAPUP &&\r\n            !rawCallStatus.includes(\"WRAPUP\") &&\r\n            rawCallStatus !== CallStatus.READY &&\r\n            rawCallStatus !== CallStatus.IDLE &&\r\n            (rawAgentStatus === CallStatus.BREAK ||\r\n              rawAgentStatus === \"PAUSE\" ||\r\n              rawAgentStatus.includes(\"BREAK\") ||\r\n              rawAgentStatus.includes(\"PAUSE\") ||\r\n              rawCallStatus === CallStatus.BREAK ||\r\n              rawCallStatus === \"PAUSE\" ||\r\n              rawCallStatus.includes(\"BREAK\") ||\r\n              rawCallStatus.includes(\"PAUSE\") ||\r\n              hasMarkAsBreakFlag ||\r\n              Boolean(frameBreakName) ||\r\n              (!isCurrentWrapup && lastWasMarkAsBreakRef.current) ||\r\n              (!isCurrentWrapup && isSavedBreak && rawAgentStatus !== CallStatus.READY && rawAgentStatus !== CallStatus.IDLE && !rawCallStatus));\r\n\r\n          // The one name this BREAK frame gets, used for both `break_details` and\r\n          // `agentStatus` below (they used to resolve the same chain three times\r\n          // over, ending in a hardcoded label). Only backend-sourced candidates:\r\n          // the frame itself, the break the agent last took, the name already on\r\n          // screen, then the breaks list. All empty → \"\", and the break shows\r\n          // unnamed rather than carrying a type no tenant configured.\r\n          const frameBreakLabel = resolveBreakName(\r\n            frameBreakName,\r\n            savedBreakName(),\r\n            currentSdkState.agentStatus,\r\n            breaksList?.[0]?.type,\r\n            firstBreakTypeRef.current,\r\n          );\r\n\r\n          let normalizedStatus = isBreakFrame\r\n            ? CallStatus.BREAK\r\n            : isLiveCallBusy || rawCallStatus === CallStatus.WRAPUP || rawCallStatus.includes(\"WRAPUP\")\r\n              ? rawCallStatus\r\n              : isStatusTransition && rawAgentStatus\r\n                ? rawAgentStatus\r\n                : data?.status\r\n                  ? String(data.status).toUpperCase()\r\n                  : rawAgentStatus\r\n                    ? rawAgentStatus\r\n                    : \"\";\r\n\r\n          // A frame that carries NO status says nothing about the agent's state,\r\n          // so it must not erase it. Carry the live one forward instead.\r\n          //\r\n          // CALL_STATE frames carry no status at all (captured from the live\r\n          // socket; the browser phone documents the same shape in ahs-cti-ui.js,\r\n          // where this carry-forward already exists). Without this, the merge\r\n          // below wrote `status: \"\"` for every one of them, and since the panel\r\n          // reads \"\" as Available the whole call read as IDLE:\r\n          //\r\n          //   socket:  RINGING → CALL_STATE → ONCALL → CALL_STATE → WRAPUP\r\n          //   UI:      RINGING →   *IDLE*   → ONCALL →   *IDLE*    → WRAPUP\r\n          //\r\n          // WRAPUP looked like the only status that worked only because it is\r\n          // the one the guard just below already protected the same way — so the\r\n          // agent saw IDLE (with the idle counter ticking) through a live call,\r\n          // then a correct Wrap-Up the moment they hung up. That guard is now\r\n          // the WRAPUP-specific case of this rule; it stays because it also\r\n          // covers a genuine IDLE/READY reading, which this does not touch.\r\n          //\r\n          // Only the status is carried. Call identity (call_id, phone_number,\r\n          // call_details, is_outbound_call) is retained for these frames in the\r\n          // merge below rather than here, so a frame that DOES restate a field\r\n          // still wins.\r\n          const hasStatus = Boolean(rawCallStatus || rawAgentStatus || isBreakFrame);\r\n          if (!hasStatus) {\r\n            normalizedStatus = String(\r\n              currentSdkState.callData?.status ?? \"\",\r\n            ).toUpperCase();\r\n          }\r\n\r\n          // While the agent is in WRAPUP, an IDLE/READY reading must not clear it\r\n          // — EXCEPT when it is the genuine transition that ends the wrap-up.\r\n          //\r\n          // This used to swallow all three cases below unconditionally, which\r\n          // meant the socket's real \"wrap-up is over\" IDLE never reached the UI:\r\n          //\r\n          //   socket:  WRAPUP → IDLE → RINGING → ONCALL\r\n          //   UI:      WRAPUP →        RINGING → ONCALL\r\n          //\r\n          // Harmless when a call follows (the IDLE is only milliseconds long),\r\n          // but when none does, nothing else clears WRAPUP: the countdown at the\r\n          // wrapUpinterval effect keeps running for the rest of auto_wrapup_time\r\n          // and then fires an AUTO_WRAPUP hangup for a call the backend already\r\n          // closed. The agent shows as wrapping up long after being freed.\r\n          //\r\n          // What separates the two is the event type. This socket emits a status\r\n          // change ONLY as an AGENT_STATUS_CHANGED transition — its\r\n          // AGENT_CONNECTED frame carries no status at all — so an IDLE/READY on\r\n          // any other frame is not a transition and is exactly what this guard\r\n          // was added to reject. A frame with NO status stays rejected outright:\r\n          // CALL_STATE frames carry none, and reading that as \"wrap-up is over\"\r\n          // is the same bug in a different shape.\r\n          //\r\n          // The dialog is the other holdout. While the agent is dispositioning,\r\n          // clearing WRAPUP would strip call_id/phone_number off callData (they\r\n          // are retained for WRAPUP only, just below) and handleEndCall reads\r\n          // both at submit time — so the hangup would post an empty call_id.\r\n          // Hold WRAPUP until the dialog is done, exactly as before.\r\n\r\n          // A wrap-up that has already finished must not restart. The backend\r\n          // re-announces WRAPUP for a call after the fact — the same behaviour\r\n          // the browser phone keeps a `closedCalls` ledger for. It used to be\r\n          // invisible here only because the status was pinned to WRAPUP through\r\n          // this whole window anyway; now that a real IDLE ends the wrap-up, a\r\n          // re-fire is visible as the panel dropping back into Wrap-Up for about\r\n          // a second until the next call's RINGING replaces it.\r\n          //\r\n          // Matched on call_id, so a genuinely new call's wrap-up is unaffected.\r\n          // Gated on hasStatus: a frame that says nothing has already been given\r\n          // the current status just above, and re-reading that as a WRAPUP claim\r\n          // would put this branch in the way of its own carry-forward.\r\n          const frameCallId = String(data?.call_id ?? \"\");\r\n          const isStaleWrapupRefire =\r\n            hasStatus &&\r\n            normalizedStatus === CallStatus.WRAPUP &&\r\n            Boolean(endedWrapupCallIdRef.current) &&\r\n            (!frameCallId ||\r\n              frameCallId === \"null\" ||\r\n              frameCallId === \"undefined\" ||\r\n              frameCallId === endedWrapupCallIdRef.current ||\r\n              frameCallId === lastEndedCallIdRef.current);\r\n          if (isStaleWrapupRefire) {\r\n            normalizedStatus =\r\n              String(currentSdkState.callData?.status ?? \"\").toUpperCase() ||\r\n              CallStatus.IDLE;\r\n            if (normalizedStatus === CallStatus.WRAPUP) {\r\n              normalizedStatus = CallStatus.IDLE;\r\n            }\r\n          }\r\n\r\n          const endsWrapup =\r\n            (isStatusTransition || Boolean(endedWrapupCallIdRef.current)) &&\r\n            !openCallDispositionRef.current &&\r\n            (normalizedStatus === CallStatus.IDLE ||\r\n              normalizedStatus === CallStatus.READY);\r\n          if (\r\n            isCurrentWrapup &&\r\n            !endsWrapup &&\r\n            (normalizedStatus === CallStatus.IDLE ||\r\n              normalizedStatus === CallStatus.READY ||\r\n              !normalizedStatus)\r\n          ) {\r\n            normalizedStatus = CallStatus.WRAPUP;\r\n          }\r\n          // Remember which call this wrap-up belonged to, so the re-fire above\r\n          // can be recognised. Read from the state BEFORE this frame is applied —\r\n          // the frame that ends a wrap-up carries call_id null.\r\n          if (isCurrentWrapup && endsWrapup) {\r\n            endedWrapupCallIdRef.current =\r\n              String(currentSdkState.callData?.call_id ?? \"\") ||\r\n              endedWrapupCallIdRef.current;\r\n          }\r\n\r\n          // Who the call is with survives a frame that isn't a status transition,\r\n          // for the same reason the status itself does: a status-less CALL_STATE\r\n          // frame is about the call in progress, and blanking call_id /\r\n          // phone_number on one left the panel showing a live call with no number\r\n          // (and handleEndCall posting an empty call_id). WRAPUP keeps the\r\n          // retention it always had — there the call is over and the fields are\r\n          // held on purpose, for the disposition submit.\r\n          // A stale wrap-up re-fire is in the same boat: its status was just\r\n          // discarded as describing a call that is over, so its call_id and\r\n          // phone_number describe that same finished call. Letting them through\r\n          // would stamp the OLD call's identity onto a live one — the panel would\r\n          // show the current call while End Call targeted the previous.\r\n          const retainCallIdentity =\r\n            !hasStatus ||\r\n            normalizedStatus === CallStatus.WRAPUP ||\r\n            isStaleWrapupRefire;\r\n\r\n          const callData = {\r\n            ...data,\r\n            agent_id: data?.agent_id ?? currentSdkState.callData?.agent_id,\r\n            status: normalizedStatus,\r\n            type: data?.type ?? currentSdkState.callData?.type,\r\n            event_time: data?.event_time ?? currentSdkState.callData?.event_time,\r\n            phone_number: retainCallIdentity\r\n              ? data?.phone_number || currentSdkState.callData?.phone_number\r\n              : data?.phone_number,\r\n            call_id: retainCallIdentity\r\n              ? data?.call_id || currentSdkState.callData?.call_id\r\n              : data?.call_id,\r\n            process_id:\r\n              data?.process_id ?? currentSdkState.callData?.process_id,\r\n            process_name:\r\n              data?.process_name ?? currentSdkState.callData?.process_name,\r\n            hold: data?.hold ?? currentSdkState.callData?.hold,\r\n            mute: data?.mute ?? currentSdkState.callData?.mute,\r\n            disable_hold_mute:\r\n              data?.disable_hold_mute ??\r\n              currentSdkState.callData?.disable_hold_mute,\r\n            mode: data?.mode ?? currentSdkState.callData?.mode,\r\n            queue_name:\r\n              data?.queue_name !== undefined\r\n                ? data.queue_name\r\n                : normalizedStatus === CallStatus.WRAPUP ||\r\n                    [\r\n                      CallStatus.ONCALL,\r\n                      CallStatus.RINGING,\r\n                      CallStatus.DIALING,\r\n                      CallStatus.HOLD,\r\n                    ].includes(normalizedStatus as CallStatus)\r\n                  ? currentSdkState.callData?.queue_name ?? \"\"\r\n                  : \"\",\r\n            auto_wrapup_time:\r\n              data?.auto_wrapup_time ??\r\n              currentSdkState.callData?.auto_wrapup_time ??\r\n              null,\r\n            // Normalize per message so a stale value can't survive a merge into a\r\n            // later message that omits it (e.g. IDLE): the inbound/outbound\r\n            // indicator keys purely on this, so absent must read as null, not\r\n            // the previous call's flag. `retainCallIdentity` is the exception —\r\n            // a frame that reports no status is not the end of anything, so\r\n            // dropping the direction there just made the arrow flicker off\r\n            // mid-call.\r\n            is_outbound_call:\r\n              data?.is_outbound_call ??\r\n              data?.call_details?.is_outbound_call ??\r\n              (retainCallIdentity\r\n                ? currentSdkState.callData?.is_outbound_call\r\n                : null),\r\n            ...(data?.call_details !== undefined\r\n              ? { call_details: data.call_details }\r\n              : retainCallIdentity && currentSdkState.callData?.call_details\r\n                ? { call_details: currentSdkState.callData.call_details }\r\n                : {}),\r\n            ...(data?.break_details !== undefined\r\n              ? { break_details: data.break_details }\r\n              : isBreakFrame\r\n                ? {\r\n                    break_details: frameBreakLabel\r\n                      ? { type: frameBreakLabel, value: frameBreakLabel }\r\n                      : null,\r\n                  }\r\n                : {}),\r\n            ...(data?.call_sage !== undefined && { call_sage: data.call_sage }),\r\n          };\r\n          sdkStateManager.updateCallData(callData);\r\n\r\n          if (isBreakFrame) {\r\n            sdkStateManager.setAgentStatus(frameBreakLabel);\r\n            rememberBreakName(frameBreakLabel);\r\n          } else if (normalizedStatus === CallStatus.WRAPUP) {\r\n            // Keep wrapup active, don't clear agent status\r\n          } else if (\r\n            !isLiveCallBusy &&\r\n            !lastWasMarkAsBreakRef.current &&\r\n            (rawAgentStatus === CallStatus.IDLE ||\r\n              rawAgentStatus === CallStatus.READY ||\r\n              (isStatusTransition &&\r\n                (rawCallStatus === CallStatus.IDLE ||\r\n                  rawCallStatus === CallStatus.READY)))\r\n          ) {\r\n            sdkStateManager.setAgentStatus(\"\");\r\n            if (typeof sessionStorage !== \"undefined\") {\r\n              sessionStorage.removeItem(\"PREVIOUS_AGENT_STATUS\");\r\n            }\r\n          }\r\n\r\n          if (isStatusTransition && (rawAgentStatus === CallStatus.READY || rawAgentStatus === CallStatus.IDLE)) {\r\n            lastWasMarkAsBreakRef.current = false;\r\n          }\r\n          sdkStateManager.updateConferenceData([...confrence]);\r\n          sdkStateManager.setConsultInfo(data.consult_info ?? null);\r\n          if (data?.lead_data !== undefined) {\r\n            sdkStateManager.setTransferLeadData(data.lead_data);\r\n          }\r\n\r\n          const conferenceStatus = data?.conferencestatus;\r\n          if (conferenceStatus) {\r\n            const hasAnsweredSecondaryLine = Object.keys(conferenceStatus).some(\r\n              (key) => {\r\n                const match = key.match(/^line_(\\d+)_status$/);\r\n                if (!match) return false;\r\n                const lineNum = Number(match[1]);\r\n                if (lineNum <= 1) return false;\r\n                const status = String(\r\n                  conferenceStatus[key] ?? \"\",\r\n                ).toUpperCase();\r\n                return status === CallStatus.ONCALL;\r\n              },\r\n            );\r\n\r\n            if (hasAnsweredSecondaryLine) {\r\n              if (!conferenceAutoOpenedRef.current) {\r\n                sdkStateManager.setOpenConferenceDialog(true);\r\n                conferenceAutoOpenedRef.current = true;\r\n              }\r\n            } else {\r\n              conferenceAutoOpenedRef.current = false;\r\n            }\r\n          } else {\r\n            conferenceAutoOpenedRef.current = false;\r\n          }\r\n\r\n          // Per-call consult gating. OR'd with the entitlement baseline rather\r\n          // than overwriting it: the socket payload may only ever TIGHTEN what\r\n          // this agent is allowed to do. The backend sends all-true today (the\r\n          // consulted second agent gets every control locked), so the OR is a\r\n          // no-op in practice — but an overwrite would let a future `false`\r\n          // hand an agent a control their role forbids, which is the one thing\r\n          // a per-call flag must never be able to do.\r\n          if (data?.call_consult_controls) {\r\n            const base = sdkStateManager.getControlsConfig() as unknown as Record<\r\n              string,\r\n              boolean\r\n            >;\r\n            const merged = Object.fromEntries(\r\n              Object.entries(\r\n                data.call_consult_controls as Record<string, unknown>,\r\n              ).map(([key, value]) => [key, !!value || !!base[key]]),\r\n            );\r\n            sdkStateManager.updateSDKConfigFromPermissions(merged);\r\n          } else {\r\n            sdkStateManager.resetConsultControls();\r\n          }\r\n\r\n          if (\r\n            [CallStatus.RINGING, CallStatus.DIALING].includes(\r\n              data.status as CallStatus,\r\n            )\r\n          ) {\r\n            endedWrapupCallIdRef.current = \"\";\r\n            setShowIframe(true);\r\n            setCallWrapuptime(sdkState?.sdkConfig?.auto_wrapup_time ?? null);\r\n            sdkStateManager.updateConferenceData([\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            // Reset conference lines on new incoming/dialing main call\r\n          }\r\n\r\n          // 1. Check if main call is ringing/dialing (excluding manual dialing where agent initiates direct click-to-call)\r\n          const isMainCallRinging =\r\n            [CallStatus.RINGING, CallStatus.DIALING].includes(\r\n              data.status as CallStatus,\r\n            ) && data?.mode !== \"manual\";\r\n\r\n          // 2. Check if any conference line is in ringing/dialing/progress state\r\n          const isConferenceRinging =\r\n            Boolean(\r\n              data?.conferencestatus &&\r\n                Object.keys(data.conferencestatus).some((k) => {\r\n                  if (!k.endsWith(\"_status\")) return false;\r\n                  const lineStatus = String(\r\n                    data.conferencestatus[k] ?? \"\",\r\n                  ).toUpperCase();\r\n                  return (\r\n                    lineStatus === CallStatus.RINGING ||\r\n                    lineStatus === CallStatus.DIALING ||\r\n                    lineStatus === \"RING\" ||\r\n                    lineStatus === \"CALLING\" ||\r\n                    lineStatus === \"PROGRESS\" ||\r\n                    lineStatus === \"ALERTING\"\r\n                  );\r\n                }),\r\n            ) ||\r\n            confrence.some((line: any) => {\r\n              const lineStatus = String(line?.status ?? \"\").toUpperCase();\r\n              return (\r\n                lineStatus === CallStatus.RINGING ||\r\n                lineStatus === CallStatus.DIALING ||\r\n                lineStatus === \"RING\" ||\r\n                lineStatus === \"CALLING\" ||\r\n                lineStatus === \"PROGRESS\" ||\r\n                lineStatus === \"ALERTING\"\r\n              );\r\n            });\r\n\r\n          // 3. Check if transfer/consult is in ringing/dialing/progress state\r\n          const consultStatus = String(\r\n            data?.consult_info?.status ??\r\n              data?.transfer_status ??\r\n              data?.consult_status ??\r\n              \"\",\r\n          ).toUpperCase();\r\n          const isTransferRinging =\r\n            consultStatus === CallStatus.RINGING ||\r\n            consultStatus === CallStatus.DIALING ||\r\n            consultStatus === \"RING\" ||\r\n            consultStatus === \"CALLING\" ||\r\n            consultStatus === \"PROGRESS\" ||\r\n            consultStatus === \"ALERTING\";\r\n\r\n          const shouldPlayRingtone =\r\n            isMainCallRinging || isConferenceRinging || isTransferRinging;\r\n\r\n          const isRingtoneEnabled =\r\n            state?.sdkConfig?.enableRingtone !== false &&\r\n            sdkState?.sdkConfig?.enableRingtone !== false;\r\n\r\n          // enableRingtone=false only turns off OUR tone for calls going out,\r\n          // where the live ring from the network is already heard. A call that\r\n          // has no live ring (inbound, agent-to-agent transfer) is marked by the\r\n          // backend with `enable_ringtone: true` on the RINGING event, and that\r\n          // rings regardless of the setting.\r\n          const eventRingtone = data?.enable_ringtone;\r\n          const isEventRingtone =\r\n            data.status === CallStatus.RINGING &&\r\n            (eventRingtone === true ||\r\n              eventRingtone === 1 ||\r\n              String(eventRingtone).toLowerCase() === \"true\");\r\n\r\n          if (shouldPlayRingtone && (isRingtoneEnabled || isEventRingtone)) {\r\n            if (audioRef.current) {\r\n              audioRef.current.play().catch((error) => {\r\n                console.error(\"Failed to play ringtone:\", error);\r\n              });\r\n            }\r\n          } else {\r\n            if (audioRef.current) {\r\n              audioRef.current.pause();\r\n              audioRef.current.currentTime = 0;\r\n            }\r\n          }\r\n\r\n          if (data.status === CallStatus.IDLE) {\r\n            // USB_LIGHT_REQUEST(USB_LIGHT_ON(\"green\"));\r\n            sdkStateManager.setOpenCallTransferDialog(false);\r\n            sdkStateManager.setOpenConferenceDialog(false);\r\n            sdkStateManager.clearTransferLeadData();\r\n          } else if (data.status === CallStatus.ONCALL) {\r\n            // Start timer for new call OR transfer\r\n            if (data.status === CallStatus.ONCALL) {\r\n              sdkStateManager.startCall();\r\n            }\r\n\r\n            if (!showIframe) {\r\n              setShowIframe(true);\r\n            }\r\n\r\n            if (data?.mute !== 1 && data?.hold !== 1) {\r\n              // USB_LIGHT_REQUEST(USB_LIGHT_ON(\"red\"));\r\n            } else {\r\n              // USB_LIGHT_REQUEST(USB_LIGHT_FLASH(\"red\", 1));\r\n            }\r\n          } else if (data.status === CallStatus.BREAK) {\r\n            const breakTime = sdkState?.sdkConfig?.break_time;\r\n            const eventTime = data?.event_time ?? null;\r\n\r\n            if (eventTime !== lastEventTimeRef.current) {\r\n              hasFlashedRef.current = false;\r\n              lastEventTimeRef.current = eventTime;\r\n            }\r\n\r\n            let isOverLimit = false;\r\n            if (breakTime && eventTime) {\r\n              const differenceInMinutes =\r\n                (new Date().getTime() - new Date(eventTime).getTime()) / 60000;\r\n\r\n              if (Number(differenceInMinutes.toFixed(0)) >= Number(breakTime)) {\r\n                isOverLimit = true;\r\n              }\r\n            }\r\n\r\n            if (isOverLimit) {\r\n              if (!hasFlashedRef.current) {\r\n                // USB_LIGHT_REQUEST(USB_LIGHT_FLASH(\"yellow\", 1));\r\n                hasFlashedRef.current = true;\r\n              }\r\n            } else {\r\n              // USB_LIGHT_REQUEST(USB_LIGHT_ON(\"yellow\"));\r\n            }\r\n          } else if (normalizedStatus === CallStatus.WRAPUP && !isStaleWrapupRefire) {\r\n            // USB_LIGHT_REQUEST(USB_LIGHT_FLASH(\"green\", 1));\r\n            sdkStateManager.endCall();\r\n            sdkStateManager.setOpenCallTransferDialog(false);\r\n            sdkStateManager.setOpenConferenceDialog(false);\r\n            const wrapTime =\r\n              data?.auto_wrapup_time ??\r\n              sdkState?.sdkConfig?.auto_wrapup_time ??\r\n              sdkState?.backendCallControls?.auto_wrapup_time ??\r\n              30;\r\n            setCallWrapuptime(wrapTime);\r\n          }\r\n        } catch {\r\n          console.error(\"📨 Raw message:\", event.data);\r\n        }\r\n      };\r\n\r\n      webSocketRef.current.onclose = (event) => {\r\n        if (pingIntervalRef.current) {\r\n          clearInterval(pingIntervalRef.current);\r\n          pingIntervalRef.current = null;\r\n        }\r\n\r\n        if (\r\n          event.code !== 1000 &&\r\n          reconnectAttemptsRef.current < maxReconnectAttempts\r\n        ) {\r\n          reconnectAttemptsRef.current += 1;\r\n          const delay = Math.min(\r\n            baseReconnectDelay * Math.pow(2, reconnectAttemptsRef.current - 1),\r\n            maxReconnectDelay,\r\n          );\r\n\r\n          console.warn(\r\n            `🔄 Attempting to reconnect WebSocket (attempt ${reconnectAttemptsRef.current}/${maxReconnectAttempts}) in ${delay}ms`,\r\n          );\r\n\r\n          reconnectTimeoutRef.current = setTimeout(() => {\r\n            connectWebSocket();\r\n          }, delay);\r\n        } else if (reconnectAttemptsRef.current >= maxReconnectAttempts) {\r\n          showToast(\r\n            \"WebSocket connection failed. Please refresh the page.\",\r\n            \"error\",\r\n          );\r\n        }\r\n      };\r\n\r\n      webSocketRef.current.onerror = (error) => {\r\n        console.error(\"❌ WebSocket error:\", error);\r\n      };\r\n    } catch (error) {\r\n      if (reconnectAttemptsRef.current < maxReconnectAttempts) {\r\n        reconnectAttemptsRef.current += 1;\r\n        const delay = Math.min(\r\n          baseReconnectDelay * Math.pow(2, reconnectAttemptsRef.current - 1),\r\n          maxReconnectDelay,\r\n        );\r\n        reconnectTimeoutRef.current = setTimeout(() => {\r\n          connectWebSocket();\r\n        }, delay);\r\n      }\r\n    }\r\n  };\r\n\r\n  // Keyed on the access token as well as the agent id. initSDK sets those two in\r\n  // separate store writes (setSDKPermissions → agentId, then initialize() →\r\n  // authorization), and this effect fires on the first of them — so on agentId\r\n  // alone it ran exactly once, while the token was still undefined, and had no\r\n  // reason to ever run again. connectWebSocket() no-ops until both are present,\r\n  // and the token landing re-runs this effect: the cleanup closes the half-built\r\n  // socket with 1000 (which onclose treats as deliberate, so it schedules no\r\n  // reconnect) and the connect is retried with the real credentials.\r\n  useEffect(() => {\r\n    connectWebSocket();\r\n\r\n    return () => {\r\n      if (reconnectTimeoutRef.current) {\r\n        clearTimeout(reconnectTimeoutRef.current);\r\n        reconnectTimeoutRef.current = null;\r\n      }\r\n      if (pingIntervalRef.current) {\r\n        clearInterval(pingIntervalRef.current);\r\n        pingIntervalRef.current = null;\r\n      }\r\n      if (webSocketRef.current) {\r\n        webSocketRef.current.close(1000, \"Component unmounting\");\r\n        webSocketRef.current = null;\r\n      }\r\n      reconnectAttemptsRef.current = 0;\r\n    };\r\n  }, [state.agentId, state.authorization?.accessToken]);\r\n\r\n  const handleSendSMS = (data: any) => {\r\n    sendNotification(END_POINT.SEND_NOTIFICATIONS, {\r\n      phone_number: data?.phone_number ?? \"\",\r\n      type: \"ambulance\",\r\n    });\r\n  };\r\n\r\n  if (!state.isInitialized) {\r\n    return (\r\n      <Box>\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  // Derived flags used in JSX\r\n  const isOnHold =\r\n    state.callData?.hold === 1 &&\r\n    (state.callData?.status?.toUpperCase() as CallStatus) === CallStatus.ONCALL;\r\n\r\n  // ── NEW: derived mute flag ────────────────────────────────────────────────\r\n  const isMuted =\r\n    state.callData?.mute === 1 &&\r\n    (state.callData?.status?.toUpperCase() as CallStatus) === CallStatus.ONCALL;\r\n  // ─────────────────────────────────────────────────────────────────────────\r\n\r\n  // Available — the state the idle counter belongs to.\r\n  const isAgentAvailable =\r\n    !isAgentOnBreak &&\r\n    [CallStatus.READY, CallStatus.IDLE, \"\"].includes(\r\n      String(state.callData?.status || \"IDLE\").toUpperCase() as CallStatus,\r\n    );\r\n\r\n  // Call direction, driven purely by the socket's `is_outbound_call` flag\r\n  // (true => outbound, false => inbound). The WS handler normalizes it to null\r\n  // on any message that omits it, so this stays in sync with the live data:\r\n  // present => show the indicator, absent => show nothing.\r\n  // Campaign name from the socket's lead_details (present only for some calls).\r\n  const campaignName: string | null = (() => {\r\n    const name = (state.callData as any)?.lead_details?.campaignName;\r\n    return typeof name === \"string\" && name.trim() ? name.trim() : null;\r\n  })();\r\n  const callDirection: \"INBOUND\" | \"OUTBOUND\" | null = (() => {\r\n    const flag = (state.callData as any)?.is_outbound_call;\r\n    if (flag === true || flag === 1 || String(flag).toLowerCase() === \"true\")\r\n      return \"OUTBOUND\";\r\n    if (flag === false || flag === 0 || String(flag).toLowerCase() === \"false\")\r\n      return \"INBOUND\";\r\n    const dir = String(\r\n      state.callData?.call_details?.caller_direction ??\r\n        state.callData?.call_details?.call_type ??\r\n        state.callData?.type ??\r\n        \"\",\r\n    ).toUpperCase();\r\n    if (\r\n      dir.includes(\"OUTBOUND\") ||\r\n      dir.includes(\"MANUAL\") ||\r\n      dir.includes(\"AUTO\") ||\r\n      dir.includes(\"CLICK_TO_CALL\")\r\n    )\r\n      return \"OUTBOUND\";\r\n    if (\r\n      dir.includes(\"INBOUND\") ||\r\n      dir.includes(\"QUEUE\") ||\r\n      dir.includes(\"INCOMING\")\r\n    )\r\n      return \"INBOUND\";\r\n    if (\r\n      [\r\n        CallStatus.ONCALL,\r\n        CallStatus.RINGING,\r\n        CallStatus.DIALING,\r\n        CallStatus.WRAPUP,\r\n        CallStatus.HOLD,\r\n      ].includes(state.callData?.status?.toUpperCase() as CallStatus)\r\n    ) {\r\n      return state.callData?.status?.toUpperCase() === CallStatus.DIALING\r\n        ? \"OUTBOUND\"\r\n        : \"INBOUND\";\r\n    }\r\n    return null;\r\n  })();\r\n  // Raw lead details from the socket (campaign dials). Drives the info-icon dialog.\r\n  const leadDetails = (state.callData as any)?.lead_details ?? null;\r\n  const hasLeadDetails = leadHasVisibleContent(leadDetails);\r\n\r\n  const isVertical = state.sdkConfig?.sdkPosition === \"vertical\";\r\n\r\n  return (\r\n    <>\r\n      <Box>\r\n        <Fade in={true} timeout={300}>\r\n          <Paper\r\n            ref={state.sdkConfig?.isDraggable ? dragRef : null}\r\n            elevation={isDragging ? 4 : state.sdkConfig?.isDraggable ? 1 : 0}\r\n            sx={{\r\n              position: state.sdkConfig?.isDraggable ? \"fixed\" : \"relative\",\r\n              left: state.sdkConfig?.isDraggable ? position.x : \"auto\",\r\n              top: state.sdkConfig?.isDraggable ? position.y : \"auto\",\r\n              display: \"inline-block\",\r\n              width: isVertical ? \"180px\" : \"auto\",\r\n              flexShrink: 0,\r\n              whiteSpace: \"nowrap\",\r\n              p: 0.5,\r\n              borderRadius: 3,\r\n              bgcolor: \"background.paper\",\r\n              zIndex: state.sdkConfig?.isDraggable\r\n                ? Number.MAX_SAFE_INTEGER\r\n                : 0,\r\n              transition: theme.transitions.create(\r\n                [\"box-shadow\", \"transform\"],\r\n                {\r\n                  duration: theme.transitions.duration.short,\r\n                },\r\n              ),\r\n              userSelect: \"none\",\r\n            }}>\r\n            <Box\r\n              sx={{\r\n                display: \"flex\",\r\n                flexDirection: isVertical ? \"column\" : \"row\",\r\n                alignItems: isVertical ? \"stretch\" : \"center\",\r\n              }}>\r\n              <Box\r\n                sx={{\r\n                  display: \"flex\",\r\n                  flexDirection: isVertical ? \"column\" : \"row\",\r\n                  alignItems: isVertical ? \"stretch\" : \"center\",\r\n                  gap: 1,\r\n                  margin: isVertical ? \"10px 8px 4px 8px\" : \"0px 10px\",\r\n                }}>\r\n                {state.sdkConfig?.isDraggable && (\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                    <DragIndicator />\r\n                  </IconButton>\r\n                )}\r\n\r\n                {state.sdkConfig?.enableQueueName &&\r\n                  state?.callData?.queue_name &&\r\n                  state?.callData?.mode !== \"manual\" && (\r\n                    <Chip label={state?.callData?.queue_name} />\r\n                  )}\r\n\r\n                {/* Call direction arrow + Phone Number + campaign name */}\r\n                {(callDirection || state.callData?.phone_number) &&\r\n                  [\r\n                    CallStatus.ONCALL,\r\n                    CallStatus.RINGING,\r\n                    CallStatus.DIALING,\r\n                    CallStatus.HOLD,\r\n                    CallStatus.WRAPUP,\r\n                  ].includes(\r\n                    state.callData?.status?.toUpperCase() as CallStatus,\r\n                  ) && (\r\n                    <Box\r\n                      sx={{\r\n                        display: \"inline-flex\",\r\n                        alignItems: \"center\",\r\n                        gap: \"6px\",\r\n                        ml: \"2px\",\r\n                        px: \"10px\",\r\n                        py: \"3px\",\r\n                        borderRadius: \"999px\",\r\n                        border: \"1px solid\",\r\n                        lineHeight: 1,\r\n                        color:\r\n                          callDirection === \"INBOUND\"\r\n                            ? \"success.main\"\r\n                            : \"primary.main\",\r\n                        borderColor: alpha(\r\n                          callDirection === \"INBOUND\"\r\n                            ? theme.palette.success.main\r\n                            : theme.palette.primary.main,\r\n                          0.3,\r\n                        ),\r\n                        animation: \"ctiChipPulse 1.4s ease-in-out infinite\",\r\n                        \"@keyframes ctiChipPulse\": {\r\n                          \"0%, 100%\": {\r\n                            backgroundColor: alpha(\r\n                              callDirection === \"INBOUND\"\r\n                                ? theme.palette.success.main\r\n                                : theme.palette.primary.main,\r\n                              0.08,\r\n                            ),\r\n                          },\r\n                          \"50%\": {\r\n                            backgroundColor: alpha(\r\n                              callDirection === \"INBOUND\"\r\n                                ? theme.palette.success.main\r\n                                : theme.palette.primary.main,\r\n                              0.22,\r\n                            ),\r\n                          },\r\n                        },\r\n                      }}>\r\n                      {callDirection === \"INBOUND\" ? (\r\n                        <CallReceived\r\n                          sx={{ fontSize: 16, color: \"success.main\" }}\r\n                        />\r\n                      ) : (\r\n                        <CallMade\r\n                          sx={{ fontSize: 16, color: \"primary.main\" }}\r\n                        />\r\n                      )}\r\n                      {(state.callData?.phone_number ||\r\n                        (state.callData as any)?.mobileNumber) && (\r\n                        <Typography\r\n                          sx={{\r\n                            fontSize: \"12px\",\r\n                            fontWeight: 700,\r\n                            color: \"text.primary\",\r\n                            letterSpacing: \"0.02em\",\r\n                          }}>\r\n                          {state.callData?.phone_number ||\r\n                            (state.callData as any)?.mobileNumber}\r\n                        </Typography>\r\n                      )}\r\n                      {campaignName && (\r\n                        <Typography\r\n                          title={campaignName}\r\n                          sx={{\r\n                            fontSize: \"10px\",\r\n                            fontWeight: 700,\r\n                            color: \"text.secondary\",\r\n                            maxWidth: 100,\r\n                            overflow: \"hidden\",\r\n                            textOverflow: \"ellipsis\",\r\n                            whiteSpace: \"nowrap\",\r\n                            textTransform: \"uppercase\",\r\n                            letterSpacing: \"0.02em\",\r\n                          }}>\r\n                          ({campaignName})\r\n                        </Typography>\r\n                      )}\r\n                      {hasLeadDetails && (\r\n                        <Tooltip title=\"View lead details\">\r\n                          <IconButton\r\n                            size=\"small\"\r\n                            onClick={(e) => {\r\n                              e.stopPropagation();\r\n                              setLeadDialogOpen(true);\r\n                            }}\r\n                            sx={{ p: 0, ml: \"1px\", color: \"inherit\" }}>\r\n                            <InfoOutlinedIcon sx={{ fontSize: 15 }} />\r\n                          </IconButton>\r\n                        </Tooltip>\r\n                      )}\r\n                    </Box>\r\n                  )}\r\n\r\n                <Tooltip\r\n                  title={\r\n                    state.sdkConfig?.disabledDialButton\r\n                      ? \"Outbound call feature is disabled\"\r\n                      : \"Dial\"\r\n                  }>\r\n                  <Box\r\n                    component=\"span\"\r\n                    sx={isVertical ? { display: \"block\" } : {}}>\r\n                    {isVertical ? (\r\n                      <Button\r\n                        variant=\"outlined\"\r\n                        startIcon={<WifiCalling3 />}\r\n                        onClick={(e) => {\r\n                          if (\r\n                            !clickToCallLoading &&\r\n                            ![\r\n                              CallStatus.BREAK,\r\n                              CallStatus.ONCALL,\r\n                              CallStatus.RINGING,\r\n                            ].includes(\r\n                              state.callData?.status?.toUpperCase() as CallStatus,\r\n                            ) &&\r\n                            !state.sdkConfig?.disabledDialButton &&\r\n                            !(\r\n                              (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.WRAPUP &&\r\n                              state.sdkConfig?.disableAlternateDialing\r\n                            )\r\n                          ) {\r\n                            handleOpenDialer(e);\r\n                          }\r\n                        }}\r\n                        disabled={\r\n                          clickToCallLoading ||\r\n                          [\r\n                            CallStatus.BREAK,\r\n                            CallStatus.ONCALL,\r\n                            CallStatus.RINGING,\r\n                          ].includes(\r\n                            state.callData.status?.toUpperCase() as CallStatus,\r\n                          ) ||\r\n                          state.sdkConfig?.disabledDialButton ||\r\n                          ((state.callData.status?.toUpperCase() as CallStatus) ===\r\n                            CallStatus.WRAPUP &&\r\n                            !!state.sdkConfig?.disableAlternateDialing)\r\n                        }\r\n                        sx={{\r\n                          justifyContent: \"flex-start\",\r\n                          width: \"100%\",\r\n                          px: 2,\r\n                          color:\r\n                            clickToCallLoading ||\r\n                            [\r\n                              CallStatus.BREAK,\r\n                              CallStatus.ONCALL,\r\n                              CallStatus.RINGING,\r\n                            ].includes(\r\n                              state.callData.status?.toUpperCase() as CallStatus,\r\n                            ) ||\r\n                            state.sdkConfig?.disabledDialButton ||\r\n                            ((state.callData.status?.toUpperCase() as CallStatus) ===\r\n                              CallStatus.WRAPUP &&\r\n                              !!state.sdkConfig?.disableAlternateDialing)\r\n                              ? \"action.selected\"\r\n                              : \"success.main\",\r\n                          borderColor:\r\n                            clickToCallLoading ||\r\n                            [\r\n                              CallStatus.BREAK,\r\n                              CallStatus.ONCALL,\r\n                              CallStatus.RINGING,\r\n                            ].includes(\r\n                              state.callData.status?.toUpperCase() as CallStatus,\r\n                            ) ||\r\n                            state.sdkConfig?.disabledDialButton ||\r\n                            ((state.callData.status?.toUpperCase() as CallStatus) ===\r\n                              CallStatus.WRAPUP &&\r\n                              !!state.sdkConfig?.disableAlternateDialing)\r\n                              ? \"action.selected\"\r\n                              : \"success.main\",\r\n                        }}>\r\n                        Dial\r\n                      </Button>\r\n                    ) : (\r\n                      <IconButton\r\n                        size=\"small\"\r\n                        onClick={(e) => {\r\n                          if (\r\n                            !clickToCallLoading &&\r\n                            ![\r\n                              CallStatus.BREAK,\r\n                              CallStatus.ONCALL,\r\n                              CallStatus.RINGING,\r\n                            ].includes(\r\n                              state.callData?.status?.toUpperCase() as CallStatus,\r\n                            ) &&\r\n                            !state.sdkConfig?.disabledDialButton &&\r\n                            !(\r\n                              (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.WRAPUP &&\r\n                              state.sdkConfig?.disableAlternateDialing\r\n                            )\r\n                          ) {\r\n                            handleOpenDialer(e);\r\n                          }\r\n                        }}\r\n                        disabled={\r\n                          clickToCallLoading ||\r\n                          [\r\n                            CallStatus.BREAK,\r\n                            CallStatus.ONCALL,\r\n                            CallStatus.RINGING,\r\n                          ].includes(\r\n                            state.callData.status?.toUpperCase() as CallStatus,\r\n                          ) ||\r\n                          state.sdkConfig?.disabledDialButton ||\r\n                          ((state.callData.status?.toUpperCase() as CallStatus) ===\r\n                            CallStatus.WRAPUP &&\r\n                            !!state.sdkConfig?.disableAlternateDialing)\r\n                        }>\r\n                        <WifiCalling3\r\n                          sx={{\r\n                            color:\r\n                              clickToCallLoading ||\r\n                              [\r\n                                CallStatus.BREAK,\r\n                                CallStatus.ONCALL,\r\n                                CallStatus.RINGING,\r\n                              ].includes(\r\n                                state.callData.status?.toUpperCase() as CallStatus,\r\n                              ) ||\r\n                              state.sdkConfig?.disabledDialButton ||\r\n                              ((state.callData.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.WRAPUP &&\r\n                                !!state.sdkConfig?.disableAlternateDialing)\r\n                                ? \"action.selected\"\r\n                                : \"success.main\",\r\n                          }}\r\n                        />\r\n                      </IconButton>\r\n                    )}\r\n                  </Box>\r\n                </Tooltip>\r\n                {/* ── UPDATED: call duration + hold duration + mute duration display ── */}\r\n                {(() => {\r\n                  const specificBreakType =\r\n                    state.callData?.break_details?.value ||\r\n                    state.callData?.break_details?.type ||\r\n                    state.agentStatus ||\r\n                    (typeof sessionStorage !== \"undefined\"\r\n                      ? sessionStorage.getItem(\"PREVIOUS_AGENT_STATUS\")\r\n                      : \"\") ||\r\n                    \"\";\r\n                  // Hoisted next to the break timer effect, so the chip below and\r\n                  // that clock can never disagree about whether this is a break.\r\n                  const isBreak = isAgentOnBreak;\r\n                  const isBreakDetailsVisible = (() => {\r\n                    const raw =\r\n                      state.sdkConfig?.breakDetailsVisible ??\r\n                      state.backendCallControls?.breakDetailsVisible ??\r\n                      state.authorization?.callControls?.breakDetailsVisible ??\r\n                      (state.sdkConfig as any)?.break_details_visible ??\r\n                      (state.backendCallControls as any)?.break_details_visible ??\r\n                      (state.authorization?.callControls as any)?.break_details_visible;\r\n                    if (raw === undefined || raw === null) return true;\r\n                    if (typeof raw === \"boolean\") return raw;\r\n                    if (typeof raw === \"string\") return raw.toLowerCase() !== \"false\" && raw !== \"0\";\r\n                    if (typeof raw === \"number\") return raw !== 0;\r\n                    return Boolean(raw);\r\n                  })();\r\n\r\n                  const hasSpecificBreakType =\r\n                    isBreakDetailsVisible &&\r\n                    isBreak &&\r\n                    Boolean(specificBreakType) &&\r\n                    specificBreakType.toUpperCase() !== \"BREAK\" &&\r\n                    specificBreakType.toUpperCase() !== \"IDLE\";\r\n\r\n                  const isWrapup =\r\n                    String(state.callData?.status || \"\").toUpperCase() === CallStatus.WRAPUP &&\r\n                    callWrapuptime !== null;\r\n\r\n                  const isOnCall =\r\n                    [\r\n                      CallStatus.ONCALL,\r\n                      CallStatus.RINGING,\r\n                      CallStatus.DIALING,\r\n                      CallStatus.HOLD,\r\n                    ].includes(state.callData?.status?.toUpperCase() as CallStatus) ||\r\n                    isOnHold ||\r\n                    isMuted;\r\n\r\n                  // Break clock — gated on `break_time_countdown:access`. Excludes\r\n                  // wrap-up and the live-call states so a stale\r\n                  // PREVIOUS_AGENT_STATUS can never put a break clock over a call:\r\n                  // those states own the slot and have their own duration to show.\r\n                  const showBreakTimer =\r\n                    canViewBreakCountdown && isBreak && !isWrapup && !isOnCall;\r\n\r\n                  const showTimer =\r\n                    hasSpecificBreakType ||\r\n                    isWrapup ||\r\n                    isOnCall ||\r\n                    showBreakTimer ||\r\n                    (isAgentAvailable && canViewIdleCountdown);\r\n\r\n                  if (!showTimer) return null;\r\n\r\n                  return (\r\n                    <Box\r\n                      onClick={() => setShowIframe(true)}\r\n                      sx={{\r\n                        display: \"flex\",\r\n                        flexDirection: \"column\",\r\n                        alignItems: \"center\",\r\n                        cursor: \"pointer\",\r\n                        minWidth: \"52px\",\r\n                        marginRight: \"10px\",\r\n                        ...(isWrapup && !isOnHold && !isMuted\r\n                          ? {\r\n                              px: \"8px\",\r\n                              py: \"2px\",\r\n                              borderRadius: \"10px\",\r\n                              border: \"1.5px solid #dc2626\",\r\n                              transition: \"all 0.3s ease\",\r\n                              animation: \"wrapupPillGlow 1.4s ease-in-out infinite\",\r\n                              \"@keyframes wrapupPillGlow\": {\r\n                                \"0%, 100%\": {\r\n                                  boxShadow: \"0 0 0 0 rgba(220, 38, 38, 0.45), 0 2px 10px rgba(220, 38, 38, 0.22)\",\r\n                                  borderColor: \"#dc2626\",\r\n                                  backgroundColor: \"#fef2f2\",\r\n                                },\r\n                                \"50%\": {\r\n                                  boxShadow: \"0 0 0 7px rgba(220, 38, 38, 0), 0 3px 16px rgba(220, 38, 38, 0.35)\",\r\n                                  borderColor: \"#ef4444\",\r\n                                  backgroundColor: \"#fee2e2\",\r\n                                },\r\n                              },\r\n                            }\r\n                          : {}),\r\n                      }}>\r\n                      {hasSpecificBreakType ? (\r\n                        <>\r\n                          <Tooltip title={specificBreakType}>\r\n                            <Box\r\n                              sx={{\r\n                                border: \"1.5px solid\",\r\n                                borderColor: \"success.main\",\r\n                                borderRadius: \"50px\",\r\n                                px: \"8px\",\r\n                                py: \"3px\",\r\n                                maxWidth: \"80px\",\r\n                                minWidth: \"80px\",\r\n                                overflow: \"hidden\",\r\n                                textAlign: \"center\",\r\n                              }}>\r\n                              <Typography\r\n                                sx={{\r\n                                  color: \"success.main\",\r\n                                  fontSize: \"10px\",\r\n                                  fontWeight: \"700\",\r\n                                  lineHeight: 1.2,\r\n                                  overflow: \"hidden\",\r\n                                  textOverflow: \"ellipsis\",\r\n                                  whiteSpace: \"nowrap\",\r\n                                  textTransform: \"uppercase\",\r\n                                }}>\r\n                                {specificBreakType}\r\n                              </Typography>\r\n                            </Box>\r\n                          </Tooltip>\r\n                          {/* The chip names the break; this says how long it has\r\n                              been running. Smaller than the standalone clock in\r\n                              the branch below because it sits UNDER the chip here\r\n                              rather than alone in the slot. */}\r\n                          {showBreakTimer && (\r\n                            <Typography\r\n                              sx={{\r\n                                color: \"success.main\",\r\n                                fontSize: \"13px\",\r\n                                fontWeight: \"700\",\r\n                                lineHeight: 1.2,\r\n                                fontVariantNumeric: \"tabular-nums\",\r\n                                letterSpacing: \"0.5px\",\r\n                                mt: \"2px\",\r\n                              }}>\r\n                              {formatDuration(breakDuration)}\r\n                            </Typography>\r\n                          )}\r\n                        </>\r\n                      ) : (\r\n                        <Box\r\n                          sx={{\r\n                            display: \"flex\",\r\n                            alignItems: \"center\",\r\n                            gap: \"4px\",\r\n                          }}>\r\n                          {isWrapup && (\r\n                            <Box\r\n                              sx={{\r\n                                width: \"6px\",\r\n                                height: \"6px\",\r\n                                borderRadius: \"50%\",\r\n                                backgroundColor: \"#dc2626\",\r\n                                animation: \"wrapupDotPulse 1.2s ease-in-out infinite\",\r\n                                \"@keyframes wrapupDotPulse\": {\r\n                                  \"0%, 100%\": {\r\n                                    opacity: 1,\r\n                                    transform: \"scale(1.25)\",\r\n                                    boxShadow: \"0 0 6px rgba(220, 38, 38, 0.8)\",\r\n                                  },\r\n                                  \"50%\": {\r\n                                    opacity: 0.25,\r\n                                    transform: \"scale(0.7)\",\r\n                                    boxShadow: \"0 0 1px rgba(220, 38, 38, 0.2)\",\r\n                                  },\r\n                                },\r\n                              }}\r\n                            />\r\n                          )}\r\n                          <Typography\r\n                            sx={{\r\n                              color: isWrapup\r\n                                ? \"#dc2626\"\r\n                                : isOnHold\r\n                                  ? \"warning.main\"\r\n                                  : isMuted\r\n                                    ? \"error.main\"\r\n                                    : \"success.main\",\r\n                              fontSize: \"18px\",\r\n                              fontWeight: \"700\",\r\n                              lineHeight: 1.2,\r\n                              fontVariantNumeric: \"tabular-nums\",\r\n                              letterSpacing: \"0.5px\",\r\n                              ...(isWrapup\r\n                                ? {\r\n                                    animation: \"wrapupTextPulse 1.4s ease-in-out infinite\",\r\n                                    \"@keyframes wrapupTextPulse\": {\r\n                                      \"0%, 100%\": {\r\n                                        color: \"#dc2626\",\r\n                                        textShadow: \"0 0 10px rgba(220, 38, 38, 0.45)\",\r\n                                        transform: \"scale(1)\",\r\n                                      },\r\n                                      \"50%\": {\r\n                                        color: \"#b91c1c\",\r\n                                        textShadow: \"0 0 2px rgba(220, 38, 38, 0.1)\",\r\n                                        transform: \"scale(0.97)\",\r\n                                      },\r\n                                    },\r\n                                  }\r\n                                : {}),\r\n                            }}>\r\n                            {isWrapup\r\n                              ? formatDuration(callWrapuptime!)\r\n                              : showBreakTimer\r\n                                ? formatDuration(breakDuration)\r\n                                : isAgentAvailable && canViewIdleCountdown\r\n                                  ? formatDuration(idleDuration)\r\n                                  : formatDuration(callDuration)}\r\n                          </Typography>\r\n                        </Box>\r\n                      )}\r\n\r\n                      {/* Hold badge — only visible while call is on hold */}\r\n                      {isOnHold && (\r\n                        <Box\r\n                          sx={{\r\n                            display: \"flex\",\r\n                            alignItems: \"center\",\r\n                            gap: \"3px\",\r\n                            backgroundColor: \"warning.main\",\r\n                            color: \"#fff\",\r\n                            borderRadius: \"6px\",\r\n                            px: \"5px\",\r\n                            py: \"1px\",\r\n                            mt: \"2px\",\r\n                          }}>\r\n                          <Pause sx={{ fontSize: \"11px\" }} />\r\n                          <Typography\r\n                            sx={{\r\n                              fontSize: \"11px\",\r\n                              fontWeight: 700,\r\n                              lineHeight: 1,\r\n                            }}>\r\n                            {formatDuration(holdDuration)}\r\n                          </Typography>\r\n                        </Box>\r\n                      )}\r\n\r\n                      {/* ── NEW: Mute badge — only visible while call is muted ── */}\r\n                      {isMuted && !isOnHold && (\r\n                        <Box\r\n                          sx={{\r\n                            display: \"flex\",\r\n                            alignItems: \"center\",\r\n                            gap: \"3px\",\r\n                            backgroundColor: \"error.main\",\r\n                            color: \"#fff\",\r\n                            borderRadius: \"6px\",\r\n                            px: \"5px\",\r\n                            py: \"1px\",\r\n                            mt: \"2px\",\r\n                          }}>\r\n                          <MicOff sx={{ fontSize: \"11px\" }} />\r\n                          <Typography\r\n                            sx={{\r\n                              fontSize: \"11px\",\r\n                              fontWeight: 700,\r\n                              lineHeight: 1,\r\n                            }}>\r\n                            {formatDuration(muteDuration)}\r\n                          </Typography>\r\n                        </Box>\r\n                      )}\r\n                    </Box>\r\n                  );\r\n                })()}\r\n                {/* ─────────────────────────────────────────────────── */}\r\n\r\n                <Chip\r\n                  sx={{ padding: \"18px 0px\" }}\r\n                  label={\r\n                    isLoading || agentReadyLoading ? (\r\n                      <Box\r\n                        sx={{\r\n                          fontWeight: \"bold\",\r\n                          width: \"60px\",\r\n                          display: \"flex\",\r\n                          alignItems: \"center\",\r\n                          justifyContent: \"center\",\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: \"60px\",\r\n                          textAlign: \"center\",\r\n                        }}>\r\n                        {(() => {\r\n                          if (isAgentOnBreak) {\r\n                            return \"BREAK\";\r\n                          }\r\n                          return state.callData?.status\r\n                            ? state.callData.status.toUpperCase()\r\n                            : \"IDLE\";\r\n                        })()}\r\n                      </Typography>\r\n                    )\r\n                  }\r\n                  onClick={canBreak ? handleOpenAgentStatus : undefined}\r\n                  deleteIcon={canBreak ? <KeyboardArrowDown color=\"primary\" /> : undefined}\r\n                  onDelete={canBreak ? handleOpenAgentStatus : undefined}\r\n                />\r\n              </Box>\r\n\r\n              <Box\r\n                sx={{\r\n                  display: \"flex\",\r\n                  flexDirection: isVertical ? \"column\" : \"row\",\r\n                  gap: 1,\r\n                  justifyContent: \"center\",\r\n                  alignItems: isVertical ? \"stretch\" : \"center\",\r\n                  margin: isVertical ? \"0px 8px 8px 8px\" : \"0px\",\r\n                }}>\r\n                <Tooltip title={\"Agent Ready\"}>\r\n                  <Button\r\n                    variant={\r\n                      isAgentOnBreak ||\r\n                      [CallStatus.BREAK, CallStatus.MISSED].includes(\r\n                        state.callData?.status?.toUpperCase() as CallStatus,\r\n                      )\r\n                        ? \"outlined\"\r\n                        : \"contained\"\r\n                    }\r\n                    startIcon={isVertical ? <SupportAgent /> : undefined}\r\n                    onClick={(e) => {\r\n                      if (\r\n                        isAgentOnBreak ||\r\n                        [CallStatus.BREAK, CallStatus.MISSED].includes(\r\n                          state.callData?.status?.toUpperCase() as CallStatus,\r\n                        )\r\n                      ) {\r\n                        e.stopPropagation();\r\n                        handleAgentReady();\r\n                      }\r\n                    }}\r\n                    classes={{\r\n                      root:\r\n                        isAgentOnBreak ||\r\n                        [CallStatus.BREAK, CallStatus.MISSED].includes(\r\n                          state.callData?.status?.toUpperCase() as CallStatus,\r\n                        )\r\n                          ? \"outlined\"\r\n                          : \"enabled\",\r\n                    }}\r\n                    sx={{\r\n                      ...(isAgentOnBreak ||\r\n                      [CallStatus.BREAK, CallStatus.MISSED].includes(\r\n                        state.callData?.status?.toUpperCase() as CallStatus,\r\n                      )\r\n                        ? outlined\r\n                        : enabled),\r\n                      ...(isVertical && {\r\n                        justifyContent: \"flex-start\",\r\n                        width: \"100%\",\r\n                        px: 2,\r\n                      }),\r\n                    }}\r\n                    disabled={agentReadyLoading}>\r\n                    {isVertical ? \"Agent Ready\" : <SupportAgent />}\r\n                  </Button>\r\n                </Tooltip>\r\n\r\n                <Tooltip\r\n                  title={\r\n                    holdFeatureDisabled\r\n                      ? \"Hold feature is disabled\"\r\n                      : state.callData?.hold === 1\r\n                        ? \"Resume\"\r\n                        : \"Hold\"\r\n                  }>\r\n                  <Box\r\n                    component=\"span\"\r\n                    sx={isVertical ? { display: \"block\" } : {}}>\r\n                    <Button\r\n                      variant={\r\n                        state.callData?.hold === 1 &&\r\n                        (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                          CallStatus.ONCALL\r\n                          ? \"contained\"\r\n                          : \"outlined\"\r\n                      }\r\n                      startIcon={\r\n                        isVertical ? (\r\n                          holdOrUnHoldLoading ? undefined : state.callData\r\n                              ?.hold === 1 ? (\r\n                            <PlayArrow />\r\n                          ) : (\r\n                            <Pause />\r\n                          )\r\n                        ) : undefined\r\n                      }\r\n                      onClick={(e) => {\r\n                        e.stopPropagation();\r\n                        if (!holdFeatureDisabled) {\r\n                          handleHoldToggle();\r\n                        }\r\n                      }}\r\n                      sx={\r\n                        state.callData?.hold === 1 &&\r\n                        (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                          CallStatus.ONCALL\r\n                          ? {\r\n                              ...enabled,\r\n                              ...(isVertical && {\r\n                                justifyContent: \"flex-start\",\r\n                                width: \"100%\",\r\n                                px: 2,\r\n                              }),\r\n                            }\r\n                          : (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.ONCALL && !holdFeatureDisabled\r\n                            ? {\r\n                                ...outlined,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                            : {\r\n                                ...disabled,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                      }\r\n                      disabled={\r\n                        ((state.callData?.status?.toUpperCase() as CallStatus) !==\r\n                          CallStatus.ONCALL &&\r\n                          state.callData?.hold !== 1) ||\r\n                        holdOrUnHoldLoading ||\r\n                        holdFeatureDisabled\r\n                      }>\r\n                      {holdOrUnHoldLoading ? (\r\n                        <CircularProgress\r\n                          size=\"20px\"\r\n                          sx={{ color: theme.palette.primary.main }}\r\n                        />\r\n                      ) : isVertical ? (\r\n                        state.callData?.hold === 1 ? (\r\n                          \"Resume\"\r\n                        ) : (\r\n                          \"Hold\"\r\n                        )\r\n                      ) : state.callData?.hold === 1 ? (\r\n                        <PlayArrow />\r\n                      ) : (\r\n                        <Pause />\r\n                      )}\r\n                    </Button>\r\n                  </Box>\r\n                </Tooltip>\r\n\r\n                <Tooltip\r\n                  title={\r\n                    muteFeatureDisabled\r\n                      ? \"Mute feature is disabled\"\r\n                      : state.callData?.mute === 1\r\n                        ? \"Unmute\"\r\n                        : \"Mute\"\r\n                  }>\r\n                  <Box\r\n                    component=\"span\"\r\n                    sx={isVertical ? { display: \"block\" } : {}}>\r\n                    <Button\r\n                      variant={\r\n                        state.callData?.mute === 1 &&\r\n                        (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                          CallStatus.ONCALL\r\n                          ? \"contained\"\r\n                          : \"outlined\"\r\n                      }\r\n                      startIcon={\r\n                        isVertical ? (\r\n                          muteOrUnMuteLoading ? undefined : state.callData\r\n                              ?.mute === 1 ? (\r\n                            <MicOff />\r\n                          ) : (\r\n                            <Mic />\r\n                          )\r\n                        ) : undefined\r\n                      }\r\n                      onClick={(e) => {\r\n                        e.stopPropagation();\r\n                        if (!muteFeatureDisabled) {\r\n                          handleMuteToggle();\r\n                        }\r\n                      }}\r\n                      sx={\r\n                        muteFeatureDisabled || state.callData?.hold === 1\r\n                          ? {\r\n                              ...disabled,\r\n                              ...(isVertical && {\r\n                                justifyContent: \"flex-start\",\r\n                                width: \"100%\",\r\n                                px: 2,\r\n                              }),\r\n                            }\r\n                          : state.callData?.mute === 1 &&\r\n                              (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.ONCALL\r\n                            ? {\r\n                                ...enabled,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                            : (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.ONCALL\r\n                              ? {\r\n                                  ...outlined,\r\n                                  ...(isVertical && {\r\n                                    justifyContent: \"flex-start\",\r\n                                    width: \"100%\",\r\n                                    px: 2,\r\n                                  }),\r\n                                }\r\n                              : {\r\n                                  ...disabled,\r\n                                  ...(isVertical && {\r\n                                    justifyContent: \"flex-start\",\r\n                                    width: \"100%\",\r\n                                    px: 2,\r\n                                  }),\r\n                                }\r\n                      }\r\n                      disabled={\r\n                        ((state.callData?.status?.toUpperCase() as CallStatus) !==\r\n                          CallStatus.ONCALL &&\r\n                          state.callData?.mute !== 1) ||\r\n                        muteOrUnMuteLoading ||\r\n                        state.callData?.hold === 1 ||\r\n                        muteFeatureDisabled\r\n                      }>\r\n                      {muteOrUnMuteLoading ? (\r\n                        <CircularProgress\r\n                          size=\"20px\"\r\n                          sx={{ color: theme.palette.primary.main }}\r\n                        />\r\n                      ) : isVertical ? (\r\n                        state.callData?.mute === 1 ? (\r\n                          \"Unmute\"\r\n                        ) : (\r\n                          \"Mute\"\r\n                        )\r\n                      ) : state.callData?.mute === 1 ? (\r\n                        <MicOff />\r\n                      ) : (\r\n                        <Mic />\r\n                      )}\r\n                    </Button>\r\n                  </Box>\r\n                </Tooltip>\r\n\r\n                <Tooltip\r\n                  title={\r\n                    state.sdkConfig?.disableCallTransferButton\r\n                      ? \"Transfer Call feature is disabled\"\r\n                      : \"Transfer Call\"\r\n                  }>\r\n                  <Box\r\n                    component=\"span\"\r\n                    sx={isVertical ? { display: \"block\" } : {}}>\r\n                    <Button\r\n                      variant={\r\n                        state.openCallTransferDialog ? \"contained\" : \"outlined\"\r\n                      }\r\n                      startIcon={\r\n                        isVertical ? <TransferWithinAStation /> : undefined\r\n                      }\r\n                      onClick={(e) => {\r\n                        if (\r\n                          (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                            CallStatus.ONCALL &&\r\n                          !state.sdkConfig?.disableCallTransferButton\r\n                        ) {\r\n                          e.stopPropagation();\r\n                          sdkStateManager.setOpenCallTransferDialog(true);\r\n                        }\r\n                      }}\r\n                      sx={\r\n                        state.openCallTransferDialog\r\n                          ? {\r\n                              ...enabled,\r\n                              ...(isVertical && {\r\n                                justifyContent: \"flex-start\",\r\n                                width: \"100%\",\r\n                                px: 2,\r\n                              }),\r\n                            }\r\n                          : (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.ONCALL &&\r\n                              !state.sdkConfig?.disableCallTransferButton\r\n                            ? {\r\n                                ...outlined,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                            : {\r\n                                ...disabled,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                      }\r\n                      disabled={\r\n                        (state.callData?.status?.toUpperCase() as CallStatus) !==\r\n                          CallStatus.ONCALL ||\r\n                        state.sdkConfig?.disableCallTransferButton\r\n                      }>\r\n                      {isVertical ? \"Transfer\" : <TransferWithinAStation />}\r\n                    </Button>\r\n                  </Box>\r\n                </Tooltip>\r\n\r\n                <Tooltip\r\n                  title={\r\n                    state.sdkConfig?.disableConferenceButton\r\n                      ? \"Conference Call feature is disabled\"\r\n                      : \"Conference Call\"\r\n                  }>\r\n                  <Box\r\n                    component=\"span\"\r\n                    sx={isVertical ? { display: \"block\" } : {}}>\r\n                    <Button\r\n                      variant={\r\n                        state.openConferenceDialog ? \"contained\" : \"outlined\"\r\n                      }\r\n                      startIcon={isVertical ? <Group /> : undefined}\r\n                      onClick={(e) => {\r\n                        if (\r\n                          (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                            CallStatus.ONCALL &&\r\n                          !state.sdkConfig?.disableConferenceButton\r\n                        ) {\r\n                          e.stopPropagation();\r\n                          sdkStateManager.setOpenConferenceDialog(true);\r\n                        }\r\n                      }}\r\n                      sx={\r\n                        state.openConferenceDialog\r\n                          ? {\r\n                              ...enabled,\r\n                              ...(isVertical && {\r\n                                justifyContent: \"flex-start\",\r\n                                width: \"100%\",\r\n                                px: 2,\r\n                              }),\r\n                            }\r\n                          : (state.callData?.status?.toUpperCase() as CallStatus) ===\r\n                                CallStatus.ONCALL &&\r\n                              !state.sdkConfig?.disableConferenceButton\r\n                            ? {\r\n                                ...outlined,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                            : {\r\n                                ...disabled,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                      }\r\n                      disabled={\r\n                        (state.callData?.status?.toUpperCase() as CallStatus) !==\r\n                          CallStatus.ONCALL ||\r\n                        state.sdkConfig?.disableConferenceButton\r\n                      }>\r\n                      {isVertical ? \"Conference\" : <Group />}\r\n                    </Button>\r\n                  </Box>\r\n                </Tooltip>\r\n\r\n                {state.sdkConfig?.enableSmsServices && (\r\n                  <Tooltip title={\"Send SMS\"}>\r\n                    <Button\r\n                      variant={\r\n                        Boolean(ambulanceAnchorEl) ? \"contained\" : \"outlined\"\r\n                      }\r\n                      startIcon={isVertical ? <SmsSharp /> : undefined}\r\n                      onClick={(e) => {\r\n                        if (\r\n                          [CallStatus.ONCALL, CallStatus.WRAPUP].includes(\r\n                            state.callData?.status?.toUpperCase() as CallStatus,\r\n                          )\r\n                        ) {\r\n                          e.stopPropagation();\r\n                          handleOpenAbulanceServices(e);\r\n                        }\r\n                      }}\r\n                      sx={\r\n                        Boolean(ambulanceAnchorEl)\r\n                          ? {\r\n                              ...enabled,\r\n                              ...(isVertical && {\r\n                                justifyContent: \"flex-start\",\r\n                                width: \"100%\",\r\n                                px: 2,\r\n                              }),\r\n                            }\r\n                          : [CallStatus.ONCALL, CallStatus.WRAPUP].includes(\r\n                                state.callData?.status?.toUpperCase() as CallStatus,\r\n                              )\r\n                            ? {\r\n                                ...outlined,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                            : {\r\n                                ...disabled,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                      }\r\n                      disabled={\r\n                        ![CallStatus.ONCALL, CallStatus.WRAPUP].includes(\r\n                          state.callData?.status?.toUpperCase() as CallStatus,\r\n                        )\r\n                      }>\r\n                      {isVertical ? \"Send SMS\" : <SmsSharp />}\r\n                    </Button>\r\n                  </Tooltip>\r\n                )}\r\n\r\n                <Tooltip\r\n                  title={\r\n                    state.sdkConfig?.disableEndCallButton\r\n                      ? \"End Call feature is disabled\"\r\n                      : \"End Call\"\r\n                  }>\r\n                  <Box\r\n                    component=\"span\"\r\n                    sx={isVertical ? { display: \"block\" } : {}}>\r\n                    <Button\r\n                      variant={\r\n                        [\r\n                          CallStatus.ONCALL,\r\n                          CallStatus.RINGING,\r\n                          CallStatus.DIALING,\r\n                          CallStatus.WRAPUP,\r\n                        ].includes(\r\n                          state.callData?.status?.toUpperCase() as CallStatus,\r\n                        ) && !state.sdkConfig?.disableEndCallButton\r\n                          ? \"contained\"\r\n                          : \"outlined\"\r\n                      }\r\n                      startIcon={\r\n                        isVertical && !endCallLoading ? <CallEnd /> : undefined\r\n                      }\r\n                      onClick={(e) => {\r\n                        if (\r\n                          [\r\n                            CallStatus.ONCALL,\r\n                            CallStatus.RINGING,\r\n                            CallStatus.DIALING,\r\n                            CallStatus.WRAPUP,\r\n                          ].includes(\r\n                            state.callData?.status?.toUpperCase() as CallStatus,\r\n                          ) &&\r\n                          !state.sdkConfig?.disableEndCallButton\r\n                        ) {\r\n                          e.stopPropagation();\r\n// The dialog always opens with the full disposition form.\r\n// disposition:disabled gates the iframe dialer only and is NOT\r\n// enforced here, so breakOnly stays false for every SDK host\r\n// (see getControlsConfig in hooks/sdk-state.ts).\r\nsetOpenCallDisposition(true);\r\n                        }\r\n                      }}\r\n                      sx={\r\n                        [\r\n                          CallStatus.ONCALL,\r\n                          CallStatus.RINGING,\r\n                          CallStatus.DIALING,\r\n                          CallStatus.WRAPUP,\r\n                        ].includes(\r\n                          state.callData?.status?.toUpperCase() as CallStatus,\r\n                        ) && !state.sdkConfig?.disableEndCallButton\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                              ...(isVertical && {\r\n                                justifyContent: \"flex-start\",\r\n                                width: \"100%\",\r\n                                px: 2,\r\n                              }),\r\n                            }\r\n                          : {\r\n                              ...disabled,\r\n                              minWidth: \"60px !important\",\r\n                              ...(isVertical && {\r\n                                justifyContent: \"flex-start\",\r\n                                width: \"100%\",\r\n                                px: 2,\r\n                              }),\r\n                            }\r\n                      }\r\n                      disabled={\r\n                        ![\r\n                          CallStatus.ONCALL,\r\n                          CallStatus.RINGING,\r\n                          CallStatus.DIALING,\r\n                          CallStatus.WRAPUP,\r\n                        ].includes(\r\n                          state.callData?.status?.toUpperCase() as CallStatus,\r\n                        ) ||\r\n                        endCallLoading ||\r\n                        state.sdkConfig?.disableEndCallButton\r\n                      }>\r\n                      {endCallLoading ? (\r\n                        <CircularProgress size=\"20px\" color=\"error\" />\r\n                      ) : isVertical ? (\r\n                        \"End Call\"\r\n                      ) : (\r\n                        <CallEnd />\r\n                      )}\r\n                    </Button>\r\n                  </Box>\r\n                </Tooltip>\r\n\r\n                {!state.sdkConfig?.disabledMoreOptionsButton &&\r\n                  processList &&\r\n                  processList?.length > 1 && (\r\n                    <Tooltip title={\"Switch Process\"}>\r\n                      <Button\r\n                        variant={\r\n                          Boolean(moreOptionsAnchorEl)\r\n                            ? \"contained\"\r\n                            : \"outlined\"\r\n                        }\r\n                        startIcon={isVertical ? <MoreVert /> : undefined}\r\n                        onClick={(e) => {\r\n                          if (\r\n                            [CallStatus.BREAK, CallStatus.IDLE].includes(\r\n                              state.callData?.status?.toUpperCase() as CallStatus,\r\n                            )\r\n                          ) {\r\n                            e.stopPropagation();\r\n                            handleOpenMoreOptions(e);\r\n                          }\r\n                        }}\r\n                        sx={\r\n                          Boolean(moreOptionsAnchorEl)\r\n                            ? {\r\n                                ...enabled,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                            : {\r\n                                ...outlined,\r\n                                ...(isVertical && {\r\n                                  justifyContent: \"flex-start\",\r\n                                  width: \"100%\",\r\n                                  px: 2,\r\n                                }),\r\n                              }\r\n                        }\r\n                        disabled={\r\n                          ![CallStatus.BREAK, CallStatus.IDLE].includes(\r\n                            state.callData?.status?.toUpperCase() as CallStatus,\r\n                          )\r\n                        }>\r\n                        {isVertical ? \"Switch Process\" : <MoreVert />}\r\n                      </Button>\r\n                    </Tooltip>\r\n                  )}\r\n              </Box>\r\n            </Box>\r\n          </Paper>\r\n        </Fade>\r\n      </Box>\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: \"absolute\",\r\n            left: iframePosition.x,\r\n            top: iframePosition.y,\r\n            borderRadius: 2,\r\n            bgcolor: \"background.paper\",\r\n            zIndex: Number.MAX_SAFE_INTEGER,\r\n            transition: theme.transitions.create([\"box-shadow\", \"transform\"], {\r\n              duration: theme.transitions.duration.short,\r\n            }),\r\n            visibility:\r\n              showIframe && !state.sdkConfig?.disableSoftPhone\r\n                ? \"visible\"\r\n                : \"hidden\",\r\n            userSelect: \"none\",\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              padding: \"0px 10px\",\r\n            }}\r\n            onMouseDown={iframeHandleMouseDown}\r\n            onTouchStart={iframeHandleTouchStart}>\r\n            <DragIndicator\r\n              sx={{\r\n                transform: \"rotate(90deg)\",\r\n                color: \"#7b7b7b\",\r\n              }}\r\n            />{\" \"}\r\n            <Typography\r\n              variant=\"subtitle1\"\r\n              fontWeight={600}\r\n              sx={{ textAlign: \"center\" }}>\r\n              ahs-cti\r\n            </Typography>\r\n            <IconButton onClick={() => setShowIframe(false)}>\r\n              <Close />\r\n            </IconButton>\r\n          </Box>\r\n          <Box>\r\n            <iframe\r\n              // Previous token-based embed (kept for reference):\r\n              src={`${state.urlConfig?.iframeURL}/static/phone/index.html?user_id=${state.urlConfig?.id}&api_url=${state.urlConfig?.iframeAPIURL}&token=${state.authorization?.accessToken}`}\r\n              // New minimal URL: the phone logs itself in with userId + password and\r\n              // provisions the token / SIP extension itself. api_url + ws_url come from\r\n              // the SDK's env config (urlConfig) so it targets the configured backend\r\n              // rather than the phone's baked-in defaults.\r\n              // src={`${state.urlConfig?.iframeURL}/static/phone/iframe_index.html?userId=${encodeURIComponent(state.agentId ?? \"\")}&password=${encodeURIComponent(state.urlConfig?.password ?? \"\")}&api_url=${encodeURIComponent(state.urlConfig?.iframeAPIURL ?? \"\")}&ws_url=${encodeURIComponent(state.urlConfig?.webSocketURL ?? \"\")}`}\r\n              height={380}\r\n              width={420}\r\n              allow=\"camera; microphone; autoplay\"\r\n              style={{\r\n                border: \"none\",\r\n              }}></iframe>\r\n          </Box>\r\n        </Paper>\r\n      </Fade>\r\n\r\n      <Menu\r\n        anchorEl={dialerAnchorEl}\r\n        open={Boolean(dialerAnchorEl)}\r\n        onClose={() => {\r\n          if (!clickToCallLoading) {\r\n            handleCloseDialer();\r\n          }\r\n        }}\r\n        onClick={(e) => e.stopPropagation()}\r\n        slotProps={{\r\n          paper: {\r\n            sx: {\r\n              p: 1.5,\r\n              borderRadius: \"12px\",\r\n              boxShadow: \"0 10px 30px rgba(0,0,0,0.15)\",\r\n              border: \"1px solid rgba(0,0,0,0.08)\",\r\n              minWidth: 290,\r\n            },\r\n          },\r\n        }}\r\n        sx={{\r\n          zIndex: 99999,\r\n        }}>\r\n        <Box\r\n          sx={{\r\n            display: \"flex\",\r\n            flexDirection: \"column\",\r\n            width: \"100%\",\r\n          }}>\r\n          {isWrapupState && !clickToCallLoading && (\r\n            <Box\r\n              sx={{\r\n                display: \"flex\",\r\n                alignItems: \"center\",\r\n                justifyContent: \"space-between\",\r\n                bgcolor: \"#fff7ed\",\r\n                border: \"1px solid #fed7aa\",\r\n                borderRadius: \"8px\",\r\n                px: 1.2,\r\n                py: 0.8,\r\n                mb: 1.2,\r\n              }}>\r\n              <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}>\r\n                <Timer sx={{ fontSize: 16, color: \"#ea580c\" }} />\r\n                <Typography\r\n                  sx={{\r\n                    fontSize: \"11px\",\r\n                    fontWeight: 700,\r\n                    color: \"#c2410c\",\r\n                    textTransform: \"uppercase\",\r\n                    letterSpacing: \"0.5px\",\r\n                  }}>\r\n                  Wrap Up Mode\r\n                </Typography>\r\n              </Box>\r\n              {callWrapuptime !== null && (\r\n                <Typography sx={{ fontSize: \"12px\", fontWeight: 700, color: \"#ea580c\" }}>\r\n                  {formatDuration(callWrapuptime)}\r\n                </Typography>\r\n              )}\r\n            </Box>\r\n          )}\r\n\r\n          <Box\r\n            sx={{\r\n              display: \"flex\",\r\n              alignItems: \"center\",\r\n              gap: 1,\r\n            }}>\r\n            <TextField\r\n              size=\"small\"\r\n              type=\"tel\"\r\n              fullWidth\r\n              value={dialFieldValue}\r\n              placeholder=\"Enter Mobile / Landline / Code\"\r\n              disabled={clickToCallLoading}\r\n              slotProps={{\r\n                input: {\r\n                  startAdornment: isWrapupState ? (\r\n                    <InputAdornment position=\"start\">\r\n                      {callDirection === \"INBOUND\" ? (\r\n                        <CallReceived\r\n                          sx={{ fontSize: 18, color: \"success.main\" }}\r\n                        />\r\n                      ) : (\r\n                        <CallMade\r\n                          sx={{ fontSize: 18, color: \"primary.main\" }}\r\n                        />\r\n                      )}\r\n                    </InputAdornment>\r\n                  ) : undefined,\r\n                  sx: {\r\n                    borderRadius: \"8px\",\r\n                    fontSize: \"14px\",\r\n                    bgcolor: clickToCallLoading ? \"action.hover\" : \"transparent\",\r\n                  },\r\n                },\r\n                htmlInput: {\r\n                  inputMode: \"tel\",\r\n                  // Supports up to 25 characters (e.g. +91-80-69200202, (080) 69200202, *123#).\r\n                  maxLength: 25,\r\n                  // WRAPUP: locked to the just-ended number (redial only).\r\n                  readOnly: dialFieldReadOnly || clickToCallLoading,\r\n                },\r\n              }}\r\n              onChange={(e) => {\r\n                if (dialFieldReadOnly || clickToCallLoading) return;\r\n                const value = e.target.value;\r\n                if (/^[0-9+\\-*#() .,;/]*$/.test(value) && value.length <= 25) {\r\n                  setPhoneNumber(value);\r\n                }\r\n              }}\r\n              onPaste={(e) => {\r\n                const pasted = e.clipboardData.getData(\"text\");\r\n                const next = dialFieldValue + pasted;\r\n                if (\r\n                  dialFieldReadOnly ||\r\n                  clickToCallLoading ||\r\n                  !/^[0-9+\\-*#() .,;/]*$/.test(pasted) ||\r\n                  next.length > 25\r\n                ) {\r\n                  e.preventDefault();\r\n                }\r\n              }}\r\n              onKeyDown={(e) => {\r\n                if (e.key === \"Enter\") {\r\n                  e.preventDefault();\r\n                  if (!clickToCallLoading && dialFieldValue) {\r\n                    handleStartCall(dialFieldValue);\r\n                  }\r\n                  return;\r\n                }\r\n                if (dialFieldReadOnly || clickToCallLoading) {\r\n                  e.preventDefault();\r\n                  return;\r\n                }\r\n                const allowedKeys = [\r\n                  \"Backspace\",\r\n                  \"Delete\",\r\n                  \"Tab\",\r\n                  \"ArrowLeft\",\r\n                  \"ArrowRight\",\r\n                  \"ArrowUp\",\r\n                  \"ArrowDown\",\r\n                  \"Home\",\r\n                  \"End\",\r\n                ];\r\n                if (\r\n                  !/^[0-9+\\-*#() .,;/]$/.test(e.key) &&\r\n                  !allowedKeys.includes(e.key) &&\r\n                  !(e.ctrlKey || e.metaKey)\r\n                ) {\r\n                  e.preventDefault();\r\n                }\r\n              }}\r\n            />\r\n            <IconButton\r\n              disabled={clickToCallLoading || !dialFieldValue}\r\n              sx={{\r\n                width: 40,\r\n                height: 40,\r\n                flexShrink: 0,\r\n                bgcolor: clickToCallLoading || !dialFieldValue ? \"action.hover\" : \"success.main\",\r\n                color: clickToCallLoading || !dialFieldValue ? \"action.disabled\" : \"#fff\",\r\n                borderRadius: \"8px\",\r\n                transition: \"all 0.2s ease\",\r\n                \"&:hover\": {\r\n                  bgcolor: clickToCallLoading || !dialFieldValue ? \"action.hover\" : \"success.dark\",\r\n                },\r\n              }}\r\n              onClick={() => {\r\n                if (!clickToCallLoading && dialFieldValue) {\r\n                  handleStartCall(dialFieldValue);\r\n                }\r\n              }}>\r\n              {clickToCallLoading ? (\r\n                <CircularProgress\r\n                  size={18}\r\n                  thickness={5}\r\n                  sx={{\r\n                    color: \"success.main\",\r\n                  }}\r\n                />\r\n              ) : (\r\n                <Phone sx={{ fontSize: 20 }} />\r\n              )}\r\n            </IconButton>\r\n          </Box>\r\n\r\n          {/* Recent numbers / Auto-complete suggestions */}\r\n          {!isWrapupState && !clickToCallLoading && displayedRecentCalls.length > 0 && (\r\n            <Box\r\n              sx={{\r\n                mt: 1.2,\r\n                border: \"1px solid rgba(0, 0, 0, 0.08)\",\r\n                borderRadius: \"10px\",\r\n                bgcolor: \"background.paper\",\r\n                boxShadow: \"0 6px 20px rgba(0, 0, 0, 0.07)\",\r\n                overflow: \"hidden\",\r\n                transition: \"all 0.2s ease\",\r\n              }}>\r\n              <List dense disablePadding sx={{ maxHeight: 180, overflowY: \"auto\" }}>\r\n                {displayedRecentCalls.map((item, idx) => {\r\n                  const cleanQ = dialFieldValue.trim().toLowerCase().replace(/[\\s\\-\\(\\)\\+]/g, \"\");\r\n                  const cleanItem = item.number.toLowerCase().replace(/[\\s\\-\\(\\)\\+]/g, \"\");\r\n                  const matchIdx = cleanQ ? cleanItem.indexOf(cleanQ) : -1;\r\n                  const isInbound = item.direction === \"INBOUND\";\r\n\r\n                  return (\r\n                    <ListItemButton\r\n                      key={idx}\r\n                      onClick={() => {\r\n                        setPhoneNumber(item.number);\r\n                        handleStartCall(item.number);\r\n                      }}\r\n                      sx={{\r\n                        py: 0.8,\r\n                        px: 1.4,\r\n                        display: \"flex\",\r\n                        alignItems: \"center\",\r\n                        justifyContent: \"space-between\",\r\n                        borderBottom:\r\n                          idx < displayedRecentCalls.length - 1\r\n                            ? \"1px solid rgba(0, 0, 0, 0.04)\"\r\n                            : \"none\",\r\n                        transition: \"all 0.15s ease\",\r\n                        \"&:hover\": {\r\n                          bgcolor: \"rgba(2, 132, 199, 0.06)\",\r\n                          pl: 1.7,\r\n                        },\r\n                      }}>\r\n                      <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1.1 }}>\r\n                        <Box\r\n                          sx={{\r\n                            width: 28,\r\n                            height: 28,\r\n                            borderRadius: \"8px\",\r\n                            bgcolor: isInbound ? \"success.lighter\" : \"primary.lighter\",\r\n                            display: \"flex\",\r\n                            alignItems: \"center\",\r\n                            justifyContent: \"center\",\r\n                            flexShrink: 0,\r\n                          }}>\r\n                          {isInbound ? (\r\n                            <CallReceived sx={{ fontSize: 14, color: \"success.main\" }} />\r\n                          ) : (\r\n                            <CallMade sx={{ fontSize: 14, color: \"primary.main\" }} />\r\n                          )}\r\n                        </Box>\r\n                        <Box sx={{ display: \"flex\", flexDirection: \"column\" }}>\r\n                          <Typography\r\n                            sx={{\r\n                              fontSize: \"13px\",\r\n                              fontWeight: 600,\r\n                              color: \"text.primary\",\r\n                              letterSpacing: \"0.3px\",\r\n                              lineHeight: 1.2,\r\n                              fontVariantNumeric: \"tabular-nums\",\r\n                            }}>\r\n                            {matchIdx !== -1 && cleanQ ? (\r\n                              <>\r\n                                {item.number.slice(0, matchIdx)}\r\n                                <Box\r\n                                  component=\"span\"\r\n                                  sx={{\r\n                                    color: \"primary.main\",\r\n                                    fontWeight: 800,\r\n                                    bgcolor: \"rgba(2, 132, 199, 0.12)\",\r\n                                    px: \"3px\",\r\n                                    py: \"1px\",\r\n                                    borderRadius: \"3px\",\r\n                                  }}>\r\n                                  {item.number.slice(matchIdx, matchIdx + cleanQ.length)}\r\n                                </Box>\r\n                                {item.number.slice(matchIdx + cleanQ.length)}\r\n                              </>\r\n                            ) : (\r\n                              item.number\r\n                            )}\r\n                          </Typography>\r\n                          {item.time && (\r\n                            <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.4, mt: \"2px\" }}>\r\n                              <AccessTime sx={{ fontSize: 10, color: \"text.disabled\" }} />\r\n                              <Typography sx={{ fontSize: \"10px\", color: \"text.secondary\" }}>\r\n                                {item.time}\r\n                              </Typography>\r\n                            </Box>\r\n                          )}\r\n                        </Box>\r\n                      </Box>\r\n                    </ListItemButton>\r\n                  );\r\n                })}\r\n              </List>\r\n            </Box>\r\n          )}\r\n\r\n          {clickToCallLoading && (\r\n            <Box\r\n              sx={{\r\n                display: \"flex\",\r\n                alignItems: \"center\",\r\n                gap: 1.2,\r\n                mt: 1.5,\r\n                p: 1.2,\r\n                borderRadius: \"8px\",\r\n                border: \"1px solid\",\r\n                borderColor: dialDelayNotice ? \"#fed7aa\" : \"#bbf7d0\",\r\n                bgcolor: dialDelayNotice ? \"#fffbeb\" : \"#f0fdf4\",\r\n                transition: \"all 0.3s ease\",\r\n              }}>\r\n              <CircularProgress\r\n                size={14}\r\n                thickness={5}\r\n                sx={{\r\n                  color: dialDelayNotice ? \"#d97706\" : \"#16a34a\",\r\n                  flexShrink: 0,\r\n                }}\r\n              />\r\n              <Typography\r\n                variant=\"caption\"\r\n                sx={{\r\n                  color: dialDelayNotice ? \"#92400e\" : \"#15803d\",\r\n                  fontSize: \"12px\",\r\n                  fontWeight: 500,\r\n                  lineHeight: 1.35,\r\n                }}>\r\n                {dialDelayNotice\r\n                  ? \"Connecting your call, please wait a moment...\"\r\n                  : \"Initiating call, please wait...\"}\r\n              </Typography>\r\n            </Box>\r\n          )}\r\n        </Box>\r\n      </Menu>\r\n\r\n      <Menu\r\n        anchorEl={ambulanceAnchorEl}\r\n        open={Boolean(ambulanceAnchorEl)}\r\n        onClose={handleCloseAmbulance}\r\n        onClick={(e) => e.stopPropagation()}\r\n        sx={{\r\n          zIndex: 99999,\r\n        }}>\r\n        <Box\r\n          sx={{\r\n            all: \"unset\",\r\n            padding: \" 0px 20px\",\r\n            \"&hover\": {\r\n              backgroundColor: \"white\",\r\n            },\r\n            display: \"flex\",\r\n            alignItems: \"center\",\r\n          }}>\r\n          <Tooltip title=\"Ambulance Service\">\r\n            <Button\r\n              color=\"primary\"\r\n              variant=\"outlined\"\r\n              onClick={() => {\r\n                handleSendSMS(state.callData);\r\n              }}>\r\n              Ambulance\r\n              <Box\r\n                sx={{\r\n                  display: \"flex\",\r\n                  alignItems: \"center\",\r\n                  backgroundColor: \"green\",\r\n                  color: \"#fff\",\r\n                  marginLeft: \"14px\",\r\n                  padding: \"2px 6px\",\r\n                  borderRadius: \"10px\",\r\n                }}>\r\n                Send\r\n                <SendRounded\r\n                  sx={{\r\n                    marginLeft: \"8px\",\r\n                    width: \"18px\",\r\n                    transform: \"rotate(-16deg)\",\r\n                  }}\r\n                />\r\n              </Box>\r\n            </Button>\r\n          </Tooltip>\r\n        </Box>\r\n      </Menu>\r\n\r\n      <Menu\r\n        anchorEl={moreOptionsAnchorEl}\r\n        open={Boolean(moreOptionsAnchorEl)}\r\n        onClose={handleCloseMoreOptions}\r\n        onClick={(e) => e.stopPropagation()}\r\n        sx={{\r\n          zIndex: 99999,\r\n        }}>\r\n        <Box\r\n          sx={{\r\n            all: \"unset\",\r\n            padding: \" 0px 20px\",\r\n            \"&hover\": {\r\n              backgroundColor: \"white\",\r\n            },\r\n            display: \"flex\",\r\n            alignItems: \"center\",\r\n            flexDirection: \"column\",\r\n            gap: 1,\r\n          }}>\r\n          {processList?.map((item) => {\r\n            return (\r\n              <Box\r\n                key={item?.process_id}\r\n                sx={{\r\n                  width: \"100%\",\r\n                }}>\r\n                <Tooltip title={item?.process_name ?? \"\"}>\r\n                  <Button\r\n                    color=\"primary\"\r\n                    variant={\r\n                      state?.process?.process_id === item?.process_id\r\n                        ? \"contained\"\r\n                        : \"outlined\"\r\n                    }\r\n                    onClick={() => {\r\n                      sdkStateManager.setProcess(item);\r\n                    }}\r\n                    sx={{\r\n                      width: \"100%\",\r\n                    }}>\r\n                    {item?.process_name ?? \"\"}\r\n                  </Button>\r\n                </Tooltip>\r\n              </Box>\r\n            );\r\n          })}\r\n        </Box>\r\n      </Menu>\r\n\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        {/* Agent-selectable breaks only. The system break the agent is parked on\r\n            after login is deliberately NOT listed — it is the backend's to set,\r\n            not the agent's to pick — exactly as the browser phone's presence menu\r\n            leaves it out. Its NAME still reaches the agent, on the break chip next\r\n            to the timer, because the login assertion paints it there. */}\r\n        {!breaksList || breaksList?.length === 0 ? (\r\n          // Nothing to offer, said plainly. This row used to be a clickable\r\n          // \"- Break\" that posted break_type \"Lunch\" — indistinguishable from a\r\n          // real break, and it put a break type the tenant never configured into\r\n          // the backend's records. Disabled, so the menu still has something to\r\n          // show and the click cannot fabricate a break.\r\n          <MenuItem disabled>No breaks configured</MenuItem>\r\n        ) : (\r\n          breaksList?.map((item) => {\r\n            return (\r\n              <MenuItem\r\n                key={item?.type}\r\n                sx={{\r\n                  // hilight background of selected\r\n                  backgroundColor:\r\n                    state?.callData?.status === \"BREAK\" &&\r\n                    state?.agentStatus === item?.type\r\n                      ? \"primary.main\"\r\n                      : \"transparent\",\r\n                  color:\r\n                    state?.callData?.status === \"BREAK\" &&\r\n                    state?.agentStatus === item?.type\r\n                      ? \"white\"\r\n                      : \"primary.main\",\r\n                  \":hover\": {\r\n                    backgroundColor:\r\n                      state?.callData?.status === \"BREAK\" &&\r\n                      state?.agentStatus === item?.type\r\n                        ? \"primary.dark\"\r\n                        : \"selected.hover\",\r\n                    // color:\r\n                    // \tstate?.callData?.status === \"BREAK\" && state?.agentStatus === item?.type ?\r\n                    // \t\t\"primary.main\"\r\n                    // \t:\t\"primary.main\",\r\n                  },\r\n                }}\r\n                onClick={() => handleUpdateAgentStatus(item?.type)}>\r\n                - {item?.type}\r\n              </MenuItem>\r\n            );\r\n          })\r\n        )}\r\n      </Menu>\r\n\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        <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          <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      {Boolean(state.openConferenceDialog) && <ConferenceDialog />}\r\n\r\n      {Boolean(state.openCallTransferDialog) && (\r\n        <CallTransferDialog open={state.openCallTransferDialog} />\r\n      )}\r\n\r\n      {Boolean(openCallDisposition) && (\r\n        <EndCallDispositionDialog\r\n          open={openCallDisposition}\r\n          setOpen={setOpenCallDisposition}\r\n          onSubmitDisposition={handleEndCall}\r\n          breakOnly={!!state.sdkConfig?.disableCallDisposition}\r\n        />\r\n      )}\r\n\r\n      {Boolean(openCallHistoryDialog) && (\r\n        <CallHistoryDialog\r\n          open={openCallHistoryDialog}\r\n          setOpen={setOpenCallHistoryDialog}\r\n        />\r\n      )}\r\n\r\n      {/* Lead details — opened from the info icon on the call-direction chip. */}\r\n      <Dialog\r\n        open={leadDialogOpen}\r\n        onClose={() => setLeadDialogOpen(false)}\r\n        maxWidth=\"sm\"\r\n        fullWidth\r\n        sx={{ zIndex: 100001 }}\r\n        slotProps={{ paper: { sx: { borderRadius: \"12px\" } } }}\r\n      >\r\n        <DialogTitle sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", py: 1.5 }}>\r\n          <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n            <InfoOutlinedIcon sx={{ fontSize: 20, color: \"primary.main\" }} />\r\n            <Typography sx={{ fontWeight: 700, fontSize: \"1rem\", color: \"text.primary\" }}>Lead Details</Typography>\r\n          </Box>\r\n          <IconButton size=\"small\" onClick={() => setLeadDialogOpen(false)}>\r\n            <Close fontSize=\"small\" />\r\n          </IconButton>\r\n        </DialogTitle>\r\n        <Divider />\r\n        <DialogContent sx={{ pt: 2 }}>\r\n          <LeadDetailsView data={leadDetails} />\r\n        </DialogContent>\r\n      </Dialog>\r\n    </>\r\n  );\r\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport Airlines from \"@mui/icons-material/Airlines\";\r\nimport Call from \"@mui/icons-material/Call\";\r\nimport CallEnd from \"@mui/icons-material/CallEnd\";\r\nimport CallSplit from \"@mui/icons-material/CallSplit\";\r\nimport Close from \"@mui/icons-material/Close\";\r\nimport MemoryOutlined from \"@mui/icons-material/MemoryOutlined\";\r\nimport Pause from \"@mui/icons-material/Pause\";\r\nimport PhoneDisabled from \"@mui/icons-material/PhoneDisabled\";\r\nimport PlayArrow from \"@mui/icons-material/PlayArrow\";\r\nimport RecordVoiceOver from \"@mui/icons-material/RecordVoiceOver\";\r\nimport Roofing from \"@mui/icons-material/Roofing\";\r\nimport SupportAgent from \"@mui/icons-material/SupportAgent\";\r\nimport TransferWithinAStation from \"@mui/icons-material/TransferWithinAStation\";\r\nimport Upcoming from \"@mui/icons-material/Upcoming\";\r\nimport {\r\n\tBox,\r\n\tButton,\r\n\tDialog,\r\n\tIconButton,\r\n\tMenu,\r\n\tMenuItem,\r\n\tPaper,\r\n\tTextField,\r\n\tTypography,\r\n\tAutocomplete,\r\n\tTooltip,\r\n\tuseTheme,\r\n\tTableContainer,\r\n\tTable,\r\n\tTableHead,\r\n\tTableRow,\r\n\tTableCell,\r\n\tTableBody,\r\n\tCircularProgress,\r\n\tCheckbox,\r\n} from \"@mui/material\";\r\n\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\n\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport { useSDKPermissions } from \"../hooks/useSDKPermissions\";\r\nimport { SDK_PERMISSIONS } from \"../permissions/sdk-constants\";\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\n// Disposition hierarchy + draft store, shared with the CRM screen's Disposition\r\n// tab and (by postMessage relay) the hosted Browser-Phone iframe.\r\nimport {\r\n\ttype DispoNode,\r\n\ttype DispoDraft,\r\n\tdispoLevelLabel,\r\n\tloadDispoTree,\r\n\tresolveDispoPath,\r\n\treadDispoDraft,\r\n\twriteDispoDraft,\r\n\tclearDispoDraft,\r\n\tpruneDispoDrafts,\r\n\tdispoCallIdFrom,\r\n} from \"../utils/disposition\";\r\nimport { rememberBreakName, resolveBreakName, savedBreakName } from \"../utils/breakType\";\r\n\r\nimport { useGetRequest, usePostRequest } from \"../services/request\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport axiosInstance from \"../services/axios\";\r\nimport { useToast } from \"../services/toastMessage\";\r\nimport useStyles from \"./styles\";\r\n\r\nimport { ConferenceLineTypes, CallStatus } from \"../../types\";\r\n\r\n// ── dialable-number checks ───────────────────────────────────\r\n// Extracts the dialable numeric string from user input, directory services,\r\n// or labeled strings (e.g. \"080-69200202- INF Ambulance\", \"+91 80 69200202\", \"08069200202\", \"*123#\").\r\nconst normalizeDialNumber = (raw: string): string => {\r\n\tconst str = String(raw ?? \"\").trim();\r\n\tif (str.includes(\"*\") || str.includes(\"#\")) {\r\n\t\treturn str.replace(/[\\s\\-\\(\\)\\.\\/\\,]/g, \"\");\r\n\t}\r\n\tlet cleaned = str.replace(/[\\s\\-\\(\\)\\.\\/\\,]/g, \"\");\r\n\tif (cleaned.startsWith(\"+91\")) {\r\n\t\tcleaned = cleaned.slice(3);\r\n\t} else if (cleaned.startsWith(\"+\")) {\r\n\t\tcleaned = cleaned.slice(1);\r\n\t}\r\n\tconst digits = cleaned.replace(/\\D/g, \"\");\r\n\tif (digits.length === 12 && digits.startsWith(\"91\")) {\r\n\t\treturn digits.slice(2);\r\n\t}\r\n\treturn cleaned;\r\n};\r\n\r\n// Validates dialable numbers for transfer (supports short codes, extensions,\r\n// 10-digit mobile, 11-digit STD/landlines like 080-69200202, and labeled entries).\r\nconst getTransferNumberError = (raw: string): string => {\r\n\tconst number = normalizeDialNumber(raw);\r\n\tif (!number) return \"Enter phone number\";\r\n\tif (number.length < 3) return \"Enter at least 3 characters\";\r\n\tif (number.length > 20)\r\n\t\treturn \"Enter a valid phone number (up to 20 characters)\";\r\n\treturn \"\";\r\n};\r\n\r\n// Validates dialable numbers for conference legs.\r\nconst getConferenceNumberError = (raw: string): string => {\r\n\tconst number = normalizeDialNumber(raw);\r\n\tif (!number) return \"Enter phone number\";\r\n\tif (number.length < 3) return \"Enter at least 3 characters\";\r\n\tif (number.length > 20)\r\n\t\treturn \"Enter a valid phone number (up to 20 characters)\";\r\n\treturn \"\";\r\n};\r\n\r\n// /cti/hospital/services returns each directory entry in camelCase, so the\r\n// snake_case read this row used always came back undefined — every service\r\n// transfer was posted with an empty number. `phone_number` stays as a fallback\r\n// in case an older backend is on the other end.\r\nconst getServicePhoneNumber = (service: any): string =>\r\n\tString(service?.phoneNumber ?? service?.phone_number ?? \"\");\r\n\r\ntype TransferCallRequest = {\r\n\tmobile_number?: string;\r\n\tuserid?: string;\r\n\ttype?: string;\r\n\ttransfer_to?: string;\r\n\tcallreferenceid?: string;\r\n\tprocessid?: string;\r\n\tprocess_name?: string;\r\n};\r\n\r\ntype BlindTransferCallRequest = {\r\n\taction: string;\r\n\tuserid: string;\r\n\tcallreferenceid: string;\r\n\tblind_transfer_no: any;\r\n};\r\n\r\nconst ConferenceTableRow = ({ each, isLineDialing }: any) => {\r\n\tconst state = useSDKState();\r\n\tconst theme = useTheme();\r\n\tconst { showToast } = useToast();\r\n\tconst { disabled, enabled } = useStyles({\r\n\t\tdisabled: state.sdkConfig?.disabled || {},\r\n\t\tenabled: state.sdkConfig?.enabled || {},\r\n\t\toutlined: state.sdkConfig?.outlined || {},\r\n\t});\r\n\r\n\tconst [conferenceCallStart, setConferenceCallStart] = useState(false);\r\n\tconst [conferenceCallMerge, setConferenceCallMerge] = useState(false);\r\n\tconst [conferenceCallHoldOrUnHold, setConferenceCallHoldOrUnHold] = useState(false);\r\n\tconst [conferenceCallEnd, setConferenceCallEnd] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tlet timer: any;\r\n\t\tif (conferenceCallStart) {\r\n\t\t\ttimer = setTimeout(() => {\r\n\t\t\t\tshowToast(\"Connecting your call, please wait a moment...\", \"info\");\r\n\t\t\t}, 2500);\r\n\t\t}\r\n\t\treturn () => {\r\n\t\t\tif (timer) clearTimeout(timer);\r\n\t\t};\r\n\t}, [conferenceCallStart, showToast]);\r\n\r\n\t// While any line is still dialing or on call (i.e. being set up before it joins\r\n\t// the conference), holding/resuming any line must be blocked.\r\n\tconst anyLineDialingOrOnCall = state?.conferenceLine?.some(\r\n\t\t(line: any) => line?.status === CallStatus.DIALING || line?.status === CallStatus.ONCALL,\r\n\t);\r\n\r\n\t// Hold/Resume is only actionable on lines already in the conference or on hold.\r\n\t// A dialing/on-call line is therefore disabled (its status isn't CONFERENCE/HOLD),\r\n\t// and while any line is still dialing or on call every line's Hold is disabled.\r\n\t// Also disabled while a hold/unhold request is in flight.\r\n\tconst holdEnabled =\r\n\t\t(each?.status === CallStatus.CONFERENCE || each?.status === CallStatus.HOLD) &&\r\n\t\t!anyLineDialingOrOnCall &&\r\n\t\t!conferenceCallHoldOrUnHold;\r\n\r\n\t// Merge gating: a line can normally be merged once it is ONCALL. But when the\r\n\t// main/primary call (line 1) has dropped, an ONCALL leg has nothing to merge\r\n\t// into on its own — it can only be merged with an already-held leg. So in that\r\n\t// case merge stays disabled until at least one other line is on HOLD.\r\n\tconst mainCallDisconnected = (state?.conferenceLine as ConferenceLineTypes[])?.some(\r\n\t\t(line) => line?.line === 1 && line?.status === CallStatus.DISCONNECTED,\r\n\t);\r\n\tconst anyOtherLineOnHold = (state?.conferenceLine as ConferenceLineTypes[])?.some(\r\n\t\t(line) => line?.line !== each?.line && line?.status === CallStatus.HOLD,\r\n\t);\r\n\tconst mergeEnabled =\r\n\t\teach?.status === CallStatus.ONCALL && (!mainCallDisconnected || anyOtherLineOnHold);\r\n\r\n\t// Main call (line 1) controls:\r\n\t// - Merge is enabled only when the main call is ONCALL and some OTHER line is on hold\r\n\t//   (not line 1's own hold).\r\n\t// - The re-dial Call icon is disabled while the main call is actively set up / live\r\n\t//   (DIALING / ONCALL / CONFERENCE / HOLD) — re-dial only makes sense once it has dropped.\r\n\tconst mainMergeEnabled = !!anyOtherLineOnHold && each?.status === CallStatus.ONCALL;\r\n\tconst mainCallIconDisabled =\r\n\t\tconferenceCallStart ||\r\n\t\teach?.status === CallStatus.DIALING ||\r\n\t\teach?.status === CallStatus.ONCALL ||\r\n\t\teach?.status === CallStatus.CONFERENCE ||\r\n\t\teach?.status === CallStatus.HOLD;\r\n\r\n\t// Check if the entered phone number is same as the active call number (used only as a call guard, not for UI error)\r\n\tconst isSameAsActiveCall = each?.phone === state.callData?.phone_number && !!each?.phone;\r\n\r\n\t// Show error on the DUPLICATE occurrence: any lower-numbered conference line already has the same phone\r\n\tconst isDuplicateInConference =\r\n\t\t!!each?.phone &&\r\n\t\teach?.line !== 1 &&\r\n\t\t(state.conferenceLine as ConferenceLineTypes[])?.some(\r\n\t\t\t(line) => line.line < each.line && line.phone === each?.phone && !!line.phone,\r\n\t\t);\r\n\r\n\t// Only flag duplicates â€” no error on line 1 (active call) and no error on the first use of a number\r\n\tconst hasPhoneConflict = isDuplicateInConference;\r\n\r\n\tconst phoneConflictHelperText = isDuplicateInConference ? \"Number already used in another conference line\" : \"\";\r\n\r\n\t// The number itself has to be dialable, whatever the duplicate check says.\r\n\tconst phoneNumberError = getConferenceNumberError(each?.phone ?? \"\");\r\n\r\n\tconst onConferenceLineUpdate = (line: ConferenceLineTypes, data: any) => {\r\n\t\tsdkStateManager.setConferenceLine({ ...line, ...data });\r\n\t};\r\n\r\n\tconst onConferenceCallStart = (line: ConferenceLineTypes, data: any) => {\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// Block dialing the same number as the active call\r\n\t\tif (line_used.phone === state.callData?.phone_number) {\r\n\t\t\tshowToast(\"Cannot conference with the active call number\", \"error\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Block dialing a number already used in another conference line\r\n\t\tconst isDuplicateNumber = (state.conferenceLine as ConferenceLineTypes[])?.some(\r\n\t\t\t(l) => l.line !== line_used.line && l.phone === line_used.phone && !!l.phone,\r\n\t\t);\r\n\t\tif (isDuplicateNumber) {\r\n\t\t\tshowToast(\"Number already used in another conference line\", \"error\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Replaces a bare \"shorter than 10 digits\" test: an 11-digit typo passed that\r\n\t\t// and the dial plan then matched the valid number buried inside it.\r\n\t\tconst numberError = getConferenceNumberError(line_used.phone ?? \"\");\r\n\t\tif (numberError) {\r\n\t\t\tshowToast(numberError, \"error\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetConferenceCallStart(true);\r\n\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\",\r\n\t\t\toperation: `CALL${line_used.line}`,\r\n\t\t\t// line_used: Number(line_used.line),\r\n\t\t\t// thirdparty_no: line_used.phone,\r\n\t\t\ttarget: normalizeDialNumber(line_used.phone),\r\n\t\t\tline_number: Number(line_used.line),\r\n\t\t\tuserid: state.agentId ?? \"\",\r\n\t\t\tprocess: state.callData?.process_name ?? \"\",\r\n\t\t};\r\n\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetConferenceCallStart(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t// Re-dial the main/primary call (line 1) back into the existing conference after it\r\n\t// has dropped. Uses the conference-add endpoint (operation CALL1) so the other legs\r\n\t// (held lines) stay intact — unlike a fresh click-to-call, which resets the conference.\r\n\tconst onReCallMainCall = (line: ConferenceLineTypes) => {\r\n\t\tconst target = normalizeDialNumber(line?.phone || state.callData?.phone_number || \"\");\r\n\t\tconst numberError = getConferenceNumberError(target);\r\n\t\tif (numberError) {\r\n\t\t\tshowToast(numberError, \"error\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetConferenceCallStart(true);\r\n\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\",\r\n\t\t\toperation: \"CALL1\",\r\n\t\t\ttarget,\r\n\t\t\tline_number: 1,\r\n\t\t\tuserid: state.agentId ?? \"\",\r\n\t\t\tprocess: state.callData?.process_name ?? \"\",\r\n\t\t};\r\n\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetConferenceCallStart(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onMergeConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n\t\tconst line_used = { ...line, ...data };\r\n\t\tsetConferenceCallMerge(true);\r\n\r\n\t\tconst payload = {\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\",\r\n\t\t\toperation: `CONFERENCE`,\r\n\t\t\tline_used: String(line_used.line),\r\n\t\t\tthirdparty_no: line_used.phone,\r\n\t\t\tuserid: state.agentId ?? \"\",\r\n\t\t\tprocess: state.callData?.process_name ?? \"\",\r\n\t\t\tcall_id: state.callData?.call_id ?? \"\",\r\n\r\n\t\t};\r\n\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_MERGE_CALL, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tif (state.callData?.hold === 1) {\r\n\t\t\t\t\thandleHoldToggle();\r\n\t\t\t\t}\r\n\t\t\t\tif (state.callData?.mute === 1) {\r\n\t\t\t\t\thandleMuteToggle();\r\n\t\t\t\t}\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetConferenceCallMerge(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onHoldOrUnHoldConferenceCall = (line: ConferenceLineTypes, data: any, type: string) => {\r\n\t\tconst line_used = { ...line, ...data };\r\n\t\tsetConferenceCallHoldOrUnHold(true);\r\n\r\n\t\tconst payload = {\r\n\t\t\taction: type === \"HOLDUSER\" ? \"HOLD\" : \"UNHOLD\",\r\n\t\t\toperation: type,\r\n\t\t\thold_channel_no: type === \"HOLDUSER\" ? `hold${line_used.line}` : `unhold${line_used.line}`,\r\n\t\t\tuserid: state.agentId ?? \"\",\r\n\t\t\tprocess: state.callData?.process_name ?? \"\",\r\n\r\n\t\t\tcall_uuid: state.callData?.call_id ?? \"\",\r\n\t\t\tline_number: Number(line_used.line),\r\n\t\t};\r\n\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_HOLD_OR_UN_HOLD, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetConferenceCallHoldOrUnHold(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onEndConferenceCall = (line: ConferenceLineTypes, data: any) => {\r\n\t\tconst line_used = { ...line, ...data };\r\n\r\n\t\t// âœ… FIX: Prevent accidental hangup of the primary call channel via conference controls\r\n\t\tif (line_used.line === 1) {\r\n\t\t\tshowToast(\"Cannot end the primary call from conference controls\", \"error\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsetConferenceCallEnd(true);\r\n\r\n\t\t// Backend HangupRequest schema: call_id (required), agent_id, mobile_number,\r\n\t\t// line_number, reason. Pass line_number = the conference line being dropped\r\n\t\t// (line_number = 0 means full-call hangup, so it must be > 0 here).\r\n\t\tconst payload = {\r\n\t\t\tcall_id: state.callData?.call_id ?? \"\",\r\n\t\t\tagent_id: state.agentId ?? \"\",\r\n\t\t\tmobile_number: line_used.phone ?? \"\",\r\n\t\t\tline_number: Number(line_used.line),\r\n\t\t\treason: \"normal\",\r\n\t\t};\r\n\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_END, payload)\r\n\t\t\t.then(() => {\r\n\t\t\t\tshowToast(\"Call disconnected successfully\", \"success\");\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetConferenceCallEnd(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst [holdOrUnHold] = usePostRequest<{\r\n\t\taction: string;\r\n\t\tuser_id: string;\r\n\t\tcall_uuid: string;\r\n\t\tline_number: number;\r\n\t\trefno?: string;\r\n\t}>();\r\n\r\n\tconst [muteOrUnMute] = usePostRequest<{\r\n\t\taction: string;\r\n\t\tdirection: string;\r\n\t\tuser_id: string;\r\n\t\tcall_uuid: string;\r\n\t\tline_number: number;\r\n\t\trefno?: string;\r\n\t}>();\r\n\r\n\tconst handleHoldToggle = () => {\r\n\t\tconst payload = {\r\n\t\t\taction: state.callData?.hold === 1 ? CallStatus.UNHOLD : CallStatus.HOLD,\r\n\t\t\tuser_id: String(state.agentId ?? \"\"),\r\n\t\t\tcall_uuid: state.callData?.call_id ?? \"\",\r\n\t\t\tline_number: 0,\r\n\t\t};\r\n\t\tholdOrUnHold(END_POINT.HOLD_CALL, payload);\r\n\t};\r\n\r\n\tconst handleMuteToggle = () => {\r\n\t\tconst payload = {\r\n\t\t\taction: state.callData?.mute === 1 ? CallStatus.UNMUTE : CallStatus.MUTE,\r\n\t\t\tdirection: \"both\",\r\n\t\t\tuser_id: String(state.agentId ?? \"\"),\r\n\t\t\tcall_uuid: state.callData?.call_id ?? \"\",\r\n\t\t\tline_number: 0,\r\n\t\t};\r\n\r\n\t\tmuteOrUnMute(END_POINT.MUTE_CALL, payload);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<TableRow\r\n\t\t\tkey={each.line}\r\n\t\t\tsx={{\r\n\t\t\t\tborder: \"2px solid #fff\",\r\n\t\t\t}}\r\n\t\t>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\tflex: 1,\r\n\t\t\t\t\twidth: \"100px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Typography>Line {each?.line ?? \"\"}. </Typography>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\twidth: \"150px\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Typography\r\n\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tpx: 1,\r\n\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\twidth: \"150px\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{each?.status ?? \"\"}\r\n\t\t\t\t</Typography>\r\n\t\t\t</TableCell>\r\n\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\tflex: 1,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<TextField\r\n\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\ttype=\"tel\"\r\n\t\t\t\t\tplaceholder=\"Phone Number\"\r\n\t\t\t\t\tfullWidth\r\n\t\t\t\t\tvalue={each?.phone || \"\"}\r\n\t\t\t\t\terror={hasPhoneConflict || (!!each?.phone && !!phoneNumberError)}\r\n\t\t\t\t\thelperText={phoneConflictHelperText || (each?.phone ? phoneNumberError : \"\")}\r\n\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\thtmlInput: {\r\n\t\t\t\t\t\t\tmaxLength: 40,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\teach?.line === 1 ||\r\n\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\tCallStatus.ONCALL,\r\n\t\t\t\t\t\t\tCallStatus.DISCONNECTED,\r\n\t\t\t\t\t\t\tCallStatus.CONFERENCE,\r\n\t\t\t\t\t\t\tCallStatus.HOLD,\r\n\t\t\t\t\t\t\tCallStatus.MUTE,\r\n\t\t\t\t\t\t\tCallStatus.DIALING,\r\n\t\t\t\t\t\t\tCallStatus.RINGING,\r\n\t\t\t\t\t\t].includes(each?.status ?? \"\") ||\r\n\t\t\t\t\t\tisLineDialing\r\n\t\t\t\t\t}\r\n\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\tonConferenceLineUpdate(each, { phone: e.target.value });\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\tflex: 1,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\tjustifyContent: \"flex-start\",\r\n\t\t\t\t\t\tgap: \"10px\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{/* Main call (line 1): always show Call (re-dial) + Merge before Hold (no End Call),\r\n\t\t\t\t\t    so the row reads Call, Merge, Hold across disconnected / re-dialing / connected states. */}\r\n\t\t\t\t\t{each?.line === 1 && (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t<Tooltip title=\"Call main number again\">\r\n\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={mainCallIconDisabled ? \"outlined\" : \"contained\"}\r\n\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\tsx={mainCallIconDisabled ? { ...disabled } : { ...enabled }}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => onReCallMainCall(each)}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={mainCallIconDisabled}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{conferenceCallStart ? (\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress size=\"20px\" color=\"success\" />\r\n\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t<Call sx={{ color: mainCallIconDisabled ? \"inherit\" : \"#f3f2f2\" }} />\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t<Tooltip title=\"Merge Call\">\r\n\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={mainMergeEnabled ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\t\t\tsx={mainMergeEnabled ? { ...enabled } : { ...disabled }}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => onMergeConferenceCall(each, { isMergeCall: true })}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={!mainMergeEnabled}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{conferenceCallMerge ? <CircularProgress size=\"20px\" /> : <CallSplit />}\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t</>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{each?.line === 1 && (\r\n\t\t\t\t\t\t<Tooltip title={each?.status !== CallStatus.HOLD ? \"Hold\" : \"Resume\"}>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={holdEnabled ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tsx={holdEnabled ? { ...enabled } : { ...disabled }}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tif (each.status === CallStatus.HOLD) {\r\n\t\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: false }, \"UNHOLDUSER\");\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: true }, \"HOLDUSER\");\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={!holdEnabled}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{each.status === CallStatus.HOLD ? (\r\n\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\tgap: \"5px\",\r\n\t\t\t\t\t\t\t\t\t\t\twidth: \"98px\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: holdEnabled ? \"#fff\" : \"inherit\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tUnhold\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t{conferenceCallHoldOrUnHold ? (\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress size=\"16px\" sx={{ color: theme.palette.primary.main }} />\r\n\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t<PlayArrow />\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\tgap: \"5px\",\r\n\t\t\t\t\t\t\t\t\t\t\twidth: \"98px\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{ color: holdEnabled ? \"#fff\" : \"inherit\", fontSize: \"12px\" }}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\tHold\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t{conferenceCallHoldOrUnHold ? (\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress size=\"16px\" sx={{ color: theme.palette.primary.main }} />\r\n\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t<Pause />\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{each?.line !== 1 && (() => {\r\n\t\t\t\t\t\tconst callDisabled =\r\n\t\t\t\t\t\t\teach?.status !== CallStatus.IDLE ||\r\n\t\t\t\t\t\t\tisLineDialing ||\r\n\t\t\t\t\t\t\thasPhoneConflict ||\r\n\t\t\t\t\t\t\t!!phoneNumberError;\r\n\t\t\t\t\t\tconst tooltipTitle = hasPhoneConflict\r\n\t\t\t\t\t\t\t? phoneConflictHelperText || \"Cannot dial this number\"\r\n\t\t\t\t\t\t\t: phoneNumberError\r\n\t\t\t\t\t\t\t\t? phoneNumberError\r\n\t\t\t\t\t\t\t\t: \"Call\";\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t<Tooltip title={tooltipTitle}>\r\n\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant={callDisabled ? \"outlined\" : \"contained\"}\r\n\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\t\t\tcallDisabled\r\n\t\t\t\t\t\t\t\t\t\t\t\t? { ...disabled }\r\n\t\t\t\t\t\t\t\t\t\t\t\t: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"success.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `0px 2px 1px ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.success.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"success.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tonConferenceCallStart(each, {});\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={callDisabled}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{conferenceCallStart ? (\r\n\t\t\t\t\t\t\t\t\t\t\t<CircularProgress size=\"20px\" color=\"success\" />\r\n\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t<Call\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: callDisabled ? \"default\" : \"#f3f2f2\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t})()}\r\n\r\n\t\t\t\t\t{each?.line !== 1 && (\r\n\t\t\t\t\t\t<Tooltip title={mergeEnabled ? \"Merge Call\" : mainCallDisconnected && each?.status === CallStatus.ONCALL ? \"Put another line on hold to merge\" : \"Merge Call\"}>\r\n\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\tvariant={mergeEnabled ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\t\tsx={mergeEnabled ? { ...enabled } : { ...disabled }}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\tonMergeConferenceCall(each, { isMergeCall: true });\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tdisabled={!mergeEnabled}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{conferenceCallMerge ? <CircularProgress size=\"20px\" /> : <CallSplit />}\r\n\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{each?.line !== 1 && (\r\n\t\t\t\t\t\t<Tooltip title={each?.status !== CallStatus.HOLD ? \"Hold\" : \"Resume\"}>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={holdEnabled ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tsx={holdEnabled ? { ...enabled } : { ...disabled }}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tif (each.status === CallStatus.HOLD) {\r\n\t\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: false }, \"UNHOLDUSER\");\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tonHoldOrUnHoldConferenceCall(each, { isHold: true }, \"HOLDUSER\");\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={!holdEnabled}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{conferenceCallHoldOrUnHold ? (\r\n\t\t\t\t\t\t\t\t\t<CircularProgress size=\"20px\" sx={{ color: theme.palette.primary.main }} />\r\n\t\t\t\t\t\t\t\t) : each.status === CallStatus.HOLD ? (\r\n\t\t\t\t\t\t\t\t\t<PlayArrow />\r\n\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t<Pause />\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{each?.line !== 1 && (\r\n\t\t\t\t\t\t<Tooltip title=\"End Call\">\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={\r\n\t\t\t\t\t\t\t\t\teach?.status !== CallStatus.IDLE && each?.status !== CallStatus.DISCONNECTED\r\n\t\t\t\t\t\t\t\t\t\t? \"contained\"\r\n\t\t\t\t\t\t\t\t\t\t: \"outlined\"\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\tsx={\r\n\t\t\t\t\t\t\t\t\teach?.status !== CallStatus.IDLE && each?.status !== CallStatus.DISCONNECTED ?\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t...enabled,\r\n\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `0px 2px 1px ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t\tborder: `0px solid ${theme.palette.error.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\"&:active\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"error.light\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: `inset 1px -2px 4px ${theme.palette.primary.light}`,\r\n\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t: {\r\n\t\t\t\t\t\t\t\t\t\t\t...disabled,\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tonEndConferenceCall(each, {\r\n\t\t\t\t\t\t\t\t\t\tisCallStart: false,\r\n\t\t\t\t\t\t\t\t\t\tisMergeCall: false,\r\n\t\t\t\t\t\t\t\t\t\tisMute: false,\r\n\t\t\t\t\t\t\t\t\t\tisHold: false,\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t\t\t\teach?.status === CallStatus.IDLE ||\r\n\t\t\t\t\t\t\t\t\teach?.status === CallStatus.DISCONNECTED ||\r\n\t\t\t\t\t\t\t\t\tconferenceCallEnd\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t{conferenceCallEnd ? <CircularProgress size=\"20px\" color=\"error\" /> : <CallEnd />}\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t)}\r\n\t\t\t\t</Box>\r\n\t\t\t</TableCell>\r\n\t\t</TableRow>\r\n\t);\r\n};\r\n\r\nexport function ConferenceDialog() {\r\n\tconst state = useSDKState();\r\n\tconst { showToast } = useToast();\r\n\r\n\tconst [conferenceCallEndAll, setConferenceCallEndAll] = useState(false);\r\n\t// End Conference collects a disposition first, exactly like End Call does\r\n\t// (callControls' EndCallDispositionDialog): ENDCONFERENCE tears the whole\r\n\t// bridge down and the backend pushes IDLE straight after, so firing it\r\n\t// directly recorded the call with no agent disposition at all.\r\n\tconst [openConferenceDisposition, setOpenConferenceDisposition] = useState(false);\r\n\r\n\tconst handleClose = () => {\r\n\t\tsdkStateManager.setOpenConferenceDialog(false);\r\n\t};\r\n\r\n\t// `data` is what the disposition dialog collected; a caller that passes\r\n\t// nothing sends the hangup with every disposition field empty — same as End\r\n\t// Call's skip.\r\n\tconst onEndAllConferenceCalls = (data?: {\r\n\t\tdisposition: { label: string; value: string; id?: number };\r\n\t\tfollowUp: { label: string; value: string };\r\n\t\tcallbackDate: string;\r\n\t\tcallbackHrs: string;\r\n\t\tcallbackMins: string;\r\n\t\tselected_break?: boolean;\r\n\t\tbreak_type?: string;\r\n\t\tnotes?: string;\r\n\t}) => {\r\n\t\tsetConferenceCallEndAll(true);\r\n\r\n\t\t// The break picked on the form, which this hangup applies itself — same\r\n\t\t// contract as the plain End Call path in callControls.tsx. Empty when the box\r\n\t\t// was ticked with nothing picked, and the backend names the break.\r\n\t\tconst pickedBreak = data?.selected_break\r\n\t\t\t? String(data?.break_type ?? \"\").trim()\r\n\t\t\t: \"\";\r\n\r\n\t\tconst payload = {\r\n\t\t\t// Ordinary hangup body (same shape callControls' handleEndCall posts —\r\n\t\t\t// CONFERENCE_CALL_END_ALL is the same /cti/calls/hangup endpoint) …\r\n\t\t\tcall_id: state.callData?.call_id ?? \"\",\r\n\t\t\tagent_id: state.agentId ?? \"\",\r\n\t\t\tset_followUp: data?.followUp?.value ?? \"\",\r\n\t\t\tcallback_date: data?.callbackDate ?? \"\",\r\n\t\t\tcallback_hrs: Number(data?.callbackHrs) || 0,\r\n\t\t\tcallback_mins: Number(data?.callbackMins) || 0,\r\n\t\t\tmobile_number: state.callData?.phone_number ?? \"\",\r\n\t\t\tlist_comments: data?.notes ?? \"\",\r\n\t\t\tcall_reference_id: state.callData?.call_id ?? \"\",\r\n\t\t\tis_mark_as_break: data?.selected_break ?? false,\r\n\t\t\tbreak_type: pickedBreak,\r\n\t\t\tdisposition: data?.disposition?.value ?? \"\",\r\n\t\t\tline_number: 0,\r\n\t\t\treason: \"normal\",\r\n\t\t\t// … plus the EXTERNAL_CONFERENCE / ENDCONFERENCE fields this button has\r\n\t\t\t// always sent, so the whole bridge still comes down.\r\n\t\t\taction: \"EXTERNAL_CONFERENCE\",\r\n\t\t\toperation: \"ENDCONFERENCE\",\r\n\t\t\tuserid: state.agentId ?? \"\",\r\n\t\t\tprocess: state.callData?.process_name ?? \"\",\r\n\t\t\tprocessid: state.process?.process_id?.toString() ?? \"\",\r\n\t\t\tprocess_name: state.process?.process_name ?? \"\",\r\n\t\t\tcallreferenceid: state.callData?.call_id ?? \"\",\r\n\t\t};\r\n\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_END_ALL, payload)\r\n\t\t\t.then(() => {\r\n\t\t\t\tshowToast(\"Call disconnected successfully\", \"success\");\r\n\t\t\t\t// Dropped only once the hangup is acknowledged — a failed post leaves the\r\n\t\t\t\t// draft in place so a reload still finds what the agent typed.\r\n\t\t\t\tclearDispoDraft(payload.call_id);\r\n\t\t\t\tsdkStateManager.resetConferenceLines();\r\n\t\t\t\tif (payload.is_mark_as_break) {\r\n\t\t\t\t\t// The break the agent picked on the form, else the one they last took,\r\n\t\t\t\t\t// else none — the backend applied the break itself and its next frame\r\n\t\t\t\t\t// names it. No invented label here: this value is re-posted as\r\n\t\t\t\t\t// break_type on reconnect and unload.\r\n\t\t\t\t\tconst breakName = resolveBreakName(pickedBreak, savedBreakName());\r\n\t\t\t\t\tsdkStateManager.updateCallData({\r\n\t\t\t\t\t\tstatus: \"BREAK\",\r\n\t\t\t\t\t\tcall_id: \"\",\r\n\t\t\t\t\t\tphone_number: \"\",\r\n\t\t\t\t\t\tbreak_details: breakName ? { type: breakName, value: breakName } : null,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tsdkStateManager.setAgentStatus(breakName);\r\n\t\t\t\t\trememberBreakName(breakName);\r\n\t\t\t\t}\r\n\t\t\t\tsetOpenConferenceDisposition(false);\r\n\t\t\t\thandleClose();\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetConferenceCallEndAll(false);\r\n\t\t\t});\r\n\t};\r\n\r\n\t// The End Conference click itself: open the disposition dialog, whose Submit\r\n\t// sends the ENDCONFERENCE hangup above with the chosen disposition attached.\r\n\t// The SDK always collects a disposition here: `disposition:disabled` gates the\r\n\t// iframe dialer only, so breakOnly below is never set for an SDK host.\r\n\tconst handleEndConferenceClick = () => {\r\n\t\tsetOpenConferenceDisposition(true);\r\n\t};\r\n\r\n\tconst handleTransferConferenceCall = () => {\r\n\t\tconst payload = {\r\n\t\t\taction: \"TRANSFERAPI\",\r\n\t\t\tuserid: state.agentId ?? \"\",\r\n\t\t\tprocess: state.callData?.process_name ?? \"\",\r\n\t\t\tprocessid: state.process?.process_id?.toString() ?? \"\",\r\n\t\t\tprocess_name: state.process?.process_name ?? \"\",\r\n\t\t\tcallreferenceid: state.callData?.call_id ?? \"\",\r\n\t\t\tcall_id: state.callData?.call_id ?? \"\",\r\n\t\t\tmobile_number: state.callData?.phone_number ?? \"\",\r\n\t\t};\r\n\r\n\t\taxiosInstance\r\n\t\t\t.post(END_POINT.CONFERENCE_CALL_TRANSFER, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\tsdkStateManager.resetConferenceLines();\r\n\t\t\t\thandleClose();\r\n\t\t\t\t// âœ… FIX: Do NOT call sdkStateManager.endCall() here.\r\n\t\t\t\t// The WebSocket will push the correct WRAPUP event â€” let it drive state.\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tconst message =\r\n\t\t\t\t\terr.response?.data?.detail ||\r\n\t\t\t\t\terr.response?.data?.message ||\r\n\t\t\t\t\terr.message ||\r\n\t\t\t\t\t\"An unknown error occurred\";\r\n\t\t\t\tshowToast(message, \"error\");\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst isLineDialing = state?.conferenceLine?.some((item) => item?.status === CallStatus.DIALING);\r\n\tconst conferenceLineCount =\r\n\t\tstate?.conferenceLine?.filter((item) => item?.status === CallStatus.CONFERENCE)?.length ?? 0;\r\n\r\n\tconst isHold = state?.conferenceLine?.some((item) => item?.status === CallStatus.HOLD);\r\n\tconst isOnCall = state?.conferenceLine?.some((item) => item?.status === CallStatus.ONCALL);\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={state.openConferenceDialog}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t\tslotProps={{ paper: { sx: { minWidth: 800 } } }}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"0px 16px\",\r\n\t\t\t\t\t\t\tpaddingBottom: \"6px\",\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 2px #e7e5e5ff\",\r\n\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\tcolor=\"primary.main\"\r\n\t\t\t\t\t\t\tsx={{ textTransform: \"uppercase\", fontWeight: \"bold\", fontSize: \"14px\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{state?.agentId ?? \"\"} conference\r\n\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t{/* <Button\r\n\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\tonClick={handleTransferConferenceCall}\r\n\t\t\t\t\t\t\t\tdisabled={conferenceLineCount <= 1 || isHold || isLineDialing || isOnCall}\r\n\t\t\t\t\t\t\t\tstartIcon={<TransferWithinAStation />}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tExit Conference\r\n\t\t\t\t\t\t\t</Button> */}\r\n\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\tonClick={handleClose}\r\n\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<Close sx={{ color: \"primary.main\" }} />\r\n\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 2px #e7e5e5ff\",\r\n\t\t\t\t\t\t\tmargin: \"0px 15px\",\r\n\t\t\t\t\t\t\tborderRadius: \"20px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<TableContainer\r\n\t\t\t\t\t\t\tcomponent={Paper}\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\toutline: \"0px solid gray !important\",\r\n\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 6px #e7e5e5ff\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<Table sx={{ border: \"4px solid #ffffff !important\" }}>\r\n\t\t\t\t\t\t\t\t<TableHead>\r\n\t\t\t\t\t\t\t\t\t<TableRow sx={{ border: \"2px solid #f3f3f3ff !important\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ padding: \"6px\" }}>Line</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ padding: \"6px\" }}>Status</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ padding: \"6px\" }}>Mobile Number</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ padding: \"6px\" }}>Call Actions</TableCell>\r\n\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t</TableHead>\r\n\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t{state?.conferenceLine.map((each: any) => (\r\n\t\t\t\t\t\t\t\t\t\t<ConferenceTableRow key={each.line} each={each} isLineDialing={isLineDialing} />\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t</TableBody>\r\n\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t</TableContainer>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t<Box sx={{ textAlign: \"center\", m: 2 }}>\r\n\t\t\t\t\t\t<Tooltip title={state.sdkConfig?.disableEndConference ? \"End Conference feature is disabled\" : \"\"}>\r\n\t\t\t\t\t\t\t<Box component=\"span\">\r\n\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\t\t\tonClick={handleEndConferenceClick}\r\n\t\t\t\t\t\t\t\t\tdisabled={conferenceCallEndAll || conferenceLineCount <= 0 || state.sdkConfig?.disableEndConference}\r\n\t\t\t\t\t\t\t\t\tsx={{ px: 2, borderRadius: \"20px\", textTransform: \"capitalize\" }}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{conferenceCallEndAll ? (\r\n\t\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\t\tsize=\"20px\"\r\n\t\t\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{ marginRight: \"8px\" }}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\tdisabled={!!state.sdkConfig?.disableEndConference}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: state.sdkConfig?.disableEndConference ? \"action.disabledBackground\" : \"error.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: state.sdkConfig?.disableEndConference ? \"action.disabledBackground\" : \"error.dark\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\tmarginRight: \"8px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth: \"28px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\theight: \"28px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"white\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"50%\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<PhoneDisabled sx={{ color: state.sdkConfig?.disableEndConference ? \"action.disabled\" : \"white\", fontSize: \"16px\", fontWeight: \"600\" }} />\r\n\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\tEnd Conference\r\n\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t\t{/* Same dialog End Call uses — its Submit posts the ENDCONFERENCE\r\n\t\t\t    hangup with the chosen disposition. */}\r\n\t\t\t{openConferenceDisposition && (\r\n\t\t\t\t<EndCallDispositionDialog\r\n\t\t\t\t\topen={openConferenceDisposition}\r\n\t\t\t\t\tsetOpen={setOpenConferenceDisposition}\r\n\t\t\t\t\tonSubmitDisposition={onEndAllConferenceCalls}\r\n\t\t\t\t\tbreakOnly={!!state.sdkConfig?.disableCallDisposition}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t</>\r\n\t);\r\n}\r\n\r\nexport function CallTransferDialog({ open }: any) {\r\n\tconst state = useSDKState();\r\n\tconst { showToast } = useToast();\r\n\tconst [mobileNumber, setMobileNumber] = useState(\"\");\r\n\r\n\t// âœ… FIX: Removed sdkStateManager.endCall() and sdkStateManager.resetConferenceLines()\r\n\t// from onSuccess. These were forcing the initial agent to IDLE immediately on the\r\n\t// client side, before the WebSocket pushed the correct WRAPUP event.\r\n\t// For a blind transfer the server will push:\r\n\t//   - Initial agent  â†’ WRAPUP  (via WebSocket)\r\n\t//   - Transferred-to agent â†’ RINGING â†’ ONCALL  (via WebSocket)\r\n\t// We must NOT touch local call state here â€” only close the dialog.\r\n\tconst [transferCall, { isLoading: isTransferLoading }] = usePostRequest<TransferCallRequest>({\r\n\t\tonSuccess: () => {\r\n\t\t\t// Close dialog only. Let WebSocket events drive all state transitions.\r\n\t\t\tsdkStateManager.setOpenCallTransferDialog(false);\r\n\t\t},\r\n\t});\r\n\r\n\tconst [initiateConsultCall] = usePostRequest<any>({});\r\n\r\n\tconst [completeConsultTransfer, { isLoading: isCompleteConsultLoading }] = usePostRequest<any>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setConsultInfo(null);\r\n\t\t\tsdkStateManager.setOpenCallTransferDialog(false);\r\n\t\t},\r\n\t});\r\n\r\n\tconst [cancelConsultTransfer, { isLoading: isCancelConsultLoading }] = usePostRequest<any>({\r\n\t\tonSuccess: () => {\r\n\t\t\tsdkStateManager.setConsultInfo(null);\r\n\t\t},\r\n\t});\r\n\r\n\tconst [currentselecteTab, setCurrentselecteTab] = useState(\"queues\");\r\n\tconst [transferMenuAnchor, setTransferMenuAnchor] = useState<null | HTMLElement>(null);\r\n\tconst [pendingTransferData, setPendingTransferData] = useState<{ data: any; type: string } | null>(null);\r\n\r\n\tconst blindEnabled = !state.sdkConfig?.disableBlindTransfer;\r\n\tconst attendedEnabled = !state.sdkConfig?.disableAttendedTransfer;\r\n\tconst enabledTransferModeCount = (blindEnabled ? 1 : 0) + (attendedEnabled ? 1 : 0);\r\n\tconst singleTransferMode: \"DEFAULT\" | \"CONSULT\" | null =\r\n\t\tenabledTransferModeCount === 1 ? (blindEnabled ? \"DEFAULT\" : \"CONSULT\") : null;\r\n\r\n\tconst [getIdelAgentsList, { data: idleAgentsList, isLoading: isIdleAgentsListLoading }] =\r\n\t\tusePostRequest<any>({ disabledSuccessToast: true });\r\n\r\n\tconst [\r\n\t\tgetHospitalsServicesList,\r\n\t\t{ data: hospitalsServicesList, isLoading: isHospitalsServicesListLoading },\r\n\t] = useGetRequest<any>({ disabledSuccessToast: true });\r\n\r\n\tconst [\r\n\t\tgetProcessAndQueuesList,\r\n\t\t{ data: processAndQueuesList, isLoading: isProcessAndQueuesListLoading },\r\n\t] = usePostRequest<{\r\n\t\tstatus: string;\r\n\t\tactive: boolean;\r\n\t\tprocess?: any[];\r\n\t\tqueue?: any[];\r\n\t}>({ disabledSuccessToast: true });\r\n\r\n\tconst handleClose = () => {\r\n\t\tsdkStateManager.setOpenCallTransferDialog(false);\r\n\t};\r\n\r\n\tconst handleTransferCall = (data: any, type: string, mode: \"CONSULT\" | \"DEFAULT\" = \"DEFAULT\") => {\r\n\t\tconst lead_data = sdkStateManager.getTransferLeadData();\r\n\t\tif (type === \"PROCESS\") {\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\",\r\n\t\t\t\tuserid: state.agentId,\r\n\t\t\t\ttype: \"PROCESS\",\r\n\t\t\t\ttransfer_to: data?.process_name ?? \"\",\r\n\t\t\t\tcallreferenceid: state.callData?.call_id ?? \"\",\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"),\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\",\r\n\t\t\t\t...(lead_data !== undefined && { lead_data }),\r\n\t\t\t};\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t} else if (type === \"QUEUE\") {\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\",\r\n\t\t\t\tuserid: state.agentId,\r\n\t\t\t\ttype: \"QUEUE\",\r\n\t\t\t\ttransfer_to: data?.queue_name ?? \"\",\r\n\t\t\t\tcallreferenceid: state.callData?.call_id ?? \"\",\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"),\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\",\r\n\t\t\t\t...(lead_data !== undefined && { lead_data }),\r\n\t\t\t};\r\n\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t} else if (type === \"AGENT\") {\r\n\t\t\tconst payload = {\r\n\t\t\t\tmobile_number: state.callData?.phone_number ?? \"\",\r\n\t\t\t\tuserid: state.agentId,\r\n\t\t\t\ttype: \"AGENT\",\r\n\t\t\t\ttransfer_type: mode === \"CONSULT\" ? \"ATTENDED\" : \"BLIND\",\r\n\t\t\t\ttransfer_to: data?.user_id?.toString() ?? \"\",\r\n\t\t\t\tcallreferenceid: state.callData?.call_id ?? \"\",\r\n\t\t\t\tprocessid: String(state.callData?.process_id ?? \"\"),\r\n\t\t\t\tprocess_name: state.callData?.process_name ?? \"\",\r\n\t\t\t\t...(lead_data !== undefined && { lead_data }),\r\n\t\t\t};\r\n\t\t\tif (mode === \"CONSULT\") {\r\n\t\t\t\tinitiateConsultCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t\t} else {\r\n\t\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t\t}\r\n\t\t} else if (type === \"OTHER\") {\r\n\t\t\t// Re-checked here and not only on the field's button: the transfer-mode menu\r\n\t\t\t// is armed from a row click as well, and a number the dial plan would mangle\r\n\t\t\t// must never reach the API — it answers with a success message even when it\r\n\t\t\t// drops the transfer.\r\n\t\t\tconst numberError = getTransferNumberError(data?.mobile_number ?? \"\");\r\n\t\t\tif (numberError) {\r\n\t\t\t\tshowToast(numberError, \"error\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst payload = {\r\n\t\t\t\t// action: mode === \"CONSULT\" ? \"ATTENDED\" : \"BLIND_TRANSFER\",\r\n\t\t\t\ttransfer_type: mode === \"CONSULT\" ? \"ATTENDED\" : \"BLIND\",\r\n\t\t\t\ttype: \"OTHER\",\r\n\t\t\t\ttransfer_to: normalizeDialNumber(data?.mobile_number ?? \"\"),\r\n\t\t\t\tuserid: state.agentId,\r\n\t\t\t\tcallreferenceid: state.callData?.call_id ?? \"\",\r\n\t\t\t\t// blind_transfer_no: data?.mobile_number ?? \"\",\r\n\t\t\t\t...(lead_data !== undefined && { lead_data }),\r\n\t\t\t};\r\n\t\t\tif (mode === \"CONSULT\") {\r\n\t\t\t\tinitiateConsultCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t\t} else {\r\n\t\t\t\ttransferCall(END_POINT.TRANSFER_CALL, payload);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst handleTransferClick = (e: React.MouseEvent<HTMLElement>, data: any, type: string) => {\r\n\t\tif (singleTransferMode) {\r\n\t\t\thandleTransferCall(data, type, singleTransferMode);\r\n\t\t} else {\r\n\t\t\tsetPendingTransferData({ data, type });\r\n\t\t\tsetTransferMenuAnchor(e.currentTarget);\r\n\t\t}\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tgetIdelAgentsList(END_POINT.AGENTS_LIST, { status: \"IDLE\", active: true });\r\n\t\tgetProcessAndQueuesList(END_POINT.TRANSFER_TO_DETAILS, { status: \"ACTIVE\", active: true });\r\n\t\tgetHospitalsServicesList(END_POINT.HOSPITALS_SERVICES);\r\n\t}, []);\r\n\r\n\t// Auto-refresh the idle agents list every 3s, but only while the dialog is\r\n\t// open and the Agents tab is selected. The list is volatile (agents go\r\n\t// idle/busy constantly), so we keep it fresh; the interval is torn down as\r\n\t// soon as the user leaves the tab or closes the dialog.\r\n\tuseEffect(() => {\r\n\t\tif (!open || currentselecteTab !== \"agents\") return;\r\n\t\tconst intervalId = setInterval(() => {\r\n\t\t\tgetIdelAgentsList(END_POINT.AGENTS_LIST, { status: \"IDLE\", active: true });\r\n\t\t}, 2000);\r\n\t\treturn () => clearInterval(intervalId);\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [open, currentselecteTab]);\r\n\r\n\t// Only block the dialog with the loader on the *initial* agents fetch. Once\r\n\t// we have data, background refreshes update the list silently (no flicker).\r\n\tconst idleAgentsLoaderActive = isIdleAgentsListLoading && !idleAgentsList?.data;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tmaxWidth={\"lg\"}\r\n\t\t\t\tslotProps={{ paper: { sx: { minWidth: 900 } } }}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t\tposition: \"relative\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\" sx={{ flex: 1 }}> Call Transfer</Typography>\r\n\t\t\t\t\t\t<Box sx={{ position: \"absolute\", left: \"50%\", transform: \"translateX(-50%)\" }}>\r\n\t\t\t\t\t\t\t{state.consultInfo && (state.consultInfo.status?.toUpperCase() as CallStatus) === CallStatus.RINGING && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t<Typography variant=\"body1\" sx={{ whiteSpace: \"nowrap\" }}>\r\n\t\t\t\t\t\t\t\t\t\tTrying to consult\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t<Box component=\"span\" sx={{ display: \"inline-flex\", gap: \"3px\", alignItems: \"flex-end\", height: \"14px\" }}>\r\n\t\t\t\t\t\t\t\t\t\t{[0, 1, 2].map((i) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box key={i} component=\"span\" sx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"@keyframes jumpDot\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"0%, 60%, 100%\": { transform: \"translateY(0)\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"30%\": { transform: \"translateY(-5px)\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\tanimation: \"jumpDot 1s ease-in-out infinite\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tanimationDelay: `${i * 0.15}s`,\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"14px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: 700,\r\n\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"inline-block\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}>.</Box>\r\n\t\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t{state.consultInfo && (state.consultInfo.status?.toUpperCase() as CallStatus) === CallStatus.ONCALL && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tstartIcon={isCompleteConsultLoading ? <CircularProgress size={14} /> : <TransferWithinAStation sx={{ fontSize: 16 }} />}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={isCompleteConsultLoading || isCancelConsultLoading}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tif (state.consultInfo) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tcompleteConsultTransfer(END_POINT.TRANSFER_COMPLETE, {}, {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tparams: { call_uuid: state.consultInfo.call_uuid },\r\n\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\tTransfer\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\t\t\t\tstartIcon={isCancelConsultLoading ? <CircularProgress size={14} /> : <PhoneDisabled sx={{ fontSize: 16 }} />}\r\n\t\t\t\t\t\t\t\t\t\tdisabled={isCancelConsultLoading || isCompleteConsultLoading}\r\n\t\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\t\tif (state.consultInfo) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tcancelConsultTransfer(END_POINT.TRANSFER_CANCEL, {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstatus: state.consultInfo.status,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tparticipant_identifier: state.consultInfo.participant_identifier,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tchannel_id: state.consultInfo.channel_id,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcall_uuid: state.consultInfo.call_uuid,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbridge_id: state.consultInfo.bridge_id,\r\n\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\tCancel\r\n\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t<Box sx={{ flex: 1, display: \"flex\", justifyContent: \"flex-end\" }}>\r\n\t\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<Box sx={{ margin: \"10px\", borderRadius: \"10px\" }}>\r\n\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 1, margin: \"10px\" }}>\r\n\t\t\t\t\t\t\t{/* <Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"process\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => setCurrentselecteTab(\"process\")}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tProcess\r\n\t\t\t\t\t\t\t</Button> */}\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"queues\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => setCurrentselecteTab(\"queues\")}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tQueues\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"agents\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tsetCurrentselecteTab(\"agents\");\r\n\t\t\t\t\t\t\t\t\tgetIdelAgentsList(END_POINT.AGENTS_LIST, { status: \"IDLE\", active: true });\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tAgents\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t{/* {!state.sdkConfig?.disableBlindTransfer && ( */}\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant={currentselecteTab === \"others\" ? \"contained\" : \"outlined\"}\r\n\t\t\t\t\t\t\t\tonClick={() => setCurrentselecteTab(\"others\")}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tOthers\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t{/* )} */}\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t{(isProcessAndQueuesListLoading ||\r\n\t\t\t\t\t\t\tidleAgentsLoaderActive ||\r\n\t\t\t\t\t\t\tisHospitalsServicesListLoading ||\r\n\t\t\t\t\t\t\tisTransferLoading) && (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\theight: \"80px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<CircularProgress />\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!idleAgentsLoaderActive &&\r\n\t\t\t\t\t\t\t!isHospitalsServicesListLoading &&\r\n\t\t\t\t\t\t\t!isTransferLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"process\" && (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\t\t\t\tgridTemplateColumns:\r\n\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process &&\r\n\t\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.length > 0\r\n\t\t\t\t\t\t\t\t\t\t\t\t? \"repeat(2, 1fr)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t: \"repeat(1, 1fr)\",\r\n\t\t\t\t\t\t\t\t\t\tgap: 1,\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\r\n\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{processAndQueuesList?.data?.process &&\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.length > 0 ? (\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.map((process: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<MemoryOutlined sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{process.process_name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Tooltip title={state.consultInfo ? \"Please complete or cancel the ongoing consult transfer before proceeding.\" : \"\"}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!!state.consultInfo}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleTransferCall(process, \"PROCESS\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tflexDirection: \"column\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tp: 2,\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<Upcoming color=\"primary\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"primary.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: \"20px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\tNo Process Found\r\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!idleAgentsLoaderActive &&\r\n\t\t\t\t\t\t\t!isHospitalsServicesListLoading &&\r\n\t\t\t\t\t\t\t!isTransferLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"queues\" && (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\t\t\t\tgridTemplateColumns:\r\n\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue &&\r\n\t\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue?.length > 0\r\n\t\t\t\t\t\t\t\t\t\t\t\t? \"repeat(2, 1fr)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t: \"repeat(1, 1fr)\",\r\n\t\t\t\t\t\t\t\t\t\tgap: 1,\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\r\n\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{processAndQueuesList?.data?.queue &&\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue?.length > 0 ? (\r\n\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.queue?.map((queue: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Airlines sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{queue.queue_name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{processAndQueuesList?.data?.process?.find(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t(process: any) => process.process_id === queue.process_id\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t)?.process_name ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcomponent=\"span\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"12px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\"(\" +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprocessAndQueuesList?.data?.process?.find(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(process: any) => process.process_id === queue.process_id\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)?.process_name +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\")\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Tooltip title={state.consultInfo ? \"Please complete or cancel the ongoing consult transfer before proceeding.\" : \"\"}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!!state.consultInfo}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleTransferCall(queue, \"QUEUE\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tflexDirection: \"column\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tp: 2,\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<Upcoming color=\"primary\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"primary.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: \"20px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\tNo Queues Found\r\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!idleAgentsLoaderActive &&\r\n\t\t\t\t\t\t\t!isHospitalsServicesListLoading &&\r\n\t\t\t\t\t\t\t!isTransferLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"agents\" && (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\t\t\t\tgridTemplateColumns:\r\n\t\t\t\t\t\t\t\t\t\t\tidleAgentsList?.data && idleAgentsList?.data?.length > 0\r\n\t\t\t\t\t\t\t\t\t\t\t\t? \"repeat(2, 1fr)\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t: \"repeat(1, 1fr)\",\r\n\t\t\t\t\t\t\t\t\t\tgap: 1,\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\r\n\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{idleAgentsList?.data && idleAgentsList?.data?.length > 0 ? (\r\n\t\t\t\t\t\t\t\t\t\tidleAgentsList?.data?.map((agent: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{agent.name}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Tooltip title={state.consultInfo ? \"Please complete or cancel the ongoing consult transfer before proceeding.\" : \"\"}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!!state.consultInfo}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleTransferClick(e, agent, \"AGENT\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tflexDirection: \"column\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tp: 2,\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t<Upcoming color=\"primary\" />\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"primary.main\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\theight: \"20px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\tNo Agents Found\r\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t{!isProcessAndQueuesListLoading &&\r\n\t\t\t\t\t\t\t!idleAgentsLoaderActive &&\r\n\t\t\t\t\t\t\t!isHospitalsServicesListLoading &&\r\n\t\t\t\t\t\t\t!isTransferLoading &&\r\n\t\t\t\t\t\t\tcurrentselecteTab === \"others\" && (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\t\t\t\tgridTemplateColumns: \"repeat(2, 1fr)\",\r\n\t\t\t\t\t\t\t\t\t\tgap: 1,\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tflexWrap: \"wrap\",\r\n\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{hospitalsServicesList?.data &&\r\n\t\t\t\t\t\t\t\t\t\thospitalsServicesList?.data?.length > 0 &&\r\n\t\t\t\t\t\t\t\t\t\thospitalsServicesList?.data?.map((service: any, index: any) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Roofing sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Tooltip title={`${service?.description ?? \"\"}`}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Box sx={{ color: \"text.secondary\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{service.name}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"9px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: \"600\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.02em\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"gray\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: \"nowrap\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"160px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{service?.description ?? \"\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Tooltip title={state.consultInfo ? \"Please complete or cancel the ongoing consult transfer before proceeding.\" : getServicePhoneNumber(service)}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!!state.consultInfo}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleTransferClick(e, { mobile_number: getServicePhoneNumber(service) }, \"OTHER\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{(() => {\r\n\t\t\t\t\t\t\t\t\t\t\tconst transferNumber = normalizeDialNumber(mobileNumber);\r\n\t\t\t\t\t\t\t\t\t\t\t// Compared on the normalized form so 91/+91 variants of the number already\r\n\t\t\t\t\t\t\t\t\t\t\t// on the call are caught too.\r\n\t\t\t\t\t\t\t\t\t\t\tconst isSameAsActiveCall =\r\n\t\t\t\t\t\t\t\t\t\t\t\t!!transferNumber &&\r\n\t\t\t\t\t\t\t\t\t\t\t\ttransferNumber === normalizeDialNumber(state.callData?.phone_number ?? \"\");\r\n\t\t\t\t\t\t\t\t\t\t\tconst numberError = getTransferNumberError(mobileNumber);\r\n\t\t\t\t\t\t\t\t\t\t\tconst transferDisabled =\r\n\t\t\t\t\t\t\t\t\t\t\t\t!!state.consultInfo || !!numberError || isSameAsActiveCall;\r\n\t\t\t\t\t\t\t\t\t\t\tconst tooltipTitle = state.consultInfo\r\n\t\t\t\t\t\t\t\t\t\t\t\t? \"Please complete or cancel the ongoing consult transfer before proceeding.\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t: isSameAsActiveCall\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Cannot transfer to the same number\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t: numberError\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? numberError\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `Call To - ${transferNumber}`;\r\n\t\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname=\"others\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel=\"Phone number\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={mobileNumber}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\terror={isSameAsActiveCall || (!!mobileNumber && !!numberError)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thelperText={\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisSameAsActiveCall\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"Cannot transfer to the same number\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: mobileNumber\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? numberError\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetMobileNumber(e.target.value);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thtmlInput: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmaxLength: 50,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tformHelperText: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: \"normal\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twordBreak: \"break-word\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: 1.2,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmx: 0,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"e.g. 080-69200202, 9876543210\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tautoComplete=\"off\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Tooltip title={tooltipTitle}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor=\"success\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={transferDisabled}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"action.hover\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => handleTransferClick(e, { mobile_number: mobileNumber ?? \"\" }, \"OTHER\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Call />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t})()}\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\r\n\t\t\t{/* Transfer Mode Menu */}\r\n\t\t\t<Menu\r\n\t\t\t\tanchorEl={transferMenuAnchor}\r\n\t\t\t\topen={Boolean(transferMenuAnchor)}\r\n\t\t\t\tonClose={() => setTransferMenuAnchor(null)}\r\n\t\t\t\tanchorOrigin={{ vertical: \"top\", horizontal: \"left\" }}\r\n\t\t\t\ttransformOrigin={{ vertical: \"bottom\", horizontal: \"left\" }}\r\n\t\t\t>\r\n\t\t\t\t{blindEnabled && (\r\n\t\t\t\t\t<MenuItem\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\tif (pendingTransferData) handleTransferCall(pendingTransferData.data, pendingTransferData.type, \"DEFAULT\");\r\n\t\t\t\t\t\t\tsetTransferMenuAnchor(null);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tsx={{ gap: 1 }}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<TransferWithinAStation fontSize=\"small\" color=\"primary\" />\r\n\t\t\t\t\t\tTransfer\r\n\t\t\t\t\t</MenuItem>\r\n\t\t\t\t)}\r\n\t\t\t\t{attendedEnabled && (\r\n\t\t\t\t\t<MenuItem\r\n\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\tif (pendingTransferData) handleTransferCall(pendingTransferData.data, pendingTransferData.type, \"CONSULT\");\r\n\t\t\t\t\t\t\tsetTransferMenuAnchor(null);\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tsx={{ gap: 1 }}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<RecordVoiceOver fontSize=\"small\" color=\"primary\" />\r\n\t\t\t\t\t\tConsult then Transfer\r\n\t\t\t\t\t</MenuItem>\r\n\t\t\t\t)}\r\n\t\t\t</Menu>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n// Persistent label shown ABOVE a field (browser-phone parity) so every field\r\n// stays identified even when empty — clearer than MUI's floating labels.\r\nfunction DispoFieldLabel({ children }: { children: React.ReactNode }) {\r\n\treturn (\r\n\t\t<Typography\r\n\t\t\tvariant=\"caption\"\r\n\t\t\tsx={{ display: \"block\", textAlign: \"left\", fontWeight: 600, fontSize: \"0.8rem\", color: \"text.secondary\", mb: 0.5 }}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</Typography>\r\n\t);\r\n}\r\n\r\n// Read a break row the tolerant way the presence menu does (readBreakType in\r\n// callControls.tsx, breakTypeOf in the browser phone): `type` is what the backend\r\n// sends and what the hangup's `break_type` expects, the rest are consulted only\r\n// when it is absent — so an envelope variant the menu renders fine still fills\r\n// this picker.\r\nfunction readBreakRowType(row: any): string {\r\n\tif (!row) return \"\";\r\n\tif (typeof row === \"string\") return row;\r\n\treturn String(row.type || row.break_type || row.name || row.value || \"\");\r\n}\r\n\r\n// A system-managed break row. The break schemas are CamelCaseModel, so the flag\r\n// may arrive either spelling — read both rather than trusting one.\r\nfunction isSystemBreakRow(row: any): boolean {\r\n\tif (!row || typeof row === \"string\") return false;\r\n\treturn Boolean(row.is_system || row.isSystem);\r\n}\r\n\r\n// breakOnly strips the dialog down to the one thing that isn't a disposition —\r\n// Mark as break — and Submit hangs the call up with an empty code. Nothing in the\r\n// SDK sets it any more: `disposition:disabled` gates the iframe dialer only, so\r\n// SDK hosts always get the full disposition form.\r\nexport function EndCallDispositionDialog({ open, setOpen, onSubmitDisposition, breakOnly = false }: any) {\r\n\tconst { hasPermission } = useSDKPermissions();\r\n\tconst sdkState = useSDKState();\r\n\tconst canMarkAsBreak =\r\n\t\thasPermission(SDK_PERMISSIONS.DISPOSITION_MARK_AS_BREAK) ||\r\n\t\thasPermission(SDK_PERMISSIONS.WILDCARD);\r\n\r\n\t// The call the draft belongs to, pinned in a ref on the first render that has\r\n\t// one — the call id is blanked the moment the hangup succeeds, and the draft\r\n\t// must not follow it to an empty key while the dialog is still up.\r\n\tconst liveCallId = dispoCallIdFrom(sdkState);\r\n\tconst draftIdRef = useRef(\"\");\r\n\tif (liveCallId && !draftIdRef.current) draftIdRef.current = liveCallId;\r\n\tconst draftId = draftIdRef.current;\r\n\r\n\t// Disposition hierarchy state (browser-phone parity): the built forest, the path\r\n\t// of nodes the agent has drilled into, and a stale mandatory-notes error flag.\r\n\tconst [dispoTree, setDispoTree] = useState<DispoNode[]>([]);\r\n\tconst [dispoPath, setDispoPath] = useState<DispoNode[]>([]);\r\n\tconst [notesError, setNotesError] = useState(false);\r\n\r\n\t// Saved draft for this call, read once at mount (the lazy initialiser keeps the\r\n\t// storage hit off every render). The scalars can be applied straight away; the\r\n\t// picked path has to wait for the tree.\r\n\tconst [savedDraft] = useState<DispoDraft | null>(() => readDispoDraft(draftId));\r\n\tconst [draftRestored, setDraftRestored] = useState(\r\n\t\t() => !!savedDraft && (!!savedDraft.notes.trim() || savedDraft.path.length > 0)\r\n\t);\r\n\t// Autosave stays parked until the restore has finished, otherwise the first\r\n\t// save would write the component's empty defaults back over the saved draft.\r\n\tconst [draftReady, setDraftReady] = useState(false);\r\n\r\n\tconst [formData, setFormData] = useState({\r\n\t\tdisposition: { label: \"\", value: \"\", id: 0 },\r\n\t\tfollowUp: savedDraft?.followUp === \"Y\"\r\n\t\t\t? { label: \"Yes\", value: \"Y\" }\r\n\t\t\t: { label: \"No\", value: \"N\" },\r\n\t\tcallbackDate: savedDraft?.callbackDate ?? \"\",\r\n\t\tcallbackHrs: savedDraft?.callbackHrs ?? \"\",\r\n\t\tcallbackMins: savedDraft?.callbackMins ?? \"\",\r\n\t\tselected_break: savedDraft?.selected_break ?? false,\r\n\t\t// The break \"Mark as break\" is for. Restored with the tick, so reopening the\r\n\t\t// dialog doesn't quietly turn a named break back into an unnamed one.\r\n\t\tbreak_type: savedDraft?.break_type ?? \"\",\r\n\t\tnotes: savedDraft?.notes ?? \"\",\r\n\t});\r\n\r\n\t// The tenant's agent-selectable breaks, for the picker the tick opens. Same\r\n\t// source and same filtering as the presence menu (see the breaks fetch in\r\n\t// callControls.tsx): GET /cti/breaks with include_system=true, system rows\r\n\t// dropped — those are the backend's own, what a fresh login is parked on, never\r\n\t// something the agent picks at the end of a call.\r\n\tconst [breakRows, setBreakRows] = useState<string[]>([]);\r\n\tconst [breakPickerOpen, setBreakPickerOpen] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\t// No checkbox means no picker means nothing to fetch.\r\n\t\tif (!canMarkAsBreak) return;\r\n\t\tlet cancelled = false;\r\n\t\taxiosInstance\r\n\t\t\t.get(END_POINT.BREAKS_LIST, { params: { include_system: true } })\r\n\t\t\t.then((res) => {\r\n\t\t\t\tif (cancelled) return;\r\n\t\t\t\t// { data: [...] } is what this route sends; a bare array is read too, so\r\n\t\t\t\t// an envelope variant still fills the list.\r\n\t\t\t\tconst rows = (Array.isArray(res?.data) ? res.data : res?.data?.data ?? []) as any[];\r\n\t\t\t\tsetBreakRows(\r\n\t\t\t\t\trows.filter((row) => !isSystemBreakRow(row)).map(readBreakRowType).filter(Boolean)\r\n\t\t\t\t);\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\t// An empty picker is a state it says out loud, and the tick still works —\r\n\t\t\t\t// the hangup's own is_mark_as_break puts the agent on the backend's\r\n\t\t\t\t// default break. No toast: the agent asked to end a call, not for a\r\n\t\t\t\t// breaks list. axiosInstance rather than useGetRequest for that reason.\r\n\t\t\t\tconsole.error(\"❌ Failed to load the breaks list:\", err);\r\n\t\t\t});\r\n\t\treturn () => {\r\n\t\t\tcancelled = true;\r\n\t\t};\r\n\t}, [canMarkAsBreak]);\r\n\r\n\t// Ticking the box is the question \"which break?\" — so ask it straight away\r\n\t// rather than let the agent submit a break they never named (the iframe dialer\r\n\t// asks the same question the same way). Unticking drops the pick with it.\r\n\tconst handleMarkAsBreak = (checked: boolean) => {\r\n\t\tsetFormData((prev) => ({\r\n\t\t\t...prev,\r\n\t\t\tselected_break: checked,\r\n\t\t\tbreak_type: checked ? prev.break_type : \"\",\r\n\t\t}));\r\n\t\tsetBreakPickerOpen(checked);\r\n\t};\r\n\r\n\t// Leaving the picker with nothing picked is the agent backing out of the tick\r\n\t// that opened it, so the box goes with it: staying ticked would send them on a\r\n\t// break they just declined to choose. A picker reopened from the chip already\r\n\t// has a pick, so that close leaves everything alone.\r\n\tconst closeBreakPicker = () => {\r\n\t\tsetBreakPickerOpen(false);\r\n\t\tsetFormData((prev) =>\r\n\t\t\tprev.selected_break && !prev.break_type ? { ...prev, selected_break: false } : prev\r\n\t\t);\r\n\t};\r\n\r\n\tconst pickBreak = (type: string) => {\r\n\t\tsetFormData((prev) => ({ ...prev, selected_break: true, break_type: type }));\r\n\t\tsetBreakPickerOpen(false);\r\n\t};\r\n\r\n\tconst followUpOptions = [\r\n\t\t{ label: \"Yes\", value: \"Y\" },\r\n\t\t{ label: \"No\", value: \"N\" },\r\n\t];\r\n\r\n\tconst handleChange = (\r\n\t\tfield: keyof typeof formData,\r\n\t\tvalue: { label: string } | null | string | boolean\r\n\t) => {\r\n\t\tsetFormData((prev) => ({ ...prev, [field]: value }));\r\n\t};\r\n\r\n\tconst handleReset = () => {\r\n\t\tsetFormData({\r\n\t\t\tdisposition: { label: \"\", value: \"\", id: 0 },\r\n\t\t\tfollowUp: { label: \"No\", value: \"N\" },\r\n\t\t\tcallbackDate: \"\",\r\n\t\t\tcallbackHrs: \"\",\r\n\t\t\tcallbackMins: \"\",\r\n\t\t\tselected_break: false,\r\n\t\t\tbreak_type: \"\",\r\n\t\t\tnotes: \"\",\r\n\t\t});\r\n\t\tsetDispoPath([]);\r\n\t\tsetNotesError(false);\r\n\t\tsetBreakPickerOpen(false);\r\n\t};\r\n\r\n\t// Discard: the only way to drop a draft short of submitting. Emptying the form\r\n\t// is enough — autosave persists the empty state, which reopens blank.\r\n\tconst handleClearDraft = () => {\r\n\t\thandleReset();\r\n\t\tsetDraftRestored(false);\r\n\t};\r\n\r\n\t// Closing no longer resets. The dialog is modal, so stepping away to check\r\n\t// something means closing it first — wiping here is exactly what used to lose\r\n\t// the agent's work. The draft stays in sessionStorage and the next open\r\n\t// rehydrates from it.\r\n\tconst handleClose = () => {\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\t// Fetch the disposition hierarchy once.\r\n\tuseEffect(() => {\r\n\t\t// Nothing to pick in break-only mode — don't spend the round trip. No tree\r\n\t\t// means no path to restore, so autosave can start immediately.\r\n\t\tif (breakOnly) {\r\n\t\t\tsetDraftReady(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet cancelled = false;\r\n\t\t(async () => {\r\n\t\t\tconst tree = await loadDispoTree();\r\n\t\t\tif (cancelled) return;\r\n\t\t\tsetDispoTree(tree);\r\n\t\t\t// The saved path is a list of disposition codes — resolve it against the\r\n\t\t\t// tree we just built, then let autosave take over.\r\n\t\t\tsetDispoPath(resolveDispoPath(tree, savedDraft?.path ?? []));\r\n\t\t\tsetDraftReady(true);\r\n\t\t})();\r\n\t\treturn () => { cancelled = true; };\r\n\t}, []);\r\n\r\n\t// One draft at a time: sweep the keys of calls that ended without a Submit.\r\n\t// Skipped without a call id — \"keep nothing\" would sweep the live draft too.\r\n\tuseEffect(() => {\r\n\t\tif (draftId) pruneDispoDrafts(draftId);\r\n\t}, [draftId]);\r\n\r\n\t// Autosave. Runs on every edit — the payload is a few hundred bytes, so a\r\n\t// synchronous write per keystroke is cheaper than the debounce would be.\r\n\tuseEffect(() => {\r\n\t\tif (!draftReady || !draftId) return;\r\n\t\twriteDispoDraft(draftId, {\r\n\t\t\tpath: dispoPath.map((n) => n.code),\r\n\t\t\tfollowUp: formData.followUp?.value === \"Y\" ? \"Y\" : \"N\",\r\n\t\t\tcallbackDate: formData.callbackDate,\r\n\t\t\tcallbackHrs: formData.callbackHrs,\r\n\t\t\tcallbackMins: formData.callbackMins,\r\n\t\t\tselected_break: formData.selected_break,\r\n\t\t\tbreak_type: formData.break_type,\r\n\t\t\tnotes: formData.notes,\r\n\t\t});\r\n\t}, [draftReady, draftId, dispoPath, formData]);\r\n\r\n\t// Notes are mandatory when any node on the chosen path sets requiresNotes — a\r\n\t// parent marked that way means notes for its whole subtree.\r\n\tconst notesRequired = dispoPath.some((n) => n.requiresNotes);\r\n\r\n\t// Picking a level truncates any deeper selections, then appends the new choice.\r\n\tconst pickDispo = (level: number, picked: DispoNode | null) => {\r\n\t\tsetDispoPath((prev) => {\r\n\t\t\tconst next = prev.slice(0, level);\r\n\t\t\tif (picked) next.push(picked);\r\n\t\t\treturn next;\r\n\t\t});\r\n\t\tsetNotesError(false);\r\n\t};\r\n\r\n\t// The submitted disposition is the deepest node the agent picked; its code goes\r\n\t// out as disposition.value (unchanged shape for handleEndCall).\r\n\tconst handleSubmit = () => {\r\n\t\tconst picked = dispoPath[dispoPath.length - 1];\r\n\t\t// Picking a disposition is optional: a parent is submittable on its own, and\r\n\t\t// so is nothing at all — an agent who has no code to give still has to be able\r\n\t\t// to end the call, so an unpicked path goes out with an empty disposition.\r\n\t\tif (notesRequired && !formData.notes.trim()) {\r\n\t\t\tsetNotesError(true);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tonSubmitDisposition({\r\n\t\t\t...formData,\r\n\t\t\t// Only ever the break that goes WITH a tick. An untidy draft (ticked,\r\n\t\t\t// picked, unticked again) must not leave a break type on a hangup that\r\n\t\t\t// isn't marking a break at all.\r\n\t\t\tbreak_type: formData.selected_break ? formData.break_type : \"\",\r\n\t\t\tdisposition: picked\r\n\t\t\t\t? { label: picked.name, value: picked.code, id: 0 }\r\n\t\t\t\t: { label: \"\", value: \"\", id: 0 },\r\n\t\t});\r\n\t};\r\n\r\n\t// Breadcrumb of the chosen path + a leaf/parent hint (browser-phone parity).\r\n\tconst selectedNode = dispoPath[dispoPath.length - 1] || null;\r\n\t// Submit is live whatever the picker holds — no selection at all is allowed and\r\n\t// posts an empty disposition. Only mandatory notes still hold it down, and they\r\n\t// do so up front rather than failing on click — same rule the iframe softphone\r\n\t// applies.\r\n\tconst notesBlocked = notesRequired && !formData.notes.trim();\r\n\tconst submitBlocked = notesBlocked;\r\n\t// Anything worth keeping across a close — also what makes Discard worth offering.\r\n\tconst hasDraftContent = Boolean(\r\n\t\tdispoPath.length ||\r\n\t\tformData.notes.trim() ||\r\n\t\tformData.selected_break ||\r\n\t\tformData.followUp?.value === \"Y\" ||\r\n\t\tformData.callbackDate\r\n\t);\r\n\tconst submitBlockReason = notesBlocked ? \"Notes are required for this disposition\" : \"\";\r\n\tconst dispoBreadcrumb = dispoPath.map((n) => n.name).join(\" › \");\r\n\tconst dispoHint = selectedNode\r\n\t\t? selectedNode.children.length\r\n\t\t\t? `Submitting \"${selectedNode.name}\" — pick a ${dispoLevelLabel(dispoPath.length).toLowerCase()} if you want to be more specific.`\r\n\t\t\t: \"Leaf reached — this path is complete.\"\r\n\t\t: \"\";\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tmaxWidth={\"sm\"}\r\n\t\t\t\tfullWidth\r\n\t\t\t\tslotProps={{ paper: { sx: { minWidth: 600, borderRadius: 3, maxHeight: \"85vh\" } } }}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tminWidth: '650px'\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t<Paper\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tborderRadius: 3,\r\n\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\tflexDirection: \"column\",\r\n\t\t\t\t\t\tmaxHeight: \"85vh\",\r\n\t\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{/* Heading — pinned above the scroll area */}\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tflexShrink: 0,\r\n\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\tpy: 1.5,\r\n\t\t\t\t\t\t\tborderBottom: \"1px solid\",\r\n\t\t\t\t\t\t\tborderColor: \"divider\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tvariant=\"h6\"\r\n\t\t\t\t\t\t\tsx={{ fontWeight: 600, color: \"text.primary\", fontSize: \"1.05rem\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{breakOnly ? \"End Call\" : \"Call Disposition\"}\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t{/* Says why the form isn't empty. Without it a restored draft reads as\r\n\t\t\t\t\t\t    the dialog having kept stale data from somewhere unexplained. */}\r\n\t\t\t\t\t\t{draftRestored && !breakOnly && (\r\n\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\tvariant=\"caption\"\r\n\t\t\t\t\t\t\t\tsx={{ display: \"block\", mt: 0.25, color: \"text.secondary\" }}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tRestored what you had entered for this call.\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{/* Scrollable body — a deep hierarchy adds a picker per level, so the\r\n\t\t\t\t\t    form scrolls while the heading and the actions row stay pinned. */}\r\n\t\t\t\t\t<Box sx={{ flex: 1, minHeight: 0, overflowY: \"auto\", p: 1.5, textAlign: \"left\" }}>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{/* Cascading disposition levels: Disposition → Sub- → Sub-Sub- … one\r\n\t\t\t\t\t\t    picker per level, the next revealed once the level above is chosen.\r\n\t\t\t\t\t\t    Absent entirely in break-only mode. */}\r\n\t\t\t\t\t\t{!breakOnly && (\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tsx={{ display: \"flex\", flexDirection: \"column\", gap: 2 }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{(() => {\r\n\t\t\t\t\t\t\t\tconst levels: React.ReactNode[] = [];\r\n\t\t\t\t\t\t\t\tlet siblings: DispoNode[] = dispoTree;\r\n\t\t\t\t\t\t\t\tlet depth = 0;\r\n\t\t\t\t\t\t\t\twhile (siblings.length) {\r\n\t\t\t\t\t\t\t\t\tconst chosen = dispoPath[depth] || null;\r\n\t\t\t\t\t\t\t\t\tconst options = siblings;\r\n\t\t\t\t\t\t\t\t\tconst level = depth;\r\n\t\t\t\t\t\t\t\t\tlevels.push(\r\n\t\t\t\t\t\t\t\t\t\t<Box key={level}>\r\n\t\t\t\t\t\t\t\t\t\t\t<DispoFieldLabel>{dispoLevelLabel(level)}</DispoFieldLabel>\r\n\t\t\t\t\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={chosen}\r\n\t\t\t\t\t\t\t\t\t\t\t\toptions={options}\r\n\t\t\t\t\t\t\t\t\t\t\t\tgetOptionLabel={(opt) => (opt ? opt.name : \"\")}\r\n\t\t\t\t\t\t\t\t\t\t\t\tisOptionEqualToValue={(opt, val) => opt?.key === val?.key}\r\n\t\t\t\t\t\t\t\t\t\t\t\tonChange={(_, picked) => pickDispo(level, picked)}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={`Select ${dispoLevelLabel(level).toLowerCase()}…`}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\tif (!chosen) break;\r\n\t\t\t\t\t\t\t\t\tsiblings = chosen.children;\r\n\t\t\t\t\t\t\t\t\tdepth++;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (!levels.length) {\r\n\t\t\t\t\t\t\t\t\tlevels.push(\r\n\t\t\t\t\t\t\t\t\t\t<Box key=\"loading\">\r\n\t\t\t\t\t\t\t\t\t\t\t<DispoFieldLabel>Disposition</DispoFieldLabel>\r\n\t\t\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tvalue=\"\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled\r\n\t\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Loading dispositions…\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\treturn levels;\r\n\t\t\t\t\t\t\t})()}\r\n\t\t\t\t\t\t\t{dispoPath.length > 0 && (\r\n\t\t\t\t\t\t\t\t<Box sx={{ mt: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tpx: 1.5,\r\n\t\t\t\t\t\t\t\t\t\t\tpy: 1,\r\n\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"8px\",\r\n\t\t\t\t\t\t\t\t\t\t\tbgcolor: \"#e6f4f1\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontSize: \"0.8rem\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontWeight: 500,\r\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"text.primary\",\r\n\t\t\t\t\t\t\t\t\t\t\twordBreak: \"break-word\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{dispoBreadcrumb}\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t{dispoHint && (\r\n\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"caption\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"block\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmt: 0.5,\r\n\t\t\t\t\t\t\t\t\t\t\t\t// Amber only for the one thing that still blocks Submit —\r\n\t\t\t\t\t\t\t\t\t\t\t\t// an un-drilled parent is a valid choice now, not a warning.\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: notesRequired ? \"warning.main\" : \"text.secondary\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{dispoHint}\r\n\t\t\t\t\t\t\t\t\t\t\t{notesRequired ? \" Notes are required for this disposition.\" : \"\"}\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t{/* Follow up and its callback fields are part of the disposition this\r\n\t\t\t\t\t\t    agent isn't allowed to give — gone in break-only mode. */}\r\n\t\t\t\t\t\t{!breakOnly && (\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tsx={{ display: \"flex\", gap: 2, mt: 2 }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<Box sx={{ flex: 1 }}>\r\n\t\t\t\t\t\t\t\t<DispoFieldLabel>Follow up</DispoFieldLabel>\r\n\t\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\t\toptions={followUpOptions}\r\n\t\t\t\t\t\t\t\t\tgetOptionLabel={(opt) => opt.label}\r\n\t\t\t\t\t\t\t\t\tvalue={formData.followUp}\r\n\t\t\t\t\t\t\t\t\tonChange={(_, val) => handleChange(\"followUp\", val)}\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Select follow up\"\r\n\t\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\tsx={{ display: \"flex\", gap: 2, mt: 2 }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{/* <Autocomplete\r\n\t\t\t\t\t\t\t\toptions={breakOptions}\r\n\t\t\t\t\t\t\t\tgetOptionLabel={(opt) => opt.label}\r\n\t\t\t\t\t\t\t\tvalue={formData.selected_break}\r\n\t\t\t\t\t\t\t\tonChange={(_, val) => handleChange(\"selected_break\", val)}\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\t\t{...params}\r\n\t\t\t\t\t\t\t\t\t\tlabel=\"Break\"\r\n\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\tsx={{ flex: 1 }}\r\n\t\t\t\t\t\t\t/> */}\r\n\r\n\t\t\t\t\t\t\t{canMarkAsBreak && (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tflex: \"1\",\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tgap: 1,\r\n\t\t\t\t\t\t\t\t\t\tpr: 1,\r\n\t\t\t\t\t\t\t\t\t\tborder: \"1px solid #bdbdbd\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"5px\",\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t\t<Checkbox\r\n\t\t\t\t\t\t\t\t\t\t\tname=\"selected_break\"\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tchecked={formData.selected_break}\r\n\t\t\t\t\t\t\t\t\t\t\tonChange={(event) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\thandleMarkAsBreak(event.target.checked);\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tinput: { \"aria-label\": \"controlled\" },\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t/>{\" \"}\r\n\t\t\t\t\t\t\t\t\t\tMark as break\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t{/* Which break the tick is for. A button rather than a label, so\r\n\t\t\t\t\t\t\t\t\t    changing your mind doesn't mean unticking and re-ticking.\r\n\t\t\t\t\t\t\t\t\t    Ticked with nothing picked is a real state (no breaks\r\n\t\t\t\t\t\t\t\t\t    configured, or a restored draft that only carried the flag) —\r\n\t\t\t\t\t\t\t\t\t    it says so rather than sitting blank. */}\r\n\t\t\t\t\t\t\t\t\t{formData.selected_break && (\r\n\t\t\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => setBreakPickerOpen(true)}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\tml: \"auto\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"none\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"55%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\twhiteSpace: \"nowrap\",\r\n\t\t\t\t\t\t\t\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t\t\t\t\t\t\t\t\ttextOverflow: \"ellipsis\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tdisplay: \"block\",\r\n\t\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{formData.break_type || \"Choose break\"}\r\n\t\t\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t{formData?.followUp?.label?.toLowerCase() === \"yes\" ? (\r\n\t\t\t\t\t\t\t\t<Box sx={{ flex: 1 }}>\r\n\t\t\t\t\t\t\t\t<DispoFieldLabel>Callback date</DispoFieldLabel>\r\n\t\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\ttype=\"date\"\r\n\t\t\t\t\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\t\t\t\t\thtmlInput: {\r\n\t\t\t\t\t\t\t\t\t\t\tmin: new Date().toISOString().split(\"T\")[0],\r\n\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackDate}\r\n\t\t\t\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\t\t\t\thandleChange(\"callbackDate\", e.target.value);\r\n\t\t\t\t\t\t\t\t\t\tconst isToday = e.target.value === new Date().toISOString().split(\"T\")[0];\r\n\t\t\t\t\t\t\t\t\t\tif (isToday) {\r\n\t\t\t\t\t\t\t\t\t\t\tconst now = new Date();\r\n\t\t\t\t\t\t\t\t\t\t\tconst currentHr = now.getHours();\r\n\t\t\t\t\t\t\t\t\t\t\tif (formData.callbackHrs && Number(formData.callbackHrs) < currentHr) {\r\n\t\t\t\t\t\t\t\t\t\t\t\thandleChange(\"callbackHrs\", \"\");\r\n\t\t\t\t\t\t\t\t\t\t\t\thandleChange(\"callbackMins\", \"\");\r\n\t\t\t\t\t\t\t\t\t\t\t} else if (formData.callbackHrs && Number(formData.callbackHrs) === currentHr && formData.callbackMins && Number(formData.callbackMins) < now.getMinutes()) {\r\n\t\t\t\t\t\t\t\t\t\t\t\thandleChange(\"callbackMins\", \"\");\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t) : (breakOnly || !canMarkAsBreak) ? null : (\r\n\t\t\t\t\t\t\t\t// Spacer that keeps the checkbox on its half of the row. Break-only\r\n\t\t\t\t\t\t\t\t// mode has no callback field to reserve room for.\r\n\t\t\t\t\t\t\t\t<Box sx={{ flex: 1 }}></Box>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t{formData?.followUp?.label?.toLowerCase() === \"yes\" && (\r\n\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\tsx={{ display: \"flex\", gap: 2, mt: 2 }}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<Box sx={{ flex: 1 }}>\r\n\t\t\t\t\t\t\t\t<DispoFieldLabel>Hrs</DispoFieldLabel>\r\n\t\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\toptions={Array.from({ length: 24 }, (_, i) => String(i).padStart(2, \"0\"))}\r\n\t\t\t\t\t\t\t\t\tgetOptionDisabled={(option) => {\r\n\t\t\t\t\t\t\t\t\t\tconst isToday = formData.callbackDate === new Date().toISOString().split(\"T\")[0];\r\n\t\t\t\t\t\t\t\t\t\treturn isToday && Number(option) < new Date().getHours();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackHrs || null}\r\n\t\t\t\t\t\t\t\t\tonChange={(_, value) => handleChange(\"callbackHrs\", value || \"\")}\r\n\t\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t\t<TextField {...params} placeholder=\"Hrs\" />\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t<Box sx={{ flex: 1 }}>\r\n\t\t\t\t\t\t\t\t<DispoFieldLabel>Mins</DispoFieldLabel>\r\n\t\t\t\t\t\t\t\t<Autocomplete\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\toptions={Array.from({ length: 60 }, (_, i) => String(i).padStart(2, \"0\"))}\r\n\t\t\t\t\t\t\t\t\tgetOptionDisabled={(option) => {\r\n\t\t\t\t\t\t\t\t\t\tconst isToday = formData.callbackDate === new Date().toISOString().split(\"T\")[0];\r\n\t\t\t\t\t\t\t\t\t\tconst now = new Date();\r\n\t\t\t\t\t\t\t\t\t\tconst isCurrentHr = isToday && formData.callbackHrs === String(now.getHours()).padStart(2, \"0\");\r\n\t\t\t\t\t\t\t\t\t\treturn isCurrentHr && Number(option) < now.getMinutes();\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tvalue={formData.callbackMins || null}\r\n\t\t\t\t\t\t\t\t\tonChange={(_, value) => handleChange(\"callbackMins\", value || \"\")}\r\n\t\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t\t<TextField {...params} placeholder=\"Mins\" />\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t{/* Notes describe the disposition — nothing to describe in break-only\r\n\t\t\t\t\t\t    mode, so the field goes with it. */}\r\n\t\t\t\t\t\t{!breakOnly && (\r\n\t\t\t\t\t\t<Box sx={{ mt: 2 }}>\r\n\t\t\t\t\t\t\t<DispoFieldLabel>{notesRequired ? \"Notes *\" : \"Notes\"}</DispoFieldLabel>\r\n\t\t\t\t\t\t\t<TextField\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\tplaceholder={notesRequired ? \"Notes are required for this disposition\" : \"Notes (optional)\"}\r\n\t\t\t\t\t\t\t\tmultiline\r\n\t\t\t\t\t\t\t\tminRows={2}\r\n\t\t\t\t\t\t\t\tmaxRows={4}\r\n\t\t\t\t\t\t\t\tvalue={formData.notes}\r\n\t\t\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\t\t\thandleChange(\"notes\", e.target.value);\r\n\t\t\t\t\t\t\t\t\tif (notesError) setNotesError(false);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\terror={notesError}\r\n\t\t\t\t\t\t\t\t// Stated as soon as the requirement applies, not only after a\r\n\t\t\t\t\t\t\t\t// failed click — Submit is disabled until it's satisfied, so the\r\n\t\t\t\t\t\t\t\t// click that used to explain it never happens.\r\n\t\t\t\t\t\t\t\thelperText={notesBlocked ? \"Notes are required for this disposition.\" : \"\"}\r\n\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tflexShrink: 0,\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tjustifyContent: \"flex-end\",\r\n\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\tpy: 1.5,\r\n\t\t\t\t\t\t\tborderTop: \"1px solid\",\r\n\t\t\t\t\t\t\tborderColor: \"divider\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{/* Close keeps the draft now, so discarding needs its own control —\r\n\t\t\t\t\t\t    otherwise a half-filled form would be unclearable short of\r\n\t\t\t\t\t\t    submitting it. */}\r\n\t\t\t\t\t\t{hasDraftContent && !breakOnly && (\r\n\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\tvariant=\"text\"\r\n\t\t\t\t\t\t\t\tcolor=\"inherit\"\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\tonClick={handleClearDraft}\r\n\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\tmr: \"auto\",\r\n\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\tcolor: \"text.secondary\",\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tDiscard draft\r\n\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\tonClick={handleClose}\r\n\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tclose\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t{/* Always live — a disposition is optional, so an empty picker\r\n\t\t\t\t\t\t    submits an empty code. Only unfilled mandatory notes block it. */}\r\n\t\t\t\t\t\t<Tooltip title={submitBlockReason}>\r\n\t\t\t\t\t\t\t<Box component=\"span\">\r\n\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\tvariant=\"contained\"\r\n\t\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\t\tsize=\"large\"\r\n\t\t\t\t\t\t\t\t\tonClick={handleSubmit}\r\n\t\t\t\t\t\t\t\t\tdisabled={submitBlocked}\r\n\t\t\t\t\t\t\t\t\t// Holds the primary on hover instead of dropping to\r\n\t\t\t\t\t\t\t\t\t// primary.dark — the shade change read as the button\r\n\t\t\t\t\t\t\t\t\t// changing colour rather than as a hover affordance.\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\ttextTransform: \"capitalize\",\r\n\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"primary.main\" },\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\tSubmit\r\n\t\t\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\r\n\t\t\t{/* The break picker, opened BY the card when the agent ticks \"Mark as\r\n\t\t\t    break\" and closed again the moment a break is picked.\r\n\r\n\t\t\t    A dialog of its own rather than a menu anchored inside the card: the\r\n\t\t\t    card is itself a modal with its own scrolling body, which would clip a\r\n\t\t\t    popover. This sits above it and leaves the disposition the agent has\r\n\t\t\t    already filled in untouched underneath. */}\r\n\t\t\t<Dialog\r\n\t\t\t\topen={breakPickerOpen}\r\n\t\t\t\tonClose={closeBreakPicker}\r\n\t\t\t\tmaxWidth=\"xs\"\r\n\t\t\t\tfullWidth\r\n\t\t\t\tslotProps={{ paper: { sx: { borderRadius: 3 } } }}\r\n\t\t\t\tsx={{ zIndex: 99999 }}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 3 }}>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\tpy: 1.5,\r\n\t\t\t\t\t\t\tborderBottom: \"1px solid\",\r\n\t\t\t\t\t\t\tborderColor: \"divider\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tvariant=\"h6\"\r\n\t\t\t\t\t\t\tsx={{ fontWeight: 600, color: \"text.primary\", fontSize: \"1.05rem\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tSelect a break\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t<Box sx={{ py: 1, maxHeight: \"50vh\", overflowY: \"auto\" }}>\r\n\t\t\t\t\t\t{breakRows.length === 0 ? (\r\n\t\t\t\t\t\t\t// The same stance the presence menu takes: no fabricated rows. Why\r\n\t\t\t\t\t\t\t// the list is empty (none configured, or a refused request, which\r\n\t\t\t\t\t\t\t// is in the console) doesn't change what the agent can do here —\r\n\t\t\t\t\t\t\t// the tick still works, and the backend names the break.\r\n\t\t\t\t\t\t\t<MenuItem disabled sx={{ whiteSpace: \"normal\" }}>\r\n\t\t\t\t\t\t\t\tNo breaks configured. Submitting still marks you on break.\r\n\t\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\tbreakRows.map((type) => (\r\n\t\t\t\t\t\t\t\t<MenuItem\r\n\t\t\t\t\t\t\t\t\tkey={type}\r\n\t\t\t\t\t\t\t\t\tonClick={() => pickBreak(type)}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tbackgroundColor:\r\n\t\t\t\t\t\t\t\t\t\t\tformData.break_type === type ? \"primary.main\" : \"transparent\",\r\n\t\t\t\t\t\t\t\t\t\tcolor: formData.break_type === type ? \"white\" : \"primary.main\",\r\n\t\t\t\t\t\t\t\t\t\t\":hover\": {\r\n\t\t\t\t\t\t\t\t\t\t\tbackgroundColor:\r\n\t\t\t\t\t\t\t\t\t\t\t\tformData.break_type === type ? \"primary.dark\" : \"selected.hover\",\r\n\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t- {type}\r\n\t\t\t\t\t\t\t\t</MenuItem>\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"flex-end\",\r\n\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\tpy: 1.5,\r\n\t\t\t\t\t\t\tborderTop: \"1px solid\",\r\n\t\t\t\t\t\t\tborderColor: \"divider\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\tcolor=\"error\"\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\tonClick={closeBreakPicker}\r\n\t\t\t\t\t\t\tsx={{ px: 2, borderRadius: \"10px\", textTransform: \"capitalize\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tcancel\r\n\t\t\t\t\t\t</Button>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\nexport function ProcessorListDialog({\r\n\topen,\r\n\tsetOpen,\r\n\tprocessList = null,\r\n\thandleSelectedProcessor,\r\n}: any) {\r\n\tconst handleClose = () => {\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tmaxWidth={false}\r\n\t\t\t\tslotProps={{ paper: { sx: { minWidth: 500 } } }}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Process List</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tpadding: \"6px 10px\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{processList.length > 0 ?\r\n\t\t\t\t\t\t\tprocessList?.map((process: any, index: any) => (\r\n\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\tkey={index}\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tp: 1,\r\n\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\t\t\t\tpadding: \"6px\",\r\n\t\t\t\t\t\t\t\t\t\tmargin: \"10px 0px\",\r\n\t\t\t\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\t\t\t\tcursor: \"pointer\",\r\n\t\t\t\t\t\t\t\t\t\t\"&:hover\": { bgcolor: \"action.selected\" },\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\t\thandleSelectedProcessor(process);\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\tvariant=\"body1\"\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tmx: 1,\r\n\t\t\t\t\t\t\t\t\t\t\twidth: \"200px\",\r\n\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"250px\",\r\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<SupportAgent sx={{ marginRight: \"4px\" }} />\r\n\t\t\t\t\t\t\t\t\t\t{process.process_name}\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t: null}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\nexport function CallHistoryDialog({ open, setOpen }: any) {\r\n\tconst handleClose = () => {\r\n\t\tsetOpen(false);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<Dialog\r\n\t\t\t\topen={open}\r\n\t\t\t\taria-labelledby=\"alert-dialog-title\"\r\n\t\t\t\taria-describedby=\"alert-dialog-description\"\r\n\t\t\t\tmaxWidth={\"md\"}\r\n\t\t\t\tslotProps={{ paper: { sx: { minWidth: 500 } } }}\r\n\t\t\t>\r\n\t\t\t\t<Paper sx={{ borderRadius: 2 }}>\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\tjustifyContent: \"space-between\",\r\n\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\tpadding: \"4px 16px\",\r\n\t\t\t\t\t\t\tboxShadow: \"0px 1px 2px #f5f5f5ff\",\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Typography variant=\"body1\"> Call History</Typography>\r\n\t\t\t\t\t\t<IconButton onClick={handleClose}>\r\n\t\t\t\t\t\t\t<Close />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tboxShadow: \"1px 1px 4px #d3d3d3ff\",\r\n\t\t\t\t\t\t\tmargin: \"10px\",\r\n\t\t\t\t\t\t\tborderRadius: \"10px\",\r\n\t\t\t\t\t\t\ttextAlign: \"center\",\r\n\t\t\t\t\t\t\tfontSize: \"16px\",\r\n\t\t\t\t\t\t\tfontWeight: \"bold\",\r\n\t\t\t\t\t\t\tp: 6,\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tComing Soon...\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Paper>\r\n\r\n\t\t\t</Dialog>\r\n\t\t</>\r\n\t);\r\n}\r\n","/**\r\n * Disposition hierarchy + draft store.\r\n *\r\n * Extracted out of `components/dialog.tsx` so the three surfaces that now touch a\r\n * disposition all agree on one model:\r\n *\r\n *  1. The SDK End Call dialog (`EndCallDispositionDialog`).\r\n *  2. The CRM screen's Disposition tab, which stages a disposition mid-call.\r\n *  3. The hosted Browser-Phone iframe, which gets the draft relayed to it by\r\n *     postMessage (it is a different origin and cannot read this sessionStorage).\r\n *\r\n * There is no API to record a disposition mid-call — the only endpoint that\r\n * stores one is the hangup itself — so everything here is a *staging* area. The\r\n * hangup remains the single moment a disposition is committed.\r\n */\r\n\r\nimport axiosInstance from \"../services/axios\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\n\r\n// ── Hierarchy ────────────────────────────────────────────────────────────────\r\n// \"Disposition\" → \"Sub-Disposition\" → \"Sub-Sub-Disposition\" → … one picker per\r\n// level, built from parent links on the fetched list.\r\n\r\nexport type DispoNode = {\r\n\tkey: string;\r\n\tparentKey: string | null;\r\n\tcode: string;\r\n\tname: string;\r\n\tsortOrder: number;\r\n\trequiresNotes: boolean;\r\n\tchildren: DispoNode[];\r\n};\r\n\r\nexport function dispoLevelLabel(depth: number): string {\r\n\tlet prefix = \"\";\r\n\tfor (let i = 0; i < depth; i++) prefix += \"Sub-\";\r\n\treturn prefix + \"Disposition\";\r\n}\r\n\r\n// Read a field under any of the casings the two disposition endpoints use\r\n// (camelCase from master, snake_case from CTI).\r\nfunction dispoField(d: any, ...keys: string[]): any {\r\n\tfor (const k of keys) {\r\n\t\tconst v = d?.[k];\r\n\t\tif (v !== undefined && v !== null && v !== \"\") return v;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\n// Normalize one row to {key, parentKey, code, name, sortOrder, requiresNotes}.\r\n// Rows without an id are keyed by code, so a list of bare {name, code} still works.\r\nfunction normDispo(d: any): DispoNode {\r\n\tconst id = dispoField(d, \"id\", \"disposition_id\", \"dispositionId\");\r\n\tconst code = String(dispoField(d, \"code\", \"disposition_code\") ?? dispoField(d, \"name\") ?? \"\");\r\n\tconst pid = dispoField(d, \"parentId\", \"parent_id\", \"parentDispositionId\", \"parent_disposition_id\");\r\n\tconst pcode = dispoField(d, \"parentCode\", \"parent_code\");\r\n\treturn {\r\n\t\tkey: id != null ? \"#\" + id : \"c:\" + code,\r\n\t\tparentKey: pid != null ? \"#\" + pid : (pcode ? \"c:\" + pcode : null),\r\n\t\tcode,\r\n\t\tname: String(dispoField(d, \"name\") ?? code ?? \"\"),\r\n\t\tsortOrder: Number(dispoField(d, \"sortOrder\", \"sort_order\") ?? 0),\r\n\t\trequiresNotes: !!dispoField(d, \"requiresNotes\", \"requires_notes\"),\r\n\t\tchildren: [],\r\n\t};\r\n}\r\n\r\nfunction hasSubDispositions(list: any[]): boolean {\r\n\treturn list.some((d) => normDispo(d).parentKey != null);\r\n}\r\n\r\n// Active unless the row explicitly says otherwise. A list that omits the flag\r\n// entirely (e.g. the agent-selectable endpoint) is treated as all-active so we\r\n// never hide everything.\r\nfunction isActiveDispo(d: any): boolean {\r\n\tconst v = dispoField(d, \"isActive\", \"is_active\", \"active\");\r\n\treturn v == null ? true : !!v;\r\n}\r\n\r\nfunction hasNotesFlag(list: any[]): boolean {\r\n\treturn list.some((r) => (\"requiresNotes\" in r) || (\"requires_notes\" in r));\r\n}\r\n\r\n// Assemble the forest. A parent that isn't in the list leaves its children at the\r\n// top level rather than hiding them; a cyclic list degrades to a flat one.\r\nexport function buildDispoTree(list: any[]): DispoNode[] {\r\n\tconst nodes = list.map(normDispo);\r\n\tconst byKey: Record<string, DispoNode> = {};\r\n\tlet roots: DispoNode[] = [];\r\n\tnodes.forEach((n) => { byKey[n.key] = n; });\r\n\tnodes.forEach((n) => {\r\n\t\tconst parent = n.parentKey ? byKey[n.parentKey] : null;\r\n\t\tif (parent && parent !== n) parent.children.push(n); else roots.push(n);\r\n\t});\r\n\tif (!roots.length && nodes.length) { nodes.forEach((n) => { n.children = []; }); roots = nodes; }\r\n\tconst sortLevel = (arr: DispoNode[]) => {\r\n\t\tarr.sort((a, b) => (a.sortOrder - b.sortOrder) || a.name.localeCompare(b.name));\r\n\t\tarr.forEach((n) => sortLevel(n.children));\r\n\t};\r\n\tsortLevel(roots);\r\n\treturn roots;\r\n}\r\n\r\n// GET a disposition list and unwrap the array from whatever envelope it's in.\r\nasync function fetchDispoList(url: string): Promise<any[]> {\r\n\ttry {\r\n\t\tconst res = await axiosInstance.get(url);\r\n\t\tconst body = res?.data;\r\n\t\tconst d = body && body.data !== undefined ? body.data : body;\r\n\t\treturn Array.isArray(d) ? d : (d && Array.isArray(d.data) ? d.data : []);\r\n\t} catch {\r\n\t\treturn [];\r\n\t}\r\n}\r\n\r\n// The CTI list doesn't always carry requiresNotes. Missing, it reads as false and a\r\n// mandatory-notes disposition would submit silently — so borrow the flags from the\r\n// master list, matched on code.\r\nasync function withNotesFlags(list: any[]): Promise<any[]> {\r\n\tif (!list.length || hasNotesFlag(list)) return list;\r\n\tconst master = await fetchDispoList(END_POINT.AGENT_SELECTABLE_DISPOSITIONS);\r\n\tif (!master.length || !hasNotesFlag(master)) return list;\r\n\tconst codeOf = (r: any) => String(r.code || r.name || \"\").toUpperCase();\r\n\tconst flag: Record<string, boolean> = {};\r\n\tmaster.forEach((m: any) => { const c = codeOf(m); if (c) flag[c] = !!(m.requiresNotes || m.requires_notes); });\r\n\treturn list.map((r: any) => {\r\n\t\tconst c = codeOf(r);\r\n\t\treturn Object.prototype.hasOwnProperty.call(flag, c) ? { ...r, requiresNotes: flag[c] } : r;\r\n\t});\r\n}\r\n\r\n/**\r\n * The whole fetch: the CTI endpoint is primary; when it returns a flat list with\r\n * no parent links, read the hierarchy from the master endpoint instead, then\r\n * borrow any missing requiresNotes flags. Never throws — a failed fetch is an\r\n * empty picker, not a dialog that won't open.\r\n */\r\nexport async function loadDispoTree(): Promise<DispoNode[]> {\r\n\tlet list = await fetchDispoList(END_POINT.DISPOSITIONS);\r\n\tif (list.length && !hasSubDispositions(list)) {\r\n\t\tconst alt = await fetchDispoList(END_POINT.AGENT_SELECTABLE_DISPOSITIONS);\r\n\t\tif (hasSubDispositions(alt)) list = alt;\r\n\t}\r\n\tlist = await withNotesFlags(list);\r\n\t// Only offer active dispositions in the picker.\r\n\treturn buildDispoTree(list.filter(isActiveDispo));\r\n}\r\n\r\n/**\r\n * Walk a saved path of disposition **codes** down a freshly built tree.\r\n *\r\n * Codes, not the internal `key`, because the Browser-Phone iframe builds its own\r\n * tree from the same endpoints with its own key scheme — a code path is the only\r\n * identifier both sides agree on. Matching level by level also means a code that\r\n * repeats under different parents still resolves unambiguously.\r\n *\r\n * A code that no longer exists (disposition deactivated between staging it and\r\n * reopening) truncates the path there rather than discarding the whole thing.\r\n */\r\nexport function resolveDispoPath(tree: DispoNode[], codes: string[]): DispoNode[] {\r\n\tconst path: DispoNode[] = [];\r\n\tlet siblings = tree;\r\n\tfor (const code of codes) {\r\n\t\tconst node = siblings.find((n) => n.code === code);\r\n\t\tif (!node) break;\r\n\t\tpath.push(node);\r\n\t\tsiblings = node.children;\r\n\t}\r\n\treturn path;\r\n}\r\n\r\n// ── Draft store ──────────────────────────────────────────────────────────────\r\n// Mirrored into sessionStorage under the call's own id so a disposition survives\r\n// closing the End Call dialog (it is modal — stepping away means closing it),\r\n// navigating the host app, and reloading the tab.\r\n//\r\n// The draft is call-scoped by construction: the key carries the call id, a\r\n// successful hangup clears it, and opening either surface prunes every other\r\n// call's key. sessionStorage (not localStorage) matches every other call-scoped\r\n// value in this codebase — it dies with the tab, the right lifetime for call data.\r\n\r\nconst DISPO_DRAFT_PREFIX = \"ctiDispoDraft:\";\r\n\r\nexport type DispoDraft = {\r\n\t/** Disposition **codes**, outermost level first. See resolveDispoPath. */\r\n\tpath: string[];\r\n\tfollowUp: string;\r\n\tcallbackDate: string;\r\n\tcallbackHrs: string;\r\n\tcallbackMins: string;\r\n\tselected_break: boolean;\r\n\t/**\r\n\t * The break the agent picked for `selected_break`, as a backend break type —\r\n\t * it rides out as the hangup's `break_type`. Optional because a tick with no\r\n\t * pick is a valid draft (a tenant with no breaks configured, or a surface that\r\n\t * only stages the flag); the backend then names the break itself.\r\n\t */\r\n\tbreak_type?: string;\r\n\tnotes: string;\r\n};\r\n\r\nexport const EMPTY_DISPO_DRAFT: DispoDraft = {\r\n\tpath: [],\r\n\tfollowUp: \"N\",\r\n\tcallbackDate: \"\",\r\n\tcallbackHrs: \"\",\r\n\tcallbackMins: \"\",\r\n\tselected_break: false,\r\n\tbreak_type: \"\",\r\n\tnotes: \"\",\r\n};\r\n\r\nexport function isDispoDraftEmpty(d: DispoDraft | null | undefined): boolean {\r\n\tif (!d) return true;\r\n\treturn (\r\n\t\t!d.path.length &&\r\n\t\t!d.notes.trim() &&\r\n\t\t!d.selected_break &&\r\n\t\td.followUp !== \"Y\" &&\r\n\t\t!d.callbackDate\r\n\t);\r\n}\r\n\r\nfunction dispoDraftKey(callId: string): string {\r\n\treturn DISPO_DRAFT_PREFIX + callId;\r\n}\r\n\r\n// Same-document change notification. The End Call dialog and the CRM Disposition\r\n// tab are both mounted in the host app at once, so a write by one has to reach\r\n// the other — without it, whichever mounted first would keep stale values and\r\n// then overwrite the newer draft on its next edit.\r\ntype DispoDraftListener = (callId: string, draft: DispoDraft | null) => void;\r\nconst draftListeners = new Set<DispoDraftListener>();\r\n\r\nexport function subscribeDispoDraft(cb: DispoDraftListener): () => void {\r\n\tdraftListeners.add(cb);\r\n\treturn () => { draftListeners.delete(cb); };\r\n}\r\n\r\nfunction notifyDraft(callId: string, draft: DispoDraft | null): void {\r\n\tdraftListeners.forEach((cb) => {\r\n\t\ttry {\r\n\t\t\tcb(callId, draft);\r\n\t\t} catch {\r\n\t\t\t/* a broken listener must not stop the others */\r\n\t\t}\r\n\t});\r\n}\r\n\r\n// Every accessor is defensive: sessionStorage throws outright in some embedded /\r\n// privacy-mode contexts, and a draft that can't be read is not a reason to break\r\n// the agent's ability to end a call.\r\nexport function readDispoDraft(callId: string): DispoDraft | null {\r\n\tif (!callId || typeof sessionStorage === \"undefined\") return null;\r\n\ttry {\r\n\t\tconst raw = sessionStorage.getItem(dispoDraftKey(callId));\r\n\t\tif (!raw) return null;\r\n\t\treturn coerceDraft(JSON.parse(raw));\r\n\t} catch {\r\n\t\treturn null;\r\n\t}\r\n}\r\n\r\n/** Normalize an untrusted object (parsed JSON, or a postMessage payload). */\r\nexport function coerceDraft(d: any): DispoDraft | null {\r\n\tif (!d || typeof d !== \"object\") return null;\r\n\treturn {\r\n\t\tpath: Array.isArray(d.path) ? d.path.map(String) : [],\r\n\t\tfollowUp: d.followUp === \"Y\" ? \"Y\" : \"N\",\r\n\t\tcallbackDate: String(d.callbackDate ?? \"\"),\r\n\t\tcallbackHrs: String(d.callbackHrs ?? \"\"),\r\n\t\tcallbackMins: String(d.callbackMins ?? \"\"),\r\n\t\tselected_break: !!d.selected_break,\r\n\t\tbreak_type: String(d.break_type ?? \"\"),\r\n\t\tnotes: String(d.notes ?? \"\"),\r\n\t};\r\n}\r\n\r\nexport function writeDispoDraft(callId: string, draft: DispoDraft): void {\r\n\tif (!callId || typeof sessionStorage === \"undefined\") return;\r\n\ttry {\r\n\t\tsessionStorage.setItem(dispoDraftKey(callId), JSON.stringify(draft));\r\n\t} catch {\r\n\t\t/* quota or blocked storage — autosave is best-effort */\r\n\t}\r\n\tnotifyDraft(callId, draft);\r\n}\r\n\r\n/**\r\n * Merge a partial draft. The CRM tab and the End Call dialog edit overlapping but\r\n * different field sets (only the dialog offers \"Mark as break\"), so each writes\r\n * what it owns instead of clobbering the rest.\r\n */\r\nexport function updateDispoDraft(callId: string, patch: Partial<DispoDraft>): DispoDraft {\r\n\tconst next = { ...(readDispoDraft(callId) ?? EMPTY_DISPO_DRAFT), ...patch };\r\n\twriteDispoDraft(callId, next);\r\n\treturn next;\r\n}\r\n\r\nexport function clearDispoDraft(callId: string): void {\r\n\tif (!callId) return;\r\n\tif (typeof sessionStorage !== \"undefined\") {\r\n\t\ttry {\r\n\t\t\tsessionStorage.removeItem(dispoDraftKey(callId));\r\n\t\t} catch {\r\n\t\t\t/* ignore */\r\n\t\t}\r\n\t}\r\n\tnotifyDraft(callId, null);\r\n}\r\n\r\n/**\r\n * A call that ended without a Submit (remote hangup, auto-wrapup) leaves its key\r\n * behind. Opening either disposition surface sweeps them, so at most one draft —\r\n * the current call's — is ever live.\r\n *\r\n * Does nothing without a call id: \"keep nothing\" would sweep the live draft too.\r\n */\r\nexport function pruneDispoDrafts(keepCallId: string): void {\r\n\tif (!keepCallId || typeof sessionStorage === \"undefined\") return;\r\n\ttry {\r\n\t\tconst keep = dispoDraftKey(keepCallId);\r\n\t\tconst stale: string[] = [];\r\n\t\tfor (let i = 0; i < sessionStorage.length; i++) {\r\n\t\t\tconst k = sessionStorage.key(i);\r\n\t\t\tif (k && k.startsWith(DISPO_DRAFT_PREFIX) && k !== keep) stale.push(k);\r\n\t\t}\r\n\t\tstale.forEach((k) => sessionStorage.removeItem(k));\r\n\t} catch {\r\n\t\t/* ignore */\r\n\t}\r\n}\r\n\r\n/**\r\n * The call a draft belongs to, from an SDK state snapshot. Same fallback chain the\r\n * hangup-on-unload path uses, so the id a draft is filed under is the id the\r\n * hangup will be posted for.\r\n */\r\nexport function dispoCallIdFrom(state: any): string {\r\n\treturn String(\r\n\t\tstate?.callData?.call_id ||\r\n\t\tstate?.callData?.call_reference_id ||\r\n\t\tstate?.callData?.callReferenceId ||\r\n\t\tstate?.callData?.call_uuid ||\r\n\t\tstate?.rootCallUuid ||\r\n\t\t\"\"\r\n\t);\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,\r\n\tisSuccess: false,\r\n\tisError: false,\r\n\terror: null,\r\n\tdata: null,\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\nexport const useGetRequest = <T = UseGetRequest>(\r\n\tprops: RequestOptions = {}\r\n): [(_url: string, _config?: AxiosRequestConfig) => void, RequestResult<T>] => {\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\tconst { showToast } = useToast();\r\n\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\tconst getRequest = useCallback(\r\n\t\t(url: string, config = {}) => {\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\taxiosInstance\r\n\t\t\t\t.get(url, config)\r\n\t\t\t\t.then((res) => {\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\tonSuccess?.(res.data, config);\r\n\t\t\t\t\t} else {\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\tshowToast(res.data?.message, \"error\");\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\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\tshowToast(error.message, \"error\");\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\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]\r\n\t);\r\n\r\n\treturn [getRequest, state];\r\n};\r\n\r\nexport const usePostRequest = <T = UsePostRequest>(\r\n\tprops: RequestOptions = {}\r\n): [\r\n\t(_url: string, _payload: T, _config?: AxiosRequestConfig) => Promise<any>,\r\n\tRequestResult<T>,\r\n] => {\r\n\tconst { onSuccess = null, onError = null, disabledSuccessToast = false } = props;\r\n\r\n\tconst { showToast } = useToast();\r\n\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\tconst postRequest = useCallback(\r\n\t\tasync (url: string, payload: T, config = {}) => {\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\ttry {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst res = await axiosInstance.post(url, payload, config);\r\n\r\n\t\t\t\t\t// A refusal the backend swallows into a 200 — e.g. /cti/calls/dial\r\n\t\t\t\t\t// answering { success: false, message: \"409: Agent <n> is not\r\n\t\t\t\t\t// available for outbound calls (current status: BREAK).\" } when the\r\n\t\t\t\t\t// agent can't dial. axios only throws on a non-2xx status, so without\r\n\t\t\t\t\t// this the refusal ran the success path: the backend's own error text\r\n\t\t\t\t\t// was shown in a GREEN toast and onSuccess still fired (the dialer\r\n\t\t\t\t\t// cleared the number and closed as though the call had gone out).\r\n\t\t\t\t\t// Only an EXPLICIT `success: false` counts — unlike the GET/PUT/PATCH/\r\n\t\t\t\t\t// DELETE helpers below, which treat a missing `success` as a failure,\r\n\t\t\t\t\t// POST responses here are not all envelope-shaped and a bare 2xx body\r\n\t\t\t\t\t// must stay a success.\r\n\t\t\t\t\tif (res.data?.success === false) {\r\n\t\t\t\t\t\tconst error = {\r\n\t\t\t\t\t\t\tstatus: res.status,\r\n\t\t\t\t\t\t\tmessage:\r\n\t\t\t\t\t\t\t\tres.data?.detail ||\r\n\t\t\t\t\t\t\t\tres.data?.message ||\r\n\t\t\t\t\t\t\t\t\"An unknown error occurred\",\r\n\t\t\t\t\t\t\tdata: res.data ?? null,\r\n\t\t\t\t\t\t\tstatusText: res.statusText ?? \"\",\r\n\t\t\t\t\t\t\tcode: \"\",\r\n\t\t\t\t\t\t\tname: \"\",\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tshowToast(error.message, \"error\");\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: error,\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tonError?.(error, payload);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\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\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\tif (!disabledSuccessToast) {\r\n\t\t\t\t\t\tshowToast(res.data?.message, \"success\");\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (err: any) {\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\tshowToast(error.message, \"error\");\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\tonError?.(error, payload);\r\n\t\t\t\t}\r\n\t\t\t} finally {\r\n\t\t\t\tdispatch({\r\n\t\t\t\t\ttype: \"isLoading\",\r\n\t\t\t\t\tpayload: false,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\t[onSuccess, onError, showToast]\r\n\t);\r\n\r\n\treturn [postRequest, state];\r\n};\r\n\r\nexport const usePutRequest = <T = UsePutRequest>(\r\n\tprops: RequestOptions = {}\r\n): [(_url: string, _payload: T, _config?: AxiosRequestConfig) => void, RequestResult<T>] => {\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\tconst { showToast } = useToast();\r\n\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\tconst putRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\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\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\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\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\t} else {\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\tshowToast(res.data?.message, \"error\");\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\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\tshowToast(error.message, \"error\");\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\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]\r\n\t);\r\n\r\n\treturn [putRequest, state];\r\n};\r\n\r\nexport const useDeleteRequest = <T = UseDeleteRequest>(\r\n\tprops: RequestOptions = {}\r\n): [(_url: string, _config?: AxiosRequestConfig) => void, RequestResult<T>] => {\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\tconst { showToast } = useToast();\r\n\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\tconst deleteRequest = useCallback(\r\n\t\t(url: string, config = {}) => {\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\taxiosInstance\r\n\t\t\t\t.delete(url, config)\r\n\t\t\t\t.then((res) => {\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\tonSuccess?.(res.data, config);\r\n\t\t\t\t\t} else {\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\tshowToast(res.data?.message, \"error\");\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\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\tshowToast(error.message, \"error\");\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\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]\r\n\t);\r\n\r\n\treturn [deleteRequest, state];\r\n};\r\n\r\nexport const usePatchRequest = <T = UsePatchRequest>(\r\n\tprops: RequestOptions = {}\r\n): [(_url: string, _payload: T, _config?: AxiosRequestConfig) => void, RequestResult<T>] => {\r\n\tconst { onSuccess = null, onError = null } = props;\r\n\r\n\tconst { showToast } = useToast();\r\n\r\n\tconst [state, dispatch] = useReducer(reducer, initialState);\r\n\r\n\tconst patchRequest = useCallback(\r\n\t\t(url: string, payload: T, config = {}) => {\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\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\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\tonSuccess?.(res.data, payload);\r\n\t\t\t\t\t} else {\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\tshowToast(res.data?.message, \"error\");\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\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\tshowToast(error.message, \"error\");\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\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]\r\n\t);\r\n\r\n\treturn [patchRequest, state];\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 ${theme.palette.grey[300]}`,\r\n      backgroundColor: theme.palette.grey[100],\r\n      color: theme.palette.action.disabled,\r\n      opacity: 0.6,\r\n      boxShadow: \"none\",\r\n      cursor: \"not-allowed\",\r\n      height: \"40px\",\r\n      \"&:hover\": {\r\n        backgroundColor: theme.palette.grey[100],\r\n        boxShadow: \"none\",\r\n        border: `1px solid ${theme.palette.grey[300]}`,\r\n      },\r\n      \"&:active\": {\r\n        backgroundColor: theme.palette.grey[100],\r\n        boxShadow: \"none\",\r\n      },\r\n      // MUI sets `pointer-events: none` on disabled buttons, which hides the\r\n      // cursor. Re-enable pointer events so `not-allowed` shows; the native\r\n      // `disabled` attribute still blocks the click. Re-enabling pointer events\r\n      // also revives MUI's hover/active visuals, so pin the muted look across\r\n      // every interactive state — the button must never appear to \"light up\".\r\n      \"&.Mui-disabled\": {\r\n        pointerEvents: \"auto\",\r\n        cursor: \"not-allowed\",\r\n        backgroundColor: theme.palette.grey[100],\r\n        color: theme.palette.action.disabled,\r\n        borderColor: theme.palette.grey[300],\r\n        boxShadow: \"none\",\r\n        \"&:hover, &:focus, &:focus-visible, &:active\": {\r\n          backgroundColor: theme.palette.grey[100],\r\n          borderColor: theme.palette.grey[300],\r\n          boxShadow: \"none\",\r\n        },\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","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { type MouseEvent, type TouchEvent, useCallback, useRef, useState } from \"react\";\r\n\r\ninterface Position {\r\n\tx: number;\r\n\ty: number;\r\n}\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\nexport function useDraggable(\r\n\tinitialPosition: Position,\r\n\tonPositionChange?: (_position: Position) => void\r\n): UseDraggableReturn {\r\n\tconst [position, setPosition] = useState<Position>(initialPosition);\r\n\r\n\tconst [isDragging, setIsDragging] = useState(false);\r\n\r\n\tconst dragRef = useRef<HTMLDivElement>();\r\n\r\n\tconst dragStart = useRef<Position>({ x: 0, y: 0 });\r\n\r\n\tconst elementStart = useRef<Position>({ x: 0, y: 0 });\r\n\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\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\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\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\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\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\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\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\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","// micController.ts\r\n\r\nexport type MicController = {\r\n\tstart: () => Promise<void>;\r\n\tstop: () => void;\r\n\tmute: () => void;\r\n\tunmute: () => void;\r\n\ttoggleMute: () => void;\r\n\tisMuted: () => boolean;\r\n\tgetStream: () => MediaStream | null;\r\n};\r\n\r\nexport function createMicController(\r\n\tconstraints: MediaStreamConstraints = { audio: true }\r\n): MicController {\r\n\tlet stream: MediaStream | null = null;\r\n\tlet muted = false;\r\n\r\n\tasync function start() {\r\n\t\tif (stream) return; // already started\r\n\t\tstream = await navigator.mediaDevices.getUserMedia(constraints);\r\n\t\t// default: unmuted\r\n\t\tstream.getAudioTracks().forEach((track) => (track.enabled = true));\r\n\t\tmuted = false;\r\n\t}\r\n\r\n\tfunction setEnabled(enabled: boolean) {\r\n\t\tif (!stream) return;\r\n\t\tstream.getAudioTracks().forEach((track) => (track.enabled = enabled));\r\n\t\tmuted = !enabled;\r\n\t}\r\n\r\n\tfunction mute() {\r\n\t\tsetEnabled(false);\r\n\t}\r\n\r\n\tfunction unmute() {\r\n\t\tsetEnabled(true);\r\n\t}\r\n\r\n\tfunction toggleMute() {\r\n\t\tif (muted) {\r\n\t\t\tunmute();\r\n\t\t} else {\r\n\t\t\tmute();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction stop() {\r\n\t\tif (!stream) return;\r\n\t\tstream.getTracks().forEach((t) => t.stop());\r\n\t\tstream = null;\r\n\t\tmuted = false;\r\n\t}\r\n\r\n\tfunction isMuted() {\r\n\t\treturn muted;\r\n\t}\r\n\r\n\tfunction getStream() {\r\n\t\treturn stream;\r\n\t}\r\n\r\n\treturn {\r\n\t\tstart,\r\n\t\tstop,\r\n\t\tmute,\r\n\t\tunmute,\r\n\t\ttoggleMute,\r\n\t\tisMuted,\r\n\t\tgetStream,\r\n\t};\r\n}\r\n","/**\r\n * Audio loader utility for handling MP3 files as buffers/blobs\r\n * This ensures the audio works correctly in bundled npm packages\r\n */\r\n\r\n// Import the MP3 file - bundler will handle this\r\n// @ts-ignore - MP3 module declaration\r\nimport incomingRingtoneUrl from \"../ringtones/incoming.mp3\";\r\n\r\nlet audioBlobUrl: string | null = null;\r\nlet audioBuffer: ArrayBuffer | null = null;\r\n\r\n/**\r\n * Loads the audio file as a blob URL for reliable playback\r\n * @returns Promise<string> - Blob URL or direct URL for the audio file\r\n */\r\nexport async function loadAudioAsBlob(): Promise<string> {\r\n\tif (audioBlobUrl) {\r\n\t\treturn audioBlobUrl;\r\n\t}\r\n\r\n\t// If the URL is already a data URL or absolute URL, use it directly\r\n\tif (\r\n\t\tincomingRingtoneUrl.startsWith(\"data:\") ||\r\n\t\tincomingRingtoneUrl.startsWith(\"http://\") ||\r\n\t\tincomingRingtoneUrl.startsWith(\"https://\") ||\r\n\t\tincomingRingtoneUrl.startsWith(\"blob:\")\r\n\t) {\r\n\t\treturn incomingRingtoneUrl;\r\n\t}\r\n\r\n\t// Try to fetch and convert to blob URL\r\n\ttry {\r\n\t\tconst response = await fetch(incomingRingtoneUrl);\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\r\n\t\t}\r\n\r\n\t\tconst blob = await response.blob();\r\n\r\n\t\t// Verify it's a valid blob\r\n\t\tif (blob.size === 0) {\r\n\t\t\tthrow new Error(\"Empty blob\");\r\n\t\t}\r\n\r\n\t\taudioBlobUrl = URL.createObjectURL(blob);\r\n\t\treturn audioBlobUrl;\r\n\t} catch (error) {\r\n\t\t// If fetch fails, the bundler may have already processed the URL\r\n\t\t// Return the original URL - it should work if tsup processed it correctly\r\n\t\tconsole.error(\"Could not create blob URL, using direct URL:\", error);\r\n\t\treturn incomingRingtoneUrl;\r\n\t}\r\n}\r\n\r\n/**\r\n * Loads the audio file as an ArrayBuffer\r\n * @returns Promise<ArrayBuffer> - Audio file as buffer\r\n */\r\nexport async function loadAudioAsBuffer(): Promise<ArrayBuffer> {\r\n\tif (audioBuffer) {\r\n\t\treturn audioBuffer;\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst response = await fetch(incomingRingtoneUrl);\r\n\t\tif (!response.ok) {\r\n\t\t\tthrow new Error(`Failed to load audio: ${response.statusText}`);\r\n\t\t}\r\n\r\n\t\taudioBuffer = await response.arrayBuffer();\r\n\t\treturn audioBuffer;\r\n\t} catch (error) {\r\n\t\tconsole.error(\"Error loading audio as buffer:\", error);\r\n\t\tthrow error;\r\n\t}\r\n}\r\n\r\n/**\r\n * Creates an Audio element from the blob URL\r\n * @returns Promise<HTMLAudioElement> - Audio element ready to play\r\n */\r\nexport async function createAudioElement(): Promise<HTMLAudioElement> {\r\n\tconst audio = new Audio();\r\n\r\n\t// Set up audio properties before setting source\r\n\taudio.loop = true;\r\n\taudio.volume = 0.7;\r\n\taudio.preload = \"auto\";\r\n\r\n\t// Try multiple approaches to load the audio\r\n\tlet audioUrl: string = \"\";\r\n\r\n\t// First, try to get blob URL\r\n\ttry {\r\n\t\taudioUrl = await loadAudioAsBlob();\r\n\t} catch (error) {\r\n\t\tconsole.warn(\"Failed to load audio as blob, trying direct URL:\", error);\r\n\t\taudioUrl = incomingRingtoneUrl;\r\n\t}\r\n\r\n\t// Set up error handling with retry logic\r\n\tconst tryLoadAudio = async (url: string): Promise<boolean> => {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tconst checkCanPlay = () => {\r\n\t\t\t\t// Check if audio can play\r\n\t\t\t\tconst canPlay = audio.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA;\r\n\t\t\t\tif (canPlay) {\r\n\t\t\t\t\tresolve(true);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Check for errors\r\n\t\t\t\tif (audio.error) {\r\n\t\t\t\t\tresolve(false);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Wait a bit and check again\r\n\t\t\t\tsetTimeout(checkCanPlay, 100);\r\n\t\t\t};\r\n\r\n\t\t\taudio.addEventListener(\"canplay\", () => resolve(true), { once: true });\r\n\t\t\taudio.addEventListener(\"error\", () => resolve(false), { once: true });\r\n\t\t\taudio.src = url;\r\n\t\t\taudio.load();\r\n\r\n\t\t\t// Timeout after 2 seconds\r\n\t\t\tsetTimeout(() => resolve(false), 2000);\r\n\t\t});\r\n\t};\r\n\r\n\t// Try loading with the primary URL\r\n\tlet loaded = await tryLoadAudio(audioUrl);\r\n\r\n\t// If that fails, try the original import URL directly\r\n\tif (!loaded && audioUrl !== incomingRingtoneUrl) {\r\n\t\tloaded = await tryLoadAudio(incomingRingtoneUrl);\r\n\t\tif (loaded) {\r\n\t\t\taudioUrl = incomingRingtoneUrl;\r\n\t\t}\r\n\t}\r\n\r\n\treturn audio;\r\n}\r\n\r\n/**\r\n * Cleanup function to revoke blob URLs and free memory\r\n */\r\nexport function cleanupAudioResources(): void {\r\n\tif (audioBlobUrl) {\r\n\t\tURL.revokeObjectURL(audioBlobUrl);\r\n\t\taudioBlobUrl = null;\r\n\t}\r\n\taudioBuffer = null;\r\n}\r\n\r\n/**\r\n * Get the audio URL (blob URL or fallback to direct URL)\r\n * @returns string - Audio URL\r\n */\r\nexport function getAudioUrl(): string {\r\n\treturn audioBlobUrl || incomingRingtoneUrl;\r\n}\r\n","import CallIcon from \"@mui/icons-material/Call\";\r\nimport OpenInNewIcon from \"@mui/icons-material/OpenInNew\";\r\nimport { Badge, Box, Fab, IconButton, Paper, Tooltip, useTheme } from \"@mui/material\";\r\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\n\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport { useSDKState } from \"../hooks/useSDKState\";\r\nimport { sendSdkUnloadCleanup } from \"../utils/unloadCallCleanup\";\r\nimport { SDK_PERMISSIONS } from \"../permissions\";\r\nimport { resumedWrapupSeconds } from \"../utils/reloadDetection\";\r\nimport type { SDKEntitlements } from \"../permissions\";\r\n\r\nimport { CallData, CallStatus, ConferenceLineTypes } from \"../../types\";\r\n\r\n/**\r\n * Props for {@link CallControlIframe}.\r\n *\r\n * Every field is optional. Omit them all and the component resolves its config\r\n * from the state `initSDK` already populated (`urlConfig` + `authorization` +\r\n * `agentId` + `sdkConfig`). Pass any of them to override that — which is what\r\n * a host does when it owns its own auth/theme and treats the SDK as pure UI.\r\n */\r\nexport interface CallControlIframeProps {\r\n\t/**\r\n\t * URL the phone is served from. Defaults to `urlConfig.iframeURL` passed to\r\n\t * `initSDK`.\r\n\t *\r\n\t * A value that already carries a path is used verbatim; a bare origin gets\r\n\t * {@link CallControlIframeProps.entryPath} appended.\r\n\t */\r\n\tiframeBaseUrl?: string;\r\n\t/**\r\n\t * Path appended when the resolved base is a bare origin.\r\n\t * Default `/static/phone/iframe_index.html`.\r\n\t */\r\n\tentryPath?: string;\r\n\t/** REST API host passed to the phone as `api_url`. Defaults to `urlConfig.iframeAPIURL`. */\r\n\tapiHost?: string;\r\n\t/** WebSocket host passed to the phone as `ws_url`. Defaults to `urlConfig.webSocketURL`. */\r\n\twsUrl?: string;\r\n\t/** Auth token; a leading `Bearer ` is added if missing. Defaults to the SDK's own access token. */\r\n\ttoken?: string;\r\n\t/** Logged-in user id, passed as `user_id`. Defaults to `urlConfig.id`. */\r\n\tuserId?: string | number;\r\n\t/** User reference, passed as `user_ref`. Defaults to the SDK's `agentId`. */\r\n\tuserRef?: string;\r\n\t/** Theme primary color; the leading `#` is stripped before it is passed as `primary`. Defaults to the MUI theme's primary. */\r\n\tprimaryColor?: string;\r\n\t/**\r\n\t * SIP extension pushed to the phone via `cti:ext`. Cosmetic — the phone\r\n\t * self-provisions its own extension — but passing it makes the number appear\r\n\t * immediately instead of after provisioning.\r\n\t */\r\n\text?: string;\r\n\t/** Agent display name shown in the phone's agent bar. */\r\n\tagentName?: string;\r\n\t/** Auto wrap-up seconds; drives the phone's wrap-up countdown. */\r\n\tautoWrapupTime?: number | null;\r\n\t/** Show the phone's break/status selector (passed as `can_break`). Default `true`. */\r\n\tcanBreak?: boolean;\r\n\t/**\r\n\t * Current call status, used to auto-reopen a collapsed panel and to flag the\r\n\t * launcher. Defaults to the live status in SDK state, which this component\r\n\t * keeps current from the phone's own events — so a host normally omits it.\r\n\t */\r\n\tcallStatus?: string;\r\n\t/**\r\n\t * Raw SDK entitlements (`userInfo.entitlements.sdk`); used to derive the\r\n\t * disabled-controls list. When this key is passed at all, it takes precedence\r\n\t * over the entitlement-resolved `sdkConfig` — including failing closed\r\n\t * (everything disabled) if the value is absent. Ignored when\r\n\t * {@link CallControlIframeProps.disabledControls} is provided.\r\n\t */\r\n\tsdkEntitlements?: SDKEntitlements;\r\n\t/** Explicit comma-list of disabled controls; bypasses every derivation. */\r\n\tdisabledControls?: string;\r\n\t/** Render the panel expanded on mount. Default `true`. */\r\n\tdefaultOpen?: boolean;\r\n\t/** Panel width in px. Default 440. */\r\n\twidth?: number;\r\n\t/** Panel height in px. Default 640. */\r\n\theight?: number;\r\n\t/**\r\n\t * Called whenever the phone reports a call-state change — same payload shape\r\n\t * `CallControlPanel`'s `onDataChange` emits, so a host can swap one for the\r\n\t * other without touching its handler.\r\n\t */\r\n\tonDataChange?: (_data: CallData) => void;\r\n}\r\n\r\n/** Controls the phone recognises in `perm_disabled`. */\r\nconst ALL_CONTROLS_DISABLED = \"dial,end,transfer,blind,attended,warm,conf,hold,mute\";\r\n\r\nconst DEFAULT_ENTRY_PATH = \"/static/phone/iframe_index.html\";\r\n\r\n/** Smallest the panel can be resized to. Below this the phone's own chrome (agent\r\n *  bar + tabs + control tiles) starts colliding with itself. */\r\nconst MIN_PANEL_W = 285;\r\nconst MIN_PANEL_H = 420;\r\n\r\n/** Edge/corner grab zones for resizing the panel. `dir` is a compass string whose\r\n *  letters name the edges that move; RESIZE_EDGE is the thickness of a side strip\r\n *  and RESIZE_CORNER the square at each corner (bigger, and stacked above the sides\r\n *  where they overlap). Offsets are 0 rather than negative because the Paper clips\r\n *  its overflow. */\r\nconst RESIZE_EDGE = 8;\r\nconst RESIZE_CORNER = 16;\r\nconst RESIZE_HANDLES: {\r\n\tdir: string;\r\n\tcursor: string;\r\n\ttitle: string;\r\n\tpos: Record<string, number | string>;\r\n}[] = [\r\n\t{ dir: \"n\", cursor: \"ns-resize\", title: \"Resize\", pos: { top: 0, left: RESIZE_CORNER, right: RESIZE_CORNER, height: RESIZE_EDGE } },\r\n\t{ dir: \"s\", cursor: \"ns-resize\", title: \"Resize\", pos: { bottom: 0, left: RESIZE_CORNER, right: RESIZE_CORNER, height: RESIZE_EDGE } },\r\n\t{ dir: \"w\", cursor: \"ew-resize\", title: \"Resize\", pos: { left: 0, top: RESIZE_CORNER, bottom: RESIZE_CORNER, width: RESIZE_EDGE } },\r\n\t{ dir: \"e\", cursor: \"ew-resize\", title: \"Resize\", pos: { right: 0, top: RESIZE_CORNER, bottom: RESIZE_CORNER, width: RESIZE_EDGE } },\r\n\t{ dir: \"nw\", cursor: \"nwse-resize\", title: \"Resize\", pos: { top: 0, left: 0, width: RESIZE_CORNER, height: RESIZE_CORNER } },\r\n\t// Deliberately smaller than the other corners: the phone's own minimize / close\r\n\t// buttons live in the top-right of its header, and a full 16px grab zone would\r\n\t// clip the × and make the panel awkward to collapse.\r\n\t{ dir: \"ne\", cursor: \"nesw-resize\", title: \"Resize\", pos: { top: 0, right: 0, width: 10, height: 10 } },\r\n\t{ dir: \"sw\", cursor: \"nesw-resize\", title: \"Resize\", pos: { bottom: 0, left: 0, width: RESIZE_CORNER, height: RESIZE_CORNER } },\r\n\t{ dir: \"se\", cursor: \"nwse-resize\", title: \"Resize (double-click to reset)\", pos: { bottom: 0, right: 0, width: RESIZE_CORNER, height: RESIZE_CORNER } },\r\n];\r\n\r\nconst ACTIVE_STATUSES: string[] = [\r\n\tCallStatus.RINGING,\r\n\tCallStatus.DIALING,\r\n\tCallStatus.ONCALL,\r\n\tCallStatus.HOLD,\r\n];\r\n\r\nconst CALL_OVER_STATUSES: string[] = [CallStatus.IDLE, CallStatus.READY, CallStatus.MISSED];\r\n\r\n/**\r\n * Merge the socket's `conferencestatus` block into the locally held conference\r\n * lines. Mirrors the same-named helper in `callControls.tsx` — kept local so this\r\n * component stays self-contained and can never destabilise `CallControlPanel`.\r\n */\r\nconst getCombinedConferenceData = (localState: any, apiData: any): ConferenceLineTypes[] => {\r\n\tconst localConferenceData = localState?.conferenceLine ?? [];\r\n\tconst apiConferenceData = apiData?.conferencestatus;\r\n\r\n\treturn localConferenceData.map((item: any) => {\r\n\t\tconst statusKey = `line_${item.line}_status`;\r\n\r\n\t\tif (item?.line === 1) {\r\n\t\t\treturn {\r\n\t\t\t\t...item,\r\n\t\t\t\tline: 1,\r\n\t\t\t\tstatus: apiConferenceData?.[statusKey] ?? localState?.callData?.status,\r\n\t\t\t\tphone: localState?.callData?.phone_number ?? \"\",\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst phoneKey = `line_${item.line}_phonenumber`;\r\n\t\tconst newStatus = apiConferenceData ? (apiConferenceData[statusKey] ?? \"IDLE\") : item.status;\r\n\t\tlet newPhone = apiConferenceData?.[phoneKey];\r\n\r\n\t\tif (newPhone === null || newPhone === \"0\" || newPhone === undefined) {\r\n\t\t\tnewPhone = newStatus === \"IDLE\" ? \"\" : item.phone;\r\n\t\t}\r\n\r\n\t\treturn { ...item, status: newStatus, phone: newPhone };\r\n\t});\r\n};\r\n\r\nconst idleConferenceLines = (): ConferenceLineTypes[] =>\r\n\t[1, 2, 3, 4, 5].map((line) => ({\r\n\t\tline,\r\n\t\tstatus: \"IDLE\",\r\n\t\ttype: \"\" as const,\r\n\t\tphone: \"\",\r\n\t\tisMute: false,\r\n\t\tisHold: false,\r\n\t\tisCallStart: false,\r\n\t\tisMergeCall: false,\r\n\t}));\r\n\r\n/** Derive `perm_disabled` from raw entitlements. Fails closed when absent. */\r\nconst permDisabledFromEntitlements = (sdk: SDKEntitlements | undefined): string => {\r\n\tif (!sdk) return ALL_CONTROLS_DISABLED;\r\n\r\n\tconst bit = (cat: string, code?: string) => {\r\n\t\tconst c = (sdk as any)[cat];\r\n\t\tif (!c || !c.enabled) return false;\r\n\t\tif (!code) return true;\r\n\t\tconst it = (c.items || []).find((i: any) => i.code === code);\r\n\t\treturn it ? !!it.enabled : false;\r\n\t};\r\n\r\n\tconst outbound = bit(\"calls\", SDK_PERMISSIONS.CALL_OUTBOUND);\r\n\tconst anyCall = outbound || bit(\"calls\", SDK_PERMISSIONS.CALL_INBOUND);\r\n\tconst off: string[] = [];\r\n\r\n\tif (!outbound) off.push(\"dial\");\r\n\tif (!anyCall) off.push(\"end\");\r\n\tif (!bit(SDK_PERMISSIONS.CALL_TRANSFER)) off.push(\"transfer\");\r\n\tif (!bit(SDK_PERMISSIONS.CALL_TRANSFER, SDK_PERMISSIONS.TRANSFER_BLIND)) off.push(\"blind\");\r\n\tif (!bit(SDK_PERMISSIONS.CALL_TRANSFER, SDK_PERMISSIONS.TRANSFER_ATTENDED)) off.push(\"attended\");\r\n\t// call_transfer_warm → \"warm\" control key (SDK_PERMISSIONS.TRANSFER_WARM).\r\n\tif (!bit(SDK_PERMISSIONS.CALL_TRANSFER, SDK_PERMISSIONS.TRANSFER_WARM)) off.push(\"warm\");\r\n\tif (!bit(SDK_PERMISSIONS.CALL_CONFERENCE)) off.push(\"conf\");\r\n\tif (!anyCall) off.push(\"hold\");\r\n\tif (!anyCall) off.push(\"mute\");\r\n\r\n\treturn off.join(\",\");\r\n};\r\n\r\n/**\r\n * Full softphone surface — keypad, active-call controls, transfer, conference,\r\n * recents, agent bar — hosted in an iframe by the ahs-cti Browser-Phone app.\r\n *\r\n * Use this **instead of** `CallControlPanel`, not alongside it: the phone owns\r\n * the agent-events websocket and forwards every event here, where it is written\r\n * straight into SDK state. That keeps `useGetCallerData()` / `useSDKState()`\r\n * live for the rest of the host app with no changes at the call sites, and\r\n * avoids authenticating the same agent twice. Rendering both components opens\r\n * two sockets for one agent.\r\n *\r\n * Works two ways:\r\n * - **Zero-config** (`<CallControlIframe />`) — everything comes from `initSDK`.\r\n * - **Host-driven** — pass `iframeBaseUrl` / `apiHost` / `wsUrl` / `token` /\r\n *   `userId` / `primaryColor` and the SDK reads no state for those.\r\n *\r\n * The iframe is mounted once and only shown/hidden, and its `src` is frozen\r\n * until the logged-in user changes — a `src` change reloads the phone and would\r\n * drop a live call, so a refreshed token or a per-call control tweak must not\r\n * rebuild it.\r\n *\r\n * @example\r\n * ```tsx\r\n * // urlConfig.iframeURL was already given to initSDK\r\n * <CallControlIframe agentName={`${user.firstName} ${user.lastName}`} />\r\n * ```\r\n */\r\nexport function CallControlIframe(props: CallControlIframeProps) {\r\n\tconst {\r\n\t\tiframeBaseUrl,\r\n\t\tentryPath = DEFAULT_ENTRY_PATH,\r\n\t\tapiHost,\r\n\t\twsUrl,\r\n\t\ttoken: rawTokenProp,\r\n\t\tuserId: userIdProp,\r\n\t\tuserRef,\r\n\t\tprimaryColor,\r\n\t\text = \"\",\r\n\t\tagentName = \"\",\r\n\t\tautoWrapupTime,\r\n\t\tcanBreak = true,\r\n\t\tcallStatus: callStatusProp,\r\n\t\tsdkEntitlements,\r\n\t\tdisabledControls,\r\n\t\tdefaultOpen = true,\r\n\t\twidth = 440,\r\n\t\theight = 640,\r\n\t\tonDataChange,\r\n\t} = props;\r\n\r\n\tconst theme = useTheme();\r\n\tconst state = useSDKState();\r\n\r\n\tconst [open, setOpen] = useState<boolean>(defaultOpen);\r\n\tconst [iframeReady, setIframeReady] = useState(false);\r\n\tconst iframeRef = useRef<HTMLIFrameElement | null>(null);\r\n\r\n\t// Drag state: null = docked at the default top-right position.\r\n\tconst [pos, setPos] = useState<{ x: number; y: number } | null>(null);\r\n\tconst [dragging, setDragging] = useState(false);\r\n\tconst paperRef = useRef<HTMLDivElement | null>(null);\r\n\tconst dragRef = useRef<{ sx: number; sy: number; ox: number; oy: number } | null>(null);\r\n\t// Resize state: null = the `width`/`height` props; set once the agent drags an\r\n\t// edge or corner, after which the panel geometry is fully manual.\r\n\tconst [size, setSize] = useState<{ w: number; h: number } | null>(null);\r\n\tconst [resizing, setResizing] = useState(false);\r\n\tconst resizeRef = useRef<\r\n\t\t{ dir: string; sx: number; sy: number; l: number; t: number; w: number; h: number } | null\r\n\t>(null);\r\n\r\n\t// ── config: prop first, SDK state second ──────────────────────────────────\r\n\tconst resolvedBase = iframeBaseUrl || state.urlConfig?.iframeURL || \"\";\r\n\tconst resolvedApiHost = apiHost ?? state.urlConfig?.iframeAPIURL ?? \"\";\r\n\tconst resolvedWsUrl = wsUrl ?? state.urlConfig?.webSocketURL ?? \"\";\r\n\tconst resolvedUserId = userIdProp ?? state.urlConfig?.id ?? \"\";\r\n\tconst resolvedUserRef = userRef ?? state.agentId ?? \"\";\r\n\tconst resolvedPrimary = primaryColor ?? theme.palette.primary.main;\r\n\tconst rawToken = rawTokenProp ?? state.authorization?.accessToken ?? \"\";\r\n\tconst bearerToken = rawToken\r\n\t\t? rawToken.startsWith(\"Bearer \")\r\n\t\t\t? rawToken\r\n\t\t\t: `Bearer ${rawToken}`\r\n\t\t: \"\";\r\n\r\n\t// Origin the phone is served from — used to reject postMessages from anywhere else.\r\n\tconst iframeOrigin = useMemo(() => {\r\n\t\tif (!resolvedBase) return null;\r\n\t\ttry {\r\n\t\t\treturn new URL(resolvedBase).origin;\r\n\t\t} catch {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}, [resolvedBase]);\r\n\r\n\t// Entry point: a base that already carries a path is honoured verbatim (a host\r\n\t// passing a full `.../static/phone/iframe_index.html`, or a local dev server);\r\n\t// a bare origin — which is what `urlConfig.iframeURL` is — gets entryPath.\r\n\tconst iframeEntry = useMemo(() => {\r\n\t\tif (!resolvedBase) return null;\r\n\t\ttry {\r\n\t\t\tconst url = new URL(resolvedBase);\r\n\t\t\tconst hasPath = url.pathname && url.pathname !== \"/\";\r\n\t\t\treturn hasPath ? url.href : `${url.origin}${entryPath}`;\r\n\t\t} catch {\r\n\t\t\treturn resolvedBase;\r\n\t\t}\r\n\t}, [resolvedBase, entryPath]);\r\n\r\n\t// Controls the phone must render disabled. Precedence:\r\n\t//   1. `disabledControls` — explicit, wins outright\r\n\t//   2. `sdkEntitlements` — used whenever the host passes that key at all, so a\r\n\t//      host relying on its fail-closed behaviour keeps it\r\n\t//   3. the entitlement-resolved sdkConfig initSDK built (zero-config path)\r\n\t// The phone applies per-call gating (call_consult_controls) on top of this\r\n\t// from its own socket.\r\n\tconst hasEntitlementsProp = \"sdkEntitlements\" in props;\r\n\tconst permDisabled = useMemo(() => {\r\n\t\tif (typeof disabledControls === \"string\") return disabledControls;\r\n\t\tif (hasEntitlementsProp) return permDisabledFromEntitlements(sdkEntitlements);\r\n\r\n\t\tconst cfg = state.sdkConfig ?? {};\r\n\t\tconst flags: Record<string, boolean | undefined> = {\r\n\t\t\tdial: cfg.disabledDialButton,\r\n\t\t\tend: cfg.disableEndCallButton,\r\n\t\t\ttransfer: cfg.disableCallTransferButton,\r\n\t\t\tblind: cfg.disableBlindTransfer,\r\n\t\t\tattended: cfg.disableAttendedTransfer,\r\n\t\t\tconf: cfg.disableConferenceButton,\r\n\t\t\thold: cfg.disableHoldButton,\r\n\t\t\tmute: cfg.disableMuteButton,\r\n\t\t};\r\n\t\treturn Object.keys(flags)\r\n\t\t\t.filter((control) => flags[control])\r\n\t\t\t.join(\",\");\r\n\t}, [disabledControls, hasEntitlementsProp, sdkEntitlements, state.sdkConfig]);\r\n\r\n\t// ── Permission-derived URL flags ───────────────────────────────────────\r\n\t// Derived from flat userPermissions stored in SDK state after initSDK.\r\n\t// Baked into the iframe URL at mount time so the phone has them from the\r\n\t// first paint; the cti:ext push below re-delivers them after any reload.\r\n\r\n\t// can_dispo — gates the end-of-call disposition dialog.\r\n\t// `disposition:disabled` is a NEGATIVE permission: holding it turns the\r\n\t// dialog OFF. Wildcard (\"*\") does NOT count — superuser always dispositions.\r\n\tconst canDispo = useMemo(() => {\r\n\t\tconst perms = state.userPermissions;\r\n\t\tif (!perms) return true; // not yet loaded → fail-open\r\n\t\tif (perms.includes(\"*\")) return true;\r\n\t\treturn !perms.includes(SDK_PERMISSIONS.DISPOSITION_DISABLED);\r\n\t}, [state.userPermissions]);\r\n\r\n\t// can_unmask — gates whether full phone numbers are shown.\r\n\t// `phone_number:view_unmasked` is POSITIVE: without it numbers are masked\r\n\t// to their last three digits in the Recent list, live card, and conference.\r\n\tconst canUnmask = useMemo(() => {\r\n\t\tconst perms = state.userPermissions;\r\n\t\tif (!perms) return false; // not yet loaded → fail-closed\r\n\t\tif (perms.includes(\"*\")) return true;\r\n\t\treturn perms.includes(SDK_PERMISSIONS.PHONE_NUMBER_VIEW_UNMASKED);\r\n\t}, [state.userPermissions]);\r\n\r\n\t// can_logout — gates the Logout button in the agent bar.\r\n\t// `agent_logout:access` is POSITIVE.\r\n\tconst canLogout = useMemo(() => {\r\n\t\tconst perms = state.userPermissions;\r\n\t\tif (!perms) return false;\r\n\t\tif (perms.includes(\"*\")) return true;\r\n\t\treturn perms.includes(\"agent_logout:access\");\r\n\t}, [state.userPermissions]);\r\n\r\n\t// can_idle — gates the idle-time countdown in the agent bar timer slot.\r\n\t// `idle_time_countdown:access` is POSITIVE: without it the phone hides\r\n\t// the idle counter and shows nothing in that slot while Available.\r\n\tconst canIdle = useMemo(() => {\r\n\t\tconst perms = state.userPermissions;\r\n\t\tif (!perms) return false; // not yet loaded → fail-closed\r\n\t\tif (perms.includes(\"*\")) return true;\r\n\t\treturn perms.includes(SDK_PERMISSIONS.IDLE_TIME_COUNTDOWN);\r\n\t}, [state.userPermissions]);\r\n\r\n\t// can_break_timer — gates the break timer in the agent bar timer slot: how long\r\n\t// the agent has been on their current break. `break_time_countdown:access` is\r\n\t// POSITIVE, the idle counter's twin: without it the phone leaves that slot empty\r\n\t// on break (canBreakTimer() in ahs-cti-ui.js), which is where BREAK sat before\r\n\t// the timer existed. Every other state's timer is unaffected.\r\n\tconst canBreakTimer = useMemo(() => {\r\n\t\tconst perms = state.userPermissions;\r\n\t\tif (!perms) return false; // not yet loaded → fail-closed\r\n\t\tif (perms.includes(\"*\")) return true;\r\n\t\treturn perms.includes(SDK_PERMISSIONS.BREAK_TIME_COUNTDOWN);\r\n\t}, [state.userPermissions]);\r\n\r\n\tconst isBreakDetailsVisible = useMemo(() => {\r\n\t\tconst raw =\r\n\t\t\tstate.sdkConfig?.breakDetailsVisible ??\r\n\t\t\tstate.backendCallControls?.breakDetailsVisible ??\r\n\t\t\tstate.authorization?.callControls?.breakDetailsVisible ??\r\n\t\t\t(state.sdkConfig as any)?.break_details_visible ??\r\n\t\t\t(state.backendCallControls as any)?.break_details_visible ??\r\n\t\t\t(state.authorization?.callControls as any)?.break_details_visible;\r\n\t\tif (raw === undefined || raw === null) return true;\r\n\t\tif (typeof raw === \"boolean\") return raw;\r\n\t\tif (typeof raw === \"string\") return raw.toLowerCase() !== \"false\" && raw !== \"0\";\r\n\t\tif (typeof raw === \"number\") return raw !== 0;\r\n\t\treturn Boolean(raw);\r\n\t}, [state.sdkConfig, state.backendCallControls, state.authorization?.callControls]);\r\n\r\n\t// Tenant-level call-control switches from the backend login response.\r\n\t// Pushed via cti:ext so the phone gates controls the same way the SDK’s\r\n\t// CallControlPanel does (e.g. disableEndCallButton from callControls).\r\n\tconst hostCallControls = state.backendCallControls ?? null;\r\n\r\n\tconst candidateSrc =\r\n\t\tiframeEntry && resolvedUserId !== \"\" && resolvedUserId != null && rawToken\r\n\t\t\t? `${iframeEntry}?user_id=${encodeURIComponent(String(resolvedUserId))}` +\r\n\t\t\t\t`&user_ref=${encodeURIComponent(resolvedUserRef)}` +\r\n\t\t\t\t`&api_url=${encodeURIComponent(resolvedApiHost)}` +\r\n\t\t\t\t`&ws_url=${encodeURIComponent(resolvedWsUrl)}` +\r\n\t\t\t\t`&token=${encodeURIComponent(bearerToken)}` +\r\n\t\t\t\t`&primary=${resolvedPrimary.replace(/^#/, \"\")}` +\r\n\t\t\t\t`&embedded=1` +\r\n\t\t\t\t`&can_break=${canBreak ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&break_details_visible=${isBreakDetailsVisible ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&breakDetailsVisible=${isBreakDetailsVisible ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&can_break_details=${isBreakDetailsVisible ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&perm_disabled=${permDisabled}` +\r\n\t\t\t\t`&can_dispo=${canDispo ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&can_unmask=${canUnmask ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&can_logout=${canLogout ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&can_idle=${canIdle ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&can_break_timer=${canBreakTimer ? \"1\" : \"0\"}` +\r\n\t\t\t\t`&ext=${encodeURIComponent(ext)}` +\r\n\t\t\t\t`&agent_name=${encodeURIComponent(agentName)}` +\r\n\t\t\t\t`&wrapup=${autoWrapupTime || 30}` +\r\n\t\t\t\t`&auto_wrapup_time=${autoWrapupTime || 30}`\r\n\t\t\t: null;\r\n\r\n\t// Freeze the src once it resolves, and rebuild it ONLY when the logged-in user\r\n\t// changes. Everything else in the URL is boot config, and rebuilding on a\r\n\t// refreshed token or a control tweak landing in sdkConfig would remount the\r\n\t// iframe and drop the call in progress.\r\n\tconst identityKey = String(resolvedUserId ?? \"\");\r\n\tconst [frozen, setFrozen] = useState<{ key: string; src: string } | null>(null);\r\n\tuseEffect(() => {\r\n\t\tif (!candidateSrc) return;\r\n\t\tif (frozen && frozen.key === identityKey) return;\r\n\t\tsetFrozen({ key: identityKey, src: candidateSrc });\r\n\t}, [candidateSrc, frozen, identityKey]);\r\n\tconst src = frozen?.src ?? null;\r\n\r\n\t// A reload — an identity change, or the phone navigating itself — lands in a\r\n\t// brand-new document that has never received the cti:ext / cti:auth pushes below.\r\n\t// onLoad fires again, but setIframeReady(true) on an already-true state is a\r\n\t// no-op: no re-render, no effect re-run, so nothing was re-pushed and the fresh\r\n\t// document came up with no agent name and a socket it could not authenticate.\r\n\t// Dropping the flag makes the next onLoad a real false -> true transition.\r\n\tuseEffect(() => {\r\n\t\tsetIframeReady(false);\r\n\t}, [src]);\r\n\r\n\t// Short shareable URL for the pop-out tab: the standalone phone logs itself in\r\n\t// with userId + password and provisions api_url / ws_url / token / extension\r\n\t// from its own config. Only available on the zero-config path, where the SDK\r\n\t// holds the password — a host-driven mount gets no pop-out button.\r\n\tconst popoutSrc =\r\n\t\tiframeEntry && state.agentId && state.urlConfig?.password\r\n\t\t\t? `${iframeEntry}?userId=${encodeURIComponent(state.agentId)}&password=${encodeURIComponent(\r\n\t\t\t\t\tstate.urlConfig.password\r\n\t\t\t\t)}`\r\n\t\t\t: null;\r\n\r\n\t// ── phone → SDK state ─────────────────────────────────────────────────────\r\n\t// The phone forwards its raw agent-event socket payload as cti:callstatus.\r\n\t// Reduce it into SDK state exactly as CallControlPanel's own socket handler\r\n\t// does, so useGetCallerData() / useSDKState() stay live for the host app.\r\n\tuseEffect(() => {\r\n\t\tconst onMessage = (event: MessageEvent) => {\r\n\t\t\tif (iframeOrigin && event.origin !== iframeOrigin) return;\r\n\t\t\tconst data = event.data;\r\n\t\t\tif (!data || typeof data !== \"object\") return;\r\n\r\n\t\t\tif (data.type === \"cti:close\" || data.type === \"cti:minimize\") {\r\n\t\t\t\tsetOpen(false);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (data.type !== \"cti:callstatus\") return;\r\n\r\n\t\t\tconst payload = data.payload;\r\n\t\t\tif (!payload || typeof payload !== \"object\" || payload.type === \"pong\") return;\r\n\r\n\t\t\tconst rawCallStatus = String(payload.status ?? \"\").toUpperCase();\r\n\t\t\tconst rawAgentStatus = String((payload as any).agent_status ?? \"\").toUpperCase();\r\n\t\t\tconst breakDetails = payload.break_details;\r\n\t\t\tconst breakType = String(\r\n\t\t\t\tbreakDetails?.value ||\r\n\t\t\t\tbreakDetails?.type ||\r\n\t\t\t\t(breakDetails as any)?.name ||\r\n\t\t\t\t(typeof breakDetails === \"string\" ? breakDetails : \"\") ||\r\n\t\t\t\t(payload as any)?.break_type ||\r\n\t\t\t\t(payload as any)?.break_name ||\r\n\t\t\t\t\"\"\r\n\t\t\t);\r\n\t\t\tconst hasBreakFlag = Boolean((payload as any)?.is_mark_as_break || (payload as any)?.isBreak || (payload as any)?.selected_break);\r\n\t\t\tconst isLiveCallBusy = [\r\n\t\t\t\tCallStatus.ONCALL,\r\n\t\t\t\tCallStatus.RINGING,\r\n\t\t\t\tCallStatus.DIALING,\r\n\t\t\t\tCallStatus.HOLD,\r\n\t\t\t\tCallStatus.UNHOLD,\r\n\t\t\t\tCallStatus.MUTE,\r\n\t\t\t\tCallStatus.UNMUTE,\r\n\t\t\t\tCallStatus.CONFERENCE,\r\n\t\t\t].includes(rawCallStatus as CallStatus) ||\r\n\t\t\trawCallStatus === \"INCALL\" ||\r\n\t\t\trawCallStatus === \"ANSWERED\" ||\r\n\t\t\trawCallStatus === \"TALKING\";\r\n\r\n\t\t\tconst isBreak =\r\n\t\t\t\t!isLiveCallBusy &&\r\n\t\t\t\trawCallStatus !== CallStatus.WRAPUP &&\r\n\t\t\t\t(rawAgentStatus === CallStatus.BREAK ||\r\n\t\t\t\t rawAgentStatus === \"PAUSE\" ||\r\n\t\t\t\t rawAgentStatus.includes(\"BREAK\") ||\r\n\t\t\t\t rawCallStatus === CallStatus.BREAK ||\r\n\t\t\t\t rawCallStatus === \"PAUSE\" ||\r\n\t\t\t\t rawCallStatus.includes(\"BREAK\") ||\r\n\t\t\t\t hasBreakFlag ||\r\n\t\t\t\t Boolean(breakType));\r\n\r\n\t\t\tconst isIdle =\r\n\t\t\t\t!isBreak &&\r\n\t\t\t\t!isLiveCallBusy &&\r\n\t\t\t\t(rawCallStatus === \"IDLE\" || rawCallStatus === \"READY\" || rawAgentStatus === \"IDLE\" || rawAgentStatus === \"READY\");\r\n\r\n\t\t\tconst activeBreak = breakType || \"BREAK\";\r\n\t\t\tconst resolvedStatus = isBreak ? CallStatus.BREAK : payload.status;\r\n\t\t\tconst snapshot = sdkStateManager.getState();\r\n\r\n\t\t\tif (isBreak) {\r\n\t\t\t\tsdkStateManager.setAgentStatus(activeBreak);\r\n\t\t\t\tif (typeof sessionStorage !== \"undefined\") {\r\n\t\t\t\t\tsessionStorage.setItem(\"PREVIOUS_AGENT_STATUS\", activeBreak);\r\n\t\t\t\t}\r\n\t\t\t} else if (isIdle) {\r\n\t\t\t\tsdkStateManager.setAgentStatus(\"\");\r\n\t\t\t\tif (typeof sessionStorage !== \"undefined\") {\r\n\t\t\t\t\tsessionStorage.removeItem(\"PREVIOUS_AGENT_STATUS\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tsdkStateManager.updateCallData({\r\n\t\t\t\t...payload,\r\n\t\t\t\tagent_id: payload.agent_id,\r\n\t\t\t\tstatus: resolvedStatus,\r\n\t\t\t\ttype: payload.type,\r\n\t\t\t\tevent_time: payload.event_time,\r\n\t\t\t\tphone_number: payload.phone_number,\r\n\t\t\t\tcall_id: payload.call_id,\r\n\t\t\t\tprocess_id: payload.process_id,\r\n\t\t\t\tprocess_name: payload.process_name,\r\n\t\t\t\thold: payload.hold,\r\n\t\t\t\tmute: payload.mute,\r\n\t\t\t\tdisable_hold_mute: payload.disable_hold_mute,\r\n\t\t\t\tmode: payload.mode,\r\n\t\t\t\tqueue_name: payload.queue_name,\r\n\t\t\t\tsource: payload.source ?? payload.call_details?.source,\r\n\t\t\t\tauto_wrapup_time: payload.auto_wrapup_time ?? null,\r\n\t\t\t\t...(payload.call_details !== undefined && { call_details: payload.call_details }),\r\n\t\t\t\t...(isBreak\r\n\t\t\t\t\t? { break_details: { type: activeBreak, value: activeBreak } }\r\n\t\t\t\t\t: payload.break_details !== undefined\r\n\t\t\t\t\t? { break_details: payload.break_details }\r\n\t\t\t\t\t: {}),\r\n\t\t\t\t...(payload.call_sage !== undefined && { call_sage: payload.call_sage }),\r\n\t\t\t});\r\n\r\n\t\t\tsdkStateManager.updateConferenceData(getCombinedConferenceData(snapshot, payload));\r\n\t\t\tsdkStateManager.setConsultInfo(payload.consult_info ?? null);\r\n\r\n\t\t\t// Backend-resolved lead details (campaign dials) reach the host through\r\n\t\t\t// the same transferLeadData pipeline useGetCallerData() exposes.\r\n\t\t\tif (payload.lead_data !== undefined) {\r\n\t\t\t\tsdkStateManager.setTransferLeadData(payload.lead_data);\r\n\t\t\t}\r\n\r\n\t\t\tif (status === CallStatus.RINGING || status === CallStatus.DIALING) {\r\n\t\t\t\tsetOpen(true);\r\n\t\t\t\tsdkStateManager.updateConferenceData(idleConferenceLines());\r\n\t\t\t} else if (status === CallStatus.ONCALL) {\r\n\t\t\t\t// Seeds callStartTime, which drives the host-visible call duration.\r\n\t\t\t\tsdkStateManager.startCall();\r\n\t\t\t\tsetOpen(true);\r\n\t\t\t} else if (status === CallStatus.WRAPUP) {\r\n\t\t\t\tsdkStateManager.endCall();\r\n\t\t\t} else if (status && CALL_OVER_STATUSES.includes(status)) {\r\n\t\t\t\tsdkStateManager.clearTransferLeadData();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"message\", onMessage);\r\n\t\treturn () => window.removeEventListener(\"message\", onMessage);\r\n\t}, [iframeOrigin]);\r\n\r\n\t// ── SDK → phone ───────────────────────────────────────────────────────────\r\n\t// Push display-only and permission bits to the phone once the iframe is\r\n\t// up, and again whenever any of them change or the frame reloads.\r\n\t// Deliberately NOT gated on `ext`: the wrap-up total must arrive even\r\n\t// for agents without an extension, or the WRAPUP timer counts up.\r\n\t// `callControls` carries the tenant-level backend switches (e.g.\r\n\t// disableEndCallButton) so the phone gates controls identically to\r\n\t// CallControlPanel. `unmask` keeps phone-number masking in sync if\r\n\t// the phone_number:view_unmasked permission resolves after first paint.\r\n\tuseEffect(() => {\r\n\t\tif (!iframeReady) return;\r\n\t\tconst pendingWrapupStr =\r\n\t\t\ttypeof sessionStorage !== \"undefined\"\r\n\t\t\t\t? sessionStorage.getItem(\"RELOAD_PENDING_WRAPUP\")\r\n\t\t\t\t: null;\r\n\t\tlet pendingWrapup: any = null;\r\n\t\tif (pendingWrapupStr) {\r\n\t\t\ttry {\r\n\t\t\t\tconst item = JSON.parse(pendingWrapupStr);\r\n\t\t\t\tconst rem = resumedWrapupSeconds(item, item.auto_wrapup_time || autoWrapupTime || 30);\r\n\t\t\t\tpendingWrapup = {\r\n\t\t\t\t\t...item,\r\n\t\t\t\t\tremainingTime: rem,\r\n\t\t\t\t\tauto_wrapup_time: item.auto_wrapup_time || autoWrapupTime || 30,\r\n\t\t\t\t};\r\n\t\t\t} catch {}\r\n\t\t}\r\n\t\tiframeRef.current?.contentWindow?.postMessage(\r\n\t\t\t{\r\n\t\t\t\ttype: \"cti:ext\",\r\n\t\t\t\text,\r\n\t\t\t\tname: agentName,\r\n\t\t\t\twrapup: autoWrapupTime || 30,\r\n\t\t\t\tauto_wrapup_time: autoWrapupTime || 30,\r\n\t\t\t\tautoWrapupTime: autoWrapupTime || 30,\r\n\t\t\t\t// Tenant-level call-control switches from the backend login response.\r\n\t\t\t\tcallControls: hostCallControls,\r\n\t\t\t\tbreakDetailsVisible: isBreakDetailsVisible,\r\n\t\t\t\tbreak_details_visible: isBreakDetailsVisible,\r\n\t\t\t\tcan_break_details: isBreakDetailsVisible,\r\n\t\t\t\t// Full-number masking gate; the phone re-renders on change.\r\n\t\t\t\tunmask: canUnmask,\r\n\t\t\t\t// Idle-time countdown gate (idle_time_countdown:access).\r\n\t\t\t\tidle: canIdle,\r\n\t\t\t\t// Break-timer gate (break_time_countdown:access). Re-sent here, not\r\n\t\t\t\t// just on the URL: the URL is latched on identity, so a permission\r\n\t\t\t\t// that resolves after the phone has loaded arrives only this way.\r\n\t\t\t\tbreakTimer: canBreakTimer,\r\n\t\t\t\tpendingWrapup: pendingWrapup || undefined,\r\n\t\t\t},\r\n\t\t\tiframeOrigin ?? \"*\"\r\n\t\t);\r\n\r\n\t}, [iframeReady, ext, agentName, autoWrapupTime, hostCallControls, isBreakDetailsVisible, canUnmask, canIdle, canBreakTimer, iframeOrigin]);\r\n\r\n\t// Keepalive for the phone's agent-events websocket.\r\n\t//\r\n\t// The panel is collapsed by hiding it (`display: none` on the Paper below),\r\n\t// which leaves this iframe cross-origin AND not rendered — the exact case\r\n\t// Chrome throttles timers in. The phone's own ping then stretches from 20s to\r\n\t// minutes, the server drops the idle connection, and it reconnects when the\r\n\t// timer eventually fires: a string of websocket connections per session instead\r\n\t// of one, with call state going stale in between. `CallControlPanel` never hit\r\n\t// this because its socket and its ping both lived in the top-level document.\r\n\t//\r\n\t// This interval runs in that same top-level document, so it keeps time whether\r\n\t// the panel is open or closed. The phone pings on receipt (rate-limited) and\r\n\t// reconnects if the socket died while it was hidden.\r\n\tuseEffect(() => {\r\n\t\tif (!iframeReady) return;\r\n\t\tconst tick = () => {\r\n\t\t\tiframeRef.current?.contentWindow?.postMessage(\r\n\t\t\t\t{ type: \"cti:keepalive\" },\r\n\t\t\t\tiframeOrigin ?? \"*\"\r\n\t\t\t);\r\n\t\t};\r\n\t\tconst id = window.setInterval(tick, 20000);\r\n\t\treturn () => window.clearInterval(id);\r\n\t}, [iframeReady, iframeOrigin]);\r\n\r\n\t// Notify phone iframe when parent window is unloading/reloading\r\n\tuseEffect(() => {\r\n\t\t// beforeunload fires BEFORE the agent answers Chrome's \"Reload site?\" dialog,\r\n\t\t// so it must not end anything: a hangup here dropped the customer even when\r\n\t\t// the agent clicked Cancel and stayed. The cleanup runs on pagehide, which\r\n\t\t// only fires once the page is really going — the same split\r\n\t\t// CallControlPanel's handleBeforeUnload / handlePageHide make.\r\n\t\tconst handleBeforeUnload = () => {\r\n\t\t\ttry {\r\n\t\t\t\tiframeRef.current?.contentWindow?.postMessage(\r\n\t\t\t\t\t{ type: \"cti:reloading\" },\r\n\t\t\t\t\tiframeOrigin ?? \"*\"\r\n\t\t\t\t);\r\n\t\t\t} catch {}\r\n\t\t};\r\n\t\tconst handlePageHide = () => sendSdkUnloadCleanup(sdkStateManager.getState());\r\n\t\twindow.addEventListener(\"beforeunload\", handleBeforeUnload);\r\n\t\twindow.addEventListener(\"pagehide\", handlePageHide);\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener(\"beforeunload\", handleBeforeUnload);\r\n\t\t\twindow.removeEventListener(\"pagehide\", handlePageHide);\r\n\t\t};\r\n\t}, [iframeOrigin]);\r\n\r\n\t// Push the CURRENT token in over postMessage, and re-push whenever it rotates.\r\n\t//\r\n\t// The token on the iframe URL is boot config that is frozen with the rest of the\r\n\t// src (see the latch above), so after a re-auth the phone would keep\r\n\t// reconnecting its socket with the expired JWT — and the agent-events endpoint\r\n\t// completes the upgrade handshake BEFORE it validates the credential, so that\r\n\t// failure looks like a 101 followed by an immediate close, not like an auth\r\n\t// error. `CallControlPanel` could not hit this: it rebuilt the socket URL from\r\n\t// `state.authorization.accessToken` on every connect attempt.\r\n\t//\r\n\t// cti:auth is the phone's own channel for this (it sets window.__ctiAuth, which\r\n\t// takes precedence over the URL params, and calls connectAgentEvents() —\r\n\t// idempotent, so an already-open socket is left alone). Rotating the token this\r\n\t// way costs no reload, which is what makes it safe during a live call.\r\n\tuseEffect(() => {\r\n\t\tif (!iframeReady || !bearerToken) return;\r\n\t\tiframeRef.current?.contentWindow?.postMessage(\r\n\t\t\t{\r\n\t\t\t\ttype: \"cti:auth\",\r\n\t\t\t\ttoken: bearerToken,\r\n\t\t\t\tapiUrl: resolvedApiHost,\r\n\t\t\t\twsUrl: resolvedWsUrl,\r\n\t\t\t},\r\n\t\t\tiframeOrigin ?? \"*\"\r\n\t\t);\r\n\t}, [iframeReady, bearerToken, resolvedApiHost, resolvedWsUrl, iframeOrigin]);\r\n\r\n\t// Re-open on the idle→active transition only, so a hold/unhold the agent\r\n\t// performed while collapsed doesn't pop the panel back open.\r\n\tconst callStatus = callStatusProp ?? state.callData?.status;\r\n\tconst wasActiveRef = useRef(false);\r\n\tuseEffect(() => {\r\n\t\tconst active = !!callStatus && ACTIVE_STATUSES.includes(callStatus);\r\n\t\tif (active && !wasActiveRef.current) setOpen(true);\r\n\t\twasActiveRef.current = active;\r\n\t}, [callStatus]);\r\n\r\n\t// Same contract as CallControlPanel's onDataChange.\r\n\tuseEffect(() => {\r\n\t\tif (!onDataChange || !state.callData) return;\r\n\t\tconst { process_id, process_name, status, phone_number, agent_id, call_id, call_details, source } =\r\n\t\t\tstate.callData;\r\n\t\tconst lead_data = sdkStateManager.getTransferLeadData();\r\n\t\tonDataChange({\r\n\t\t\tphone_number,\r\n\t\t\tstatus,\r\n\t\t\tcallReferenceId: call_id,\r\n\t\t\tagent_id,\r\n\t\t\tprocess_id,\r\n\t\t\tprocess_name,\r\n\t\t\tcall_details,\r\n\t\t\tsource: source ?? call_details?.source,\r\n\t\t\tauto_wrapup_time: state.backendCallControls?.auto_wrapup_time ?? null,\r\n\t\t\t...(lead_data !== undefined && { lead_data }),\r\n\t\t\tsocket_info: state.callData,\r\n\t\t} as CallData);\r\n\t}, [state.callData, state.backendCallControls, onDataChange]);\r\n\r\n\t// ── drag the panel by its header ──────────────────────────────────────────\r\n\tconst onDrag = useCallback(\r\n\t\t(e: globalThis.MouseEvent) => {\r\n\t\t\tconst d = dragRef.current;\r\n\t\t\tif (!d) return;\r\n\t\t\tconst w = paperRef.current?.offsetWidth ?? width;\r\n\t\t\tconst h = paperRef.current?.offsetHeight ?? 0;\r\n\t\t\tlet x = d.ox + (e.clientX - d.sx);\r\n\t\t\tlet y = d.oy + (e.clientY - d.sy);\r\n\t\t\tx = Math.max(0, Math.min(x, window.innerWidth - w));\r\n\t\t\ty = Math.max(0, Math.min(y, window.innerHeight - Math.min(h, 120)));\r\n\t\t\tsetPos({ x, y });\r\n\t\t},\r\n\t\t[width]\r\n\t);\r\n\r\n\tconst endDrag = useCallback(() => {\r\n\t\tsetDragging(false);\r\n\t\tdragRef.current = null;\r\n\t\twindow.removeEventListener(\"mousemove\", onDrag);\r\n\t\twindow.removeEventListener(\"mouseup\", endDrag);\r\n\t}, [onDrag]);\r\n\r\n\tconst startDrag = useCallback(\r\n\t\t(e: React.MouseEvent) => {\r\n\t\t\tconst rect = paperRef.current?.getBoundingClientRect();\r\n\t\t\tif (!rect) return;\r\n\t\t\te.preventDefault();\r\n\t\t\tdragRef.current = { sx: e.clientX, sy: e.clientY, ox: rect.left, oy: rect.top };\r\n\t\t\tsetDragging(true);\r\n\t\t\twindow.addEventListener(\"mousemove\", onDrag);\r\n\t\t\twindow.addEventListener(\"mouseup\", endDrag);\r\n\t\t},\r\n\t\t[onDrag, endDrag]\r\n\t);\r\n\r\n\tuseEffect(\r\n\t\t() => () => {\r\n\t\t\twindow.removeEventListener(\"mousemove\", onDrag);\r\n\t\t\twindow.removeEventListener(\"mouseup\", endDrag);\r\n\t\t},\r\n\t\t[onDrag, endDrag]\r\n\t);\r\n\r\n\t// ── resize the panel from any edge or corner ──────────────────────────────\r\n\t// `dir` is a compass string (\"n\", \"se\", …); each letter names an edge that moves.\r\n\t// Dragging a west/north edge grows the panel by moving its left/top, so position\r\n\t// and size change together.\r\n\tconst onResize = useCallback((e: globalThis.MouseEvent) => {\r\n\t\tconst r = resizeRef.current;\r\n\t\tif (!r) return;\r\n\t\tconst dx = e.clientX - r.sx;\r\n\t\tconst dy = e.clientY - r.sy;\r\n\t\tlet l = r.l, t = r.t, w = r.w, h = r.h;\r\n\t\tif (r.dir.indexOf(\"e\") !== -1) w = r.w + dx;\r\n\t\tif (r.dir.indexOf(\"s\") !== -1) h = r.h + dy;\r\n\t\tif (r.dir.indexOf(\"w\") !== -1) { w = r.w - dx; l = r.l + dx; }\r\n\t\tif (r.dir.indexOf(\"n\") !== -1) { h = r.h - dy; t = r.t + dy; }\r\n\t\t// Hitting the minimum pins the dragged edge and leaves the opposite one where\r\n\t\t// it was, so the panel doesn't creep sideways once it has bottomed out.\r\n\t\tif (w < MIN_PANEL_W) { if (r.dir.indexOf(\"w\") !== -1) l = r.l + (r.w - MIN_PANEL_W); w = MIN_PANEL_W; }\r\n\t\tif (h < MIN_PANEL_H) { if (r.dir.indexOf(\"n\") !== -1) t = r.t + (r.h - MIN_PANEL_H); h = MIN_PANEL_H; }\r\n\t\t// Keep the panel on screen.\r\n\t\tif (l < 0) { w = Math.max(MIN_PANEL_W, w + l); l = 0; }\r\n\t\tif (t < 0) { h = Math.max(MIN_PANEL_H, h + t); t = 0; }\r\n\t\tw = Math.max(MIN_PANEL_W, Math.min(w, window.innerWidth - l));\r\n\t\th = Math.max(MIN_PANEL_H, Math.min(h, window.innerHeight - t));\r\n\t\tsetPos({ x: l, y: t });\r\n\t\tsetSize({ w, h });\r\n\t}, []);\r\n\r\n\tconst endResize = useCallback(() => {\r\n\t\tsetResizing(false);\r\n\t\tresizeRef.current = null;\r\n\t\twindow.removeEventListener(\"mousemove\", onResize);\r\n\t\twindow.removeEventListener(\"mouseup\", endResize);\r\n\t}, [onResize]);\r\n\r\n\tconst startResize = useCallback(\r\n\t\t(dir: string) => (e: React.MouseEvent) => {\r\n\t\t\tconst rect = paperRef.current?.getBoundingClientRect();\r\n\t\t\tif (!rect) return;\r\n\t\t\te.preventDefault();\r\n\t\t\t// Don't let the header drag handle underneath also fire.\r\n\t\t\te.stopPropagation();\r\n\t\t\tresizeRef.current = { dir, sx: e.clientX, sy: e.clientY, l: rect.left, t: rect.top, w: rect.width, h: rect.height };\r\n\t\t\tsetResizing(true);\r\n\t\t\t// Pin to explicit left/top/width/height on the first resize: the default\r\n\t\t\t// layout is right-docked with a maxHeight cap, and both would fight the\r\n\t\t\t// geometry being dragged.\r\n\t\t\tsetPos({ x: rect.left, y: rect.top });\r\n\t\t\tsetSize({ w: rect.width, h: rect.height });\r\n\t\t\twindow.addEventListener(\"mousemove\", onResize);\r\n\t\t\twindow.addEventListener(\"mouseup\", endResize);\r\n\t\t},\r\n\t\t[onResize, endResize]\r\n\t);\r\n\r\n\t// Double-click any handle to return to the host-configured width/height.\r\n\tconst resetSize = useCallback(() => {\r\n\t\tsetSize(null);\r\n\t\tsetPos(null);\r\n\t}, []);\r\n\r\n\tuseEffect(\r\n\t\t() => () => {\r\n\t\t\twindow.removeEventListener(\"mousemove\", onResize);\r\n\t\t\twindow.removeEventListener(\"mouseup\", endResize);\r\n\t\t},\r\n\t\t[onResize, endResize]\r\n\t);\r\n\r\n\t// A resized panel can end up off-screen when the window shrinks; pull it back in\r\n\t// so it can never become unreachable.\r\n\tuseEffect(() => {\r\n\t\tconst onWinResize = () => {\r\n\t\t\tsetSize((s) => (s ? { w: Math.min(s.w, window.innerWidth), h: Math.min(s.h, window.innerHeight) } : s));\r\n\t\t\tsetPos((p) => {\r\n\t\t\t\tif (!p) return p;\r\n\t\t\t\tconst w = paperRef.current?.offsetWidth ?? 0;\r\n\t\t\t\tconst h = paperRef.current?.offsetHeight ?? 0;\r\n\t\t\t\treturn {\r\n\t\t\t\t\tx: Math.max(0, Math.min(p.x, window.innerWidth - Math.min(w, window.innerWidth))),\r\n\t\t\t\t\ty: Math.max(0, Math.min(p.y, window.innerHeight - Math.min(h, 120))),\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t};\r\n\t\twindow.addEventListener(\"resize\", onWinResize);\r\n\t\treturn () => window.removeEventListener(\"resize\", onWinResize);\r\n\t}, []);\r\n\r\n\tif (state.sdkConfig?.disableSoftPhone) return null;\r\n\tif (!src) return null;\r\n\r\n\tconst onCall = !!callStatus && ACTIVE_STATUSES.includes(callStatus);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{/* Kept mounted; hidden rather than unmounted so a call survives collapse. */}\r\n\t\t\t<Paper\r\n\t\t\t\tref={paperRef}\r\n\t\t\t\televation={8}\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tposition: \"fixed\",\r\n\t\t\t\t\t...(pos ? { left: pos.x, top: pos.y, right: \"auto\" } : { top: 68, right: 16 }),\r\n\t\t\t\t\twidth: size ? size.w : width,\r\n\t\t\t\t\theight: size ? size.h : height,\r\n\t\t\t\t\t// Dropped once the agent resizes by hand, or the cap would refuse the\r\n\t\t\t\t\t// taller panel they just dragged out.\r\n\t\t\t\t\tmaxHeight: size ? \"none\" : \"calc(100vh - 96px)\",\r\n\t\t\t\t\tdisplay: open ? \"flex\" : \"none\",\r\n\t\t\t\t\tflexDirection: \"column\",\r\n\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t\tborderRadius: 3,\r\n\t\t\t\t\tbgcolor: \"background.paper\",\r\n\t\t\t\t\tzIndex: (t) => t.zIndex.drawer + 2,\r\n\t\t\t\t\tuserSelect: dragging || resizing ? \"none\" : \"auto\",\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t{/* Resize handles: four edges + four corners, so the panel opens out in\r\n\t\t\t\t    any direction. They sit just INSIDE the Paper because it clips its\r\n\t\t\t\t    overflow, and above the header drag strip so the top few pixels\r\n\t\t\t\t    resize rather than move. Double-click any of them to reset. */}\r\n\t\t\t\t{RESIZE_HANDLES.map((hd) => (\r\n\t\t\t\t\t<Box\r\n\t\t\t\t\t\tkey={hd.dir}\r\n\t\t\t\t\t\tonMouseDown={startResize(hd.dir)}\r\n\t\t\t\t\t\tonDoubleClick={resetSize}\r\n\t\t\t\t\t\ttitle={hd.title}\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\t\t\tzIndex: hd.dir.length > 1 ? 6 : 5,\r\n\t\t\t\t\t\t\tcursor: hd.cursor,\r\n\t\t\t\t\t\t\t...hd.pos,\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t))}\r\n\t\t\t\t{/* Grip marks in the bottom-right corner — the affordance that says the\r\n\t\t\t\t    panel is resizable. Decorative; the handle above it does the work. */}\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tposition: \"absolute\", right: 3, bottom: 3, width: 14, height: 14, zIndex: 5,\r\n\t\t\t\t\t\tpointerEvents: \"none\", opacity: 0.5,\r\n\t\t\t\t\t\tborderRight: \"2px solid\", borderBottom: \"2px solid\", borderColor: \"divider\",\r\n\t\t\t\t\t\tborderBottomRightRadius: 3,\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\t{/* Transparent handle over the phone's own header (~46px). It stops\r\n\t\t\t\t    short of the right edge so the phone's minimize / close buttons\r\n\t\t\t\t    stay clickable — a full-width handle would swallow those clicks\r\n\t\t\t\t    and the panel could never be collapsed. */}\r\n\t\t\t\t<Box\r\n\t\t\t\t\tonMouseDown={startDrag}\r\n\t\t\t\t\tsx={{ position: \"absolute\", top: 0, left: 0, right: 96, height: 46, cursor: \"move\", zIndex: 2 }}\r\n\t\t\t\t/>\r\n\t\t\t\t{/* Pop-out uses the MINIMAL self-login URL so the shareable link stays\r\n\t\t\t\t    short. Sits above the drag handle so the click isn't swallowed. */}\r\n\t\t\t\t{popoutSrc && (\r\n\t\t\t\t\t<Tooltip title=\"Open dialer in new tab\">\r\n\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\taria-label=\"open dialer in new tab\"\r\n\t\t\t\t\t\t\tonClick={() => window.open(popoutSrc, \"_blank\", \"noopener,noreferrer\")}\r\n\t\t\t\t\t\t\tsx={{ position: \"absolute\", top: 6, left: 6, zIndex: 3, color: \"text.secondary\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<OpenInNewIcon fontSize=\"small\" />\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t</Tooltip>\r\n\t\t\t\t)}\r\n\t\t\t\t<Box\r\n\t\t\t\t\tcomponent=\"iframe\"\r\n\t\t\t\t\ttitle=\"ahs-cti call control\"\r\n\t\t\t\t\tsrc={src}\r\n\t\t\t\t\tref={(el: HTMLIFrameElement | null) => {\r\n\t\t\t\t\t\tiframeRef.current = el;\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonLoad={() => setIframeReady(true)}\r\n\t\t\t\t\tallow=\"microphone; camera; autoplay; clipboard-write\"\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tflex: 1,\r\n\t\t\t\t\t\twidth: \"100%\",\r\n\t\t\t\t\t\tborder: 0,\r\n\t\t\t\t\t\t// Let mouse events reach the window during a drag or resize — the\r\n\t\t\t\t\t\t// iframe would otherwise swallow them the moment the cursor\r\n\t\t\t\t\t\t// crossed into it, freezing the gesture.\r\n\t\t\t\t\t\tpointerEvents: dragging || resizing ? \"none\" : \"auto\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t</Paper>\r\n\r\n\t\t\t{!open && (\r\n\t\t\t\t<Tooltip title=\"Open dialer\">\r\n\t\t\t\t\t<Fab\r\n\t\t\t\t\t\taria-label=\"open dialer\"\r\n\t\t\t\t\t\tonClick={() => setOpen(true)}\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tposition: \"fixed\",\r\n\t\t\t\t\t\t\tbottom: 24,\r\n\t\t\t\t\t\t\tright: 24,\r\n\t\t\t\t\t\t\tbgcolor: resolvedPrimary,\r\n\t\t\t\t\t\t\tcolor: \"#fff\",\r\n\t\t\t\t\t\t\t\"&:hover\": { bgcolor: resolvedPrimary, filter: \"brightness(0.92)\" },\r\n\t\t\t\t\t\t\tzIndex: (t) => t.zIndex.drawer + 2,\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<Badge color=\"success\" variant=\"dot\" invisible={!onCall} overlap=\"circular\">\r\n\t\t\t\t\t\t\t<CallIcon />\r\n\t\t\t\t\t\t</Badge>\r\n\t\t\t\t\t</Fab>\r\n\t\t\t\t</Tooltip>\r\n\t\t\t)}\r\n\t\t</>\r\n\t);\r\n}\r\n\r\nexport default CallControlIframe;\r\n","import { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport { RELOAD_PENDING_WRAPUP_KEY } from \"./reloadDetection\";\r\nimport type { CallData } from \"../../types\";\r\n\r\nconst getDeviceIp = () => {\r\n  try {\r\n    return sessionStorage.getItem(\"device_ip\") ||\r\n      localStorage.getItem(\"device_ip\") ||\r\n      (typeof window !== \"undefined\" ? (window as any).__device_ip : \"\") ||\r\n      \"\";\r\n  } catch {\r\n    return \"\";\r\n  }\r\n};\r\n\r\nlet cleanupSent = false;\r\n\r\nconst clean = (value: unknown) => String(value ?? \"\").trim().replace(/^Bearer\\s+/i, \"\");\r\nconst isWrapup = (value: unknown) => String(value ?? \"\").toUpperCase().replace(/[\\s_-]/g, \"\") === \"WRAPUP\";\r\n\r\n// The agent-events backend uses a few legacy names that are not part of the\r\n// public SDK CallData type. Keep them optional for unload recovery only.\r\ntype UnloadCallData = Partial<CallData> & {\r\n  call_reference_id?: string;\r\n  call_uuid?: string;\r\n  customer_number?: string;\r\n  break_details?: { type?: string; value?: string } | null;\r\n};\r\n\r\n/**\r\n * The break type to report when wrap-up is cut short by the tab closing — always a\r\n * name the BACKEND gave, never one invented here.\r\n *\r\n * The live agent-events frame first, then `PREVIOUS_AGENT_STATUS` (the break the\r\n * dialer last posted) and `CTI_BACKEND_BREAK_TYPE` (the first row of GET /cti/breaks,\r\n * cached by the phone), both of which are rows of the tenant's own breaks list.\r\n * \"BREAK\"/\"IDLE\" are the dialer's placeholders for an unconfigured break, not types.\r\n * Nothing matched → \"\" and the caller drops `break_type`, which the AGENTBREAK schema\r\n * allows, leaving the naming to the backend.\r\n */\r\nconst resolveBackendBreakType = (breakDetails?: { type?: string; value?: string } | null): string => {\r\n  const read = (key: string) => {\r\n    try {\r\n      return (sessionStorage.getItem(key) || \"\").trim();\r\n    } catch {\r\n      return \"\";\r\n    }\r\n  };\r\n  const usable = (value: string) => {\r\n    const upper = value.toUpperCase();\r\n    return value && upper !== \"BREAK\" && upper !== \"IDLE\" ? value : \"\";\r\n  };\r\n  return (\r\n    usable(clean(breakDetails?.value || breakDetails?.type)) ||\r\n    usable(read(\"PREVIOUS_AGENT_STATUS\")) ||\r\n    usable(read(\"CTI_BACKEND_BREAK_TYPE\"))\r\n  );\r\n};\r\n\r\n/**\r\n * Sends hangup and status cleanup from the top-level SDK document on tab close or\r\n * refresh. A refresh during ONCALL/RINGING/WRAPUP ends the call and leaves the agent\r\n * IDLE; closing the tab in WRAPUP parks the agent on a break. IDLE/BREAK are not\r\n * touched, so they come back unchanged after a refresh.\r\n */\r\nexport const sendSdkUnloadCleanup = (snapshot?: any): void => {\r\n  if (cleanupSent || typeof window === \"undefined\") return;\r\n\r\n  const state = snapshot || sdkStateManager.getState();\r\n  const call = (state?.callData ?? {}) as UnloadCallData;\r\n  const statuses = [call.status, state?.agentStatus, state?.status];\r\n  const normalizedStatuses = statuses.map((status) => String(status ?? \"\").toUpperCase());\r\n  const wrapup = normalizedStatuses.some(isWrapup);\r\n  const hasCallId = Boolean(call.call_id || call.call_reference_id || call.call_uuid || call.callReferenceId);\r\n  const active = wrapup || normalizedStatuses.some((status) =>\r\n    [\"ONCALL\", \"RINGING\", \"DIALING\", \"HOLD\", \"INCALL\", \"ANSWERED\", \"TALKING\"].includes(status) ||\r\n    (hasCallId && ![\"\", \"IDLE\", \"BREAK\", \"LOGOUT\"].includes(status)),\r\n  );\r\n  if (!active) return;\r\n  // Never a break on unload: Chrome's reload button can't be told from a tab\r\n  // close here (checkIsPageReload misses it), and parking the agent on a break\r\n  // wrote a \"Not Ready\" row into the break report on every such refresh.\r\n  const markAsBreak = false;\r\n\r\n  const unloadCleanupKey = \"__AHS_CALL_UNLOAD_CLEANUP_SENT__\";\r\n  if ((window as any)[unloadCleanupKey]) return;\r\n\r\n  const agentId = clean(state?.agentId || call.agent_id);\r\n  const callId = clean(call.call_id || call.call_reference_id || call.call_uuid || call.callReferenceId);\r\n  if (!agentId) return;\r\n  cleanupSent = true;\r\n  (window as any)[unloadCleanupKey] = true;\r\n\r\n  const baseUrl = clean(state?.urlConfig?.coreBaseURL || state?.urlConfig?.baseURL).replace(/\\/+$/, \"\");\r\n  const token = clean(\r\n    (typeof window !== \"undefined\" ? (window as any).__ctiAuth?.token : \"\") ||\r\n    sdkStateManager.getSdkAuthToken() ||\r\n    sessionStorage.getItem(\"token\") ||\r\n    localStorage.getItem(\"token\"),\r\n  );\r\n  const deviceIp = getDeviceIp();\r\n  const tenantId = clean(sdkStateManager.getCredentials()?.tenantId || sdkStateManager.getTenantId());\r\n  const endpoint = (path: string) => (baseUrl ? `${baseUrl}${path}` : path);\r\n  const withAuth = (url: string) => {\r\n    const target = new URL(url, window.location.origin);\r\n    if (tenantId) target.searchParams.set(\"tenantId\", tenantId);\r\n    target.searchParams.set(\"userId\", agentId);\r\n    return target.toString();\r\n  };\r\n  const hangup = {\r\n    call_id: callId, call_reference_id: callId, agent_id: agentId,\r\n    mobile_number: call.phone_number || call.customer_number || \"\",\r\n    is_mark_as_break: markAsBreak, disposition: wrapup ? \"AUTO_WRAPUP\" : \"\", reason: \"normal\",\r\n  };\r\n  const breakType = resolveBackendBreakType(call.break_details);\r\n  const statusPayload = markAsBreak\r\n    ? {\r\n        action: \"AGENTBREAK\", userId: agentId, user_id: agentId, agent_id: agentId,\r\n        is_mark_as_break: true, disposition: \"AUTO_WRAPUP\",\r\n        // Only a break the backend named; omitted otherwise (break_type is nullable\r\n        // in the AGENTBREAK schema) so nothing invents a break type client-side.\r\n        ...(breakType ? { break_type: breakType } : {}),\r\n      }\r\n    : { action: \"READYAGENT\", userId: agentId, user_id: agentId, agent_id: agentId };\r\n\r\n  const send = (path: string, payload: unknown) => {\r\n    const body = JSON.stringify(payload);\r\n    const url = withAuth(endpoint(path));\r\n    const headers: Record<string, string> = {\r\n      \"Content-Type\": \"application/json\",\r\n      Accept: \"application/json\",\r\n      ...(token ? { Authorization: `Bearer ${token}` } : {}),\r\n      ...(deviceIp ? { \"x-device-ip\": deviceIp } : {}),\r\n    };\r\n\r\n    if (typeof fetch === \"function\") {\r\n      void fetch(url, { method: \"POST\", body, keepalive: true, headers }).catch(() => undefined);\r\n      return;\r\n    }\r\n\r\n    const blob = new Blob([body], { type: \"application/json\" });\r\n    try {\r\n      navigator.sendBeacon?.(url, blob);\r\n    } catch {\r\n      // The document is already closing; there is no further transport fallback.\r\n    }\r\n  };\r\n\r\n  send(\"/api/v1/cti/calls/hangup\", hangup);\r\n  // READY to /agents/ready: /agents/status reads break_type alone, and a READYAGENT\r\n  // body (none) would land there as an unnamed BREAK.\r\n  send(markAsBreak ? \"/api/v1/agents/status\" : \"/api/v1/agents/ready\", statusPayload);\r\n\r\n  // The call is over either way — the reloaded document must not restore it.\r\n  try {\r\n    sessionStorage.removeItem(RELOAD_PENDING_WRAPUP_KEY);\r\n  } catch {\r\n    // sessionStorage can be unavailable while the document is closing.\r\n  }\r\n  sdkStateManager.updateCallData({\r\n    status: markAsBreak ? \"BREAK\" : \"IDLE\",\r\n    call_id: \"\",\r\n    phone_number: \"\",\r\n    queue_name: \"\",\r\n    call_details: undefined,\r\n  });\r\n};\r\n","import React from \"react\";\r\nimport { SDKPermissionGuard } from \"../components/SDKPermissionGuard\";\r\nimport { SDK_MENU_CODES, SDK_PERMISSIONS } from \"../permissions\";\r\n\r\n// ─── helper ──────────────────────────────────────────────────────────────────\r\n\r\nfunction withGuard(\r\n\tmenuCodes: string | string[],\r\n\tloader: () => Promise<{ default: React.FC<any> }>,\r\n\tpermissions?: string | string[],\r\n\t/**\r\n\t * Permission code(s) that grant this page on their own, bypassing the menu +\r\n\t * permission gates. Reserved for the role access codes on the page a login\r\n\t * lands on straight after signing in.\r\n\t */\r\n\taccessOverride?: string | string[],\r\n\t/**\r\n\t * `permissions` is ANY-of by default. Set this where the endpoints behind the\r\n\t * page need every one of them, so the guard matches what the API enforces.\r\n\t */\r\n\trequireAllPermissions?: boolean,\r\n): React.LazyExoticComponent<React.FC<any>> {\r\n\tconst permissionList = permissions\r\n\t\t? Array.isArray(permissions)\r\n\t\t\t? permissions\r\n\t\t\t: [permissions]\r\n\t\t: undefined;\r\n\treturn React.lazy(async () => {\r\n\t\tconst mod = await loader();\r\n\t\tconst Page = mod.default;\r\n\t\tconst Guarded: React.FC<any> = (props) => (\r\n\t\t\t<SDKPermissionGuard\r\n\t\t\t\tmenuFeature={menuCodes}\r\n\t\t\t\tpermissions={permissionList}\r\n\t\t\t\trequireAll={requireAllPermissions}\r\n\t\t\t\taccessOverride={accessOverride}\r\n\t\t\t>\r\n\t\t\t\t<Page {...props} />\r\n\t\t\t</SDKPermissionGuard>\r\n\t\t);\r\n\t\treturn { default: Guarded };\r\n\t});\r\n}\r\n\r\n// ─── page list ────────────────────────────────────────────────────────────────\r\n//  Add new SDK pages here — one entry per page, guard is applied automatically.\r\n\r\nexport const SDKPages = {\r\n\tCallHistory: withGuard(SDK_MENU_CODES.CALL_HISTORY, () => import(\"./callHistory\"), SDK_PERMISSIONS.REPORTS_CALL_HISTORY_READ),\r\n\tCampaigns: withGuard(SDK_MENU_CODES.CAMPAIGNS, () => import(\"./campaigns\"), [SDK_PERMISSIONS.CAMPAIGNS_READ, SDK_PERMISSIONS.CAMPAIGNS_MANAGE]),\r\n\tLoginReport: withGuard(SDK_MENU_CODES.LOGIN_REPORT, () => import(\"./loginReport\"), [SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_READ, SDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE]),\r\n\tCdrReports: withGuard(SDK_MENU_CODES.CDR_REPORT, () => import(\"./cdrReport\"), [SDK_PERMISSIONS.REPORTS_CDR_READ, SDK_PERMISSIONS.REPORTS_CDR_MANAGE]),\r\n\t// CDR_REPORT menu code as a fallback until `summary_report` is seeded on tenants.\r\n\t// Any one tab's read permission opens the page; the page hides the tabs it lacks.\r\n\tSummaryReport: withGuard([SDK_MENU_CODES.SUMMARY_REPORT, SDK_MENU_CODES.CDR_REPORT], () => import(\"./summaryReport\"), [SDK_PERMISSIONS.REPORTS_HOURLY_SUMMARY_READ, SDK_PERMISSIONS.REPORTS_DAILY_SUMMARY_READ, SDK_PERMISSIONS.REPORTS_DID_SUMMARY_READ, SDK_PERMISSIONS.REPORTS_MANAGEMENT_SUMMARY_READ]),\r\n\t// Live pacing and the daily compliance report on one supervisor page. The\r\n\t// page's own read code alone: the Daily compliance tab checks its own\r\n\t// permission, so a login without it gets the Live tab rather than a locked page.\r\n\tPredictivePacing: withGuard(\r\n\t\tSDK_MENU_CODES.CAMPAIGNS,\r\n\t\t() => import(\"./predictivePacing\"),\r\n\t\tSDK_PERMISSIONS.PREDICTIVE_PACING_READ,\r\n\t),\r\n\t// Workforce management: the agents each queue needs against the agents on\r\n\t// shift. Its own feature and permission, both seeded with the backend branch.\r\n\tWfmStaffing: withGuard(\r\n\t\tSDK_MENU_CODES.WFM,\r\n\t\t() => import(\"./wfmStaffing\"),\r\n\t\tSDK_PERMISSIONS.WFM_READ,\r\n\t),\r\n\tAuditReportPage: withGuard(SDK_MENU_CODES.CDR_REPORT, () => import(\"./auditReport\"), [SDK_PERMISSIONS.REPORTS_CDR_READ, SDK_PERMISSIONS.REPORTS_CDR_MANAGE]),\r\n\tAgentPerformanceReport: withGuard(SDK_MENU_CODES.AGENT_PERFORMANCE_REPORT, () => import(\"./agentPerformanceReport\"), [SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_READ, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE]),\r\n\t// AGENT_ACCESS override: this is the page an agent login lands on after sign-in.\r\n\tAgentDetailReport: withGuard(SDK_MENU_CODES.AGENT_DETAIL_REPORT, () => import(\"./agentDetailReport\"), [SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_READ, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE], SDK_PERMISSIONS.AGENT_ACCESS),\r\n\tLiveStatus: withGuard(SDK_MENU_CODES.LIVE_STATUS, () => import(\"./liveStatus\"), [SDK_PERMISSIONS.DASHBOARD_LIVE_STATUS_READ, SDK_PERMISSIONS.DASHBOARD_LIVE_STATUS_MANAGE]),\r\n\t// SUPERVISOR_ACCESS override: this is the page a supervisor login lands on after sign-in.\r\n\tManagementDashboard: withGuard(SDK_MENU_CODES.MANAGEMENT_DASHBOARD, () => import(\"./managementDashboard\"), SDK_PERMISSIONS.MANAGEMENT_DASHBOARD_READ, SDK_PERMISSIONS.SUPERVISOR_ACCESS),\r\n\tCaroVoiceAI: withGuard(SDK_MENU_CODES.CARO_VOICE_AI, () => import(\"./caroVoiceAI\"), SDK_PERMISSIONS.CARO_VOICE_AI_READ),\r\n\tQualityAuditDashboard: withGuard(SDK_MENU_CODES.QUALITY_AUDIT_DASHBOARD, () => import(\"./qualityAuditDashboard\"), SDK_PERMISSIONS.QUALITY_AUDIT_DASHBOARD_READ),\r\n\tCaroQualityAuditDashboard: withGuard(SDK_MENU_CODES.CARO_VOICE_AI_DASHBOARD, () => import(\"./caroQualityAuditDashboard\"), SDK_PERMISSIONS.CARO_VOICE_AI_DASHBOARD_READ),\r\n\tLeadIntegrations: withGuard(SDK_MENU_CODES.LEAD_INTEGRATIONS, () => import(\"./leadIntegrations\"), [SDK_PERMISSIONS.LEAD_INTEGRATIONS_READ, SDK_PERMISSIONS.LEAD_INTEGRATIONS_MANAGE])\r\n} as const;\r\n","import { useCallback, useEffect, useRef, useState } from \"react\";\r\n\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport { getSession } from \"@react-solutions/vault\";\r\nimport { STORAGE_KEY } from \"../utils/storage\";\r\n\r\nexport interface ConferenceCallPayload {\r\n  mobileNumber: string;\r\n  lineNumber?: number;\r\n}\r\n\r\nexport interface UseClickToConferenceReturn {\r\n  handleStartConferenceCall: (payload: ConferenceCallPayload) => Promise<any>;\r\n  isLoading: boolean;\r\n  isSuccess: boolean;\r\n  isError: boolean;\r\n  error: any;\r\n  data: any;\r\n}\r\n\r\nexport const useClickToConference = (): UseClickToConferenceReturn => {\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<any>(null);\r\n  const [data, setData] = useState<any>(null);\r\n\r\n  // Track the line we dialed so we can watch for its socket update\r\n  const pendingLineRef = useRef<number | null>(null);\r\n  // Track the last seen conference state to detect changes\r\n  const prevConferenceRef = useRef<any[]>([]);\r\n\r\n  useEffect(() => {\r\n    if (pendingLineRef.current === null) return;\r\n\r\n    const unsubscribe = sdkStateManager.subscribe(() => {\r\n      const state = sdkStateManager.getState();\r\n      const targetLine = pendingLineRef.current;\r\n\r\n      if (targetLine === null) return;\r\n\r\n      const line = (state.conferenceLine as any[])?.find(\r\n        (l) => l.line === targetLine,\r\n      );\r\n\r\n      // Socket has updated the line away from IDLE — conference is live\r\n      if (line && line.status !== \"IDLE\") {\r\n        pendingLineRef.current = null;\r\n        prevConferenceRef.current = [];\r\n        sdkStateManager.setOpenConferenceDialog(true);\r\n      }\r\n    });\r\n\r\n    return unsubscribe;\r\n  }, [loading]);\r\n\r\n  const handleStartConferenceCall = useCallback(\r\n    async (payload: ConferenceCallPayload): Promise<any> => {\r\n      const state = getSession(STORAGE_KEY) as any;\r\n\r\n      if (state?.callData?.status !== \"ONCALL\") {\r\n        const msg = \"Conference call requires an active call (ONCALL status)\";\r\n        setIsError(true);\r\n        setError(new Error(msg));\r\n        throw new Error(msg);\r\n      }\r\n\r\n      const availableLine =\r\n        payload.lineNumber != null\r\n          ? state?.conferenceLine?.find(\r\n              (l: any) => l.line === payload.lineNumber,\r\n            )\r\n          : state?.conferenceLine\r\n              ?.filter((l: any) => l.line !== 1)\r\n              ?.find((l: any) => l.status === \"IDLE\" && !l?.isCallStart);\r\n\r\n      if (!availableLine) {\r\n        const msg = \"No available conference line found\";\r\n        setIsError(true);\r\n        setError(new Error(msg));\r\n        throw new Error(msg);\r\n      }\r\n\r\n      const requestPayload = {\r\n        action: \"EXTERNAL_CONFERENCE\",\r\n        operation: `CALL${availableLine.line}`,\r\n        target: payload.mobileNumber,\r\n        line_number: Number(availableLine.line),\r\n        userid: state.agentId,\r\n        process: state.callData?.process_name ?? \"\",\r\n      };\r\n\r\n      setLoading(true);\r\n      setIsError(false);\r\n      setError(null);\r\n      setSuccess(false);\r\n\r\n      // Record which line we are waiting on so the subscriber can watch it\r\n      pendingLineRef.current = availableLine.line;\r\n\r\n      return axiosInstance\r\n        .post(END_POINT.CONFERENCE_CALL, requestPayload)\r\n        .then((res) => {\r\n          setData(res?.data);\r\n          setSuccess(true);\r\n          return res?.data;\r\n        })\r\n        .catch((err) => {\r\n          pendingLineRef.current = null;\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    handleStartConferenceCall,\r\n    isLoading: loading,\r\n    isSuccess: success,\r\n    isError,\r\n    error,\r\n    data,\r\n  };\r\n};\r\n","import { removeSession } from \"@react-solutions/vault\";\r\n\r\nimport axiosInstance from \"../services/axios\";\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\nimport { STORAGE_KEY } from \"../utils/storage\";\r\nimport type { EndCallPayload } from \"../hooks/useEndCall\";\r\n\r\n// ─── Types ────────────────────────────────────────────────────────────────────\r\n\r\nexport interface StartCallPayload {\r\n  mobileNumber: string;\r\n  user?: string;\r\n  auto_answer?: boolean;\r\n  call_id?: string;\r\n  reference_id?: string;\r\n  call_source?: string;\r\n  caseId?: string;\r\n  isWrapup?: boolean;\r\n  parentCallUuid?: string;\r\n}\r\n\r\nexport interface ConferenceCallPayload {\r\n  mobileNumber: string;\r\n  lineNumber?: number;\r\n}\r\n\r\nexport type { EndCallPayload };\r\n\r\nexport type SupervisorMonitorMode = \"listen\" | \"whisper\" | \"barge\";\r\n\r\nexport interface StartMonitoringPayload {\r\n  call_id: string;\r\n  mode: SupervisorMonitorMode;\r\n  supervisor_extension?: string;\r\n  agent_extension?: string;\r\n}\r\n\r\nexport interface StopMonitoringPayload {\r\n  call_uuid: string;\r\n  session_id?: string;\r\n}\r\n\r\nexport interface ChangeModePayload {\r\n  call_uuid: string;\r\n  mode: SupervisorMonitorMode;\r\n  session_id?: string;\r\n}\r\n\r\n// ─── Actions ──────────────────────────────────────────────────────────────────\r\n\r\nexport function clickToCall(payload: StartCallPayload): Promise<any> {\r\n  const state = sdkStateManager.getState() as any;\r\n\r\n  // if (state?.callData?.status !== \"IDLE\" && state?.callData?.status !== \"ONCALL\"){\r\n  //   return Promise.reject(new Error(\"Agent is not ready\"));\r\n  // }\r\n\r\n    const body = {\r\n      phone_number: payload.mobileNumber,\r\n      user: payload.user ?? state?.agentId ?? \"\",\r\n      auto_answer: payload.auto_answer ?? false,\r\n      call_id: payload.call_id ?? state?.callData?.call_id ?? \"\",\r\n      reference_id: payload.reference_id ?? \"\",\r\n      call_source: payload.call_source ?? \"\",\r\n      caseId: payload.caseId ?? \"\",\r\n      isWrapup: payload.isWrapup ?? false,\r\n      parentCallUuid: payload.parentCallUuid ?? \"\",\r\n    };\r\n\r\n    return axiosInstance\r\n      .post(END_POINT.CLICK_TO_CALL, body)\r\n      .then((res) => {\r\n        try { sdkStateManager.resetConferenceLines(); } catch (_) {}\r\n        return res.data;\r\n      })\r\n      .catch((err) => {\r\n        return err?.response?.data;\r\n      });\r\n      \r\n}\r\n\r\nexport function clickToConference(payload: ConferenceCallPayload): Promise<any> {\r\n  const state = sdkStateManager.getState() as any;\r\n\r\n  // if (state?.callData?.status !== \"ONCALL\") {\r\n  //   return Promise.reject(new Error(\"Conference call requires an active call (ONCALL status)\"));\r\n  // }\r\n\r\n  const availableLine =\r\n    payload.lineNumber != null\r\n      ? state?.conferenceLine?.find((l: any) => l.line === payload.lineNumber)\r\n      : state?.conferenceLine\r\n          ?.filter((l: any) => l.line !== 1)\r\n          ?.find((l: any) => l.status === \"IDLE\" && !l?.isCallStart);\r\n\r\n  if (!availableLine) {\r\n    return Promise.reject(new Error(\"No available conference line found\"));\r\n  }\r\n\r\n  const body = {\r\n    action: \"EXTERNAL_CONFERENCE\",\r\n    operation: `CALL${availableLine.line}`,\r\n    target: payload.mobileNumber,\r\n    line_number: Number(availableLine.line),\r\n    userid: state.agentId,\r\n    process: state.callData?.process_name ?? \"\",\r\n  };\r\n\r\n  return axiosInstance\r\n    .post(END_POINT.CONFERENCE_CALL, body)\r\n    .then((res) => {\r\n      try { sdkStateManager.setOpenConferenceDialog(true); } catch (_) {}\r\n      return res.data;\r\n    })\r\n    .catch((err) => {\r\n      return err?.response?.data;\r\n    });\r\n}\r\n\r\nexport async function endCall(options: EndCallPayload = {}): Promise<any> {\r\n  const state = sdkStateManager.getState() as any;\r\n\r\n  const body = {\r\n    call_id: options.call_id ?? state?.callData?.call_id ?? \"\",\r\n    agent_id: options.agent_id ?? state?.agentId ?? \"\",\r\n    set_followUp: options.set_followUp ?? \"N\",\r\n    callback_date: options.callback_date ?? \"\",\r\n    callback_hrs: options.callback_hrs ?? 0,\r\n    callback_mins: options.callback_mins ?? 0,\r\n    mobile_number: options.mobile_number ?? state?.callData?.phone_number ?? \"\",\r\n    list_comments: options.list_comments ?? \"\",\r\n    call_reference_id: options.call_reference_id ?? state?.callData?.call_id ?? \"\",\r\n    is_mark_as_break: options.is_mark_as_break ?? false,\r\n    disposition: options.disposition ?? \"RES\",\r\n    line_number: options.line_number ?? 0,\r\n    reason: options.reason ?? \"normal\",\r\n  };\r\n\r\n  const res = await axiosInstance.post(END_POINT.END_CALL, body);\r\n  sdkStateManager.resetConferenceLines();\r\n  sdkStateManager.endCall();\r\n  return res.data;\r\n}\r\n\r\nexport async function logout(): Promise<void> {\r\n  let logoutError: Error | undefined;\r\n\r\n  try {\r\n    await axiosInstance.post(END_POINT.AUTH_LOGOUT);\r\n  } catch (err: any) {\r\n    const status = err?.response?.status;\r\n    \r\n    // 401/403 means session already invalid - treat as successful logout\r\n    if (status === 401 || status === 403) {\r\n      console.warn(\"[SDK angular logout] Session already invalid/expired; treating as already signed out.\", status);\r\n    } else {\r\n      // Only throw error for actual failures (network, 500, etc.)\r\n      logoutError = new Error(err?.response?.data?.message || \"Logout failed. Please try again.\");\r\n    }\r\n  } finally {\r\n    // Always clear local state regardless of API response\r\n    sdkStateManager.clearStorageAndReset();\r\n    removeSession(STORAGE_KEY);\r\n  }\r\n\r\n  if (logoutError) throw logoutError;\r\n}\r\n\r\nexport async function startMonitoring(payload: StartMonitoringPayload): Promise<any> {\r\n  const res = await axiosInstance.post(END_POINT.SUPERVISOR_CALL_LISTEN, payload);\r\n  return res.data;\r\n}\r\n\r\nexport async function stopMonitoring(payload: StopMonitoringPayload): Promise<any> {\r\n  const res = await axiosInstance.post(END_POINT.SUPERVISOR_CALL_LEAVE, payload);\r\n  return res.data;\r\n}\r\n\r\nexport async function changeMonitorMode(payload: ChangeModePayload): Promise<any> {\r\n  const res = await axiosInstance.post(END_POINT.SUPERVISOR_CALL_CHANGE_MODE, payload);\r\n  return res.data;\r\n}\r\n\r\n/**\r\n * Set lead data that will be attached as `lead_data` in the transfer API payload.\r\n * Call this whenever the lead details change in the host application.\r\n *\r\n * @example\r\n * setTransferLeadData({ lead_id: 123, customer_name: 'John' });\r\n */\r\nexport function setTransferLeadData(data: any): void {\r\n  sdkStateManager.setTransferLeadData(data);\r\n}\r\n","import { eventTracker } from \"./lib/hooks/eventsTracker\";\r\nimport { sdkStateManager } from \"./lib/hooks/sdk-state\";\r\nimport { rememberBreakName, resolveBreakName } from \"./lib/utils/breakType\";\r\nimport { DOCUMENT_ID } from \"./lib/utils/reloadDetection\";\r\nimport { useLogout } from \"./lib/hooks/useLogout\";\r\nimport { useEndCall } from \"./lib/hooks/useEndCall\";\r\nimport { SDKConfig, TenantInfo, URLConfig } from \"./types\";\r\nimport { useClickToCall } from \"./lib/hooks/useClickToCall\";\r\nimport { useGetCallerData } from \"./lib/hooks/useGetCallerData\";\r\nimport { useGetAuthorizationToken } from \"./lib/hooks/useGetAuthorizationToken\";\r\nimport { useSDKState } from \"./lib/hooks/useSDKState\";\r\nimport { useCallMonitoring } from \"./lib/hooks/useCallMonitoring\";\r\nimport {\r\n  SDK_PERMISSIONS,\r\n  SDK_MENU_CODES,\r\n  SDK_WILDCARD,\r\n  type SDKPermissionState,\r\n  type ControlsFromPermissions,\r\n  type SDKPermissionContextValue,\r\n} from \"./lib/permissions\";\r\n\r\nexport { CallControlPanel } from \"./lib/components/callControlPanel\";\r\n// Full iframe-hosted softphone. Use INSTEAD of CallControlPanel — it owns the\r\n// agent-events socket and forwards every event into SDK state, so\r\n// useGetCallerData()/useSDKState() keep working unchanged. Rendering both opens\r\n// two sockets for the same agent.\r\nexport { CallControlIframe } from \"./lib/components/callControlIframe\";\r\nexport type { CallControlIframeProps } from \"./lib/components/callControlIframe\";\r\nexport { SDKPages } from \"./lib/pages\";\r\nexport {\r\n  default as AuditReportDialog,\r\n  setAuditReportUrlResolver,\r\n  type AuditReportUrlResolver,\r\n} from \"./lib/pages/common/components/AuditReport\";\r\nexport {\r\n  default as ConferenceTimelineDialog,\r\n  type ConferenceTimelineDialogProps,\r\n} from \"./lib/pages/common/components/ConferenceTimeline\";\r\nexport { default as AgentDetailReport } from \"./lib/pages/agentDetailReport\";\r\nexport type { AgentDetailReportProps } from \"./lib/pages/agentDetailReport\";\r\nexport { SDKPermissionGuard } from \"./lib/components/SDKPermissionGuard\";\r\nexport { SDKAccessDenied } from \"./lib/components/SDKAccessDenied\";\r\nexport { useSDKPermissions } from \"./lib/hooks/useSDKPermissions\";\r\nexport type { SDKPermissionsHook } from \"./lib/hooks/useSDKPermissions\";\r\n\r\nexport type { CallControlPanelProps, CallData, SDKConfig } from \"./types\";\r\nexport type {\r\n  SDKPermissionState,\r\n  ControlsFromPermissions,\r\n  SDKPermissionContextValue,\r\n};\r\n\r\ninterface InitSDKParams {\r\n  apiKey: string;\r\n  tenantId: string;\r\n  agentId: string;\r\n  sessionId?: string;\r\n  sdkConfig?: SDKConfig;\r\n  urlConfig?: URLConfig;\r\n}\r\n\r\nexport interface SDKInitResult {\r\n  accessToken: string;\r\n  expiration: string;\r\n  ticketId: string;\r\n  callControls: any;\r\n  userInfo: any;\r\n  /**\r\n   * Tenant this session authenticated against. Tenant-keyed pages (Caro Voice AI)\r\n   * resolve their tenant from here, so it must be forwarded from the login\r\n   * response rather than dropped.\r\n   */\r\n  tenantInfo?: TenantInfo;\r\n}\r\n\r\nexport async function initSDK({\r\n  apiKey,\r\n  tenantId,\r\n  agentId,\r\n  sdkConfig,\r\n  urlConfig,\r\n}: InitSDKParams): Promise<SDKInitResult> {\r\n  if (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n    throw new Error(\"SDK initialization failed: API key is required\");\r\n  }\r\n\r\n  if (\r\n    !tenantId ||\r\n    typeof tenantId !== \"string\" ||\r\n    tenantId.trim().length === 0\r\n  ) {\r\n    throw new Error(\"SDK initialization failed: Tenant ID is required\");\r\n  }\r\n\r\n  if (!agentId || typeof agentId !== \"string\" || agentId.trim().length === 0) {\r\n    throw new Error(\"SDK initialization failed: Agent ID is required\");\r\n  }\r\n\r\n  // Seed the URLs before the login round-trip below — SDK pages that mount while\r\n  // this promise is in flight resolve their base URL from state, and until now it\r\n  // was only written once init had already returned. See setUrlConfig.\r\n  sdkStateManager.setUrlConfig(urlConfig);\r\n\r\n  try {\r\n    const initResult = await eventTracker.init({\r\n      apiKey: apiKey.trim(),\r\n      tenantId: tenantId.trim(),\r\n      agentId: agentId.trim(),\r\n      password: urlConfig?.password,\r\n      accessToken: urlConfig?.accessToken,\r\n      baseUrl: urlConfig?.coreBaseURL,\r\n    });\r\n\r\n    if (!initResult) {\r\n      sdkStateManager.setInitCheck();\r\n      throw new Error(\"SDK initialization failed\");\r\n    }\r\n\r\n    // To store all permissions,sdk & menus from init api response to STATE\r\n    if (initResult.userInfo) {\r\n      sdkStateManager.setSDKPermissions(initResult.userInfo);\r\n    }\r\n\r\n    // using stored permissions from response determining which items enables ONLY IN callcontrolpanel (hold,transfer)\r\n    const permissionControlsConfig = sdkStateManager.getControlsConfig();\r\n\r\n    // Remaining enalblement controls spreaded here along with callcontrolpanel controls\r\n    // Combined to single control config\r\n    const callcontrolConfig = {\r\n      ...(initResult.callControls || {}),\r\n      ...permissionControlsConfig,\r\n      ...(sdkConfig || {}),\r\n      // sdkPosition: 'vertical'\r\n    };\r\n\r\n    const res = {\r\n      accessToken: initResult.accessToken,\r\n      expiration: initResult.expiration,\r\n      ticketId: initResult.ticketId,\r\n      callControls: callcontrolConfig,\r\n      userInfo: initResult.userInfo,\r\n      // Forwarded so tenant-keyed pages can resolve their tenant. `res` is also\r\n      // what lands in sdkStateManager.authorization, which is persisted — so this\r\n      // stays readable for the whole session, not just at init time.\r\n      tenantInfo: initResult.tenantInfo,\r\n    };\r\n\r\n    console.info(\"SDK initialized successfully\");\r\n\r\n    sdkStateManager.initialize(\r\n      apiKey.trim(),\r\n      tenantId.trim(),\r\n      agentId.trim(),\r\n      urlConfig,\r\n      res,\r\n      callcontrolConfig,\r\n      initResult.callControls,\r\n    );\r\n\r\n    const currentCallDataStatus = String(\r\n      sdkStateManager.getState().callData?.status ?? \"\",\r\n    ).toUpperCase();\r\n    const isAlreadyInActiveOrWrapup = [\r\n      \"WRAPUP\",\r\n      \"ONCALL\",\r\n      \"RINGING\",\r\n      \"DIALING\",\r\n      \"HOLD\",\r\n    ].includes(currentCallDataStatus);\r\n\r\n    // A one-shot \"this is a fresh login\" marker for the call-control panel, which\r\n    // mounts later and cannot otherwise tell a login from a reload or a second\r\n    // tab. It reads the key once, asserts the system break the way the browser\r\n    // phone's applyFirstLoginBreak does, and clears it.\r\n    //\r\n    // initSDK is the right place to set it precisely because it runs ONCE per\r\n    // session (`isInitialized` is persisted, so Header skips it after a reload) —\r\n    // which is also why the panel cannot just assert on every mount: that would\r\n    // re-park a mid-shift agent on the login break every time the panel remounts.\r\n    if (typeof sessionStorage !== \"undefined\" && !isAlreadyInActiveOrWrapup) {\r\n      try {\r\n        // Stamped with this document's id — see DOCUMENT_ID.\r\n        sessionStorage.setItem(\"CTI_FRESH_LOGIN\", DOCUMENT_ID);\r\n      } catch {\r\n        // Storage blocked — the panel falls back to its read-only behaviour.\r\n      }\r\n      // The panel is usually mounted already (it comes up while this login is in\r\n      // flight), so tell it now rather than leaving the marker for its next mount —\r\n      // which would be the agent's next REFRESH, parking them on the login break.\r\n      try {\r\n        window.dispatchEvent(new Event(\"cti:fresh-login\"));\r\n      } catch {\r\n        // No window (SSR) — a panel mounting later reads the marker itself.\r\n      }\r\n    }\r\n\r\n    if (!isAlreadyInActiveOrWrapup) {\r\n      const loginStatus = String(\r\n        initResult.status || initResult.userInfo?.status || \"\",\r\n      ).toUpperCase();\r\n      const hasLoginBreak =\r\n        loginStatus === \"BREAK\" ||\r\n        loginStatus === \"PAUSE\" ||\r\n        loginStatus.includes(\"BREAK\") ||\r\n        Boolean(initResult.break_details || initResult.userInfo?.break_details);\r\n\r\n      if (hasLoginBreak) {\r\n        const breakDetails =\r\n          initResult.break_details || initResult.userInfo?.break_details;\r\n        // A login response that says BREAK without naming one leaves the name\r\n        // EMPTY. It used to fall back to the literal \"BREAK\", and that string did\r\n        // not stay local: it went into PREVIOUS_AGENT_STATUS, which the socket's\r\n        // reconnect restore posts straight back as `break_type` — so a nameless\r\n        // login break became a break type called \"BREAK\" in the backend's records,\r\n        // and the panel's break chip (which rejects \"BREAK\" as a name, rightly)\r\n        // showed no break type at all for the rest of the session. See\r\n        // resolveBreakName: backend names only, else \"\".\r\n        //\r\n        // Nothing is lost by leaving it empty. The agent still reads as on break —\r\n        // that comes from `status` — and the breaks-list backfill in callControls\r\n        // fills the name in as soon as GET /cti/breaks answers.\r\n        const breakName = resolveBreakName(\r\n          breakDetails?.value,\r\n          breakDetails?.type,\r\n          breakDetails?.break_type,\r\n          typeof breakDetails === \"string\" ? breakDetails : \"\",\r\n        );\r\n        sdkStateManager.updateCallData({\r\n          status: \"BREAK\",\r\n          break_details: breakName\r\n            ? typeof breakDetails === \"object\" && breakDetails !== null\r\n              ? breakDetails\r\n              : { type: breakName, value: breakName }\r\n            : null,\r\n        });\r\n        sdkStateManager.setAgentStatus(breakName);\r\n        // No-op for an empty name: the key means \"the backend has this break\", so\r\n        // a placeholder must not be written into it.\r\n        rememberBreakName(breakName);\r\n      }\r\n    }\r\n\r\n    return res;\r\n  } catch (error) {\r\n    sdkStateManager.setInitCheck();\r\n\r\n    if (error instanceof Error) {\r\n      throw error;\r\n    }\r\n\r\n    throw new Error(`SDK initialization failed: ${String(error)}`);\r\n  }\r\n}\r\n\r\nexport function getSDKVersion(): string {\r\n  return \"6.x.x\";\r\n}\r\n\r\nexport function isSDKInitialized(): boolean {\r\n  return sdkStateManager.getState().isInitialized;\r\n}\r\n\r\nexport {\r\n  useLogout,\r\n  useEndCall,\r\n  useClickToCall,\r\n  useGetCallerData,\r\n  useGetAuthorizationToken,\r\n  useSDKState,\r\n  useCallMonitoring,\r\n};\r\nexport type { UseClickToCallReturn, CallInitiationFunction, StartCalltHookStateTypes } from \"./lib/hooks/useClickToCall\";\r\nexport type { UseEndCallReturn, HookStateTypes, CallTerminationFunction } from \"./lib/hooks/useEndCall\";\r\nexport type { UseLogoutReturn, LogoutFunction, LogoutHookStateTypes } from \"./lib/hooks/useLogout\";\r\nexport { useClickToConference } from \"./lib/hooks/useClickToConference\";\r\nexport type { UseClickToConferenceReturn, ConferenceCallPayload as ConferenceCallHookPayload } from \"./lib/hooks/useClickToConference\";\r\n\r\nexport { sdkStateManager } from \"./lib/hooks/sdk-state\";\r\n\r\n// Disposition hierarchy + the call-scoped draft store. Exported because the host\r\n// app stages a disposition mid-call from its CRM screen and relays the draft into\r\n// the hosted Browser-Phone iframe, both of which need the same model the End Call\r\n// dialog uses.\r\nexport {\r\n  loadDispoTree,\r\n  buildDispoTree,\r\n  resolveDispoPath,\r\n  dispoLevelLabel,\r\n  dispoCallIdFrom,\r\n  readDispoDraft,\r\n  writeDispoDraft,\r\n  updateDispoDraft,\r\n  clearDispoDraft,\r\n  pruneDispoDrafts,\r\n  subscribeDispoDraft,\r\n  coerceDraft,\r\n  isDispoDraftEmpty,\r\n  EMPTY_DISPO_DRAFT,\r\n} from \"./lib/utils/disposition\";\r\nexport type { DispoNode, DispoDraft } from \"./lib/utils/disposition\";\r\n\r\nexport {\r\n  clickToCall,\r\n  clickToConference,\r\n  endCall,\r\n  logout,\r\n  startMonitoring,\r\n  stopMonitoring,\r\n  changeMonitorMode,\r\n  setTransferLeadData,\r\n} from \"./lib/angular-services\";\r\nexport type {\r\n  StartCallPayload,\r\n  ConferenceCallPayload,\r\n  EndCallPayload,\r\n  SupervisorMonitorMode,\r\n  StartMonitoringPayload,\r\n  StopMonitoringPayload,\r\n  ChangeModePayload,\r\n} from \"./lib/angular-services\";\r\n\r\nexport type {\r\n  UseCallMonitoringReturn,\r\n} from \"./lib/hooks/useCallMonitoring\";\r\n\r\n// Entitlement exports\r\nexport { SDK_PERMISSIONS, SDK_MENU_CODES, SDK_WILDCARD };\r\n"],"mappings":"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","names":["status","useCallback","useState","useState","useCallback","data","_a","useCallback","useState","useState","useCallback","data","status","_a","useState","useState","useCallback","CallEnd","Close","Pause","PlayArrow","SupportAgent","TransferWithinAStation","Upcoming","Box","Button","CircularProgress","Dialog","IconButton","Menu","MenuItem","Paper","TextField","Tooltip","Typography","useTheme","React","useEffect","useRef","useState","useTheme","useEffect","useState","useCallback","useCallback","useTheme","useState","useEffect","_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","useCallback","useRef","useState","Fragment","jsx","jsxs","normalizeDialNumber","clean","Box","Typography","useTheme","useRef","useState","useEffect","_a","_b","_c","_d","_e","_f","_g","clickToCall","endCall","status","React","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","isWrapup","isOnHold","isMuted","isSystemBreakRow","currentCallStatus","_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","Paper","IconButton","Tooltip","Button","Pause","CircularProgress","SupportAgent","PlayArrow","TransferWithinAStation","CallEnd","Close","Menu","TextField","MenuItem","Upcoming","Dialog","jsx","useCallback","Box","IconButton","Paper","Tooltip","useTheme","useCallback","useEffect","useRef","useState","status","_a","Fragment","jsx","jsxs","_a","useTheme","useState","useRef","_b","_c","_d","_e","_f","_g","_h","_i","_j","_k","_l","_m","useEffect","status","useCallback","Paper","Box","Tooltip","IconButton","React","jsx","React","useCallback","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","_a","_a","status"]}