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.
- package/LICENSE +53 -0
- package/LICENSE-ACHALA +80 -0
- package/README.md +639 -0
- package/dist/agentDetailReport-7TDO6MYQ.mjs +11 -0
- package/dist/agentDetailReport-7TDO6MYQ.mjs.map +1 -0
- package/dist/agentPerformanceReport-R3WY7Q7D.mjs +531 -0
- package/dist/agentPerformanceReport-R3WY7Q7D.mjs.map +1 -0
- package/dist/auditReport-CJ23LXIZ.mjs +15 -0
- package/dist/auditReport-CJ23LXIZ.mjs.map +1 -0
- package/dist/callHistory-743J7EKD.mjs +783 -0
- package/dist/callHistory-743J7EKD.mjs.map +1 -0
- package/dist/campaigns-N2RLUJHH.mjs +3005 -0
- package/dist/campaigns-N2RLUJHH.mjs.map +1 -0
- package/dist/caroQualityAuditDashboard-NRWY6SEC.mjs +66 -0
- package/dist/caroQualityAuditDashboard-NRWY6SEC.mjs.map +1 -0
- package/dist/caroVoiceAI-Z5BDDDSY.mjs +21 -0
- package/dist/caroVoiceAI-Z5BDDDSY.mjs.map +1 -0
- package/dist/cdrReport-577UYGZA.mjs +798 -0
- package/dist/cdrReport-577UYGZA.mjs.map +1 -0
- package/dist/chunk-6ICPXSN6.mjs +61 -0
- package/dist/chunk-6ICPXSN6.mjs.map +1 -0
- package/dist/chunk-BU6FMNBY.mjs +82 -0
- package/dist/chunk-BU6FMNBY.mjs.map +1 -0
- package/dist/chunk-DBSNJ3QH.mjs +1060 -0
- package/dist/chunk-DBSNJ3QH.mjs.map +1 -0
- package/dist/chunk-EJIWPC3H.mjs +747 -0
- package/dist/chunk-EJIWPC3H.mjs.map +1 -0
- package/dist/chunk-GTDWTI5S.mjs +17217 -0
- package/dist/chunk-GTDWTI5S.mjs.map +1 -0
- package/dist/chunk-L4LLUMYA.mjs +57 -0
- package/dist/chunk-L4LLUMYA.mjs.map +1 -0
- package/dist/chunk-NQL4VODC.mjs +180 -0
- package/dist/chunk-NQL4VODC.mjs.map +1 -0
- package/dist/chunk-NUYGQI7D.mjs +678 -0
- package/dist/chunk-NUYGQI7D.mjs.map +1 -0
- package/dist/chunk-RZZQ42MG.mjs +115 -0
- package/dist/chunk-RZZQ42MG.mjs.map +1 -0
- package/dist/chunk-UB5HSUGK.mjs +65 -0
- package/dist/chunk-UB5HSUGK.mjs.map +1 -0
- package/dist/chunk-VGVOMFYH.mjs +5781 -0
- package/dist/chunk-VGVOMFYH.mjs.map +1 -0
- package/dist/chunk-VZCHJLAW.mjs +61 -0
- package/dist/chunk-VZCHJLAW.mjs.map +1 -0
- package/dist/incoming-4WP3FJI4.mp3 +0 -0
- package/dist/incoming.mp3 +0 -0
- package/dist/index.d.mts +2476 -0
- package/dist/index.d.ts +2477 -0
- package/dist/index.js +41208 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4641 -0
- package/dist/index.mjs.map +1 -0
- package/dist/liveStatus-IQIEZZE5.mjs +1077 -0
- package/dist/liveStatus-IQIEZZE5.mjs.map +1 -0
- package/dist/loginReport-H6XJU2MY.mjs +826 -0
- package/dist/loginReport-H6XJU2MY.mjs.map +1 -0
- package/dist/managementDashboard-NZMAJPPB.mjs +527 -0
- package/dist/managementDashboard-NZMAJPPB.mjs.map +1 -0
- package/dist/qualityAuditDashboard-ZJEEAMBS.mjs +66 -0
- package/dist/qualityAuditDashboard-ZJEEAMBS.mjs.map +1 -0
- 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":";;;;;AAAA,SAAS,UAAU,WAAW,mBAAmB;AAe1C,SAAS,oBAAwC;AAfxD;AAgBE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,MAAM,gBAAgB,SAAS,CAAC;AAEnE,YAAU,MAAM;AACd,UAAM,cAAc,gBAAgB,UAAU,MAAM;AAClD,eAAS,gBAAgB,SAAS,CAAC;AAAA,IACrC,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgB;AAAA,IACpB,CAAC,eAAuB,gBAAgB,cAAc,UAAU;AAAA;AAAA,IAEhE,CAAC,MAAM,eAAe;AAAA,EACxB;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,gBAA0B,gBAAgB,iBAAiB,WAAW;AAAA;AAAA,IAEvE,CAAC,MAAM,eAAe;AAAA,EACxB;AAEA,QAAM,oBAAoB;AAAA,IACxB,CAAC,gBAA0B,gBAAgB,kBAAkB,WAAW;AAAA;AAAA,IAExE,CAAC,MAAM,eAAe;AAAA,EACxB;AAEA,QAAM,iBAAiB;AAAA,IACrB,CAAC,SAAiB,gBAAgB,eAAe,IAAI;AAAA;AAAA,IAErD,CAAC,MAAM,gBAAgB;AAAA,EACzB;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,UAAiC,YAChC,gBAAgB,aAAa,UAAU,OAAO;AAAA;AAAA,IAEhD,CAAC,MAAM,GAAG;AAAA,EACZ;AAEA,SAAO;AAAA,IACL,cAAa,WAAM,oBAAN,YAAyB,CAAC;AAAA,IACvC,mBAAkB,WAAM,qBAAN,YAA0B,CAAC;AAAA,IAC7C,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACjEA,SAAS,KAAK,OAAO,YAAY,gBAAgB;AACjD,SAAS,aAAa;AACtB,OAAO,sBAAsB;AAwBvB,SAyBI,KAzBJ;AAlBC,IAAM,kBAAkD,CAAC;AAAA,EAC9D,UAAU;AACZ,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,GAAG;AAAA,QACH,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,IAAI;AAAA,YACF,GAAG;AAAA,YACH,SAAS;AAAA,YACT,eAAe;AAAA,YACf,YAAY;AAAA,YACZ,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,IAAI;AAAA,YAC7C,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,aAAa,MAAM,MAAM,QAAQ,MAAM,MAAM,GAAG;AAAA,YAChD,UAAU;AAAA,YACV,WAAW;AAAA,UACb;AAAA,UAEA;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,IAAI;AAAA,kBACF,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM,GAAG;AAAA,kBAC5C,OAAO;AAAA,kBACP,cAAc;AAAA,kBACd,GAAG;AAAA,kBACH,SAAS;AAAA,kBACT,IAAI;AAAA,gBACN;AAAA,gBAEA,8BAAC,oBAAiB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,YAC1C;AAAA,YACA,oBAAC,cAAW,SAAQ,MAAK,OAAM,gBAAe,cAAY,MAAC,YAAW,OAAM,IAAI,EAAE,IAAI,EAAE,GAAG,2BAE3F;AAAA,YACA,oBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,EAAE,GAC5D,mBACH;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;ACTuC,0BAAAA,YAAA;AA9BhC,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,eAAe;AAAA,EACf;AACF,MAAM;AACJ,QAAM,EAAE,UAAU,eAAe,kBAAkB,mBAAmB,eAAe,IACnF,kBAAkB;AAEpB,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,YAAY,YAAY;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,CAAC,WAAW;AACd;AACA,QAAI,aAAa,OAAW,QAAO,gBAAAA,KAAA,YAAG,oBAAS;AAC/C,QAAI,aAAc,QAAO,gBAAAA,KAAC,mBAAgB;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO,gBAAAA,KAAA,YAAG,UAAS;AACrB;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAUY;AACV,QAAM,YAAY,cACd,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW,IACvD,CAAC;AAEL,QAAM,cACJ,CAAC,eACA,CAAC,eAAe,YAAY,WAAW,MACxC,UAAU,WAAW;AAEvB,MAAI,YAAa,QAAO;AAExB,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,cAAc,kBAChB,UAAU,MAAM,CAAC,MAAM,eAAe,CAAC,CAAC,IACxC,UAAU,KAAK,CAAC,MAAM,eAAe,CAAC,CAAC;AAC3C,QAAI,CAAC,YAAa,QAAO;AAAA,EAC3B;AAEA,MAAI,cAAc,CAAC,cAAc,UAAU,EAAG,QAAO;AAErD,MAAI,eAAe,YAAY,SAAS,GAAG;AACzC,UAAM,UAAU,aAAa,kBAAkB,WAAW,IAAI,iBAAiB,WAAW;AAC1F,QAAI,CAAC,QAAS,QAAO;AAAA,EACvB;AAEA,SAAO;AACT;","names":["jsx"]}
|