ahs-cti 0.0.1

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.
Files changed (60) hide show
  1. package/LICENSE +53 -0
  2. package/LICENSE-ACHALA +80 -0
  3. package/README.md +639 -0
  4. package/dist/agentDetailReport-7TDO6MYQ.mjs +11 -0
  5. package/dist/agentDetailReport-7TDO6MYQ.mjs.map +1 -0
  6. package/dist/agentPerformanceReport-R3WY7Q7D.mjs +531 -0
  7. package/dist/agentPerformanceReport-R3WY7Q7D.mjs.map +1 -0
  8. package/dist/auditReport-CJ23LXIZ.mjs +15 -0
  9. package/dist/auditReport-CJ23LXIZ.mjs.map +1 -0
  10. package/dist/callHistory-743J7EKD.mjs +783 -0
  11. package/dist/callHistory-743J7EKD.mjs.map +1 -0
  12. package/dist/campaigns-N2RLUJHH.mjs +3005 -0
  13. package/dist/campaigns-N2RLUJHH.mjs.map +1 -0
  14. package/dist/caroQualityAuditDashboard-NRWY6SEC.mjs +66 -0
  15. package/dist/caroQualityAuditDashboard-NRWY6SEC.mjs.map +1 -0
  16. package/dist/caroVoiceAI-Z5BDDDSY.mjs +21 -0
  17. package/dist/caroVoiceAI-Z5BDDDSY.mjs.map +1 -0
  18. package/dist/cdrReport-577UYGZA.mjs +798 -0
  19. package/dist/cdrReport-577UYGZA.mjs.map +1 -0
  20. package/dist/chunk-6ICPXSN6.mjs +61 -0
  21. package/dist/chunk-6ICPXSN6.mjs.map +1 -0
  22. package/dist/chunk-BU6FMNBY.mjs +82 -0
  23. package/dist/chunk-BU6FMNBY.mjs.map +1 -0
  24. package/dist/chunk-DBSNJ3QH.mjs +1060 -0
  25. package/dist/chunk-DBSNJ3QH.mjs.map +1 -0
  26. package/dist/chunk-EJIWPC3H.mjs +747 -0
  27. package/dist/chunk-EJIWPC3H.mjs.map +1 -0
  28. package/dist/chunk-GTDWTI5S.mjs +17217 -0
  29. package/dist/chunk-GTDWTI5S.mjs.map +1 -0
  30. package/dist/chunk-L4LLUMYA.mjs +57 -0
  31. package/dist/chunk-L4LLUMYA.mjs.map +1 -0
  32. package/dist/chunk-NQL4VODC.mjs +180 -0
  33. package/dist/chunk-NQL4VODC.mjs.map +1 -0
  34. package/dist/chunk-NUYGQI7D.mjs +678 -0
  35. package/dist/chunk-NUYGQI7D.mjs.map +1 -0
  36. package/dist/chunk-RZZQ42MG.mjs +115 -0
  37. package/dist/chunk-RZZQ42MG.mjs.map +1 -0
  38. package/dist/chunk-UB5HSUGK.mjs +65 -0
  39. package/dist/chunk-UB5HSUGK.mjs.map +1 -0
  40. package/dist/chunk-VGVOMFYH.mjs +5781 -0
  41. package/dist/chunk-VGVOMFYH.mjs.map +1 -0
  42. package/dist/chunk-VZCHJLAW.mjs +61 -0
  43. package/dist/chunk-VZCHJLAW.mjs.map +1 -0
  44. package/dist/incoming-4WP3FJI4.mp3 +0 -0
  45. package/dist/incoming.mp3 +0 -0
  46. package/dist/index.d.mts +2476 -0
  47. package/dist/index.d.ts +2477 -0
  48. package/dist/index.js +41208 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/index.mjs +4641 -0
  51. package/dist/index.mjs.map +1 -0
  52. package/dist/liveStatus-IQIEZZE5.mjs +1077 -0
  53. package/dist/liveStatus-IQIEZZE5.mjs.map +1 -0
  54. package/dist/loginReport-H6XJU2MY.mjs +826 -0
  55. package/dist/loginReport-H6XJU2MY.mjs.map +1 -0
  56. package/dist/managementDashboard-NZMAJPPB.mjs +527 -0
  57. package/dist/managementDashboard-NZMAJPPB.mjs.map +1 -0
  58. package/dist/qualityAuditDashboard-ZJEEAMBS.mjs +66 -0
  59. package/dist/qualityAuditDashboard-ZJEEAMBS.mjs.map +1 -0
  60. package/package.json +114 -0
@@ -0,0 +1,57 @@
1
+ import {
2
+ sdkStateManager
3
+ } from "./chunk-DBSNJ3QH.mjs";
4
+ import {
5
+ __spreadProps,
6
+ __spreadValues
7
+ } from "./chunk-UB5HSUGK.mjs";
8
+
9
+ // call-control-sdk/lib/hooks/useGetCallerData.ts
10
+ import { useState, useEffect } from "react";
11
+ var useGetCallerData = () => {
12
+ var _a, _b;
13
+ const sdkState = sdkStateManager.getState();
14
+ const { process_id, process_name, status, phone_number, agent_id, call_id, call_details } = sdkState.callData;
15
+ const initialLeadData = sdkStateManager.getTransferLeadData();
16
+ const initialCallData = __spreadProps(__spreadValues({
17
+ phone_number,
18
+ status,
19
+ callReferenceId: call_id,
20
+ agent_id,
21
+ process_id,
22
+ process_name,
23
+ call_details,
24
+ auto_wrapup_time: (_b = (_a = sdkState.backendCallControls) == null ? void 0 : _a.auto_wrapup_time) != null ? _b : null
25
+ }, initialLeadData !== void 0 && { lead_data: initialLeadData }), {
26
+ socket_info: sdkState.callData
27
+ });
28
+ const [callData, setCallData] = useState(initialCallData);
29
+ useEffect(() => {
30
+ const unsubscribe = sdkStateManager.subscribe(() => {
31
+ var _a2, _b2;
32
+ const state = sdkStateManager.getState();
33
+ const { process_id: process_id2, process_name: process_name2, status: status2, phone_number: phone_number2, agent_id: agent_id2, call_id: call_id2, call_details: call_details2, auto_wrapup_time } = state.callData;
34
+ const lead_data = sdkStateManager.getTransferLeadData();
35
+ const currentCallData = __spreadProps(__spreadValues({
36
+ phone_number: phone_number2,
37
+ status: status2,
38
+ callReferenceId: call_id2,
39
+ agent_id: agent_id2,
40
+ process_id: process_id2,
41
+ process_name: process_name2,
42
+ call_details: call_details2,
43
+ auto_wrapup_time: (_b2 = auto_wrapup_time != null ? auto_wrapup_time : (_a2 = state.backendCallControls) == null ? void 0 : _a2.auto_wrapup_time) != null ? _b2 : null
44
+ }, lead_data !== void 0 && { lead_data }), {
45
+ socket_info: state.callData
46
+ });
47
+ setCallData(currentCallData);
48
+ });
49
+ return unsubscribe;
50
+ }, []);
51
+ return callData;
52
+ };
53
+
54
+ export {
55
+ useGetCallerData
56
+ };
57
+ //# sourceMappingURL=chunk-L4LLUMYA.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/hooks/useGetCallerData.ts"],"sourcesContent":["import { useState, useEffect } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { CallData } from \"../../types\";\r\n\r\nexport const useGetCallerData = (): CallData => {\r\n\tconst sdkState = sdkStateManager.getState();\r\n\tconst { process_id, process_name, status, phone_number, agent_id, call_id, call_details } =\r\n\t\tsdkState.callData;\r\n\tconst initialLeadData = sdkStateManager.getTransferLeadData();\r\n\tconst initialCallData = {\r\n\t\tphone_number,\r\n\t\tstatus,\r\n\t\tcallReferenceId: call_id,\r\n\t\tagent_id,\r\n\t\tprocess_id,\r\n\t\tprocess_name,\r\n\t\tcall_details,\r\n\t\tauto_wrapup_time: sdkState.backendCallControls?.auto_wrapup_time ?? null,\r\n\t\t...(initialLeadData !== undefined && { lead_data: initialLeadData }),\r\n\t\tsocket_info: sdkState.callData,\r\n\t};\r\n\tconst [callData, setCallData] = useState<CallData>(initialCallData);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst unsubscribe = sdkStateManager.subscribe(() => {\r\n\t\t\tconst state = sdkStateManager.getState();\r\n\t\t\tconst { process_id, process_name, status, phone_number, agent_id, call_id, call_details, auto_wrapup_time } =\r\n\t\t\t\tstate.callData;\r\n\t\t\tconst lead_data = sdkStateManager.getTransferLeadData();\r\n\t\t\tconst currentCallData = {\r\n\t\t\t\tphone_number,\r\n\t\t\t\tstatus,\r\n\t\t\t\tcallReferenceId: call_id,\r\n\t\t\t\tagent_id,\r\n\t\t\t\tprocess_id,\r\n\t\t\t\tprocess_name,\r\n\t\t\t\tcall_details,\r\n\t\t\t\tauto_wrapup_time: auto_wrapup_time ?? state.backendCallControls?.auto_wrapup_time ?? null,\r\n\t\t\t\t...(lead_data !== undefined && { lead_data }),\r\n\t\t\t\tsocket_info: state.callData,\r\n\t\t\t};\r\n\t\t\tsetCallData(currentCallData);\r\n\t\t});\r\n\r\n\t\treturn unsubscribe;\r\n\t}, []);\r\n\r\n\treturn callData;\r\n};\r\n"],"mappings":";;;;;;;;;AAAA,SAAS,UAAU,iBAAiB;AAI7B,IAAM,mBAAmB,MAAgB;AAJhD;AAKC,QAAM,WAAW,gBAAgB,SAAS;AAC1C,QAAM,EAAE,YAAY,cAAc,QAAQ,cAAc,UAAU,SAAS,aAAa,IACvF,SAAS;AACV,QAAM,kBAAkB,gBAAgB,oBAAoB;AAC5D,QAAM,kBAAkB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAkB,oBAAS,wBAAT,mBAA8B,qBAA9B,YAAkD;AAAA,KAChE,oBAAoB,UAAa,EAAE,WAAW,gBAAgB,IAT3C;AAAA,IAUvB,aAAa,SAAS;AAAA,EACvB;AACA,QAAM,CAAC,UAAU,WAAW,IAAI,SAAmB,eAAe;AAElE,YAAU,MAAM;AACf,UAAM,cAAc,gBAAgB,UAAU,MAAM;AAxBtD,UAAAA,KAAAC;AAyBG,YAAM,QAAQ,gBAAgB,SAAS;AACvC,YAAM,EAAE,YAAAC,aAAY,cAAAC,eAAc,QAAAC,SAAQ,cAAAC,eAAc,UAAAC,WAAU,SAAAC,UAAS,cAAAC,eAAc,iBAAiB,IACzG,MAAM;AACP,YAAM,YAAY,gBAAgB,oBAAoB;AACtD,YAAM,kBAAkB;AAAA,QACvB,cAAAH;AAAA,QACA,QAAAD;AAAA,QACA,iBAAiBG;AAAA,QACjB,UAAAD;AAAA,QACA,YAAAJ;AAAA,QACA,cAAAC;AAAA,QACA,cAAAK;AAAA,QACA,mBAAkBP,MAAA,+CAAoBD,MAAA,MAAM,wBAAN,gBAAAA,IAA2B,qBAA/C,OAAAC,MAAmE;AAAA,SACjF,cAAc,UAAa,EAAE,UAAU,IATpB;AAAA,QAUvB,aAAa,MAAM;AAAA,MACpB;AACA,kBAAY,eAAe;AAAA,IAC5B,CAAC;AAED,WAAO;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,SAAO;AACR;","names":["_a","_b","process_id","process_name","status","phone_number","agent_id","call_id","call_details"]}
@@ -0,0 +1,180 @@
1
+ import {
2
+ sdkStateManager
3
+ } from "./chunk-DBSNJ3QH.mjs";
4
+
5
+ // call-control-sdk/lib/hooks/useSDKPermissions.ts
6
+ import { useState, useEffect, useCallback } from "react";
7
+ function useSDKPermissions() {
8
+ var _a, _b;
9
+ const [state, setState] = useState(() => sdkStateManager.getState());
10
+ useEffect(() => {
11
+ const unsubscribe = sdkStateManager.subscribe(() => {
12
+ setState(sdkStateManager.getState());
13
+ });
14
+ return unsubscribe;
15
+ }, []);
16
+ const hasPermission = useCallback(
17
+ (permission) => sdkStateManager.hasPermission(permission),
18
+ // eslint-disable-next-line react-hooks/exhaustive-deps
19
+ [state.userPermissions]
20
+ );
21
+ const hasAnyPermission = useCallback(
22
+ (permissions) => sdkStateManager.hasAnyPermission(permissions),
23
+ // eslint-disable-next-line react-hooks/exhaustive-deps
24
+ [state.userPermissions]
25
+ );
26
+ const hasAllPermissions = useCallback(
27
+ (permissions) => sdkStateManager.hasAllPermissions(permissions),
28
+ // eslint-disable-next-line react-hooks/exhaustive-deps
29
+ [state.userPermissions]
30
+ );
31
+ const hasMenuFeature = useCallback(
32
+ (code) => sdkStateManager.hasMenuFeature(code),
33
+ // eslint-disable-next-line react-hooks/exhaustive-deps
34
+ [state.menuEntitlements]
35
+ );
36
+ const isBitEnabled = useCallback(
37
+ (category, bitCode) => sdkStateManager.isBitEnabled(category, bitCode),
38
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39
+ [state.sdk]
40
+ );
41
+ return {
42
+ permissions: (_a = state.userPermissions) != null ? _a : [],
43
+ menuEntitlements: (_b = state.menuEntitlements) != null ? _b : [],
44
+ isLoaded: state.isPermissionsLoaded,
45
+ hasPermission,
46
+ hasAnyPermission,
47
+ hasAllPermissions,
48
+ hasMenuFeature,
49
+ isBitEnabled
50
+ };
51
+ }
52
+
53
+ // call-control-sdk/lib/components/SDKAccessDenied.tsx
54
+ import { Box, Paper, Typography, useTheme } from "@mui/material";
55
+ import { alpha } from "@mui/material/styles";
56
+ import LockOutlinedIcon from "@mui/icons-material/LockOutlined";
57
+ import { jsx, jsxs } from "react/jsx-runtime";
58
+ var SDKAccessDenied = ({
59
+ message = "You don't have the necessary permissions to view this content."
60
+ }) => {
61
+ const theme = useTheme();
62
+ return /* @__PURE__ */ jsx(
63
+ Box,
64
+ {
65
+ sx: {
66
+ p: 4,
67
+ display: "flex",
68
+ flexDirection: "column",
69
+ alignItems: "center",
70
+ justifyContent: "center",
71
+ width: "100%",
72
+ height: "100%",
73
+ minHeight: 250
74
+ },
75
+ children: /* @__PURE__ */ jsxs(
76
+ Paper,
77
+ {
78
+ elevation: 0,
79
+ sx: {
80
+ p: 4,
81
+ display: "flex",
82
+ flexDirection: "column",
83
+ alignItems: "center",
84
+ bgcolor: alpha(theme.palette.error.main, 0.05),
85
+ borderRadius: 3,
86
+ border: "1px dashed",
87
+ borderColor: alpha(theme.palette.error.main, 0.3),
88
+ maxWidth: 420,
89
+ textAlign: "center"
90
+ },
91
+ children: [
92
+ /* @__PURE__ */ jsx(
93
+ Box,
94
+ {
95
+ sx: {
96
+ bgcolor: alpha(theme.palette.error.main, 0.1),
97
+ color: "error.main",
98
+ borderRadius: "50%",
99
+ p: 2,
100
+ display: "flex",
101
+ mb: 2
102
+ },
103
+ children: /* @__PURE__ */ jsx(LockOutlinedIcon, { sx: { fontSize: 32 } })
104
+ }
105
+ ),
106
+ /* @__PURE__ */ jsx(Typography, { variant: "h6", color: "text.primary", gutterBottom: true, fontWeight: "600", sx: { mb: 1 }, children: "Access Denied" }),
107
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mb: 0 }, children: message })
108
+ ]
109
+ }
110
+ )
111
+ }
112
+ );
113
+ };
114
+
115
+ // call-control-sdk/lib/components/SDKPermissionGuard.tsx
116
+ import { Fragment, jsx as jsx2 } from "react/jsx-runtime";
117
+ var SDKPermissionGuard = ({
118
+ children,
119
+ permission,
120
+ permissions,
121
+ requireAll = false,
122
+ menuFeature,
123
+ requireAllMenus = false,
124
+ fallback,
125
+ showFallback = true,
126
+ onDenied
127
+ }) => {
128
+ const { isLoaded, hasPermission, hasAnyPermission, hasAllPermissions, hasMenuFeature } = useSDKPermissions();
129
+ if (!isLoaded) return null;
130
+ const isAllowed = checkAccess({
131
+ permission,
132
+ permissions,
133
+ requireAll,
134
+ menuFeature,
135
+ requireAllMenus,
136
+ hasPermission,
137
+ hasAnyPermission,
138
+ hasAllPermissions,
139
+ hasMenuFeature
140
+ });
141
+ if (!isAllowed) {
142
+ onDenied == null ? void 0 : onDenied();
143
+ if (fallback !== void 0) return /* @__PURE__ */ jsx2(Fragment, { children: fallback });
144
+ if (showFallback) return /* @__PURE__ */ jsx2(SDKAccessDenied, {});
145
+ return null;
146
+ }
147
+ return /* @__PURE__ */ jsx2(Fragment, { children });
148
+ };
149
+ function checkAccess({
150
+ permission,
151
+ permissions,
152
+ requireAll,
153
+ menuFeature,
154
+ requireAllMenus,
155
+ hasPermission,
156
+ hasAnyPermission,
157
+ hasAllPermissions,
158
+ hasMenuFeature
159
+ }) {
160
+ const menuCodes = menuFeature ? Array.isArray(menuFeature) ? menuFeature : [menuFeature] : [];
161
+ const hasNoGuards = !permission && (!permissions || permissions.length === 0) && menuCodes.length === 0;
162
+ if (hasNoGuards) return true;
163
+ if (menuCodes.length > 0) {
164
+ const menuGranted = requireAllMenus ? menuCodes.every((c) => hasMenuFeature(c)) : menuCodes.some((c) => hasMenuFeature(c));
165
+ if (!menuGranted) return false;
166
+ }
167
+ if (permission && !hasPermission(permission)) return false;
168
+ if (permissions && permissions.length > 0) {
169
+ const granted = requireAll ? hasAllPermissions(permissions) : hasAnyPermission(permissions);
170
+ if (!granted) return false;
171
+ }
172
+ return true;
173
+ }
174
+
175
+ export {
176
+ useSDKPermissions,
177
+ SDKAccessDenied,
178
+ SDKPermissionGuard
179
+ };
180
+ //# sourceMappingURL=chunk-NQL4VODC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../call-control-sdk/lib/hooks/useSDKPermissions.ts","../call-control-sdk/lib/components/SDKAccessDenied.tsx","../call-control-sdk/lib/components/SDKPermissionGuard.tsx"],"sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\r\nimport { sdkStateManager } from \"./sdk-state\";\r\nimport type { SDKEntitlements } from \"../permissions/types\";\r\n\r\nexport interface SDKPermissionsHook {\r\n permissions: string[];\r\n menuEntitlements: Array<{ code: string; name: string; enabled: boolean }>;\r\n isLoaded: boolean;\r\n hasPermission: (permission: string) => boolean;\r\n hasAnyPermission: (permissions: string[]) => boolean;\r\n hasAllPermissions: (permissions: string[]) => boolean;\r\n hasMenuFeature: (code: string) => boolean;\r\n isBitEnabled: (category: keyof SDKEntitlements, bitCode: string) => boolean;\r\n}\r\n\r\nexport function useSDKPermissions(): SDKPermissionsHook {\r\n const [state, setState] = useState(() => sdkStateManager.getState());\r\n\r\n useEffect(() => {\r\n const unsubscribe = sdkStateManager.subscribe(() => {\r\n setState(sdkStateManager.getState());\r\n });\r\n return unsubscribe;\r\n }, []);\r\n\r\n const hasPermission = useCallback(\r\n (permission: string) => sdkStateManager.hasPermission(permission),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasAnyPermission = useCallback(\r\n (permissions: string[]) => sdkStateManager.hasAnyPermission(permissions),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasAllPermissions = useCallback(\r\n (permissions: string[]) => sdkStateManager.hasAllPermissions(permissions),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.userPermissions],\r\n );\r\n\r\n const hasMenuFeature = useCallback(\r\n (code: string) => sdkStateManager.hasMenuFeature(code),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.menuEntitlements],\r\n );\r\n\r\n const isBitEnabled = useCallback(\r\n (category: keyof SDKEntitlements, bitCode: string) =>\r\n sdkStateManager.isBitEnabled(category, bitCode),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [state.sdk],\r\n );\r\n\r\n return {\r\n permissions: state.userPermissions ?? [],\r\n menuEntitlements: state.menuEntitlements ?? [],\r\n isLoaded: state.isPermissionsLoaded,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n isBitEnabled,\r\n };\r\n}\r\n","import React from \"react\";\r\nimport { Box, Paper, Typography, useTheme } from \"@mui/material\";\r\nimport { alpha } from \"@mui/material/styles\";\r\nimport LockOutlinedIcon from \"@mui/icons-material/LockOutlined\";\r\n\r\ninterface SDKAccessDeniedProps {\r\n message?: string;\r\n}\r\n\r\nexport const SDKAccessDenied: React.FC<SDKAccessDeniedProps> = ({\r\n message = \"You don't have the necessary permissions to view this content.\",\r\n}) => {\r\n const theme = useTheme();\r\n\r\n return (\r\n <Box\r\n sx={{\r\n p: 4,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n width: \"100%\",\r\n height: \"100%\",\r\n minHeight: 250,\r\n }}\r\n >\r\n <Paper\r\n elevation={0}\r\n sx={{\r\n p: 4,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n bgcolor: alpha(theme.palette.error.main, 0.05),\r\n borderRadius: 3,\r\n border: \"1px dashed\",\r\n borderColor: alpha(theme.palette.error.main, 0.3),\r\n maxWidth: 420,\r\n textAlign: \"center\",\r\n }}\r\n >\r\n <Box\r\n sx={{\r\n bgcolor: alpha(theme.palette.error.main, 0.1),\r\n color: \"error.main\",\r\n borderRadius: \"50%\",\r\n p: 2,\r\n display: \"flex\",\r\n mb: 2,\r\n }}\r\n >\r\n <LockOutlinedIcon sx={{ fontSize: 32 }} />\r\n </Box>\r\n <Typography variant=\"h6\" color=\"text.primary\" gutterBottom fontWeight=\"600\" sx={{ mb: 1 }}>\r\n Access Denied\r\n </Typography>\r\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mb: 0 }}>\r\n {message}\r\n </Typography>\r\n </Paper>\r\n </Box>\r\n );\r\n};\r\n","import React from \"react\";\r\nimport { useSDKPermissions } from \"../hooks/useSDKPermissions\";\r\nimport { SDKAccessDenied } from \"./SDKAccessDenied\";\r\n\r\ninterface SDKPermissionGuardProps {\r\n children?: React.ReactNode;\r\n /** Single permission code (e.g. \"calls:inbound\") */\r\n permission?: string;\r\n /** Multiple permission codes — ANY match grants access by default */\r\n permissions?: string[];\r\n /** When true, ALL permissions must be granted */\r\n requireAll?: boolean;\r\n /** One or more menu feature codes — ANY match grants access by default */\r\n menuFeature?: string | string[];\r\n /** When true, ALL menu features must be enabled */\r\n requireAllMenus?: boolean;\r\n /** Custom fallback rendered when access is denied */\r\n fallback?: React.ReactNode;\r\n /** Show the default Access Denied UI when denied. Defaults to true. */\r\n showFallback?: boolean;\r\n /** Callback fired when the guard denies access */\r\n onDenied?: () => void;\r\n}\r\n\r\nexport const SDKPermissionGuard: React.FC<SDKPermissionGuardProps> = ({\r\n children,\r\n permission,\r\n permissions,\r\n requireAll = false,\r\n menuFeature,\r\n requireAllMenus = false,\r\n fallback,\r\n showFallback = true,\r\n onDenied,\r\n}) => {\r\n const { isLoaded, hasPermission, hasAnyPermission, hasAllPermissions, hasMenuFeature } =\r\n useSDKPermissions();\r\n\r\n if (!isLoaded) return null;\r\n\r\n const isAllowed = checkAccess({\r\n permission,\r\n permissions,\r\n requireAll,\r\n menuFeature,\r\n requireAllMenus,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n });\r\n\r\n if (!isAllowed) {\r\n onDenied?.();\r\n if (fallback !== undefined) return <>{fallback}</>;\r\n if (showFallback) return <SDKAccessDenied />;\r\n return null;\r\n }\r\n\r\n return <>{children}</>;\r\n};\r\n\r\nfunction checkAccess({\r\n permission,\r\n permissions,\r\n requireAll,\r\n menuFeature,\r\n requireAllMenus,\r\n hasPermission,\r\n hasAnyPermission,\r\n hasAllPermissions,\r\n hasMenuFeature,\r\n}: {\r\n permission?: string;\r\n permissions?: string[];\r\n requireAll: boolean;\r\n menuFeature?: string | string[];\r\n requireAllMenus: boolean;\r\n hasPermission: (p: string) => boolean;\r\n hasAnyPermission: (p: string[]) => boolean;\r\n hasAllPermissions: (p: string[]) => boolean;\r\n hasMenuFeature: (c: string) => boolean;\r\n}): boolean {\r\n const menuCodes = menuFeature\r\n ? Array.isArray(menuFeature) ? menuFeature : [menuFeature]\r\n : [];\r\n\r\n const hasNoGuards =\r\n !permission &&\r\n (!permissions || permissions.length === 0) &&\r\n menuCodes.length === 0;\r\n\r\n if (hasNoGuards) return true;\r\n\r\n if (menuCodes.length > 0) {\r\n const menuGranted = requireAllMenus\r\n ? menuCodes.every((c) => hasMenuFeature(c))\r\n : menuCodes.some((c) => hasMenuFeature(c));\r\n if (!menuGranted) return false;\r\n }\r\n\r\n if (permission && !hasPermission(permission)) return false;\r\n\r\n if (permissions && permissions.length > 0) {\r\n const granted = requireAll ? hasAllPermissions(permissions) : hasAnyPermission(permissions);\r\n if (!granted) return false;\r\n }\r\n\r\n return true;\r\n}\r\n"],"mappings":"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","names":["jsx"]}