ahs-cti 0.0.4 → 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-6RO6STKU.mjs → agentPerformanceReport-U2QGVTXF.mjs} +27 -13
- package/dist/agentPerformanceReport-U2QGVTXF.mjs.map +1 -0
- package/dist/{auditReport-PYRZU3NA.mjs → auditReport-DEVQDTDT.mjs} +4 -3
- package/dist/{auditReport-PYRZU3NA.mjs.map → auditReport-DEVQDTDT.mjs.map} +1 -1
- package/dist/{callHistory-4JI64TU7.mjs → callHistory-MRBBY3UO.mjs} +27 -15
- package/dist/callHistory-MRBBY3UO.mjs.map +1 -0
- package/dist/{campaigns-JZE22SIM.mjs → campaigns-ERO3QM6I.mjs} +108 -51
- package/dist/campaigns-ERO3QM6I.mjs.map +1 -0
- package/dist/{cdrReport-RJTURVVV.mjs → cdrReport-EZNOCELK.mjs} +35 -18
- 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-HAJ6SECI.mjs → chunk-53DYH64M.mjs} +10 -6
- package/dist/{chunk-HAJ6SECI.mjs.map → chunk-53DYH64M.mjs.map} +1 -1
- package/dist/{chunk-UNTGXE6T.mjs → chunk-5FSMIU5K.mjs} +2 -2
- package/dist/{chunk-PO6POUPL.mjs → chunk-6MURUWDX.mjs} +39 -14
- package/dist/chunk-6MURUWDX.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-IBFF6DJA.mjs → chunk-ICGEHYJL.mjs} +11 -3
- package/dist/chunk-ICGEHYJL.mjs.map +1 -0
- package/dist/{chunk-BDQZYTAY.mjs → chunk-ISQBOS5Q.mjs} +20 -14
- 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-OVC42HVH.mjs → chunk-Q7FIRWF2.mjs} +6 -2
- package/dist/chunk-Q7FIRWF2.mjs.map +1 -0
- package/dist/{chunk-ATAP77RC.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-JOZ4YQMR.mjs → chunk-XMRM5VR4.mjs} +6 -3
- package/dist/{chunk-JOZ4YQMR.mjs.map → chunk-XMRM5VR4.mjs.map} +1 -1
- package/dist/{chunk-FVVDDZCA.mjs → chunk-YFW47Y76.mjs} +12 -4
- package/dist/chunk-YFW47Y76.mjs.map +1 -0
- package/dist/index.js +2718 -2134
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +229 -104
- package/dist/index.mjs.map +1 -1
- package/dist/{liveStatus-E7UP37FK.mjs → liveStatus-F6AKCC27.mjs} +4 -4
- package/dist/{loginReport-5QYHG6OM.mjs → loginReport-MWTI4G6O.mjs} +35 -16
- package/dist/loginReport-MWTI4G6O.mjs.map +1 -0
- package/dist/{managementDashboard-PARD3QHL.mjs → managementDashboard-6UBOCLBA.mjs} +15 -10
- package/dist/{managementDashboard-PARD3QHL.mjs.map → managementDashboard-6UBOCLBA.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/agentDetailReport-JYBV3TF6.mjs +0 -13
- package/dist/agentPerformanceReport-6RO6STKU.mjs.map +0 -1
- package/dist/callHistory-4JI64TU7.mjs.map +0 -1
- package/dist/campaigns-JZE22SIM.mjs.map +0 -1
- package/dist/cdrReport-RJTURVVV.mjs.map +0 -1
- package/dist/chunk-BDQZYTAY.mjs.map +0 -1
- package/dist/chunk-FVVDDZCA.mjs.map +0 -1
- package/dist/chunk-IBFF6DJA.mjs.map +0 -1
- package/dist/chunk-OVC42HVH.mjs.map +0 -1
- package/dist/chunk-PO6POUPL.mjs.map +0 -1
- package/dist/loginReport-5QYHG6OM.mjs.map +0 -1
- /package/dist/{agentDetailReport-JYBV3TF6.mjs.map → agentDetailReport-F7XZLVVO.mjs.map} +0 -0
- /package/dist/{chunk-UNTGXE6T.mjs.map → chunk-5FSMIU5K.mjs.map} +0 -0
- /package/dist/{chunk-ATAP77RC.mjs.map → chunk-QPOHVXUK.mjs.map} +0 -0
- /package/dist/{liveStatus-E7UP37FK.mjs.map → liveStatus-F6AKCC27.mjs.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/managementDashboard/index.tsx","../call-control-sdk/lib/pages/managementDashboard/useManagementDashboard.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\r\nimport {\r\n\tBox, Paper, Stack, Typography, CircularProgress, Alert,\r\n\tTable, TableBody, TableCell, TableContainer, TableHead, TableRow,\r\n\tTextField, InputAdornment, Chip, Radio, RadioGroup, FormControlLabel,\r\n} from \"@mui/material\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport {\r\n\tComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid,\r\n\tTooltip as RTooltip, ResponsiveContainer,\r\n} from \"recharts\";\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\n\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport { headCellSx as sharedHeadSx } from \"../common/utils/tableStyles\";\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { getManagementDashboard } from \"./useManagementDashboard\";\r\nimport type { MgmtDashboardResponse } from \"./types\";\r\n\r\n/* ═══════════════════════ COLORS ═══════════════════════ */\r\nconst C = {\r\n\tnavy: \"#1a3a6b\", blue: \"#2b6cb0\", green: \"#276749\", amber: \"#c47c00\",\r\n\tred: \"#c53030\", teal: \"#0b7a8f\",\r\n\tsurface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\r\n\tb1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\r\n\tt1: \"#2d3748\", t2: \"#4a5568\", t3: \"#718096\",\r\n\tblt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\", tlt: \"#e3f4f7\",\r\n};\r\n\r\n/* ═══════════════════════ STYLES ═══════════════════════ */\r\nconst headSx = { ...sharedHeadSx as object, py: 1, px: 1.5 };\r\nconst cellSx = { fontSize: 12, py: 0.8, px: 1.5, borderBottom: `1px solid ${C.b1}` };\r\nconst monoSx = { fontFamily: \"'JetBrains Mono', monospace\", fontSize: 12, fontWeight: 700 };\r\nconst labelSx = { fontSize: 11, fontWeight: 700, letterSpacing: 0.7, textTransform: \"uppercase\" as const, color: C.t2 };\r\nconst cardPaper = { background: C.surface, border: `1px solid #dce3ef`, borderRadius: \"6px\", overflow: \"hidden\", boxShadow: \"0 1px 4px rgba(0,0,0,.09)\" };\r\nconst cardHeader = { px: 1.5, py: 1, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" };\r\n\r\n/* ═══════════════════════ EMPTY STATE ═══════════════════════ */\r\nconst EMPTY: MgmtDashboardResponse = {\r\n\tinbound: { total: 0, answered: 0, unanswered: 0, answered_pct: 0, unanswered_pct: 0 },\r\n\toutbound: { total: 0, answered: 0, unanswered: 0, answered_pct: 0, unanswered_pct: 0 },\r\n\ttotals: { total_calls: 0, total_answered: 0, highest_duration: \"00:00:00\", lowest_duration: \"00:00:00\", calls_lt_30sec: 0, avg_inbound_duration: \"00:00:00\", avg_outbound_duration: \"00:00:00\" },\r\n\tabandoned:{ total: 0, called_back: 0, to_call: 0, called_back_pct: 0, to_call_pct: 0, avg_callback_duration: \"00:00:00\" },\r\n\tivr: { total: 0, called_back: 0, to_call: 0, called_back_pct: 0, to_call_pct: 0 },\r\n\twaiting: { avg_wait_time: \"00:00:00\", avg_lang_selection: \"00:00:00\", avg_queue_wait: \"00:00:00\" },\r\n\tcht: [],\r\n\tqueue_calls: [],\r\n\thourly_chart: [],\r\n\trepeated_calls: [],\r\n};\r\n\r\n/* ═══════════════════════ SUB-COMPONENTS ═══════════════════════ */\r\n\r\nfunction DirectionCard({ title, data }: Readonly<{\r\n\ttitle: string;\r\n\tdata: MgmtDashboardResponse[\"inbound\"];\r\n}>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>{title}</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 32, fontWeight: 800, color: C.navy, lineHeight: 1, mb: 1.2 }}>\r\n\t\t\t\t\t{data.total.toLocaleString()}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<Box sx={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 1, borderTop: `2px solid ${C.s3}`, pt: 1 }}>\r\n\t\t\t\t\t{[\r\n\t\t\t\t\t\t{ label: \"ANSWERED\", value: data.answered, pct: data.answered_pct, color: C.blue },\r\n\t\t\t\t\t\t{ label: \"UNANSWERED\", value: data.unanswered, pct: data.unanswered_pct, color: C.t3 },\r\n\t\t\t\t\t].map(({ label, value, pct, color }) => (\r\n\t\t\t\t\t\t<Box key={label}>\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: 10, fontWeight: 700, letterSpacing: 0.5, color: C.t3, mb: 0.3 }}>{label}</Typography>\r\n\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 18, fontWeight: 700, color }}>{value.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3 }}>{pct.toFixed(1)}%</Typography>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction QueueCallsCard({ data }: Readonly<{ data: MgmtDashboardResponse[\"queue_calls\"] }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>Queue Wise Calls</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t{data.length === 0 && <Typography sx={{ fontSize: 12, color: C.t3, textAlign: \"center\", py: 2 }}>No data</Typography>}\r\n\t\t\t\t{data.map((q, i) => (\r\n\t\t\t\t\t<Box key={q.queue_name} sx={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", py: 0.6, borderBottom: `1px solid #f0f0f0`, \"&:last-child\": { borderBottom: \"none\" } }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 12, fontWeight: 600, color: C.t2 }}>{q.queue_name}</Typography>\r\n\t\t\t\t\t\t<Box sx={{ background: i === 0 ? \"#3182ce\" : \"#90cdf4\", color: i === 0 ? \"#fff\" : \"#1a365d\", borderRadius: \"4px\", px: 1.2, py: 0.3, minWidth: 44, textAlign: \"center\", fontSize: 14, fontWeight: 700 }}>\r\n\t\t\t\t\t\t\t{q.call_count}\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</Paper>\r\n\t);\r\n}\r\n\r\nfunction AbandonedCard({ data }: Readonly<{ data: MgmtDashboardResponse[\"abandoned\"] }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>Abandoned Patients</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 30, fontWeight: 800, color: C.navy, lineHeight: 1, mb: 1 }}>\r\n\t\t\t\t\t{data.total.toLocaleString()}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t{[\r\n\t\t\t\t\t{ label: \"Called Back Patients\", value: data.called_back, pct: data.called_back_pct },\r\n\t\t\t\t\t{ label: \"To be Called Patients\", value: data.to_call, pct: data.to_call_pct },\r\n\t\t\t\t].map(({ label, value, pct }) => (\r\n\t\t\t\t\t<Box key={label} sx={{ mb: 0.4 }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, display: \"inline\" }}>{label} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 13, fontWeight: 700, color: C.blue, display: \"inline\" }}>{value} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, fontWeight: 700, color: \"#48bb78\", display: \"inline\" }}>{pct.toFixed(1)}%</Typography>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t))}\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction AvgCallbackCard({ duration }: Readonly<{ duration: string }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>Avg Callback Duration</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'JetBrains Mono', monospace\", fontSize: 26, fontWeight: 700, color: C.navy, mt: 1, letterSpacing: 1 }}>\r\n\t\t\t\t\t{duration}\r\n\t\t\t\t</Typography>\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction IvrCard({ data }: Readonly<{ data: MgmtDashboardResponse[\"ivr\"] }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>IVR Patients</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 30, fontWeight: 800, color: C.navy, lineHeight: 1, mb: 1 }}>\r\n\t\t\t\t\t{data.total.toLocaleString()}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t{[\r\n\t\t\t\t\t{ label: \"Called Back\", value: data.called_back, pct: data.called_back_pct },\r\n\t\t\t\t\t{ label: \"To Be Called\", value: data.to_call, pct: data.to_call_pct },\r\n\t\t\t\t].map(({ label, value, pct }) => (\r\n\t\t\t\t\t<Box key={label} sx={{ mb: 0.4 }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, display: \"inline\" }}>{label} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 13, fontWeight: 700, color: C.blue, display: \"inline\" }}>{value} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, fontWeight: 700, color: \"#48bb78\", display: \"inline\" }}>{pct.toFixed(1)}%</Typography>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t))}\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction statusColor(status: string) {\r\n\tconst s = status?.toUpperCase();\r\n\tif (s === \"ANSWERED\") return C.green;\r\n\tif (s === \"CANCEL\") return C.red;\r\n\tif (s === \"ABANDONED\") return \"#c05621\";\r\n\treturn C.t2;\r\n}\r\n\r\n/* ═══════════════════════ MAIN CONTENT ═══════════════════════ */\r\n\r\nfunction ManagementDashboardContent() {\r\n\tconst [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n\tconst [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n\tconst [quickRange, setQuickRange] = useState(\"today\");\r\n\r\n\tconst [data, setData] = useState<MgmtDashboardResponse>(EMPTY);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\tconst [repeatedSearch, setRepeatedSearch] = useState(\"\");\r\n\tconst [chartDir, setChartDir] = useState<\"inbound\" | \"outbound\">(\"inbound\");\r\n\tconst chartRef = useRef<HTMLDivElement>(null);\r\n\r\n\tconst fetchDashboard = useCallback(async () => {\r\n\t\tif (!startDate || !endDate) return;\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst result = await getManagementDashboard({\r\n\t\t\t\tstart_date: startDate.format(\"YYYY-MM-DD\"),\r\n\t\t\t\tend_date: endDate.format(\"YYYY-MM-DD\"),\r\n\t\t\t});\r\n\t\t\tsetData(result);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(err?.response?.data?.detail || err?.message || \"Failed to load dashboard\");\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, [startDate, endDate]);\r\n\r\n\tuseEffect(() => { fetchDashboard(); }, [fetchDashboard]);\r\n\r\n\tconst handleQuickRangeChange = (range: QuickRange) => setQuickRange(range);\r\n\r\n\tconst filteredRepeated = useMemo(() => {\r\n\t\tif (!repeatedSearch) return data.repeated_calls;\r\n\t\tconst q = repeatedSearch.toLowerCase();\r\n\t\treturn data.repeated_calls.filter((r) =>\r\n\t\t\tr.phone_number.toLowerCase().includes(q) ||\r\n\t\t\tr.latest_status.toLowerCase().includes(q) ||\r\n\t\t\tr.latest_call_type.toLowerCase().includes(q)\r\n\t\t);\r\n\t}, [data.repeated_calls, repeatedSearch]);\r\n\r\n\tconst hourlyData = useMemo(() => {\r\n\t\tconst map = new Map(data.hourly_chart.map((h) => [h.hour, h]));\r\n\t\treturn Array.from({ length: 24 }, (_, h) => ({\r\n\t\t\thour: `${String(h).padStart(2, \"0\")}`,\r\n\t\t\tanswered: map.get(h)?.answered ?? 0,\r\n\t\t\tabandoned: map.get(h)?.abandoned ?? 0,\r\n\t\t\tagents: map.get(h)?.agents ?? 0,\r\n\t\t}));\r\n\t}, [data.hourly_chart]);\r\n\r\n\tconst downloadChart = () => {\r\n\t\tconst svgEl = chartRef.current?.querySelector(\"svg\");\r\n\t\tif (!svgEl) return;\r\n\t\tconst svgData = new XMLSerializer().serializeToString(svgEl);\r\n\t\tconst canvas = document.createElement(\"canvas\");\r\n\t\tconst img = new Image();\r\n\t\timg.onload = () => {\r\n\t\t\tcanvas.width = img.width;\r\n\t\t\tcanvas.height = img.height;\r\n\t\t\tconst ctx = canvas.getContext(\"2d\");\r\n\t\t\tif (!ctx) return;\r\n\t\t\tctx.fillStyle = \"#fff\";\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t\tctx.drawImage(img, 0, 0);\r\n\t\t\tconst a = document.createElement(\"a\");\r\n\t\t\ta.download = `hourly_chart_${chartDir}.png`;\r\n\t\t\ta.href = canvas.toDataURL(\"image/png\");\r\n\t\t\ta.click();\r\n\t\t};\r\n\t\timg.src = \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(svgData)));\r\n\t};\r\n\r\n\treturn (\r\n\t\t<LocalizationProvider dateAdapter={AdapterDayjs}>\r\n\t\t\t<Box sx={{ background: \"transparent\", minHeight: \"100vh\" }}>\r\n\r\n\t\t\t\t{/* ── HEADER ── */}\r\n\t\t\t\t<PageHeader\r\n\t\t\t\t\ttitle=\"Management Dashboard\"\r\n\t\t\t\t\tactions={\r\n\t\t\t\t\t\t<Stack direction=\"row\" spacing={1} alignItems=\"center\">\r\n\t\t\t\t\t\t\t<AppButton\r\n\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\tstartIcon={<RefreshIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n\t\t\t\t\t\t\t\tonClick={fetchDashboard}\r\n\t\t\t\t\t\t\t\tdisabled={loading}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tRefresh\r\n\t\t\t\t\t\t\t</AppButton>\r\n\t\t\t\t\t\t\t<AppButton\r\n\t\t\t\t\t\t\t\tstartIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n\t\t\t\t\t\t\t\tdisabled={loading || data.totals.total_calls === 0}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tconst rows = data.repeated_calls.map((r) => Object.values(r).join(\",\"));\r\n\t\t\t\t\t\t\t\t\tconst csv = [\"Phone,Date,Count,Status,Type,Comments\", ...rows].join(\"\\n\");\r\n\t\t\t\t\t\t\t\t\tconst a = document.createElement(\"a\");\r\n\t\t\t\t\t\t\t\t\ta.href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\r\n\t\t\t\t\t\t\t\t\ta.download = `mgmt_dashboard_${startDate?.format(\"YYYY-MM-DD\")}.csv`;\r\n\t\t\t\t\t\t\t\t\ta.click();\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\tExport CSV\r\n\t\t\t\t\t\t\t</AppButton>\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{/* ── FILTER BAR ── */}\r\n\t\t\t\t<ReportFilterBar\r\n\t\t\t\t\tstartDate={startDate}\r\n\t\t\t\t\tendDate={endDate}\r\n\t\t\t\t\tonStartChange={setStartDate}\r\n\t\t\t\t\tonEndChange={setEndDate}\r\n\t\t\t\t\tshowTime={false}\r\n\t\t\t\t\tquickRange={quickRange}\r\n\t\t\t\t\tonQuickRangeChange={handleQuickRangeChange}\r\n\t\t\t\t/>\r\n\r\n\t\t\t\t{error && (\r\n\t\t\t\t\t<Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t{loading && (\r\n\t\t\t\t\t<Box sx={{ display: \"flex\", justifyContent: \"center\", py: 5 }}>\r\n\t\t\t\t\t\t<CircularProgress size={36} />\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t{!loading && (\r\n\t\t\t\t\t<Box sx={{ px: { xs: 1, md: 2 }, py: 1.5 }}>\r\n\r\n\t\t\t\t\t\t{/* ═══ ROW 1 — 6 stat cards ═══ */}\r\n\t\t\t\t\t\t<Box sx={{\r\n\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\tgridTemplateColumns: { xs: \"1fr\", sm: \"repeat(2, 1fr)\", md: \"repeat(3, 1fr)\", lg: \"1.3fr 1.2fr 1.1fr 0.75fr 1.3fr 1.1fr\" },\r\n\t\t\t\t\t\t\tgap: 1.2,\r\n\t\t\t\t\t\t\tmb: 1.2,\r\n\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t\t<DirectionCard title=\"Inbound Calls\" data={data.inbound} />\r\n\t\t\t\t\t\t\t<QueueCallsCard data={data.queue_calls} />\r\n\t\t\t\t\t\t\t<AbandonedCard data={data.abandoned} />\r\n\t\t\t\t\t\t\t<AvgCallbackCard duration={data.abandoned.avg_callback_duration} />\r\n\t\t\t\t\t\t\t<DirectionCard title=\"Outbound Calls\" data={data.outbound} />\r\n\t\t\t\t\t\t\t<IvrCard data={data.ivr} />\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t{/* ═══ ROW 2 — 4 metric cards ═══ */}\r\n\t\t\t\t\t\t<Box sx={{\r\n\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\tgridTemplateColumns: { xs: \"1fr\", sm: \"repeat(2, 1fr)\", lg: \"1fr 1fr 1.6fr 1.6fr\" },\r\n\t\t\t\t\t\t\tgap: 1.2,\r\n\t\t\t\t\t\t\tmb: 1.2,\r\n\t\t\t\t\t\t}}>\r\n\r\n\t\t\t\t\t\t\t{/* Summary */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Summary</Typography></Box>\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: 0.5, mb: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 22, fontWeight: 800, color: C.navy }}>{data.totals.total_answered.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 14, color: C.t3 }}>/</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 22, fontWeight: 800, color: C.t3 }}>{data.totals.total_calls.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, mb: 1 }}>Total Calls</Typography>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ mt: 1 }}>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, mb: 0.3 }}>Call Duration</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 2 }}>\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\t<Typography sx={{ fontSize: 10, color: C.t3 }}>Highest</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, color: C.blue, fontSize: 13 }}>{data.totals.highest_duration}</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>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 10, color: C.t3 }}>Lowest</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, color: C.blue, fontSize: 13 }}>{data.totals.lowest_duration}</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</Box>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ mt: 1 }}>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, display: \"inline\" }}>Calls < 30 sec: </Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, color: C.blue, display: \"inline\", fontSize: 13 }}>{data.totals.calls_lt_30sec.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* Avg Duration */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Avg Total Calls Duration</Typography></Box>\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t\t\t\t\t\t{[\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Inbound\", value: data.totals.avg_inbound_duration },\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Outbound\", value: data.totals.avg_outbound_duration },\r\n\t\t\t\t\t\t\t\t\t].map(({ label, value }) => (\r\n\t\t\t\t\t\t\t\t\t\t<Box key={label} sx={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", py: 1, borderBottom: `1px solid ${C.b1}`, \"&:last-child\": { borderBottom: \"none\" } }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 12, fontWeight: 600, color: C.t2 }}>{label}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, fontSize: 16, color: C.blue }}>{value}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* Inbound Avg Waiting */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Inbound Average Waiting</Typography></Box>\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 1.5, display: \"grid\", gridTemplateColumns: \"1fr 1fr 1fr\", gap: 1, mt: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t{[\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Waiting Time\", value: data.waiting.avg_wait_time },\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Language Selection\", value: data.waiting.avg_lang_selection },\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Queue Waiting\", value: data.waiting.avg_queue_wait },\r\n\t\t\t\t\t\t\t\t\t].map(({ label, value }) => (\r\n\t\t\t\t\t\t\t\t\t\t<Box key={label} sx={{ textAlign: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 10, fontWeight: 600, color: C.t3, mb: 0.5 }}>{label}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, fontSize: 18, color: C.blue }}>{value}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* CHT Table */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Average CHT</Typography></Box>\r\n\t\t\t\t\t\t\t\t<TableContainer>\r\n\t\t\t\t\t\t\t\t\t<Table size=\"small\">\r\n\t\t\t\t\t\t\t\t\t\t<TableHead>\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\t\t<TableCell sx={headSx}>Call Type</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Call Handling Time</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Talk Duration</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Hold Duration</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</TableHead>\r\n\t\t\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t\t\t{data.cht.length === 0 && (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow><TableCell colSpan={4} sx={{ textAlign: \"center\", py: 2, color: C.t3, fontSize: 12 }}>No data</TableCell></TableRow>\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{data.cht.map((row) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow key={row.call_type} hover>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontWeight: 600, color: C.t2 }}>{row.call_type}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, color: C.blue }}>{row.call_handling_time}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, color: C.blue }}>{row.talk_duration}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, color: C.blue }}>{row.hold_duration}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableRow>\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</TableBody>\r\n\t\t\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t\t\t</TableContainer>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t{/* ═══ ROW 3 — Chart + Repeated Calls ═══ */}\r\n\t\t\t\t\t\t<Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr\", lg: \"1fr 1fr\" }, gap: 1.2 }}>\r\n\r\n\t\t\t\t\t\t\t{/* Hourly Chart */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={{ ...cardHeader, flexWrap: \"wrap\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={labelSx}>Avg Hour Wise Inbound Calls vs Agents</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Stack direction=\"row\" spacing={1.5} sx={{ mt: 0.5 }}>\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{ color: \"#f6a623\", label: \"Answered\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ color: \"#90a4c0\", label: \"Abandoned\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ color: \"#4a5568\", label: \"Agents\" },\r\n\t\t\t\t\t\t\t\t\t\t\t].map(({ color, label }) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Box key={label} sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Box sx={{ width: 12, height: 12, borderRadius: \"2px\", background: color }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3 }}>{label}</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))}\r\n\t\t\t\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"flex-end\", gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t\t<RadioGroup row value={chartDir} onChange={(e) => setChartDir(e.target.value as \"inbound\" | \"outbound\")}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{ \"& .MuiFormControlLabel-root\": { mr: 0.5 }, \"& .MuiFormControlLabel-label\": { fontSize: 12 } }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<FormControlLabel value=\"inbound\" control={<Radio size=\"small\" />} label=\"Inbound\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<FormControlLabel value=\"outbound\" control={<Radio size=\"small\" />} label=\"Outbound\" />\r\n\t\t\t\t\t\t\t\t\t\t</RadioGroup>\r\n\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={downloadChart}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{ fontSize: 11, color: \"#3182ce\", cursor: \"pointer\", border: \"1px solid #bee3f8\", borderRadius: \"4px\", px: 1, py: 0.3 }}\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⬇ DOWNLOAD\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t<Box ref={chartRef} sx={{ p: 1.5, height: 260 }}>\r\n\t\t\t\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\r\n\t\t\t\t\t\t\t\t\t\t<ComposedChart data={hourlyData} margin={{ top: 4, right: 30, left: -20, bottom: 0 }} barGap={1}>\r\n\t\t\t\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={C.b2} vertical={false} />\r\n\t\t\t\t\t\t\t\t\t\t\t<XAxis dataKey=\"hour\" tick={{ fontSize: 9, fill: C.t3 }} interval={1} />\r\n\t\t\t\t\t\t\t\t\t\t\t<YAxis yAxisId=\"left\" tick={{ fontSize: 9, fill: C.t3 }} />\r\n\t\t\t\t\t\t\t\t\t\t\t<YAxis yAxisId=\"right\" orientation=\"right\" tick={{ fontSize: 9, fill: C.t3 }} />\r\n\t\t\t\t\t\t\t\t\t\t\t<RTooltip\r\n\t\t\t\t\t\t\t\t\t\t\t\tcontentStyle={{ fontSize: 11, borderRadius: 6, border: `1px solid ${C.b2}` }}\r\n\t\t\t\t\t\t\t\t\t\t\t\tformatter={(v, n: string) => [v, n.charAt(0).toUpperCase() + n.slice(1)]}\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<Bar yAxisId=\"left\" dataKey=\"answered\" fill=\"#f6a623\" radius={[2, 2, 0, 0]} maxBarSize={14} />\r\n\t\t\t\t\t\t\t\t\t\t\t<Bar yAxisId=\"left\" dataKey=\"abandoned\" fill=\"#90a4c0\" radius={[2, 2, 0, 0]} maxBarSize={14} />\r\n\t\t\t\t\t\t\t\t\t\t\t<Line yAxisId=\"right\" type=\"monotone\" dataKey=\"agents\" stroke=\"#4a5568\" strokeWidth={1.5} dot={{ r: 2, fill: \"#4a5568\" }} />\r\n\t\t\t\t\t\t\t\t\t\t</ComposedChart>\r\n\t\t\t\t\t\t\t\t\t</ResponsiveContainer>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* Repeated Calls Table */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t\t\t\t\t\t<Typography sx={labelSx}>Repeated Calls</Typography>\r\n\t\t\t\t\t\t\t\t\t<Chip label={data.repeated_calls.length} size=\"small\" sx={{ background: C.rlt, color: C.red, fontWeight: 700, fontSize: 11 }} />\r\n\t\t\t\t\t\t\t\t</Box>\r\n\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<TextField\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search…\"\r\n\t\t\t\t\t\t\t\t\t\tvalue={repeatedSearch}\r\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setRepeatedSearch(e.target.value)}\r\n\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t\tslotProps={{ input: { startAdornment: <InputAdornment position=\"start\"><SearchIcon sx={{ fontSize: 16, color: C.t3 }} /></InputAdornment> } }}\r\n\t\t\t\t\t\t\t\t\t\tsx={{ \"& .MuiInputBase-root\": { fontSize: 12 } }}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t<TableContainer sx={{ maxHeight: 260, overflow: \"auto\" }}>\r\n\t\t\t\t\t\t\t\t\t<Table size=\"small\" stickyHeader>\r\n\t\t\t\t\t\t\t\t\t\t<TableHead>\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\t\t<TableCell sx={headSx}>Phone Number</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Date</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>No of Calls</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Latest Status</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Latest Call Type</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Comments</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</TableHead>\r\n\t\t\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t\t\t{filteredRepeated.length === 0 && (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow><TableCell colSpan={6} sx={{ textAlign: \"center\", py: 2, color: C.t3, fontSize: 12 }}>No repeated calls</TableCell></TableRow>\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{filteredRepeated.map((r) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow key={`${r.phone_number}-${r.date}`} hover>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, fontSize: 11 }}>{r.phone_number}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11 }}>{r.date}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontWeight: 700, color: C.navy, fontSize: 13 }}>{r.call_count}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11, fontWeight: 600, color: statusColor(r.latest_status) }}>{r.latest_status}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11 }}>{r.latest_call_type}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11, color: C.t3 }}>{r.comments}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableRow>\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</TableBody>\r\n\t\t\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t\t\t</TableContainer>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\t\t</LocalizationProvider>\r\n\t);\r\n}\r\n\r\nconst ManagementDashboard: React.FC = () => (\r\n\t<SDKProvider>\r\n\t\t<ManagementDashboardContent />\r\n\t</SDKProvider>\r\n);\r\n\r\nexport default ManagementDashboard;\r\n","import axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { MgmtDashboardParams, MgmtDashboardResponse } from \"./types\";\r\n\r\nfunction buildQs(params: MgmtDashboardParams): 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 != null) qs.append(\"agent_id\", String(params.agent_id));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\nexport async function getManagementDashboard(params: MgmtDashboardParams): Promise<MgmtDashboardResponse> {\r\n\tconst res = await axiosInstance.get<MgmtDashboardResponse>(\r\n\t\t`${END_POINT.MANAGEMENT_DASHBOARD}${buildQs(params)}`,\r\n\t);\r\n\treturn res.data;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/managementDashboard/index.tsx","../call-control-sdk/lib/pages/managementDashboard/useManagementDashboard.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\r\nimport {\r\n\tBox, Paper, Stack, Typography, CircularProgress, Alert,\r\n\tTable, TableBody, TableCell, TableContainer, TableHead, TableRow,\r\n\tTextField, InputAdornment, Chip, Radio, RadioGroup, FormControlLabel,\r\n} from \"@mui/material\";\r\nimport dayjs, { Dayjs } from \"dayjs\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport {\r\n\tComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid,\r\n\tTooltip as RTooltip, ResponsiveContainer,\r\n} from \"recharts\";\r\n\r\nimport SearchIcon from \"@mui/icons-material/Search\";\r\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\r\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\r\n\r\nimport PageHeader from \"../common/components/PageHeader\";\r\nimport ReportFilterBar, { type QuickRange } from \"../common/components/ReportFilterBar\";\r\nimport AppButton from \"../common/components/AppButton\";\r\nimport { headCellSx as sharedHeadSx } from \"../common/utils/tableStyles\";\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { getManagementDashboard } from \"./useManagementDashboard\";\r\nimport type { MgmtDashboardResponse } from \"./types\";\r\n\r\n/* ═══════════════════════ COLORS ═══════════════════════ */\r\nconst C = {\r\n\tnavy: \"#1a3a6b\", blue: \"#2b6cb0\", green: \"#276749\", amber: \"#c47c00\",\r\n\tred: \"#c53030\", teal: \"#0b7a8f\",\r\n\tsurface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\r\n\tb1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\r\n\tt1: \"#2d3748\", t2: \"#4a5568\", t3: \"#718096\",\r\n\tblt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\", tlt: \"#e3f4f7\",\r\n};\r\n\r\n/* ═══════════════════════ STYLES ═══════════════════════ */\r\nconst headSx = { ...sharedHeadSx as object, py: 1, px: 1.5 };\r\nconst cellSx = { fontSize: 12, py: 0.8, px: 1.5, borderBottom: `1px solid ${C.b1}` };\r\nconst monoSx = { fontFamily: \"'JetBrains Mono', monospace\", fontSize: 12, fontWeight: 700 };\r\nconst labelSx = { fontSize: 11, fontWeight: 700, letterSpacing: 0.7, textTransform: \"uppercase\" as const, color: C.t2 };\r\nconst cardPaper = { background: C.surface, border: `1px solid #dce3ef`, borderRadius: \"6px\", overflow: \"hidden\", boxShadow: \"0 1px 4px rgba(0,0,0,.09)\" };\r\nconst cardHeader = { px: 1.5, py: 1, background: C.s2, borderBottom: `1px solid ${C.b1}`, display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\" };\r\n\r\n/* ═══════════════════════ EMPTY STATE ═══════════════════════ */\r\nconst EMPTY: MgmtDashboardResponse = {\r\n\tinbound: { total: 0, answered: 0, unanswered: 0, answered_pct: 0, unanswered_pct: 0 },\r\n\toutbound: { total: 0, answered: 0, unanswered: 0, answered_pct: 0, unanswered_pct: 0 },\r\n\ttotals: { total_calls: 0, total_answered: 0, highest_duration: \"00:00:00\", lowest_duration: \"00:00:00\", calls_lt_30sec: 0, avg_inbound_duration: \"00:00:00\", avg_outbound_duration: \"00:00:00\" },\r\n\tabandoned:{ total: 0, called_back: 0, to_call: 0, called_back_pct: 0, to_call_pct: 0, avg_callback_duration: \"00:00:00\" },\r\n\tivr: { total: 0, called_back: 0, to_call: 0, called_back_pct: 0, to_call_pct: 0 },\r\n\twaiting: { avg_wait_time: \"00:00:00\", avg_lang_selection: \"00:00:00\", avg_queue_wait: \"00:00:00\" },\r\n\tcht: [],\r\n\tqueue_calls: [],\r\n\thourly_chart: [],\r\n\trepeated_calls: [],\r\n};\r\n\r\n/* ═══════════════════════ SUB-COMPONENTS ═══════════════════════ */\r\n\r\nfunction DirectionCard({ title, data }: Readonly<{\r\n\ttitle: string;\r\n\tdata: MgmtDashboardResponse[\"inbound\"];\r\n}>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>{title}</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 32, fontWeight: 800, color: C.navy, lineHeight: 1, mb: 1.2 }}>\r\n\t\t\t\t\t{data.total.toLocaleString()}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<Box sx={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 1, borderTop: `2px solid ${C.s3}`, pt: 1 }}>\r\n\t\t\t\t\t{[\r\n\t\t\t\t\t\t{ label: \"ANSWERED\", value: data.answered, pct: data.answered_pct, color: C.blue },\r\n\t\t\t\t\t\t{ label: \"UNANSWERED\", value: data.unanswered, pct: data.unanswered_pct, color: C.t3 },\r\n\t\t\t\t\t].map(({ label, value, pct, color }) => (\r\n\t\t\t\t\t\t<Box key={label}>\r\n\t\t\t\t\t\t\t<Typography sx={{ fontSize: 10, fontWeight: 700, letterSpacing: 0.5, color: C.t3, mb: 0.3 }}>{label}</Typography>\r\n\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 18, fontWeight: 700, color }}>{value.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3 }}>{pct.toFixed(1)}%</Typography>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t))}\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction QueueCallsCard({ data }: Readonly<{ data: MgmtDashboardResponse[\"queue_calls\"] }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>Queue Wise Calls</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t{data.length === 0 && <Typography sx={{ fontSize: 12, color: C.t3, textAlign: \"center\", py: 2 }}>No data</Typography>}\r\n\t\t\t\t{data.map((q, i) => (\r\n\t\t\t\t\t<Box key={q.queue_name} sx={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", py: 0.6, borderBottom: `1px solid #f0f0f0`, \"&:last-child\": { borderBottom: \"none\" } }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 12, fontWeight: 600, color: C.t2 }}>{q.queue_name}</Typography>\r\n\t\t\t\t\t\t<Box sx={{ background: i === 0 ? \"#3182ce\" : \"#90cdf4\", color: i === 0 ? \"#fff\" : \"#1a365d\", borderRadius: \"4px\", px: 1.2, py: 0.3, minWidth: 44, textAlign: \"center\", fontSize: 14, fontWeight: 700 }}>\r\n\t\t\t\t\t\t\t{q.call_count}\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</Paper>\r\n\t);\r\n}\r\n\r\nfunction AbandonedCard({ data }: Readonly<{ data: MgmtDashboardResponse[\"abandoned\"] }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>Abandoned Patients</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 30, fontWeight: 800, color: C.navy, lineHeight: 1, mb: 1 }}>\r\n\t\t\t\t\t{data.total.toLocaleString()}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t{[\r\n\t\t\t\t\t{ label: \"Called Back Patients\", value: data.called_back, pct: data.called_back_pct },\r\n\t\t\t\t\t{ label: \"To be Called Patients\", value: data.to_call, pct: data.to_call_pct },\r\n\t\t\t\t].map(({ label, value, pct }) => (\r\n\t\t\t\t\t<Box key={label} sx={{ mb: 0.4 }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, display: \"inline\" }}>{label} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 13, fontWeight: 700, color: C.blue, display: \"inline\" }}>{value} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, fontWeight: 700, color: \"#48bb78\", display: \"inline\" }}>{pct.toFixed(1)}%</Typography>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t))}\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction AvgCallbackCard({ duration }: Readonly<{ duration: string }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>Avg Callback Duration</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'JetBrains Mono', monospace\", fontSize: 26, fontWeight: 700, color: C.navy, mt: 1, letterSpacing: 1 }}>\r\n\t\t\t\t\t{duration}\r\n\t\t\t\t</Typography>\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction IvrCard({ data }: Readonly<{ data: MgmtDashboardResponse[\"ivr\"] }>) {\r\n\treturn (\r\n\t\t<Paper sx={cardPaper}>\r\n\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t<Typography sx={labelSx}>IVR Patients</Typography>\r\n\t\t\t</Box>\r\n\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 30, fontWeight: 800, color: C.navy, lineHeight: 1, mb: 1 }}>\r\n\t\t\t\t\t{data.total.toLocaleString()}\r\n\t\t\t\t</Typography>\r\n\t\t\t\t{[\r\n\t\t\t\t\t{ label: \"Called Back\", value: data.called_back, pct: data.called_back_pct },\r\n\t\t\t\t\t{ label: \"To Be Called\", value: data.to_call, pct: data.to_call_pct },\r\n\t\t\t\t].map(({ label, value, pct }) => (\r\n\t\t\t\t\t<Box key={label} sx={{ mb: 0.4 }}>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, display: \"inline\" }}>{label} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 13, fontWeight: 700, color: C.blue, display: \"inline\" }}>{value} </Typography>\r\n\t\t\t\t\t\t<Typography sx={{ fontSize: 11, fontWeight: 700, color: \"#48bb78\", display: \"inline\" }}>{pct.toFixed(1)}%</Typography>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t))}\r\n\t\t\t</Box>\r\n\t\t</Paper>\r\n\t);\r\n}\r\n\r\nfunction statusColor(status: string) {\r\n\tconst s = status?.toUpperCase();\r\n\tif (s === \"ANSWERED\") return C.green;\r\n\tif (s === \"CANCEL\") return C.red;\r\n\tif (s === \"ABANDONED\") return \"#c05621\";\r\n\treturn C.t2;\r\n}\r\n\r\n/* ═══════════════════════ MAIN CONTENT ═══════════════════════ */\r\n\r\nfunction ManagementDashboardContent() {\r\n\tconst [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\r\n\tconst [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\r\n\tconst [quickRange, setQuickRange] = useState(\"today\");\r\n\r\n\tconst [data, setData] = useState<MgmtDashboardResponse>(EMPTY);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\tconst [repeatedSearch, setRepeatedSearch] = useState(\"\");\r\n\tconst [chartDir, setChartDir] = useState<\"inbound\" | \"outbound\">(\"inbound\");\r\n\tconst chartRef = useRef<HTMLDivElement>(null);\r\n\r\n\tconst fetchDashboard = useCallback(async () => {\r\n\t\tif (!startDate || !endDate) return;\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst result = await getManagementDashboard({\r\n\t\t\t\tstart_date: startDate.format(\"YYYY-MM-DD\"),\r\n\t\t\t\tend_date: endDate.format(\"YYYY-MM-DD\"),\r\n\t\t\t});\r\n\t\t\tsetData(result);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(err?.response?.data?.detail || err?.message || \"Failed to load dashboard\");\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, [startDate, endDate]);\r\n\r\n\tuseEffect(() => { fetchDashboard(); }, [fetchDashboard]);\r\n\r\n\tconst handleQuickRangeChange = (range: QuickRange) => setQuickRange(range);\r\n\r\n\tconst filteredRepeated = useMemo(() => {\r\n\t\tif (!repeatedSearch) return data.repeated_calls;\r\n\t\tconst q = repeatedSearch.toLowerCase();\r\n\t\treturn data.repeated_calls.filter((r) =>\r\n\t\t\tr.phone_number.toLowerCase().includes(q) ||\r\n\t\t\tr.latest_status.toLowerCase().includes(q) ||\r\n\t\t\tr.latest_call_type.toLowerCase().includes(q)\r\n\t\t);\r\n\t}, [data.repeated_calls, repeatedSearch]);\r\n\r\n\tconst hourlyData = useMemo(() => {\r\n\t\tconst map = new Map(data.hourly_chart.map((h) => [h.hour, h]));\r\n\t\treturn Array.from({ length: 24 }, (_, h) => ({\r\n\t\t\thour: `${String(h).padStart(2, \"0\")}`,\r\n\t\t\tanswered: map.get(h)?.answered ?? 0,\r\n\t\t\tabandoned: map.get(h)?.abandoned ?? 0,\r\n\t\t\tagents: map.get(h)?.agents ?? 0,\r\n\t\t}));\r\n\t}, [data.hourly_chart]);\r\n\r\n\tconst downloadChart = () => {\r\n\t\tconst svgEl = chartRef.current?.querySelector(\"svg\");\r\n\t\tif (!svgEl) return;\r\n\t\tconst svgData = new XMLSerializer().serializeToString(svgEl);\r\n\t\tconst canvas = document.createElement(\"canvas\");\r\n\t\tconst img = new Image();\r\n\t\timg.onload = () => {\r\n\t\t\tcanvas.width = img.width;\r\n\t\t\tcanvas.height = img.height;\r\n\t\t\tconst ctx = canvas.getContext(\"2d\");\r\n\t\t\tif (!ctx) return;\r\n\t\t\tctx.fillStyle = \"#fff\";\r\n\t\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\t\t\tctx.drawImage(img, 0, 0);\r\n\t\t\tconst a = document.createElement(\"a\");\r\n\t\t\ta.download = `hourly_chart_${chartDir}.png`;\r\n\t\t\ta.href = canvas.toDataURL(\"image/png\");\r\n\t\t\ta.click();\r\n\t\t};\r\n\t\timg.src = \"data:image/svg+xml;base64,\" + btoa(unescape(encodeURIComponent(svgData)));\r\n\t};\r\n\r\n\treturn (\r\n\t\t<LocalizationProvider dateAdapter={AdapterDayjs}>\r\n\t\t\t<Box sx={{ background: \"transparent\", minHeight: \"100vh\" }}>\r\n\r\n\t\t\t\t{/* ── HEADER ── */}\r\n\t\t\t\t<PageHeader\r\n\t\t\t\t\ttitle=\"Management Dashboard\"\r\n\t\t\t\t\tactions={\r\n\t\t\t\t\t\t<Stack direction=\"row\" spacing={1} alignItems=\"center\">\r\n\t\t\t\t\t\t\t<AppButton\r\n\t\t\t\t\t\t\t\tvariant=\"outlined\"\r\n\t\t\t\t\t\t\t\tstartIcon={<RefreshIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n\t\t\t\t\t\t\t\tonClick={fetchDashboard}\r\n\t\t\t\t\t\t\t\tdisabled={loading}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tRefresh\r\n\t\t\t\t\t\t\t</AppButton>\r\n\t\t\t\t\t\t\t<AppButton\r\n\t\t\t\t\t\t\t\tstartIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\r\n\t\t\t\t\t\t\t\tdisabled={loading || data.totals.total_calls === 0}\r\n\t\t\t\t\t\t\t\tonClick={() => {\r\n\t\t\t\t\t\t\t\t\tconst rows = data.repeated_calls.map((r) => Object.values(r).join(\",\"));\r\n\t\t\t\t\t\t\t\t\tconst csv = [\"Phone,Date,Count,Status,Type,Comments\", ...rows].join(\"\\n\");\r\n\t\t\t\t\t\t\t\t\tconst a = document.createElement(\"a\");\r\n\t\t\t\t\t\t\t\t\ta.href = URL.createObjectURL(new Blob([csv], { type: \"text/csv\" }));\r\n\t\t\t\t\t\t\t\t\ta.download = `mgmt_dashboard_${startDate?.format(\"YYYY-MM-DD\")}.csv`;\r\n\t\t\t\t\t\t\t\t\ta.click();\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\tExport CSV\r\n\t\t\t\t\t\t\t</AppButton>\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{/* ── FILTER BAR ── */}\r\n\t\t\t\t<ReportFilterBar\r\n\t\t\t\t\tstartDate={startDate}\r\n\t\t\t\t\tendDate={endDate}\r\n\t\t\t\t\tonStartChange={setStartDate}\r\n\t\t\t\t\tonEndChange={setEndDate}\r\n\t\t\t\t\tshowTime={false}\r\n\t\t\t\t\tquickRange={quickRange}\r\n\t\t\t\t\tonQuickRangeChange={handleQuickRangeChange}\r\n\t\t\t\t/>\r\n\r\n\t\t\t\t{error && (\r\n\t\t\t\t\t<Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t{loading && (\r\n\t\t\t\t\t<Box sx={{ display: \"flex\", justifyContent: \"center\", py: 5 }}>\r\n\t\t\t\t\t\t<CircularProgress size={36} />\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\r\n\t\t\t\t{!loading && (\r\n\t\t\t\t\t<Box sx={{ px: { xs: 1, md: 2 }, py: 1.5 }}>\r\n\r\n\t\t\t\t\t\t{/* ═══ ROW 1 — 6 stat cards ═══ */}\r\n\t\t\t\t\t\t<Box sx={{\r\n\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\tgridTemplateColumns: { xs: \"1fr\", sm: \"repeat(2, 1fr)\", md: \"repeat(3, 1fr)\", lg: \"1.3fr 1.2fr 1.1fr 0.75fr 1.3fr 1.1fr\" },\r\n\t\t\t\t\t\t\tgap: 1.2,\r\n\t\t\t\t\t\t\tmb: 1.2,\r\n\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t\t<DirectionCard title=\"Inbound Calls\" data={data.inbound} />\r\n\t\t\t\t\t\t\t<QueueCallsCard data={data.queue_calls} />\r\n\t\t\t\t\t\t\t<AbandonedCard data={data.abandoned} />\r\n\t\t\t\t\t\t\t<AvgCallbackCard duration={data.abandoned.avg_callback_duration} />\r\n\t\t\t\t\t\t\t<DirectionCard title=\"Outbound Calls\" data={data.outbound} />\r\n\t\t\t\t\t\t\t<IvrCard data={data.ivr} />\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t{/* ═══ ROW 2 — 4 metric cards ═══ */}\r\n\t\t\t\t\t\t<Box sx={{\r\n\t\t\t\t\t\t\tdisplay: \"grid\",\r\n\t\t\t\t\t\t\tgridTemplateColumns: { xs: \"1fr\", sm: \"repeat(2, 1fr)\", lg: \"1fr 1fr 1.6fr 1.6fr\" },\r\n\t\t\t\t\t\t\tgap: 1.2,\r\n\t\t\t\t\t\t\tmb: 1.2,\r\n\t\t\t\t\t\t}}>\r\n\r\n\t\t\t\t\t\t\t{/* Summary */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Summary</Typography></Box>\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", alignItems: \"baseline\", gap: 0.5, mb: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 22, fontWeight: 800, color: C.navy }}>{data.totals.total_answered.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 14, color: C.t3 }}>/</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontFamily: \"'Barlow Condensed', sans-serif\", fontSize: 22, fontWeight: 800, color: C.t3 }}>{data.totals.total_calls.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, mb: 1 }}>Total Calls</Typography>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ mt: 1 }}>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, mb: 0.3 }}>Call Duration</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", gap: 2 }}>\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\t<Typography sx={{ fontSize: 10, color: C.t3 }}>Highest</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, color: C.blue, fontSize: 13 }}>{data.totals.highest_duration}</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>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 10, color: C.t3 }}>Lowest</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, color: C.blue, fontSize: 13 }}>{data.totals.lowest_duration}</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</Box>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ mt: 1 }}>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3, display: \"inline\" }}>Calls < 30 sec: </Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, color: C.blue, display: \"inline\", fontSize: 13 }}>{data.totals.calls_lt_30sec.toLocaleString()}</Typography>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* Avg Duration */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Avg Total Calls Duration</Typography></Box>\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 1.5 }}>\r\n\t\t\t\t\t\t\t\t\t{[\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Inbound\", value: data.totals.avg_inbound_duration },\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Outbound\", value: data.totals.avg_outbound_duration },\r\n\t\t\t\t\t\t\t\t\t].map(({ label, value }) => (\r\n\t\t\t\t\t\t\t\t\t\t<Box key={label} sx={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\", py: 1, borderBottom: `1px solid ${C.b1}`, \"&:last-child\": { borderBottom: \"none\" } }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 12, fontWeight: 600, color: C.t2 }}>{label}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, fontSize: 16, color: C.blue }}>{value}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* Inbound Avg Waiting */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Inbound Average Waiting</Typography></Box>\r\n\t\t\t\t\t\t\t\t<Box sx={{ p: 1.5, display: \"grid\", gridTemplateColumns: \"1fr 1fr 1fr\", gap: 1, mt: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t{[\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Waiting Time\", value: data.waiting.avg_wait_time },\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Language Selection\", value: data.waiting.avg_lang_selection },\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Queue Waiting\", value: data.waiting.avg_queue_wait },\r\n\t\t\t\t\t\t\t\t\t].map(({ label, value }) => (\r\n\t\t\t\t\t\t\t\t\t\t<Box key={label} sx={{ textAlign: \"center\" }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 10, fontWeight: 600, color: C.t3, mb: 0.5 }}>{label}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ ...monoSx, fontSize: 18, color: C.blue }}>{value}</Typography>\r\n\t\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* CHT Table */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}><Typography sx={labelSx}>Average CHT</Typography></Box>\r\n\t\t\t\t\t\t\t\t<TableContainer>\r\n\t\t\t\t\t\t\t\t\t<Table size=\"small\">\r\n\t\t\t\t\t\t\t\t\t\t<TableHead>\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\t\t<TableCell sx={headSx}>Call Type</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Call Handling Time</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Talk Duration</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Hold Duration</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</TableHead>\r\n\t\t\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t\t\t{data.cht.length === 0 && (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow><TableCell colSpan={4} sx={{ textAlign: \"center\", py: 2, color: C.t3, fontSize: 12 }}>No data</TableCell></TableRow>\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{data.cht.map((row) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow key={row.call_type} hover>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontWeight: 600, color: C.t2 }}>{row.call_type}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, color: C.blue }}>{row.call_handling_time}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, color: C.blue }}>{row.talk_duration}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, color: C.blue }}>{row.hold_duration}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableRow>\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</TableBody>\r\n\t\t\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t\t\t</TableContainer>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t\t{/* ═══ ROW 3 — Chart + Repeated Calls ═══ */}\r\n\t\t\t\t\t\t<Box sx={{ display: \"grid\", gridTemplateColumns: { xs: \"1fr\", lg: \"1fr 1fr\" }, gap: 1.2 }}>\r\n\r\n\t\t\t\t\t\t\t{/* Hourly Chart */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={{ ...cardHeader, flexWrap: \"wrap\", gap: 1 }}>\r\n\t\t\t\t\t\t\t\t\t<Box>\r\n\t\t\t\t\t\t\t\t\t\t<Typography sx={labelSx}>Avg Hour Wise Inbound Calls vs Agents</Typography>\r\n\t\t\t\t\t\t\t\t\t\t<Stack direction=\"row\" spacing={1.5} sx={{ mt: 0.5 }}>\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{ color: \"#f6a623\", label: \"Answered\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ color: \"#90a4c0\", label: \"Abandoned\" },\r\n\t\t\t\t\t\t\t\t\t\t\t\t{ color: \"#4a5568\", label: \"Agents\" },\r\n\t\t\t\t\t\t\t\t\t\t\t].map(({ color, label }) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<Box key={label} sx={{ display: \"flex\", alignItems: \"center\", gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Box sx={{ width: 12, height: 12, borderRadius: \"2px\", background: color }} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Typography sx={{ fontSize: 11, color: C.t3 }}>{label}</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))}\r\n\t\t\t\t\t\t\t\t\t\t</Stack>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t\t<Box sx={{ display: \"flex\", flexDirection: \"column\", alignItems: \"flex-end\", gap: 0.5 }}>\r\n\t\t\t\t\t\t\t\t\t\t<RadioGroup row value={chartDir} onChange={(e) => setChartDir(e.target.value as \"inbound\" | \"outbound\")}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{ \"& .MuiFormControlLabel-root\": { mr: 0.5 }, \"& .MuiFormControlLabel-label\": { fontSize: 12 } }}>\r\n\t\t\t\t\t\t\t\t\t\t\t<FormControlLabel value=\"inbound\" control={<Radio size=\"small\" />} label=\"Inbound\" />\r\n\t\t\t\t\t\t\t\t\t\t\t<FormControlLabel value=\"outbound\" control={<Radio size=\"small\" />} label=\"Outbound\" />\r\n\t\t\t\t\t\t\t\t\t\t</RadioGroup>\r\n\t\t\t\t\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\t\t\t\t\tonClick={downloadChart}\r\n\t\t\t\t\t\t\t\t\t\t\tsx={{ fontSize: 11, color: \"#3182ce\", cursor: \"pointer\", border: \"1px solid #bee3f8\", borderRadius: \"4px\", px: 1, py: 0.3 }}\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⬇ DOWNLOAD\r\n\t\t\t\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t<Box ref={chartRef} sx={{ p: 1.5, height: 260 }}>\r\n\t\t\t\t\t\t\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\r\n\t\t\t\t\t\t\t\t\t\t<ComposedChart data={hourlyData} margin={{ top: 4, right: 30, left: -20, bottom: 0 }} barGap={1}>\r\n\t\t\t\t\t\t\t\t\t\t\t<CartesianGrid strokeDasharray=\"3 3\" stroke={C.b2} vertical={false} />\r\n\t\t\t\t\t\t\t\t\t\t\t<XAxis dataKey=\"hour\" tick={{ fontSize: 9, fill: C.t3 }} interval={1} />\r\n\t\t\t\t\t\t\t\t\t\t\t<YAxis yAxisId=\"left\" tick={{ fontSize: 9, fill: C.t3 }} />\r\n\t\t\t\t\t\t\t\t\t\t\t<YAxis yAxisId=\"right\" orientation=\"right\" tick={{ fontSize: 9, fill: C.t3 }} />\r\n\t\t\t\t\t\t\t\t\t\t\t<RTooltip\r\n\t\t\t\t\t\t\t\t\t\t\t\tcontentStyle={{ fontSize: 11, borderRadius: 6, border: `1px solid ${C.b2}` }}\r\n\t\t\t\t\t\t\t\t\t\t\t\tformatter={(v, n: string) => [v, n.charAt(0).toUpperCase() + n.slice(1)]}\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<Bar yAxisId=\"left\" dataKey=\"answered\" fill=\"#f6a623\" radius={[2, 2, 0, 0]} maxBarSize={14} />\r\n\t\t\t\t\t\t\t\t\t\t\t<Bar yAxisId=\"left\" dataKey=\"abandoned\" fill=\"#90a4c0\" radius={[2, 2, 0, 0]} maxBarSize={14} />\r\n\t\t\t\t\t\t\t\t\t\t\t<Line yAxisId=\"right\" type=\"monotone\" dataKey=\"agents\" stroke=\"#4a5568\" strokeWidth={1.5} dot={{ r: 2, fill: \"#4a5568\" }} />\r\n\t\t\t\t\t\t\t\t\t\t</ComposedChart>\r\n\t\t\t\t\t\t\t\t\t</ResponsiveContainer>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t\t{/* Repeated Calls Table */}\r\n\t\t\t\t\t\t\t<Paper sx={cardPaper}>\r\n\t\t\t\t\t\t\t\t<Box sx={cardHeader}>\r\n\t\t\t\t\t\t\t\t\t<Typography sx={labelSx}>Repeated Calls</Typography>\r\n\t\t\t\t\t\t\t\t\t<Chip label={data.repeated_calls.length} size=\"small\" sx={{ background: C.rlt, color: C.red, fontWeight: 700, fontSize: 11 }} />\r\n\t\t\t\t\t\t\t\t</Box>\r\n\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<TextField\r\n\t\t\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search…\"\r\n\t\t\t\t\t\t\t\t\t\tvalue={repeatedSearch}\r\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setRepeatedSearch(e.target.value)}\r\n\t\t\t\t\t\t\t\t\t\tfullWidth\r\n\t\t\t\t\t\t\t\t\t\tslotProps={{ input: { startAdornment: <InputAdornment position=\"start\"><SearchIcon sx={{ fontSize: 16, color: C.t3 }} /></InputAdornment> } }}\r\n\t\t\t\t\t\t\t\t\t\tsx={{ \"& .MuiInputBase-root\": { fontSize: 12 } }}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t<TableContainer sx={{ maxHeight: 260, overflow: \"auto\" }}>\r\n\t\t\t\t\t\t\t\t\t<Table size=\"small\" stickyHeader>\r\n\t\t\t\t\t\t\t\t\t\t<TableHead>\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\t\t<TableCell sx={headSx}>Phone Number</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Date</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>No of Calls</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Latest Status</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Latest Call Type</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={headSx}>Comments</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</TableHead>\r\n\t\t\t\t\t\t\t\t\t\t<TableBody>\r\n\t\t\t\t\t\t\t\t\t\t\t{filteredRepeated.length === 0 && (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow><TableCell colSpan={6} sx={{ textAlign: \"center\", py: 2, color: C.t3, fontSize: 12 }}>No repeated calls</TableCell></TableRow>\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{filteredRepeated.map((r) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<TableRow key={`${r.phone_number}-${r.date}`} hover>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, ...monoSx, fontSize: 11 }}>{r.phone_number}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11 }}>{r.date}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontWeight: 700, color: C.navy, fontSize: 13 }}>{r.call_count}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11, fontWeight: 600, color: statusColor(r.latest_status) }}>{r.latest_status}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11 }}>{r.latest_call_type}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<TableCell sx={{ ...cellSx, fontSize: 11, color: C.t3 }}>{r.comments}</TableCell>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</TableRow>\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</TableBody>\r\n\t\t\t\t\t\t\t\t\t</Table>\r\n\t\t\t\t\t\t\t\t</TableContainer>\r\n\t\t\t\t\t\t\t</Paper>\r\n\r\n\t\t\t\t\t\t</Box>\r\n\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\t\t</LocalizationProvider>\r\n\t);\r\n}\r\n\r\nconst ManagementDashboard: React.FC = () => (\r\n\t<SDKProvider>\r\n\t\t<ManagementDashboardContent />\r\n\t</SDKProvider>\r\n);\r\n\r\nexport default ManagementDashboard;\r\n","import axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { MgmtDashboardParams, MgmtDashboardResponse } from \"./types\";\r\n\r\nfunction buildQs(params: MgmtDashboardParams): 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 != null) qs.append(\"agent_id\", String(params.agent_id));\r\n\tconst str = qs.toString();\r\n\treturn str ? `?${str}` : \"\";\r\n}\r\n\r\nexport async function getManagementDashboard(params: MgmtDashboardParams): Promise<MgmtDashboardResponse> {\r\n\tconst res = await axiosInstance.get<MgmtDashboardResponse>(\r\n\t\t`${END_POINT.MANAGEMENT_DASHBOARD}${buildQs(params)}`,\r\n\t);\r\n\treturn res.data;\r\n}\r\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
agentDetailReport_default
|
|
3
|
-
} from "./chunk-BDQZYTAY.mjs";
|
|
4
|
-
import "./chunk-JOZ4YQMR.mjs";
|
|
5
|
-
import "./chunk-HBR2JS4C.mjs";
|
|
6
|
-
import "./chunk-AJQBR3AZ.mjs";
|
|
7
|
-
import "./chunk-6ICPXSN6.mjs";
|
|
8
|
-
import "./chunk-OVC42HVH.mjs";
|
|
9
|
-
import "./chunk-UB5HSUGK.mjs";
|
|
10
|
-
export {
|
|
11
|
-
agentDetailReport_default as default
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=agentDetailReport-JYBV3TF6.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/agentPerformanceReport/index.tsx","../call-control-sdk/lib/pages/agentPerformanceReport/useAgentPerformanceReport.ts"],"sourcesContent":["import React, { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport {\n Box, Paper, Table, TableBody, TableCell, TableContainer, TableHead,\n TableRow, TableSortLabel, TablePagination, CircularProgress, Alert,\n Stack, IconButton, Tooltip,\n} from \"@mui/material\";\nimport AppButton from \"../common/components/AppButton\";\nimport FileDownloadIcon from \"@mui/icons-material/FileDownload\";\nimport RefreshIcon from \"@mui/icons-material/Refresh\";\nimport VisibilityIcon from \"@mui/icons-material/Visibility\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport isoWeek from \"dayjs/plugin/isoWeek\";\nimport { LocalizationProvider } from \"@mui/x-date-pickers/LocalizationProvider\";\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\n\ndayjs.extend(isoWeek);\n\nimport {\n fetchQueues, fetchProcesses,\n getUserPerformanceReportPaged, validateReportPayload, exportAgentPerformanceToExcel,\n type Queue,\n} from \"./useAgentPerformanceReport\";\nimport type { AgentPerfReportParams, ReportData, ReportRequestPayload } from \"./types\";\nimport { type AgentOption } from \"../common/components/AgentMultiSelect\";\nimport ReportFilterBar, { type QuickRange, type ProcessOption } from \"../common/components/ReportFilterBar\";\nimport { headCellSx as headSx, sortLabelSx, reportBodyCellSx as bodySx } from \"../common/utils/tableStyles\";\nimport PageHeader from \"../common/components/PageHeader\";\nimport SearchBar from \"../common/components/SearchBar\";\n\nimport { SDKProvider } from \"../../components/SDKProvider\";\nimport { SDKPermissionGuard } from \"../../components/SDKPermissionGuard\";\nimport { SDK_PERMISSIONS } from \"../../permissions/sdk-constants\";\nimport AgentDetailReport from \"../agentDetailReport\";\n\nconst C = {\n navy: \"#0d2a56\", blue: \"#1565c8\", green: \"#0a9a62\", amber: \"#c47c00\",\n red: \"#cc2a2a\", purple: \"#6b3fbf\", teal: \"#0b7a8f\",\n bg: \"transparent\", surface: \"#fff\", s2: \"#f7f9fc\", s3: \"#eef2f7\",\n b1: \"rgba(20,50,100,.07)\", b2: \"rgba(20,50,100,.13)\",\n t1: \"#0d1e35\", t2: \"#364f6e\", t3: \"#7a93b5\", t4: \"#bccad9\",\n blt: \"#e8f0fc\", glt: \"#e4f6ef\", alt: \"#fdf3e0\", rlt: \"#fde8e8\",\n plt: \"#f0eafa\", tlt: \"#e3f4f7\",\n};\n\ntype Order = \"asc\" | \"desc\";\ntype SortKey = string;\n\nfunction parseDur(d: string): number {\n if (!d || d === \"00:00:00\") return 0;\n const p = d.split(\":\").map(Number);\n if (p.length === 3) return p[0] * 3600 + p[1] * 60 + p[2];\n if (p.length === 2) return p[0] * 60 + p[1];\n return 0;\n}\n\nfunction fmtDur(s: number): string {\n if (!s || s <= 0) return \"00:00:00\";\n const h = Math.floor(s / 3600);\n const m = Math.floor((s % 3600) / 60);\n const sc = Math.floor(s % 60);\n return [h, m, sc].map((x) => String(x).padStart(2, \"0\")).join(\":\");\n}\n\nfunction getVal(row: ReportData, key: string): any {\n switch (key) {\n case \"id\": return row.agentDetails?.agentId || \"\";\n case \"name\": return row.agentDetails?.fullName || \"\";\n case \"process\": return row.agentDetails?.process || \"\";\n case \"queue\": return row.agentDetails?.queueNames || \"\";\n case \"total\": return row.calls?.totalCalls ?? 0;\n case \"ans\": return row.calls?.answered ?? 0;\n case \"miss\": return row.calls?.missed ?? 0;\n case \"inTotal\": return row.inCalls?.total ?? 0;\n case \"outTotal\": return row.outCalls?.total ?? 0;\n case \"aht\": return parseDur(row.average?.aht || \"00:00:00\");\n case \"loginDur\": return parseDur(row.loginDetails?.loggedInDuration || \"00:00:00\");\n case \"talk\": return parseDur(row.loginDetails?.talkTime || \"00:00:00\");\n case \"hold\": return parseDur(row.average?.holdTime || \"00:00:00\");\n case \"wrapup\": return parseDur(row.average?.wrapUp || \"00:00:00\");\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\");\n case \"idle\": return parseDur(row.loginDetails?.idleTime || \"00:00:00\");\n case \"adherence\": return row.adherence?.pct ?? null;\n case \"firstLogin\": return row.loginStats?.firstLogin || \"\";\n default: return \"\";\n }\n}\n\ninterface ColDef { key: string; label: string; group: string; fmt?: (row: ReportData) => any; align?: \"left\" | \"right\" | \"center\"; }\n\nconst COLUMNS: ColDef[] = [\n { key: \"id\", label: \"User ID\", group: \"Agent\" },\n { key: \"name\", label: \"Full Name\", group: \"Agent\" },\n { key: \"queue\", label: \"Queues\", group: \"Agent\" },\n { key: \"total\", label: \"Total Calls\", group: \"Calls\", align: \"right\" },\n { key: \"ans\", label: \"Answered\", group: \"Calls\", align: \"right\" },\n { key: \"miss\", label: \"Missed\", group: \"Calls\", align: \"right\" },\n { key: \"inTotal\", label: \"Inbound\", group: \"Calls\", align: \"right\" },\n { key: \"outTotal\", label: \"Outbound\", group: \"Calls\", align: \"right\" },\n { key: \"aht\", label: \"AHT\", group: \"Time\", align: \"right\" },\n { key: \"loginDur\", label: \"Login Dur\", group: \"Time\", align: \"right\" },\n { key: \"talk\", label: \"Talk Time\", group: \"Time\", align: \"right\" },\n { key: \"hold\", label: \"Hold Time\", group: \"Time\", align: \"right\" },\n { key: \"wrapup\", label: \"Wrapup Time\", group: \"Time\", align: \"right\" },\n { key: \"breakTime\", label: \"Break Time\", group: \"Breaks\", align: \"right\" },\n { key: \"idle\", label: \"Idle Time\", group: \"Time\", align: \"right\" },\n { key: \"firstLogin\", label: \"First Login\", group: \"Login\" },\n { key: \"adherence\", label: \"Adherence %\", group: \"Agent\", align: \"right\" },\n];\n\nfunction AgentPerformanceReportContent() {\n const [startDate, setStartDate] = useState<Dayjs | null>(dayjs().startOf(\"day\"));\n const [endDate, setEndDate] = useState<Dayjs | null>(dayjs());\n const [quickRange, setQuickRange] = useState<string>(\"today\");\n const [selectedUsers, setSelectedUsers] = useState<AgentOption[]>([]);\n const [isAllUsersSelected, setIsAllUsersSelected] = useState(false);\n const [processes, setProcesses] = useState<ProcessOption[]>([]);\n const [process, setProcess] = useState(\"\");\n const [search, setSearch] = useState(\"\");\n const [loginUsersOnly] = useState(true);\n\n const [queues, setQueues] = useState<Queue[]>([]);\n const [selectedQueues, setSelectedQueues] = useState<Queue[]>([]);\n\n const [data, setData] = useState<ReportData[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [selectedAgent, setSelectedAgent] = useState<ReportData | null>(null);\n\n const [orderBy, setOrderBy] = useState<SortKey>(\"total\");\n const [order, setOrder] = useState<Order>(\"desc\");\n const [page, setPage] = useState(0);\n const [rowsPerPage, setRowsPerPage] = useState(10);\n const [totalCount, setTotalCount] = useState(-1);\n const [visibleCols] = useState<Set<string>>(new Set(COLUMNS.map((c) => c.key)));\n\n // Debounced search (sent to the server)\n const [debouncedSearch, setDebouncedSearch] = useState(\"\");\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => {\n debounceRef.current = setTimeout(() => setDebouncedSearch(search.trim()), 400);\n return () => clearTimeout(debounceRef.current);\n }, [search]);\n\n useEffect(() => {\n fetchProcesses().then((p) => {\n const mapped = p.map((x) => ({ label: x.name, value: x.name }));\n setProcesses(mapped);\n if (mapped.length) setProcess(mapped[0].value);\n }).catch(() => { });\n fetchQueues().then((data) => setQueues(data || [])).catch(() => { });\n }, []);\n\n const handleQuickRangeChange = (range: QuickRange) => {\n setQuickRange(range);\n };\n\n const handleRefresh = () => {\n if (quickRange === \"today\" || quickRange === \"week\" || quickRange === \"month\") {\n const now = dayjs();\n let sd = now.startOf(\"day\");\n const ed = now;\n if (quickRange === \"week\") sd = now.startOf(\"week\").startOf(\"day\");\n else if (quickRange === \"month\") sd = now.startOf(\"month\").startOf(\"day\");\n // Setting the dates re-triggers the auto-fetch effect below.\n setStartDate(sd);\n setEndDate(ed);\n } else {\n fetchReport(page);\n }\n };\n\n const fetchReport = useCallback(async (pageNum: number) => {\n const fromDate = startDate;\n const toDate = endDate;\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\n\n const payload: ReportRequestPayload = {\n startDate: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n endDate: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n startTime: fromDate.format(\"HH:mm:ss\"),\n endTime: toDate.format(\"HH:mm:ss\"),\n process,\n agents: isAllUsersSelected ? [] : selectedUsers.map((u) => u.userId),\n loginUsersOnly,\n queueIds: selectedQueues.length > 0 && selectedQueues.length < queues.length ? selectedQueues.map((q) => q.id) : undefined,\n search: debouncedSearch || undefined,\n page: pageNum + 1,\n pageSize: rowsPerPage,\n };\n\n const valid = validateReportPayload(payload);\n if (!valid.isValid) { setError(valid.error || \"Invalid\"); return; }\n\n try {\n setLoading(true);\n setError(\"\");\n const { rows, total } = await getUserPerformanceReportPaged(payload);\n setData(rows);\n setTotalCount(typeof total === \"number\" ? total : rows.length);\n } catch (err: any) {\n setError(err?.message || \"Failed to fetch report\");\n setData([]);\n } finally {\n setLoading(false);\n }\n }, [startDate, endDate, process, selectedUsers, isAllUsersSelected, selectedQueues, loginUsersOnly, debouncedSearch, rowsPerPage]);\n\n useEffect(() => {\n setPage(0);\n fetchReport(0);\n }, [fetchReport]);\n\n const handlePageChange = useCallback(\n (_event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\n setPage(newPage);\n fetchReport(newPage);\n },\n [fetchReport],\n );\n\n // Search + paging are server-side; sorting is applied client-side to the current page.\n const sorted = useMemo(() => {\n return [...data].sort((a, b) => {\n const av = getVal(a, orderBy);\n const bv = getVal(b, orderBy);\n if (typeof av === \"number\" && typeof bv === \"number\") return order === \"asc\" ? av - bv : bv - av;\n return order === \"asc\" ? String(av).localeCompare(String(bv)) : String(bv).localeCompare(String(av));\n });\n }, [data, orderBy, order]);\n\n const paged = sorted;\n\n const handleSort = (key: string) => {\n setOrder(orderBy === key && order === \"asc\" ? \"desc\" : \"asc\");\n setOrderBy(key);\n };\n\n const handleExportExcel = async () => {\n const fromDate = startDate;\n const toDate = endDate;\n if (!fromDate || !toDate) { setError(\"Select date range\"); return; }\n const params: AgentPerfReportParams = {\n start_date: fromDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n end_date: toDate.format(\"YYYY-MM-DDTHH:mm:ss\"),\n agent_id: !isAllUsersSelected && selectedUsers.length > 0\n ? selectedUsers.map((u) => u.userId)\n : undefined,\n queue_id: selectedQueues.length > 0 && selectedQueues.length < queues.length\n ? selectedQueues.map((q) => q.id)\n : undefined,\n search: debouncedSearch || undefined,\n };\n try {\n await exportAgentPerformanceToExcel(params);\n } catch (err: any) {\n setError(err?.message || \"Failed to export Excel\");\n }\n };\n\n const renderCellValue = (row: ReportData, col: ColDef) => {\n const v = getVal(row, col.key);\n const durKeys = [\"aht\", \"loginDur\", \"talk\", \"hold\", \"wrapup\", \"breakTime\", \"idle\"];\n if (durKeys.includes(col.key)) return fmtDur(v);\n if (col.key === \"adherence\") return v != null ? `${v}%` : \"—\";\n if (col.key === \"firstLogin\") return v ? dayjs(v).format(\"DD MMM YYYY hh:mm A\") : \"\";\n return v ?? \"\";\n };\n\n const activeCols = COLUMNS.filter((c) => visibleCols.has(c.key));\n\n if (selectedAgent) {\n return (\n <AgentDetailReport\n agentRow={selectedAgent}\n onBack={() => setSelectedAgent(null)}\n initialStartDate={startDate}\n initialEndDate={endDate}\n initialQuickRange={quickRange}\n from=\"REPORTS_LIST\"\n />\n );\n }\n\n return (\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n <Box sx={{ background: C.bg, minHeight: \"100vh\" }}>\n <PageHeader\n title=\" Performance Report\"\n actions={\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n <SearchBar\n value={search}\n onChange={setSearch}\n placeholder=\"Search name, ID...\"\n width={250}\n />\n <SDKPermissionGuard\n permissions={[SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_EXPORT, SDK_PERMISSIONS.REPORTS_AGENT_PERFORMANCE_MANAGE]}\n showFallback={false}\n >\n <AppButton\n startIcon={<FileDownloadIcon sx={{ fontSize: \"0.95rem !important\" }} />}\n disabled={!data.length}\n onClick={handleExportExcel}\n sx={{ height: 36 }}\n >\n Export Excel\n </AppButton>\n </SDKPermissionGuard>\n </Stack>\n }\n />\n\n <ReportFilterBar\n startDate={startDate}\n endDate={endDate}\n onStartChange={setStartDate}\n onEndChange={setEndDate}\n quickRange={quickRange}\n onQuickRangeChange={handleQuickRangeChange}\n showAgentSelect\n selectedAgents={selectedUsers}\n onAgentsChange={setSelectedUsers}\n setIsAllUsersSelected={setIsAllUsersSelected}\n showQueueSelect\n queues={queues}\n selectedQueues={selectedQueues}\n onQueuesChange={setSelectedQueues}\n showProcessSelect\n processes={processes}\n selectedProcess={process}\n onProcessChange={setProcess}\n extra={\n <AppButton\n startIcon={<RefreshIcon sx={{ fontSize: \"0.9rem !important\" }} />}\n disabled={loading}\n onClick={handleRefresh}\n sx={{ height: 32 }}\n >\n Refresh\n </AppButton>\n }\n />\n\n {error && <Alert severity=\"error\" sx={{ mx: 2.5, mt: 1.5 }} onClose={() => setError(\"\")}>{error}</Alert>}\n\n <Box sx={{ py: 2, px: 1, overflow: \"auto\", position: \"relative\" }}>\n {loading && (\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 }}>\n <CircularProgress />\n </Box>\n )}\n\n <Paper elevation={0} sx={{ borderRadius: \"8px\", border: \"1px solid #e0e7ef\", overflow: \"hidden\", mb: 2 }}>\n <TableContainer>\n <Table size=\"small\" sx={{\n minWidth: 1400,\n \"& .MuiTableCell-root\": { fontSize: \"0.75rem\", borderBottom: \"1px solid #eef1f6\", py: 0.6, px: 1 },\n }}>\n <TableHead>\n <TableRow>\n {activeCols.map((col) => (\n <TableCell key={col.key} align={col.align || \"left\"} sx={headSx}>\n <TableSortLabel active={orderBy === col.key} direction={orderBy === col.key ? order : \"asc\"} onClick={() => handleSort(col.key)} sx={sortLabelSx}>\n {col.label}\n </TableSortLabel>\n </TableCell>\n ))}\n <TableCell sx={{ ...headSx, width: 48 }}>Detail</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {paged.map((row, idx) => (\n <TableRow key={idx} hover onClick={() => setSelectedAgent(row)} sx={{\n backgroundColor: \"#fff\",\n \"&:hover\": { backgroundColor: \"#f0f7f8\" },\n cursor: \"pointer\",\n }}>\n {activeCols.map((col) => (\n <TableCell key={col.key} align={col.align || \"left\"} sx={bodySx}>\n {renderCellValue(row, col)}\n </TableCell>\n ))}\n <TableCell sx={bodySx} align=\"center\">\n <IconButton size=\"small\" onClick={(e) => { e.stopPropagation(); setSelectedAgent(row); }} sx={{ color: C.blue }}>\n <VisibilityIcon sx={{ fontSize: 16 }} />\n </IconButton>\n </TableCell>\n </TableRow>\n ))}\n {paged.length === 0 && (\n <TableRow><TableCell colSpan={activeCols.length + 1} sx={{ textAlign: \"center\", py: 4, color: C.t3, fontSize: 13 }}>No data found</TableCell></TableRow>\n )}\n </TableBody>\n </Table>\n </TableContainer>\n\n <TablePagination\n component=\"div\" count={totalCount} page={page}\n onPageChange={handlePageChange} rowsPerPage={rowsPerPage}\n onRowsPerPageChange={(e) => { setRowsPerPage(parseInt(e.target.value, 10)); setPage(0); }}\n rowsPerPageOptions={[10, 15, 25, 50, 100]}\n sx={{ borderTop: \"1px solid #eef1f6\", \"& .MuiTablePagination-displayedRows\": { fontSize: \"0.73rem\" }, \"& .MuiTablePagination-selectLabel\": { fontSize: \"0.73rem\" } }}\n />\n </Paper>\n </Box>\n </Box>\n </LocalizationProvider>\n );\n}\n\nconst AgentPerformanceReport: React.FC = () => (\n <SDKProvider>\n <AgentPerformanceReportContent />\n </SDKProvider>\n);\n\nexport default AgentPerformanceReport;\n","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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/callHistory/index.tsx","../call-control-sdk/lib/pages/common/components/Transcript.tsx","../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","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"]}
|