@elqnt/admin 2.1.0 → 2.2.0
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/api/index.cjs +303 -32
- package/dist/api/index.cjs.map +1 -1
- package/dist/api/index.d.cts +114 -39
- package/dist/api/index.d.ts +114 -39
- package/dist/api/index.js +276 -30
- package/dist/api/index.js.map +1 -1
- package/dist/hooks/index.cjs +769 -8
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.d.cts +133 -3
- package/dist/hooks/index.d.ts +133 -3
- package/dist/hooks/index.js +766 -8
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.cjs +446 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +383 -33
- package/dist/index.js.map +1 -1
- package/dist/models/index.cjs +143 -4
- package/dist/models/index.cjs.map +1 -1
- package/dist/models/index.d.cts +1258 -12
- package/dist/models/index.d.ts +1258 -12
- package/dist/models/index.js +107 -3
- package/dist/models/index.js.map +1 -1
- package/dist/provisioning-Cfl6wbmV.d.cts +168 -0
- package/dist/provisioning-Il9t2jnH.d.ts +168 -0
- package/package.json +2 -2
- package/dist/admin-Dlsd5IZ0.d.cts +0 -767
- package/dist/admin-Dlsd5IZ0.d.ts +0 -767
package/dist/hooks/index.cjs
CHANGED
|
@@ -20,9 +20,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// hooks/index.ts
|
|
21
21
|
var hooks_exports = {};
|
|
22
22
|
__export(hooks_exports, {
|
|
23
|
+
useAnalyticsContext: () => useAnalyticsContext,
|
|
23
24
|
useInvitesAdmin: () => useInvitesAdmin,
|
|
24
25
|
useOrgAdmin: () => useOrgAdmin,
|
|
26
|
+
useOrgProvisioning: () => useOrgProvisioning,
|
|
25
27
|
useOrgSettings: () => useOrgSettings,
|
|
28
|
+
useProductAnalytics: () => useProductAnalytics,
|
|
26
29
|
useUsersAdmin: () => useUsersAdmin
|
|
27
30
|
});
|
|
28
31
|
module.exports = __toCommonJS(hooks_exports);
|
|
@@ -31,12 +34,18 @@ module.exports = __toCommonJS(hooks_exports);
|
|
|
31
34
|
var import_react = require("react");
|
|
32
35
|
|
|
33
36
|
// api/index.ts
|
|
34
|
-
var
|
|
37
|
+
var import_browser6 = require("@elqnt/api-client/browser");
|
|
35
38
|
|
|
36
39
|
// api/orgs.ts
|
|
37
40
|
var import_browser = require("@elqnt/api-client/browser");
|
|
38
|
-
async function listOrgsApi(options) {
|
|
39
|
-
|
|
41
|
+
async function listOrgsApi(filter, options) {
|
|
42
|
+
const params = new URLSearchParams();
|
|
43
|
+
if (filter?.product) params.set("product", filter.product);
|
|
44
|
+
if (filter?.status) params.set("status", filter.status);
|
|
45
|
+
if (filter?.type) params.set("type", filter.type);
|
|
46
|
+
const queryString = params.toString();
|
|
47
|
+
const url = queryString ? `/api/v1/admin/orgs?${queryString}` : "/api/v1/admin/orgs";
|
|
48
|
+
return (0, import_browser.browserApiRequest)(url, {
|
|
40
49
|
method: "GET",
|
|
41
50
|
...options
|
|
42
51
|
});
|
|
@@ -73,6 +82,13 @@ async function getOrgInfoApi(orgId, options) {
|
|
|
73
82
|
...options
|
|
74
83
|
});
|
|
75
84
|
}
|
|
85
|
+
async function createOrgWithSchemasApi(org, schemas, options) {
|
|
86
|
+
return (0, import_browser.browserApiRequest)("/api/v1/admin/orgs/with-schemas", {
|
|
87
|
+
method: "POST",
|
|
88
|
+
body: { org, schemas },
|
|
89
|
+
...options
|
|
90
|
+
});
|
|
91
|
+
}
|
|
76
92
|
|
|
77
93
|
// api/users.ts
|
|
78
94
|
var import_browser2 = require("@elqnt/api-client/browser");
|
|
@@ -101,6 +117,12 @@ async function getUserByEmailApi(email, options) {
|
|
|
101
117
|
...options
|
|
102
118
|
});
|
|
103
119
|
}
|
|
120
|
+
async function getUserByPhoneApi(phone, options) {
|
|
121
|
+
return (0, import_browser2.browserApiRequest)(`/api/v1/admin/users/by-phone?phone=${encodeURIComponent(phone)}`, {
|
|
122
|
+
method: "GET",
|
|
123
|
+
...options
|
|
124
|
+
});
|
|
125
|
+
}
|
|
104
126
|
async function updateUserApi(userId, updates, options) {
|
|
105
127
|
return (0, import_browser2.browserApiRequest)(`/api/v1/admin/users/${userId}`, {
|
|
106
128
|
method: "PUT",
|
|
@@ -175,22 +197,208 @@ async function acceptInviteApi(inviteId, options) {
|
|
|
175
197
|
});
|
|
176
198
|
}
|
|
177
199
|
|
|
200
|
+
// api/analytics.ts
|
|
201
|
+
var import_browser4 = require("@elqnt/api-client/browser");
|
|
202
|
+
function buildDateFilterParams(filter) {
|
|
203
|
+
if (!filter) return "";
|
|
204
|
+
const params = new URLSearchParams();
|
|
205
|
+
if (filter.from) params.set("from", filter.from);
|
|
206
|
+
if (filter.to) params.set("to", filter.to);
|
|
207
|
+
const queryString = params.toString();
|
|
208
|
+
return queryString ? `?${queryString}` : "";
|
|
209
|
+
}
|
|
210
|
+
async function getAnalyticsSummaryApi(filter, options) {
|
|
211
|
+
const queryString = buildDateFilterParams(filter);
|
|
212
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/summary${queryString}`, {
|
|
213
|
+
method: "GET",
|
|
214
|
+
...options
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async function getChatsAnalyticsApi(filter, agentId, options) {
|
|
218
|
+
const params = new URLSearchParams();
|
|
219
|
+
if (filter?.from) params.set("from", filter.from);
|
|
220
|
+
if (filter?.to) params.set("to", filter.to);
|
|
221
|
+
if (agentId) params.set("agent_id", agentId);
|
|
222
|
+
const queryString = params.toString();
|
|
223
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/chats${queryString ? `?${queryString}` : ""}`, {
|
|
224
|
+
method: "GET",
|
|
225
|
+
...options
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
async function getAgentsAnalyticsApi(filter, options) {
|
|
229
|
+
const queryString = buildDateFilterParams(filter);
|
|
230
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/agents${queryString}`, {
|
|
231
|
+
method: "GET",
|
|
232
|
+
...options
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
async function getUsageAnalyticsApi(filter, options) {
|
|
236
|
+
const queryString = buildDateFilterParams(filter);
|
|
237
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/usage${queryString}`, {
|
|
238
|
+
method: "GET",
|
|
239
|
+
...options
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
async function getDailyAnalyticsApi(filter, options) {
|
|
243
|
+
const queryString = buildDateFilterParams(filter);
|
|
244
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/daily${queryString}`, {
|
|
245
|
+
method: "GET",
|
|
246
|
+
...options
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
async function getAnalyticsEventsApi(filter, options) {
|
|
250
|
+
const queryString = buildDateFilterParams(filter);
|
|
251
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/events${queryString}`, {
|
|
252
|
+
method: "GET",
|
|
253
|
+
...options
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
async function logAnalyticsEventApi(event, options) {
|
|
257
|
+
return (0, import_browser4.browserApiRequest)("/api/v1/analytics/events", {
|
|
258
|
+
method: "POST",
|
|
259
|
+
body: event,
|
|
260
|
+
...options
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
async function getGlobalSummaryApi(filter, options) {
|
|
264
|
+
const queryString = buildDateFilterParams(filter);
|
|
265
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/global/summary${queryString}`, {
|
|
266
|
+
method: "GET",
|
|
267
|
+
...options
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async function getGlobalOrgsAnalyticsApi(filter, options) {
|
|
271
|
+
const queryString = buildDateFilterParams(filter);
|
|
272
|
+
return (0, import_browser4.browserApiRequest)(`/api/v1/analytics/global/orgs${queryString}`, {
|
|
273
|
+
method: "GET",
|
|
274
|
+
...options
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// api/provisioning.ts
|
|
279
|
+
var import_browser5 = require("@elqnt/api-client/browser");
|
|
280
|
+
async function createOrgWithProvisioningApi(request, options) {
|
|
281
|
+
return (0, import_browser5.browserApiRequest)("/api/v1/admin/provisioning/orgs", {
|
|
282
|
+
method: "POST",
|
|
283
|
+
body: request,
|
|
284
|
+
...options
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
async function getProvisioningStatusApi(orgId, options) {
|
|
288
|
+
return (0, import_browser5.browserApiRequest)(`/api/v1/admin/orgs/${orgId}/provisioning`, {
|
|
289
|
+
method: "GET",
|
|
290
|
+
...options
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
async function retryProvisioningApi(orgId, request, options) {
|
|
294
|
+
return (0, import_browser5.browserApiRequest)(`/api/v1/admin/orgs/${orgId}/provisioning/retry`, {
|
|
295
|
+
method: "POST",
|
|
296
|
+
body: request || {},
|
|
297
|
+
...options
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
async function validateProvisioningApi(orgId, options) {
|
|
301
|
+
return (0, import_browser5.browserApiRequest)(
|
|
302
|
+
`/api/v1/admin/orgs/${orgId}/provisioning/validate`,
|
|
303
|
+
{
|
|
304
|
+
method: "POST",
|
|
305
|
+
...options
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
async function cancelProvisioningApi(orgId, options) {
|
|
310
|
+
return (0, import_browser5.browserApiRequest)(
|
|
311
|
+
`/api/v1/admin/orgs/${orgId}/provisioning/cancel`,
|
|
312
|
+
{
|
|
313
|
+
method: "POST",
|
|
314
|
+
...options
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
async function cleanupProvisioningApi(orgId, options) {
|
|
319
|
+
return (0, import_browser5.browserApiRequest)(`/api/v1/admin/orgs/${orgId}/provisioning`, {
|
|
320
|
+
method: "DELETE",
|
|
321
|
+
...options
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
function streamProvisioningProgress(orgId, callbacks, options) {
|
|
325
|
+
const url = new URL(
|
|
326
|
+
`/api/v1/admin/orgs/${orgId}/provisioning/stream`,
|
|
327
|
+
options.baseUrl
|
|
328
|
+
);
|
|
329
|
+
if (options.token) {
|
|
330
|
+
url.searchParams.set("token", options.token);
|
|
331
|
+
}
|
|
332
|
+
const eventSource = new EventSource(url.toString());
|
|
333
|
+
eventSource.addEventListener("connected", (event) => {
|
|
334
|
+
try {
|
|
335
|
+
const data = JSON.parse(event.data);
|
|
336
|
+
callbacks.onConnected?.(data.orgId);
|
|
337
|
+
} catch (e) {
|
|
338
|
+
console.error("Failed to parse connected event", e);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
eventSource.addEventListener("progress", (event) => {
|
|
342
|
+
try {
|
|
343
|
+
const progress = JSON.parse(event.data);
|
|
344
|
+
callbacks.onProgress?.(progress);
|
|
345
|
+
} catch (e) {
|
|
346
|
+
console.error("Failed to parse progress event", e);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
eventSource.addEventListener("done", () => {
|
|
350
|
+
callbacks.onDone?.();
|
|
351
|
+
eventSource.close();
|
|
352
|
+
});
|
|
353
|
+
eventSource.addEventListener("timeout", () => {
|
|
354
|
+
callbacks.onTimeout?.();
|
|
355
|
+
eventSource.close();
|
|
356
|
+
});
|
|
357
|
+
eventSource.onerror = (error) => {
|
|
358
|
+
callbacks.onError?.(new Error("SSE connection error"));
|
|
359
|
+
eventSource.close();
|
|
360
|
+
};
|
|
361
|
+
return () => {
|
|
362
|
+
eventSource.close();
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
function calculateProgressPercentage(progress) {
|
|
366
|
+
if (progress.totalArtifacts === 0) return 0;
|
|
367
|
+
return Math.round(
|
|
368
|
+
progress.completedArtifacts / progress.totalArtifacts * 100
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
function isProvisioningComplete(progress) {
|
|
372
|
+
return progress.status === "completed" || progress.status === "failed" || progress.status === "partial";
|
|
373
|
+
}
|
|
374
|
+
function isProvisioningSuccessful(progress) {
|
|
375
|
+
return progress.status === "completed";
|
|
376
|
+
}
|
|
377
|
+
function getFailedArtifacts(progress) {
|
|
378
|
+
return progress.artifacts.filter((a) => a.status === "failed");
|
|
379
|
+
}
|
|
380
|
+
function hasCriticalFailures(progress) {
|
|
381
|
+
return progress.artifacts.some(
|
|
382
|
+
(a) => a.status === "failed" && a.critical
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
|
|
178
386
|
// api/index.ts
|
|
179
387
|
async function getOrgSettingsApi(options) {
|
|
180
|
-
return (0,
|
|
388
|
+
return (0, import_browser6.browserApiRequest)("/api/v1/org/settings", {
|
|
181
389
|
method: "GET",
|
|
182
390
|
...options
|
|
183
391
|
});
|
|
184
392
|
}
|
|
185
393
|
async function createOrgSettingsApi(settings, options) {
|
|
186
|
-
return (0,
|
|
394
|
+
return (0, import_browser6.browserApiRequest)("/api/v1/org/settings", {
|
|
187
395
|
method: "POST",
|
|
188
396
|
body: settings,
|
|
189
397
|
...options
|
|
190
398
|
});
|
|
191
399
|
}
|
|
192
400
|
async function updateOrgSettingsApi(settings, options) {
|
|
193
|
-
return (0,
|
|
401
|
+
return (0, import_browser6.browserApiRequest)("/api/v1/org/settings", {
|
|
194
402
|
method: "PUT",
|
|
195
403
|
body: settings,
|
|
196
404
|
...options
|
|
@@ -201,11 +409,11 @@ async function updateOrgSettingsApi(settings, options) {
|
|
|
201
409
|
function useOrgAdmin(options) {
|
|
202
410
|
const [loading, setLoading] = (0, import_react.useState)(false);
|
|
203
411
|
const [error, setError] = (0, import_react.useState)(null);
|
|
204
|
-
const listOrgs = (0, import_react.useCallback)(async () => {
|
|
412
|
+
const listOrgs = (0, import_react.useCallback)(async (filter) => {
|
|
205
413
|
setLoading(true);
|
|
206
414
|
setError(null);
|
|
207
415
|
try {
|
|
208
|
-
const response = await listOrgsApi(options);
|
|
416
|
+
const response = await listOrgsApi(filter, options);
|
|
209
417
|
if (response.error) {
|
|
210
418
|
setError(response.error);
|
|
211
419
|
return [];
|
|
@@ -282,6 +490,27 @@ function useOrgAdmin(options) {
|
|
|
282
490
|
},
|
|
283
491
|
[options]
|
|
284
492
|
);
|
|
493
|
+
const createOrgWithSchemas = (0, import_react.useCallback)(
|
|
494
|
+
async (org, schemas) => {
|
|
495
|
+
setLoading(true);
|
|
496
|
+
setError(null);
|
|
497
|
+
try {
|
|
498
|
+
const response = await createOrgWithSchemasApi(org, schemas, options);
|
|
499
|
+
if (response.error) {
|
|
500
|
+
setError(response.error);
|
|
501
|
+
return null;
|
|
502
|
+
}
|
|
503
|
+
return response.data || null;
|
|
504
|
+
} catch (err) {
|
|
505
|
+
const message = err instanceof Error ? err.message : "Failed to create organization with schemas";
|
|
506
|
+
setError(message);
|
|
507
|
+
return null;
|
|
508
|
+
} finally {
|
|
509
|
+
setLoading(false);
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
[options]
|
|
513
|
+
);
|
|
285
514
|
const updateOrg = (0, import_react.useCallback)(
|
|
286
515
|
async (orgId, updates) => {
|
|
287
516
|
setLoading(true);
|
|
@@ -331,6 +560,7 @@ function useOrgAdmin(options) {
|
|
|
331
560
|
getOrg,
|
|
332
561
|
getOrgInfo,
|
|
333
562
|
createOrg,
|
|
563
|
+
createOrgWithSchemas,
|
|
334
564
|
updateOrg,
|
|
335
565
|
deleteOrg
|
|
336
566
|
};
|
|
@@ -401,6 +631,27 @@ function useUsersAdmin(options) {
|
|
|
401
631
|
},
|
|
402
632
|
[options]
|
|
403
633
|
);
|
|
634
|
+
const getUserByPhone = (0, import_react2.useCallback)(
|
|
635
|
+
async (phone) => {
|
|
636
|
+
setLoading(true);
|
|
637
|
+
setError(null);
|
|
638
|
+
try {
|
|
639
|
+
const response = await getUserByPhoneApi(phone, options);
|
|
640
|
+
if (response.error) {
|
|
641
|
+
setError(response.error);
|
|
642
|
+
return null;
|
|
643
|
+
}
|
|
644
|
+
return response.data?.user || null;
|
|
645
|
+
} catch (err) {
|
|
646
|
+
const message = err instanceof Error ? err.message : "Failed to get user by phone";
|
|
647
|
+
setError(message);
|
|
648
|
+
return null;
|
|
649
|
+
} finally {
|
|
650
|
+
setLoading(false);
|
|
651
|
+
}
|
|
652
|
+
},
|
|
653
|
+
[options]
|
|
654
|
+
);
|
|
404
655
|
const createUser = (0, import_react2.useCallback)(
|
|
405
656
|
async (user) => {
|
|
406
657
|
setLoading(true);
|
|
@@ -512,6 +763,7 @@ function useUsersAdmin(options) {
|
|
|
512
763
|
listUsers,
|
|
513
764
|
getUser,
|
|
514
765
|
getUserByEmail,
|
|
766
|
+
getUserByPhone,
|
|
515
767
|
createUser,
|
|
516
768
|
updateUser,
|
|
517
769
|
deleteUser,
|
|
@@ -755,11 +1007,520 @@ function useOrgSettings(options) {
|
|
|
755
1007
|
updateSettings
|
|
756
1008
|
};
|
|
757
1009
|
}
|
|
1010
|
+
|
|
1011
|
+
// hooks/use-product-analytics.ts
|
|
1012
|
+
var import_react5 = require("react");
|
|
1013
|
+
function useProductAnalytics(options) {
|
|
1014
|
+
const [state, setState] = (0, import_react5.useState)({
|
|
1015
|
+
summary: null,
|
|
1016
|
+
chats: [],
|
|
1017
|
+
agents: [],
|
|
1018
|
+
usage: [],
|
|
1019
|
+
daily: [],
|
|
1020
|
+
events: [],
|
|
1021
|
+
loading: false,
|
|
1022
|
+
error: null
|
|
1023
|
+
});
|
|
1024
|
+
const sessionIdRef = (0, import_react5.useRef)("");
|
|
1025
|
+
(0, import_react5.useEffect)(() => {
|
|
1026
|
+
if (typeof window !== "undefined") {
|
|
1027
|
+
let sessionId = sessionStorage.getItem("analytics_session_id");
|
|
1028
|
+
if (!sessionId) {
|
|
1029
|
+
sessionId = crypto.randomUUID();
|
|
1030
|
+
sessionStorage.setItem("analytics_session_id", sessionId);
|
|
1031
|
+
}
|
|
1032
|
+
sessionIdRef.current = sessionId;
|
|
1033
|
+
}
|
|
1034
|
+
}, []);
|
|
1035
|
+
const getSummary = (0, import_react5.useCallback)(
|
|
1036
|
+
async (filter) => {
|
|
1037
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1038
|
+
try {
|
|
1039
|
+
const response = await getAnalyticsSummaryApi(filter, options);
|
|
1040
|
+
if (response.error) {
|
|
1041
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1042
|
+
return null;
|
|
1043
|
+
}
|
|
1044
|
+
const summary = response.data?.data || null;
|
|
1045
|
+
setState((prev) => ({ ...prev, loading: false, summary }));
|
|
1046
|
+
return summary;
|
|
1047
|
+
} catch (err) {
|
|
1048
|
+
const message = err instanceof Error ? err.message : "Failed to get analytics summary";
|
|
1049
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1050
|
+
return null;
|
|
1051
|
+
}
|
|
1052
|
+
},
|
|
1053
|
+
[options]
|
|
1054
|
+
);
|
|
1055
|
+
const getChats = (0, import_react5.useCallback)(
|
|
1056
|
+
async (filter, agentId) => {
|
|
1057
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1058
|
+
try {
|
|
1059
|
+
const response = await getChatsAnalyticsApi(filter, agentId, options);
|
|
1060
|
+
if (response.error) {
|
|
1061
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1062
|
+
return [];
|
|
1063
|
+
}
|
|
1064
|
+
const chats = response.data?.data || [];
|
|
1065
|
+
setState((prev) => ({ ...prev, loading: false, chats }));
|
|
1066
|
+
return chats;
|
|
1067
|
+
} catch (err) {
|
|
1068
|
+
const message = err instanceof Error ? err.message : "Failed to get chat analytics";
|
|
1069
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1070
|
+
return [];
|
|
1071
|
+
}
|
|
1072
|
+
},
|
|
1073
|
+
[options]
|
|
1074
|
+
);
|
|
1075
|
+
const getAgents = (0, import_react5.useCallback)(
|
|
1076
|
+
async (filter) => {
|
|
1077
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1078
|
+
try {
|
|
1079
|
+
const response = await getAgentsAnalyticsApi(filter, options);
|
|
1080
|
+
if (response.error) {
|
|
1081
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1082
|
+
return [];
|
|
1083
|
+
}
|
|
1084
|
+
const agents = response.data?.data || [];
|
|
1085
|
+
setState((prev) => ({ ...prev, loading: false, agents }));
|
|
1086
|
+
return agents;
|
|
1087
|
+
} catch (err) {
|
|
1088
|
+
const message = err instanceof Error ? err.message : "Failed to get agent analytics";
|
|
1089
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1090
|
+
return [];
|
|
1091
|
+
}
|
|
1092
|
+
},
|
|
1093
|
+
[options]
|
|
1094
|
+
);
|
|
1095
|
+
const getUsage = (0, import_react5.useCallback)(
|
|
1096
|
+
async (filter) => {
|
|
1097
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1098
|
+
try {
|
|
1099
|
+
const response = await getUsageAnalyticsApi(filter, options);
|
|
1100
|
+
if (response.error) {
|
|
1101
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1102
|
+
return [];
|
|
1103
|
+
}
|
|
1104
|
+
const usage = response.data?.data || [];
|
|
1105
|
+
setState((prev) => ({ ...prev, loading: false, usage }));
|
|
1106
|
+
return usage;
|
|
1107
|
+
} catch (err) {
|
|
1108
|
+
const message = err instanceof Error ? err.message : "Failed to get usage analytics";
|
|
1109
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1110
|
+
return [];
|
|
1111
|
+
}
|
|
1112
|
+
},
|
|
1113
|
+
[options]
|
|
1114
|
+
);
|
|
1115
|
+
const getDaily = (0, import_react5.useCallback)(
|
|
1116
|
+
async (filter) => {
|
|
1117
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1118
|
+
try {
|
|
1119
|
+
const response = await getDailyAnalyticsApi(filter, options);
|
|
1120
|
+
if (response.error) {
|
|
1121
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1122
|
+
return [];
|
|
1123
|
+
}
|
|
1124
|
+
const daily = response.data?.data || [];
|
|
1125
|
+
setState((prev) => ({ ...prev, loading: false, daily }));
|
|
1126
|
+
return daily;
|
|
1127
|
+
} catch (err) {
|
|
1128
|
+
const message = err instanceof Error ? err.message : "Failed to get daily analytics";
|
|
1129
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1130
|
+
return [];
|
|
1131
|
+
}
|
|
1132
|
+
},
|
|
1133
|
+
[options]
|
|
1134
|
+
);
|
|
1135
|
+
const getEvents = (0, import_react5.useCallback)(
|
|
1136
|
+
async (filter) => {
|
|
1137
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1138
|
+
try {
|
|
1139
|
+
const response = await getAnalyticsEventsApi(filter, options);
|
|
1140
|
+
if (response.error) {
|
|
1141
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1142
|
+
return [];
|
|
1143
|
+
}
|
|
1144
|
+
const events = response.data?.data || [];
|
|
1145
|
+
setState((prev) => ({ ...prev, loading: false, events }));
|
|
1146
|
+
return events;
|
|
1147
|
+
} catch (err) {
|
|
1148
|
+
const message = err instanceof Error ? err.message : "Failed to get analytics events";
|
|
1149
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1150
|
+
return [];
|
|
1151
|
+
}
|
|
1152
|
+
},
|
|
1153
|
+
[options]
|
|
1154
|
+
);
|
|
1155
|
+
const trackEvent = (0, import_react5.useCallback)(
|
|
1156
|
+
async (eventType, eventCategory, properties) => {
|
|
1157
|
+
try {
|
|
1158
|
+
const event = {
|
|
1159
|
+
sessionId: sessionIdRef.current,
|
|
1160
|
+
userId: options.userId || "",
|
|
1161
|
+
eventType,
|
|
1162
|
+
eventCategory,
|
|
1163
|
+
pagePath: typeof window !== "undefined" ? window.location.pathname : void 0,
|
|
1164
|
+
properties
|
|
1165
|
+
};
|
|
1166
|
+
await logAnalyticsEventApi(event, options);
|
|
1167
|
+
} catch {
|
|
1168
|
+
console.debug("Failed to track analytics event:", eventType);
|
|
1169
|
+
}
|
|
1170
|
+
},
|
|
1171
|
+
[options]
|
|
1172
|
+
);
|
|
1173
|
+
const trackPageView = (0, import_react5.useCallback)(
|
|
1174
|
+
async (pageName) => {
|
|
1175
|
+
await trackEvent("page_view", "navigation", {
|
|
1176
|
+
pageName: pageName || (typeof window !== "undefined" ? document.title : "")
|
|
1177
|
+
});
|
|
1178
|
+
},
|
|
1179
|
+
[trackEvent]
|
|
1180
|
+
);
|
|
1181
|
+
const getGlobalSummary = (0, import_react5.useCallback)(
|
|
1182
|
+
async (filter) => {
|
|
1183
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1184
|
+
try {
|
|
1185
|
+
const response = await getGlobalSummaryApi(filter, options);
|
|
1186
|
+
if (response.error) {
|
|
1187
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1188
|
+
return null;
|
|
1189
|
+
}
|
|
1190
|
+
setState((prev) => ({ ...prev, loading: false }));
|
|
1191
|
+
return response.data?.data || null;
|
|
1192
|
+
} catch (err) {
|
|
1193
|
+
const message = err instanceof Error ? err.message : "Failed to get global summary";
|
|
1194
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1195
|
+
return null;
|
|
1196
|
+
}
|
|
1197
|
+
},
|
|
1198
|
+
[options]
|
|
1199
|
+
);
|
|
1200
|
+
const getGlobalOrgs = (0, import_react5.useCallback)(
|
|
1201
|
+
async (filter) => {
|
|
1202
|
+
setState((prev) => ({ ...prev, loading: true, error: null }));
|
|
1203
|
+
try {
|
|
1204
|
+
const response = await getGlobalOrgsAnalyticsApi(filter, options);
|
|
1205
|
+
if (response.error) {
|
|
1206
|
+
setState((prev) => ({ ...prev, loading: false, error: response.error || null }));
|
|
1207
|
+
return [];
|
|
1208
|
+
}
|
|
1209
|
+
setState((prev) => ({ ...prev, loading: false }));
|
|
1210
|
+
return response.data?.data || [];
|
|
1211
|
+
} catch (err) {
|
|
1212
|
+
const message = err instanceof Error ? err.message : "Failed to get org analytics";
|
|
1213
|
+
setState((prev) => ({ ...prev, loading: false, error: message }));
|
|
1214
|
+
return [];
|
|
1215
|
+
}
|
|
1216
|
+
},
|
|
1217
|
+
[options]
|
|
1218
|
+
);
|
|
1219
|
+
return {
|
|
1220
|
+
// State
|
|
1221
|
+
...state,
|
|
1222
|
+
// Query functions
|
|
1223
|
+
getSummary,
|
|
1224
|
+
getChats,
|
|
1225
|
+
getAgents,
|
|
1226
|
+
getUsage,
|
|
1227
|
+
getDaily,
|
|
1228
|
+
getEvents,
|
|
1229
|
+
// Event tracking
|
|
1230
|
+
trackEvent,
|
|
1231
|
+
trackPageView,
|
|
1232
|
+
// Global analytics (admin)
|
|
1233
|
+
getGlobalSummary,
|
|
1234
|
+
getGlobalOrgs
|
|
1235
|
+
};
|
|
1236
|
+
}
|
|
1237
|
+
var useAnalyticsContext = useProductAnalytics;
|
|
1238
|
+
|
|
1239
|
+
// hooks/use-org-provisioning.ts
|
|
1240
|
+
var import_react6 = require("react");
|
|
1241
|
+
function useOrgProvisioning(options) {
|
|
1242
|
+
const [state, setState] = (0, import_react6.useState)({
|
|
1243
|
+
status: "idle",
|
|
1244
|
+
progress: null,
|
|
1245
|
+
org: null,
|
|
1246
|
+
error: null,
|
|
1247
|
+
percentage: 0
|
|
1248
|
+
});
|
|
1249
|
+
const cleanupRef = (0, import_react6.useRef)(null);
|
|
1250
|
+
(0, import_react6.useEffect)(() => {
|
|
1251
|
+
return () => {
|
|
1252
|
+
if (cleanupRef.current) {
|
|
1253
|
+
cleanupRef.current();
|
|
1254
|
+
}
|
|
1255
|
+
};
|
|
1256
|
+
}, []);
|
|
1257
|
+
const createOrgWithProvisioning = (0, import_react6.useCallback)(
|
|
1258
|
+
async (request) => {
|
|
1259
|
+
setState((prev) => ({
|
|
1260
|
+
...prev,
|
|
1261
|
+
status: "creating",
|
|
1262
|
+
error: null,
|
|
1263
|
+
progress: null,
|
|
1264
|
+
percentage: 0
|
|
1265
|
+
}));
|
|
1266
|
+
try {
|
|
1267
|
+
const response = await createOrgWithProvisioningApi(request, options);
|
|
1268
|
+
if (response.error) {
|
|
1269
|
+
setState((prev) => ({
|
|
1270
|
+
...prev,
|
|
1271
|
+
status: "failed",
|
|
1272
|
+
error: response.error || "Failed to create organization"
|
|
1273
|
+
}));
|
|
1274
|
+
return null;
|
|
1275
|
+
}
|
|
1276
|
+
const org = response.data?.organization || response.data?.org;
|
|
1277
|
+
if (!org) {
|
|
1278
|
+
setState((prev) => ({
|
|
1279
|
+
...prev,
|
|
1280
|
+
status: "failed",
|
|
1281
|
+
error: "No organization returned"
|
|
1282
|
+
}));
|
|
1283
|
+
return null;
|
|
1284
|
+
}
|
|
1285
|
+
setState((prev) => ({
|
|
1286
|
+
...prev,
|
|
1287
|
+
status: "provisioning",
|
|
1288
|
+
org
|
|
1289
|
+
}));
|
|
1290
|
+
const cleanup = streamProvisioningProgress(
|
|
1291
|
+
org.id,
|
|
1292
|
+
{
|
|
1293
|
+
onProgress: (progress) => {
|
|
1294
|
+
const percentage = calculateProgressPercentage(progress);
|
|
1295
|
+
const status = isProvisioningComplete(progress) ? isProvisioningSuccessful(progress) ? "completed" : progress.status === "partial" ? "partial" : "failed" : "provisioning";
|
|
1296
|
+
setState((prev) => ({
|
|
1297
|
+
...prev,
|
|
1298
|
+
status,
|
|
1299
|
+
progress,
|
|
1300
|
+
percentage,
|
|
1301
|
+
error: progress.error || null
|
|
1302
|
+
}));
|
|
1303
|
+
},
|
|
1304
|
+
onDone: () => {
|
|
1305
|
+
cleanupRef.current = null;
|
|
1306
|
+
},
|
|
1307
|
+
onError: (error) => {
|
|
1308
|
+
setState((prev) => ({
|
|
1309
|
+
...prev,
|
|
1310
|
+
status: "failed",
|
|
1311
|
+
error: error.message
|
|
1312
|
+
}));
|
|
1313
|
+
cleanupRef.current = null;
|
|
1314
|
+
},
|
|
1315
|
+
onTimeout: () => {
|
|
1316
|
+
setState((prev) => ({
|
|
1317
|
+
...prev,
|
|
1318
|
+
error: "Provisioning timed out"
|
|
1319
|
+
}));
|
|
1320
|
+
cleanupRef.current = null;
|
|
1321
|
+
}
|
|
1322
|
+
},
|
|
1323
|
+
{ baseUrl: options.baseUrl }
|
|
1324
|
+
);
|
|
1325
|
+
cleanupRef.current = cleanup;
|
|
1326
|
+
return org;
|
|
1327
|
+
} catch (err) {
|
|
1328
|
+
const message = err instanceof Error ? err.message : "Failed to create organization";
|
|
1329
|
+
setState((prev) => ({
|
|
1330
|
+
...prev,
|
|
1331
|
+
status: "failed",
|
|
1332
|
+
error: message
|
|
1333
|
+
}));
|
|
1334
|
+
return null;
|
|
1335
|
+
}
|
|
1336
|
+
},
|
|
1337
|
+
[options]
|
|
1338
|
+
);
|
|
1339
|
+
const getProvisioningStatus = (0, import_react6.useCallback)(
|
|
1340
|
+
async (orgId) => {
|
|
1341
|
+
try {
|
|
1342
|
+
const response = await getProvisioningStatusApi(orgId, options);
|
|
1343
|
+
if (response.error) {
|
|
1344
|
+
setState((prev) => ({ ...prev, error: response.error || null }));
|
|
1345
|
+
return null;
|
|
1346
|
+
}
|
|
1347
|
+
const progress = response.data?.progress || null;
|
|
1348
|
+
if (progress) {
|
|
1349
|
+
setState((prev) => ({
|
|
1350
|
+
...prev,
|
|
1351
|
+
progress,
|
|
1352
|
+
percentage: calculateProgressPercentage(progress),
|
|
1353
|
+
status: isProvisioningComplete(progress) ? isProvisioningSuccessful(progress) ? "completed" : progress.status === "partial" ? "partial" : "failed" : "provisioning"
|
|
1354
|
+
}));
|
|
1355
|
+
}
|
|
1356
|
+
return progress;
|
|
1357
|
+
} catch (err) {
|
|
1358
|
+
const message = err instanceof Error ? err.message : "Failed to get provisioning status";
|
|
1359
|
+
setState((prev) => ({ ...prev, error: message }));
|
|
1360
|
+
return null;
|
|
1361
|
+
}
|
|
1362
|
+
},
|
|
1363
|
+
[options]
|
|
1364
|
+
);
|
|
1365
|
+
const retryProvisioning = (0, import_react6.useCallback)(
|
|
1366
|
+
async (orgId, artifacts) => {
|
|
1367
|
+
setState((prev) => ({
|
|
1368
|
+
...prev,
|
|
1369
|
+
status: "provisioning",
|
|
1370
|
+
error: null
|
|
1371
|
+
}));
|
|
1372
|
+
try {
|
|
1373
|
+
const request = artifacts ? { artifacts } : void 0;
|
|
1374
|
+
const response = await retryProvisioningApi(orgId, request, options);
|
|
1375
|
+
if (response.error) {
|
|
1376
|
+
setState((prev) => ({
|
|
1377
|
+
...prev,
|
|
1378
|
+
status: "failed",
|
|
1379
|
+
error: response.error || "Failed to retry provisioning"
|
|
1380
|
+
}));
|
|
1381
|
+
return false;
|
|
1382
|
+
}
|
|
1383
|
+
const cleanup = streamProvisioningProgress(
|
|
1384
|
+
orgId,
|
|
1385
|
+
{
|
|
1386
|
+
onProgress: (progress) => {
|
|
1387
|
+
const percentage = calculateProgressPercentage(progress);
|
|
1388
|
+
const status = isProvisioningComplete(progress) ? isProvisioningSuccessful(progress) ? "completed" : progress.status === "partial" ? "partial" : "failed" : "provisioning";
|
|
1389
|
+
setState((prev) => ({
|
|
1390
|
+
...prev,
|
|
1391
|
+
status,
|
|
1392
|
+
progress,
|
|
1393
|
+
percentage,
|
|
1394
|
+
error: progress.error || null
|
|
1395
|
+
}));
|
|
1396
|
+
},
|
|
1397
|
+
onDone: () => {
|
|
1398
|
+
cleanupRef.current = null;
|
|
1399
|
+
},
|
|
1400
|
+
onError: (error) => {
|
|
1401
|
+
setState((prev) => ({
|
|
1402
|
+
...prev,
|
|
1403
|
+
status: "failed",
|
|
1404
|
+
error: error.message
|
|
1405
|
+
}));
|
|
1406
|
+
cleanupRef.current = null;
|
|
1407
|
+
}
|
|
1408
|
+
},
|
|
1409
|
+
{ baseUrl: options.baseUrl }
|
|
1410
|
+
);
|
|
1411
|
+
cleanupRef.current = cleanup;
|
|
1412
|
+
return true;
|
|
1413
|
+
} catch (err) {
|
|
1414
|
+
const message = err instanceof Error ? err.message : "Failed to retry provisioning";
|
|
1415
|
+
setState((prev) => ({
|
|
1416
|
+
...prev,
|
|
1417
|
+
status: "failed",
|
|
1418
|
+
error: message
|
|
1419
|
+
}));
|
|
1420
|
+
return false;
|
|
1421
|
+
}
|
|
1422
|
+
},
|
|
1423
|
+
[options]
|
|
1424
|
+
);
|
|
1425
|
+
const validateProvisioning = (0, import_react6.useCallback)(
|
|
1426
|
+
async (orgId) => {
|
|
1427
|
+
try {
|
|
1428
|
+
const response = await validateProvisioningApi(orgId, options);
|
|
1429
|
+
if (response.error) {
|
|
1430
|
+
setState((prev) => ({ ...prev, error: response.error || null }));
|
|
1431
|
+
return null;
|
|
1432
|
+
}
|
|
1433
|
+
return response.data || null;
|
|
1434
|
+
} catch (err) {
|
|
1435
|
+
const message = err instanceof Error ? err.message : "Failed to validate provisioning";
|
|
1436
|
+
setState((prev) => ({ ...prev, error: message }));
|
|
1437
|
+
return null;
|
|
1438
|
+
}
|
|
1439
|
+
},
|
|
1440
|
+
[options]
|
|
1441
|
+
);
|
|
1442
|
+
const cancelProvisioning = (0, import_react6.useCallback)(
|
|
1443
|
+
async (orgId) => {
|
|
1444
|
+
try {
|
|
1445
|
+
if (cleanupRef.current) {
|
|
1446
|
+
cleanupRef.current();
|
|
1447
|
+
cleanupRef.current = null;
|
|
1448
|
+
}
|
|
1449
|
+
const response = await cancelProvisioningApi(orgId, options);
|
|
1450
|
+
if (response.error) {
|
|
1451
|
+
setState((prev) => ({ ...prev, error: response.error || null }));
|
|
1452
|
+
return false;
|
|
1453
|
+
}
|
|
1454
|
+
setState((prev) => ({
|
|
1455
|
+
...prev,
|
|
1456
|
+
status: "failed",
|
|
1457
|
+
error: "Provisioning cancelled"
|
|
1458
|
+
}));
|
|
1459
|
+
return true;
|
|
1460
|
+
} catch (err) {
|
|
1461
|
+
const message = err instanceof Error ? err.message : "Failed to cancel provisioning";
|
|
1462
|
+
setState((prev) => ({ ...prev, error: message }));
|
|
1463
|
+
return false;
|
|
1464
|
+
}
|
|
1465
|
+
},
|
|
1466
|
+
[options]
|
|
1467
|
+
);
|
|
1468
|
+
const cleanupOrg = (0, import_react6.useCallback)(
|
|
1469
|
+
async (orgId) => {
|
|
1470
|
+
try {
|
|
1471
|
+
const response = await cleanupProvisioningApi(orgId, options);
|
|
1472
|
+
if (response.error) {
|
|
1473
|
+
setState((prev) => ({ ...prev, error: response.error || null }));
|
|
1474
|
+
return false;
|
|
1475
|
+
}
|
|
1476
|
+
return true;
|
|
1477
|
+
} catch (err) {
|
|
1478
|
+
const message = err instanceof Error ? err.message : "Failed to cleanup organization";
|
|
1479
|
+
setState((prev) => ({ ...prev, error: message }));
|
|
1480
|
+
return false;
|
|
1481
|
+
}
|
|
1482
|
+
},
|
|
1483
|
+
[options]
|
|
1484
|
+
);
|
|
1485
|
+
const reset = (0, import_react6.useCallback)(() => {
|
|
1486
|
+
if (cleanupRef.current) {
|
|
1487
|
+
cleanupRef.current();
|
|
1488
|
+
cleanupRef.current = null;
|
|
1489
|
+
}
|
|
1490
|
+
setState({
|
|
1491
|
+
status: "idle",
|
|
1492
|
+
progress: null,
|
|
1493
|
+
org: null,
|
|
1494
|
+
error: null,
|
|
1495
|
+
percentage: 0
|
|
1496
|
+
});
|
|
1497
|
+
}, []);
|
|
1498
|
+
return {
|
|
1499
|
+
state,
|
|
1500
|
+
createOrgWithProvisioning,
|
|
1501
|
+
getProvisioningStatus,
|
|
1502
|
+
retryProvisioning,
|
|
1503
|
+
validateProvisioning,
|
|
1504
|
+
cancelProvisioning,
|
|
1505
|
+
cleanupOrg,
|
|
1506
|
+
reset,
|
|
1507
|
+
// Helper functions
|
|
1508
|
+
isComplete: state.status === "completed",
|
|
1509
|
+
isFailed: state.status === "failed",
|
|
1510
|
+
isPartial: state.status === "partial",
|
|
1511
|
+
isProvisioning: state.status === "provisioning" || state.status === "creating",
|
|
1512
|
+
failedArtifacts: state.progress ? getFailedArtifacts(state.progress) : [],
|
|
1513
|
+
hasCriticalFailures: state.progress ? hasCriticalFailures(state.progress) : false
|
|
1514
|
+
};
|
|
1515
|
+
}
|
|
758
1516
|
// Annotate the CommonJS export names for ESM import in node:
|
|
759
1517
|
0 && (module.exports = {
|
|
1518
|
+
useAnalyticsContext,
|
|
760
1519
|
useInvitesAdmin,
|
|
761
1520
|
useOrgAdmin,
|
|
1521
|
+
useOrgProvisioning,
|
|
762
1522
|
useOrgSettings,
|
|
1523
|
+
useProductAnalytics,
|
|
763
1524
|
useUsersAdmin
|
|
764
1525
|
});
|
|
765
1526
|
//# sourceMappingURL=index.cjs.map
|