ahs-cti 1.0.0-beta.2 → 1.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +639 -639
- package/dist/callHistory-TZ7SSXSN.mjs +339 -0
- package/dist/callHistory-TZ7SSXSN.mjs.map +1 -0
- package/dist/chunk-6AM6THQM.mjs +920 -0
- package/dist/chunk-6AM6THQM.mjs.map +1 -0
- package/dist/index.d.mts +490 -4
- package/dist/index.d.ts +491 -4
- package/dist/index.js +2580 -1418
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1469 -1637
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import {
|
|
2
|
+
END_POINT,
|
|
3
|
+
SDKProvider,
|
|
4
|
+
__spreadProps,
|
|
5
|
+
__spreadValues,
|
|
6
|
+
axios_default,
|
|
7
|
+
useToast
|
|
8
|
+
} from "./chunk-6AM6THQM.mjs";
|
|
9
|
+
|
|
10
|
+
// call-control-sdk/lib/pages/callHistory/index.tsx
|
|
11
|
+
import { memo, useEffect, useState as useState2 } from "react";
|
|
12
|
+
import {
|
|
13
|
+
Box,
|
|
14
|
+
Typography,
|
|
15
|
+
Table,
|
|
16
|
+
TableBody,
|
|
17
|
+
TableCell,
|
|
18
|
+
TableContainer,
|
|
19
|
+
TableHead,
|
|
20
|
+
TableRow,
|
|
21
|
+
ToggleButton,
|
|
22
|
+
ToggleButtonGroup,
|
|
23
|
+
IconButton,
|
|
24
|
+
Collapse,
|
|
25
|
+
CircularProgress,
|
|
26
|
+
Chip,
|
|
27
|
+
Stack,
|
|
28
|
+
Switch,
|
|
29
|
+
FormControlLabel,
|
|
30
|
+
Tooltip,
|
|
31
|
+
InputAdornment,
|
|
32
|
+
OutlinedInput,
|
|
33
|
+
useTheme,
|
|
34
|
+
Paper
|
|
35
|
+
} from "@mui/material";
|
|
36
|
+
import {
|
|
37
|
+
KeyboardArrowDown,
|
|
38
|
+
PlayArrow,
|
|
39
|
+
ExpandLess,
|
|
40
|
+
Search,
|
|
41
|
+
Phone
|
|
42
|
+
} from "@mui/icons-material";
|
|
43
|
+
|
|
44
|
+
// call-control-sdk/lib/pages/callHistory/useCallHistory.ts
|
|
45
|
+
import { useState, useCallback } from "react";
|
|
46
|
+
function useCallHistory() {
|
|
47
|
+
const [calls, setCalls] = useState([]);
|
|
48
|
+
const [missedCalls, setMissedCalls] = useState([]);
|
|
49
|
+
const [loading, setLoading] = useState(false);
|
|
50
|
+
const fetchCallHistory = useCallback(async () => {
|
|
51
|
+
var _a;
|
|
52
|
+
setLoading(true);
|
|
53
|
+
try {
|
|
54
|
+
const res = await axios_default.post(END_POINT.CALLS_HISTORY, {});
|
|
55
|
+
setCalls(Array.isArray((_a = res.data) == null ? void 0 : _a.records) ? res.data.records : []);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
setCalls([]);
|
|
58
|
+
} finally {
|
|
59
|
+
setLoading(false);
|
|
60
|
+
}
|
|
61
|
+
}, []);
|
|
62
|
+
const fetchMissedCalls = useCallback(async () => {
|
|
63
|
+
var _a;
|
|
64
|
+
setLoading(true);
|
|
65
|
+
try {
|
|
66
|
+
const res = await axios_default.get(END_POINT.MISSED_CALLS);
|
|
67
|
+
setMissedCalls(Array.isArray((_a = res.data) == null ? void 0 : _a.data) ? res.data.data : []);
|
|
68
|
+
} catch (e) {
|
|
69
|
+
setMissedCalls([]);
|
|
70
|
+
} finally {
|
|
71
|
+
setLoading(false);
|
|
72
|
+
}
|
|
73
|
+
}, []);
|
|
74
|
+
const fetchRecording = useCallback(async (call_uuid) => {
|
|
75
|
+
const res = await axios_default.get(END_POINT.RECORDING_BY_CALL(call_uuid), {
|
|
76
|
+
responseType: "blob"
|
|
77
|
+
});
|
|
78
|
+
return res.data;
|
|
79
|
+
}, []);
|
|
80
|
+
return {
|
|
81
|
+
calls,
|
|
82
|
+
missedCalls,
|
|
83
|
+
loading,
|
|
84
|
+
fetchCallHistory,
|
|
85
|
+
fetchMissedCalls,
|
|
86
|
+
fetchRecording
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// call-control-sdk/lib/pages/callHistory/index.tsx
|
|
91
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
92
|
+
var CALL_HISTORY_COLS = ["Call UID", "Mobile", "Type", "Start Time", "End Time", "Recording", "Agent", "Details"];
|
|
93
|
+
var MISSED_CALLS_COLS = ["Agent ID", "Agent Name", "Mobile No", "Type", "Actions"];
|
|
94
|
+
var CENTER_COLS = /* @__PURE__ */ new Set(["Type", "Recording", "Agent", "Details", "Actions"]);
|
|
95
|
+
var CallHistoryContent = memo(() => {
|
|
96
|
+
const theme = useTheme();
|
|
97
|
+
const { showToast } = useToast();
|
|
98
|
+
const { calls, missedCalls, loading, fetchCallHistory, fetchMissedCalls, fetchRecording } = useCallHistory();
|
|
99
|
+
const [filter, setFilter] = useState2("ALL");
|
|
100
|
+
const [search, setSearch] = useState2("");
|
|
101
|
+
const [showMissedCalls, setShowMissedCalls] = useState2(false);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (showMissedCalls) {
|
|
104
|
+
fetchMissedCalls();
|
|
105
|
+
} else {
|
|
106
|
+
fetchCallHistory();
|
|
107
|
+
}
|
|
108
|
+
}, [showMissedCalls, fetchCallHistory, fetchMissedCalls]);
|
|
109
|
+
const filteredCalls = calls.filter((c) => filter === "ALL" || c.call_type === filter).filter((c) => c.mobile_no.toLowerCase().includes(search.toLowerCase()));
|
|
110
|
+
const filteredMissedCalls = missedCalls.filter((c) => {
|
|
111
|
+
var _a;
|
|
112
|
+
return filter === "ALL" || ((_a = c.callType) == null ? void 0 : _a.toUpperCase()) === filter;
|
|
113
|
+
}).filter((c) => {
|
|
114
|
+
var _a, _b, _c;
|
|
115
|
+
const q = search.toLowerCase();
|
|
116
|
+
return ((_a = c.agentId) == null ? void 0 : _a.toLowerCase().includes(q)) || ((_b = c.username) == null ? void 0 : _b.toLowerCase().includes(q)) || ((_c = c.mobileNumber) == null ? void 0 : _c.toLowerCase().includes(q));
|
|
117
|
+
});
|
|
118
|
+
return /* @__PURE__ */ jsxs(Box, { children: [
|
|
119
|
+
/* @__PURE__ */ jsxs(
|
|
120
|
+
Box,
|
|
121
|
+
{
|
|
122
|
+
display: "flex",
|
|
123
|
+
alignItems: "center",
|
|
124
|
+
justifyContent: "space-between",
|
|
125
|
+
px: 2,
|
|
126
|
+
py: 1.5,
|
|
127
|
+
borderBottom: "1px solid #eee",
|
|
128
|
+
children: [
|
|
129
|
+
/* @__PURE__ */ jsx(Typography, { fontWeight: 700, fontSize: "1rem", children: "Call History" }),
|
|
130
|
+
/* @__PURE__ */ jsx(
|
|
131
|
+
OutlinedInput,
|
|
132
|
+
{
|
|
133
|
+
size: "small",
|
|
134
|
+
value: search,
|
|
135
|
+
onChange: (e) => setSearch(e.target.value),
|
|
136
|
+
placeholder: "Search",
|
|
137
|
+
sx: { width: 220, fontSize: "0.82rem", height: 36 },
|
|
138
|
+
endAdornment: /* @__PURE__ */ jsx(InputAdornment, { position: "end", children: /* @__PURE__ */ jsx(Search, { sx: { fontSize: 18, color: "#999" } }) })
|
|
139
|
+
}
|
|
140
|
+
)
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
),
|
|
144
|
+
/* @__PURE__ */ jsxs(Box, { py: 1.5, px: 2, children: [
|
|
145
|
+
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 2, alignItems: "center", mb: 2, children: [
|
|
146
|
+
/* @__PURE__ */ jsx(
|
|
147
|
+
FormControlLabel,
|
|
148
|
+
{
|
|
149
|
+
control: /* @__PURE__ */ jsx(
|
|
150
|
+
Switch,
|
|
151
|
+
{
|
|
152
|
+
size: "small",
|
|
153
|
+
checked: showMissedCalls,
|
|
154
|
+
onChange: (_, checked) => setShowMissedCalls(checked)
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
label: /* @__PURE__ */ jsx(Typography, { sx: { fontSize: "0.8rem", color: "#555" }, children: "Missed Calls" }),
|
|
158
|
+
sx: { ml: 0 }
|
|
159
|
+
}
|
|
160
|
+
),
|
|
161
|
+
/* @__PURE__ */ jsxs(
|
|
162
|
+
ToggleButtonGroup,
|
|
163
|
+
{
|
|
164
|
+
value: filter,
|
|
165
|
+
exclusive: true,
|
|
166
|
+
onChange: (_, v) => v && setFilter(v),
|
|
167
|
+
size: "small",
|
|
168
|
+
sx: {
|
|
169
|
+
border: "1px solid #ccc",
|
|
170
|
+
borderRadius: "50px",
|
|
171
|
+
overflow: "hidden",
|
|
172
|
+
"& .MuiToggleButton-root": {
|
|
173
|
+
border: "none",
|
|
174
|
+
borderRight: "1px solid #ccc",
|
|
175
|
+
color: "#555",
|
|
176
|
+
fontWeight: 600,
|
|
177
|
+
textTransform: "uppercase",
|
|
178
|
+
fontSize: "0.72rem",
|
|
179
|
+
px: 2,
|
|
180
|
+
py: 0.5,
|
|
181
|
+
borderRadius: 0,
|
|
182
|
+
"&:last-of-type": { borderRight: "none" },
|
|
183
|
+
"&.Mui-selected": {
|
|
184
|
+
backgroundColor: theme.palette.primary.main,
|
|
185
|
+
color: "#fff",
|
|
186
|
+
"&:hover": { backgroundColor: theme.palette.primary.dark }
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
children: [
|
|
191
|
+
/* @__PURE__ */ jsx(ToggleButton, { value: "ALL", children: "All" }),
|
|
192
|
+
/* @__PURE__ */ jsx(ToggleButton, { value: "INCOMING", children: "Inbound" }),
|
|
193
|
+
/* @__PURE__ */ jsx(ToggleButton, { value: "OUTGOING", children: "Outbound" })
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
)
|
|
197
|
+
] }),
|
|
198
|
+
/* @__PURE__ */ jsx(TableContainer, { component: Paper, variant: "outlined", sx: { maxHeight: 600 }, children: /* @__PURE__ */ jsx(Table, { stickyHeader: true, size: "small", children: showMissedCalls ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
199
|
+
/* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsx(TableRow, { children: MISSED_CALLS_COLS.map((col) => /* @__PURE__ */ jsx(
|
|
200
|
+
TableCell,
|
|
201
|
+
{
|
|
202
|
+
align: CENTER_COLS.has(col) ? "center" : "left",
|
|
203
|
+
sx: { fontWeight: 600, backgroundColor: "#f1f1f1", fontSize: "0.8rem" },
|
|
204
|
+
children: col
|
|
205
|
+
},
|
|
206
|
+
col
|
|
207
|
+
)) }) }),
|
|
208
|
+
/* @__PURE__ */ jsx(TableBody, { children: loading ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 5, align: "center", sx: { py: 4 }, children: /* @__PURE__ */ jsx(CircularProgress, { size: 24 }) }) }) : filteredMissedCalls.length === 0 ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 5, align: "center", sx: { py: 4, color: "#999", fontSize: "0.82rem" }, children: "No Records Found" }) }) : filteredMissedCalls.map((row, i) => /* @__PURE__ */ jsx(MissedCallRow, { row }, `${row.agentId}-${row.mobileNumber}-${i}`)) })
|
|
209
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
210
|
+
/* @__PURE__ */ jsx(TableHead, { children: /* @__PURE__ */ jsx(TableRow, { children: CALL_HISTORY_COLS.map((col) => /* @__PURE__ */ jsx(
|
|
211
|
+
TableCell,
|
|
212
|
+
{
|
|
213
|
+
align: CENTER_COLS.has(col) ? "center" : "left",
|
|
214
|
+
sx: { fontWeight: 600, backgroundColor: "#f1f1f1", fontSize: "0.8rem" },
|
|
215
|
+
children: col
|
|
216
|
+
},
|
|
217
|
+
col
|
|
218
|
+
)) }) }),
|
|
219
|
+
/* @__PURE__ */ jsx(TableBody, { children: loading ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 8, align: "center", sx: { py: 4 }, children: /* @__PURE__ */ jsx(CircularProgress, {}) }) }) : filteredCalls.length === 0 ? /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 8, align: "center", sx: { py: 4, color: "#999", fontSize: "0.82rem" }, children: "No Records Found" }) }) : filteredCalls.map((row, i) => /* @__PURE__ */ jsx(
|
|
220
|
+
ExpandableRow,
|
|
221
|
+
{
|
|
222
|
+
row,
|
|
223
|
+
striped: i % 2 === 0,
|
|
224
|
+
fetchRecording,
|
|
225
|
+
onError: (msg) => showToast(msg, "error")
|
|
226
|
+
},
|
|
227
|
+
row.call_uuid
|
|
228
|
+
)) })
|
|
229
|
+
] }) }) })
|
|
230
|
+
] })
|
|
231
|
+
] });
|
|
232
|
+
});
|
|
233
|
+
CallHistoryContent.displayName = "CallHistoryContent";
|
|
234
|
+
var MissedCallRow = memo(({ row }) => {
|
|
235
|
+
const theme = useTheme();
|
|
236
|
+
return /* @__PURE__ */ jsxs(TableRow, { hover: true, children: [
|
|
237
|
+
/* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.82rem", color: theme.palette.primary.main }, children: row.agentId }),
|
|
238
|
+
/* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.82rem" }, children: row.username }),
|
|
239
|
+
/* @__PURE__ */ jsxs(TableCell, { sx: { fontSize: "0.82rem" }, children: [
|
|
240
|
+
row.mobileNumber,
|
|
241
|
+
" (",
|
|
242
|
+
row.callCount,
|
|
243
|
+
")"
|
|
244
|
+
] }),
|
|
245
|
+
/* @__PURE__ */ jsx(TableCell, { sx: { fontSize: "0.82rem", textTransform: "uppercase" }, children: row.callType }),
|
|
246
|
+
/* @__PURE__ */ jsx(TableCell, { align: "center", children: /* @__PURE__ */ jsx(Phone, { sx: { color: "#c0392b", fontSize: 20, cursor: "pointer" } }) })
|
|
247
|
+
] });
|
|
248
|
+
});
|
|
249
|
+
MissedCallRow.displayName = "MissedCallRow";
|
|
250
|
+
function ExpandableRow({
|
|
251
|
+
row,
|
|
252
|
+
striped,
|
|
253
|
+
fetchRecording,
|
|
254
|
+
onError
|
|
255
|
+
}) {
|
|
256
|
+
var _a, _b;
|
|
257
|
+
const [open, setOpen] = useState2(false);
|
|
258
|
+
const [audioURL, setAudioURL] = useState2(null);
|
|
259
|
+
const [loadingAudio, setLoadingAudio] = useState2(false);
|
|
260
|
+
const handlePlay = async () => {
|
|
261
|
+
if (!row.recording.available) return;
|
|
262
|
+
setLoadingAudio(true);
|
|
263
|
+
try {
|
|
264
|
+
const blob = await fetchRecording(row.call_uuid);
|
|
265
|
+
setAudioURL(URL.createObjectURL(blob));
|
|
266
|
+
} catch (e) {
|
|
267
|
+
onError("Recording not available");
|
|
268
|
+
} finally {
|
|
269
|
+
setLoadingAudio(false);
|
|
270
|
+
}
|
|
271
|
+
};
|
|
272
|
+
const bg = striped ? "#fafafa" : "white";
|
|
273
|
+
const cellSx = { fontSize: "0.82rem", backgroundColor: bg };
|
|
274
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
275
|
+
/* @__PURE__ */ jsxs(TableRow, { hover: true, children: [
|
|
276
|
+
/* @__PURE__ */ jsx(TableCell, { sx: __spreadProps(__spreadValues({}, cellSx), { maxWidth: 130 }), children: /* @__PURE__ */ jsx(Tooltip, { title: row.call_uuid, arrow: true, children: /* @__PURE__ */ jsx(
|
|
277
|
+
Typography,
|
|
278
|
+
{
|
|
279
|
+
noWrap: true,
|
|
280
|
+
sx: { fontSize: 13, maxWidth: 130, overflow: "hidden", textOverflow: "ellipsis" },
|
|
281
|
+
children: row.call_uuid
|
|
282
|
+
}
|
|
283
|
+
) }) }),
|
|
284
|
+
/* @__PURE__ */ jsx(TableCell, { sx: cellSx, children: row.mobile_no }),
|
|
285
|
+
/* @__PURE__ */ jsx(TableCell, { align: "center", sx: cellSx, children: /* @__PURE__ */ jsx(
|
|
286
|
+
Chip,
|
|
287
|
+
{
|
|
288
|
+
size: "small",
|
|
289
|
+
label: row.call_type,
|
|
290
|
+
color: row.call_type === "INCOMING" ? "success" : "primary"
|
|
291
|
+
}
|
|
292
|
+
) }),
|
|
293
|
+
/* @__PURE__ */ jsx(TableCell, { sx: cellSx, children: new Date(row.start_time).toLocaleString() }),
|
|
294
|
+
/* @__PURE__ */ jsx(TableCell, { sx: cellSx, children: row.end_time ? new Date(row.end_time).toLocaleString() : "\u2014" }),
|
|
295
|
+
/* @__PURE__ */ jsx(TableCell, { align: "center", sx: cellSx, children: row.recording.available ? /* @__PURE__ */ jsx(
|
|
296
|
+
IconButton,
|
|
297
|
+
{
|
|
298
|
+
color: "primary",
|
|
299
|
+
onClick: handlePlay,
|
|
300
|
+
disabled: loadingAudio,
|
|
301
|
+
size: "small",
|
|
302
|
+
children: loadingAudio ? /* @__PURE__ */ jsx(CircularProgress, { size: 18 }) : /* @__PURE__ */ jsx(PlayArrow, {})
|
|
303
|
+
}
|
|
304
|
+
) : /* @__PURE__ */ jsx(Chip, { size: "small", label: "No File" }) }),
|
|
305
|
+
/* @__PURE__ */ jsx(TableCell, { align: "center", sx: cellSx, children: (_a = row.agent_id) != null ? _a : "\u2014" }),
|
|
306
|
+
/* @__PURE__ */ jsx(TableCell, { align: "center", sx: cellSx, children: /* @__PURE__ */ jsx(IconButton, { onClick: () => setOpen((o) => !o), size: "small", children: open ? /* @__PURE__ */ jsx(ExpandLess, {}) : /* @__PURE__ */ jsx(KeyboardArrowDown, {}) }) })
|
|
307
|
+
] }),
|
|
308
|
+
audioURL && /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 8, sx: { p: 0 }, children: /* @__PURE__ */ jsx(Box, { p: 2, children: /* @__PURE__ */ jsx(
|
|
309
|
+
"audio",
|
|
310
|
+
{
|
|
311
|
+
controls: true,
|
|
312
|
+
autoPlay: true,
|
|
313
|
+
src: audioURL,
|
|
314
|
+
onEnded: () => {
|
|
315
|
+
URL.revokeObjectURL(audioURL);
|
|
316
|
+
setAudioURL(null);
|
|
317
|
+
},
|
|
318
|
+
style: { width: "100%" }
|
|
319
|
+
}
|
|
320
|
+
) }) }) }),
|
|
321
|
+
/* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: 8, sx: { p: 0 }, children: /* @__PURE__ */ jsx(Collapse, { in: open, unmountOnExit: true, children: /* @__PURE__ */ jsxs(Box, { p: 2, bgcolor: "#f9fafc", borderTop: "1px solid #eee", children: [
|
|
322
|
+
/* @__PURE__ */ jsx(Typography, { fontWeight: 600, fontSize: "0.85rem", mb: 0.5, children: "Call Details" }),
|
|
323
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body2", fontSize: "0.82rem", children: [
|
|
324
|
+
"Call UID: ",
|
|
325
|
+
row.call_uuid
|
|
326
|
+
] }),
|
|
327
|
+
/* @__PURE__ */ jsxs(Typography, { variant: "body2", fontSize: "0.82rem", children: [
|
|
328
|
+
"Agent: ",
|
|
329
|
+
(_b = row.agent_id) != null ? _b : "Unassigned"
|
|
330
|
+
] })
|
|
331
|
+
] }) }) }) })
|
|
332
|
+
] });
|
|
333
|
+
}
|
|
334
|
+
var CallHistory = () => /* @__PURE__ */ jsx(SDKProvider, { children: /* @__PURE__ */ jsx(CallHistoryContent, {}) });
|
|
335
|
+
var callHistory_default = CallHistory;
|
|
336
|
+
export {
|
|
337
|
+
callHistory_default as default
|
|
338
|
+
};
|
|
339
|
+
//# sourceMappingURL=callHistory-TZ7SSXSN.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/callHistory/index.tsx","../call-control-sdk/lib/pages/callHistory/useCallHistory.ts"],"sourcesContent":["import React, { memo, useEffect, useState } from \"react\";\r\nimport {\r\n\tBox,\r\n\tTypography,\r\n\tTable,\r\n\tTableBody,\r\n\tTableCell,\r\n\tTableContainer,\r\n\tTableHead,\r\n\tTableRow,\r\n\tToggleButton,\r\n\tToggleButtonGroup,\r\n\tIconButton,\r\n\tCollapse,\r\n\tCircularProgress,\r\n\tChip,\r\n\tStack,\r\n\tSwitch,\r\n\tFormControlLabel,\r\n\tTooltip,\r\n\tInputAdornment,\r\n\tOutlinedInput,\r\n\tuseTheme,\r\n\tPaper,\r\n} from \"@mui/material\";\r\nimport {\r\n\tKeyboardArrowDown,\r\n\tPlayArrow,\r\n\tExpandLess,\r\n\tSearch,\r\n\tPhone,\r\n} from \"@mui/icons-material\";\r\nimport { SDKProvider } from \"../../components/SDKProvider\";\r\nimport { useToast } from \"../../services/toastMessage\";\r\nimport { useCallHistory } from \"./useCallHistory\";\r\nimport type { CallHistoryItem, MissedCallDetails, CallFilter } from \"./types\";\r\n\r\n// ──── Header cell columns ────────────────────────────────────────────────────\r\n\r\nconst CALL_HISTORY_COLS = [\"Call UID\", \"Mobile\", \"Type\", \"Start Time\", \"End Time\", \"Recording\", \"Agent\", \"Details\"] as const;\r\nconst MISSED_CALLS_COLS = [\"Agent ID\", \"Agent Name\", \"Mobile No\", \"Type\", \"Actions\"] as const;\r\nconst CENTER_COLS = new Set([\"Type\", \"Recording\", \"Agent\", \"Details\", \"Actions\"]);\r\n\r\n// ──── Main content (needs SDKProvider above it for useToast) ─────────────────\r\n\r\nconst CallHistoryContent = memo(() => {\r\n\tconst theme = useTheme();\r\n\tconst { showToast } = useToast();\r\n\tconst { calls, missedCalls, loading, fetchCallHistory, fetchMissedCalls, fetchRecording } =\r\n\t\tuseCallHistory();\r\n\r\n\tconst [filter, setFilter] = useState<CallFilter>(\"ALL\");\r\n\tconst [search, setSearch] = useState(\"\");\r\n\tconst [showMissedCalls, setShowMissedCalls] = useState(false);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (showMissedCalls) {\r\n\t\t\tfetchMissedCalls();\r\n\t\t} else {\r\n\t\t\tfetchCallHistory();\r\n\t\t}\r\n\t}, [showMissedCalls, fetchCallHistory, fetchMissedCalls]);\r\n\r\n\tconst filteredCalls = calls\r\n\t\t.filter((c) => filter === \"ALL\" || c.call_type === filter)\r\n\t\t.filter((c) => c.mobile_no.toLowerCase().includes(search.toLowerCase()));\r\n\r\n\tconst filteredMissedCalls = missedCalls\r\n\t\t.filter((c) => filter === \"ALL\" || c.callType?.toUpperCase() === filter)\r\n\t\t.filter((c) => {\r\n\t\t\tconst q = search.toLowerCase();\r\n\t\t\treturn (\r\n\t\t\t\tc.agentId?.toLowerCase().includes(q) ||\r\n\t\t\t\tc.username?.toLowerCase().includes(q) ||\r\n\t\t\t\tc.mobileNumber?.toLowerCase().includes(q)\r\n\t\t\t);\r\n\t\t});\r\n\r\n\treturn (\r\n\t\t<Box>\r\n\t\t\t{/* PAGE HEADER */}\r\n\t\t\t<Box\r\n\t\t\t\tdisplay=\"flex\"\r\n\t\t\t\talignItems=\"center\"\r\n\t\t\t\tjustifyContent=\"space-between\"\r\n\t\t\t\tpx={2}\r\n\t\t\t\tpy={1.5}\r\n\t\t\t\tborderBottom=\"1px solid #eee\"\r\n\t\t\t>\r\n\t\t\t\t<Typography fontWeight={700} fontSize=\"1rem\">\r\n\t\t\t\t\tCall History\r\n\t\t\t\t</Typography>\r\n\t\t\t\t<OutlinedInput\r\n\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\tvalue={search}\r\n\t\t\t\t\tonChange={(e) => setSearch(e.target.value)}\r\n\t\t\t\t\tplaceholder=\"Search\"\r\n\t\t\t\t\tsx={{ width: 220, fontSize: \"0.82rem\", height: 36 }}\r\n\t\t\t\t\tendAdornment={\r\n\t\t\t\t\t\t<InputAdornment position=\"end\">\r\n\t\t\t\t\t\t\t<Search sx={{ fontSize: 18, color: \"#999\" }} />\r\n\t\t\t\t\t\t</InputAdornment>\r\n\t\t\t\t\t}\r\n\t\t\t\t/>\r\n\t\t\t</Box>\r\n\r\n\t\t\t<Box py={1.5} px={2}>\r\n\t\t\t\t{/* FILTER BAR */}\r\n\t\t\t\t<Stack direction=\"row\" spacing={2} alignItems=\"center\" mb={2}>\r\n\t\t\t\t\t<FormControlLabel\r\n\t\t\t\t\t\tcontrol={\r\n\t\t\t\t\t\t\t<Switch\r\n\t\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t\t\tchecked={showMissedCalls}\r\n\t\t\t\t\t\t\t\tonChange={(_, checked) => setShowMissedCalls(checked)}\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) => v && setFilter(v)}\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={{ 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.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</TableContainer>\r\n\t\t\t</Box>\r\n\t\t</Box>\r\n\t);\r\n});\r\n\r\nCallHistoryContent.displayName = \"CallHistoryContent\";\r\n\r\n// ──── Missed Call Row ─────────────────────────────────────────────────────────\r\n\r\nconst MissedCallRow = memo(({ row }: { row: MissedCallDetails }) => {\r\n\tconst theme = useTheme();\r\n\treturn (\r\n\t\t<TableRow hover>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\", color: theme.palette.primary.main }}>\r\n\t\t\t\t{row.agentId}\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\" }}>{row.username}</TableCell>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\" }}>\r\n\t\t\t\t{row.mobileNumber} ({row.callCount})\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell sx={{ fontSize: \"0.82rem\", textTransform: \"uppercase\" }}>\r\n\t\t\t\t{row.callType}\r\n\t\t\t</TableCell>\r\n\t\t\t<TableCell align=\"center\">\r\n\t\t\t\t<Phone sx={{ color: \"#c0392b\", fontSize: 20, cursor: \"pointer\" }} />\r\n\t\t\t</TableCell>\r\n\t\t</TableRow>\r\n\t);\r\n});\r\n\r\nMissedCallRow.displayName = \"MissedCallRow\";\r\n\r\n// ──── Expandable Row ──────────────────────────────────────────────────────────\r\n\r\nfunction ExpandableRow({\r\n\trow,\r\n\tstriped,\r\n\tfetchRecording,\r\n\tonError,\r\n}: {\r\n\trow: CallHistoryItem;\r\n\tstriped: boolean;\r\n\tfetchRecording: (call_uuid: string) => Promise<Blob>;\r\n\tonError: (msg: string) => void;\r\n}) {\r\n\tconst [open, setOpen] = useState(false);\r\n\tconst [audioURL, setAudioURL] = useState<string | null>(null);\r\n\tconst [loadingAudio, setLoadingAudio] = useState(false);\r\n\r\n\tconst handlePlay = async () => {\r\n\t\tif (!row.recording.available) return;\r\n\t\tsetLoadingAudio(true);\r\n\t\ttry {\r\n\t\t\tconst blob = await fetchRecording(row.call_uuid);\r\n\t\t\tsetAudioURL(URL.createObjectURL(blob));\r\n\t\t} catch {\r\n\t\t\tonError(\"Recording not available\");\r\n\t\t} finally {\r\n\t\t\tsetLoadingAudio(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst bg = striped ? \"#fafafa\" : \"white\";\r\n\tconst cellSx = { fontSize: \"0.82rem\", backgroundColor: bg };\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<TableRow hover>\r\n\t\t\t\t<TableCell sx={{ ...cellSx, maxWidth: 130 }}>\r\n\t\t\t\t\t<Tooltip title={row.call_uuid} arrow>\r\n\t\t\t\t\t\t<Typography\r\n\t\t\t\t\t\t\tnoWrap\r\n\t\t\t\t\t\t\tsx={{ fontSize: 13, maxWidth: 130, overflow: \"hidden\", textOverflow: \"ellipsis\" }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{row.call_uuid}\r\n\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t</Tooltip>\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell sx={cellSx}>{row.mobile_no}</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t<Chip\r\n\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\tlabel={row.call_type}\r\n\t\t\t\t\t\tcolor={row.call_type === \"INCOMING\" ? \"success\" : \"primary\"}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell sx={cellSx}>\r\n\t\t\t\t\t{new Date(row.start_time).toLocaleString()}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell sx={cellSx}>\r\n\t\t\t\t\t{row.end_time ? new Date(row.end_time).toLocaleString() : \"—\"}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t{row.recording.available ? (\r\n\t\t\t\t\t\t<IconButton\r\n\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\tonClick={handlePlay}\r\n\t\t\t\t\t\t\tdisabled={loadingAudio}\r\n\t\t\t\t\t\t\tsize=\"small\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{loadingAudio ? <CircularProgress size={18} /> : <PlayArrow />}\r\n\t\t\t\t\t\t</IconButton>\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t<Chip size=\"small\" label=\"No File\" />\r\n\t\t\t\t\t)}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t{row.agent_id ?? \"—\"}\r\n\t\t\t\t</TableCell>\r\n\r\n\t\t\t\t<TableCell align=\"center\" sx={cellSx}>\r\n\t\t\t\t\t<IconButton onClick={() => setOpen((o) => !o)} size=\"small\">\r\n\t\t\t\t\t\t{open ? <ExpandLess /> : <KeyboardArrowDown />}\r\n\t\t\t\t\t</IconButton>\r\n\t\t\t\t</TableCell>\r\n\t\t\t</TableRow>\r\n\r\n\t\t\t{/* Audio player row */}\r\n\t\t\t{audioURL && (\r\n\t\t\t\t<TableRow>\r\n\t\t\t\t\t<TableCell colSpan={8} sx={{ p: 0 }}>\r\n\t\t\t\t\t\t<Box p={2}>\r\n\t\t\t\t\t\t\t<audio\r\n\t\t\t\t\t\t\t\tcontrols\r\n\t\t\t\t\t\t\t\tautoPlay\r\n\t\t\t\t\t\t\t\tsrc={audioURL}\r\n\t\t\t\t\t\t\t\tonEnded={() => {\r\n\t\t\t\t\t\t\t\t\tURL.revokeObjectURL(audioURL);\r\n\t\t\t\t\t\t\t\t\tsetAudioURL(null);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tstyle={{ width: \"100%\" }}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</TableCell>\r\n\t\t\t\t</TableRow>\r\n\t\t\t)}\r\n\r\n\t\t\t{/* Details collapse row */}\r\n\t\t\t<TableRow>\r\n\t\t\t\t<TableCell colSpan={8} sx={{ p: 0 }}>\r\n\t\t\t\t\t<Collapse in={open} unmountOnExit>\r\n\t\t\t\t\t\t<Box p={2} bgcolor=\"#f9fafc\" borderTop=\"1px solid #eee\">\r\n\t\t\t\t\t\t\t<Typography fontWeight={600} fontSize=\"0.85rem\" mb={0.5}>\r\n\t\t\t\t\t\t\t\tCall Details\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t<Typography variant=\"body2\" fontSize=\"0.82rem\">\r\n\t\t\t\t\t\t\t\tCall UID: {row.call_uuid}\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t\t<Typography variant=\"body2\" fontSize=\"0.82rem\">\r\n\t\t\t\t\t\t\t\tAgent: {row.agent_id ?? \"Unassigned\"}\r\n\t\t\t\t\t\t\t</Typography>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t</Collapse>\r\n\t\t\t\t</TableCell>\r\n\t\t\t</TableRow>\r\n\t\t</>\r\n\t);\r\n}\r\n\r\n// ──── Default Export — wraps with SDKProvider for toast context ───────────────\r\n\r\nconst CallHistory: React.FC = () => (\r\n\t<SDKProvider>\r\n\t\t<CallHistoryContent />\r\n\t</SDKProvider>\r\n);\r\n\r\nexport default CallHistory;\r\n","import { useState, useCallback } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type { CallHistoryItem, MissedCallDetails } from \"./types\";\r\n\r\nexport function useCallHistory() {\r\n\tconst [calls, setCalls] = useState<CallHistoryItem[]>([]);\r\n\tconst [missedCalls, setMissedCalls] = useState<MissedCallDetails[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchCallHistory = useCallback(async () => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.post(END_POINT.CALLS_HISTORY, {});\r\n\t\t\tsetCalls(Array.isArray(res.data?.records) ? res.data.records : []);\r\n\t\t} catch {\r\n\t\t\tsetCalls([]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchMissedCalls = useCallback(async () => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get(END_POINT.MISSED_CALLS);\r\n\t\t\tsetMissedCalls(Array.isArray(res.data?.data) ? res.data.data : []);\r\n\t\t} catch {\r\n\t\t\tsetMissedCalls([]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchRecording = useCallback(async (call_uuid: string): Promise<Blob> => {\r\n\t\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(call_uuid), {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\treturn res.data;\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\tcalls,\r\n\t\tmissedCalls,\r\n\t\tloading,\r\n\t\tfetchCallHistory,\r\n\t\tfetchMissedCalls,\r\n\t\tfetchRecording,\r\n\t};\r\n}\r\n"],"mappings":"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","names":["useState","useState"]}
|