ahs-cti 0.0.7 → 0.0.9
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-F44HMQ5O.mjs +27 -0
- package/dist/agentDetailReport-F44HMQ5O.mjs.map +1 -0
- package/dist/{agentPerformanceReport-JZK5DN5E.mjs → agentPerformanceReport-TTOMNENK.mjs} +25 -15
- package/dist/{agentPerformanceReport-JZK5DN5E.mjs.map → agentPerformanceReport-TTOMNENK.mjs.map} +1 -1
- package/dist/auditReport-QTMAKVTN.mjs +26 -0
- package/dist/auditReport-QTMAKVTN.mjs.map +1 -0
- package/dist/{callHistory-T3M76D4B.mjs → callHistory-4J4J2XHA.mjs} +20 -10
- package/dist/{callHistory-T3M76D4B.mjs.map → callHistory-4J4J2XHA.mjs.map} +1 -1
- package/dist/{campaigns-5PVHXBSD.mjs → campaigns-N3UNUGQP.mjs} +23 -13
- package/dist/{campaigns-5PVHXBSD.mjs.map → campaigns-N3UNUGQP.mjs.map} +1 -1
- package/dist/{caroQualityAuditDashboard-EUDYZ3QY.mjs → caroQualityAuditDashboard-TNS4L2NR.mjs} +12 -2
- package/dist/{caroQualityAuditDashboard-EUDYZ3QY.mjs.map → caroQualityAuditDashboard-TNS4L2NR.mjs.map} +1 -1
- package/dist/{caroVoiceAI-GGJCVUIQ.mjs → caroVoiceAI-OUTAAIFE.mjs} +12 -2
- package/dist/{caroVoiceAI-GGJCVUIQ.mjs.map → caroVoiceAI-OUTAAIFE.mjs.map} +1 -1
- package/dist/{cdrReport-ZMDHSZUW.mjs → cdrReport-Z35OLYUL.mjs} +26 -16
- package/dist/{cdrReport-ZMDHSZUW.mjs.map → cdrReport-Z35OLYUL.mjs.map} +1 -1
- package/dist/chunk-3PNP6G5P.mjs +92 -0
- package/dist/chunk-3PNP6G5P.mjs.map +1 -0
- package/dist/{chunk-DF5EFKXC.mjs → chunk-45MLTWV7.mjs} +12 -2
- package/dist/{chunk-DF5EFKXC.mjs.map → chunk-45MLTWV7.mjs.map} +1 -1
- package/dist/chunk-635IIVZE.mjs +24 -0
- package/dist/{chunk-FRKV2U3I.mjs.map → chunk-635IIVZE.mjs.map} +1 -1
- package/dist/chunk-677RFPP5.mjs +24 -0
- package/dist/{chunk-7LE2VTAI.mjs.map → chunk-677RFPP5.mjs.map} +1 -1
- package/dist/{chunk-Q6G3MPS7.mjs → chunk-ERSNXW5X.mjs} +11 -1
- package/dist/{chunk-Q6G3MPS7.mjs.map → chunk-ERSNXW5X.mjs.map} +1 -1
- package/dist/{chunk-H7GRWLYI.mjs → chunk-G6KRLGGC.mjs} +13 -3
- package/dist/{chunk-H7GRWLYI.mjs.map → chunk-G6KRLGGC.mjs.map} +1 -1
- package/dist/chunk-GFVR3HLK.mjs +24 -0
- package/dist/{chunk-6WLG2PXL.mjs.map → chunk-GFVR3HLK.mjs.map} +1 -1
- package/dist/{chunk-E6KYWWAI.mjs → chunk-GTI2ZVQX.mjs} +12 -2
- package/dist/{chunk-E6KYWWAI.mjs.map → chunk-GTI2ZVQX.mjs.map} +1 -1
- package/dist/chunk-H22TUCN3.mjs +24 -0
- package/dist/{chunk-AOJRUZTO.mjs.map → chunk-H22TUCN3.mjs.map} +1 -1
- package/dist/{chunk-YAQYTUTX.mjs → chunk-HAOFUADN.mjs} +12 -2
- package/dist/{chunk-YAQYTUTX.mjs.map → chunk-HAOFUADN.mjs.map} +1 -1
- package/dist/{chunk-33QNSXP7.mjs → chunk-JHC7OUQG.mjs} +21 -11
- package/dist/chunk-JHC7OUQG.mjs.map +1 -0
- package/dist/chunk-KSVNZKRD.mjs +10930 -0
- package/dist/chunk-KSVNZKRD.mjs.map +1 -0
- package/dist/{chunk-VVDJLUYT.mjs → chunk-M7FJYZF6.mjs} +12 -2
- package/dist/{chunk-VVDJLUYT.mjs.map → chunk-M7FJYZF6.mjs.map} +1 -1
- package/dist/{chunk-DNTGBNZD.mjs → chunk-NDZDJWXY.mjs} +13 -3
- package/dist/{chunk-DNTGBNZD.mjs.map → chunk-NDZDJWXY.mjs.map} +1 -1
- package/dist/chunk-S2SMCH2C.mjs +71 -0
- package/dist/chunk-S2SMCH2C.mjs.map +1 -0
- package/dist/{chunk-IDZWA6HG.mjs → chunk-S34CQVTF.mjs} +14 -4
- package/dist/{chunk-IDZWA6HG.mjs.map → chunk-S34CQVTF.mjs.map} +1 -1
- package/dist/{chunk-2M3YEXYA.mjs → chunk-SUS5RUCA.mjs} +17 -7
- package/dist/{chunk-2M3YEXYA.mjs.map → chunk-SUS5RUCA.mjs.map} +1 -1
- package/dist/{chunk-3J7KQNEU.mjs → chunk-TCYBXDAP.mjs} +13 -3
- package/dist/{chunk-3J7KQNEU.mjs.map → chunk-TCYBXDAP.mjs.map} +1 -1
- package/dist/chunk-VII5JNA6.mjs +24 -0
- package/dist/{chunk-WTBVFN4H.mjs.map → chunk-VII5JNA6.mjs.map} +1 -1
- package/dist/chunk-W3ECDLUB.mjs +24 -0
- package/dist/{chunk-OHJIW3I3.mjs.map → chunk-W3ECDLUB.mjs.map} +1 -1
- package/dist/{chunk-VBIDPX5Z.mjs → chunk-Y4PAUTZ4.mjs} +13 -3
- package/dist/{chunk-VBIDPX5Z.mjs.map → chunk-Y4PAUTZ4.mjs.map} +1 -1
- package/dist/{chunk-NAZO4HKB.mjs → chunk-ZSRD3ZXF.mjs} +12 -2
- package/dist/{chunk-NAZO4HKB.mjs.map → chunk-ZSRD3ZXF.mjs.map} +1 -1
- package/dist/index.mjs +33 -23
- package/dist/index.mjs.map +1 -1
- package/dist/{liveStatus-YSBYSVOO.mjs → liveStatus-PRDEL7CK.mjs} +16 -6
- package/dist/{liveStatus-YSBYSVOO.mjs.map → liveStatus-PRDEL7CK.mjs.map} +1 -1
- package/dist/{loginReport-YIVBJVJD.mjs → loginReport-47QNACQU.mjs} +22 -12
- package/dist/{loginReport-YIVBJVJD.mjs.map → loginReport-47QNACQU.mjs.map} +1 -1
- package/dist/{managementDashboard-7EMQC2UA.mjs → managementDashboard-SZFYULKA.mjs} +22 -12
- package/dist/{managementDashboard-7EMQC2UA.mjs.map → managementDashboard-SZFYULKA.mjs.map} +1 -1
- package/dist/{qualityAuditDashboard-ENGQN2WQ.mjs → qualityAuditDashboard-FHRGB77R.mjs} +12 -2
- package/dist/{qualityAuditDashboard-ENGQN2WQ.mjs.map → qualityAuditDashboard-FHRGB77R.mjs.map} +1 -1
- package/dist-react/agentDetailReport-PDKQKJNL.mjs +23 -0
- package/dist-react/agentPerformanceReport-MU2FASNN.mjs +544 -0
- package/dist-react/agentPerformanceReport-MU2FASNN.mjs.map +1 -0
- package/dist-react/auditReport-WH2KDNYT.mjs +25 -0
- package/{dist/auditReport-6ZUJ4UFO.mjs.map → dist-react/auditReport-WH2KDNYT.mjs.map} +1 -1
- package/dist-react/callHistory-HXXRYUIV.mjs +832 -0
- package/dist-react/callHistory-HXXRYUIV.mjs.map +1 -0
- package/dist-react/campaigns-J7KIAATE.mjs +3139 -0
- package/dist-react/campaigns-J7KIAATE.mjs.map +1 -0
- package/dist-react/caroQualityAuditDashboard-THYPVOCP.mjs +76 -0
- package/dist-react/caroQualityAuditDashboard-THYPVOCP.mjs.map +1 -0
- package/dist-react/caroVoiceAI-XGDUETXI.mjs +31 -0
- package/dist-react/caroVoiceAI-XGDUETXI.mjs.map +1 -0
- package/dist-react/cdrReport-SX2FZAO6.mjs +858 -0
- package/dist-react/cdrReport-SX2FZAO6.mjs.map +1 -0
- package/dist-react/chunk-4YF4IDV6.mjs +72 -0
- package/dist-react/chunk-4YF4IDV6.mjs.map +1 -0
- package/dist-react/chunk-ADM2JJCP.mjs +190 -0
- package/dist-react/chunk-ADM2JJCP.mjs.map +1 -0
- package/dist-react/chunk-EN7HM2MD.mjs +688 -0
- package/dist-react/chunk-EN7HM2MD.mjs.map +1 -0
- package/{dist/chunk-LHE4QGJJ.mjs → dist-react/chunk-F7G2XFRU.mjs} +12 -2
- package/{dist/chunk-LHE4QGJJ.mjs.map → dist-react/chunk-F7G2XFRU.mjs.map} +1 -1
- package/{dist/chunk-DJP744FF.mjs → dist-react/chunk-GUMGXVIT.mjs} +12 -2
- package/{dist/chunk-DJP744FF.mjs.map → dist-react/chunk-GUMGXVIT.mjs.map} +1 -1
- package/dist-react/chunk-KRXHK4AU.mjs +127 -0
- package/dist-react/chunk-KRXHK4AU.mjs.map +1 -0
- package/{dist/chunk-U2UDKXMB.mjs → dist-react/chunk-LWDAC6QU.mjs} +12 -2
- package/{dist/chunk-U2UDKXMB.mjs.map → dist-react/chunk-LWDAC6QU.mjs.map} +1 -1
- package/dist-react/chunk-LX6I32Y4.mjs +106 -0
- package/dist-react/chunk-LX6I32Y4.mjs.map +1 -0
- package/dist-react/chunk-MCD5FQNY.mjs +428 -0
- package/dist-react/chunk-MCD5FQNY.mjs.map +1 -0
- package/dist-react/chunk-MD472UKG.mjs +757 -0
- package/{dist/chunk-33QNSXP7.mjs.map → dist-react/chunk-MD472UKG.mjs.map} +1 -1
- package/dist-react/chunk-ORNNWQI6.mjs +67 -0
- package/dist-react/chunk-ORNNWQI6.mjs.map +1 -0
- package/dist-react/chunk-S4J35V4B.mjs +126 -0
- package/dist-react/chunk-S4J35V4B.mjs.map +1 -0
- package/dist-react/chunk-T53WMN5A.mjs +126 -0
- package/dist-react/chunk-T53WMN5A.mjs.map +1 -0
- package/dist-react/chunk-UTSRABCL.mjs +96 -0
- package/dist-react/chunk-UTSRABCL.mjs.map +1 -0
- package/dist-react/incoming-4WP3FJI4.mp3 +0 -0
- package/dist-react/incoming.mp3 +0 -0
- package/dist-react/index.d.mts +2476 -0
- package/dist-react/index.d.ts +2477 -0
- package/dist-react/index.js +26713 -0
- package/dist-react/index.js.map +1 -0
- package/dist-react/index.mjs +4675 -0
- package/dist-react/index.mjs.map +1 -0
- package/dist-react/liveStatus-IDZ7CPYK.mjs +1087 -0
- package/dist-react/liveStatus-IDZ7CPYK.mjs.map +1 -0
- package/dist-react/loginReport-F47GUU53.mjs +990 -0
- package/dist-react/loginReport-F47GUU53.mjs.map +1 -0
- package/dist-react/managementDashboard-GC5E7NEL.mjs +540 -0
- package/dist-react/managementDashboard-GC5E7NEL.mjs.map +1 -0
- package/dist-react/qualityAuditDashboard-ZAM7HRNH.mjs +76 -0
- package/dist-react/qualityAuditDashboard-ZAM7HRNH.mjs.map +1 -0
- package/package.json +17 -2
- package/dist/agentDetailReport-ZR7U2LLB.mjs +0 -17
- package/dist/auditReport-6ZUJ4UFO.mjs +0 -16
- package/dist/chunk-6WLG2PXL.mjs +0 -14
- package/dist/chunk-7LE2VTAI.mjs +0 -14
- package/dist/chunk-AOJRUZTO.mjs +0 -14
- package/dist/chunk-FRKV2U3I.mjs +0 -14
- package/dist/chunk-OHJIW3I3.mjs +0 -14
- package/dist/chunk-WTBVFN4H.mjs +0 -14
- /package/{dist/agentDetailReport-ZR7U2LLB.mjs.map → dist-react/agentDetailReport-PDKQKJNL.mjs.map} +0 -0
|
@@ -1,7 +1,17 @@
|
|
|
1
|
+
import * as __ext_react from "react";
|
|
2
|
+
import * as __ext_react_dom from "react-dom";
|
|
3
|
+
import * as __ext_react_jsx from "react/jsx-runtime";
|
|
4
|
+
var __cjsExternals = { "react": __ext_react, "react-dom": __ext_react_dom, "react/jsx-runtime": __ext_react_jsx };
|
|
5
|
+
var require = function (id) {
|
|
6
|
+
var mod = __cjsExternals[id];
|
|
7
|
+
if (mod) return mod.default || mod;
|
|
8
|
+
throw new Error('Dynamic require of "' + id + '" is not supported');
|
|
9
|
+
};
|
|
10
|
+
|
|
1
11
|
import {
|
|
2
12
|
END_POINT,
|
|
3
13
|
axios_default
|
|
4
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-F7G2XFRU.mjs";
|
|
5
15
|
|
|
6
16
|
// call-control-sdk/lib/pages/cdrReport/useCdrReport.ts
|
|
7
17
|
import { useCallback, useState } from "react";
|
|
@@ -58,4 +68,4 @@ export {
|
|
|
58
68
|
exportCdrReportToExcel,
|
|
59
69
|
getRecordingByCall
|
|
60
70
|
};
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
71
|
+
//# sourceMappingURL=chunk-GUMGXVIT.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/useCdrReport.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tCdrAgentFilterOption,\r\n\tCdrQueueFilterOption,\r\n\tCdrRecordsPage,\r\n\tCdrReportParams,\r\n\tCdrReportResponse,\r\n} from \"./types\";\r\n\r\n// ─── Build query string for CDR endpoints ────────────────────────────────────\r\n\r\nfunction buildCdrQuery(params: CdrReportParams): 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) {\r\n\t\tfor (const id of params.agent_id) qs.append(\"agent_id\", String(id));\r\n\t}\r\n\tif (params.queue_id) {\r\n\t\tfor (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\t}\r\n\tif (params.call_type) qs.append(\"call_type\", params.call_type);\r\n\tif (params.status) qs.append(\"status\", params.status);\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\n// ─── CDR records hook ────────────────────────────────────────────────────────\r\n\r\nexport function useCdrReport() {\r\n\tconst [records, setRecords] = useState<CdrRecordsPage[\"data\"]>([]);\r\n\tconst [totalRecords, setTotalRecords] = useState(0);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchRecords = useCallback(async (params: CdrReportParams): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst qs = buildCdrQuery(params);\r\n\t\t\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\t\t\tsetRecords(res.data?.data ?? []);\r\n\t\t\tsetTotalRecords(res.data?.total ?? 0);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(\r\n\t\t\t\terr?.response?.data?.message\r\n\t\t\t\t?? err?.response?.data?.detail\r\n\t\t\t\t?? err?.message\r\n\t\t\t\t?? \"Failed to fetch CDR report\"\r\n\t\t\t);\r\n\t\t\tsetRecords([]);\r\n\t\t\tsetTotalRecords(0);\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: CdrReportParams): Promise<void> => {\r\n\t\tconst qs = buildCdrQuery(params);\r\n\t\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\tconst blob = res.data as Blob;\r\n\t\tconst url = window.URL.createObjectURL(blob);\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\tdocument.body.appendChild(a);\r\n\t\ta.click();\r\n\t\ta.remove();\r\n\t\twindow.URL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\tconst fetchRecording = useCallback(async (callUuid: string): Promise<Blob> => {\r\n\t\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), {\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\trecords,\r\n\t\ttotalRecords,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tsetError,\r\n\t\tfetchRecords,\r\n\t\texportExcel,\r\n\t\tfetchRecording,\r\n\t};\r\n}\r\n\r\n// ─── CDR filter options hook (agents + queues) ───────────────────────────────\r\n//\r\n// The main app's CdrReport uses the general user-list and master-queue endpoints\r\n// (NOT a CDR-specific filter endpoint). We mirror that here.\r\n// - agents: GET /api/v1/users/?role=AGENT → filter to role === \"AGENT\"\r\n// - queues: GET /api/v1/master/queue\r\n\r\ninterface UserListItem {\r\n\tid: number;\r\n\tuserId: string;\r\n\tfirstName?: string;\r\n\tlastName?: string;\r\n\trole?: string | { name?: string } | null;\r\n}\r\n\r\ninterface QueueListItem {\r\n\tid: number;\r\n\tname: string;\r\n}\r\n\r\nexport function useCdrFilters() {\r\n\tconst [agents, setAgents] = useState<CdrAgentFilterOption[]>([]);\r\n\tconst [queues, setQueues] = useState<CdrQueueFilterOption[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchAgents = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<UserListItem[] | { data: UserListItem[] }>(\r\n\t\t\t\tEND_POINT.USERS_LIST,\r\n\t\t\t\t{ params: { role: \"AGENT\" } },\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tconst mapped: CdrAgentFilterOption[] = (raw as UserListItem[])\r\n\t\t\t\t.filter((u) => {\r\n\t\t\t\t\tconst roleName = typeof u.role === \"object\" && u.role !== null ? u.role.name : u.role;\r\n\t\t\t\t\treturn roleName === \"AGENT\";\r\n\t\t\t\t})\r\n\t\t\t\t.map((u) => ({\r\n\t\t\t\t\tid: u.id,\r\n\t\t\t\t\tuserId: u.userId,\r\n\t\t\t\t\tfullName: [u.firstName, u.lastName].filter(Boolean).join(\" \") || u.userId,\r\n\t\t\t\t}));\r\n\t\t\tsetAgents(mapped);\r\n\t\t} catch {\r\n\t\t\tsetAgents([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchQueues = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(\r\n\t\t\t\tEND_POINT.MASTER_QUEUES,\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tsetQueues((raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name })));\r\n\t\t} catch {\r\n\t\t\tsetQueues([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchAll = useCallback(async (): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tawait Promise.all([fetchAgents(), fetchQueues()]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, [fetchAgents, fetchQueues]);\r\n\r\n\treturn { agents, queues, loading, fetchAgents, fetchQueues, fetchAll };\r\n}\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function getQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(END_POINT.MASTER_QUEUES);\r\n\tconst raw = Array.isArray(res.data)\r\n\t\t? res.data\r\n\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t? (res.data as any).data\r\n\t\t\t: [];\r\n\treturn (raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name, description: \"\", isActive: true }));\r\n}\r\n\r\nexport async function getCdrReportRecords(params: CdrReportParams): Promise<CdrRecordsPage> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\n/**\r\n * Combined CDR report — stats + the current page of records in one call.\r\n * This is the documented endpoint that honours page/pageSize/search.\r\n */\r\nexport async function getCdrReport(params: CdrReportParams): Promise<CdrReportResponse> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get<CdrReportResponse>(`${END_POINT.CDR_REPORT}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\nexport async function exportCdrReportToExcel(params: CdrReportParams): Promise<void> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, { responseType: \"blob\" });\r\n\tconst url = window.URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\tdocument.body.appendChild(a);\r\n\ta.click();\r\n\ta.remove();\r\n\twindow.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport async function getRecordingByCall(callUuid: string): Promise<Blob> {\r\n\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), { responseType: \"blob\" });\r\n\treturn res.data;\r\n}\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/cdrReport/useCdrReport.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport axiosInstance from \"../../services/axios\";\r\nimport { END_POINT } from \"../../services/endPoint\";\r\nimport type {\r\n\tCdrAgentFilterOption,\r\n\tCdrQueueFilterOption,\r\n\tCdrRecordsPage,\r\n\tCdrReportParams,\r\n\tCdrReportResponse,\r\n} from \"./types\";\r\n\r\n// ─── Build query string for CDR endpoints ────────────────────────────────────\r\n\r\nfunction buildCdrQuery(params: CdrReportParams): 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) {\r\n\t\tfor (const id of params.agent_id) qs.append(\"agent_id\", String(id));\r\n\t}\r\n\tif (params.queue_id) {\r\n\t\tfor (const id of params.queue_id) qs.append(\"queue_id\", String(id));\r\n\t}\r\n\tif (params.call_type) qs.append(\"call_type\", params.call_type);\r\n\tif (params.status) qs.append(\"status\", params.status);\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\n// ─── CDR records hook ────────────────────────────────────────────────────────\r\n\r\nexport function useCdrReport() {\r\n\tconst [records, setRecords] = useState<CdrRecordsPage[\"data\"]>([]);\r\n\tconst [totalRecords, setTotalRecords] = useState(0);\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [error, setError] = useState(\"\");\r\n\r\n\tconst fetchRecords = useCallback(async (params: CdrReportParams): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\tsetError(\"\");\r\n\t\ttry {\r\n\t\t\tconst qs = buildCdrQuery(params);\r\n\t\t\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\t\t\tsetRecords(res.data?.data ?? []);\r\n\t\t\tsetTotalRecords(res.data?.total ?? 0);\r\n\t\t} catch (err: any) {\r\n\t\t\tsetError(\r\n\t\t\t\terr?.response?.data?.message\r\n\t\t\t\t?? err?.response?.data?.detail\r\n\t\t\t\t?? err?.message\r\n\t\t\t\t?? \"Failed to fetch CDR report\"\r\n\t\t\t);\r\n\t\t\tsetRecords([]);\r\n\t\t\tsetTotalRecords(0);\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: CdrReportParams): Promise<void> => {\r\n\t\tconst qs = buildCdrQuery(params);\r\n\t\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, {\r\n\t\t\tresponseType: \"blob\",\r\n\t\t});\r\n\t\tconst blob = res.data as Blob;\r\n\t\tconst url = window.URL.createObjectURL(blob);\r\n\t\tconst a = document.createElement(\"a\");\r\n\t\ta.href = url;\r\n\t\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\t\tdocument.body.appendChild(a);\r\n\t\ta.click();\r\n\t\ta.remove();\r\n\t\twindow.URL.revokeObjectURL(url);\r\n\t}, []);\r\n\r\n\tconst fetchRecording = useCallback(async (callUuid: string): Promise<Blob> => {\r\n\t\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), {\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\trecords,\r\n\t\ttotalRecords,\r\n\t\tloading,\r\n\t\terror,\r\n\t\tsetError,\r\n\t\tfetchRecords,\r\n\t\texportExcel,\r\n\t\tfetchRecording,\r\n\t};\r\n}\r\n\r\n// ─── CDR filter options hook (agents + queues) ───────────────────────────────\r\n//\r\n// The main app's CdrReport uses the general user-list and master-queue endpoints\r\n// (NOT a CDR-specific filter endpoint). We mirror that here.\r\n// - agents: GET /api/v1/users/?role=AGENT → filter to role === \"AGENT\"\r\n// - queues: GET /api/v1/master/queue\r\n\r\ninterface UserListItem {\r\n\tid: number;\r\n\tuserId: string;\r\n\tfirstName?: string;\r\n\tlastName?: string;\r\n\trole?: string | { name?: string } | null;\r\n}\r\n\r\ninterface QueueListItem {\r\n\tid: number;\r\n\tname: string;\r\n}\r\n\r\nexport function useCdrFilters() {\r\n\tconst [agents, setAgents] = useState<CdrAgentFilterOption[]>([]);\r\n\tconst [queues, setQueues] = useState<CdrQueueFilterOption[]>([]);\r\n\tconst [loading, setLoading] = useState(false);\r\n\r\n\tconst fetchAgents = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<UserListItem[] | { data: UserListItem[] }>(\r\n\t\t\t\tEND_POINT.USERS_LIST,\r\n\t\t\t\t{ params: { role: \"AGENT\" } },\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tconst mapped: CdrAgentFilterOption[] = (raw as UserListItem[])\r\n\t\t\t\t.filter((u) => {\r\n\t\t\t\t\tconst roleName = typeof u.role === \"object\" && u.role !== null ? u.role.name : u.role;\r\n\t\t\t\t\treturn roleName === \"AGENT\";\r\n\t\t\t\t})\r\n\t\t\t\t.map((u) => ({\r\n\t\t\t\t\tid: u.id,\r\n\t\t\t\t\tuserId: u.userId,\r\n\t\t\t\t\tfullName: [u.firstName, u.lastName].filter(Boolean).join(\" \") || u.userId,\r\n\t\t\t\t}));\r\n\t\t\tsetAgents(mapped);\r\n\t\t} catch {\r\n\t\t\tsetAgents([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchQueues = useCallback(async (): Promise<void> => {\r\n\t\ttry {\r\n\t\t\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(\r\n\t\t\t\tEND_POINT.MASTER_QUEUES,\r\n\t\t\t);\r\n\t\t\tconst raw = Array.isArray(res.data)\r\n\t\t\t\t? res.data\r\n\t\t\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t\t\t? (res.data as any).data\r\n\t\t\t\t\t: [];\r\n\t\t\tsetQueues((raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name })));\r\n\t\t} catch {\r\n\t\t\tsetQueues([]);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst fetchAll = useCallback(async (): Promise<void> => {\r\n\t\tsetLoading(true);\r\n\t\ttry {\r\n\t\t\tawait Promise.all([fetchAgents(), fetchQueues()]);\r\n\t\t} finally {\r\n\t\t\tsetLoading(false);\r\n\t\t}\r\n\t}, [fetchAgents, fetchQueues]);\r\n\r\n\treturn { agents, queues, loading, fetchAgents, fetchQueues, fetchAll };\r\n}\r\n\r\nexport interface Queue {\r\n\tid: number;\r\n\tname: string;\r\n\tdescription: string;\r\n\tisActive: boolean;\r\n}\r\n\r\nexport async function getQueues(): Promise<Queue[]> {\r\n\tconst res = await axiosInstance.get<QueueListItem[] | { data: QueueListItem[] }>(END_POINT.MASTER_QUEUES);\r\n\tconst raw = Array.isArray(res.data)\r\n\t\t? res.data\r\n\t\t: Array.isArray((res.data as any)?.data)\r\n\t\t\t? (res.data as any).data\r\n\t\t\t: [];\r\n\treturn (raw as QueueListItem[]).map((q) => ({ id: q.id, name: q.name, description: \"\", isActive: true }));\r\n}\r\n\r\nexport async function getCdrReportRecords(params: CdrReportParams): Promise<CdrRecordsPage> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get<CdrRecordsPage>(`${END_POINT.CDR_REPORT_RECORDS}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\n/**\r\n * Combined CDR report — stats + the current page of records in one call.\r\n * This is the documented endpoint that honours page/pageSize/search.\r\n */\r\nexport async function getCdrReport(params: CdrReportParams): Promise<CdrReportResponse> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get<CdrReportResponse>(`${END_POINT.CDR_REPORT}${qs}`);\r\n\treturn res.data;\r\n}\r\n\r\nexport async function exportCdrReportToExcel(params: CdrReportParams): Promise<void> {\r\n\tconst qs = buildCdrQuery(params);\r\n\tconst res = await axiosInstance.get(`${END_POINT.CDR_REPORT_EXPORT_EXCEL}${qs}`, { responseType: \"blob\" });\r\n\tconst url = window.URL.createObjectURL(new Blob([res.data]));\r\n\tconst a = document.createElement(\"a\");\r\n\ta.href = url;\r\n\ta.download = `cdr-report-${params.start_date ?? \"export\"}.xlsx`;\r\n\tdocument.body.appendChild(a);\r\n\ta.click();\r\n\ta.remove();\r\n\twindow.URL.revokeObjectURL(url);\r\n}\r\n\r\nexport async function getRecordingByCall(callUuid: string): Promise<Blob> {\r\n\tconst res = await axiosInstance.get(END_POINT.RECORDING_BY_CALL(callUuid), { responseType: \"blob\" });\r\n\treturn res.data;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,aAAa,gBAAgB;AAatC,SAAS,cAAc,QAAiC;AACvD,QAAM,KAAK,IAAI,gBAAgB;AAC/B,MAAI,OAAO,WAAY,IAAG,OAAO,cAAc,OAAO,UAAU;AAChE,MAAI,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,QAAQ;AAC1D,MAAI,OAAO,UAAU;AACpB,eAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,UAAU;AACpB,eAAW,MAAM,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,EAAE,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,UAAW,IAAG,OAAO,aAAa,OAAO,SAAS;AAC7D,MAAI,OAAO,OAAQ,IAAG,OAAO,UAAU,OAAO,MAAM;AACpD,MAAI,OAAO,OAAQ,IAAG,OAAO,UAAU,OAAO,MAAM;AACpD,MAAI,OAAO,KAAM,IAAG,OAAO,QAAQ,OAAO,OAAO,IAAI,CAAC;AACtD,MAAI,OAAO,SAAU,IAAG,OAAO,YAAY,OAAO,OAAO,QAAQ,CAAC;AAClE,QAAM,MAAM,GAAG,SAAS;AACxB,SAAO,MAAM,IAAI,GAAG,KAAK;AAC1B;AA0JA,eAAsB,YAA8B;AAxLpD;AAyLC,QAAM,MAAM,MAAM,cAAc,IAAiD,UAAU,aAAa;AACxG,QAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,IAC/B,IAAI,OACJ,MAAM,SAAS,SAAI,SAAJ,mBAAkB,IAAI,IACnC,IAAI,KAAa,OAClB,CAAC;AACL,SAAQ,IAAwB,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,aAAa,IAAI,UAAU,KAAK,EAAE;AACzG;AAYA,eAAsB,aAAa,QAAqD;AACvF,QAAM,KAAK,cAAc,MAAM;AAC/B,QAAM,MAAM,MAAM,cAAc,IAAuB,GAAG,UAAU,UAAU,GAAG,EAAE,EAAE;AACrF,SAAO,IAAI;AACZ;AAEA,eAAsB,uBAAuB,QAAwC;AAlNrF;AAmNC,QAAM,KAAK,cAAc,MAAM;AAC/B,QAAM,MAAM,MAAM,cAAc,IAAI,GAAG,UAAU,uBAAuB,GAAG,EAAE,IAAI,EAAE,cAAc,OAAO,CAAC;AACzG,QAAM,MAAM,OAAO,IAAI,gBAAgB,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;AAC3D,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW,eAAc,YAAO,eAAP,YAAqB,QAAQ;AACxD,WAAS,KAAK,YAAY,CAAC;AAC3B,IAAE,MAAM;AACR,IAAE,OAAO;AACT,SAAO,IAAI,gBAAgB,GAAG;AAC/B;AAEA,eAAsB,mBAAmB,UAAiC;AACzE,QAAM,MAAM,MAAM,cAAc,IAAI,UAAU,kBAAkB,QAAQ,GAAG,EAAE,cAAc,OAAO,CAAC;AACnG,SAAO,IAAI;AACZ;","names":[]}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as __ext_react from "react";
|
|
2
|
+
import * as __ext_react_dom from "react-dom";
|
|
3
|
+
import * as __ext_react_jsx from "react/jsx-runtime";
|
|
4
|
+
var __cjsExternals = { "react": __ext_react, "react-dom": __ext_react_dom, "react/jsx-runtime": __ext_react_jsx };
|
|
5
|
+
var require = function (id) {
|
|
6
|
+
var mod = __cjsExternals[id];
|
|
7
|
+
if (mod) return mod.default || mod;
|
|
8
|
+
throw new Error('Dynamic require of "' + id + '" is not supported');
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// call-control-sdk/lib/pages/common/components/PageHeader.tsx
|
|
13
|
+
import { Box, Typography, IconButton } from "@mui/material";
|
|
14
|
+
import ArrowBackIcon from "@mui/icons-material/ArrowBack";
|
|
15
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
+
function PageHeader({
|
|
17
|
+
title,
|
|
18
|
+
subtitle,
|
|
19
|
+
avatar,
|
|
20
|
+
showBack = false,
|
|
21
|
+
onBack,
|
|
22
|
+
actions,
|
|
23
|
+
count,
|
|
24
|
+
countLabel = "items"
|
|
25
|
+
}) {
|
|
26
|
+
const handleBack = () => onBack == null ? void 0 : onBack();
|
|
27
|
+
return /* @__PURE__ */ jsx(Box, { sx: { px: { xs: 2, md: 2.5 }, py: "14px" }, children: /* @__PURE__ */ jsxs(
|
|
28
|
+
Box,
|
|
29
|
+
{
|
|
30
|
+
sx: {
|
|
31
|
+
display: "flex",
|
|
32
|
+
alignItems: { xs: "flex-start", sm: "center" },
|
|
33
|
+
justifyContent: "space-between",
|
|
34
|
+
flexDirection: { xs: "column", sm: "row" },
|
|
35
|
+
gap: 1
|
|
36
|
+
},
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1.25, minWidth: 0 }, children: [
|
|
39
|
+
showBack && /* @__PURE__ */ jsx(
|
|
40
|
+
IconButton,
|
|
41
|
+
{
|
|
42
|
+
onClick: handleBack,
|
|
43
|
+
size: "small",
|
|
44
|
+
sx: {
|
|
45
|
+
width: 30,
|
|
46
|
+
height: 30,
|
|
47
|
+
flexShrink: 0,
|
|
48
|
+
border: "none",
|
|
49
|
+
borderRadius: "6px",
|
|
50
|
+
backgroundColor: "action.hover",
|
|
51
|
+
color: "text.secondary",
|
|
52
|
+
"&:hover": { backgroundColor: "action.selected", color: "text.primary" },
|
|
53
|
+
transition: "all 0.15s ease"
|
|
54
|
+
},
|
|
55
|
+
children: /* @__PURE__ */ jsx(ArrowBackIcon, { sx: { fontSize: 15 } })
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
avatar,
|
|
59
|
+
/* @__PURE__ */ jsxs(Box, { children: [
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
Typography,
|
|
62
|
+
{
|
|
63
|
+
sx: {
|
|
64
|
+
fontWeight: 700,
|
|
65
|
+
fontSize: { xs: "1.25rem", sm: "1.5rem", lg: "1.75rem" },
|
|
66
|
+
color: "text.primary",
|
|
67
|
+
lineHeight: 1.3,
|
|
68
|
+
whiteSpace: "nowrap",
|
|
69
|
+
overflow: "hidden",
|
|
70
|
+
textOverflow: "ellipsis",
|
|
71
|
+
pl: !showBack ? 0 : 2
|
|
72
|
+
},
|
|
73
|
+
children: title
|
|
74
|
+
}
|
|
75
|
+
),
|
|
76
|
+
subtitle && /* @__PURE__ */ jsx(
|
|
77
|
+
Typography,
|
|
78
|
+
{
|
|
79
|
+
sx: {
|
|
80
|
+
fontSize: "0.78rem",
|
|
81
|
+
color: "text.secondary",
|
|
82
|
+
pl: !showBack ? 0 : 2,
|
|
83
|
+
mt: 0.2,
|
|
84
|
+
lineHeight: 1.4
|
|
85
|
+
},
|
|
86
|
+
children: subtitle
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
] })
|
|
90
|
+
] }),
|
|
91
|
+
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, flexShrink: 0 }, children: [
|
|
92
|
+
count !== void 0 && /* @__PURE__ */ jsxs(
|
|
93
|
+
Box,
|
|
94
|
+
{
|
|
95
|
+
sx: {
|
|
96
|
+
display: "flex",
|
|
97
|
+
alignItems: "center",
|
|
98
|
+
gap: "5px",
|
|
99
|
+
px: "10px",
|
|
100
|
+
height: 32,
|
|
101
|
+
border: "1px solid",
|
|
102
|
+
borderColor: "divider",
|
|
103
|
+
borderRadius: "6px",
|
|
104
|
+
backgroundColor: "background.paper",
|
|
105
|
+
whiteSpace: "nowrap"
|
|
106
|
+
},
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ jsx(Box, { sx: { width: 6, height: 6, borderRadius: "50%", backgroundColor: "#1A5F6C", flexShrink: 0 } }),
|
|
109
|
+
/* @__PURE__ */ jsxs(Typography, { sx: { fontSize: "0.75rem", color: "text.secondary" }, children: [
|
|
110
|
+
count,
|
|
111
|
+
" ",
|
|
112
|
+
countLabel
|
|
113
|
+
] })
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
actions
|
|
118
|
+
] })
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
) });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export {
|
|
125
|
+
PageHeader
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=chunk-KRXHK4AU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/common/components/PageHeader.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { Box, Typography, IconButton } from \"@mui/material\";\r\nimport ArrowBackIcon from \"@mui/icons-material/ArrowBack\";\r\n\r\ninterface PageHeaderProps {\r\n title: string;\r\n subtitle?: React.ReactNode;\r\n avatar?: React.ReactNode;\r\n showBack?: boolean;\r\n onBack?: () => void;\r\n actions?: React.ReactNode;\r\n count?: number;\r\n countLabel?: string;\r\n}\r\n\r\nexport default function PageHeader({\r\n title,\r\n subtitle,\r\n avatar,\r\n showBack = false,\r\n onBack,\r\n actions,\r\n count,\r\n countLabel = \"items\",\r\n}: PageHeaderProps) {\r\n const handleBack = () => onBack?.();\r\n\r\n return (\r\n <Box sx={{ px: { xs: 2, md: 2.5 }, py: \"14px\" }}>\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: { xs: \"flex-start\", sm: \"center\" },\r\n justifyContent: \"space-between\",\r\n flexDirection: { xs: \"column\", sm: \"row\" },\r\n gap: 1,\r\n }}\r\n >\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1.25, minWidth: 0 }}>\r\n {showBack && (\r\n <IconButton\r\n onClick={handleBack}\r\n size=\"small\"\r\n sx={{\r\n width: 30,\r\n height: 30,\r\n flexShrink: 0,\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n backgroundColor: \"action.hover\",\r\n color: \"text.secondary\",\r\n \"&:hover\": { backgroundColor: \"action.selected\", color: \"text.primary\" },\r\n transition: \"all 0.15s ease\",\r\n }}\r\n >\r\n <ArrowBackIcon sx={{ fontSize: 15 }} />\r\n </IconButton>\r\n )}\r\n {avatar}\r\n <Box>\r\n <Typography\r\n sx={{\r\n fontWeight: 700,\r\n fontSize: { xs: \"1.25rem\", sm: \"1.5rem\", lg: \"1.75rem\" },\r\n color: \"text.primary\",\r\n lineHeight: 1.3,\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n pl: !showBack ? 0 : 2,\r\n }}\r\n >\r\n {title}\r\n </Typography>\r\n {subtitle && (\r\n <Typography\r\n sx={{\r\n fontSize: \"0.78rem\",\r\n color: \"text.secondary\",\r\n pl: !showBack ? 0 : 2,\r\n mt: 0.2,\r\n lineHeight: 1.4,\r\n }}\r\n >\r\n {subtitle}\r\n </Typography>\r\n )}\r\n </Box>\r\n </Box>\r\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, flexShrink: 0 }}>\r\n {count !== undefined && (\r\n <Box\r\n sx={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"5px\",\r\n px: \"10px\",\r\n height: 32,\r\n border: \"1px solid\",\r\n borderColor: \"divider\",\r\n borderRadius: \"6px\",\r\n backgroundColor: \"background.paper\",\r\n whiteSpace: \"nowrap\",\r\n }}\r\n >\r\n <Box sx={{ width: 6, height: 6, borderRadius: \"50%\", backgroundColor: \"#1A5F6C\", flexShrink: 0 }} />\r\n <Typography sx={{ fontSize: \"0.75rem\", color: \"text.secondary\" }}>\r\n {count} {countLabel}\r\n </Typography>\r\n </Box>\r\n )}\r\n {actions}\r\n </Box>\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n"],"mappings":";;;;;;;;;;;;AACA,SAAS,KAAK,YAAY,kBAAkB;AAC5C,OAAO,mBAAmB;AAqDZ,cAIJ,YAJI;AAxCC,SAAR,WAA4B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAAoB;AAClB,QAAM,aAAa,MAAM;AAEzB,SACE,oBAAC,OAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,OAAO,GAC5C;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY,EAAE,IAAI,cAAc,IAAI,SAAS;AAAA,QAC7C,gBAAgB;AAAA,QAChB,eAAe,EAAE,IAAI,UAAU,IAAI,MAAM;AAAA,QACzC,KAAK;AAAA,MACP;AAAA,MAEA;AAAA,6BAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,MAAM,UAAU,EAAE,GACtE;AAAA,sBACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,MAAK;AAAA,cACL,IAAI;AAAA,gBACF,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,WAAW,EAAE,iBAAiB,mBAAmB,OAAO,eAAe;AAAA,gBACvE,YAAY;AAAA,cACd;AAAA,cAEA,8BAAC,iBAAc,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,UACvC;AAAA,UAED;AAAA,UACD,qBAAC,OACC;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,kBACF,YAAY;AAAA,kBACZ,UAAU,EAAE,IAAI,WAAW,IAAI,UAAU,IAAI,UAAU;AAAA,kBACvD,OAAO;AAAA,kBACP,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,UAAU;AAAA,kBACV,cAAc;AAAA,kBACd,IAAI,CAAC,WAAW,IAAI;AAAA,gBACtB;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,YACC,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,kBACF,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,IAAI,CAAC,WAAW,IAAI;AAAA,kBACpB,IAAI;AAAA,kBACJ,YAAY;AAAA,gBACd;AAAA,gBAEC;AAAA;AAAA,YACH;AAAA,aAEJ;AAAA,WACF;AAAA,QACA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,YAAY,EAAE,GACrE;AAAA,oBAAU,UACT;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,IAAI;AAAA,gBACJ,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,cAAc;AAAA,gBACd,iBAAiB;AAAA,gBACjB,YAAY;AAAA,cACd;AAAA,cAEA;AAAA,oCAAC,OAAI,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,OAAO,iBAAiB,WAAW,YAAY,EAAE,GAAG;AAAA,gBAClG,qBAAC,cAAW,IAAI,EAAE,UAAU,WAAW,OAAO,iBAAiB,GAC5D;AAAA;AAAA,kBAAM;AAAA,kBAAE;AAAA,mBACX;AAAA;AAAA;AAAA,UACF;AAAA,UAED;AAAA,WACH;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
+
import * as __ext_react from "react";
|
|
2
|
+
import * as __ext_react_dom from "react-dom";
|
|
3
|
+
import * as __ext_react_jsx from "react/jsx-runtime";
|
|
4
|
+
var __cjsExternals = { "react": __ext_react, "react-dom": __ext_react_dom, "react/jsx-runtime": __ext_react_jsx };
|
|
5
|
+
var require = function (id) {
|
|
6
|
+
var mod = __cjsExternals[id];
|
|
7
|
+
if (mod) return mod.default || mod;
|
|
8
|
+
throw new Error('Dynamic require of "' + id + '" is not supported');
|
|
9
|
+
};
|
|
10
|
+
|
|
1
11
|
import {
|
|
2
12
|
END_POINT,
|
|
3
13
|
axios_default
|
|
4
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-F7G2XFRU.mjs";
|
|
5
15
|
|
|
6
16
|
// call-control-sdk/lib/hooks/useCallMonitoring.ts
|
|
7
17
|
import { useCallback, useState } from "react";
|
|
@@ -79,4 +89,4 @@ var useCallMonitoring = () => {
|
|
|
79
89
|
export {
|
|
80
90
|
useCallMonitoring
|
|
81
91
|
};
|
|
82
|
-
//# sourceMappingURL=chunk-
|
|
92
|
+
//# sourceMappingURL=chunk-LWDAC6QU.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../call-control-sdk/lib/hooks/useCallMonitoring.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\n\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type SupervisorMonitorMode = \"listen\" | \"whisper\" | \"barge\";\r\n\r\nexport interface StartMonitoringPayload {\r\n\t/** UUID of the active call to monitor */\r\n\tcall_id: string;\r\n\t/** Monitoring mode: listen (hear only), whisper (speak to agent), barge (full 3-way) */\r\n\tmode: SupervisorMonitorMode;\r\n\t/** Optional: supervisor's SIP/WebRTC extension. Auto-detected from logged-in user if omitted */\r\n\tsupervisor_extension?: string;\r\n\t/** Optional: agent's extension. Auto-detected if omitted */\r\n\tagent_extension?: string;\r\n}\r\n\r\nexport interface StopMonitoringPayload {\r\n\t/** UUID of the call being monitored */\r\n\tcall_uuid: string;\r\n\t/** Legacy field – ignored by the backend but kept for compatibility */\r\n\tsession_id?: string;\r\n}\r\n\r\nexport interface ChangeModePayload {\r\n\t/** UUID of the call being monitored */\r\n\tcall_uuid: string;\r\n\t/** New monitoring mode to switch to */\r\n\tmode: SupervisorMonitorMode;\r\n\t/** Legacy field – ignored by the backend but kept for compatibility */\r\n\tsession_id?: string;\r\n}\r\n\r\nexport interface UseCallMonitoringReturn {\r\n\tstartMonitoring: (payload: StartMonitoringPayload) => Promise<any>;\r\n\tstopMonitoring: (payload: StopMonitoringPayload) => Promise<any>;\r\n\tchangeMode: (payload: ChangeModePayload) => Promise<any>;\r\n\tisLoading: boolean;\r\n\tisSuccess: boolean;\r\n\tisError: boolean;\r\n\terror: any;\r\n\tdata: any;\r\n}\r\n\r\n// ─── Hook ─────────────────────────────────────────────────────────────────────\r\n\r\nexport const useCallMonitoring = (): UseCallMonitoringReturn => {\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [success, setSuccess] = useState(false);\r\n\tconst [isError, setIsError] = useState(false);\r\n\tconst [error, setError] = useState<any>(null);\r\n\tconst [data, setData] = useState<any>(null);\r\n\r\n\tconst resetState = () => {\r\n\t\tsetSuccess(false);\r\n\t\tsetIsError(false);\r\n\t\tsetError(null);\r\n\t};\r\n\r\n\t/** Start supervisor monitoring on an active agent call (Listen / Whisper / Barge) */\r\n\tconst startMonitoring = useCallback(async (payload: StartMonitoringPayload) => {\r\n\t\tresetState();\r\n\t\tsetLoading(true);\r\n\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.SUPERVISOR_CALL_LISTEN, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\tsetError(err);\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []);\r\n\r\n\t/** Stop supervisor monitoring and disconnect from the call */\r\n\tconst stopMonitoring = useCallback(async (payload: StopMonitoringPayload) => {\r\n\t\tresetState();\r\n\t\tsetLoading(true);\r\n\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.SUPERVISOR_CALL_LEAVE, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\tsetError(err);\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []);\r\n\r\n\t/**\r\n\t * Change supervisor monitoring mode (e.g. listen → whisper → barge).\r\n\t * The backend hangs up the current ChanSpy call and originates a new one\r\n\t * with the updated mode – the supervisor's phone will ring again.\r\n\t */\r\n\tconst changeMode = useCallback(async (payload: ChangeModePayload) => {\r\n\t\tresetState();\r\n\t\tsetLoading(true);\r\n\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.SUPERVISOR_CALL_CHANGE_MODE, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\tsetError(err);\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\tstartMonitoring,\r\n\t\tstopMonitoring,\r\n\t\tchangeMode,\r\n\t\tisLoading: loading,\r\n\t\tisSuccess: success,\r\n\t\tisError,\r\n\t\terror,\r\n\t\tdata,\r\n\t};\r\n};\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/hooks/useCallMonitoring.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\n\r\nimport { END_POINT } from \"../services/endPoint\";\r\nimport axiosInstance from \"../services/axios\";\r\n\r\n// ─── Types ───────────────────────────────────────────────────────────────────\r\n\r\nexport type SupervisorMonitorMode = \"listen\" | \"whisper\" | \"barge\";\r\n\r\nexport interface StartMonitoringPayload {\r\n\t/** UUID of the active call to monitor */\r\n\tcall_id: string;\r\n\t/** Monitoring mode: listen (hear only), whisper (speak to agent), barge (full 3-way) */\r\n\tmode: SupervisorMonitorMode;\r\n\t/** Optional: supervisor's SIP/WebRTC extension. Auto-detected from logged-in user if omitted */\r\n\tsupervisor_extension?: string;\r\n\t/** Optional: agent's extension. Auto-detected if omitted */\r\n\tagent_extension?: string;\r\n}\r\n\r\nexport interface StopMonitoringPayload {\r\n\t/** UUID of the call being monitored */\r\n\tcall_uuid: string;\r\n\t/** Legacy field – ignored by the backend but kept for compatibility */\r\n\tsession_id?: string;\r\n}\r\n\r\nexport interface ChangeModePayload {\r\n\t/** UUID of the call being monitored */\r\n\tcall_uuid: string;\r\n\t/** New monitoring mode to switch to */\r\n\tmode: SupervisorMonitorMode;\r\n\t/** Legacy field – ignored by the backend but kept for compatibility */\r\n\tsession_id?: string;\r\n}\r\n\r\nexport interface UseCallMonitoringReturn {\r\n\tstartMonitoring: (payload: StartMonitoringPayload) => Promise<any>;\r\n\tstopMonitoring: (payload: StopMonitoringPayload) => Promise<any>;\r\n\tchangeMode: (payload: ChangeModePayload) => Promise<any>;\r\n\tisLoading: boolean;\r\n\tisSuccess: boolean;\r\n\tisError: boolean;\r\n\terror: any;\r\n\tdata: any;\r\n}\r\n\r\n// ─── Hook ─────────────────────────────────────────────────────────────────────\r\n\r\nexport const useCallMonitoring = (): UseCallMonitoringReturn => {\r\n\tconst [loading, setLoading] = useState(false);\r\n\tconst [success, setSuccess] = useState(false);\r\n\tconst [isError, setIsError] = useState(false);\r\n\tconst [error, setError] = useState<any>(null);\r\n\tconst [data, setData] = useState<any>(null);\r\n\r\n\tconst resetState = () => {\r\n\t\tsetSuccess(false);\r\n\t\tsetIsError(false);\r\n\t\tsetError(null);\r\n\t};\r\n\r\n\t/** Start supervisor monitoring on an active agent call (Listen / Whisper / Barge) */\r\n\tconst startMonitoring = useCallback(async (payload: StartMonitoringPayload) => {\r\n\t\tresetState();\r\n\t\tsetLoading(true);\r\n\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.SUPERVISOR_CALL_LISTEN, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\tsetError(err);\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []);\r\n\r\n\t/** Stop supervisor monitoring and disconnect from the call */\r\n\tconst stopMonitoring = useCallback(async (payload: StopMonitoringPayload) => {\r\n\t\tresetState();\r\n\t\tsetLoading(true);\r\n\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.SUPERVISOR_CALL_LEAVE, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\tsetError(err);\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []);\r\n\r\n\t/**\r\n\t * Change supervisor monitoring mode (e.g. listen → whisper → barge).\r\n\t * The backend hangs up the current ChanSpy call and originates a new one\r\n\t * with the updated mode – the supervisor's phone will ring again.\r\n\t */\r\n\tconst changeMode = useCallback(async (payload: ChangeModePayload) => {\r\n\t\tresetState();\r\n\t\tsetLoading(true);\r\n\r\n\t\treturn axiosInstance\r\n\t\t\t.post(END_POINT.SUPERVISOR_CALL_CHANGE_MODE, payload)\r\n\t\t\t.then((res) => {\r\n\t\t\t\tsetData(res?.data);\r\n\t\t\t\tsetSuccess(true);\r\n\t\t\t\treturn res?.data;\r\n\t\t\t})\r\n\t\t\t.catch((err) => {\r\n\t\t\t\tsetIsError(true);\r\n\t\t\t\tsetError(err);\r\n\t\t\t\treturn err?.response?.data;\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tsetLoading(false);\r\n\t\t\t});\r\n\t}, []);\r\n\r\n\treturn {\r\n\t\tstartMonitoring,\r\n\t\tstopMonitoring,\r\n\t\tchangeMode,\r\n\t\tisLoading: loading,\r\n\t\tisSuccess: success,\r\n\t\tisError,\r\n\t\terror,\r\n\t\tdata,\r\n\t};\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,aAAa,gBAAgB;AAiD/B,IAAM,oBAAoB,MAA+B;AAC/D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAc,IAAI;AAC5C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAc,IAAI;AAE1C,QAAM,aAAa,MAAM;AACxB,eAAW,KAAK;AAChB,eAAW,KAAK;AAChB,aAAS,IAAI;AAAA,EACd;AAGA,QAAM,kBAAkB,YAAY,OAAO,YAAoC;AAC9E,eAAW;AACX,eAAW,IAAI;AAEf,WAAO,cACL,KAAK,UAAU,wBAAwB,OAAO,EAC9C,KAAK,CAAC,QAAQ;AACd,cAAQ,2BAAK,IAAI;AACjB,iBAAW,IAAI;AACf,aAAO,2BAAK;AAAA,IACb,CAAC,EACA,MAAM,CAAC,QAAQ;AA1EnB;AA2EI,iBAAW,IAAI;AACf,eAAS,GAAG;AACZ,cAAO,gCAAK,aAAL,mBAAe;AAAA,IACvB,CAAC,EACA,QAAQ,MAAM;AACd,iBAAW,KAAK;AAAA,IACjB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAGL,QAAM,iBAAiB,YAAY,OAAO,YAAmC;AAC5E,eAAW;AACX,eAAW,IAAI;AAEf,WAAO,cACL,KAAK,UAAU,uBAAuB,OAAO,EAC7C,KAAK,CAAC,QAAQ;AACd,cAAQ,2BAAK,IAAI;AACjB,iBAAW,IAAI;AACf,aAAO,2BAAK;AAAA,IACb,CAAC,EACA,MAAM,CAAC,QAAQ;AAhGnB;AAiGI,iBAAW,IAAI;AACf,eAAS,GAAG;AACZ,cAAO,gCAAK,aAAL,mBAAe;AAAA,IACvB,CAAC,EACA,QAAQ,MAAM;AACd,iBAAW,KAAK;AAAA,IACjB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAOL,QAAM,aAAa,YAAY,OAAO,YAA+B;AACpE,eAAW;AACX,eAAW,IAAI;AAEf,WAAO,cACL,KAAK,UAAU,6BAA6B,OAAO,EACnD,KAAK,CAAC,QAAQ;AACd,cAAQ,2BAAK,IAAI;AACjB,iBAAW,IAAI;AACf,aAAO,2BAAK;AAAA,IACb,CAAC,EACA,MAAM,CAAC,QAAQ;AA1HnB;AA2HI,iBAAW,IAAI;AACf,eAAS,GAAG;AACZ,cAAO,gCAAK,aAAL,mBAAe;AAAA,IACvB,CAAC,EACA,QAAQ,MAAM;AACd,iBAAW,KAAK;AAAA,IACjB,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;","names":[]}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import * as __ext_react from "react";
|
|
2
|
+
import * as __ext_react_dom from "react-dom";
|
|
3
|
+
import * as __ext_react_jsx from "react/jsx-runtime";
|
|
4
|
+
var __cjsExternals = { "react": __ext_react, "react-dom": __ext_react_dom, "react/jsx-runtime": __ext_react_jsx };
|
|
5
|
+
var require = function (id) {
|
|
6
|
+
var mod = __cjsExternals[id];
|
|
7
|
+
if (mod) return mod.default || mod;
|
|
8
|
+
throw new Error('Dynamic require of "' + id + '" is not supported');
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
// call-control-sdk/lib/pages/common/components/AppButton.tsx
|
|
13
|
+
import { Button, useTheme } from "@mui/material";
|
|
14
|
+
import { alpha } from "@mui/material/styles";
|
|
15
|
+
import { jsx } from "react/jsx-runtime";
|
|
16
|
+
var muiVariant = {
|
|
17
|
+
primary: "contained",
|
|
18
|
+
danger: "contained",
|
|
19
|
+
cancel: "text",
|
|
20
|
+
outlined: "outlined"
|
|
21
|
+
};
|
|
22
|
+
function AppButton({
|
|
23
|
+
children,
|
|
24
|
+
variant = "primary",
|
|
25
|
+
onClick,
|
|
26
|
+
startIcon,
|
|
27
|
+
endIcon,
|
|
28
|
+
disabled = false,
|
|
29
|
+
type = "button",
|
|
30
|
+
size = "medium",
|
|
31
|
+
fullWidth = false,
|
|
32
|
+
sx
|
|
33
|
+
}) {
|
|
34
|
+
const theme = useTheme();
|
|
35
|
+
const primary = theme.palette.primary.main;
|
|
36
|
+
const primaryDark = theme.palette.primary.dark;
|
|
37
|
+
const styles = {
|
|
38
|
+
primary: {
|
|
39
|
+
textTransform: "none",
|
|
40
|
+
fontWeight: 600,
|
|
41
|
+
backgroundColor: primary,
|
|
42
|
+
borderRadius: "30px",
|
|
43
|
+
fontSize: "0.82rem",
|
|
44
|
+
px: 2,
|
|
45
|
+
boxShadow: `0 2px 8px ${alpha(primary, 0.25)}`,
|
|
46
|
+
"&:hover": {
|
|
47
|
+
backgroundColor: primaryDark,
|
|
48
|
+
boxShadow: `0 4px 12px ${alpha(primary, 0.35)}`
|
|
49
|
+
},
|
|
50
|
+
"&.Mui-disabled": {
|
|
51
|
+
backgroundColor: alpha(primary, 0.4),
|
|
52
|
+
color: "#fff"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
danger: {
|
|
56
|
+
textTransform: "none",
|
|
57
|
+
fontWeight: 600,
|
|
58
|
+
backgroundColor: "#d32f2f",
|
|
59
|
+
borderRadius: "8px",
|
|
60
|
+
fontSize: "0.82rem",
|
|
61
|
+
px: 2,
|
|
62
|
+
"&:hover": { backgroundColor: "#b71c1c" },
|
|
63
|
+
"&.Mui-disabled": { backgroundColor: "#e57373", color: "#fff" }
|
|
64
|
+
},
|
|
65
|
+
cancel: {
|
|
66
|
+
textTransform: "none",
|
|
67
|
+
fontWeight: 600,
|
|
68
|
+
color: "#666",
|
|
69
|
+
borderRadius: "30px",
|
|
70
|
+
fontSize: "0.82rem",
|
|
71
|
+
px: 2,
|
|
72
|
+
border: "1px solid #d0d0d0",
|
|
73
|
+
"&:hover": { backgroundColor: "#f5f5f5", borderColor: "#bbb" }
|
|
74
|
+
},
|
|
75
|
+
outlined: {
|
|
76
|
+
textTransform: "none",
|
|
77
|
+
fontWeight: 600,
|
|
78
|
+
color: primary,
|
|
79
|
+
borderColor: primary,
|
|
80
|
+
borderRadius: "30px",
|
|
81
|
+
fontSize: "0.82rem",
|
|
82
|
+
px: 2,
|
|
83
|
+
"&:hover": { borderColor: primaryDark, backgroundColor: alpha(primary, 0.05) }
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
return /* @__PURE__ */ jsx(
|
|
87
|
+
Button,
|
|
88
|
+
{
|
|
89
|
+
variant: muiVariant[variant],
|
|
90
|
+
onClick,
|
|
91
|
+
startIcon,
|
|
92
|
+
endIcon,
|
|
93
|
+
disabled,
|
|
94
|
+
type,
|
|
95
|
+
size,
|
|
96
|
+
fullWidth,
|
|
97
|
+
sx: [styles[variant], ...Array.isArray(sx) ? sx : [sx]],
|
|
98
|
+
children
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
AppButton
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=chunk-LX6I32Y4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../call-control-sdk/lib/pages/common/components/AppButton.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Button, SxProps, Theme, useTheme } from '@mui/material';\r\nimport { alpha } from '@mui/material/styles';\r\n\r\ntype AppButtonVariant = 'primary' | 'danger' | 'cancel' | 'outlined';\r\n\r\ninterface AppButtonProps {\r\n children: React.ReactNode;\r\n variant?: AppButtonVariant;\r\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\r\n startIcon?: React.ReactNode;\r\n endIcon?: React.ReactNode;\r\n disabled?: boolean;\r\n type?: 'button' | 'submit' | 'reset';\r\n size?: 'small' | 'medium' | 'large';\r\n fullWidth?: boolean;\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nconst muiVariant: Record<AppButtonVariant, 'contained' | 'outlined' | 'text'> = {\r\n primary: 'contained',\r\n danger: 'contained',\r\n cancel: 'text',\r\n outlined: 'outlined',\r\n};\r\n\r\nexport default function AppButton({\r\n children,\r\n variant = 'primary',\r\n onClick,\r\n startIcon,\r\n endIcon,\r\n disabled = false,\r\n type = 'button',\r\n size = 'medium',\r\n fullWidth = false,\r\n sx,\r\n}: AppButtonProps) {\r\n const theme = useTheme();\r\n const primary = theme.palette.primary.main;\r\n const primaryDark = theme.palette.primary.dark;\r\n\r\n const styles: Record<AppButtonVariant, SxProps<Theme>> = {\r\n primary: {\r\n textTransform: 'none',\r\n fontWeight: 600,\r\n backgroundColor: primary,\r\n borderRadius: '30px',\r\n fontSize: '0.82rem',\r\n px: 2,\r\n boxShadow: `0 2px 8px ${alpha(primary, 0.25)}`,\r\n '&:hover': {\r\n backgroundColor: primaryDark,\r\n boxShadow: `0 4px 12px ${alpha(primary, 0.35)}`,\r\n },\r\n '&.Mui-disabled': {\r\n backgroundColor: alpha(primary, 0.4),\r\n color: '#fff',\r\n },\r\n },\r\n danger: {\r\n textTransform: 'none',\r\n fontWeight: 600,\r\n backgroundColor: '#d32f2f',\r\n borderRadius: '8px',\r\n fontSize: '0.82rem',\r\n px: 2,\r\n '&:hover': { backgroundColor: '#b71c1c' },\r\n '&.Mui-disabled': { backgroundColor: '#e57373', color: '#fff' },\r\n },\r\n cancel: {\r\n textTransform: 'none',\r\n fontWeight: 600,\r\n color: '#666',\r\n borderRadius: '30px',\r\n fontSize: '0.82rem',\r\n px: 2,\r\n border: '1px solid #d0d0d0',\r\n '&:hover': { backgroundColor: '#f5f5f5', borderColor: '#bbb' },\r\n },\r\n outlined: {\r\n textTransform: 'none',\r\n fontWeight: 600,\r\n color: primary,\r\n borderColor: primary,\r\n borderRadius: '30px',\r\n fontSize: '0.82rem',\r\n px: 2,\r\n '&:hover': { borderColor: primaryDark, backgroundColor: alpha(primary, 0.05) },\r\n },\r\n };\r\n\r\n return (\r\n <Button\r\n variant={muiVariant[variant]}\r\n onClick={onClick}\r\n startIcon={startIcon}\r\n endIcon={endIcon}\r\n disabled={disabled}\r\n type={type}\r\n size={size}\r\n fullWidth={fullWidth}\r\n sx={[styles[variant], ...(Array.isArray(sx) ? sx : [sx])]}\r\n >\r\n {children}\r\n </Button>\r\n );\r\n}\r\n"],"mappings":";;;;;;;;;;;;AACA,SAAS,QAAwB,gBAAgB;AACjD,SAAS,aAAa;AA2FlB;AA1EJ,IAAM,aAA0E;AAAA,EAC9E,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,UAAU;AACZ;AAEe,SAAR,UAA2B;AAAA,EAChC;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AACF,GAAmB;AACjB,QAAM,QAAQ,SAAS;AACvB,QAAM,UAAU,MAAM,QAAQ,QAAQ;AACtC,QAAM,cAAc,MAAM,QAAQ,QAAQ;AAE1C,QAAM,SAAmD;AAAA,IACvD,SAAS;AAAA,MACP,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,aAAa,MAAM,SAAS,IAAI,CAAC;AAAA,MAC5C,WAAW;AAAA,QACT,iBAAiB;AAAA,QACjB,WAAW,cAAc,MAAM,SAAS,IAAI,CAAC;AAAA,MAC/C;AAAA,MACA,kBAAkB;AAAA,QAChB,iBAAiB,MAAM,SAAS,GAAG;AAAA,QACnC,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,EAAE,iBAAiB,UAAU;AAAA,MACxC,kBAAkB,EAAE,iBAAiB,WAAW,OAAO,OAAO;AAAA,IAChE;AAAA,IACA,QAAQ;AAAA,MACN,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,WAAW,EAAE,iBAAiB,WAAW,aAAa,OAAO;AAAA,IAC/D;AAAA,IACA,UAAU;AAAA,MACR,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,cAAc;AAAA,MACd,UAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,EAAE,aAAa,aAAa,iBAAiB,MAAM,SAAS,IAAI,EAAE;AAAA,IAC/E;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAS,WAAW,OAAO;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,CAAC,OAAO,OAAO,GAAG,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,CAAC,EAAE,CAAE;AAAA,MAEvD;AAAA;AAAA,EACH;AAEJ;","names":[]}
|