@opencx/widget 3.0.76 → 3.0.78
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/designs.cjs +8 -8
- package/dist/designs.cjs.map +1 -1
- package/dist/designs.js +199 -174
- package/dist/designs.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.js +2 -2
- package/dist/src/headless/core/__tests__/test-utils.d.ts +36 -0
- package/dist/src/headless/core/api/api-caller.d.ts +37 -1
- package/dist/src/headless/core/api/schema.d.ts +51 -0
- package/dist/src/headless/core/context/active-session-polling.ctx.d.ts +1 -1
- package/dist/src/headless/core/context/message.ctx.d.ts +1 -1
- package/dist/src/headless/core/context/session.ctx.d.ts +2 -1
- package/dist/src/headless/core/index.d.ts +1 -1
- package/dist/src/headless/core/types/{schemas.d.ts → dtos.d.ts} +1 -0
- package/dist/src/headless/core/types/messages.d.ts +1 -1
- package/dist/{useWidgetTrigger-D-OdmCtY.cjs → useWidgetTrigger-BQY6R62E.cjs} +2 -2
- package/dist/{useWidgetTrigger-D-OdmCtY.cjs.map → useWidgetTrigger-BQY6R62E.cjs.map} +1 -1
- package/dist/{useWidgetTrigger-CJFrgKrO.js → useWidgetTrigger-CHdrv5fT.js} +3 -3
- package/dist/{useWidgetTrigger-CJFrgKrO.js.map → useWidgetTrigger-CHdrv5fT.js.map} +1 -1
- package/dist/{widget.ctx-W1JQt9cl.js → widget.ctx-DRC-z8Ql.js} +112 -102
- package/dist/widget.ctx-DRC-z8Ql.js.map +1 -0
- package/dist/widget.ctx-sL-dW2kY.cjs +5 -0
- package/dist/widget.ctx-sL-dW2kY.cjs.map +1 -0
- package/dist-embed/script.js +12 -12
- package/dist-embed/script.js.map +1 -1
- package/package.json +1 -1
- package/dist/widget.ctx-D_eeZ2xk.cjs +0 -5
- package/dist/widget.ctx-D_eeZ2xk.cjs.map +0 -1
- package/dist/widget.ctx-W1JQt9cl.js.map +0 -1
|
@@ -1,43 +1,43 @@
|
|
|
1
1
|
import M from "openapi-fetch";
|
|
2
2
|
import O from "lodash.isequal";
|
|
3
3
|
import { v4 as E } from "uuid";
|
|
4
|
-
const F = (
|
|
5
|
-
console.log(
|
|
6
|
-
}, _ = (
|
|
4
|
+
const F = (g) => {
|
|
5
|
+
console.log(g.error);
|
|
6
|
+
}, _ = (g) => {
|
|
7
7
|
const n = M({
|
|
8
|
-
baseUrl:
|
|
8
|
+
baseUrl: g.baseUrl
|
|
9
9
|
}), i = {
|
|
10
|
-
onRequest:
|
|
11
|
-
onResponse:
|
|
12
|
-
onError:
|
|
10
|
+
onRequest: g.onRequest,
|
|
11
|
+
onResponse: g.onResponse,
|
|
12
|
+
onError: g.onError || F
|
|
13
13
|
};
|
|
14
14
|
return n.use(i), n;
|
|
15
15
|
};
|
|
16
16
|
class T {
|
|
17
17
|
constructor({ config: n }) {
|
|
18
|
-
var
|
|
18
|
+
var a, s;
|
|
19
19
|
this.userToken = null, this.constructClientOptions = (t) => {
|
|
20
|
-
const e = this.config.apiUrl || "https://api.open.cx",
|
|
20
|
+
const e = this.config.apiUrl || "https://api.open.cx", o = {
|
|
21
21
|
"X-Bot-Token": this.config.token,
|
|
22
22
|
"Content-Type": "application/json",
|
|
23
23
|
Accept: "application/json",
|
|
24
24
|
Authorization: t ? `Bearer ${t}` : void 0
|
|
25
25
|
};
|
|
26
|
-
return { baseUrl: e, headers:
|
|
26
|
+
return { baseUrl: e, headers: o };
|
|
27
27
|
}, this.createOpenAPIClient = ({
|
|
28
28
|
baseUrl: t,
|
|
29
29
|
headers: e
|
|
30
30
|
}) => _({
|
|
31
31
|
baseUrl: t,
|
|
32
|
-
onRequest: ({ request:
|
|
32
|
+
onRequest: ({ request: o }) => {
|
|
33
33
|
Object.entries(e).forEach(([l, r]) => {
|
|
34
|
-
r &&
|
|
34
|
+
r && o.headers.set(l, r);
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
}), this.setAuthToken = (t) => {
|
|
38
38
|
this.userToken = t;
|
|
39
|
-
const { baseUrl: e, headers:
|
|
40
|
-
this.client = this.createOpenAPIClient({ baseUrl: e, headers:
|
|
39
|
+
const { baseUrl: e, headers: o } = this.constructClientOptions(t);
|
|
40
|
+
this.client = this.createOpenAPIClient({ baseUrl: e, headers: o });
|
|
41
41
|
}, this.getExternalWidgetConfig = async () => await this.client.GET("/backend/widget/v2/config", {
|
|
42
42
|
params: { header: { "X-Bot-Token": this.config.token } }
|
|
43
43
|
}), this.widgetPrelude = async () => await this.client.GET("/backend/widget/v2/prelude", {
|
|
@@ -56,28 +56,28 @@ class T {
|
|
|
56
56
|
}), this.pollSessionAndHistory = async ({
|
|
57
57
|
sessionId: t,
|
|
58
58
|
lastMessageTimestamp: e,
|
|
59
|
-
abortSignal:
|
|
59
|
+
abortSignal: o
|
|
60
60
|
}) => {
|
|
61
61
|
const l = e ? { lastMessageTimestamp: e } : void 0;
|
|
62
62
|
return await this.client.GET("/backend/widget/v2/poll/{sessionId}", {
|
|
63
63
|
params: { path: { sessionId: t }, query: l },
|
|
64
|
-
signal:
|
|
64
|
+
signal: o
|
|
65
65
|
});
|
|
66
66
|
}, this.getSessions = async ({
|
|
67
67
|
cursor: t,
|
|
68
68
|
filters: e,
|
|
69
|
-
abortSignal:
|
|
69
|
+
abortSignal: o
|
|
70
70
|
}) => await this.client.GET("/backend/widget/v2/sessions", {
|
|
71
71
|
params: { query: { cursor: t, filters: JSON.stringify(e) } },
|
|
72
|
-
signal:
|
|
72
|
+
signal: o
|
|
73
73
|
}), this.uploadFile = async ({
|
|
74
74
|
file: t,
|
|
75
75
|
abortSignal: e,
|
|
76
|
-
onProgress:
|
|
76
|
+
onProgress: o
|
|
77
77
|
}) => new Promise((l, r) => {
|
|
78
78
|
var v;
|
|
79
|
-
const
|
|
80
|
-
|
|
79
|
+
const d = new FormData();
|
|
80
|
+
d.append("file", t);
|
|
81
81
|
const c = new XMLHttpRequest();
|
|
82
82
|
if (e && (e.addEventListener("abort", () => {
|
|
83
83
|
c.abort(), r(new DOMException("Aborted", "AbortError"));
|
|
@@ -86,9 +86,9 @@ class T {
|
|
|
86
86
|
return;
|
|
87
87
|
}
|
|
88
88
|
c.upload.addEventListener("progress", (u) => {
|
|
89
|
-
if (u.lengthComputable &&
|
|
90
|
-
const
|
|
91
|
-
|
|
89
|
+
if (u.lengthComputable && o) {
|
|
90
|
+
const S = Math.round(u.loaded / u.total * 100);
|
|
91
|
+
o(S);
|
|
92
92
|
}
|
|
93
93
|
}), c.addEventListener("load", () => {
|
|
94
94
|
if (c.status >= 200 && c.status < 300)
|
|
@@ -106,8 +106,11 @@ class T {
|
|
|
106
106
|
r(new Error("Upload timed out"));
|
|
107
107
|
});
|
|
108
108
|
const { baseUrl: C } = this.constructClientOptions(this.userToken), p = `${C}/backend/widget/v2/upload`;
|
|
109
|
-
c.open("POST", p), c.setRequestHeader("X-Bot-Token", this.config.token), this.userToken ?? ((v = this.config.user) == null ? void 0 : v.token) ? c.setRequestHeader("Authorization", `Bearer ${this.userToken}`) : console.error("User token not set"), c.send(
|
|
110
|
-
}), this.vote = async (t) => await this.client.POST("/backend/widget/v2/chat/vote", { body: t }), this.
|
|
109
|
+
c.open("POST", p), c.setRequestHeader("X-Bot-Token", this.config.token), this.userToken ?? ((v = this.config.user) == null ? void 0 : v.token) ? c.setRequestHeader("Authorization", `Bearer ${this.userToken}`) : console.error("User token not set"), c.send(d);
|
|
110
|
+
}), this.vote = async (t) => await this.client.POST("/backend/widget/v2/chat/vote", { body: t }), this.resolveSession = async (t, e) => await this.client.POST("/backend/widget/v2/session/resolve", {
|
|
111
|
+
body: t,
|
|
112
|
+
signal: e
|
|
113
|
+
}), this.config = n, this.userToken = ((a = n.user) == null ? void 0 : a.token) || null;
|
|
111
114
|
const { baseUrl: i, headers: h } = this.constructClientOptions(
|
|
112
115
|
(s = n.user) == null ? void 0 : s.token
|
|
113
116
|
);
|
|
@@ -125,9 +128,9 @@ class P {
|
|
|
125
128
|
}, this.reset = () => {
|
|
126
129
|
this.set(this.initialState);
|
|
127
130
|
}, this.notifySubscribers = (i) => {
|
|
128
|
-
Array.from(this.subscribers).forEach((
|
|
131
|
+
Array.from(this.subscribers).forEach((a) => {
|
|
129
132
|
try {
|
|
130
|
-
|
|
133
|
+
a(i);
|
|
131
134
|
} catch (s) {
|
|
132
135
|
console.error(s);
|
|
133
136
|
}
|
|
@@ -147,7 +150,7 @@ class A {
|
|
|
147
150
|
this.abortController.abort("Resetting poller"), (n = this.stopPolling) == null || n.call(this), this.stopPolling = null;
|
|
148
151
|
}, this.stopPolling = null, this.startPolling = (n, i) => {
|
|
149
152
|
if (this.stopPolling) return;
|
|
150
|
-
const h = [],
|
|
153
|
+
const h = [], a = async () => {
|
|
151
154
|
this.abortController = new AbortController(), this.state.setPartial({ isPolling: !0 });
|
|
152
155
|
try {
|
|
153
156
|
await n(this.abortController.signal);
|
|
@@ -158,17 +161,17 @@ class A {
|
|
|
158
161
|
} finally {
|
|
159
162
|
this.state.setPartial({ isPolling: !1 });
|
|
160
163
|
}
|
|
161
|
-
this.abortController.signal.aborted ? console.log("Poller aborted, not scheduling anymore") : h.push(setTimeout(
|
|
164
|
+
this.abortController.signal.aborted ? console.log("Poller aborted, not scheduling anymore") : h.push(setTimeout(a, i));
|
|
162
165
|
};
|
|
163
|
-
|
|
166
|
+
a(), this.stopPolling = () => {
|
|
164
167
|
h.forEach(clearTimeout), this.state.reset();
|
|
165
168
|
};
|
|
166
169
|
};
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
|
-
function D(
|
|
172
|
+
function D(g) {
|
|
170
173
|
try {
|
|
171
|
-
const n =
|
|
174
|
+
const n = g();
|
|
172
175
|
return n instanceof Promise ? n.then((i) => ({ data: i })).catch((i) => ({ error: i })) : { data: n };
|
|
173
176
|
} catch (n) {
|
|
174
177
|
return { error: n };
|
|
@@ -179,7 +182,7 @@ class L {
|
|
|
179
182
|
api: n,
|
|
180
183
|
config: i,
|
|
181
184
|
sessionCtx: h,
|
|
182
|
-
messageCtx:
|
|
185
|
+
messageCtx: a,
|
|
183
186
|
sessionPollingIntervalSeconds: s
|
|
184
187
|
}) {
|
|
185
188
|
this.poller = new A(), this.registerPolling = () => {
|
|
@@ -189,9 +192,9 @@ class L {
|
|
|
189
192
|
}, this.sessionPollingIntervalSeconds * 1e3) : this.poller.reset();
|
|
190
193
|
});
|
|
191
194
|
}, this.hackAndSlash = async (t, e) => {
|
|
192
|
-
var
|
|
195
|
+
var d;
|
|
193
196
|
this.messageCtx.state.get().messages.length === 0 && this.messageCtx.state.setPartial({ isInitialFetchLoading: !0 });
|
|
194
|
-
const
|
|
197
|
+
const o = this.messageCtx.state.get().messages, l = o.length > 0 ? (d = o[o.length - 1]) == null ? void 0 : d.timestamp : void 0, { data: r } = await this.api.pollSessionAndHistory({
|
|
195
198
|
sessionId: t,
|
|
196
199
|
abortSignal: e,
|
|
197
200
|
lastMessageTimestamp: l
|
|
@@ -234,7 +237,7 @@ class L {
|
|
|
234
237
|
isAi: !1
|
|
235
238
|
}
|
|
236
239
|
};
|
|
237
|
-
const
|
|
240
|
+
const o = t.actionCalls && t.actionCalls.length > 0 ? t.actionCalls[t.actionCalls.length - 1] : void 0;
|
|
238
241
|
return {
|
|
239
242
|
...e,
|
|
240
243
|
type: "FROM_BOT",
|
|
@@ -247,9 +250,9 @@ class L {
|
|
|
247
250
|
},
|
|
248
251
|
data: {
|
|
249
252
|
message: t.content.text || "",
|
|
250
|
-
action:
|
|
251
|
-
name:
|
|
252
|
-
data: this.extractActionResult(
|
|
253
|
+
action: o ? {
|
|
254
|
+
name: o.actionName,
|
|
255
|
+
data: this.extractActionResult(o)
|
|
253
256
|
} : void 0
|
|
254
257
|
}
|
|
255
258
|
};
|
|
@@ -257,11 +260,11 @@ class L {
|
|
|
257
260
|
const e = t.result;
|
|
258
261
|
if (e === null || typeof e != "object") return e;
|
|
259
262
|
if ("responseBodyText" in e && typeof e.responseBodyText == "string") {
|
|
260
|
-
const
|
|
263
|
+
const o = e.responseBodyText, l = D(() => JSON.parse(o)).data;
|
|
261
264
|
if (l) return l;
|
|
262
265
|
}
|
|
263
266
|
return t.result;
|
|
264
|
-
}, this.api = n, this.config = i, this.sessionCtx = h, this.messageCtx =
|
|
267
|
+
}, this.api = n, this.config = i, this.sessionCtx = h, this.messageCtx = a, this.sessionPollingIntervalSeconds = s, this.registerPolling();
|
|
265
268
|
}
|
|
266
269
|
}
|
|
267
270
|
class B {
|
|
@@ -270,24 +273,24 @@ class B {
|
|
|
270
273
|
api: i,
|
|
271
274
|
storageCtx: h
|
|
272
275
|
}) {
|
|
273
|
-
var
|
|
276
|
+
var a;
|
|
274
277
|
this.shouldCollectData = () => {
|
|
275
278
|
var s;
|
|
276
279
|
return !!(!((s = this.state.get().contact) != null && s.token) && this.config.collectUserData);
|
|
277
280
|
}, this.autoCreateUnverifiedUserIfNotExists = async () => {
|
|
278
|
-
var s, t, e,
|
|
281
|
+
var s, t, e, o, l, r, d, c, C, x, p, b, v, u;
|
|
279
282
|
if (!((s = this.config.user) != null && s.token)) {
|
|
280
283
|
if (this.config.collectUserData && !((e = (t = this.config.user) == null ? void 0 : t.data) != null && e.email)) {
|
|
281
|
-
if ((
|
|
284
|
+
if ((o = this.config.extraDataCollectionFields) != null && o.length)
|
|
282
285
|
return;
|
|
283
|
-
const
|
|
284
|
-
|
|
286
|
+
const S = await ((l = this.storageCtx) == null ? void 0 : l.getContactToken());
|
|
287
|
+
S && await this.setUnverifiedContact(S);
|
|
285
288
|
return;
|
|
286
289
|
}
|
|
287
|
-
if (!((
|
|
288
|
-
const
|
|
289
|
-
if (
|
|
290
|
-
await this.setUnverifiedContact(
|
|
290
|
+
if (!((d = (r = this.config.user) == null ? void 0 : r.data) != null && d.email)) {
|
|
291
|
+
const S = await ((c = this.storageCtx) == null ? void 0 : c.getContactToken());
|
|
292
|
+
if (S) {
|
|
293
|
+
await this.setUnverifiedContact(S);
|
|
291
294
|
return;
|
|
292
295
|
}
|
|
293
296
|
}
|
|
@@ -310,11 +313,11 @@ class B {
|
|
|
310
313
|
this.state.setPartial({ isCreatingUnverifiedContact: !1 });
|
|
311
314
|
}
|
|
312
315
|
}, this.setUnverifiedContact = async (s) => {
|
|
313
|
-
var
|
|
314
|
-
const t = await ((
|
|
315
|
-
this.api.setAuthToken(s), await ((r = this.storageCtx) == null ? void 0 : r.setContactToken(s)), await ((
|
|
316
|
+
var o, l, r, d;
|
|
317
|
+
const t = await ((o = this.storageCtx) == null ? void 0 : o.getExternalContactId()), e = ((l = this.config.user) == null ? void 0 : l.externalId) || t || E();
|
|
318
|
+
this.api.setAuthToken(s), await ((r = this.storageCtx) == null ? void 0 : r.setContactToken(s)), await ((d = this.storageCtx) == null ? void 0 : d.setExternalContactId(e)), this.state.setPartial({ contact: { token: s, externalId: e } });
|
|
316
319
|
}, this.config = n, this.storageCtx = h, this.api = i, this.state = new P({
|
|
317
|
-
contact: (
|
|
320
|
+
contact: (a = n.user) != null && a.token ? {
|
|
318
321
|
token: n.user.token,
|
|
319
322
|
// Set optional externalId from config... not local storage
|
|
320
323
|
externalId: n.user.externalId
|
|
@@ -325,7 +328,7 @@ class B {
|
|
|
325
328
|
}), this.autoCreateUnverifiedUserIfNotExists();
|
|
326
329
|
}
|
|
327
330
|
}
|
|
328
|
-
function
|
|
331
|
+
function y() {
|
|
329
332
|
return E();
|
|
330
333
|
}
|
|
331
334
|
class q {
|
|
@@ -349,9 +352,9 @@ class q {
|
|
|
349
352
|
}), this.reset = async () => {
|
|
350
353
|
this.sessionState.reset();
|
|
351
354
|
}, this.registerSessionsRefresherWrapper = () => {
|
|
352
|
-
var
|
|
355
|
+
var a;
|
|
353
356
|
// If the widget config was initially provided with a contact token, no state change would be triggered, so we just fetch
|
|
354
|
-
(
|
|
357
|
+
(a = this.contactCtx.state.get().contact) != null && a.token && !this.sessionsState.get().didStartInitialFetch ? this.registerSessionsRefresher() : this.contactCtx.state.subscribe(({ contact: s }) => {
|
|
355
358
|
s != null && s.token && !this.sessionsState.get().didStartInitialFetch && this.registerSessionsRefresher();
|
|
356
359
|
});
|
|
357
360
|
}, this.registerSessionsRefresher = () => {
|
|
@@ -361,45 +364,52 @@ class q {
|
|
|
361
364
|
}, this.createSession = async () => {
|
|
362
365
|
var e;
|
|
363
366
|
this.sessionState.setPartial({ session: null, isCreatingSession: !0 });
|
|
364
|
-
const
|
|
365
|
-
customData:
|
|
366
|
-
external_id:
|
|
367
|
+
const a = (e = this.contactCtx.state.get().contact) == null ? void 0 : e.externalId, { data: s, error: t } = await this.api.createSession({
|
|
368
|
+
customData: a ? {
|
|
369
|
+
external_id: a
|
|
367
370
|
} : void 0
|
|
368
371
|
});
|
|
369
372
|
return s ? (this.sessionState.setPartial({ session: s, isCreatingSession: !1 }), s) : (console.error("Failed to create session:", t), null);
|
|
370
373
|
}, this.loadMoreSessions = async () => {
|
|
371
374
|
if (this.sessionsState.get().isLastPage) return;
|
|
372
|
-
const { data:
|
|
375
|
+
const { data: a } = await this.getSessions({
|
|
373
376
|
cursor: this.sessionsState.get().cursor
|
|
374
377
|
});
|
|
375
|
-
if (
|
|
376
|
-
const t = [...this.sessionsState.get().data, ...
|
|
377
|
-
(e,
|
|
378
|
+
if (a) {
|
|
379
|
+
const t = [...this.sessionsState.get().data, ...a.items].filter(
|
|
380
|
+
(e, o, l) => o === l.findIndex((r) => e.id === r.id)
|
|
378
381
|
);
|
|
379
382
|
this.sessionsState.setPartial({
|
|
380
383
|
data: t,
|
|
381
|
-
cursor:
|
|
382
|
-
isLastPage:
|
|
384
|
+
cursor: a.next || void 0,
|
|
385
|
+
isLastPage: a.next === null
|
|
383
386
|
});
|
|
384
387
|
}
|
|
385
|
-
}, this.getSessions = async ({ cursor:
|
|
388
|
+
}, this.getSessions = async ({ cursor: a }) => {
|
|
386
389
|
var t, e;
|
|
387
390
|
if (!((t = this.contactCtx.state.get().contact) != null && t.token)) return { data: null };
|
|
388
391
|
const s = (e = this.contactCtx.state.get().contact) == null ? void 0 : e.externalId;
|
|
389
392
|
return await this.api.getSessions({
|
|
390
|
-
cursor:
|
|
393
|
+
cursor: a,
|
|
391
394
|
filters: s ? {
|
|
392
395
|
external_id: s
|
|
393
396
|
} : {}
|
|
394
397
|
});
|
|
395
|
-
}, this.setSessions = (
|
|
396
|
-
const s = [...
|
|
397
|
-
(t, e,
|
|
398
|
+
}, this.setSessions = (a) => {
|
|
399
|
+
const s = [...a, ...this.sessionsState.get().data].filter(
|
|
400
|
+
(t, e, o) => e === o.findIndex((l) => t.id === l.id)
|
|
398
401
|
);
|
|
399
402
|
this.sessionsState.setPartial({ data: s });
|
|
400
403
|
}, this.refreshSessions = async () => {
|
|
401
|
-
const { data:
|
|
402
|
-
|
|
404
|
+
const { data: a } = await this.getSessions({ cursor: void 0 });
|
|
405
|
+
a && this.setSessions(a.items);
|
|
406
|
+
}, this.resolveSession = async () => {
|
|
407
|
+
const a = this.sessionState.get().session;
|
|
408
|
+
if (!a || !a.isOpened) return;
|
|
409
|
+
const { data: s } = await this.api.resolveSession({
|
|
410
|
+
session_id: a.id
|
|
411
|
+
});
|
|
412
|
+
s && this.sessionState.setPartial({ session: s });
|
|
403
413
|
}, this.api = n, this.contactCtx = i, this.sessionsPollingIntervalSeconds = h, this.registerSessionsRefresherWrapper();
|
|
404
414
|
}
|
|
405
415
|
}
|
|
@@ -408,7 +418,7 @@ class $ {
|
|
|
408
418
|
config: n,
|
|
409
419
|
api: i,
|
|
410
420
|
sessionCtx: h,
|
|
411
|
-
contactCtx:
|
|
421
|
+
contactCtx: a
|
|
412
422
|
}) {
|
|
413
423
|
this.state = new P({
|
|
414
424
|
messages: [],
|
|
@@ -418,12 +428,12 @@ class $ {
|
|
|
418
428
|
}), this.sendMessageAbortController = new AbortController(), this.reset = () => {
|
|
419
429
|
this.sendMessageAbortController.abort("Resetting chat"), this.state.reset();
|
|
420
430
|
}, this.sendMessage = async (s) => {
|
|
421
|
-
var r,
|
|
431
|
+
var r, d, c, C, x, p, b, v;
|
|
422
432
|
if (!s.content.trim() && (!s.attachments || s.attachments.length === 0)) {
|
|
423
433
|
console.warn("Cannot send an empty message of no content or attachments");
|
|
424
434
|
return;
|
|
425
435
|
}
|
|
426
|
-
const t = this.state.get().isSendingMessage, e = ((r = this.sessionCtx.sessionState.get().session) == null ? void 0 : r.assignee.kind) === "ai",
|
|
436
|
+
const t = this.state.get().isSendingMessage, e = ((r = this.sessionCtx.sessionState.get().session) == null ? void 0 : r.assignee.kind) === "ai", o = this.state.get().messages, l = o.length > 0 ? o[o.length - 1] : void 0;
|
|
427
437
|
if (e && t || // If last message is from user, then bot response did not arrive yet
|
|
428
438
|
e && (l == null ? void 0 : l.type) === "FROM_USER") {
|
|
429
439
|
console.warn("Cannot send messages while awaiting AI response");
|
|
@@ -435,18 +445,18 @@ class $ {
|
|
|
435
445
|
const u = this.toUserMessage(
|
|
436
446
|
s.content.trim(),
|
|
437
447
|
s.attachments || void 0
|
|
438
|
-
),
|
|
448
|
+
), S = this.state.get().messages;
|
|
439
449
|
if (this.state.setPartial({
|
|
440
|
-
messages: [...
|
|
441
|
-
}), !((
|
|
450
|
+
messages: [...S, u]
|
|
451
|
+
}), !((d = this.sessionCtx.sessionState.get().session) != null && d.id)) {
|
|
442
452
|
if (!await this.sessionCtx.createSession()) {
|
|
443
453
|
console.error("Failed to create session");
|
|
444
454
|
return;
|
|
445
455
|
}
|
|
446
456
|
this.sessionCtx.refreshSessions();
|
|
447
457
|
}
|
|
448
|
-
const
|
|
449
|
-
if (!
|
|
458
|
+
const k = (c = this.sessionCtx.sessionState.get().session) == null ? void 0 : c.id;
|
|
459
|
+
if (!k) return;
|
|
450
460
|
const { data: f } = await this.api.sendMessage(
|
|
451
461
|
{
|
|
452
462
|
uuid: u.id,
|
|
@@ -454,7 +464,7 @@ class $ {
|
|
|
454
464
|
headers: this.config.headers,
|
|
455
465
|
query_params: this.config.queryParams,
|
|
456
466
|
body_properties: this.config.bodyProperties,
|
|
457
|
-
session_id:
|
|
467
|
+
session_id: k,
|
|
458
468
|
content: u.content,
|
|
459
469
|
attachments: s.attachments,
|
|
460
470
|
clientContext: this.config.context
|
|
@@ -493,14 +503,14 @@ class $ {
|
|
|
493
503
|
}
|
|
494
504
|
}, this.toUserMessage = (s, t) => {
|
|
495
505
|
const e = (() => {
|
|
496
|
-
const
|
|
497
|
-
return this.state.get().messages.length === 0 &&
|
|
506
|
+
const o = this.contactCtx.state.get().extraCollectedData;
|
|
507
|
+
return this.state.get().messages.length === 0 && o && Object.keys(o).length > 0 ? `${Object.entries(o).filter(([r, d]) => !!d).map(([r, d]) => `${r}: ${d}`).join(`
|
|
498
508
|
`)}
|
|
499
509
|
|
|
500
510
|
${s}` : s;
|
|
501
511
|
})();
|
|
502
512
|
return {
|
|
503
|
-
id:
|
|
513
|
+
id: y(),
|
|
504
514
|
type: "FROM_USER",
|
|
505
515
|
content: e,
|
|
506
516
|
deliveredAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -511,7 +521,7 @@ ${s}` : s;
|
|
|
511
521
|
var t;
|
|
512
522
|
return s.success && s.autopilotResponse ? {
|
|
513
523
|
type: "FROM_BOT",
|
|
514
|
-
id: s.autopilotResponse.id ||
|
|
524
|
+
id: s.autopilotResponse.id || y(),
|
|
515
525
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
516
526
|
component: "bot_message",
|
|
517
527
|
agent: this.config.bot ? {
|
|
@@ -530,7 +540,7 @@ ${s}` : s;
|
|
|
530
540
|
} : null;
|
|
531
541
|
}, this.toBotErrorMessage = (s) => ({
|
|
532
542
|
type: "FROM_BOT",
|
|
533
|
-
id:
|
|
543
|
+
id: y(),
|
|
534
544
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
535
545
|
component: "TEXT",
|
|
536
546
|
data: {
|
|
@@ -538,7 +548,7 @@ ${s}` : s;
|
|
|
538
548
|
variant: "error",
|
|
539
549
|
action: void 0
|
|
540
550
|
}
|
|
541
|
-
}), this.config = n, this.api = i, this.sessionCtx = h, this.contactCtx =
|
|
551
|
+
}), this.config = n, this.api = i, this.sessionCtx = h, this.contactCtx = a;
|
|
542
552
|
}
|
|
543
553
|
}
|
|
544
554
|
class N {
|
|
@@ -546,7 +556,7 @@ class N {
|
|
|
546
556
|
config: n,
|
|
547
557
|
contactCtx: i,
|
|
548
558
|
sessionCtx: h,
|
|
549
|
-
resetChat:
|
|
559
|
+
resetChat: a
|
|
550
560
|
}) {
|
|
551
561
|
this.registerRoutingListener = () => {
|
|
552
562
|
this.contactCtx.state.subscribe(({ contact: s }) => {
|
|
@@ -568,7 +578,7 @@ class N {
|
|
|
568
578
|
this.state.setPartial({ screen: "chat" });
|
|
569
579
|
}, this.state = new P({
|
|
570
580
|
screen: i.shouldCollectData() ? "welcome" : "sessions"
|
|
571
|
-
}), this.config = n, this.contactCtx = i, this.sessionCtx = h, this.resetChat =
|
|
581
|
+
}), this.config = n, this.contactCtx = i, this.sessionCtx = h, this.resetChat = a, this.registerRoutingListener();
|
|
572
582
|
}
|
|
573
583
|
}
|
|
574
584
|
class H {
|
|
@@ -583,14 +593,14 @@ class H {
|
|
|
583
593
|
}, this.getExternalContactId = async () => this.storage.get(this.KEYS.externalContactId), this.storage = n;
|
|
584
594
|
}
|
|
585
595
|
}
|
|
586
|
-
const
|
|
596
|
+
const m = class m {
|
|
587
597
|
constructor({
|
|
588
598
|
config: n,
|
|
589
599
|
storage: i
|
|
590
600
|
}) {
|
|
591
601
|
if (this.resetChat = () => {
|
|
592
602
|
this.sessionCtx.reset(), this.messageCtx.reset();
|
|
593
|
-
}, !
|
|
603
|
+
}, !m.pollingIntervalsSeconds)
|
|
594
604
|
throw Error(
|
|
595
605
|
"Widget polling values are not defined, did you call WidgetCtx.initialize()"
|
|
596
606
|
);
|
|
@@ -601,7 +611,7 @@ const S = class S {
|
|
|
601
611
|
}), this.sessionCtx = new q({
|
|
602
612
|
api: this.api,
|
|
603
613
|
contactCtx: this.contactCtx,
|
|
604
|
-
sessionsPollingIntervalSeconds:
|
|
614
|
+
sessionsPollingIntervalSeconds: m.pollingIntervalsSeconds.sessions
|
|
605
615
|
}), this.messageCtx = new $({
|
|
606
616
|
config: this.config,
|
|
607
617
|
api: this.api,
|
|
@@ -612,7 +622,7 @@ const S = class S {
|
|
|
612
622
|
config: this.config,
|
|
613
623
|
sessionCtx: this.sessionCtx,
|
|
614
624
|
messageCtx: this.messageCtx,
|
|
615
|
-
sessionPollingIntervalSeconds:
|
|
625
|
+
sessionPollingIntervalSeconds: m.pollingIntervalsSeconds.session
|
|
616
626
|
}), this.routerCtx = new N({
|
|
617
627
|
config: this.config,
|
|
618
628
|
contactCtx: this.contactCtx,
|
|
@@ -621,25 +631,25 @@ const S = class S {
|
|
|
621
631
|
});
|
|
622
632
|
}
|
|
623
633
|
};
|
|
624
|
-
|
|
634
|
+
m.pollingIntervalsSeconds = null, m.initialize = async ({
|
|
625
635
|
config: n,
|
|
626
636
|
storage: i
|
|
627
637
|
}) => {
|
|
628
|
-
var
|
|
638
|
+
var a, s;
|
|
629
639
|
const h = await new T({
|
|
630
640
|
config: n
|
|
631
641
|
}).getExternalWidgetConfig();
|
|
632
|
-
return
|
|
633
|
-
session: ((
|
|
642
|
+
return m.pollingIntervalsSeconds = {
|
|
643
|
+
session: ((a = h.data) == null ? void 0 : a.sessionPollingIntervalSeconds) || 10,
|
|
634
644
|
sessions: ((s = h.data) == null ? void 0 : s.sessionsPollingIntervalSeconds) || 60
|
|
635
|
-
}, new
|
|
645
|
+
}, new m({
|
|
636
646
|
config: n,
|
|
637
647
|
storage: i
|
|
638
648
|
});
|
|
639
649
|
};
|
|
640
|
-
let U =
|
|
650
|
+
let U = m;
|
|
641
651
|
export {
|
|
642
652
|
P,
|
|
643
653
|
U as W
|
|
644
654
|
};
|
|
645
|
-
//# sourceMappingURL=widget.ctx-
|
|
655
|
+
//# sourceMappingURL=widget.ctx-DRC-z8Ql.js.map
|