ahs-cti 0.0.3 → 0.0.5
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-F7XZLVVO.mjs +16 -0
- package/dist/{agentPerformanceReport-F52KNRKW.mjs → agentPerformanceReport-U2QGVTXF.mjs} +31 -15
- package/dist/agentPerformanceReport-U2QGVTXF.mjs.map +1 -0
- package/dist/{auditReport-CJ23LXIZ.mjs → auditReport-DEVQDTDT.mjs} +4 -3
- package/dist/{auditReport-CJ23LXIZ.mjs.map → auditReport-DEVQDTDT.mjs.map} +1 -1
- package/dist/{callHistory-ZA3SCD7K.mjs → callHistory-MRBBY3UO.mjs} +49 -20
- package/dist/callHistory-MRBBY3UO.mjs.map +1 -0
- package/dist/{campaigns-PIXRNMM4.mjs → campaigns-ERO3QM6I.mjs} +246 -109
- package/dist/campaigns-ERO3QM6I.mjs.map +1 -0
- package/dist/{cdrReport-7TKZERRX.mjs → cdrReport-EZNOCELK.mjs} +77 -30
- package/dist/cdrReport-EZNOCELK.mjs.map +1 -0
- package/dist/chunk-3DOSR6LQ.mjs +14 -0
- package/dist/chunk-3DOSR6LQ.mjs.map +1 -0
- package/dist/chunk-53DYH64M.mjs +422 -0
- package/dist/chunk-53DYH64M.mjs.map +1 -0
- package/dist/{chunk-VZCHJLAW.mjs → chunk-5FSMIU5K.mjs} +2 -2
- package/dist/{chunk-NUYGQI7D.mjs → chunk-6MURUWDX.mjs} +39 -14
- package/dist/chunk-6MURUWDX.mjs.map +1 -0
- package/dist/{chunk-X376SOIZ.mjs → chunk-AJQBR3AZ.mjs} +14279 -9170
- package/dist/chunk-AJQBR3AZ.mjs.map +1 -0
- package/dist/{chunk-RZZQ42MG.mjs → chunk-BVQNDAS6.mjs} +6 -3
- package/dist/{chunk-RZZQ42MG.mjs.map → chunk-BVQNDAS6.mjs.map} +1 -1
- package/dist/chunk-DXZIYCNQ.mjs +14 -0
- package/dist/chunk-DXZIYCNQ.mjs.map +1 -0
- package/dist/{chunk-L4LLUMYA.mjs → chunk-ICGEHYJL.mjs} +11 -3
- package/dist/chunk-ICGEHYJL.mjs.map +1 -0
- package/dist/{chunk-JAAPNDP2.mjs → chunk-ISQBOS5Q.mjs} +49 -45
- package/dist/chunk-ISQBOS5Q.mjs.map +1 -0
- package/dist/chunk-MBHP7UOP.mjs +14 -0
- package/dist/chunk-MBHP7UOP.mjs.map +1 -0
- package/dist/chunk-MBXHRFGP.mjs +14 -0
- package/dist/chunk-MBXHRFGP.mjs.map +1 -0
- package/dist/chunk-MFZKONNR.mjs +14 -0
- package/dist/chunk-MFZKONNR.mjs.map +1 -0
- package/dist/{chunk-DBSNJ3QH.mjs → chunk-Q7FIRWF2.mjs} +9 -2
- package/dist/chunk-Q7FIRWF2.mjs.map +1 -0
- package/dist/{chunk-BU6FMNBY.mjs → chunk-QPOHVXUK.mjs} +2 -2
- package/dist/chunk-RSL5OBRQ.mjs +28 -0
- package/dist/chunk-RSL5OBRQ.mjs.map +1 -0
- package/dist/chunk-XA5SCAZJ.mjs +14 -0
- package/dist/chunk-XA5SCAZJ.mjs.map +1 -0
- package/dist/chunk-XMRM5VR4.mjs +119 -0
- package/dist/chunk-XMRM5VR4.mjs.map +1 -0
- package/dist/{chunk-NQL4VODC.mjs → chunk-YFW47Y76.mjs} +12 -4
- package/dist/chunk-YFW47Y76.mjs.map +1 -0
- package/dist/index.js +7728 -6874
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +231 -106
- package/dist/index.mjs.map +1 -1
- package/dist/{liveStatus-IQIEZZE5.mjs → liveStatus-F6AKCC27.mjs} +4 -4
- package/dist/{loginReport-A4GUPW3G.mjs → loginReport-MWTI4G6O.mjs} +245 -73
- package/dist/loginReport-MWTI4G6O.mjs.map +1 -0
- package/dist/{managementDashboard-345DQMNO.mjs → managementDashboard-6UBOCLBA.mjs} +19 -12
- package/dist/{managementDashboard-345DQMNO.mjs.map → managementDashboard-6UBOCLBA.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/agentDetailReport-CP7WYOIX.mjs +0 -12
- package/dist/agentPerformanceReport-F52KNRKW.mjs.map +0 -1
- package/dist/callHistory-ZA3SCD7K.mjs.map +0 -1
- package/dist/campaigns-PIXRNMM4.mjs.map +0 -1
- package/dist/cdrReport-7TKZERRX.mjs.map +0 -1
- package/dist/chunk-DBSNJ3QH.mjs.map +0 -1
- package/dist/chunk-GC3WM33W.mjs +0 -5783
- package/dist/chunk-GC3WM33W.mjs.map +0 -1
- package/dist/chunk-JAAPNDP2.mjs.map +0 -1
- package/dist/chunk-L4LLUMYA.mjs.map +0 -1
- package/dist/chunk-NQL4VODC.mjs.map +0 -1
- package/dist/chunk-NUYGQI7D.mjs.map +0 -1
- package/dist/chunk-X376SOIZ.mjs.map +0 -1
- package/dist/loginReport-A4GUPW3G.mjs.map +0 -1
- /package/dist/{agentDetailReport-CP7WYOIX.mjs.map → agentDetailReport-F7XZLVVO.mjs.map} +0 -0
- /package/dist/{chunk-VZCHJLAW.mjs.map → chunk-5FSMIU5K.mjs.map} +0 -0
- /package/dist/{chunk-BU6FMNBY.mjs.map → chunk-QPOHVXUK.mjs.map} +0 -0
- /package/dist/{liveStatus-IQIEZZE5.mjs.map → liveStatus-F6AKCC27.mjs.map} +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {
|
|
2
|
+
agentDetailReport_default
|
|
3
|
+
} from "./chunk-ISQBOS5Q.mjs";
|
|
4
|
+
import "./chunk-MFZKONNR.mjs";
|
|
5
|
+
import "./chunk-MBXHRFGP.mjs";
|
|
6
|
+
import "./chunk-XMRM5VR4.mjs";
|
|
7
|
+
import "./chunk-HBR2JS4C.mjs";
|
|
8
|
+
import "./chunk-AJQBR3AZ.mjs";
|
|
9
|
+
import "./chunk-RSL5OBRQ.mjs";
|
|
10
|
+
import "./chunk-6ICPXSN6.mjs";
|
|
11
|
+
import "./chunk-Q7FIRWF2.mjs";
|
|
12
|
+
import "./chunk-UB5HSUGK.mjs";
|
|
13
|
+
export {
|
|
14
|
+
agentDetailReport_default as default
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=agentDetailReport-F7XZLVVO.mjs.map
|
|
@@ -4,29 +4,40 @@ import {
|
|
|
4
4
|
headCellSx,
|
|
5
5
|
reportBodyCellSx,
|
|
6
6
|
sortLabelSx
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-53DYH64M.mjs";
|
|
8
8
|
import {
|
|
9
9
|
SDKPermissionGuard
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-YFW47Y76.mjs";
|
|
11
|
+
import "./chunk-XA5SCAZJ.mjs";
|
|
11
12
|
import {
|
|
12
13
|
agentDetailReport_default
|
|
13
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-ISQBOS5Q.mjs";
|
|
15
|
+
import {
|
|
16
|
+
FileDownload_default
|
|
17
|
+
} from "./chunk-MFZKONNR.mjs";
|
|
18
|
+
import "./chunk-MBXHRFGP.mjs";
|
|
14
19
|
import {
|
|
15
|
-
AdapterDayjs,
|
|
16
|
-
LocalizationProvider,
|
|
17
20
|
PageHeader
|
|
18
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-XMRM5VR4.mjs";
|
|
19
22
|
import {
|
|
20
23
|
AppButton
|
|
21
24
|
} from "./chunk-HBR2JS4C.mjs";
|
|
25
|
+
import {
|
|
26
|
+
AdapterDayjs,
|
|
27
|
+
LocalizationProvider
|
|
28
|
+
} from "./chunk-AJQBR3AZ.mjs";
|
|
29
|
+
import {
|
|
30
|
+
Refresh_default
|
|
31
|
+
} from "./chunk-RSL5OBRQ.mjs";
|
|
22
32
|
import {
|
|
23
33
|
SDKProvider
|
|
24
34
|
} from "./chunk-6ICPXSN6.mjs";
|
|
25
35
|
import {
|
|
26
36
|
END_POINT,
|
|
27
37
|
SDK_PERMISSIONS,
|
|
28
|
-
axios_default
|
|
29
|
-
|
|
38
|
+
axios_default,
|
|
39
|
+
createSvgIcon
|
|
40
|
+
} from "./chunk-Q7FIRWF2.mjs";
|
|
30
41
|
import {
|
|
31
42
|
__spreadProps,
|
|
32
43
|
__spreadValues
|
|
@@ -50,9 +61,14 @@ import {
|
|
|
50
61
|
Stack,
|
|
51
62
|
IconButton
|
|
52
63
|
} from "@mui/material";
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
import
|
|
64
|
+
|
|
65
|
+
// node_modules/@mui/icons-material/Visibility.mjs
|
|
66
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
67
|
+
var Visibility_default = createSvgIcon(/* @__PURE__ */ _jsx("path", {
|
|
68
|
+
d: "M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"
|
|
69
|
+
}), "Visibility");
|
|
70
|
+
|
|
71
|
+
// call-control-sdk/lib/pages/agentPerformanceReport/index.tsx
|
|
56
72
|
import dayjs from "dayjs";
|
|
57
73
|
import isoWeek from "dayjs/plugin/isoWeek";
|
|
58
74
|
|
|
@@ -433,7 +449,7 @@ function AgentPerformanceReportContent() {
|
|
|
433
449
|
children: /* @__PURE__ */ jsx(
|
|
434
450
|
AppButton,
|
|
435
451
|
{
|
|
436
|
-
startIcon: /* @__PURE__ */ jsx(
|
|
452
|
+
startIcon: /* @__PURE__ */ jsx(FileDownload_default, { sx: { fontSize: "0.95rem !important" } }),
|
|
437
453
|
disabled: !data.length,
|
|
438
454
|
onClick: handleExportExcel,
|
|
439
455
|
sx: { height: 36 },
|
|
@@ -469,7 +485,7 @@ function AgentPerformanceReportContent() {
|
|
|
469
485
|
extra: /* @__PURE__ */ jsx(
|
|
470
486
|
AppButton,
|
|
471
487
|
{
|
|
472
|
-
startIcon: /* @__PURE__ */ jsx(
|
|
488
|
+
startIcon: /* @__PURE__ */ jsx(Refresh_default, { sx: { fontSize: "0.9rem !important" } }),
|
|
473
489
|
disabled: loading,
|
|
474
490
|
onClick: handleRefresh,
|
|
475
491
|
sx: { height: 32 },
|
|
@@ -500,7 +516,7 @@ function AgentPerformanceReportContent() {
|
|
|
500
516
|
/* @__PURE__ */ jsx(TableCell, { sx: reportBodyCellSx, align: "center", children: /* @__PURE__ */ jsx(IconButton, { size: "small", onClick: (e) => {
|
|
501
517
|
e.stopPropagation();
|
|
502
518
|
setSelectedAgent(row);
|
|
503
|
-
}, sx: { color: C.blue }, children: /* @__PURE__ */ jsx(
|
|
519
|
+
}, sx: { color: C.blue }, children: /* @__PURE__ */ jsx(Visibility_default, { sx: { fontSize: 16 } }) }) })
|
|
504
520
|
] }, idx)),
|
|
505
521
|
paged.length === 0 && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: activeCols.length + 1, sx: { textAlign: "center", py: 4, color: C.t3, fontSize: 13 }, children: "No data found" }) })
|
|
506
522
|
] })
|
|
@@ -530,4 +546,4 @@ var agentPerformanceReport_default = AgentPerformanceReport;
|
|
|
530
546
|
export {
|
|
531
547
|
agentPerformanceReport_default as default
|
|
532
548
|
};
|
|
533
|
-
//# sourceMappingURL=agentPerformanceReport-
|
|
549
|
+
//# sourceMappingURL=agentPerformanceReport-U2QGVTXF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/agentPerformanceReport/index.tsx","../node_modules/@mui/icons-material/Visibility.mjs","../call-control-sdk/lib/pages/agentPerformanceReport/useAgentPerformanceReport.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\r\nimport {\r\n Box, Paper, Table, TableBody, TableCell, TableContainer, TableHead,\r\n TableRow, TableSortLabel, TablePagination, CircularProgress, Alert,\r\n Stack, IconButton, Tooltip,\r\n} from \"@mui/material\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\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\n\r\ndayjs.extend(isoWeek);\r\n\r\nimport {\r\n fetchQueues, fetchProcesses,\r\n getUserPerformanceReportPaged, validateReportPayload, exportAgentPerformanceToExcel,\r\n type Queue,\r\n} from \"./useAgentPerformanceReport\";\r\nimport type { AgentPerfReportParams, ReportData, ReportRequestPayload } from \"./types\";\r\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\r\nimport ReportFilterBar, { type QuickRange, type ProcessOption } from \"../common/components/ReportFilterBar\";\r\nimport { headCellSx as headSx, sortLabelSx, reportBodyCellSx as bodySx } from \"../common/utils/tableStyles\";\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport SearchBar from \"../common/components/SearchBar\";\r\n\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\r\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\r\nimport AgentDetailReport from \"../agentDetailReport\";\r\n\r\nconst C = {\r\n navy: \"#0d2a56\", blue: \"#1565c8\", green: \"#0a9a62\", amber: \"#c47c00\",\r\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\r\n bg: \"transparent\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\r\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\r\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\", t4: \"#bccad9\",\r\n blt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\",\r\n plt: \"#f0eafa\", tlt: \"#e3f4f7\",\r\n};\r\n\r\ntype Order = \"asc\" | \"desc\";\r\ntype SortKey = string;\r\n\r\nfunction parseDur(d: string): number {\r\n if (!d || d === \"00:00:00\") return 0;\r\n const p = d.split(\":\").map(Number);\r\n if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];\r\n if (p.length === 2) return p[0] * 60 + p[1];\r\n return 0;\r\n}\r\n\r\nfunction fmtDur(s: number): string {\r\n if (!s || s <= 0) return \"00:00:00\";\r\n const h = Math.floor(s / 3600);\r\n const m = Math.floor((s % 3600) / 60);\r\n const sc = Math.floor(s % 60);\r\n return [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\n\r\nfunction getVal(row: ReportData, key: string): any {\r\n switch (key) {\r\n case \"id\": return row.agentDetails?.agentId || \"\";\r\n case \"name\": return row.agentDetails?.fullName || \"\";\r\n case \"process\": return row.agentDetails?.process || \"\";\r\n case \"queue\": return row.agentDetails?.queueNames || \"\";\r\n case \"total\": return row.calls?.totalCalls ?? 0;\r\n case \"ans\": return row.calls?.answered ?? 0;\r\n case \"miss\": return row.calls?.missed ?? 0;\r\n case \"inTotal\": return row.inCalls?.total ?? 0;\r\n case \"outTotal\": return row.outCalls?.total ?? 0;\r\n case \"aht\": return parseDur(row.average?.aht || \"00:00:00\");\r\n case \"loginDur\": return parseDur(row.loginDetails?.loggedInDuration || \"00:00:00\");\r\n case \"talk\": return parseDur(row.loginDetails?.talkTime || \"00:00:00\");\r\n case \"hold\": return parseDur(row.average?.holdTime || \"00:00:00\");\r\n case \"wrapup\": return parseDur(row.average?.wrapUp || \"00:00:00\");\r\n case \"breakTime\": return parseDur(row.breaks?.lunch || \"00:00:00\") + parseDur(row.breaks?.tea || \"00:00:00\") + parseDur(row.breaks?.training || \"00:00:00\") + parseDur(row.breaks?.meeting || \"00:00:00\") + parseDur(row.breaks?.shortBreak || \"00:00:00\");\r\n case \"idle\": return parseDur(row.loginDetails?.idleTime || \"00:00:00\");\r\n case \"adherence\": return row.adherence?.pct ?? null;\r\n case \"firstLogin\": return row.loginStats?.firstLogin || \"\";\r\n default: return \"\";\r\n }\r\n}\r\n\r\ninterface ColDef { key: string; label: string; group: string; fmt?: (row: ReportData) => any; align?: \"left\" | \"right\" | \"center\"; }\r\n\r\nconst COLUMNS: ColDef[] = [\r\n { key: \"id\", label: \"User ID\", group: \"Agent\" },\r\n { key: \"name\", label: \"Full Name\", group: \"Agent\" },\r\n { key: \"queue\", label: \"Queues\", group: \"Agent\" },\r\n { key: \"total\", label: \"Total Calls\", group: \"Calls\", align: \"right\" },\r\n { key: \"ans\", label: \"Answered\", group: \"Calls\", align: \"right\" },\r\n { key: \"miss\", label: \"Missed\", group: \"Calls\", align: \"right\" },\r\n { key: \"inTotal\", label: \"Inbound\", group: \"Calls\", align: \"right\" },\r\n { key: \"outTotal\", label: \"Outbound\", group: \"Calls\", align: \"right\" },\r\n { key: \"aht\", label: \"AHT\", group: \"Time\", align: \"right\" },\r\n { key: \"loginDur\", label: \"Login Dur\", group: \"Time\", align: \"right\" },\r\n { key: \"talk\", label: \"Talk Time\", group: \"Time\", align: \"right\" },\r\n { key: \"hold\", label: \"Hold Time\", group: \"Time\", align: \"right\" },\r\n { key: \"wrapup\", label: \"Wrapup Time\", group: \"Time\", align: \"right\" },\r\n { key: \"breakTime\", label: \"Break Time\", group: \"Breaks\", align: \"right\" },\r\n { key: \"idle\", label: \"Idle Time\", group: \"Time\", align: \"right\" },\r\n { key: \"firstLogin\", label: \"First Login\", group: \"Login\" },\r\n { key: \"adherence\", label: \"Adherence %\", group: \"Agent\", align: \"right\" },\r\n];\r\n\r\nfunction AgentPerformanceReportContent() {\r\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n const [quickRange, setQuickRange] = useState<string>(\"today\");\r\n const [selectedUsers, setSelectedUsers] = useState<AgentOption[]>([]);\r\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\r\n const [processes, setProcesses] = useState<ProcessOption[]>([]);\r\n const [process, setProcess] = useState(\"\");\r\n const [search, setSearch] = useState(\"\");\r\n const [loginUsersOnly] = useState(true);\r\n\r\n const [queues, setQueues] = useState<Queue[]>([]);\r\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\r\n\r\n const [data, setData] = useState<ReportData[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(\"\");\r\n const [selectedAgent, setSelectedAgent] = useState<ReportData | null>(null);\r\n\r\n const [orderBy, setOrderBy] = useState<SortKey>(\"total\");\r\n const [order, setOrder] = useState<Order>(\"desc\");\r\n const [page, setPage] = useState(0);\r\n const [rowsPerPage, setRowsPerPage] = useState(10);\r\n const [totalCount, setTotalCount] = useState(-1);\r\n const [visibleCols] = useState<Set<string>>(new Set(COLUMNS.map((c) => c.key)));\r\n\r\n // Debounced search (sent to the server)\r\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\r\n\r\n useEffect(() => {\r\n debounceRef.current = setTimeout(() => setDebouncedSearch(search.trim()), 400);\r\n return () => clearTimeout(debounceRef.current);\r\n }, [search]);\r\n\r\n useEffect(() => {\r\n fetchProcesses().then((p) => {\r\n const mapped = p.map((x) => ({ label: x.name, value: x.name }));\r\n setProcesses(mapped);\r\n if (mapped.length) setProcess(mapped[0].value);\r\n }).catch(() => { });\r\n fetchQueues().then((data) => setQueues(data || [])).catch(() => { });\r\n }, []);\r\n\r\n const handleQuickRangeChange = (range: QuickRange) => {\r\n setQuickRange(range);\r\n };\r\n\r\n const handleRefresh = () => {\r\n if (quickRange === \"today\" || quickRange === \"week\" || quickRange === \"month\") {\r\n const now = dayjs();\r\n let sd = now.startOf(\"day\");\r\n const ed = now;\r\n if (quickRange === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\r\n else if (quickRange === \"month\") sd = now.startOf(\"month\").startOf(\"day\");\r\n // Setting the dates re-triggers the auto-fetch effect below.\r\n setStartDate(sd);\r\n setEndDate(ed);\r\n } else {\r\n fetchReport(page);\r\n }\r\n };\r\n\r\n const fetchReport = useCallback(async (pageNum: number) => {\r\n const fromDate = startDate;\r\n const toDate = endDate;\r\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\r\n\r\n const payload: ReportRequestPayload = {\r\n startDate: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n endDate: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n startTime: fromDate.format(\"HH:mm:ss\"),\r\n endTime: toDate.format(\"HH:mm:ss\"),\r\n process,\r\n agents: isAllUsersSelected ? [] : selectedUsers.map((u) => u.userId),\r\n loginUsersOnly,\r\n queueIds: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : undefined,\r\n search: debouncedSearch || undefined,\r\n page: pageNum + 1,\r\n pageSize: rowsPerPage,\r\n };\r\n\r\n const valid = validateReportPayload(payload);\r\n if (!valid.isValid) { setError(valid.error || \"Invalid\"); return; }\r\n\r\n try {\r\n setLoading(true);\r\n setError(\"\");\r\n const { rows, total } = await getUserPerformanceReportPaged(payload);\r\n setData(rows);\r\n setTotalCount(typeof total === \"number\" ? total : rows.length);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to fetch report\");\r\n setData([]);\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [startDate, endDate, process, selectedUsers, isAllUsersSelected, selectedQueues, loginUsersOnly, debouncedSearch, rowsPerPage]);\r\n\r\n useEffect(() => {\r\n setPage(0);\r\n fetchReport(0);\r\n }, [fetchReport]);\r\n\r\n const handlePageChange = useCallback(\r\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\r\n setPage(newPage);\r\n fetchReport(newPage);\r\n },\r\n [fetchReport],\r\n );\r\n\r\n // Search + paging are server-side; sorting is applied client-side to the current page.\r\n const sorted = useMemo(() => {\r\n return [...data].sort((a, b) => {\r\n const av = getVal(a, orderBy);\r\n const bv = getVal(b, orderBy);\r\n if (typeof av === \"number\" && typeof bv === \"number\") return order === \"asc\" ? av - bv : bv - av;\r\n return order === \"asc\" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));\r\n });\r\n }, [data, orderBy, order]);\r\n\r\n const paged = sorted;\r\n\r\n const handleSort = (key: string) => {\r\n setOrder(orderBy === key && order === \"asc\" ? \"desc\" : \"asc\");\r\n setOrderBy(key);\r\n };\r\n\r\n const handleExportExcel = async () => {\r\n const fromDate = startDate;\r\n const toDate = endDate;\r\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\r\n const params: AgentPerfReportParams = {\r\n start_date: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n end_date: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n agent_id: !isAllUsersSelected && selectedUsers.length > 0\r\n ? selectedUsers.map((u) => u.userId)\r\n : undefined,\r\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\r\n ? selectedQueues.map((q) => q.id)\r\n : undefined,\r\n search: debouncedSearch || undefined,\r\n };\r\n try {\r\n await exportAgentPerformanceToExcel(params);\r\n } catch (err: any) {\r\n setError(err?.message || \"Failed to export Excel\");\r\n }\r\n };\r\n\r\n const renderCellValue = (row: ReportData, col: ColDef) => {\r\n const v = getVal(row, col.key);\r\n const durKeys = [\"aht\", \"loginDur\", \"talk\", \"hold\", \"wrapup\", \"breakTime\", \"idle\"];\r\n if (durKeys.includes(col.key)) return fmtDur(v);\r\n if (col.key === \"adherence\") return v != null ? `${v}%` : \"—\";\r\n if (col.key === \"firstLogin\") return v ? dayjs(v).format(\"DD MMM YYYY hh:mm A\") : \"\";\r\n return v ?? \"\";\r\n };\r\n\r\n const activeCols = COLUMNS.filter((c) => visibleCols.has(c.key));\r\n\r\n if (selectedAgent) {\r\n return (\r\n <AgentDetailReport\r\n agentRow={selectedAgent}\r\n onBack={() => setSelectedAgent(null)}\r\n initialStartDate={startDate}\r\n initialEndDate={endDate}\r\n initialQuickRange={quickRange}\r\n from=\"REPORTS_LIST\"\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <LocalizationProvider dateAdapter={AdapterDayjs}>\r\n <Box sx={{ background: C.bg, minHeight: \"100vh\" }}>\r\n <PageHeader\r\n title=\" Performance Report\"\r\n actions={\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n <SearchBar\r\n value={search}\r\n onChange={setSearch}\r\n placeholder=\"Search name, ID...\"\r\n width={250}\r\n />\r\n <SDKPermissionGuard\r\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE]}\r\n showFallback={false}\r\n >\r\n <AppButton\r\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n disabled={!data.length}\r\n onClick={handleExportExcel}\r\n sx={{ height: 36 }}\r\n >\r\n Export Excel\r\n </AppButton>\r\n </SDKPermissionGuard>\r\n </Stack>\r\n }\r\n />\r\n\r\n <ReportFilterBar\r\n startDate={startDate}\r\n endDate={endDate}\r\n onStartChange={setStartDate}\r\n onEndChange={setEndDate}\r\n quickRange={quickRange}\r\n onQuickRangeChange={handleQuickRangeChange}\r\n showAgentSelect\r\n selectedAgents={selectedUsers}\r\n onAgentsChange={setSelectedUsers}\r\n setIsAllUsersSelected={setIsAllUsersSelected}\r\n showQueueSelect\r\n queues={queues}\r\n selectedQueues={selectedQueues}\r\n onQueuesChange={setSelectedQueues}\r\n showProcessSelect\r\n processes={processes}\r\n selectedProcess={process}\r\n onProcessChange={setProcess}\r\n extra={\r\n <AppButton\r\n startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />}\r\n disabled={loading}\r\n onClick={handleRefresh}\r\n sx={{ height: 32 }}\r\n >\r\n Refresh\r\n </AppButton>\r\n }\r\n />\r\n\r\n {error && <Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>}\r\n\r\n <Box sx={{ py: 2, px: 1, overflow: \"auto\", position: \"relative\" }}>\r\n {loading && (\r\n <Box sx={{ position: \"absolute\", top: 0, left: 0, right: 0, bottom: 0, background: \"rgba(240,244,248,0.7)\", display: \"flex\", alignItems: \"center\", justifyContent: \"center\", zIndex: 10 }}>\r\n <CircularProgress />\r\n </Box>\r\n )}\r\n\r\n <Paper elevation={0} sx={{ borderRadius: \"8px\", border: \"1px solid #e0e7ef\", overflow: \"hidden\", mb: 2 }}>\r\n <TableContainer>\r\n <Table size=\"small\" sx={{\r\n minWidth: 1400,\r\n \"& .MuiTableCell-root\": { fontSize: \"0.75rem\", borderBottom: \"1px solid #eef1f6\", py: 0.6, px: 1 },\r\n }}>\r\n <TableHead>\r\n <TableRow>\r\n {activeCols.map((col) => (\r\n <TableCell key={col.key} align={col.align || \"left\"} sx={headSx}>\r\n <TableSortLabel active={orderBy === col.key} direction={orderBy === col.key ? order : \"asc\"} onClick={() => handleSort(col.key)} sx={sortLabelSx}>\r\n {col.label}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n <TableCell sx={{ ...headSx, width: 48 }}>Detail</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {paged.map((row, idx) => (\r\n <TableRow key={idx} hover onClick={() => setSelectedAgent(row)} sx={{\r\n backgroundColor: \"#fff\",\r\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\r\n cursor: \"pointer\",\r\n }}>\r\n {activeCols.map((col) => (\r\n <TableCell key={col.key} align={col.align || \"left\"} sx={bodySx}>\r\n {renderCellValue(row, col)}\r\n </TableCell>\r\n ))}\r\n <TableCell sx={bodySx} align=\"center\">\r\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); setSelectedAgent(row); }} sx={{ color: C.blue }}>\r\n <VisibilityIcon sx={{ fontSize: 16 }} />\r\n </IconButton>\r\n </TableCell>\r\n </TableRow>\r\n ))}\r\n {paged.length === 0 && (\r\n <TableRow><TableCell colSpan={activeCols.length + 1} sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No data found</TableCell></TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n\r\n <TablePagination\r\n component=\"div\" count={totalCount} page={page}\r\n onPageChange={handlePageChange} rowsPerPage={rowsPerPage}\r\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\r\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\r\n sx={{ borderTop: \"1px solid #eef1f6\", \"& .MuiTablePagination-displayedRows\": { fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontSize: \"0.73rem\" } }}\r\n />\r\n </Paper>\r\n </Box>\r\n </Box>\r\n </LocalizationProvider>\r\n );\r\n}\r\n\r\nconst AgentPerformanceReport: React.FC = () => (\r\n <SDKProvider>\r\n <AgentPerformanceReportContent />\r\n </SDKProvider>\r\n);\r\n\r\nexport default AgentPerformanceReport;\r\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3\"\n}), 'Visibility');","import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { AgentPerfReportParams, AgentPerfReportResponse, AgentPerfRow, ReportData, ReportRequestPayload } from \"./types\";\r\n\r\nfunction fmtSecs(s: number): string {\r\n\tif (!s || s <= 0) return \"00:00:00\";\r\n\tconst h = Math.floor(s / 3600);\r\n\tconst m = Math.floor((s % 3600) / 60);\r\n\tconst sc = Math.floor(s % 60);\r\n\treturn [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\r\n}\r\n\r\nexport function validateReportPayload(payload: Partial<ReportRequestPayload>): { isValid: boolean; error?: string } {\r\n\tif (!payload.startDate || !payload.startTime) return { isValid: false, error: \"Start date/time required\" };\r\n\tif (!payload.endDate || !payload.endTime) return { isValid: false, error: \"End date/time required\" };\r\n\tif (!payload.loginUsersOnly && !payload.agents) return { isValid: false, error: \"Select at least one agent\" };\r\n\treturn { isValid: true };\r\n}\r\n\r\n// Map a raw AgentPerfRow into the legacy ReportData shape the table renders.\r\nfunction mapAgentPerfRow(a: AgentPerfRow): ReportData {\r\n\treturn {\r\n\t\tagentDetails: { agentId: a.agentId, fullName: a.fullName, process: a.processName, queueNames: a.queueNames },\r\n\t\tcalls: { totalCalls: a.totalCalls, answered: a.answeredCalls, missed: a.missedCalls },\r\n\t\tinCalls: { total: a.inCalls },\r\n\t\toutCalls: { total: a.outCalls },\r\n\t\taverage: { holdTime: fmtSecs(a.holdTimeSeconds), wrapUp: fmtSecs(a.wrapupSeconds), aht: fmtSecs(a.ahtSeconds), ringing: \"00:00:00\", dialing: \"00:00:00\" },\r\n\t\tloginDetails: { loggedInDuration: fmtSecs(a.loginDurationSeconds), talkTime: fmtSecs(a.talkTimeSeconds), idleTime: fmtSecs(a.idleTimeSeconds) },\r\n\t\tbreaks: { shortBreak: fmtSecs(a.breakTimeSeconds), breakCount: a.breakCount, lunch: \"00:00:00\", tea: \"00:00:00\", training: \"00:00:00\", meeting: \"00:00:00\" },\r\n\t\tloginStats: { firstLogin: a.firstLoginTime || \"\", noOfLogins: 0 },\r\n\t\tadherence: { pct: a.adherencePct ?? null },\r\n\t};\r\n}\r\n\r\nexport async function getUserPerformanceReport(payload: ReportRequestPayload): Promise<ReportData[]> {\r\n\tconst params: AgentPerfReportParams = {\r\n\t\tstart_date: payload.startDate,\r\n\t\tend_date: payload.endDate,\r\n\t\tagent_id: payload.agents,\r\n\t\tqueue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : undefined,\r\n\t\t// Always send page + pageSize; callers that don't paginate get the full list.\r\n\t\tpage: payload.page ?? 1,\r\n\t\tpageSize: payload.pageSize ?? 500,\r\n\t\tsearch: payload.search,\r\n\t};\r\n\t// Use the combined endpoint, which honours page/pageSize/search.\r\n\tconst res = await axiosInstance.get<AgentPerfReportResponse>(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`,\r\n\t);\r\n\tconst agentsPage: any = (res.data as any)?.agents;\r\n\tconst agents: AgentPerfRow[] = Array.isArray(agentsPage)\r\n\t\t? agentsPage\r\n\t\t: Array.isArray(agentsPage?.data)\r\n\t\t\t? agentsPage.data\r\n\t\t\t: [];\r\n\treturn agents.map(mapAgentPerfRow);\r\n}\r\n\r\n/**\r\n * Paginated variant — returns the mapped rows for the current page plus the\r\n * real total (so the table shows \"1–25 of N\").\r\n */\r\nexport async function getUserPerformanceReportPaged(\r\n\tpayload: ReportRequestPayload,\r\n): Promise<{ rows: ReportData[]; total: number }> {\r\n\tconst params: AgentPerfReportParams = {\r\n\t\tstart_date: payload.startDate,\r\n\t\tend_date: payload.endDate,\r\n\t\tagent_id: payload.agents,\r\n\t\tqueue_id: payload.queueIds && payload.queueIds.length > 0 ? payload.queueIds : undefined,\r\n\t\tpage: payload.page ?? 1,\r\n\t\tpageSize: payload.pageSize ?? 10,\r\n\t\tsearch: payload.search,\r\n\t};\r\n\tconst res = await axiosInstance.get<AgentPerfReportResponse>(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT}${buildQs(params)}`,\r\n\t);\r\n\tconst data = res.data;\r\n\t// `agents` is a paginated envelope ({ data, total, ... }); support a bare array for older shapes.\r\n\tconst agentsPage: any = (data as any)?.agents;\r\n\tconst rawRows: AgentPerfRow[] = Array.isArray(agentsPage)\r\n\t\t? agentsPage\r\n\t\t: Array.isArray(agentsPage?.data)\r\n\t\t\t? agentsPage.data\r\n\t\t\t: [];\r\n\tconst rows = rawRows.map(mapAgentPerfRow);\r\n\tconst total =\r\n\t\tagentsPage?.total ??\r\n\t\t(data as any)?.total ??\r\n\t\t(data as any)?.pagination?.total ??\r\n\t\tdata?.summary?.agentsLoggedIn ??\r\n\t\trows.length;\r\n\treturn { rows, total };\r\n}\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tprocessId?: number;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport interface Process {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function fetchQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get(END_POINT.MASTER_QUEUES);\r\n\tif (Array.isArray(res.data)) return res.data;\r\n\tif (Array.isArray(res.data?.data)) return res.data.data;\r\n\treturn [];\r\n}\r\n\r\nexport async function fetchProcesses(): Promise<Process[]> {\r\n\tconst res = await axiosInstance.get(END_POINT.MASTER_PROCESS);\r\n\tif (Array.isArray(res.data)) return res.data;\r\n\tif (Array.isArray(res.data?.data)) return res.data.data;\r\n\treturn [];\r\n}\r\n\r\nfunction buildQs(params: AgentPerfReportParams): string {\r\n\tconst qs = new URLSearchParams();\r\n\tif (params.start_date) qs.append(\"start_date\", params.start_date);\r\n\tif (params.end_date) qs.append(\"end_date\", params.end_date);\r\n\tif (params.agent_id) for (const id of params.agent_id) qs.append(\"agent_id\", id);\r\n\tif (params.queue_id) for (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\tif (params.process_id) for (const id of params.process_id) qs.append(\"process_id\", String(id));\r\n\tif (params.top_n) qs.append(\"top_n\", String(params.top_n));\r\n\tif (params.search) qs.append(\"search\", params.search);\r\n\tif (params.page) qs.append(\"page\", String(params.page));\r\n\tif (params.pageSize) qs.append(\"pageSize\", String(params.pageSize));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\nexport function useAgentPerformanceReport() {\r\n\tconst [agents, setAgents] = useState<AgentPerfRow[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchAgents = useCallback(async (params: AgentPerfReportParams) => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<AgentPerfRow[]>(\r\n\t\t\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_AGENTS}${params}`,\r\n\t\t\t);\r\n\t\t\tsetAgents(Array.isArray(res.data) ? res.data : []);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(err?.response?.data?.message || err?.message || \"Failed to fetch performance report\");\r\n\t\t\tsetAgents([]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst exportExcel = useCallback(async (params: AgentPerfReportParams) => {\r\n\t\tconst res = await axiosInstance.get(\r\n\t\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,\r\n\t\t\t{ responseType: \"blob\" },\r\n\t\t);\r\n\t\tconst url = URL.createObjectURL(new Blob([res.data]));\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `agent-performance-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\ta.click();\r\n\t\tURL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\treturn { agents, loading, error, setError, fetchAgents, exportExcel };\r\n}\r\n\r\nexport async function exportAgentPerformanceToExcel(params: AgentPerfReportParams): Promise<void> {\r\n\tconst res = await axiosInstance.get(\r\n\t\t`${END_POINT.AGENT_PERFORMANCE_REPORT_EXPORT_EXCEL}${buildQs(params)}`,\r\n\t\t{ responseType: \"blob\" },\r\n\t);\r\n\tconst url = URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = `agent-performance-${params.start_date ?? \"export\"}.xlsx`;\r\n\ta.click();\r\n\tURL.revokeObjectURL(url);\r\n}\r\n"],"mappings":"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","names":["useState","useCallback","useState","data","useCallback"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AuditReportFullPage
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-6MURUWDX.mjs";
|
|
4
|
+
import "./chunk-XA5SCAZJ.mjs";
|
|
5
|
+
import "./chunk-Q7FIRWF2.mjs";
|
|
5
6
|
import "./chunk-UB5HSUGK.mjs";
|
|
6
7
|
|
|
7
8
|
// call-control-sdk/lib/pages/auditReport/index.tsx
|
|
@@ -12,4 +13,4 @@ function AuditReportPage({ callUuid }) {
|
|
|
12
13
|
export {
|
|
13
14
|
AuditReportPage as default
|
|
14
15
|
};
|
|
15
|
-
//# sourceMappingURL=auditReport-
|
|
16
|
+
//# sourceMappingURL=auditReport-DEVQDTDT.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/auditReport/index.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { AuditReportFullPage } from \"../common/components/AuditReport\";\r\n\r\n/**\r\n * Stand-alone audit report page. Opened in a new browser tab from the audit\r\n * report dialog's maximize button (route: `/audit-report/:callUuid`).\r\n */\r\nexport default function AuditReportPage({ callUuid }: { callUuid?: string }) {\r\n return <AuditReportFullPage callUuid={callUuid} />;\r\n}\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/auditReport/index.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { AuditReportFullPage } from \"../common/components/AuditReport\";\r\n\r\n/**\r\n * Stand-alone audit report page. Opened in a new browser tab from the audit\r\n * report dialog's maximize button (route: `/audit-report/:callUuid`).\r\n */\r\nexport default function AuditReportPage({ callUuid }: { callUuid?: string }) {\r\n return <AuditReportFullPage callUuid={callUuid} />;\r\n}\r\n"],"mappings":";;;;;;;;AAQS;AADM,SAAR,gBAAiC,EAAE,SAAS,GAA0B;AAC3E,SAAO,oBAAC,uBAAoB,UAAoB;AAClD;","names":[]}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
KeyboardArrowDown_default
|
|
3
|
+
} from "./chunk-DXZIYCNQ.mjs";
|
|
1
4
|
import {
|
|
2
5
|
SDKPageHeader
|
|
3
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BVQNDAS6.mjs";
|
|
7
|
+
import {
|
|
8
|
+
Phone_default
|
|
9
|
+
} from "./chunk-MBHP7UOP.mjs";
|
|
10
|
+
import {
|
|
11
|
+
PlayArrow_default
|
|
12
|
+
} from "./chunk-MBXHRFGP.mjs";
|
|
4
13
|
import {
|
|
5
14
|
AppButton
|
|
6
15
|
} from "./chunk-HBR2JS4C.mjs";
|
|
16
|
+
import {
|
|
17
|
+
Refresh_default,
|
|
18
|
+
Search_default
|
|
19
|
+
} from "./chunk-RSL5OBRQ.mjs";
|
|
7
20
|
import {
|
|
8
21
|
SDKProvider,
|
|
9
22
|
useToast
|
|
@@ -11,15 +24,16 @@ import {
|
|
|
11
24
|
import {
|
|
12
25
|
END_POINT,
|
|
13
26
|
axios_default,
|
|
27
|
+
createSvgIcon,
|
|
14
28
|
deepFindArray
|
|
15
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-Q7FIRWF2.mjs";
|
|
16
30
|
import {
|
|
17
31
|
__spreadProps,
|
|
18
32
|
__spreadValues
|
|
19
33
|
} from "./chunk-UB5HSUGK.mjs";
|
|
20
34
|
|
|
21
35
|
// call-control-sdk/lib/pages/callHistory/index.tsx
|
|
22
|
-
import { memo, useEffect as useEffect2, useState as useState3 } from "react";
|
|
36
|
+
import { memo, useCallback as useCallback2, useEffect as useEffect2, useState as useState3 } from "react";
|
|
23
37
|
import {
|
|
24
38
|
Box as Box2,
|
|
25
39
|
Typography as Typography2,
|
|
@@ -359,13 +373,11 @@ var Transcript = ({ row }) => {
|
|
|
359
373
|
};
|
|
360
374
|
var Transcript_default = Transcript;
|
|
361
375
|
|
|
362
|
-
//
|
|
363
|
-
import
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
import Phone from "@mui/icons-material/Phone";
|
|
368
|
-
import RefreshIcon from "@mui/icons-material/Refresh";
|
|
376
|
+
// node_modules/@mui/icons-material/ExpandLess.mjs
|
|
377
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
378
|
+
var ExpandLess_default = createSvgIcon(/* @__PURE__ */ _jsx("path", {
|
|
379
|
+
d: "m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"
|
|
380
|
+
}), "ExpandLess");
|
|
369
381
|
|
|
370
382
|
// call-control-sdk/lib/pages/callHistory/useCallHistory.ts
|
|
371
383
|
import { useState as useState2, useCallback } from "react";
|
|
@@ -561,7 +573,7 @@ var CallHistoryContent = memo(() => {
|
|
|
561
573
|
AppButton,
|
|
562
574
|
{
|
|
563
575
|
size: "small",
|
|
564
|
-
startIcon: loading ? /* @__PURE__ */ jsx2(CircularProgress2, { size: 14, color: "inherit" }) : /* @__PURE__ */ jsx2(
|
|
576
|
+
startIcon: loading ? /* @__PURE__ */ jsx2(CircularProgress2, { size: 14, color: "inherit" }) : /* @__PURE__ */ jsx2(Refresh_default, { sx: { fontSize: "0.95rem !important" } }),
|
|
565
577
|
onClick: () => showMissedCalls ? fetchMissedCalls() : fetchCallHistory({
|
|
566
578
|
page: page + 1,
|
|
567
579
|
pageSize: rowsPerPage,
|
|
@@ -584,7 +596,7 @@ var CallHistoryContent = memo(() => {
|
|
|
584
596
|
},
|
|
585
597
|
placeholder: "Search",
|
|
586
598
|
sx: { width: 220, fontSize: "0.82rem", height: 36 },
|
|
587
|
-
endAdornment: /* @__PURE__ */ jsx2(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx2(
|
|
599
|
+
endAdornment: /* @__PURE__ */ jsx2(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx2(Search_default, { sx: { fontSize: 18, color: "#999" } }) })
|
|
588
600
|
}
|
|
589
601
|
)
|
|
590
602
|
] })
|
|
@@ -718,10 +730,14 @@ var MissedCallRow = memo(({ row }) => {
|
|
|
718
730
|
")"
|
|
719
731
|
] }),
|
|
720
732
|
/* @__PURE__ */ jsx2(TableCell, { sx: { fontSize: "0.82rem", textTransform: "uppercase" }, children: row.callType }),
|
|
721
|
-
/* @__PURE__ */ jsx2(TableCell, { align: "center", children: /* @__PURE__ */ jsx2(
|
|
733
|
+
/* @__PURE__ */ jsx2(TableCell, { align: "center", children: /* @__PURE__ */ jsx2(Phone_default, { sx: { color: "#c0392b", fontSize: 20, cursor: "pointer" } }) })
|
|
722
734
|
] });
|
|
723
735
|
});
|
|
724
736
|
MissedCallRow.displayName = "MissedCallRow";
|
|
737
|
+
var activePlayers = /* @__PURE__ */ new Set();
|
|
738
|
+
var notifyPlay = (activeId) => {
|
|
739
|
+
activePlayers.forEach((fn) => fn(activeId));
|
|
740
|
+
};
|
|
725
741
|
function ExpandableRow({
|
|
726
742
|
row,
|
|
727
743
|
striped,
|
|
@@ -732,8 +748,24 @@ function ExpandableRow({
|
|
|
732
748
|
const [open, setOpen] = useState3(false);
|
|
733
749
|
const [audioURL, setAudioURL] = useState3(null);
|
|
734
750
|
const [loadingAudio, setLoadingAudio] = useState3(false);
|
|
751
|
+
const closePlayer = useCallback2(() => {
|
|
752
|
+
setAudioURL((prev) => {
|
|
753
|
+
if (prev && prev.startsWith("blob:")) URL.revokeObjectURL(prev);
|
|
754
|
+
return null;
|
|
755
|
+
});
|
|
756
|
+
}, []);
|
|
757
|
+
useEffect2(() => {
|
|
758
|
+
const onPlay = (activeId) => {
|
|
759
|
+
if (activeId !== row.call_uuid) closePlayer();
|
|
760
|
+
};
|
|
761
|
+
activePlayers.add(onPlay);
|
|
762
|
+
return () => {
|
|
763
|
+
activePlayers.delete(onPlay);
|
|
764
|
+
};
|
|
765
|
+
}, [row.call_uuid, closePlayer]);
|
|
735
766
|
const handlePlay = async () => {
|
|
736
767
|
if (!row.recording.available) return;
|
|
768
|
+
notifyPlay(row.call_uuid);
|
|
737
769
|
setLoadingAudio(true);
|
|
738
770
|
try {
|
|
739
771
|
const blob = await fetchRecording(row.call_uuid);
|
|
@@ -775,11 +807,11 @@ function ExpandableRow({
|
|
|
775
807
|
onClick: handlePlay,
|
|
776
808
|
disabled: loadingAudio,
|
|
777
809
|
size: "small",
|
|
778
|
-
children: loadingAudio ? /* @__PURE__ */ jsx2(CircularProgress2, { size: 18 }) : /* @__PURE__ */ jsx2(
|
|
810
|
+
children: loadingAudio ? /* @__PURE__ */ jsx2(CircularProgress2, { size: 18 }) : /* @__PURE__ */ jsx2(PlayArrow_default, {})
|
|
779
811
|
}
|
|
780
812
|
) : /* @__PURE__ */ jsx2(Chip, { size: "small", label: "No File" }) }),
|
|
781
813
|
/* @__PURE__ */ jsx2(TableCell, { align: "center", sx: cellSx, children: (_a = row.agent_id) != null ? _a : "" }),
|
|
782
|
-
/* @__PURE__ */ jsx2(TableCell, { align: "center", sx: cellSx, children: /* @__PURE__ */ jsx2(IconButton, { onClick: handleToggle, size: "small", children: open ? /* @__PURE__ */ jsx2(
|
|
814
|
+
/* @__PURE__ */ jsx2(TableCell, { align: "center", sx: cellSx, children: /* @__PURE__ */ jsx2(IconButton, { onClick: handleToggle, size: "small", children: open ? /* @__PURE__ */ jsx2(ExpandLess_default, {}) : /* @__PURE__ */ jsx2(KeyboardArrowDown_default, {}) }) })
|
|
783
815
|
] }),
|
|
784
816
|
audioURL && /* @__PURE__ */ jsx2(TableRow, { children: /* @__PURE__ */ jsx2(TableCell, { colSpan: 8, sx: { p: 0 }, children: /* @__PURE__ */ jsx2(Box2, { p: 2, children: /* @__PURE__ */ jsx2(
|
|
785
817
|
"audio",
|
|
@@ -787,10 +819,7 @@ function ExpandableRow({
|
|
|
787
819
|
controls: true,
|
|
788
820
|
autoPlay: true,
|
|
789
821
|
src: audioURL,
|
|
790
|
-
onEnded:
|
|
791
|
-
URL.revokeObjectURL(audioURL);
|
|
792
|
-
setAudioURL(null);
|
|
793
|
-
},
|
|
822
|
+
onEnded: closePlayer,
|
|
794
823
|
style: { width: "100%" }
|
|
795
824
|
}
|
|
796
825
|
) }) }) }),
|
|
@@ -802,4 +831,4 @@ var callHistory_default = CallHistory;
|
|
|
802
831
|
export {
|
|
803
832
|
callHistory_default as default
|
|
804
833
|
};
|
|
805
|
-
//# sourceMappingURL=callHistory-
|
|
834
|
+
//# sourceMappingURL=callHistory-MRBBY3UO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/callHistory/index.tsx","../call-control-sdk/lib/pages/common/components/Transcript.tsx","../node_modules/@mui/icons-material/ExpandLess.mjs","../call-control-sdk/lib/pages/callHistory/useCallHistory.ts"],"sourcesContent":["import React, { memo, useCallback, 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 Transcript from \"../common/components/Transcript\";\r\nimport KeyboardArrowDown from \"@mui/icons-material/KeyboardArrowDown\";\r\nimport PlayArrow from \"@mui/icons-material/PlayArrow\";\r\nimport ExpandLess from \"@mui/icons-material/ExpandLess\";\r\nimport Search from \"@mui/icons-material/Search\";\r\nimport Phone from \"@mui/icons-material/Phone\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { SDKPageHeader } from \"../../components/SDKPageHeader\";\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, callsTotal, 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\t// Debounced search (sent to the server for call history).\r\n\tconst [debouncedSearch, setDebouncedSearch] = useState(\"\");\r\n\tuseEffect(() => {\r\n\t\tconst t = setTimeout(() => setDebouncedSearch(search.trim()), 400);\r\n\t\treturn () => clearTimeout(t);\r\n\t}, [search]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (showMissedCalls) {\r\n\t\t\tfetchMissedCalls();\r\n\t\t} else {\r\n\t\t\t// Call history is paginated + searched + filtered server-side.\r\n\t\t\tfetchCallHistory({\r\n\t\t\t\tpage: page + 1,\r\n\t\t\t\tpageSize: rowsPerPage,\r\n\t\t\t\tsearch: debouncedSearch || undefined,\r\n\t\t\t\tcall_type: filter === \"ALL\" ? undefined : filter,\r\n\t\t\t});\r\n\t\t}\r\n\t}, [showMissedCalls, page, rowsPerPage, filter, debouncedSearch, fetchCallHistory, fetchMissedCalls]);\r\n\r\n\t// Call history is filtered/searched server-side, so render the rows as-is.\r\n\tconst filteredCalls = calls;\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<SDKPageHeader\r\n\t\t\t\ttitle=\"Call History\"\r\n\t\t\t\tactions={\r\n\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" spacing={1}>\r\n\t\t\t\t\t\t<AppButton\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\tstartIcon={loading ? <CircularProgress size={14} color=\"inherit\" /> : <RefreshIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n\t\t\t\t\t\t\tonClick={() =>\r\n\t\t\t\t\t\t\t\tshowMissedCalls\r\n\t\t\t\t\t\t\t\t\t? fetchMissedCalls()\r\n\t\t\t\t\t\t\t\t\t: fetchCallHistory({\r\n\t\t\t\t\t\t\t\t\t\tpage: page + 1,\r\n\t\t\t\t\t\t\t\t\t\tpageSize: rowsPerPage,\r\n\t\t\t\t\t\t\t\t\t\tsearch: debouncedSearch || undefined,\r\n\t\t\t\t\t\t\t\t\t\tcall_type: filter === \"ALL\" ? undefined : filter,\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdisabled={loading}\r\n\t\t\t\t\t\t\tsx={{ height: 36 }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tRefresh\r\n\t\t\t\t\t\t</AppButton>\r\n\t\t\t\t\t\t<OutlinedInput\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\tvalue={search}\r\n\t\t\t\t\t\t\tonChange={(e) => { setSearch(e.target.value); setPage(0); }}\r\n\t\t\t\t\t\t\tplaceholder=\"Search\"\r\n\t\t\t\t\t\t\tsx={{ width: 220, fontSize: \"0.82rem\", height: 36 }}\r\n\t\t\t\t\t\t\tendAdornment={\r\n\t\t\t\t\t\t\t\t<InputAdornment position=\"end\">\r\n\t\t\t\t\t\t\t\t\t<Search sx={{ fontSize: 18, color: \"#999\" }} />\r\n\t\t\t\t\t\t\t\t</InputAdornment>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</Stack>\r\n\t\t\t\t}\r\n\t\t\t/>\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.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 : callsTotal}\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, 15, 25, 50, 100]}\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\n/* Coordinates playback so only one recording is open at a time. */\r\nconst activePlayers = new Set<(activeId: string) => void>();\r\nconst notifyPlay = (activeId: string) => {\r\n\tactivePlayers.forEach((fn) => fn(activeId));\r\n};\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 closePlayer = useCallback(() => {\r\n\t\tsetAudioURL((prev) => {\r\n\t\t\tif (prev && prev.startsWith(\"blob:\")) URL.revokeObjectURL(prev);\r\n\t\t\treturn null;\r\n\t\t});\r\n\t}, []);\r\n\r\n\t// Close this player whenever another recording starts playing.\r\n\tuseEffect(() => {\r\n\t\tconst onPlay = (activeId: string) => {\r\n\t\t\tif (activeId !== row.call_uuid) closePlayer();\r\n\t\t};\r\n\t\tactivePlayers.add(onPlay);\r\n\t\treturn () => {\r\n\t\t\tactivePlayers.delete(onPlay);\r\n\t\t};\r\n\t}, [row.call_uuid, closePlayer]);\r\n\r\n\tconst handlePlay = async () => {\r\n\t\tif (!row.recording.available) return;\r\n\t\tnotifyPlay(row.call_uuid);\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 handleToggle = () => setOpen((prev) => !prev);\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={handleToggle} 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={closePlayer}\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{open && <Transcript row={row} />}\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 React, { useEffect, useState } from \"react\";\r\nimport {\r\n\tAvatar,\r\n\tBox,\r\n\tCircularProgress,\r\n\tRating,\r\n\tStack,\r\n\tTooltip,\r\n\tTypography,\r\n} from \"@mui/material\";\r\nimport axiosInstance from \"../../../services/axios\";\r\nimport { END_POINT } from \"../../../services/endPoint\";\r\nimport type { CallHistoryItem, TranscriptData, SentimentMetric, ConversationTypeClassification } from \"../../callHistory/types\";\r\n\r\n// ──── Gauge ───────────────────────────────────────────────────────────────────\r\n\r\nconst GAUGE_COLORS = [\"#e74c3c\", \"#e67e22\", \"#f1c40f\", \"#a3d977\", \"#2ecc71\"];\r\n\r\nfunction scoreColor(score: number) {\r\n\tconst idx = Math.max(0, Math.min(4, Math.round(score) - 1));\r\n\treturn GAUGE_COLORS[idx];\r\n}\r\n\r\nfunction GaugeTooltip({ metric }: { metric?: SentimentMetric }) {\r\n\tif (!metric) return <>—</>;\r\n\treturn (\r\n\t\t<Box sx={{ maxWidth: 240 }}>\r\n\t\t\t{typeof metric.Model_Prediction_Confidence_Level === \"number\" && (\r\n\t\t\t\t<Typography sx={{ fontSize: \"0.75rem\", fontWeight: 600, mb: 0.5 }}>\r\n\t\t\t\t\tModel Confidence: {metric.Model_Prediction_Confidence_Level}%\r\n\t\t\t\t</Typography>\r\n\t\t\t)}\r\n\t\t\t<Typography sx={{ fontSize: \"0.72rem\", lineHeight: 1.4 }}>\r\n\t\t\t\t{metric.Observations ?? \"\"}\r\n\t\t\t</Typography>\r\n\t\t</Box>\r\n\t);\r\n}\r\n\r\nfunction Gauge({ score, label }: { score: number; label: string }) {\r\n\tconst max = 5;\r\n\tconst radius = 32;\r\n\tconst stroke = 7;\r\n\tconst circumference = 2 * Math.PI * radius;\r\n\tconst pct = Math.max(0, Math.min(1, score / max));\r\n\tconst dash = circumference * pct;\r\n\tconst color = scoreColor(score);\r\n\r\n\treturn (\r\n\t\t<Box sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", px: 1 }}>\r\n\t\t\t<Box sx={{ position: \"relative\", width: 80, height: 80 }}>\r\n\t\t\t\t<svg width={80} height={80} viewBox=\"0 0 80 80\">\r\n\t\t\t\t\t<circle cx={40} cy={40} r={radius} fill=\"none\" stroke=\"#eee\" strokeWidth={stroke} />\r\n\t\t\t\t\t<circle\r\n\t\t\t\t\t\tcx={40}\r\n\t\t\t\t\t\tcy={40}\r\n\t\t\t\t\t\tr={radius}\r\n\t\t\t\t\t\tfill=\"none\"\r\n\t\t\t\t\t\tstroke={color}\r\n\t\t\t\t\t\tstrokeWidth={stroke}\r\n\t\t\t\t\t\tstrokeLinecap=\"round\"\r\n\t\t\t\t\t\tstrokeDasharray={`${dash} ${circumference - dash}`}\r\n\t\t\t\t\t\ttransform=\"rotate(-90 40 40)\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t</svg>\r\n\t\t\t\t<Box\r\n\t\t\t\t\tsx={{\r\n\t\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\t\tinset: 0,\r\n\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\tjustifyContent: \"center\",\r\n\t\t\t\t\t\tfontSize: 18,\r\n\t\t\t\t\t\tfontWeight: 600,\r\n\t\t\t\t\t\tcolor: \"#444\",\r\n\t\t\t\t\t}}\r\n\t\t\t\t>\r\n\t\t\t\t\t{score}\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t\t<Typography\r\n\t\t\t\tsx={{\r\n\t\t\t\t\tmt: 0.5,\r\n\t\t\t\t\tfontSize: \"0.7rem\",\r\n\t\t\t\t\tcolor: \"primary.main\",\r\n\t\t\t\t\tfontWeight: 600,\r\n\t\t\t\t\ttextAlign: \"center\",\r\n\t\t\t\t\tlineHeight: 1.2,\r\n\t\t\t\t\tmaxWidth: 110,\r\n\t\t\t\t}}\r\n\t\t\t>\r\n\t\t\t\t{label}\r\n\t\t\t</Typography>\r\n\t\t</Box>\r\n\t);\r\n}\r\n\r\n// ──── Classification Bar ──────────────────────────────────────────────────────\r\n\r\nfunction ClassificationBar({ classification }: { classification?: ConversationTypeClassification }) {\r\n\t// Build segments dynamically from all keys (mirrors CRM's linearProgressBar)\r\n\tconst COLOR_MAP: Record<string, string> = {\r\n\t\tInformational_Queries: \"#5bc0eb\",\r\n\t\tAction_Oriented_Queries: \"#3aa3d0\",\r\n\t\tEscalations_or_Complaints: \"#9b59b6\",\r\n\t};\r\n\tconst segments = Object.entries(classification ?? {})\r\n\t\t.filter(([, v]) => v != null)\r\n\t\t.map(([key, value]) => ({\r\n\t\t\tlabel: key.replaceAll(\"_\", \" \"),\r\n\t\t\tvalue: Number(value) || 0,\r\n\t\t\tcolor: COLOR_MAP[key] ?? \"#7e57c2\",\r\n\t\t}));\r\n\tconst total = segments.reduce((s, seg) => s + seg.value, 0) || 1;\r\n\r\n\treturn (\r\n\t\t<Box>\r\n\t\t\t<Stack direction=\"row\" spacing={2} mb={0.75} sx={{ flexWrap: \"wrap\", rowGap: 0.5 }}>\r\n\t\t\t\t{segments.map((s) => (\r\n\t\t\t\t\t<Typography key={s.label} sx={{ fontSize: \"0.72rem\", color: s.color, fontWeight: 600 }}>\r\n\t\t\t\t\t\t{s.label}\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t))}\r\n\t\t\t</Stack>\r\n\t\t\t<Box sx={{ display: \"flex\", width: \"100%\", height: 8, borderRadius: 4, overflow: \"hidden\" }}>\r\n\t\t\t\t{segments.map((s) => (\r\n\t\t\t\t\t<Box key={s.label} sx={{ width: `${(s.value / total) * 100}%`, backgroundColor: s.color }} />\r\n\t\t\t\t))}\r\n\t\t\t</Box>\r\n\t\t</Box>\r\n\t);\r\n}\r\n\r\n// ──── Section Box ─────────────────────────────────────────────────────────────\r\n\r\nfunction SectionBox({ title, children }: { title: string; children: React.ReactNode }) {\r\n\treturn (\r\n\t\t<Box sx={(t) => ({ border: `1.5px solid ${t.palette.primary.main}`, borderRadius: 1, p: 1, mb: 1.25 })}>\r\n\t\t\t<Typography sx={{ fontSize: \"0.75rem\", fontWeight: 700, mb: 0.5 }}>{title}</Typography>\r\n\t\t\t{children}\r\n\t\t</Box>\r\n\t);\r\n}\r\n\r\n// ──── Resolve API response shape ──────────────────────────────────────────────\r\n\r\nfunction resolveTranscriptData(raw: any): TranscriptData | null {\r\n\tif (!raw) return null;\r\n\tconst payload = raw.data ?? raw;\r\n\r\n\t// New shape: { Call_Center_Interaction_Hospital_Service: {...}, transcription?: string }\r\n\tif (payload.Call_Center_Interaction_Hospital_Service) {\r\n\t\treturn {\r\n\t\t\ttranscription: payload.transcription,\r\n\t\t\tsentiment_analysis: {\r\n\t\t\t\tCall_Center_Interaction_Hospital_Service: payload.Call_Center_Interaction_Hospital_Service,\r\n\t\t\t},\r\n\t\t};\r\n\t}\r\n\t// Legacy shape: { transcription, sentiment_analysis: { Call_Center_Interaction_Hospital_Service } }\r\n\treturn payload as TranscriptData;\r\n}\r\n\r\n// ──── Main Transcript Component ───────────────────────────────────────────────\r\n\r\ninterface TranscriptProps {\r\n\trow: CallHistoryItem;\r\n}\r\n\r\nconst Transcript: React.FC<TranscriptProps> = ({ row }) => {\r\n\tconst [transcript, setTranscript] = useState<TranscriptData | null>(null);\r\n\tconst [loading, setLoading] = useState(true);\r\n\r\n\tuseEffect(() => {\r\n\t\tlet cancelled = false;\r\n\t\tsetLoading(true);\r\n\t\taxiosInstance\r\n\t\t\t.get(END_POINT.CALLSAGE_SENTIMENT(row.call_uuid))\r\n\t\t\t.then((res) => {\r\n\t\t\t\tif (!cancelled) setTranscript(resolveTranscriptData(res.data));\r\n\t\t\t})\r\n\t\t\t.catch(() => {\r\n\t\t\t\tif (!cancelled) setTranscript(null);\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tif (!cancelled) setLoading(false);\r\n\t\t\t});\r\n\t\treturn () => { cancelled = true; };\r\n\t}, [row.call_uuid]);\r\n\r\n\tif (loading) {\r\n\t\treturn (\r\n\t\t\t<Box display=\"flex\" justifyContent=\"center\" py={3}>\r\n\t\t\t\t<CircularProgress size={22} />\r\n\t\t\t</Box>\r\n\t\t);\r\n\t}\r\n\r\n\tconst svc = transcript?.sentiment_analysis?.Call_Center_Interaction_Hospital_Service;\r\n\tconst summary = svc?.Call_Summary;\r\n\tconst breakdown = svc?.Sentiment_Analysis_Breakdown;\r\n\tconst patient = breakdown?.Patient_Sentiment_Analysis ?? {};\r\n\tconst agent = breakdown?.Agent_Sentiment_Analysis ?? {};\r\n\tconst oss = breakdown?.[\"Overall_Sentiment_Score_(OSS)\"];\r\n\tconst classification = svc?.Conversation_Type_Classification;\r\n\tconst positives = svc?.Key_Highlights_Issues_Identified?.Positive_Aspects ?? [];\r\n\tconst improvements = svc?.Key_Highlights_Issues_Identified?.Areas_for_Improvement ?? [];\r\n\tconst lines = (transcript?.transcription ?? \"\").split(\"\\n\").filter((l) => l.trim().length > 0);\r\n\r\n\t// Dynamic aspect iteration — mirrors CRM's processSentimentData approach\r\n\tconst patientAspects = Object.entries(patient).filter(([key]) => key !== \"Overall_Sentiment\");\r\n\tconst agentAspects = Object.entries(agent).filter(([key]) => key !== \"Overall_Agent_Performance\");\r\n\r\n\tconst patientAvg = patient[\"Overall_Sentiment\"]?.Sentiment_Score\r\n\t\t?? (patientAspects.reduce((sum, [, m]) => sum + (m?.Sentiment_Score ?? 0), 0) / (patientAspects.length || 1));\r\n\tconst agentAvg = agent[\"Overall_Agent_Performance\"]?.Sentiment_Score\r\n\t\t?? (agentAspects.reduce((sum, [, m]) => sum + (m?.Sentiment_Score ?? 0), 0) / (agentAspects.length || 1));\r\n\tconst overall = oss?.Sentiment_Score ?? (patientAvg + agentAvg) / 2;\r\n\r\n\tif (!svc && lines.length === 0) {\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t<Typography fontWeight={600} fontSize=\"0.85rem\" mb={0.5}>\r\n\t\t\t\t\tCall Details\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<Typography variant=\"body2\" fontSize=\"0.82rem\">\r\n\t\t\t\t\tCall UID: {row.call_uuid}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<Typography variant=\"body2\" fontSize=\"0.82rem\">\r\n\t\t\t\t\tAgent: {row.agent_id ?? \"Unassigned\"}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<Typography variant=\"body2\" fontSize=\"0.82rem\" color=\"#999\" mt={1}>\r\n\t\t\t\t\tNo transcript available for this call.\r\n\t\t\t\t</Typography>\r\n\t\t\t</>\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr\", md: \"1fr 1fr\" }, gap: 1.5 }}>\r\n\t\t\t{/* LEFT — Summary + Transcript (transcript hidden when not available) */}\r\n\t\t\t<Box>\r\n\t\t\t\t<Box sx={{ p: 1.25, border: \"1px solid #e0e0e0\", borderRadius: 1, backgroundColor: \"#fff\", mb: 1.25 }}>\r\n\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" justifyContent=\"space-between\" mb={0.5}>\r\n\t\t\t\t\t\t<Typography sx={{ fontWeight: 700, fontSize: \"0.85rem\", color: \"primary.main\" }}>\r\n\t\t\t\t\t\t\tCall Summary\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.75rem\", color: \"#555\" }}>Overall Satisfaction:</Typography>\r\n\t\t\t\t\t\t\t<Rating size=\"small\" value={overall} precision={0.5} readOnly />\r\n\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t</Stack>\r\n\t\t\t\t\t<Typography sx={{ fontSize: \"0.78rem\", color: \"#444\", lineHeight: 1.45 }}>\r\n\t\t\t\t\t\t{summary ?? \"-\"}\r\n\t\t\t\t\t</Typography>\r\n\t\t\t\t</Box>\r\n\r\n\t\t\t\t{lines.length > 0 ? (\r\n\t\t\t\t\t<Box sx={{ p: 1.25, border: \"1px solid #e0e0e0\", borderRadius: 1, backgroundColor: \"#fff\" }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontWeight: 700, fontSize: \"0.85rem\", color: \"primary.main\", mb: 1 }}>\r\n\t\t\t\t\t\t\tTranscript\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t<Box sx={{ maxHeight: 360, overflowY: \"auto\", pr: 0.5 }}>\r\n\t\t\t\t\t\t\t{lines.map((line, idx) => {\r\n\t\t\t\t\t\t\t\tconst isPatient = line.trim().toLowerCase().startsWith(\"patient\");\r\n\t\t\t\t\t\t\t\tconst text = line.replace(/^\\s*(Patient|Agent)\\s*:\\s*/i, \"\");\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\tkey={idx}\r\n\t\t\t\t\t\t\t\t\t\tsx={{\r\n\t\t\t\t\t\t\t\t\t\t\tdisplay: \"flex\",\r\n\t\t\t\t\t\t\t\t\t\t\tjustifyContent: isPatient ? \"flex-end\" : \"flex-start\",\r\n\t\t\t\t\t\t\t\t\t\t\talignItems: \"center\",\r\n\t\t\t\t\t\t\t\t\t\t\tmb: 0.75,\r\n\t\t\t\t\t\t\t\t\t\t\tgap: 0.75,\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{!isPatient && <Avatar sx={{ width: 22, height: 22, fontSize: 12 }} />}\r\n\t\t\t\t\t\t\t\t\t\t<Box\r\n\t\t\t\t\t\t\t\t\t\t\tsx={(t) => ({\r\n\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: \"70%\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tpx: 1.25,\r\n\t\t\t\t\t\t\t\t\t\t\t\tpy: 0.75,\r\n\t\t\t\t\t\t\t\t\t\t\t\tborderRadius: isPatient ? \"8px 8px 0 8px\" : \"8px 8px 8px 0\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tbackgroundColor: isPatient ? t.palette.primary.main : \"#fff\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tcolor: isPatient ? t.palette.common.white : \"#222\",\r\n\t\t\t\t\t\t\t\t\t\t\t\tborder: isPatient ? \"none\" : \"1px solid #e0e0e0\",\r\n\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\tlineHeight: 1.4,\r\n\t\t\t\t\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t{text}\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t\t{isPatient && <Avatar sx={{ width: 22, height: 22, fontSize: 12 }} />}\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<Box sx={{ p: 1.25, border: \"1px solid #e0e0e0\", borderRadius: 1, backgroundColor: \"#fff\" }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontWeight: 700, fontSize: \"0.9rem\", color: \"primary.main\", mb: 1 }}>\r\n\t\t\t\t\t\t\tKey Highlights & Issues Identified\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t<Box sx={{ maxHeight: 180, overflowY: \"auto\", pr: 0.5 }}>\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.82rem\", fontWeight: 700, color: \"#2ecc71\", mb: 0.5 }}>\r\n\t\t\t\t\t\t\t\t✅ Positive Aspects:\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t{positives.length > 0 ?\r\n\t\t\t\t\t\t\t\tpositives.map((p, i) => (\r\n\t\t\t\t\t\t\t\t\t<Typography key={i} sx={{ fontSize: \"0.78rem\", color: \"#333\", pl: 1.5, mb: 0.25 }}>\r\n\t\t\t\t\t\t\t\t\t\t• {p}\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t:\t<Typography sx={{ fontSize: \"0.78rem\", color: \"#999\", pl: 1.5 }}>—</Typography>}\r\n\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.82rem\", fontWeight: 700, color: \"#e67e22\", mt: 1, mb: 0.5 }}>\r\n\t\t\t\t\t\t\t\t⚠️ Areas of Improvements:\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t{improvements.length > 0 ?\r\n\t\t\t\t\t\t\t\timprovements.map((p, i) => (\r\n\t\t\t\t\t\t\t\t\t<Typography key={i} sx={{ fontSize: \"0.78rem\", color: \"#333\", pl: 1.5, mb: 0.25 }}>\r\n\t\t\t\t\t\t\t\t\t\t• {p}\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t:\t<Typography sx={{ fontSize: \"0.78rem\", color: \"#999\", pl: 1.5 }}>—</Typography>}\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\r\n\t\t\t{/* RIGHT — Sentiment Analysis + Key Highlights (highlights hidden when moved to left) */}\r\n\t\t\t<Box>\r\n\t\t\t\t<Box sx={{ p: 1.25, border: \"1px solid #e0e0e0\", borderRadius: 1, backgroundColor: \"#fff\", mb: lines.length > 0 ? 1.25 : 0 }}>\r\n\t\t\t\t\t<Typography sx={{ fontWeight: 700, fontSize: \"0.9rem\", color: \"primary.main\", mb: 1 }}>\r\n\t\t\t\t\t\tSentiment Analysis\r\n\t\t\t\t\t</Typography>\r\n\r\n\t\t\t\t\t<Box sx={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 1, mb: 1 }}>\r\n\t\t\t\t\t\t<SectionBox title=\"Patient Sentiment\">\r\n\t\t\t\t\t\t\t<Stack direction=\"row\" justifyContent=\"space-around\" flexWrap=\"wrap\" mb={0.5}>\r\n\t\t\t\t\t\t\t\t{patientAspects.map(([key, metric]) => (\r\n\t\t\t\t\t\t\t\t\t<Tooltip key={key} title={<GaugeTooltip metric={metric} />} arrow>\r\n\t\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t\t<Gauge\r\n\t\t\t\t\t\t\t\t\t\t\t\tscore={metric?.Sentiment_Score ?? 0}\r\n\t\t\t\t\t\t\t\t\t\t\t\tlabel={key.replaceAll(\"_\", \" \")}\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</span>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\r\n\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.7rem\", fontWeight: 600 }}>Patient Sentiment:</Typography>\r\n\t\t\t\t\t\t\t\t<Rating size=\"small\" value={patientAvg} precision={0.5} readOnly />\r\n\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t</SectionBox>\r\n\r\n\t\t\t\t\t\t<SectionBox title=\"Agent Performance\">\r\n\t\t\t\t\t\t\t<Stack direction=\"row\" justifyContent=\"space-around\" flexWrap=\"wrap\" mb={0.5}>\r\n\t\t\t\t\t\t\t\t{agentAspects.map(([key, metric]) => (\r\n\t\t\t\t\t\t\t\t\t<Tooltip key={key} title={<GaugeTooltip metric={metric} />} arrow>\r\n\t\t\t\t\t\t\t\t\t\t<span>\r\n\t\t\t\t\t\t\t\t\t\t\t<Gauge\r\n\t\t\t\t\t\t\t\t\t\t\t\tscore={metric?.Sentiment_Score ?? 0}\r\n\t\t\t\t\t\t\t\t\t\t\t\tlabel={key.replaceAll(\"_\", \" \")}\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</span>\r\n\t\t\t\t\t\t\t\t\t</Tooltip>\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t\t<Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\r\n\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.7rem\", fontWeight: 600 }}>Agent Performance:</Typography>\r\n\t\t\t\t\t\t\t\t<Rating size=\"small\" value={agentAvg} precision={0.5} readOnly />\r\n\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t</SectionBox>\r\n\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t<SectionBox title=\"Conversation Classification\">\r\n\t\t\t\t\t\t<ClassificationBar classification={classification} />\r\n\t\t\t\t\t</SectionBox>\r\n\t\t\t\t</Box>\r\n\r\n\t\t\t\t{lines.length > 0 && (\r\n\t\t\t\t\t<Box sx={{ p: 1.25, border: \"1px solid #e0e0e0\", borderRadius: 1, backgroundColor: \"#fff\" }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontWeight: 700, fontSize: \"0.9rem\", color: \"primary.main\", mb: 1 }}>\r\n\t\t\t\t\t\t\tKey Highlights & Issues Identified\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t<Box sx={{ maxHeight: 180, overflowY: \"auto\", pr: 0.5 }}>\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.82rem\", fontWeight: 700, color: \"#2ecc71\", mb: 0.5 }}>\r\n\t\t\t\t\t\t\t\t✅ Positive Aspects:\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t{positives.length > 0 ?\r\n\t\t\t\t\t\t\t\tpositives.map((p, i) => (\r\n\t\t\t\t\t\t\t\t\t<Typography key={i} sx={{ fontSize: \"0.78rem\", color: \"#333\", pl: 1.5, mb: 0.25 }}>\r\n\t\t\t\t\t\t\t\t\t\t• {p}\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t:\t<Typography sx={{ fontSize: \"0.78rem\", color: \"#999\", pl: 1.5 }}>—</Typography>}\r\n\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: \"0.82rem\", fontWeight: 700, color: \"#e67e22\", mt: 1, mb: 0.5 }}>\r\n\t\t\t\t\t\t\t\t⚠️ Areas of Improvements:\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t{improvements.length > 0 ?\r\n\t\t\t\t\t\t\t\timprovements.map((p, i) => (\r\n\t\t\t\t\t\t\t\t\t<Typography key={i} sx={{ fontSize: \"0.78rem\", color: \"#333\", pl: 1.5, mb: 0.25 }}>\r\n\t\t\t\t\t\t\t\t\t\t• {p}\r\n\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t:\t<Typography sx={{ fontSize: \"0.78rem\", color: \"#999\", pl: 1.5 }}>—</Typography>}\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\t\t</Box>\r\n\t);\r\n};\r\n\r\nexport default Transcript;\r\n","\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\n}), 'ExpandLess');","import { useState, useCallback } from \"react\";\r\nimport axiosInstance, { deepFindArray } from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { CallHistoryItem, MissedCallDetails, TranscriptData } from \"./types\";\r\n\r\nconst MOCK_TRANSCRIPT: TranscriptData = {\r\n\ttranscription: [\r\n\t\t\"Agent: Welcome, please wait while your call is being transferred.\",\r\n\t\t\"Patient: Welcome, please wait while your call is being connected.\",\r\n\t\t\"Agent: Please wait while your call is connected.\",\r\n\t\t\"Agent: I will show you how you can also book new appointments if you need an appointment.\",\r\n\t\t\"Agent: And you can select your specialty.\",\r\n\t\t\"Patient: I am not getting it.\",\r\n\t\t\"Patient: Yes, I am speaking.\",\r\n\t\t\"Patient: I don't know what the reason is.\",\r\n\t\t\"Patient: Yes.\",\r\n\t\t\"Patient: I will do it according to the plan.\",\r\n\t\t\"Patient: I am not getting any information about that.\",\r\n\t\t\"Patient: Yeah, so I want to see the result.\",\r\n\t\t\"Patient: I am not doing it now.\",\r\n\t\t\"Agent: So we also have a new point.\",\r\n\t\t\"Agent: We can include that.\",\r\n\t\t\"Agent: So, um, these are the entities of the bank.\",\r\n\t\t\"Agent: If you have any questions, I can answer them for you.\",\r\n\t\t\"Patient: How much is it?\",\r\n\t\t\"Patient: No, I don't want to do it.\",\r\n\t\t\"Patient: I just got some calling.\",\r\n\t\t\"Patient: I will call now.\",\r\n\t].join(\"\\n\"),\r\n\tsentiment_analysis: {\r\n\t\tCall_Center_Interaction_Hospital_Service: {\r\n\t\t\tCall_Summary:\r\n\t\t\t\t\"The conversation involved a patient attempting to get information regarding booking an appointment and the status of their results. The agent provided some guidance but the patient expressed confusion and dissatisfaction with the information provided, leading to frustration.\",\r\n\t\t\tSentiment_Analysis_Breakdown: {\r\n\t\t\t\tPatient_Sentiment_Analysis: {\r\n\t\t\t\t\t\"Resolution_Confidence_Index_(RCI)\": {\r\n\t\t\t\t\t\tSentiment_Score: 1,\r\n\t\t\t\t\t\tObservations:\r\n\t\t\t\t\t\t\t\"The patient expressed confusion and dissatisfaction, stating 'I am not getting any information about that' and 'I am not doing it now', indicating a lack of clarity and resolution.\",\r\n\t\t\t\t\t\tModel_Prediction_Confidence_Level: 85,\r\n\t\t\t\t\t},\r\n\t\t\t\t\t\"Tone_And_Emotional_Analysis_(TEA)\": {\r\n\t\t\t\t\t\tSentiment_Score: 2,\r\n\t\t\t\t\t\tObservations:\r\n\t\t\t\t\t\t\t\"The patient displayed frustration with statements like 'I don't know what the reason is' and 'I am not getting it', indicating a high level of dissatisfaction throughout the call.\",\r\n\t\t\t\t\t\tModel_Prediction_Confidence_Level: 80,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tOverall_Sentiment: {\r\n\t\t\t\t\t\tSentiment_Score: 1.5,\r\n\t\t\t\t\t\tObservations:\r\n\t\t\t\t\t\t\t\"The patient showed significant frustration and confusion, leading to a low overall sentiment.\",\r\n\t\t\t\t\t},\r\n\t\t\t\t},\r\n\t\t\t\tAgent_Sentiment_Analysis: {\r\n\t\t\t\t\tEmpathy_Score: {\r\n\t\t\t\t\t\tSentiment_Score: 2,\r\n\t\t\t\t\t\tObservations:\r\n\t\t\t\t\t\t\t\"The agent attempted to provide information but lacked engagement and empathy, as evidenced by the unclear responses and minimal reassurance offered to the patient.\",\r\n\t\t\t\t\t\tModel_Prediction_Confidence_Level: 75,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tConfidence_Score: {\r\n\t\t\t\t\t\tSentiment_Score: 2,\r\n\t\t\t\t\t\tObservations:\r\n\t\t\t\t\t\t\t\"The agent's responses were somewhat unclear and lacked confidence, particularly when addressing the patient's inquiries, leading to a perception of hesitation.\",\r\n\t\t\t\t\t\tModel_Prediction_Confidence_Level: 70,\r\n\t\t\t\t\t},\r\n\t\t\t\t\tOverall_Agent_Performance: {\r\n\t\t\t\t\t\tSentiment_Score: 2,\r\n\t\t\t\t\t\tObservations:\r\n\t\t\t\t\t\t\t\"The agent's performance was below expectations, lacking both empathy and clarity.\",\r\n\t\t\t\t\t},\r\n\t\t\t\t},\r\n\t\t\t\t\"Overall_Sentiment_Score_(OSS)\": {\r\n\t\t\t\t\tSentiment_Score: 1.7,\r\n\t\t\t\t\tObservations:\r\n\t\t\t\t\t\t\"The overall conversation reflected a low satisfaction level from the patient, compounded by the agent's lack of clarity and engagement.\",\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tConversation_Type_Classification: {\r\n\t\t\t\tInformational_Queries: \"40%\",\r\n\t\t\t\tAction_Oriented_Queries: \"40%\",\r\n\t\t\t\tEscalations_or_Complaints: \"20%\",\r\n\t\t\t},\r\n\t\t\tKey_Highlights_Issues_Identified: {\r\n\t\t\t\tPositive_Aspects: [\r\n\t\t\t\t\t\"The agent attempted to provide information about booking appointments.\",\r\n\t\t\t\t],\r\n\t\t\t\tAreas_for_Improvement: [\r\n\t\t\t\t\t\"The agent needs to improve clarity in communication and show more empathy towards patient concerns.\",\r\n\t\t\t\t],\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n};\r\n\r\nexport interface CallHistoryParams {\r\n\tpage?: number;\r\n\tpageSize?: number;\r\n\tsearch?: string;\r\n\tcall_type?: \"INCOMING\" | \"OUTGOING\";\r\n}\r\n\r\nexport function useCallHistory() {\r\n\tconst [calls, setCalls] = useState<CallHistoryItem[]>([]);\r\n\t// Real total (server returns { ..., total }).\r\n\tconst [callsTotal, setCallsTotal] = useState(-1);\r\n\tconst [missedCalls, setMissedCalls] = useState<MissedCallDetails[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchCallHistory = useCallback(async (params?: CallHistoryParams) => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tconst page = params?.page ?? 1;\r\n\t\t\tconst pageSize = params?.pageSize ?? 10;\r\n\t\t\t// POST with query params: page (1-indexed), pageSize, search, call_type.\r\n\t\t\tconst query: Record<string, unknown> = { page, pageSize };\r\n\t\t\tif (params?.search) query.search = params.search;\r\n\t\t\tif (params?.call_type) query.call_type = params.call_type;\r\n\t\t\tconst res = await axiosInstance.post(END_POINT.CALLS_HISTORY, {}, { params: query });\r\n\t\t\t// Find the records array wherever it sits (flat array, { records }, { data: [...] }, ...).\r\n\t\t\tconst records = deepFindArray<CallHistoryItem>(res.data, [\"records\"]);\r\n\t\t\tconst d: any = res.data;\r\n\t\t\tconst total =\r\n\t\t\t\ttypeof d?.total === \"number\" ? d.total\r\n\t\t\t\t: typeof d?.count === \"number\" ? d.count\r\n\t\t\t\t: typeof d?.totalCount === \"number\" ? d.totalCount\r\n\t\t\t\t: -1;\r\n\t\t\tsetCalls(records);\r\n\t\t\tsetCallsTotal(total >= 0 ? total : records.length < pageSize ? (page - 1) * pageSize + records.length : -1);\r\n\t\t} catch {\r\n\t\t\tsetCalls([]);\r\n\t\t\tsetCallsTotal(-1);\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\tconst fetchTranscript = useCallback(async (_call_uuid: string): Promise<TranscriptData | null> => {\r\n\t\tawait new Promise((r) => setTimeout(r, 400));\r\n\t\treturn MOCK_TRANSCRIPT;\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\tcalls,\r\n\t\tcallsTotal,\r\n\t\tmissedCalls,\r\n\t\tloading,\r\n\t\tfetchCallHistory,\r\n\t\tfetchMissedCalls,\r\n\t\tfetchRecording,\r\n\t\tfetchTranscript,\r\n\t};\r\n}\r\n"],"mappings":"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","names":["useCallback","useEffect","useState","Box","Typography","CircularProgress","Stack","Tooltip","_a","useState","useState","Fragment","jsx","jsxs","useState","useEffect","Box","Stack","CircularProgress","Typography","useCallback","Tooltip"]}
|