ahs-cti 1.0.1-beta.2 → 1.0.1-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agentDetailReport-XUNWPSQW.mjs +10 -0
- package/dist/agentDetailReport-XUNWPSQW.mjs.map +1 -0
- package/dist/agentPerformanceReport-4WNLHIFT.mjs +597 -0
- package/dist/agentPerformanceReport-4WNLHIFT.mjs.map +1 -0
- package/dist/{callHistory-A5CBDPZR.mjs → callHistory-3CMW24B6.mjs} +27 -34
- package/dist/callHistory-3CMW24B6.mjs.map +1 -0
- package/dist/campaigns-FR7EIRXI.mjs +2664 -0
- package/dist/campaigns-FR7EIRXI.mjs.map +1 -0
- package/dist/cdrReport-6OBRKAYS.mjs +965 -0
- package/dist/cdrReport-6OBRKAYS.mjs.map +1 -0
- package/dist/chunk-AEDSLIHI.mjs +49 -0
- package/dist/chunk-AEDSLIHI.mjs.map +1 -0
- package/dist/chunk-FVNDPJUU.mjs +95 -0
- package/dist/chunk-FVNDPJUU.mjs.map +1 -0
- package/dist/chunk-I4CJTHZR.mjs +138 -0
- package/dist/chunk-I4CJTHZR.mjs.map +1 -0
- package/dist/chunk-RZZQ42MG.mjs +115 -0
- package/dist/chunk-RZZQ42MG.mjs.map +1 -0
- package/dist/chunk-U2DJ5WRK.mjs +1219 -0
- package/dist/chunk-U2DJ5WRK.mjs.map +1 -0
- package/dist/{chunk-FFYJ4LWU.mjs → chunk-YREOEULC.mjs} +127 -12
- package/dist/chunk-YREOEULC.mjs.map +1 -0
- package/dist/index.d.mts +630 -527
- package/dist/index.d.ts +631 -528
- package/dist/index.js +7409 -602
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +406 -512
- package/dist/index.mjs.map +1 -1
- package/dist/loginReport-MHNHB5F6.mjs +969 -0
- package/dist/loginReport-MHNHB5F6.mjs.map +1 -0
- package/package.json +16 -1
- package/dist/callHistory-A5CBDPZR.mjs.map +0 -1
- package/dist/chunk-FFYJ4LWU.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/loginReport/index.tsx","../call-control-sdk/lib/pages/loginReport/useLoginReport.ts","../call-control-sdk/lib/pages/loginReport/styles.ts"],"sourcesContent":["import React, { memo, useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport {\r\n\tAlert,\r\n\tBox,\r\n\tButton,\r\n\tChip,\r\n\tCircularProgress,\r\n\tDialog,\r\n\tDialogContent,\r\n\tDialogTitle,\r\n\tIconButton,\r\n\tInputAdornment,\r\n\tOutlinedInput,\r\n\tPaper,\r\n\tStack,\r\n\tTable,\r\n\tTableBody,\r\n\tTableCell,\r\n\tTableContainer,\r\n\tTableHead,\r\n\tTablePagination,\r\n\tTableRow,\r\n\tTableSortLabel,\r\n\tTypography,\r\n} from \"@mui/material\";\r\nimport CloseIcon from \"@mui/icons-material/Close\";\r\nimport DownloadIcon from \"@mui/icons-material/Download\";\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\n\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport isoWeek from \"dayjs/plugin/isoWeek\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport { DateTimePicker } from \"@mui/x-date-pickers/DateTimePicker\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPageHeader } from \"../../components/SDKPageHeader\";\r\nimport { SDKButton } from \"../../components/SDKButton\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\nimport { useToast } from \"../../services/toastMessage\";\r\n\r\nimport { useLoginReport } from \"./useLoginReport\";\r\nimport type {\r\n\tLoginAgentRowResponse,\r\n\tLoginReportParams,\r\n\tLoginSessionResponse,\r\n\tQuickRange,\r\n\tSortDir,\r\n\tSortKey,\r\n} from \"./types\";\r\nimport {\r\n\tCOLORS,\r\n\tDEFAULT_ROWS_PER_PAGE,\r\n\tFONT,\r\n\tdateFieldSx,\r\n\tdialogContentSx,\r\n\tdialogPaperSx,\r\n\tdialogTitleSx,\r\n\tdurationCellBreakSx,\r\n\tdurationCellTotalSx,\r\n\tdurationCellWorkingSx,\r\n\tfilterBarSx,\r\n\theadCellSx,\r\n\tidCellSx,\r\n\tloggedInChipSx,\r\n\tloginsChipSx,\r\n\tnameCellSx,\r\n\tpaginationSx,\r\n\tqueueChipSx,\r\n\tquickRangeBtnSx,\r\n\tsessionCardHeaderSx,\r\n\tsessionCardSx,\r\n\tsortLabelSx,\r\n\ttableContainerSx,\r\n\ttableRowSx,\r\n\ttableSx,\r\n\tutilisationBarBgSx,\r\n\tutilisationChipSx,\r\n} from \"./styles\";\r\n\r\ndayjs.extend(isoWeek);\r\n\r\n// ──── Helpers ─────────────────────────────────────────────────────────────────\r\n\r\nconst comparator = (\r\n\ta: LoginAgentRowResponse,\r\n\tb: LoginAgentRowResponse,\r\n\tkey: SortKey,\r\n): number => {\r\n\tconst av = a[key];\r\n\tconst bv = b[key];\r\n\tif (typeof av === \"number\" && typeof bv === \"number\") return av - bv;\r\n\treturn String(av ?? \"\").localeCompare(String(bv ?? \"\"));\r\n};\r\n\r\nfunction rangeToDates(range: QuickRange): { start: Dayjs; end: Dayjs } | null {\r\n\tconst now = dayjs();\r\n\tif (range === \"today\") return { start: now.startOf(\"day\"), end: now };\r\n\tif (range === \"week\") return { start: now.startOf(\"isoWeek\"), end: now };\r\n\tif (range === \"month\") return { start: now.startOf(\"month\"), end: now };\r\n\treturn null;\r\n}\r\n\r\n// ──── Main content ────────────────────────────────────────────────────────────\r\n\r\nconst LoginReportContent = memo(function LoginReportContent() {\r\n\tconst { showToast } = useToast();\r\n\tconst {\r\n\t\tagents: reportData,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tsetError,\r\n\t\tfetchAgents,\r\n\t\tfetchAgentSessions,\r\n\t\texportReportExcel,\r\n\t\texportAgentSessionsExcel,\r\n\t} = useLoginReport();\r\n\r\n\t// Filter state\r\n\tconst [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n\tconst [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n\tconst [activeQuickDate, setActiveQuickDate] = useState<QuickRange>(\"today\");\r\n\tconst [searchText, setSearchText] = useState(\"\");\r\n\r\n\t// Table state\r\n\tconst [page, setPage] = useState(0);\r\n\tconst [rowsPerPage, setRowsPerPage] = useState(DEFAULT_ROWS_PER_PAGE);\r\n\tconst [sortKey, setSortKey] = useState<SortKey>(\"fullName\");\r\n\tconst [sortDir, setSortDir] = useState<SortDir>(\"asc\");\r\n\r\n\t// Dialog state\r\n\tconst [dialogOpen, setDialogOpen] = useState(false);\r\n\tconst [selectedRow, setSelectedRow] = useState<LoginAgentRowResponse | null>(null);\r\n\tconst [sessions, setSessions] = useState<LoginSessionResponse[]>([]);\r\n\tconst [sessionsLoading, setSessionsLoading] = useState(false);\r\n\r\n\t// ──── Fetch ────────────────────────────────────────────────────────────────\r\n\tconst fetchReport = useCallback(\r\n\t\tasync (overrideStart?: Dayjs | null, overrideEnd?: Dayjs | null) => {\r\n\t\t\tconst sd = overrideStart ?? startDate;\r\n\t\t\tconst ed = overrideEnd ?? endDate;\r\n\t\t\tif (!sd || !ed) {\r\n\t\t\t\tsetError(\"Select a valid date range\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst params: LoginReportParams = {\r\n\t\t\t\tstart_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t\tend_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t};\r\n\t\t\tawait fetchAgents(params);\r\n\t\t\tsetPage(0);\r\n\t\t},\r\n\t\t[startDate, endDate, fetchAgents, setError],\r\n\t);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (startDate && endDate) fetchReport();\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [startDate, endDate]);\r\n\r\n\t// ──── Quick ranges ─────────────────────────────────────────────────────────\r\n\tconst handleQuickRange = (range: QuickRange) => {\r\n\t\tsetActiveQuickDate(range);\r\n\t\tconst dates = rangeToDates(range);\r\n\t\tif (dates) {\r\n\t\t\tsetStartDate(dates.start);\r\n\t\t\tsetEndDate(dates.end);\r\n\t\t}\r\n\t};\r\n\r\n\t// ──── Filtered + sorted ────────────────────────────────────────────────────\r\n\tconst filteredData = useMemo(() => {\r\n\t\tlet rows = [...reportData];\r\n\t\tif (searchText.trim()) {\r\n\t\t\tconst q = searchText.trim().toLowerCase();\r\n\t\t\trows = rows.filter(\r\n\t\t\t\t(r) =>\r\n\t\t\t\t\tr.fullName.toLowerCase().includes(q) ||\r\n\t\t\t\t\tr.agentId.toLowerCase().includes(q),\r\n\t\t\t);\r\n\t\t}\r\n\t\trows.sort((a, b) => {\r\n\t\t\tconst cmp = comparator(a, b, sortKey);\r\n\t\t\treturn sortDir === \"asc\" ? cmp : -cmp;\r\n\t\t});\r\n\t\treturn rows;\r\n\t}, [reportData, searchText, sortKey, sortDir]);\r\n\r\n\tconst paginatedData = useMemo(\r\n\t\t() =>\r\n\t\t\tfilteredData.slice(\r\n\t\t\t\tpage * rowsPerPage,\r\n\t\t\t\tpage * rowsPerPage + rowsPerPage,\r\n\t\t\t),\r\n\t\t[filteredData, page, rowsPerPage],\r\n\t);\r\n\r\n\tconst handleSort = (key: SortKey) => {\r\n\t\tif (sortKey === key) {\r\n\t\t\tsetSortDir((d) => (d === \"asc\" ? \"desc\" : \"asc\"));\r\n\t\t} else {\r\n\t\t\tsetSortKey(key);\r\n\t\t\tsetSortDir(\"asc\");\r\n\t\t}\r\n\t};\r\n\r\n\t// ──── Dialog handlers ──────────────────────────────────────────────────────\r\n\tconst openDialog = async (row: LoginAgentRowResponse) => {\r\n\t\tsetSelectedRow(row);\r\n\t\tsetSessions([]);\r\n\t\tsetDialogOpen(true);\r\n\t\tsetSessionsLoading(true);\r\n\t\ttry {\r\n\t\t\tconst sd = startDate ?? dayjs();\r\n\t\t\tconst ed = endDate ?? dayjs();\r\n\t\t\tconst data = await fetchAgentSessions(row.agentId, {\r\n\t\t\t\tstart_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t\tend_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t});\r\n\t\t\tsetSessions(data);\r\n\t\t} catch {\r\n\t\t\tsetSessions([]);\r\n\t\t} finally {\r\n\t\t\tsetSessionsLoading(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst closeDialog = () => {\r\n\t\tsetDialogOpen(false);\r\n\t\tsetTimeout(() => {\r\n\t\t\tsetSelectedRow(null);\r\n\t\t\tsetSessions([]);\r\n\t\t}, 300);\r\n\t};\r\n\r\n\t// ──── Export ───────────────────────────────────────────────────────────────\r\n\tconst handleExportExcel = async () => {\r\n\t\tconst sd = startDate ?? dayjs();\r\n\t\tconst ed = endDate ?? dayjs();\r\n\t\ttry {\r\n\t\t\tawait exportReportExcel({\r\n\t\t\t\tstart_date: sd.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t\tend_date: ed.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t});\r\n\t\t\tshowToast(\"Export started\", \"success\");\r\n\t\t} catch (err: any) {\r\n\t\t\tshowToast(err?.message || \"Failed to export Excel\", \"error\");\r\n\t\t}\r\n\t};\r\n\r\n\tconst handleExportSessions = async () => {\r\n\t\tif (!selectedRow) return;\r\n\t\ttry {\r\n\t\t\tawait exportAgentSessionsExcel(selectedRow.agentId, {\r\n\t\t\t\tstart_date: (startDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t\tend_date: (endDate ?? dayjs()).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n\t\t\t});\r\n\t\t\tshowToast(\"Export started\", \"success\");\r\n\t\t} catch (err: any) {\r\n\t\t\tshowToast(err?.message || \"Failed to export Excel\", \"error\");\r\n\t\t}\r\n\t};\r\n\r\n\t// ──── Column config ────────────────────────────────────────────────────────\r\n\tconst columns: { id: SortKey; label: string }[] = [\r\n\t\t{ id: \"fullName\", label: \"User Name\" },\r\n\t\t{ id: \"agentId\", label: \"User ID\" },\r\n\t\t{ id: \"queueNames\", label: \"Queues\" },\r\n\t\t{ id: \"numLogins\", label: \"Logins\" },\r\n\t\t{ id: \"firstLoginTime\", label: \"First Login\" },\r\n\t\t{ id: \"lastLogoutTime\", label: \"Last Logout\" },\r\n\t\t{ id: \"workingDurationFormatted\", label: \"Working Duration\" },\r\n\t\t{ id: \"breakDurationFormatted\", label: \"Break Duration\" },\r\n\t\t{ id: \"loginDurationFormatted\", label: \"Login Duration\" },\r\n\t\t{ id: \"utilisationPct\", label: \"Utilisation %\" },\r\n\t];\r\n\r\n\t// ──── Render ───────────────────────────────────────────────────────────────\r\n\treturn (\r\n\t\t<LocalizationProvider dateAdapter={AdapterDayjs}>\r\n\t\t\t<Box sx={{ display: \"flex\", flexDirection: \"column\", fontFamily: FONT }}>\r\n\t\t\t\t<SDKPageHeader\r\n\t\t\t\t\ttitle=\"Login Report\"\r\n\t\t\t\t\tactions={\r\n\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n\t\t\t\t\t\t\t<OutlinedInput\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\tvalue={searchText}\r\n\t\t\t\t\t\t\t\tonChange={(e) => {\r\n\t\t\t\t\t\t\t\t\tsetSearchText(e.target.value);\r\n\t\t\t\t\t\t\t\t\tsetPage(0);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tplaceholder=\"Search name, ID...\"\r\n\t\t\t\t\t\t\t\tsx={{ width: 220, fontSize: \"0.82rem\", height: 36, fontFamily: FONT }}\r\n\t\t\t\t\t\t\t\tendAdornment={\r\n\t\t\t\t\t\t\t\t\t<InputAdornment position=\"end\">\r\n\t\t\t\t\t\t\t\t\t\t<SearchIcon sx={{ fontSize: 18, color: \"#999\" }} />\r\n\t\t\t\t\t\t\t\t\t</InputAdornment>\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<SDKPermissionGuard\r\n\t\t\t\t\t\t\t\tpermissions={[\r\n\t\t\t\t\t\t\t\t\tSDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE,\r\n\t\t\t\t\t\t\t\t\tSDK_PERMISSIONS.REPORTS_AGENT_LOGIN_EXPORT,\r\n\t\t\t\t\t\t\t\t]}\r\n\t\t\t\t\t\t\t\tshowFallback={false}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t<SDKButton\r\n\t\t\t\t\t\t\t\t\tstartIcon={<DownloadIcon sx={{ fontSize: \"0.95rem\" }} />}\r\n\t\t\t\t\t\t\t\t\tdisabled={!reportData.length}\r\n\t\t\t\t\t\t\t\t\tonClick={handleExportExcel}\r\n\t\t\t\t\t\t\t\t\tsx={{ height: 36 }}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\tExport Excel\r\n\t\t\t\t\t\t\t\t</SDKButton>\r\n\t\t\t\t\t\t\t</SDKPermissionGuard>\r\n\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t}\r\n\t\t\t\t/>\r\n\r\n\t\t\t\t<Box sx={{ flex: 1, overflow: \"auto\", py: 0.8, px: { xs: 2, md: 2.5 } }}>\r\n\t\t\t\t\t{/* Filter bar */}\r\n\t\t\t\t\t<Box sx={filterBarSx}>\r\n\t\t\t\t\t\t<DateTimePicker\r\n\t\t\t\t\t\t\tlabel=\"Start\"\r\n\t\t\t\t\t\t\tvalue={startDate}\r\n\t\t\t\t\t\t\tonChange={(v) => {\r\n\t\t\t\t\t\t\t\tsetStartDate(v as Dayjs | null);\r\n\t\t\t\t\t\t\t\tsetActiveQuickDate(\"\");\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\t\t\ttextField: { size: \"small\", sx: dateFieldSx },\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<DateTimePicker\r\n\t\t\t\t\t\t\tlabel=\"End\"\r\n\t\t\t\t\t\t\tvalue={endDate}\r\n\t\t\t\t\t\t\tonChange={(v) => {\r\n\t\t\t\t\t\t\t\tsetEndDate(v as Dayjs | null);\r\n\t\t\t\t\t\t\t\tsetActiveQuickDate(\"\");\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tslotProps={{\r\n\t\t\t\t\t\t\t\ttextField: { size: \"small\", sx: dateFieldSx },\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<Stack direction=\"row\" spacing={0.5}>\r\n\t\t\t\t\t\t\t{([\"today\", \"week\", \"month\"] as QuickRange[]).map((r) => (\r\n\t\t\t\t\t\t\t\t<Button\r\n\t\t\t\t\t\t\t\t\tkey={r}\r\n\t\t\t\t\t\t\t\t\tonClick={() => handleQuickRange(r)}\r\n\t\t\t\t\t\t\t\t\tsx={quickRangeBtnSx(activeQuickDate === r)}\r\n\t\t\t\t\t\t\t\t\tdisableRipple\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{r === \"today\" ? \"Today\" : r === \"week\" ? \"This Week\" : \"This Month\"}\r\n\t\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</Stack>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t{error && (\r\n\t\t\t\t\t\t<Alert\r\n\t\t\t\t\t\t\tseverity=\"error\"\r\n\t\t\t\t\t\t\tsx={{ mb: 1, fontFamily: FONT, fontSize: \"0.78rem\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{error}\r\n\t\t\t\t\t\t</Alert>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{loading && (\r\n\t\t\t\t\t\t<Box sx={{ textAlign: \"center\", py: 2.5 }}>\r\n\t\t\t\t\t\t\t<CircularProgress sx={{ color: COLORS.blue }} size={28} />\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t{/* Main table */}\r\n\t\t\t\t\t<Paper elevation={0} sx={tableContainerSx}>\r\n\t\t\t\t\t\t<TableContainer>\r\n\t\t\t\t\t\t\t<Table size=\"small\" sx={tableSx}>\r\n\t\t\t\t\t\t\t\t<TableHead>\r\n\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t{columns.map((col) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell key={col.id} sx={headCellSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableSortLabel\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive={sortKey === col.id}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tdirection={sortKey === col.id ? sortDir : \"asc\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleSort(col.id)}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tsx={sortLabelSx}\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{col.label}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableSortLabel>\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t))}\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{paginatedData.map((row, idx) => {\r\n\t\t\t\t\t\t\t\t\t\tconst isLoggedIn = !row.lastLogoutTime;\r\n\t\t\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\t\t<TableRow key={`${row.agentId}-${idx}`} hover sx={tableRowSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={nameCellSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.fullName || \"—\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={idCellSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.agentId || \"—\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.queueNames ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={row.queueNames}\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\tsx={queueChipSx}\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\"—\"\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</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ textAlign: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={row.numLogins}\r\n\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\tonClick={(e) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\topenDialog(row);\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\tsx={loginsChipSx}\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</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={idCellSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.firstLoginTime\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? dayjs(row.firstLoginTime).format(\"DD MMM YYYY hh:mm A\")\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</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={idCellSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{isLoggedIn ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel=\"LOGGED-IN\"\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\tsx={loggedInChipSx}\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\tdayjs(row.lastLogoutTime).format(\"DD MMM YYYY hh:mm A\")\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</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={durationCellWorkingSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.workingDurationFormatted || \"—\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={durationCellBreakSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.breakDurationFormatted || \"—\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={durationCellTotalSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.loginDurationFormatted || \"—\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ minWidth: 120 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{row.utilisationPct != null\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\tconst pct = Math.min(row.utilisationPct, 100);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst barColor =\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpct >= 80 ? \"#10b981\" : pct >= 60 ? \"#f59e0b\" : \"#ef4444\";\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst bgTint =\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpct >= 80 ? \"#d1fae5\" : pct >= 60 ? \"#fef3c7\" : \"#fee2e2\";\r\n\t\t\t\t\t\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\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsx={{ display: \"flex\", alignItems: \"center\", gap: 0.8 }}\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\t\t<Box sx={utilisationBarBgSx(bgTint)}>\r\n\t\t\t\t\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\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twidth: `${pct}%`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theight: \"100%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: 4,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tbackground: `linear-gradient(90deg, ${barColor}cc, ${barColor})`,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttransition: \"width 0.4s ease\",\r\n\t\t\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\t\t\t\t/>\r\n\t\t\t\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\t\t\t<Chip\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlabel={`${Math.round(pct)}%`}\r\n\t\t\t\t\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\t\t\t\t\tsx={utilisationChipSx(bgTint, barColor)}\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\t\t</Box>\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: \"—\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t</TableRow>\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{!loading && paginatedData.length === 0 && (\r\n\t\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolSpan={columns.length}\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\ttextAlign: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpy: 4,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"#9e9e9e\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tfontStyle: \"italic\",\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 login activity for the selected range\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t</TableRow>\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\r\n\t\t\t\t\t\t<TablePagination\r\n\t\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\t\tcount={filteredData.length}\r\n\t\t\t\t\t\t\tpage={page}\r\n\t\t\t\t\t\t\tonPageChange={(_, p) => setPage(p)}\r\n\t\t\t\t\t\t\trowsPerPage={rowsPerPage}\r\n\t\t\t\t\t\t\trowsPerPageOptions={[5, 10, 20, 25, 50]}\r\n\t\t\t\t\t\t\tonRowsPerPageChange={(e) => {\r\n\t\t\t\t\t\t\t\tsetRowsPerPage(parseInt(e.target.value, 10));\r\n\t\t\t\t\t\t\t\tsetPage(0);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tsx={paginationSx}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t{/* Sessions dialog */}\r\n\t\t\t\t\t<Dialog\r\n\t\t\t\t\t\topen={dialogOpen}\r\n\t\t\t\t\t\tonClose={closeDialog}\r\n\t\t\t\t\t\tmaxWidth=\"md\"\r\n\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\tPaperProps={{ sx: dialogPaperSx }}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<DialogTitle sx={dialogTitleSx}>\r\n\t\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\tvariant=\"h6\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\t\t\t\t\t\t\t\tfontWeight: 700,\r\n\t\t\t\t\t\t\t\t\t\tfontSize: \"0.95rem\",\r\n\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.3px\",\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\tLogin Sessions\r\n\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\tvariant=\"body2\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\t\t\t\t\t\t\t\topacity: 0.9,\r\n\t\t\t\t\t\t\t\t\t\tfontSize: \"0.76rem\",\r\n\t\t\t\t\t\t\t\t\t\tmt: 0.3,\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{selectedRow?.fullName} • {selectedRow?.numLogins} session\r\n\t\t\t\t\t\t\t\t\t{selectedRow?.numLogins !== 1 ? \"s\" : \"\"}\r\n\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t</Box>\r\n\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<SDKPermissionGuard\r\n\t\t\t\t\t\t\t\t\tpermissions={[\r\n\t\t\t\t\t\t\t\t\t\tSDK_PERMISSIONS.REPORTS_AGENT_LOGIN_MANAGE,\r\n\t\t\t\t\t\t\t\t\t\tSDK_PERMISSIONS.REPORTS_AGENT_LOGIN_EXPORT,\r\n\t\t\t\t\t\t\t\t\t]}\r\n\t\t\t\t\t\t\t\t\tshowFallback={false}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<SDKButton\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={<DownloadIcon sx={{ fontSize: \"0.85rem\" }} />}\r\n\t\t\t\t\t\t\t\t\t\tonClick={handleExportSessions}\r\n\t\t\t\t\t\t\t\t\t\tsx={{ whiteSpace: \"nowrap\" }}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\tExport to Excel\r\n\t\t\t\t\t\t\t\t\t</SDKButton>\r\n\t\t\t\t\t\t\t\t</SDKPermissionGuard>\r\n\t\t\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\t\t\tonClick={closeDialog}\r\n\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\tcolor: \"#fff\",\r\n\t\t\t\t\t\t\t\t\t\tbackgroundColor: \"rgba(255,255,255,0.1)\",\r\n\t\t\t\t\t\t\t\t\t\t\"&:hover\": { backgroundColor: \"rgba(255,255,255,0.2)\" },\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<CloseIcon fontSize=\"small\" />\r\n\t\t\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</DialogTitle>\r\n\r\n\t\t\t\t\t\t<DialogContent sx={dialogContentSx}>\r\n\t\t\t\t\t\t\t{sessionsLoading ? (\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 4, textAlign: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t<CircularProgress\r\n\t\t\t\t\t\t\t\t\t\tsize={28}\r\n\t\t\t\t\t\t\t\t\t\tsx={{ color: \"var(--primary-color, #1A5F6C)\" }}\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) : sessions.length > 0 ? (\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 1.5, maxHeight: 300, overflowY: \"auto\" }}>\r\n\t\t\t\t\t\t\t\t\t{Object.entries(\r\n\t\t\t\t\t\t\t\t\t\tsessions.reduce<Record<string, LoginSessionResponse[]>>(\r\n\t\t\t\t\t\t\t\t\t\t\t(acc, s) => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst dateKey = s.loginTime\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t? dayjs(s.loginTime).format(\"DD MMM YYYY\")\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Unknown Date\";\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (!acc[dateKey]) acc[dateKey] = [];\r\n\t\t\t\t\t\t\t\t\t\t\t\tacc[dateKey].push(s);\r\n\t\t\t\t\t\t\t\t\t\t\t\treturn acc;\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{},\r\n\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t).map(([date, dateSessions]) => (\r\n\t\t\t\t\t\t\t\t\t\t<Paper key={date} elevation={0} sx={sessionCardSx}>\r\n\t\t\t\t\t\t\t\t\t\t\t<Box sx={sessionCardHeaderSx}>\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\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\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\t\t\tfontSize: \"0.8rem\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: \"var(--primary-color-dark, #14505b)\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.3px\",\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{date}\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</Box>\r\n\t\t\t\t\t\t\t\t\t\t\t<Box sx={{ px: 1.5, py: 1 }}>\r\n\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\tsx={{\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\tgap: 2,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpb: 0.5,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmb: 0.5,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tborderBottom: \"1px solid #e4eaf0\",\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<Typography\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\tflex: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"0.72rem\",\r\n\t\t\t\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\t\t\t\tcolor: \"#555\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"uppercase\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.5px\",\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\tLogin\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<Typography\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\tflex: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"0.72rem\",\r\n\t\t\t\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\t\t\t\tcolor: \"#555\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttextTransform: \"uppercase\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tletterSpacing: \"0.5px\",\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\tLogout\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</Box>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{dateSessions.map((s, i) => (\r\n\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\tkey={i}\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\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\tgap: 2,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpy: 0.6,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tborderBottom:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ti < dateSessions.length - 1\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? \"1px dashed #e8ecf0\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"none\",\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<Typography\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\tflex: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"0.78rem\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: 500,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: s.loginTime ? COLORS.green : \"#9e9e9e\",\r\n\t\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\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 0.4,\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<span style={{ fontSize: \"0.9rem\" }}>{\"↙\"}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{s.loginTime\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? dayjs(s.loginTime).format(\"DD MMM YYYY h:mm:ss A\")\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Missing\"}\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<Typography\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\tflex: 1,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontSize: \"0.78rem\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfontWeight: 500,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolor: s.logoutTime ? COLORS.red : \"#9e9e9e\",\r\n\t\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\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgap: 0.4,\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<span style={{ fontSize: \"0.9rem\" }}>{\"↗\"}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{s.logoutTime\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? dayjs(s.logoutTime).format(\"DD MMM YYYY h:mm:ss A\")\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: \"Missing\"}\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</Box>\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</Box>\r\n\t\t\t\t\t\t\t\t\t\t</Paper>\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\t\t<Box sx={{ p: 4, textAlign: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tfontFamily: FONT,\r\n\t\t\t\t\t\t\t\t\t\t\tcolor: \"#9e9e9e\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontStyle: \"italic\",\r\n\t\t\t\t\t\t\t\t\t\t\tfontSize: \"0.82rem\",\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\tNo sessions found\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</DialogContent>\r\n\t\t\t\t\t</Dialog>\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t</LocalizationProvider>\r\n\t);\r\n});\r\n\r\n// ──── Default export — wrapped with SDKProvider ───────────────────────────────\r\n\r\nconst LoginReport: React.FC = () => (\r\n\t<SDKProvider>\r\n\t\t<LoginReportContent />\r\n\t</SDKProvider>\r\n);\r\n\r\nexport default LoginReport;\r\n","import { useCallback, useState } from \"react\";\nimport axiosInstance from \"../../services/axios\";\nimport { END_POINT } from \"../../services/endPoint\";\nimport type {\n\tLoginAgentRowResponse,\n\tLoginReportParams,\n\tLoginReportResponse,\n\tLoginSessionResponse,\n} from \"./types\";\n\nfunction buildLoginReportQueryString(params: LoginReportParams): string {\n\tconst qs = new URLSearchParams();\n\tif (params.start_date) qs.append(\"start_date\", params.start_date);\n\tif (params.end_date) qs.append(\"end_date\", params.end_date);\n\tif (params.agent_id) for (const id of params.agent_id) qs.append(\"agent_id\", id);\n\tif (params.queue_id) for (const id of params.queue_id) qs.append(\"queue_id\", String(id));\n\tif (params.process_id) for (const id of params.process_id) qs.append(\"process_id\", String(id));\n\tconst str = qs.toString();\n\treturn str ? `?${str}` : \"\";\n}\n\nfunction buildSessionQueryString(params?: { start_date?: string; end_date?: string }): string {\n\tconst qs = new URLSearchParams();\n\tif (params?.start_date) qs.append(\"start_date\", params.start_date);\n\tif (params?.end_date) qs.append(\"end_date\", params.end_date);\n\tconst str = qs.toString();\n\treturn str ? `?${str}` : \"\";\n}\n\nfunction triggerBlobDownload(blob: Blob, filename: string): void {\n\tconst url = URL.createObjectURL(blob);\n\tconst a = document.createElement(\"a\");\n\ta.href = url;\n\ta.download = filename;\n\tdocument.body.appendChild(a);\n\ta.click();\n\ta.remove();\n\tURL.revokeObjectURL(url);\n}\n\nexport function useLoginReport() {\n\tconst [agents, setAgents] = useState<LoginAgentRowResponse[]>([]);\n\tconst [loading, setLoading] = useState(false);\n\tconst [error, setError] = useState(\"\");\n\n\tconst fetchAgents = useCallback(async (params: LoginReportParams): Promise<void> => {\n\t\tsetLoading(true);\n\t\tsetError(\"\");\n\t\ttry {\n\t\t\tconst qs = buildLoginReportQueryString(params);\n\t\t\tconst res = await axiosInstance.get<LoginAgentRowResponse[]>(\n\t\t\t\t`${END_POINT.LOGIN_REPORT_AGENTS}${qs}`,\n\t\t\t);\n\t\t\tsetAgents(Array.isArray(res.data) ? res.data : []);\n\t\t} catch (err: any) {\n\t\t\tsetAgents([]);\n\t\t\tsetError(\n\t\t\t\terr?.response?.data?.message ||\n\t\t\t\t\terr?.response?.data?.detail ||\n\t\t\t\t\terr?.message ||\n\t\t\t\t\t\"Failed to fetch login report\",\n\t\t\t);\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, []);\n\n\tconst fetchSummary = useCallback(async (params: LoginReportParams): Promise<LoginReportResponse> => {\n\t\tconst qs = buildLoginReportQueryString(params);\n\t\tconst res = await axiosInstance.get<LoginReportResponse>(\n\t\t\t`${END_POINT.LOGIN_REPORT}${qs}`,\n\t\t);\n\t\treturn res.data;\n\t}, []);\n\n\tconst fetchAgentSessions = useCallback(\n\t\tasync (agentId: string, params?: { start_date?: string; end_date?: string }): Promise<LoginSessionResponse[]> => {\n\t\t\tconst qs = buildSessionQueryString(params);\n\t\t\tconst res = await axiosInstance.get<LoginSessionResponse[]>(\n\t\t\t\t`${END_POINT.LOGIN_REPORT_AGENT_SESSIONS(agentId)}${qs}`,\n\t\t\t);\n\t\t\treturn Array.isArray(res.data) ? res.data : [];\n\t\t},\n\t\t[],\n\t);\n\n\tconst exportReportExcel = useCallback(async (params: LoginReportParams): Promise<void> => {\n\t\tconst qs = buildLoginReportQueryString(params);\n\t\tconst res = await axiosInstance.get(\n\t\t\t`${END_POINT.LOGIN_REPORT_EXPORT_EXCEL}${qs}`,\n\t\t\t{ responseType: \"blob\" },\n\t\t);\n\t\ttriggerBlobDownload(new Blob([res.data]), `login-report-${params.start_date ?? \"export\"}.xlsx`);\n\t}, []);\n\n\tconst exportAgentSessionsExcel = useCallback(\n\t\tasync (agentId: string, params?: { start_date?: string; end_date?: string }): Promise<void> => {\n\t\t\tconst qs = buildSessionQueryString(params);\n\t\t\tconst res = await axiosInstance.get(\n\t\t\t\t`${END_POINT.LOGIN_REPORT_AGENT_SESSIONS_EXPORT_EXCEL(agentId)}${qs}`,\n\t\t\t\t{ responseType: \"blob\" },\n\t\t\t);\n\t\t\ttriggerBlobDownload(new Blob([res.data]), `login_sessions_${agentId}.xlsx`);\n\t\t},\n\t\t[],\n\t);\n\n\treturn {\n\t\tagents,\n\t\tloading,\n\t\terror,\n\t\tsetError,\n\t\tfetchAgents,\n\t\tfetchSummary,\n\t\tfetchAgentSessions,\n\t\texportReportExcel,\n\t\texportAgentSessionsExcel,\n\t};\n}\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nexport const FONT =\n\t\"'Inter', 'Segoe UI', 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif\";\n\nexport const COLORS = {\n\tnavy: \"#0d2a56\",\n\tblue: \"#1565c8\",\n\tgreen: \"#0a9a62\",\n\tamber: \"#c47c00\",\n\tred: \"#cc2a2a\",\n\tpurple: \"#6b3fbf\",\n\tbg: \"transparent\",\n\tsurface: \"transparent\",\n} as const;\n\nexport const DEFAULT_ROWS_PER_PAGE = 10;\n\n// ─── Table ────────────────────────────────────────────────────────────────────\n\nexport const headCellSx: SxProps<Theme> = {\n\tfontFamily: FONT,\n\tbgcolor: \"#f1f1f1\",\n\tcolor: \"#333\",\n\tfontWeight: 600,\n\twhiteSpace: \"nowrap\",\n\tfontSize: \"0.8rem\",\n\tpy: \"6px\",\n\tpx: \"12px\",\n};\n\nexport const sortLabelSx: SxProps<Theme> = {\n\t\"&.MuiTableSortLabel-root\": { color: \"#333\" },\n\t\"&.MuiTableSortLabel-root:hover\": { color: \"#555\" },\n\t\"&.Mui-active\": { color: \"#333\" },\n\t\"& .MuiTableSortLabel-icon\": { color: \"#333 !important\" },\n};\n\nexport const tableContainerSx: SxProps<Theme> = {\n\tborderRadius: \"8px\",\n\tborder: \"1px solid #e0e7ef\",\n\toverflow: \"hidden\",\n\tmb: 2,\n};\n\nexport const tableSx: SxProps<Theme> = {\n\tminWidth: 1100,\n\tfontFamily: FONT,\n\t\"& .MuiTableCell-root\": {\n\t\tfontFamily: FONT,\n\t\tfontSize: \"0.75rem\",\n\t\tborderBottom: \"1px solid #eef1f6\",\n\t\tpy: 0.6,\n\t\tpx: 1,\n\t},\n};\n\nexport const tableRowSx: SxProps<Theme> = {\n\tbackgroundColor: \"#fff\",\n\t\"&:hover\": { backgroundColor: \"#f0f7f8\" },\n};\n\nexport const paginationSx: SxProps<Theme> = {\n\tborderTop: \"1px solid #eef1f6\",\n\tfontFamily: FONT,\n\t\"& .MuiTablePagination-displayedRows\": {\n\t\tfontFamily: FONT,\n\t\tfontSize: \"0.73rem\",\n\t},\n\t\"& .MuiTablePagination-selectLabel\": {\n\t\tfontFamily: FONT,\n\t\tfontSize: \"0.73rem\",\n\t},\n};\n\n// ─── Filter bar ───────────────────────────────────────────────────────────────\n\nexport const filterBarSx: SxProps<Theme> = {\n\tdisplay: \"flex\",\n\tflexWrap: \"wrap\",\n\talignItems: \"center\",\n\tgap: 1,\n\tp: 1.2,\n\tmb: 0.8,\n\tborderRadius: \"8px\",\n\tborder: \"1px solid #e0e7ef\",\n\tbackgroundColor: \"#fff\",\n};\n\nexport const dateFieldSx: SxProps<Theme> = {\n\t\"& .MuiOutlinedInput-root\": {\n\t\tborderRadius: \"8px\",\n\t\tfontFamily: FONT,\n\t\tfontSize: \"0.8rem\",\n\t\tbackgroundColor: \"#fff\",\n\t\theight: 36,\n\t},\n\t\"& .MuiInputLabel-root\": {\n\t\tfontFamily: FONT,\n\t\tfontSize: \"0.78rem\",\n\t},\n};\n\nexport const quickRangeBtnSx = (active: boolean): SxProps<Theme> => ({\n\ttextTransform: \"none\",\n\tfontFamily: FONT,\n\tfontSize: \"0.75rem\",\n\tfontWeight: 600,\n\theight: 32,\n\tpx: 1.5,\n\tborderRadius: \"6px\",\n\tborder: \"1px solid\",\n\tborderColor: active ? \"#1A5F6C\" : \"#dde3ec\",\n\tbackgroundColor: active ? \"#1A5F6C\" : \"#fff\",\n\tcolor: active ? \"#fff\" : \"#4a5568\",\n\t\"&:hover\": {\n\t\tbackgroundColor: active ? \"#164e57\" : \"#f0f7f8\",\n\t\tborderColor: \"#1A5F6C\",\n\t},\n});\n\n// ─── Body cell variants ──────────────────────────────────────────────────────\n\nexport const nameCellSx: SxProps<Theme> = {\n\tfontWeight: 600,\n\tcolor: COLORS.navy,\n\tfontSize: \"0.75rem\",\n};\n\nexport const idCellSx: SxProps<Theme> = {\n\tfontSize: \"0.73rem\",\n\tcolor: \"#4a5568\",\n};\n\nexport const durationCellWorkingSx: SxProps<Theme> = {\n\tfontWeight: 600,\n\tcolor: COLORS.blue,\n\tfontSize: \"0.75rem\",\n\tfontVariantNumeric: \"tabular-nums\",\n};\n\nexport const durationCellBreakSx: SxProps<Theme> = {\n\tfontWeight: 500,\n\tcolor: COLORS.amber,\n\tfontSize: \"0.75rem\",\n\tfontVariantNumeric: \"tabular-nums\",\n};\n\nexport const durationCellTotalSx: SxProps<Theme> = {\n\tfontWeight: 500,\n\tfontSize: \"0.75rem\",\n\tfontVariantNumeric: \"tabular-nums\",\n};\n\n// ─── Chip styles ─────────────────────────────────────────────────────────────\n\nexport const queueChipSx: SxProps<Theme> = {\n\tfontFamily: FONT,\n\tbackgroundColor: \"#f0ebfa\",\n\tcolor: COLORS.purple,\n\tfontWeight: 500,\n\tfontSize: \"0.67rem\",\n\theight: 22,\n};\n\nexport const loginsChipSx: SxProps<Theme> = {\n\tfontFamily: FONT,\n\tbackgroundColor: COLORS.navy,\n\tcolor: \"#fff\",\n\tfontWeight: 600,\n\tminWidth: 28,\n\theight: 20,\n\tfontSize: \"0.67rem\",\n\tcursor: \"pointer\",\n\t\"&:hover\": { backgroundColor: COLORS.blue },\n};\n\nexport const loggedInChipSx: SxProps<Theme> = {\n\tfontFamily: FONT,\n\tbackgroundColor: COLORS.green,\n\tcolor: \"#fff\",\n\tfontWeight: 600,\n\tfontSize: \"0.65rem\",\n\theight: 20,\n};\n\n// ─── Dialog ──────────────────────────────────────────────────────────────────\n\nexport const dialogPaperSx: SxProps<Theme> = {\n\tborderRadius: \"12px\",\n\tfontFamily: FONT,\n\toverflow: \"hidden\",\n\tboxShadow: \"0 8px 32px rgba(0,0,0,0.18)\",\n\tmaxWidth: 450,\n};\n\nexport const dialogTitleSx: SxProps<Theme> = {\n\tfontFamily: FONT,\n\tbackground:\n\t\t\"linear-gradient(135deg, var(--primary-color-dark, #14505b), var(--primary-color, #1A5F6C))\",\n\tcolor: \"#fff\",\n\tdisplay: \"flex\",\n\tjustifyContent: \"space-between\",\n\talignItems: \"center\",\n\tpy: 1.5,\n\tpx: 2.5,\n};\n\nexport const dialogContentSx: SxProps<Theme> = {\n\tp: 0,\n\tbackgroundColor: \"#f8fafb\",\n};\n\nexport const sessionCardSx: SxProps<Theme> = {\n\tmb: 1.5,\n\tborderRadius: \"10px\",\n\tborder: \"1px solid #e4eaf0\",\n\toverflow: \"hidden\",\n\tbackgroundColor: \"#fff\",\n};\n\nexport const sessionCardHeaderSx: SxProps<Theme> = {\n\tpx: 1.5,\n\tpy: 0.8,\n\tbackgroundColor: \"#f0f5f4\",\n\tborderBottom: \"1px solid #e4eaf0\",\n};\n\nexport const utilisationBarBgSx = (bgTint: string): SxProps<Theme> => ({\n\tposition: \"relative\",\n\tflex: 1,\n\theight: 7,\n\tborderRadius: 4,\n\tbackgroundColor: bgTint,\n\toverflow: \"hidden\",\n});\n\nexport const utilisationChipSx = (bgTint: string, barColor: string): SxProps<Theme> => ({\n\tfontFamily: FONT,\n\theight: 18,\n\tminWidth: 38,\n\tfontSize: \"0.63rem\",\n\tfontWeight: 700,\n\tbackgroundColor: bgTint,\n\tcolor: barColor,\n\t\"& .MuiChip-label\": { px: 0.6 },\n});\n"],"mappings":"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","names":["useCallback","useState","LoginReportContent","useState","useCallback"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ahs-cti",
|
|
3
3
|
"description": "Call Control SDK for Web RTC",
|
|
4
|
-
"version": "1.0.1-beta.
|
|
4
|
+
"version": "1.0.1-beta.21",
|
|
5
5
|
"author": "CTI SDK Team",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"main": "./dist/index.js",
|
|
@@ -50,7 +50,10 @@
|
|
|
50
50
|
"@emotion/styled": ">=11.0.0",
|
|
51
51
|
"@mui/icons-material": ">=5.0.0",
|
|
52
52
|
"@mui/material": ">=5.0.0",
|
|
53
|
+
"@mui/x-date-pickers": ">=6.0.0",
|
|
53
54
|
"axios": ">=1.0.0",
|
|
55
|
+
"dayjs": ">=1.11.0",
|
|
56
|
+
"recharts": ">=2.0.0",
|
|
54
57
|
"@react-solutions/vault": ">=0.0.5"
|
|
55
58
|
},
|
|
56
59
|
"peerDependencies": {
|
|
@@ -58,7 +61,10 @@
|
|
|
58
61
|
"@emotion/styled": ">=11.0.0",
|
|
59
62
|
"@mui/icons-material": ">=5.0.0",
|
|
60
63
|
"@mui/material": ">=5.0.0",
|
|
64
|
+
"@mui/x-date-pickers": ">=6.0.0",
|
|
61
65
|
"axios": ">=1.0.0",
|
|
66
|
+
"dayjs": ">=1.11.0",
|
|
67
|
+
"recharts": ">=2.0.0",
|
|
62
68
|
"react": ">=16.0.0",
|
|
63
69
|
"@react-solutions/vault": ">=0.0.5",
|
|
64
70
|
"react-dom": ">=16.0.0"
|
|
@@ -76,9 +82,18 @@
|
|
|
76
82
|
"@mui/material": {
|
|
77
83
|
"optional": true
|
|
78
84
|
},
|
|
85
|
+
"@mui/x-date-pickers": {
|
|
86
|
+
"optional": true
|
|
87
|
+
},
|
|
79
88
|
"axios": {
|
|
80
89
|
"optional": true
|
|
81
90
|
},
|
|
91
|
+
"dayjs": {
|
|
92
|
+
"optional": true
|
|
93
|
+
},
|
|
94
|
+
"recharts": {
|
|
95
|
+
"optional": true
|
|
96
|
+
},
|
|
82
97
|
"react": {
|
|
83
98
|
"optional": false
|
|
84
99
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/callHistory/index.tsx","../call-control-sdk/lib/pages/callHistory/useCallHistory.ts"],"sourcesContent":["import React, { memo, useEffect, useState } from \"react\";\r\nimport {\r\n\tBox,\r\n\tTypography,\r\n\tTable,\r\n\tTableBody,\r\n\tTableCell,\r\n\tTableContainer,\r\n\tTableHead,\r\n\tTableRow,\r\n\tTablePagination,\r\n\tToggleButton,\r\n\tToggleButtonGroup,\r\n\tIconButton,\r\n\tCollapse,\r\n\tCircularProgress,\r\n\tChip,\r\n\tStack,\r\n\tSwitch,\r\n\tFormControlLabel,\r\n\tTooltip,\r\n\tInputAdornment,\r\n\tOutlinedInput,\r\n\tuseTheme,\r\n\tPaper,\r\n} from \"@mui/material\";\r\nimport {\r\n\tKeyboardArrowDown,\r\n\tPlayArrow,\r\n\tExpandLess,\r\n\tSearch,\r\n\tPhone,\r\n} from \"@mui/icons-material\";\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { useToast } from \"../../services/toastMessage\";\r\nimport { useCallHistory } from \"./useCallHistory\";\r\nimport type { CallHistoryItem, MissedCallDetails, CallFilter } from \"./types\";\r\n\r\n// ──── Header cell columns ────────────────────────────────────────────────────\r\n\r\nconst CALL_HISTORY_COLS = [\"Call UID\", \"Mobile\", \"Type\", \"Start Time\", \"End Time\", \"Recording\", \"Agent\", \"Details\"] as const;\r\nconst MISSED_CALLS_COLS = [\"Agent ID\", \"Agent Name\", \"Mobile No\", \"Type\", \"Actions\"] as const;\r\nconst CENTER_COLS = new Set([\"Type\", \"Recording\", \"Agent\", \"Details\", \"Actions\"]);\r\n\r\n// ──── Main content (needs SDKProvider above it for useToast) ─────────────────\r\n\r\nconst CallHistoryContent = memo(() => {\r\n\tconst theme = useTheme();\r\n\tconst { showToast } = useToast();\r\n\tconst { calls, missedCalls, loading, fetchCallHistory, fetchMissedCalls, fetchRecording } =\r\n\t\tuseCallHistory();\r\n\r\n\tconst [filter, setFilter] = useState<CallFilter>(\"ALL\");\r\n\tconst [search, setSearch] = useState(\"\");\r\n\tconst [showMissedCalls, setShowMissedCalls] = useState(false);\r\n\tconst [page, setPage] = useState(0);\r\n\tconst [rowsPerPage, setRowsPerPage] = useState(10);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (showMissedCalls) {\r\n\t\t\tfetchMissedCalls();\r\n\t\t} else {\r\n\t\t\tfetchCallHistory();\r\n\t\t}\r\n\t}, [showMissedCalls, fetchCallHistory, fetchMissedCalls]);\r\n\r\n\tconst filteredCalls = calls\r\n\t\t.filter((c) => filter === \"ALL\" || c.call_type === filter)\r\n\t\t.filter((c) => c.mobile_no.toLowerCase().includes(search.toLowerCase()));\r\n\r\n\tconst filteredMissedCalls = missedCalls\r\n\t\t.filter((c) => filter === \"ALL\" || c.callType?.toUpperCase() === filter)\r\n\t\t.filter((c) => {\r\n\t\t\tconst q = search.toLowerCase();\r\n\t\t\treturn (\r\n\t\t\t\tc.agentId?.toLowerCase().includes(q) ||\r\n\t\t\t\tc.username?.toLowerCase().includes(q) ||\r\n\t\t\t\tc.mobileNumber?.toLowerCase().includes(q)\r\n\t\t\t);\r\n\t\t});\r\n\r\n\treturn (\r\n\t\t<Box>\r\n\t\t\t{/* PAGE HEADER */}\r\n\t\t\t<Box\r\n\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\talignItems=\"center\"\r\n\t\t\t\tjustifyContent=\"space-between\"\r\n\t\t\t\tpx={2}\r\n\t\t\t\tpy={1.5}\r\n\t\t\t\tborderBottom=\"1px solid #eee\"\r\n\t\t\t>\r\n\t\t\t\t<Typography fontWeight={700} fontSize=\"1rem\">\r\n\t\t\t\t\tCall History\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<OutlinedInput\r\n\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\tvalue={search}\r\n\t\t\t\t\tonChange={(e) => { setSearch(e.target.value); setPage(0); }}\r\n\t\t\t\t\tplaceholder=\"Search\"\r\n\t\t\t\t\tsx={{ width: 220, fontSize: \"0.82rem\", height: 36 }}\r\n\t\t\t\t\tendAdornment={\r\n\t\t\t\t\t\t<InputAdornment position=\"end\">\r\n\t\t\t\t\t\t\t<Search sx={{ fontSize: 18, color: \"#999\" }} />\r\n\t\t\t\t\t\t</InputAdornment>\r\n\t\t\t\t\t}\r\n\t\t\t\t/>\r\n\t\t\t</Box>\r\n\r\n\t\t\t<Box py={1.5} px={2}>\r\n\t\t\t\t{/* FILTER BAR */}\r\n\t\t\t\t<Stack direction=\"row\" spacing={2} alignItems=\"center\" mb={2}>\r\n\t\t\t\t\t<FormControlLabel\r\n\t\t\t\t\t\tcontrol={\r\n\t\t\t\t\t\t\t<Switch\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\tchecked={showMissedCalls}\r\n\t\t\t\t\t\t\t\tonChange={(_, checked) => { setShowMissedCalls(checked); setPage(0); }}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlabel={\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.8rem\", color: \"#555\" }}>\r\n\t\t\t\t\t\t\t\tMissed Calls\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\tsx={{ ml: 0 }}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<ToggleButtonGroup\r\n\t\t\t\t\t\tvalue={filter}\r\n\t\t\t\t\t\texclusive\r\n\t\t\t\t\t\tonChange={(_, v) => { if (v) { setFilter(v); setPage(0); } }}\r\n\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\tborder: \"1px solid #ccc\",\r\n\t\t\t\t\t\t\tborderRadius: \"50px\",\r\n\t\t\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t\t\t\t\"& .MuiToggleButton-root\": {\r\n\t\t\t\t\t\t\t\tborder: \"none\",\r\n\t\t\t\t\t\t\t\tborderRight: \"1px solid #ccc\",\r\n\t\t\t\t\t\t\t\tcolor: \"#555\",\r\n\t\t\t\t\t\t\t\tfontWeight: 600,\r\n\t\t\t\t\t\t\t\ttextTransform: \"uppercase\",\r\n\t\t\t\t\t\t\t\tfontSize: \"0.72rem\",\r\n\t\t\t\t\t\t\t\tpx: 2,\r\n\t\t\t\t\t\t\t\tpy: 0.5,\r\n\t\t\t\t\t\t\t\tborderRadius: 0,\r\n\t\t\t\t\t\t\t\t\"&:last-of-type\": { borderRight: \"none\" },\r\n\t\t\t\t\t\t\t\t\"&.Mui-selected\": {\r\n\t\t\t\t\t\t\t\t\tbackgroundColor: theme.palette.primary.main,\r\n\t\t\t\t\t\t\t\t\tcolor: \"#fff\",\r\n\t\t\t\t\t\t\t\t\t\"&:hover\": { backgroundColor: theme.palette.primary.dark },\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}}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<ToggleButton value=\"ALL\">All</ToggleButton>\r\n\t\t\t\t\t\t<ToggleButton value=\"INCOMING\">Inbound</ToggleButton>\r\n\t\t\t\t\t\t<ToggleButton value=\"OUTGOING\">Outbound</ToggleButton>\r\n\t\t\t\t\t</ToggleButtonGroup>\r\n\t\t\t\t</Stack>\r\n\r\n\t\t\t\t{/* TABLE */}\r\n\t\t\t\t<TableContainer component={Paper} variant=\"outlined\" sx={{ display: 'flex', flexDirection: 'column' }}>\r\n\t\t\t\t <Box sx={{ overflowY: 'auto', maxHeight: 600 }}>\r\n\t\t\t\t\t<Table stickyHeader size=\"small\">\r\n\t\t\t\t\t\t{showMissedCalls ? (\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t<TableHead>\r\n\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t{MISSED_CALLS_COLS.map((col) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={col}\r\n\t\t\t\t\t\t\t\t\t\t\t\talign={CENTER_COLS.has(col) ? \"center\" : \"left\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ fontWeight: 600, backgroundColor: \"#f1f1f1\", fontSize: \"0.8rem\" }}\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{col}\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t))}\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{loading ? (\r\n\t\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell colSpan={5} align=\"center\" sx={{ py: 4 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<CircularProgress size={24} />\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t\t) : filteredMissedCalls.length === 0 ? (\r\n\t\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell colSpan={5} align=\"center\" sx={{ py: 4, color: \"#999\", fontSize: \"0.82rem\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\tNo Records Found\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\tfilteredMissedCalls.slice(page * rowsPerPage, (page + 1) * rowsPerPage).map((row, i) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<MissedCallRow key={`${row.agentId}-${row.mobileNumber}-${i}`} row={row} />\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</TableBody>\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<>\r\n\t\t\t\t\t\t\t\t<TableHead>\r\n\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t{CALL_HISTORY_COLS.map((col) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={col}\r\n\t\t\t\t\t\t\t\t\t\t\t\talign={CENTER_COLS.has(col) ? \"center\" : \"left\"}\r\n\t\t\t\t\t\t\t\t\t\t\t\tsx={{ fontWeight: 600, backgroundColor: \"#f1f1f1\", fontSize: \"0.8rem\" }}\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{col}\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t))}\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{loading ? (\r\n\t\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell colSpan={8} align=\"center\" sx={{ py: 4 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<CircularProgress />\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t\t) : filteredCalls.length === 0 ? (\r\n\t\t\t\t\t\t\t\t\t\t<TableRow>\r\n\t\t\t\t\t\t\t\t\t\t\t<TableCell colSpan={8} align=\"center\" sx={{ py: 4, color: \"#999\", fontSize: \"0.82rem\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\tNo Records Found\r\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t</TableRow>\r\n\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\tfilteredCalls.slice(page * rowsPerPage, (page + 1) * rowsPerPage).map((row, i) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<ExpandableRow\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={row.call_uuid}\r\n\t\t\t\t\t\t\t\t\t\t\t\trow={row}\r\n\t\t\t\t\t\t\t\t\t\t\t\tstriped={i % 2 === 0}\r\n\t\t\t\t\t\t\t\t\t\t\t\tfetchRecording={fetchRecording}\r\n\t\t\t\t\t\t\t\t\t\t\t\tonError={(msg) => showToast(msg, \"error\")}\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</TableBody>\r\n\t\t\t\t\t\t\t</>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Table>\r\n\t\t\t\t </Box>\r\n\t\t\t\t <TablePagination\r\n\t\t\t\t\t\tcomponent=\"div\"\r\n\t\t\t\t\t\tcount={showMissedCalls ? filteredMissedCalls.length : filteredCalls.length}\r\n\t\t\t\t\t\tpage={page}\r\n\t\t\t\t\t\trowsPerPage={rowsPerPage}\r\n\t\t\t\t\t\tonPageChange={(_, p) => setPage(p)}\r\n\t\t\t\t\t\tonRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\r\n\t\t\t\t\t\trowsPerPageOptions={[10, 25, 50]}\r\n\t\t\t\t\t\tsx={{ borderTop: '1px solid #e0e0e0' }}\r\n\t\t\t\t />\r\n\t\t\t\t</TableContainer>\r\n\t\t\t</Box>\r\n\t\t</Box>\r\n\t);\r\n});\r\n\r\nCallHistoryContent.displayName = \"CallHistoryContent\";\r\n\r\n// ──── Missed Call Row ─────────────────────────────────────────────────────────\r\n\r\nconst MissedCallRow = memo(({ row }: { row: MissedCallDetails }) => {\r\n\tconst theme = useTheme();\r\n\treturn (\r\n\t\t<TableRow hover>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\", color: theme.palette.primary.main }}>\r\n\t\t\t\t{row.agentId}\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\" }}>{row.username}</TableCell>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\" }}>\r\n\t\t\t\t{row.mobileNumber} ({row.callCount})\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\", textTransform: \"uppercase\" }}>\r\n\t\t\t\t{row.callType}\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell align=\"center\">\r\n\t\t\t\t<Phone sx={{ color: \"#c0392b\", fontSize: 20, cursor: \"pointer\" }} />\r\n\t\t\t</TableCell>\r\n\t\t</TableRow>\r\n\t);\r\n});\r\n\r\nMissedCallRow.displayName = \"MissedCallRow\";\r\n\r\n// ──── Expandable Row ──────────────────────────────────────────────────────────\r\n\r\nfunction ExpandableRow({\r\n\trow,\r\n\tstriped,\r\n\tfetchRecording,\r\n\tonError,\r\n}: {\r\n\trow: CallHistoryItem;\r\n\tstriped: boolean;\r\n\tfetchRecording: (call_uuid: string) => Promise<Blob>;\r\n\tonError: (msg: string) => void;\r\n}) {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst [audioURL, setAudioURL] = useState<string | null>(null);\r\n\tconst [loadingAudio, setLoadingAudio] = useState(false);\r\n\r\n\tconst handlePlay = async () => {\r\n\t\tif (!row.recording.available) return;\r\n\t\tsetLoadingAudio(true);\r\n\t\ttry {\r\n\t\t\tconst blob = await fetchRecording(row.call_uuid);\r\n\t\t\tsetAudioURL(URL.createObjectURL(blob));\r\n\t\t} catch {\r\n\t\t\tonError(\"Recording not available\");\r\n\t\t} finally {\r\n\t\t\tsetLoadingAudio(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst bg = striped ? \"#fafafa\" : \"white\";\r\n\tconst cellSx = { fontSize: \"0.82rem\", backgroundColor: bg };\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<TableRow hover>\r\n\t\t\t\t<TableCell sx={{ ...cellSx, maxWidth: 130 }}>\r\n\t\t\t\t\t<Tooltip title={row.call_uuid} arrow>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tnoWrap\r\n\t\t\t\t\t\t\tsx={{ fontSize: 13, maxWidth: 130, overflow: \"hidden\", textOverflow: \"ellipsis\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{row.call_uuid}\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t</Tooltip>\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell sx={cellSx}>{row.mobile_no}</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\tlabel={row.call_type}\r\n\t\t\t\t\t\tcolor={row.call_type === \"INCOMING\" ? \"success\" : \"primary\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell sx={cellSx}>\r\n\t\t\t\t\t{new Date(row.start_time).toLocaleString()}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell sx={cellSx}>\r\n\t\t\t\t\t{row.end_time ? new Date(row.end_time).toLocaleString() : \"—\"}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t{row.recording.available ? (\r\n\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\tonClick={handlePlay}\r\n\t\t\t\t\t\t\tdisabled={loadingAudio}\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{loadingAudio ? <CircularProgress size={18} /> : <PlayArrow />}\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<Chip size=\"small\" label=\"No File\" />\r\n\t\t\t\t\t)}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t{row.agent_id ?? \"—\"}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t<IconButton onClick={() => setOpen((o) => !o)} size=\"small\">\r\n\t\t\t\t\t\t{open ? <ExpandLess /> : <KeyboardArrowDown />}\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</TableCell>\r\n\t\t\t</TableRow>\r\n\r\n\t\t\t{/* Audio player row */}\r\n\t\t\t{audioURL && (\r\n\t\t\t\t<TableRow>\r\n\t\t\t\t\t<TableCell colSpan={8} sx={{ p: 0 }}>\r\n\t\t\t\t\t\t<Box p={2}>\r\n\t\t\t\t\t\t\t<audio\r\n\t\t\t\t\t\t\t\tcontrols\r\n\t\t\t\t\t\t\t\tautoPlay\r\n\t\t\t\t\t\t\t\tsrc={audioURL}\r\n\t\t\t\t\t\t\t\tonEnded={() => {\r\n\t\t\t\t\t\t\t\t\tURL.revokeObjectURL(audioURL);\r\n\t\t\t\t\t\t\t\t\tsetAudioURL(null);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tstyle={{ width: \"100%\" }}\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</TableCell>\r\n\t\t\t\t</TableRow>\r\n\t\t\t)}\r\n\r\n\t\t\t{/* Details collapse row */}\r\n\t\t\t<TableRow>\r\n\t\t\t\t<TableCell colSpan={8} sx={{ p: 0 }}>\r\n\t\t\t\t\t<Collapse in={open} unmountOnExit>\r\n\t\t\t\t\t\t<Box p={2} bgcolor=\"#f9fafc\" borderTop=\"1px solid #eee\">\r\n\t\t\t\t\t\t\t<Typography fontWeight={600} fontSize=\"0.85rem\" mb={0.5}>\r\n\t\t\t\t\t\t\t\tCall Details\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t<Typography variant=\"body2\" fontSize=\"0.82rem\">\r\n\t\t\t\t\t\t\t\tCall UID: {row.call_uuid}\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t<Typography variant=\"body2\" fontSize=\"0.82rem\">\r\n\t\t\t\t\t\t\t\tAgent: {row.agent_id ?? \"Unassigned\"}\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Collapse>\r\n\t\t\t\t</TableCell>\r\n\t\t\t</TableRow>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n// ──── Default Export — wraps with SDKProvider for toast context ───────────────\r\n\r\nconst CallHistory: React.FC = () => (\r\n\t<SDKProvider>\r\n\t\t<CallHistoryContent />\r\n\t</SDKProvider>\r\n);\r\n\r\nexport default CallHistory;\r\n","import { useState, useCallback } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { CallHistoryItem, MissedCallDetails } from \"./types\";\r\n\r\nexport function useCallHistory() {\r\n\tconst [calls, setCalls] = useState<CallHistoryItem[]>([]);\r\n\tconst [missedCalls, setMissedCalls] = useState<MissedCallDetails[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchCallHistory = useCallback(async () => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.post(END_POINT.CALLS_HISTORY, {});\r\n\t\t\tsetCalls(Array.isArray(res.data?.records) ? res.data.records : []);\r\n\t\t} catch {\r\n\t\t\tsetCalls([]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchMissedCalls = useCallback(async () => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get(END_POINT.MISSED_CALLS);\r\n\t\t\tsetMissedCalls(Array.isArray(res.data?.data) ? res.data.data : []);\r\n\t\t} catch {\r\n\t\t\tsetMissedCalls([]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchRecording = useCallback(async (call_uuid: string): Promise<Blob> => {\r\n\t\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(call_uuid), {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\treturn res.data;\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\tcalls,\r\n\t\tmissedCalls,\r\n\t\tloading,\r\n\t\tfetchCallHistory,\r\n\t\tfetchMissedCalls,\r\n\t\tfetchRecording,\r\n\t};\r\n}\r\n"],"mappings":"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","names":["useState","useState"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/permissions/sdk-constants.ts","../call-control-sdk/lib/hooks/sdk-state.ts","../call-control-sdk/lib/utils/storage.ts","../call-control-sdk/lib/services/toastMessage.tsx","../call-control-sdk/lib/components/SDKProvider.tsx","../call-control-sdk/lib/services/endPoint.ts","../call-control-sdk/lib/services/axios.ts"],"sourcesContent":["/**\r\n * SDK Permission Constants\r\n *\r\n * Defines permission codes for call control features.\r\n * These codes match the 'items' in the backend entitlements response.\r\n */\r\n\r\nexport const SDK_WILDCARD = \"*\" as const;\r\n\r\n/** Menu entitlement codes from userInfo.entitlements.menus */\r\nexport const SDK_MENU_CODES = {\r\n WILDCARD: SDK_WILDCARD,\r\n CALL_HISTORY: \"call_history\",\r\n} as const;\r\n\r\nexport const SDK_PERMISSIONS = {\r\n WILDCARD: SDK_WILDCARD,\r\n // main object key constants\r\n\r\n CALLS: \"calls\",\r\n CALL_TRANSFER: \"call_transfer\",\r\n CALL_CONFERENCE: \"call_conference\",\r\n\r\n // in each object has items list of objects\r\n\r\n CALL_INBOUND: \"call_inbound\",\r\n CALL_OUTBOUND: \"call_outbound\",\r\n\r\n CONFERENCE: \"call_conference\",\r\n\r\n TRANSFER_BLIND: \"call_transfer_blind\",\r\n TRANSFER_ATTENDED: \"call_transfer_attended\",\r\n TRANSFER_WARM: \"call_transfer_warm\",\r\n} as const;\r\n","import { getSession, removeSession, setSession } from \"@react-solutions/vault\";\r\nimport type {\r\n SDKState,\r\n CallData,\r\n ConferenceLineTypes,\r\n SDKConfig,\r\n InitSDKRes,\r\n URLConfig,\r\n ConsultInfo,\r\n} from \"../../types\";\r\nimport { STORAGE_KEY } from \"../utils/storage\";\r\nimport {\r\n SDK_PERMISSIONS,\r\n type SDKEntitlements,\r\n type ControlsFromPermissions,\r\n SDK_MENU_CODES,\r\n} from \"../permissions\";\r\n\r\nclass SDKStateManager {\r\n private state: SDKState;\r\n private listeners: Array<() => void> = [];\r\n private readonly STORAGE_KEY = STORAGE_KEY;\r\n\r\n private apiKey: string | undefined;\r\n private tenantId: string | undefined;\r\n\r\n constructor() {\r\n this.state = this.getInitialState();\r\n this.loadFromStorage();\r\n }\r\n\r\n private getInitialState(): SDKState {\r\n return {\r\n authorization: undefined,\r\n process: null,\r\n agentId: \"\",\r\n openConferenceDialog: false,\r\n openCallTransferDialog: false,\r\n isInitialized: false,\r\n sdkConfig: {\r\n disableEndCallButton: false,\r\n disabledDialButton: false,\r\n disabledMoreOptionsButton: false,\r\n enableSmsServices: false,\r\n enableQueueName: false,\r\n disableCallTransferButton: false,\r\n disableBlindTransfer: false,\r\n disableAttendedTransfer: false,\r\n disableWarmTransfer: false,\r\n isDraggable: true,\r\n disableSoftPhone: false,\r\n disableConferenceButton: false,\r\n disableHoldButton: false,\r\n disableMuteButton: false,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n },\r\n urlConfig: {\r\n baseURL: \"\",\r\n iframeURL: \"\",\r\n iframeAPIURL: \"\",\r\n webSocketURL: \"\",\r\n coreBaseURL: \"\",\r\n id: \"\",\r\n password: \"\",\r\n },\r\n callStartTime: null,\r\n controlPanelPosition: { x: 10, y: 10 },\r\n iframePosition: {\r\n x: window.screen?.availWidth - 460,\r\n y: window.screen?.height - 580,\r\n },\r\n callData: {\r\n agent_id: -1,\r\n queue_name: \"\",\r\n hold: 0,\r\n mute: 0,\r\n status: \"\",\r\n type: \"\",\r\n event_time: \"\",\r\n phone_number: \"\",\r\n },\r\n conferenceLine: [\r\n {\r\n line: 1,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 2,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 3,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 4,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n {\r\n line: 5,\r\n status: \"IDLE\",\r\n type: \"\",\r\n phone: \"\",\r\n isMute: false,\r\n isHold: false,\r\n isCallStart: false,\r\n isMergeCall: false,\r\n },\r\n ],\r\n hold: 0,\r\n mute: 0,\r\n agentStatus: \"\",\r\n sdk: null,\r\n isPermissionsLoaded: false,\r\n userPermissions: null,\r\n menuEntitlements: null,\r\n consultInfo: null,\r\n };\r\n }\r\n\r\n private loadFromStorage(): void {\r\n try {\r\n const stored = <SDKState>getSession(this.STORAGE_KEY);\r\n if (stored) {\r\n const parsedState = stored;\r\n this.state = {\r\n ...this.state,\r\n agentId: parsedState.agentId || \"\",\r\n authorization: parsedState.authorization || undefined,\r\n process: parsedState.process || null,\r\n openConferenceDialog: parsedState?.openConferenceDialog || false,\r\n openCallTransferDialog: parsedState?.openCallTransferDialog || false,\r\n isInitialized: parsedState.isInitialized || false,\r\n sdkConfig: parsedState.sdkConfig || {\r\n disableEndCallButton: false,\r\n disabledMoreOptionsButton: false,\r\n enableSmsServices: false,\r\n enableQueueName: false,\r\n disabledDialButton: false,\r\n disableCallTransferButton: false,\r\n disableBlindTransfer: false,\r\n disableAttendedTransfer: false,\r\n disableWarmTransfer: false,\r\n isDraggable: true,\r\n disableSoftPhone: false,\r\n disableConferenceButton: false,\r\n disableHoldButton: false,\r\n disableMuteButton: false,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n },\r\n urlConfig: parsedState.urlConfig || {\r\n id: \"\",\r\n baseURL: \"\",\r\n iframeURL: \"\",\r\n iframeAPIURL: \"\",\r\n webSocketURL: \"\",\r\n coreBaseURL: \"\",\r\n password: \"\",\r\n },\r\n callStartTime: parsedState.callStartTime || null,\r\n controlPanelPosition: parsedState.controlPanelPosition || {\r\n x: 10,\r\n y: 10,\r\n },\r\n iframePosition: parsedState.iframePosition || {\r\n x: window.screen?.availWidth - 460,\r\n y: window.screen?.height - 580,\r\n },\r\n callData: parsedState.callData || {\r\n mobileNumber: \"\",\r\n callReferenceId: \"\",\r\n agent_id: \"\",\r\n status: \"\",\r\n type: \"\",\r\n event_time: \"\",\r\n phone_number: \"\",\r\n },\r\n conferenceLine:\r\n parsedState.conferenceLine &&\r\n Array.isArray(parsedState.conferenceLine) &&\r\n parsedState.conferenceLine.length > 0\r\n ? parsedState.conferenceLine\r\n : this.state.conferenceLine,\r\n agentStatus: parsedState.agentStatus,\r\n sdk: parsedState.sdk || null,\r\n isPermissionsLoaded: parsedState.isPermissionsLoaded || false,\r\n userPermissions: parsedState.userPermissions || null,\r\n menuEntitlements: parsedState.menuEntitlements || null,\r\n };\r\n }\r\n } catch (error) {\r\n console.warn(\"Failed to load SDK state:\", error);\r\n }\r\n }\r\n\r\n private saveToStorage(): void {\r\n try {\r\n const persistentState = {\r\n agentId: this.state.agentId,\r\n authorization: this.state.authorization,\r\n process: this.state.process,\r\n isInitialized: this.state.isInitialized,\r\n openConferenceDialog: this.state.openConferenceDialog,\r\n openCallTransferDialog: this.state.openCallTransferDialog,\r\n sdkConfig: this.state.sdkConfig,\r\n urlConfig: this.state.urlConfig,\r\n callStartTime: this.state.callStartTime,\r\n controlPanelPosition: this.state.controlPanelPosition,\r\n iframePosition: this.state.iframePosition,\r\n callData: this.state.callData,\r\n conferenceLine: this.state.conferenceLine,\r\n agentStatus: this.state.agentStatus,\r\n sdk: this.state.sdk,\r\n isPermissionsLoaded: this.state.isPermissionsLoaded,\r\n userPermissions: this.state.userPermissions,\r\n menuEntitlements: this.state.menuEntitlements,\r\n };\r\n setSession(this.STORAGE_KEY, persistentState);\r\n } catch (error) {\r\n console.warn(\"Failed to save SDK state:\", error);\r\n }\r\n }\r\n\r\n private notifyListeners(): void {\r\n this.listeners.forEach((listener) => listener());\r\n }\r\n\r\n private validateCredentials(apiKey: string, tenantId: string): void {\r\n if (!apiKey || typeof apiKey !== \"string\" || apiKey.trim().length === 0) {\r\n throw new Error(\"API key not available\");\r\n }\r\n if (\r\n !tenantId ||\r\n typeof tenantId !== \"string\" ||\r\n tenantId.trim().length === 0\r\n ) {\r\n throw new Error(\"Tenant ID not available\");\r\n }\r\n this.apiKey = apiKey.trim();\r\n this.tenantId = tenantId.trim();\r\n }\r\n\r\n public initialize(\r\n apiKey: string,\r\n tenantId: string,\r\n agentId: string,\r\n urlConfig?: URLConfig,\r\n initResult?: InitSDKRes,\r\n sdkConfig?: SDKConfig,\r\n ): void {\r\n this.validateCredentials(apiKey, tenantId);\r\n if (\r\n !agentId ||\r\n typeof agentId !== \"string\" ||\r\n agentId.trim().length === 0\r\n ) {\r\n throw new Error(\"Agent ID not available\");\r\n } else {\r\n this.state.agentId = agentId;\r\n this.state.openConferenceDialog = false;\r\n this.state.openCallTransferDialog = false;\r\n this.state.authorization = initResult;\r\n this.state.sdkConfig = {\r\n disableEndCallButton: false,\r\n disabledDialButton: false,\r\n disabledMoreOptionsButton: false,\r\n enableQueueName: false,\r\n disableCallTransferButton: false,\r\n disableBlindTransfer: false,\r\n disableAttendedTransfer: false,\r\n disableWarmTransfer: false,\r\n isDraggable: true,\r\n disableSoftPhone: false,\r\n disableConferenceButton: false,\r\n disableHoldButton: false,\r\n disableMuteButton: false,\r\n disabled: {},\r\n enabled: {},\r\n outlined: {},\r\n ...sdkConfig,\r\n ...initResult?.callControls,\r\n };\r\n this.state.urlConfig = {\r\n baseURL: urlConfig?.baseURL || \"\",\r\n iframeURL: urlConfig?.iframeURL || \"\",\r\n iframeAPIURL: urlConfig?.iframeAPIURL || \"\",\r\n webSocketURL: urlConfig?.webSocketURL || \"\",\r\n coreBaseURL: urlConfig?.coreBaseURL || \"\",\r\n id: initResult?.userInfo?.id ? String(initResult.userInfo.id) : \"\",\r\n password: urlConfig?.password || \"\",\r\n };\r\n this.state.isInitialized = true;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n }\r\n\r\n public getState(): SDKState {\r\n return { ...this.state };\r\n }\r\n\r\n public getCredentials(): {\r\n apiKey: string | undefined;\r\n tenantId: string | undefined;\r\n } {\r\n return { apiKey: this.apiKey, tenantId: this.tenantId };\r\n }\r\n public getSdkAuthToken(): string | undefined {\r\n return this.state.authorization?.accessToken;\r\n }\r\n\r\n public subscribe(listener: () => void): () => void {\r\n this.listeners.push(listener);\r\n return () => {\r\n const index = this.listeners.indexOf(listener);\r\n if (index > -1) {\r\n this.listeners.splice(index, 1);\r\n }\r\n };\r\n }\r\n\r\n // public setHolding(isHolding: boolean): void {\r\n // \tthis.state.isHolding = isHolding;\r\n // \tthis.saveToStorage();\r\n // \tthis.notifyListeners();\r\n // }\r\n\r\n // public setMuted(isMuted: boolean): void {\r\n // \tthis.state.isMuted = isMuted;\r\n // \tthis.saveToStorage();\r\n // \tthis.notifyListeners();\r\n // }\r\n\r\n public setProcess(process: {\r\n process_id: number;\r\n process_name: string;\r\n }): void {\r\n this.state.process = process;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setControlPanelPosition(position: { x: number; y: number }): void {\r\n this.state.controlPanelPosition = position;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setIframePosition(position: { x: number; y: number }): void {\r\n this.state.iframePosition = position;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public startCall(): void {\r\n this.state.callStartTime = Date.now();\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public endCall(): void {\r\n this.state.callStartTime = null;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setInitCheck(): void {\r\n this.state.isInitialized = false;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setOpenConferenceDialog(open: boolean): void {\r\n this.state.openConferenceDialog = open;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setOpenCallTransferDialog(open: boolean): void {\r\n this.state.openCallTransferDialog = open;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setConsultInfo(info: ConsultInfo | null): void {\r\n this.state.consultInfo = info;\r\n this.notifyListeners();\r\n }\r\n\r\n public setAgentStatus(status: string): void {\r\n this.state.agentStatus = status;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public updateCallData(data: Partial<CallData>): void {\r\n this.state.callData = { ...this.state.callData, ...data };\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public updateConferenceData(data: ConferenceLineTypes[]): void {\r\n this.state.conferenceLine = [...data];\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public setConferenceLine(line: ConferenceLineTypes): void {\r\n if (\r\n !this.state.conferenceLine ||\r\n !Array.isArray(this.state.conferenceLine)\r\n ) {\r\n this.state.conferenceLine = this.getInitialState().conferenceLine;\r\n }\r\n\r\n const conferenceLineData = this.state.conferenceLine?.map(\r\n (each: ConferenceLineTypes) => {\r\n if (each.line === line.line) {\r\n return line;\r\n }\r\n return each;\r\n },\r\n );\r\n this.state.conferenceLine = conferenceLineData;\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public resetConferenceLines(): void {\r\n this.state.conferenceLine = [\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 this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n public clearStorageAndReset(): void {\r\n try {\r\n removeSession(this.STORAGE_KEY);\r\n this.state = this.getInitialState();\r\n this.notifyListeners();\r\n } catch (error) {\r\n console.warn(\"Failed to clear:\", error);\r\n }\r\n }\r\n\r\n public getConferenceLines(): ConferenceLineTypes[] {\r\n return this.state.conferenceLine || [];\r\n }\r\n\r\n /**\r\n * Update SDK config with permission-based controls.\r\n * Merges the provided controls with existing config.\r\n */\r\n public updateSDKConfigFromPermissions(\r\n permissionControls: Partial<SDKConfig>,\r\n ): void {\r\n this.state.sdkConfig = {\r\n ...this.state.sdkConfig,\r\n ...permissionControls,\r\n };\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n /**\r\n * Revert call consult controls back to the base permission-derived values.\r\n * Called when a CALL_STATE event arrives without call_consult_controls.\r\n */\r\n public resetConsultControls(): void {\r\n const base = this.getControlsConfig();\r\n this.state.sdkConfig = {\r\n ...this.state.sdkConfig,\r\n disableEndCallButton: base.disableEndCallButton,\r\n disableCallTransferButton: base.disableCallTransferButton,\r\n disableConferenceButton: base.disableConferenceButton,\r\n disableHoldButton: base.disableHoldButton,\r\n disableMuteButton: base.disableMuteButton,\r\n };\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n // ============ Entitlement Logic (Ported from SDKPermissionManager) ============\r\n\r\n /**\r\n * Set user information (entitlements) from login response\r\n */\r\n public setSDKPermissions(userInfo: any): void {\r\n if (!userInfo) return;\r\n\r\n // In a real scenario, this would come from userInfo.entitlements?.sdk\r\n // For now, we use the structured format expected by the SDK\r\n\r\n const sdk: SDKEntitlements = userInfo.entitlements?.sdk;\r\n const sdkPermissions = Array.isArray(userInfo.permissions) ? userInfo.permissions : null;\r\n const sdkMenus = Array.isArray(userInfo.entitlements?.menus)\r\n ? userInfo.entitlements.menus\r\n : null;\r\n\r\n // const sdkMenus:any[] = [\r\n // {\r\n // \"code\": SDK_MENU_CODES.WILDCARD,\r\n // \"name\": \"Role Management\",\r\n // \"enabled\": true\r\n // },\r\n // // {\r\n // // \"code\": SDK_MENU_CODES.CALL_HISTORY,\r\n // // \"name\": \"Role Management\",\r\n // // \"enabled\": true\r\n // // }\r\n // ]\r\n\r\n // const sdk: SDKEntitlements = {\r\n // calls: {\r\n // enabled: true,\r\n // items: [\r\n // {\r\n // code: SDK_PERMISSIONS.CALL_OUTBOUND,\r\n // enabled: true,\r\n // },\r\n // {\r\n // code: SDK_PERMISSIONS.CALL_INBOUND,\r\n // enabled: true,\r\n // },\r\n // ],\r\n // },\r\n // call_transfer: {\r\n // enabled: true,\r\n // items: [\r\n // {\r\n // code: SDK_PERMISSIONS.TRANSFER_BLIND,\r\n // enabled: true,\r\n // },\r\n // {\r\n // code: SDK_PERMISSIONS.TRANSFER_ATTENDED,\r\n // enabled: true,\r\n // },\r\n // {\r\n // code: SDK_PERMISSIONS.TRANSFER_WARM,\r\n // enabled: true,\r\n // },\r\n // ],\r\n // },\r\n // call_conference: {\r\n // enabled: true,\r\n // items: [\r\n // {\r\n // code: SDK_PERMISSIONS.CONFERENCE,\r\n // enabled: true,\r\n // },\r\n // ],\r\n // },\r\n // };\r\n\r\n this.state.sdk = sdk;\r\n this.state.userPermissions = sdkPermissions\r\n this.state.menuEntitlements = sdkMenus\r\n this.state.isPermissionsLoaded = true;\r\n\r\n // Automatically update SDK config based on these new entitlements\r\n const permissionControls = this.getControlsConfig();\r\n this.updateSDKConfigFromPermissions(permissionControls);\r\n\r\n this.saveToStorage();\r\n this.notifyListeners();\r\n }\r\n\r\n /**\r\n * Check if a bit is enabled in entitlements\r\n */\r\n public isBitEnabled(\r\n category: keyof SDKEntitlements,\r\n bitCode: string,\r\n ): boolean {\r\n const sdk = this.state.sdk;\r\n if (!sdk) return false;\r\n\r\n const categoryEntitlement = sdk[category];\r\n if (!categoryEntitlement) return false;\r\n if (!categoryEntitlement.enabled) return false;\r\n\r\n if (!bitCode) return true; // Just checking category enabledness\r\n\r\n const bit = categoryEntitlement.items?.find(\r\n (item: any) => item.code === bitCode,\r\n );\r\n return bit ? bit.enabled : false;\r\n }\r\n\r\n /** Check if the user has a specific flat permission (e.g. \"calls:inbound\") */\r\n public hasPermission(permission: string): boolean {\r\n const perms = this.state.userPermissions;\r\n if (!perms) return false;\r\n return perms.includes(\"*\") || perms.includes(permission);\r\n }\r\n\r\n /** Check if any of the provided permissions is granted */\r\n public hasAnyPermission(permissions: string[]): boolean {\r\n return permissions.some((p) => this.hasPermission(p));\r\n }\r\n\r\n /** Check if all of the provided permissions are granted */\r\n public hasAllPermissions(permissions: string[]): boolean {\r\n return permissions.every((p) => this.hasPermission(p));\r\n }\r\n\r\n /** Check if a menu entitlement is enabled (e.g. \"campaign\"). Supports \"*\" wildcard. */\r\n public hasMenuFeature(code: string): boolean {\r\n const menus = this.state.menuEntitlements;\r\n if (!menus) return false;\r\n if (menus.some((m) => m.code === \"*\" && m.enabled)) return true;\r\n const entry = menus.find((m) => m.code === code);\r\n return entry ? entry.enabled : false;\r\n }\r\n\r\n /**\r\n * Get SDK controls configuration derived exclusively from structured entitlements.\r\n */\r\n public getControlsConfig(): ControlsFromPermissions {\r\n const { sdk, isPermissionsLoaded } = this.state;\r\n\r\n // If entitlements not loaded yet or missing, disable everything (Fail Closed)\r\n if (!isPermissionsLoaded || !sdk) {\r\n return {\r\n disabledDialButton: true,\r\n disableEndCallButton: true,\r\n disableCallTransferButton: true,\r\n disableBlindTransfer: true,\r\n disableAttendedTransfer: true,\r\n disableWarmTransfer: true,\r\n disableConferenceButton: true,\r\n disableHoldButton: true,\r\n disableMuteButton: true,\r\n disabledMoreOptionsButton: true,\r\n };\r\n }\r\n\r\n // --- Dial/Inbound Checks ---\r\n const isDialAllowed = this.isBitEnabled(\r\n \"calls\",\r\n SDK_PERMISSIONS.CALL_OUTBOUND,\r\n );\r\n const isInboundAllowed = this.isBitEnabled(\r\n \"calls\",\r\n SDK_PERMISSIONS.CALL_INBOUND,\r\n );\r\n const isAnyCallAllowed = isDialAllowed || isInboundAllowed;\r\n\r\n // --- Call Controls ---\r\n const isHoldAllowed = isAnyCallAllowed;\r\n const isMuteAllowed = isAnyCallAllowed;\r\n const isEndCallAllowed = isAnyCallAllowed;\r\n const isConferenceAllowed = this.isBitEnabled(\"call_conference\", \"\");\r\n const isTransferEnabled = this.isBitEnabled(\"call_transfer\", \"\");\r\n\r\n // --- Transfer Controls ---\r\n const isBlindAllowed = this.isBitEnabled(\r\n \"call_transfer\",\r\n SDK_PERMISSIONS.TRANSFER_BLIND,\r\n );\r\n const isAttendedAllowed = this.isBitEnabled(\r\n \"call_transfer\",\r\n SDK_PERMISSIONS.TRANSFER_ATTENDED,\r\n );\r\n const isWarmAllowed = this.isBitEnabled(\r\n \"call_transfer\",\r\n SDK_PERMISSIONS.TRANSFER_WARM,\r\n );\r\n\r\n return {\r\n disabledDialButton: !isDialAllowed,\r\n disableEndCallButton: !isEndCallAllowed,\r\n disableCallTransferButton: !isTransferEnabled,\r\n disableBlindTransfer: !isBlindAllowed,\r\n disableAttendedTransfer: !isAttendedAllowed,\r\n disableWarmTransfer: !isWarmAllowed,\r\n disableConferenceButton: !isConferenceAllowed,\r\n disableHoldButton: !isHoldAllowed,\r\n disableMuteButton: !isMuteAllowed,\r\n disabledMoreOptionsButton: false,\r\n };\r\n }\r\n}\r\n\r\nexport const sdkStateManager = new SDKStateManager();\r\n\r\nexport type { SDKStateManager };\r\n","export const STORAGE_KEY = \"call-control-sdk-state\";\r\n","import { createContext, useContext, useState, ReactNode } from \"react\";\r\nimport { Snackbar, Alert, AlertColor } from \"@mui/material\";\r\n\r\ntype ToastContextType = {\r\n\tshowToast: (message: string, severity?: AlertColor) => void;\r\n};\r\n\r\nconst ToastContext = createContext<ToastContextType | undefined>(undefined);\r\n\r\nconst noopToast: ToastContextType = {\r\n\tshowToast: (message, severity) => {\r\n\t\tconsole.warn(`[Toast outside provider] ${severity ?? \"info\"}: ${message}`);\r\n\t},\r\n};\r\n\r\nexport const useToast = () => {\r\n\tconst ctx = useContext(ToastContext);\r\n\treturn ctx ?? noopToast;\r\n};\r\n\r\nexport const ToastProvider = ({ children }: { children: ReactNode }) => {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst [message, setMessage] = useState(\"\");\r\n\tconst [severity, setSeverity] = useState<AlertColor>(\"info\");\r\n\r\n\tconst showToast = (msg: string, sev: AlertColor = \"info\") => {\r\n\t\tsetMessage(msg);\r\n\t\tsetSeverity(sev);\r\n\t\tsetOpen(true);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<ToastContext.Provider value={{ showToast }}>\r\n\t\t\t{children}\r\n\t\t\t<Snackbar\r\n\t\t\t\topen={open}\r\n\t\t\t\tcolor={severity}\r\n\t\t\t\tautoHideDuration={3000}\r\n\t\t\t\tonClose={() => setOpen(false)}\r\n\t\t\t\tanchorOrigin={{ vertical: \"top\", horizontal: \"right\" }}\r\n\t\t\t>\r\n\t\t\t\t<Alert\r\n\t\t\t\t\tvariant=\"filled\"\r\n\t\t\t\t\tseverity={severity}\r\n\t\t\t\t\tonClose={() => setOpen(false)}\r\n\t\t\t\t\tsx={{ width: \"100%\" }}\r\n\t\t\t\t>\r\n\t\t\t\t\t{message}\r\n\t\t\t\t</Alert>\r\n\t\t\t</Snackbar>\r\n\t\t</ToastContext.Provider>\r\n\t);\r\n};\r\n","import { memo } from \"react\";\r\nimport { ToastProvider } from \"../services/toastMessage\";\r\nimport React from \"react\";\r\nimport { SDKProviderProps } from \"../../types\";\r\n\r\nexport const SDKProvider = memo<SDKProviderProps>(({ children }) => {\r\n\treturn <ToastProvider>{children}</ToastProvider>;\r\n});\r\n\r\nSDKProvider.displayName = \"SDKProvider\";\r\n","import { sdkStateManager } from \"../hooks/sdk-state\";\r\n\r\n\r\n// export const IP = \"192.168.100.254\";\r\n\r\n// export const IFRAME_IP = \"10.10.95.25\"\r\n// export const IFRAME_URL = `https://${IFRAME_IP}:8089`;\r\n// export const IFRAME_API_URL = `https://${IFRAME_IP}:8000`;\r\n\r\n\r\n// export const BASE_URL = `http://${IP}:8095`;\r\n// export const WS_BASE_URL = `ws://${IP}:8095`;\r\n\r\n// export const IFRAME_URL = sdkStateManager?.getState()?.urlConfig?.iframeURL\r\n// export const IFRAME_API_URL = sdkStateManager?.getState()?.urlConfig?.iframeAPIURL\r\n\r\n// Dynamically get URLs from SDK state\r\nconst getBaseURL = () => sdkStateManager?.getState()?.urlConfig?.baseURL || \"\";\r\nconst getCoreURL = () => sdkStateManager?.getState()?.urlConfig?.coreBaseURL || \"\";\r\n\r\nexport const BASE_URL = getBaseURL();\r\nexport const CORE_URL = getCoreURL();\r\n\r\nexport const VERSION = {\r\n\tv1: \"/api/v1\",\r\n};\r\n\r\n// Dynamic endpoint getters that fetch URLs from SDK state at runtime\r\nexport const END_POINT = {\r\n\tget LOGIN() { return `${getBaseURL()}${VERSION.v1}/cti/login?provider=convox`; },\r\n\tget READY_AGENT() { return `${getCoreURL()}${VERSION.v1}/agents/ready`; },\r\n\tget UPDATE_AGENT_BREAK() { return `${getCoreURL()}${VERSION.v1}/agents/status`; },\r\n\tget CLICK_TO_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/dial`; },\r\n\tget HOLD_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/hold`; },\r\n\tget MUTE_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/mute`; },\r\n\tget UNMUTE_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/mute`; },\r\n\tget END_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/hangup`; },\r\n\tget LOGOUT() { return `${getBaseURL()}${VERSION.v1}/cti/logout?provider=convox`; },\r\n\r\n\tget CONFERENCE_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/conference/add`; },\r\n\tget CONFERENCE_MERGE_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/conference/merge`; },\r\n\tget CONFERENCE_CALL_HOLD_OR_UN_HOLD() { return `${getCoreURL()}${VERSION.v1}/cti/calls/hold`; },\r\n\tget CONFERENCE_CALL_MUTE_OT_UN_MUTE() { return `${getCoreURL()}${VERSION.v1}/cti/calls/mute`; },\r\n\tget CONFERENCE_CALL_END() { return `${getCoreURL()}${VERSION.v1}/cti/calls/hangup`; },\r\n\tget CONFERENCE_CALL_END_ALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/hangup`; },\r\n\tget CONFERENCE_CALL_TRANSFER() { return `${getCoreURL()}${VERSION.v1}/cti/calls/conference/transfer`; },\r\n\tget TRANSFER_CALL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/transfer-call`; },\r\n\tget TRANSFER_COMPLETE() { return `${getCoreURL()}${VERSION.v1}/cti/calls/transfer/complete`; },\r\n\tget TRANSFER_CANCEL() { return `${getCoreURL()}${VERSION.v1}/cti/calls/transfer/cancel`; },\r\n\r\n\tget AGENTS_LIST() { return `${getBaseURL()}${VERSION.v1}/cti/users`; },\r\n\tget PROCESS_LIST() { return `${getBaseURL()}${VERSION.v1}/cti/processes-list`; },\r\n\tget BREAKS_LIST() { return `${getBaseURL()}${VERSION.v1}/cti/breaks`; },\r\n\tget TRANSFER_TO_DETAILS() { return `${getBaseURL()}${VERSION.v1}/cti/transfer-to-details?provider=convox`; },\r\n\tget SEND_NOTIFICATIONS() { return `${getBaseURL()}${VERSION.v1}/cti/notifications/send`; },\r\n\r\n\tget CALL_HISTORY() { return `${getBaseURL()}${VERSION.v1}/dashboard/call-history`; },\r\n\tget SENTIMENTAL_ANALYSIS() { return `${getBaseURL()}${VERSION.v1}/users/get_sentiment_analysis`; },\r\n\tget DISPOSITIONS() { return `${getBaseURL()}${VERSION.v1}/cti/calls/dispositions`; },\r\n\tget HOSPITALS_SERVICES() { return `${getBaseURL()}${VERSION.v1}/cti/hospital/services`; },\r\n\tget BLIEND_TRANSFER() { return `${getBaseURL()}${VERSION.v1}/cti/calls/blind_transfer?provider=convox`; },\r\n\r\n\tget AUTH_LOGOUT() { return `${getBaseURL()}${VERSION.v1}/auth/logout`; },\r\n\r\n\t// Permissions\r\n\tget USER_PERMISSIONS() { return `${getBaseURL()}${VERSION.v1}/rbac/users/me/permissions`; },\r\n\r\n\t// Supervisor Call Monitoring (Listen / Whisper / Barge via ChanSpy)\r\n\tget SUPERVISOR_CALL_LISTEN() { return `${getBaseURL()}${VERSION.v1}/cti/supervisor/listen`; },\r\n\tget SUPERVISOR_CALL_LEAVE() { return `${getBaseURL()}${VERSION.v1}/cti/supervisor/leave`; },\r\n\tget SUPERVISOR_CALL_CHANGE_MODE() { return `${getBaseURL()}${VERSION.v1}/cti/supervisor/mode`; },\r\n\r\n\t// Call History pages\r\n\tget CALLS_HISTORY() { return `${getBaseURL()}${VERSION.v1}/calls/history`; },\r\n\tget MISSED_CALLS() { return `${getBaseURL()}${VERSION.v1}/supervisor/missed-calls`; },\r\n\tRECORDING_BY_CALL: (call_uuid: string) => `${getBaseURL()}${VERSION.v1}/recordings/call/${call_uuid}`,\r\n};\r\n\r\n// export const WS_END_POINT = {\r\n// \tWS: `${WS_BASE_URL}${VERSION.v1}/cti/ws`,\r\n// };\r\n\r\n// export const STORAGE_KEY = \"call-control-sdk-state\";\r\n","import axios, { AxiosInstance, AxiosResponse, AxiosError, InternalAxiosRequestConfig } from \"axios\";\r\nimport { BASE_URL } from \"./endPoint\";\r\nimport { sdkStateManager } from \"../hooks/sdk-state\";\r\n\r\nconst DEFAULT_TOKEN = sdkStateManager.getSdkAuthToken() ?? \"\";\r\n\r\nconst REQUEST_TIMEOUT = 60000;\r\n\r\nfunction getAuthToken(): string {\r\n\treturn sdkStateManager.getSdkAuthToken() ?? \"\";\r\n}\r\n\r\nfunction createAxiosInstance(): AxiosInstance {\r\n\tconst instance = axios.create({\r\n\t\t// baseURL: sdkStateManager.getState()?.urlConfig?.baseURL,\r\n\t\theaders: {\r\n\t\t\t\"Content-Type\": \"application/json\",\r\n\t\t\tAccept: \"application/json\",\r\n\t\t\t\"x-tenant-id\": sdkStateManager.getCredentials()?.tenantId ?? \"\",\r\n\t\t\t\"x-api-key\": sdkStateManager.getCredentials()?.apiKey ?? \"\",\r\n\t\t\tAuthorization: DEFAULT_TOKEN\r\n\t\t\t\t? (DEFAULT_TOKEN.startsWith(\"Bearer \") ? DEFAULT_TOKEN : `Bearer ${DEFAULT_TOKEN}`)\r\n\t\t\t\t: \"\",\r\n\t\t},\r\n\t\ttimeout: REQUEST_TIMEOUT,\r\n\t\twithCredentials: false,\r\n\t});\r\n\r\n\tinstance.interceptors.request.use(\r\n\t\t(config: InternalAxiosRequestConfig) => {\r\n\t\t\tconst token = getAuthToken();\r\n\r\n\t\t\tif (token && config.headers) {\r\n\t\t\t\t// Only add \"Bearer \" prefix if the token doesn't already have it\r\n\t\t\t\tconst authToken = token.startsWith(\"Bearer \") ? token : `Bearer ${token}`;\r\n\t\t\t\tconfig.headers.Authorization = authToken;\r\n\t\t\t}\r\n\r\n\t\t\t// Debug log for API calls\r\n\t\t\tconsole.log(\"API Request:\", {\r\n\t\t\t\turl: config.url,\r\n\t\t\t\tmethod: config.method,\r\n\t\t\t\thasToken: !!token,\r\n\t\t\t\ttokenStartsWithBearer: token?.startsWith(\"Bearer \"),\r\n\t\t\t\theaders: {\r\n\t\t\t\t\tAuthorization: config.headers.Authorization,\r\n\t\t\t\t\t\"x-tenant-id\": config.headers[\"x-tenant-id\"],\r\n\t\t\t\t\t\"x-api-key\": config.headers[\"x-api-key\"],\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t(config as any).metadata = { startTime: new Date().getTime() };\r\n\r\n\t\t\treturn config;\r\n\t\t},\r\n\t\t(error: AxiosError) => {\r\n\t\t\tconsole.error(\"Request interceptor error:\", error);\r\n\t\t\treturn Promise.reject(error);\r\n\t\t}\r\n\t);\r\n\r\n\tinstance.interceptors.response.use(\r\n\t\t(response: AxiosResponse) => {\r\n\t\t\treturn response;\r\n\t\t},\r\n\t\tasync (error: AxiosError) => {\r\n\t\t\tconst originalRequest = error.config as InternalAxiosRequestConfig & { _retry?: boolean };\r\n\r\n\t\t\tif (error.response?.status === 401 && !originalRequest._retry) {\r\n\t\t\t\tsdkStateManager.setInitCheck();\r\n\t\t\t\tconsole.warn(\"Unauthorized request, attempting retry...\");\r\n\t\t\t}\r\n\r\n\t\t\tif (!error.response) {\r\n\t\t\t\tconsole.error(\"Network error:\", error.message);\r\n\t\t\t\terror.message = \"Network error: Please check your internet connection\";\r\n\t\t\t}\r\n\r\n\t\t\tif (error.response && error.response.status >= 500) {\r\n\t\t\t\tconsole.error(\"Server error:\", error.response.status, error.response.data);\r\n\t\t\t\terror.message = \"Server error: Please try again later\";\r\n\t\t\t}\r\n\r\n\t\t\treturn Promise.reject(error);\r\n\t\t}\r\n\t);\r\n\r\n\treturn instance;\r\n}\r\n\r\nconst axiosInstance: AxiosInstance = createAxiosInstance();\r\n\r\nexport default axiosInstance;\r\n"],"mappings":"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","names":["_a","jsx","_a","_a"]}
|