@telia-ace/conversational-hub-bot-provider 0.0.14 → 0.0.16

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.
@@ -0,0 +1,135 @@
1
+ import { jsx as F } from "react/jsx-runtime";
2
+ import z from "@emotion/styled";
3
+ import { DataClient as A, DataType as B } from "@telia-ace/knowledge-data-client";
4
+ import { ContactMethod as N } from "@telia-ace/knowledge-widget-adapters";
5
+ import { useContainer as R, useDispatch as T, useConversation as _ } from "@telia-ace/knowledge-widget-ui";
6
+ import { FormBuilder as j } from "@telia-ace/widget-forms";
7
+ import { appendClassNames as k } from "@telia-ace/widget-utilities";
8
+ import { useState as G, useRef as I, useEffect as S, useCallback as V } from "react";
9
+ import { u as $ } from "./index-e5b52381.mjs";
10
+ import "@telia-ace/widget-conversation";
11
+ import "@telia-ace/widget-services";
12
+ const tt = ({
13
+ contactMethodId: a,
14
+ guideId: e,
15
+ groupId: c,
16
+ className: x
17
+ }) => {
18
+ var h, C, v;
19
+ const [t, n] = G(), m = R(), D = T(), u = I(!0), f = _();
20
+ S(() => {
21
+ const { events: d } = m.get("$widget"), w = d.subscribe(
22
+ "conversational-hub-provider:form-submitted",
23
+ async (b, r) => {
24
+ var M;
25
+ if (((M = r.form.meta) == null ? void 0 : M.groupId) !== c || r.id !== (t == null ? void 0 : t.id))
26
+ return;
27
+ f && (r.form.meta || (r.form.meta = {}), r.form.meta.conversation = f);
28
+ const l = await m.getAsync(
29
+ "contactMethods"
30
+ ), o = {
31
+ ...t,
32
+ body: {
33
+ ...t.body,
34
+ form: r.form
35
+ }
36
+ }, { errors: i, valid: y, errorTypes: H } = await l.validate(
37
+ o
38
+ );
39
+ if (!y) {
40
+ const g = new j(t.body.form);
41
+ n(void 0), g.setValidationErrors(i), o.body = {
42
+ ...o.body,
43
+ form: g.get()
44
+ }, n({ ...o });
45
+ return;
46
+ }
47
+ const E = await l.submit(o);
48
+ o.confirmation = E, n(o);
49
+ }
50
+ ), s = d.subscribe(
51
+ "bot-provider:evaluate",
52
+ async (b, r) => {
53
+ if (r.id !== a)
54
+ return;
55
+ const o = await (await m.getAsync(
56
+ "contactMethods"
57
+ )).evaluate(t);
58
+ let i = {
59
+ ...t,
60
+ body: {
61
+ ...t.body,
62
+ form: o
63
+ }
64
+ };
65
+ const y = $(i, {
66
+ submit: "Submit",
67
+ errors: {},
68
+ meta: { groupId: c }
69
+ });
70
+ i = {
71
+ ...i,
72
+ body: y
73
+ }, n(i);
74
+ }
75
+ );
76
+ return () => {
77
+ w(), s();
78
+ };
79
+ }, [m, t, n, f]);
80
+ const p = V(
81
+ async (d) => {
82
+ const s = await (await A.getInstance(m)).fetch(
83
+ B.ContactMethod,
84
+ {
85
+ contactMethodId: d,
86
+ guideId: e
87
+ },
88
+ { noCache: !0 }
89
+ ), b = $(s, {
90
+ submit: "Submit",
91
+ errors: {},
92
+ meta: { groupId: c }
93
+ });
94
+ if (s.body = b, s.body.guideId = e, !u.current)
95
+ return null;
96
+ n(s);
97
+ },
98
+ // eslint-disable-next-line react-hooks/exhaustive-deps
99
+ [u]
100
+ );
101
+ return S(() => (p(a), () => {
102
+ u.current = !1;
103
+ }), [a, p]), t ? /* @__PURE__ */ F(
104
+ q,
105
+ {
106
+ ...t,
107
+ body: {
108
+ ...t.body,
109
+ form: t.body.form ? {
110
+ ...t.body.form,
111
+ data: (h = t.body.form) == null ? void 0 : h.data,
112
+ layout: { ...t.body.form.layout },
113
+ meta: (C = t.body.form) == null ? void 0 : C.meta,
114
+ schema: (v = t.body.form) == null ? void 0 : v.schema
115
+ } : void 0,
116
+ guideId: t.body.guideId
117
+ },
118
+ inline: !0,
119
+ expanded: !0,
120
+ dispatch: D,
121
+ className: k("humany-bot-contact-method", x)
122
+ }
123
+ ) : null;
124
+ }, q = z(N)`
125
+ padding: ${(a) => {
126
+ var e;
127
+ return (e = a.theme.sizes) == null ? void 0 : e.normal;
128
+ }} ${(a) => {
129
+ var e;
130
+ return (e = a.theme.sizes) == null ? void 0 : e.medium;
131
+ }};
132
+ `;
133
+ export {
134
+ tt as default
135
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("react/jsx-runtime"),A=require("@emotion/styled"),F=require("@telia-ace/knowledge-data-client"),R=require("@telia-ace/knowledge-widget-adapters"),p=require("@telia-ace/knowledge-widget-ui"),T=require("@telia-ace/widget-forms"),$=require("@telia-ace/widget-utilities"),c=require("react"),k=require("./index-f7510e09.js");require("@telia-ace/widget-conversation");require("@telia-ace/widget-services");const z=({contactMethodId:n,guideId:o,groupId:m,className:x})=>{var C,v,w;const[e,s]=c.useState(),d=p.useContainer(),D=p.useDispatch(),b=c.useRef(!0),l=p.useConversation();c.useEffect(()=>{const{events:u}=d.get("$widget"),q=u.subscribe("conversational-hub-provider:form-submitted",async(f,r)=>{var M;if(((M=r.form.meta)==null?void 0:M.groupId)!==m||r.id!==(e==null?void 0:e.id))return;l&&(r.form.meta||(r.form.meta={}),r.form.meta.conversation=l);const y=await d.getAsync("contactMethods"),t={...e,body:{...e.body,form:r.form}},{errors:i,valid:h,errorTypes:N}=await y.validate(t);if(!h){const S=new T.FormBuilder(e.body.form);s(void 0),S.setValidationErrors(i),t.body={...t.body,form:S.get()},s({...t});return}const E=await y.submit(t);t.confirmation=E,s(t)}),a=u.subscribe("bot-provider:evaluate",async(f,r)=>{if(r.id!==n)return;const t=await(await d.getAsync("contactMethods")).evaluate(e);let i={...e,body:{...e.body,form:t}};const h=k.updateForm(i,{submit:"Submit",errors:{},meta:{groupId:m}});i={...i,body:h},s(i)});return()=>{q(),a()}},[d,e,s,l]);const g=c.useCallback(async u=>{const a=await(await F.DataClient.getInstance(d)).fetch(F.DataType.ContactMethod,{contactMethodId:u,guideId:o},{noCache:!0}),f=k.updateForm(a,{submit:"Submit",errors:{},meta:{groupId:m}});if(a.body=f,a.body.guideId=o,!b.current)return null;s(a)},[b]);return c.useEffect(()=>(g(n),()=>{b.current=!1}),[n,g]),e?j.jsx(B,{...e,body:{...e.body,form:e.body.form?{...e.body.form,data:(C=e.body.form)==null?void 0:C.data,layout:{...e.body.form.layout},meta:(v=e.body.form)==null?void 0:v.meta,schema:(w=e.body.form)==null?void 0:w.schema}:void 0,guideId:e.body.guideId},inline:!0,expanded:!0,dispatch:D,className:$.appendClassNames("humany-bot-contact-method",x)}):null},B=A(R.ContactMethod)`
2
+ padding: ${n=>{var o;return(o=n.theme.sizes)==null?void 0:o.normal}} ${n=>{var o;return(o=n.theme.sizes)==null?void 0:o.medium}};
3
+ `;exports.default=z;
@@ -0,0 +1,417 @@
1
+ var q = Object.defineProperty;
2
+ var F = (i, t, n) => t in i ? q(i, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : i[t] = n;
3
+ var v = (i, t, n) => (F(i, typeof t != "symbol" ? t + "" : t, n), n);
4
+ import { ConversationMessageListItemType as U, registerCustomMessageComponent as Q, ConversationPlatform as X } from "@telia-ace/widget-conversation";
5
+ import { readStorage as J, createStorageWriter as R, StorageCategory as D } from "@telia-ace/widget-services";
6
+ import { uuid as P, Logger as O } from "@telia-ace/widget-utilities";
7
+ import { FormBuilder as Y, submitButton as Z } from "@telia-ace/widget-forms";
8
+ class tt {
9
+ constructor(t) {
10
+ v(this, "enabled", !0);
11
+ // set whether or not to store data
12
+ v(this, "botProviderGlobalStateKey", "bot-provider-global-state");
13
+ v(this, "botProviderLocalStateKey", "bot-provider-local-state");
14
+ v(this, "botProviderEntriesKey", "bot-provider-entries");
15
+ v(this, "botProviderMetaStateKey", "bot-provider-conversation-meta");
16
+ this.container = t;
17
+ }
18
+ getKey(t) {
19
+ let n;
20
+ switch (t) {
21
+ case "localState":
22
+ n = this.botProviderLocalStateKey;
23
+ break;
24
+ case "globalState":
25
+ n = this.botProviderGlobalStateKey;
26
+ break;
27
+ case "entries":
28
+ n = this.botProviderEntriesKey;
29
+ break;
30
+ case "meta":
31
+ n = this.botProviderMetaStateKey;
32
+ break;
33
+ }
34
+ return n;
35
+ }
36
+ async read(t) {
37
+ const n = this.getKey(t);
38
+ if (!(!this.enabled || !n))
39
+ return J(this.container, n);
40
+ }
41
+ async write(t, n) {
42
+ const e = this.getKey(n);
43
+ if (!this.enabled || !e)
44
+ return;
45
+ (await R(
46
+ this.container,
47
+ e,
48
+ D.Necessary
49
+ ))(t);
50
+ }
51
+ }
52
+ var G = /* @__PURE__ */ ((i) => (i.ContactMethod = "ace-conversational-hub-contact-method", i))(G || {});
53
+ const et = ({
54
+ isUser: i,
55
+ items: t = [],
56
+ meta: n = {}
57
+ }) => {
58
+ const e = P();
59
+ return {
60
+ id: e,
61
+ isUser: i,
62
+ items: t.map((d) => ({
63
+ id: d.id || P(),
64
+ isUser: i,
65
+ groupId: e,
66
+ message: d.message || []
67
+ })),
68
+ meta: n
69
+ };
70
+ }, wt = (i, {
71
+ submit: t,
72
+ errors: n,
73
+ meta: e
74
+ }) => {
75
+ var a;
76
+ if ((a = i == null ? void 0 : i.body) != null && a.form) {
77
+ const { body: d } = i, g = new Y(d.form);
78
+ return d.form.layout.submit || g.createComponent(Z(t, "submit")), n && g.setValidationErrors(n), e && g.setMeta(e), {
79
+ ...d,
80
+ form: g.get()
81
+ };
82
+ }
83
+ return (i == null ? void 0 : i.body) || {};
84
+ }, nt = async (i, t, n) => {
85
+ (await (await i.getAsync("dataClient")).getClient()).parameters.set(t, n);
86
+ }, T = ({
87
+ messageId: i,
88
+ message: t,
89
+ group: n
90
+ }) => ({
91
+ id: i,
92
+ message: t,
93
+ groupId: n.id,
94
+ isUser: n.isUser
95
+ }), it = async (i, t, n) => {
96
+ const e = async (o, h, f = [], x) => {
97
+ var M, $;
98
+ const m = P();
99
+ switch (o.type !== "List" && o.tags.includes("guide") && (($ = (M = o.content.hints) == null ? void 0 : M[0]) != null && $.id) && await nt(
100
+ i,
101
+ "LastGuideId",
102
+ o.content.hints[0].id
103
+ ), o.type) {
104
+ case "Text": {
105
+ const S = [];
106
+ if (S.push(
107
+ T({
108
+ messageId: m,
109
+ message: [
110
+ U.HTML,
111
+ { body: o.content.html }
112
+ ],
113
+ group: h
114
+ })
115
+ ), f.length) {
116
+ f.find(
117
+ (y) => {
118
+ var k;
119
+ return y.type === "List" && ((k = y.localState) == null ? void 0 : k.$type) === "Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching";
120
+ }
121
+ );
122
+ const I = f.find(
123
+ (y) => y.tags.includes("contact") && y.type === "Contact"
124
+ );
125
+ I && S.push(
126
+ T({
127
+ messageId: m,
128
+ message: [
129
+ G.ContactMethod,
130
+ {
131
+ contactMethodId: I.content.id,
132
+ groupId: h.id,
133
+ guideId: I.content.guideId
134
+ }
135
+ ],
136
+ group: h
137
+ })
138
+ );
139
+ }
140
+ return S;
141
+ }
142
+ case "Contact":
143
+ return [
144
+ T({
145
+ messageId: m,
146
+ message: [
147
+ G.ContactMethod,
148
+ {
149
+ contactMethodId: o.content.id,
150
+ groupId: h.id,
151
+ guideId: o.content.guideId
152
+ }
153
+ ],
154
+ group: h
155
+ })
156
+ ];
157
+ case "Error":
158
+ return [
159
+ T({
160
+ messageId: m,
161
+ message: [
162
+ U.HTML,
163
+ {
164
+ body: o.content.message || "Something went wrong."
165
+ }
166
+ ],
167
+ group: h
168
+ })
169
+ ];
170
+ default:
171
+ return [];
172
+ }
173
+ }, a = /* @__PURE__ */ new Map([
174
+ ["Text", 1],
175
+ ["Contact", 2]
176
+ ]), d = [], g = t.sort((o, h) => {
177
+ const x = a.get(o.type) || 20, m = a.get(h.type) || 20;
178
+ return x - m;
179
+ }).filter((o) => !o.relation).reduce((o, h) => o.concat(h), []), E = (o) => typeof o.actions.selector < "u";
180
+ for (const o of g) {
181
+ const h = t.filter(
182
+ (m) => m.relation === o.id && !E(m)
183
+ ), f = et({ isUser: !1 });
184
+ (await e(o, f, h)).forEach((m) => {
185
+ f.items.push(m);
186
+ }), f.items.length && d.push(f);
187
+ }
188
+ return d;
189
+ };
190
+ class ot {
191
+ constructor(t, n, e, a) {
192
+ v(this, "globalState");
193
+ v(this, "localState");
194
+ v(this, "clientId");
195
+ v(this, "entries");
196
+ this.endpoint = t, this.events = n, this.store = e, this.container = a, this.clientId = P(), this.entries = [];
197
+ }
198
+ async fetchGuide(t) {
199
+ const n = {
200
+ command: { guide: { id: t } },
201
+ globalState: this.globalState,
202
+ clientId: this.clientId
203
+ };
204
+ return await this.postEnvelope(n);
205
+ }
206
+ async postEnvelope(t, n) {
207
+ try {
208
+ const e = await fetch(
209
+ this.endpoint,
210
+ this.getHttpOptions(t)
211
+ );
212
+ if (!e.ok)
213
+ throw e;
214
+ const a = await e.json();
215
+ return this.handleResponse(a, n);
216
+ } catch (e) {
217
+ process.env.NODE_ENV !== "production" && console.warn("Something went wrong when posting the envelope.");
218
+ let a = "Something went wrong";
219
+ return (e.message === "Failed to fetch" || e.message === "NetworkError when attempting to fetch resource.") && (a = "Lost connection... Please try again."), this.handleResponse({
220
+ entries: [
221
+ {
222
+ id: P(),
223
+ type: "Error",
224
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
225
+ content: {
226
+ message: a
227
+ },
228
+ actions: {},
229
+ tags: []
230
+ }
231
+ ]
232
+ });
233
+ }
234
+ }
235
+ async handleResponse(t, n) {
236
+ this.entries = this.entries.concat(t.entries), this.store.write(this.entries, "entries");
237
+ const e = t.entries.find((d) => d.type === "Widget");
238
+ return e && this.events.dispatch("provider:widget-entry", e.content), t.globalState && (this.globalState = t.globalState, this.store.write(t.globalState, "globalState")), this.localState = t.entries.reduce(
239
+ (d, g) => g.localState ? g.localState : d,
240
+ void 0
241
+ ), this.store.write(this.localState, "localState"), await it(
242
+ this.container,
243
+ t.entries
244
+ );
245
+ }
246
+ getHttpOptions(t) {
247
+ const n = {
248
+ method: "POST",
249
+ headers: {
250
+ Accept: "application/json",
251
+ "Content-Type": "application/json"
252
+ }
253
+ };
254
+ return t.funnel = this.container.get("$widget").name, t.localState = t.localState || this.localState, Object.assign({}, n, {
255
+ body: JSON.stringify(t),
256
+ credentials: "same-origin"
257
+ });
258
+ }
259
+ }
260
+ const st = "@telia-ace/conversational-hub-bot-provider", rt = "0.0.16", at = "./index.js", ct = "./index.d.ts", lt = {
261
+ ".": {
262
+ import: "./index.mjs",
263
+ require: "./index.js"
264
+ }
265
+ }, dt = {
266
+ "@telia-ace/widget-conversation": "*",
267
+ "@webprovisions/platform": "^1.1.4",
268
+ "@telia-ace/knowledge-widget-core": "*",
269
+ "@telia-ace/widget-utilities": "*",
270
+ "@telia-ace/widget-services": "*",
271
+ "@telia-ace/widget-core": "*",
272
+ "@telia-ace/knowledge-data-client": "*",
273
+ "@telia-ace/knowledge-widget-adapters": "*",
274
+ "@telia-ace/knowledge-widget-ui": "*",
275
+ "@telia-ace/widget-forms": "*"
276
+ }, ut = {
277
+ "@emotion/react": "11.11.1",
278
+ "@emotion/styled": "11.11.0",
279
+ react: "18.2.0"
280
+ }, C = {
281
+ name: st,
282
+ version: rt,
283
+ main: at,
284
+ types: ct,
285
+ exports: lt,
286
+ dependencies: dt,
287
+ peerDependencies: ut
288
+ }, bt = async (i) => {
289
+ var j, H, L, A, _;
290
+ const t = "chub-plugin", n = i.get("$widget"), e = (_ = (A = (L = (H = (j = n == null ? void 0 : n.container) == null ? void 0 : j.get("$settings")) == null ? void 0 : H.components) == null ? void 0 : L.conversation) == null ? void 0 : A.properties) == null ? void 0 : _.conversationalHubPluginSettings;
291
+ let a, d, g, E = (e == null ? void 0 : e.connectionAttempts) ?? 5, o, h, f;
292
+ O.info((C == null ? void 0 : C.name) + " version: " + (C == null ? void 0 : C.version)), Q(
293
+ i,
294
+ G.ContactMethod,
295
+ import("./contact-method-6b37504e.mjs")
296
+ );
297
+ const x = await R(
298
+ i,
299
+ "conversational-hub-session",
300
+ D.Necessary
301
+ ), m = (r, c) => {
302
+ const { knowledgeBotEndpoint: l } = c.properties();
303
+ if (l)
304
+ return `${l}/conversations`;
305
+ const { data: u } = r.get("$settings");
306
+ if (!u || !u.projection)
307
+ throw new Error("Missing Knowledge Bot endpoint");
308
+ return `${u.projection}/conversations`;
309
+ };
310
+ (await X.getInstance(
311
+ i
312
+ )).registerProvider(t, (r, c) => {
313
+ a = r, d = a.controller, g = a.createAgent({
314
+ name: e == null ? void 0 : e.botName,
315
+ avatar: e == null ? void 0 : e.avatar
316
+ }), f = m(i, c);
317
+ const { events: l } = i.get("$widget"), u = new tt(i);
318
+ h = new ot(f, l, u, i), $();
319
+ const p = () => d.providers.includes(t);
320
+ window.controller = d, c.actions.create("submit", (s) => {
321
+ const { events: b } = i.get("$widget");
322
+ b.dispatch("conversational-hub-provider:form-submitted", s);
323
+ }), c.actions.watch("conversation.action", (s, b) => (p() && S(s), b(s))), c.actions.watch("conversation.user-submit", (s, b) => {
324
+ if (!p())
325
+ return b(s);
326
+ I(s.text), a.user.print(
327
+ s.text.replace(/</g, "&lt;").replace(/>/g, "&gt;")
328
+ );
329
+ });
330
+ });
331
+ async function $(r = !0) {
332
+ const c = await J(
333
+ i,
334
+ "conversational-hub-session"
335
+ );
336
+ c != null && c.sessionId ? o = c == null ? void 0 : c.sessionId : await y(
337
+ e.baseUrl + "/initialize",
338
+ `{"extension": "${e.extension}"}`,
339
+ r
340
+ );
341
+ }
342
+ async function S(r) {
343
+ await y(
344
+ `${e.baseUrl}/input/${o}`,
345
+ `{"type":"button_click","language":"${e.language}","content":{"button_text":"${r.label}","value":"${r.actionKey}"}}`
346
+ );
347
+ }
348
+ async function I(r) {
349
+ const c = { text: r };
350
+ await y(
351
+ `${e.baseUrl}/input/${o}`,
352
+ `{"type":"text","language":"${e.language}","content":${JSON.stringify(c)}}`
353
+ );
354
+ }
355
+ async function y(r, c, l = !0) {
356
+ var b, K, V, B;
357
+ const u = a.loading();
358
+ let p, s;
359
+ try {
360
+ p = await fetch(r, {
361
+ method: "POST",
362
+ body: c
363
+ }), s = await (p == null ? void 0 : p.json());
364
+ } catch (N) {
365
+ N instanceof SyntaxError ? O.error("Incorrect JSON format.", N) : O.error("Network error: check connection or baseUrl.", N), u(), g.print(e.errorMessage);
366
+ return;
367
+ }
368
+ if (!(p != null && p.ok)) {
369
+ if (O.error(`HTTP ${p == null ? void 0 : p.status}.`, JSON.stringify(s)), u(), !!((b = s == null ? void 0 : s.errors) != null && b.filter(
370
+ (w) => w.code === "1003"
371
+ ).length) && E > 0) {
372
+ E--, await new Promise((W) => setTimeout(W, 500)), await $(!1);
373
+ const w = JSON.parse(c);
374
+ (K = w == null ? void 0 : w.content) != null && K.text ? await I(w.content.text) : (V = w == null ? void 0 : w.content) != null && V.action && await S((B = w == null ? void 0 : w.content) == null ? void 0 : B.action);
375
+ } else
376
+ g.print(e.errorMessage);
377
+ return;
378
+ }
379
+ u(), E = (e == null ? void 0 : e.connectionAttempts) ?? 5, s != null && s.action_payload && k(s.action_payload), o = s == null ? void 0 : s.session_id, x({ sessionId: o }), l && z(s);
380
+ }
381
+ async function k(r) {
382
+ var p;
383
+ const c = (p = r == null ? void 0 : r.transfer_parameters) == null ? void 0 : p.contactGuide, l = a.loading(), u = await h.fetchGuide(parseInt(c));
384
+ if (l(), u) {
385
+ const s = u.concat(u);
386
+ if (s.length) {
387
+ const b = s[0].items.map((K) => K.message);
388
+ g.print(b);
389
+ }
390
+ }
391
+ }
392
+ function z(r) {
393
+ var c;
394
+ r == null || r.agent_response.forEach((l) => {
395
+ g.print(l.payload.text);
396
+ }), (c = r == null ? void 0 : r.prompt) != null && c.items && g.print([
397
+ "button-list",
398
+ {
399
+ actions: r.prompt.items.map((l) => {
400
+ let u;
401
+ return l.type === "button" && (u = { actionKey: l.value, label: l.text }), l.type === "link" && (u = {
402
+ actionKey: l.value,
403
+ label: l.text,
404
+ data: {
405
+ href: l.url,
406
+ target: (e == null ? void 0 : e.linkTarget) ?? "_blank"
407
+ }
408
+ }), u;
409
+ })
410
+ }
411
+ ]);
412
+ }
413
+ };
414
+ export {
415
+ bt as C,
416
+ wt as u
417
+ };
@@ -0,0 +1 @@
1
+ "use strict";var D=Object.defineProperty;var F=(i,t,n)=>t in i?D(i,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):i[t]=n;var b=(i,t,n)=>(F(i,typeof t!="symbol"?t+"":t,n),n);const T=require("@telia-ace/widget-conversation"),x=require("@telia-ace/widget-services"),S=require("@telia-ace/widget-utilities"),B=require("@telia-ace/widget-forms");class W{constructor(t){b(this,"enabled",!0);b(this,"botProviderGlobalStateKey","bot-provider-global-state");b(this,"botProviderLocalStateKey","bot-provider-local-state");b(this,"botProviderEntriesKey","bot-provider-entries");b(this,"botProviderMetaStateKey","bot-provider-conversation-meta");this.container=t}getKey(t){let n;switch(t){case"localState":n=this.botProviderLocalStateKey;break;case"globalState":n=this.botProviderGlobalStateKey;break;case"entries":n=this.botProviderEntriesKey;break;case"meta":n=this.botProviderMetaStateKey;break}return n}async read(t){const n=this.getKey(t);if(!(!this.enabled||!n))return x.readStorage(this.container,n)}async write(t,n){const e=this.getKey(n);if(!this.enabled||!e)return;(await x.createStorageWriter(this.container,e,x.StorageCategory.Necessary))(t)}}var M=(i=>(i.ContactMethod="ace-conversational-hub-contact-method",i))(M||{});const z=({isUser:i,items:t=[],meta:n={}})=>{const e=S.uuid();return{id:e,isUser:i,items:t.map(d=>({id:d.id||S.uuid(),isUser:i,groupId:e,message:d.message||[]})),meta:n}},Q=(i,{submit:t,errors:n,meta:e})=>{var a;if((a=i==null?void 0:i.body)!=null&&a.form){const{body:d}=i,g=new B.FormBuilder(d.form);return d.form.layout.submit||g.createComponent(B.submitButton(t,"submit")),n&&g.setValidationErrors(n),e&&g.setMeta(e),{...d,form:g.get()}}return(i==null?void 0:i.body)||{}},X=async(i,t,n)=>{(await(await i.getAsync("dataClient")).getClient()).parameters.set(t,n)},O=({messageId:i,message:t,group:n})=>({id:i,message:t,groupId:n.id,isUser:n.isUser}),Y=async(i,t,n)=>{const e=async(o,h,f=[],$)=>{var G,k;const m=S.uuid();switch(o.type!=="List"&&o.tags.includes("guide")&&((k=(G=o.content.hints)==null?void 0:G[0])!=null&&k.id)&&await X(i,"LastGuideId",o.content.hints[0].id),o.type){case"Text":{const C=[];if(C.push(O({messageId:m,message:[T.ConversationMessageListItemType.HTML,{body:o.content.html}],group:h})),f.length){f.find(y=>{var K;return y.type==="List"&&((K=y.localState)==null?void 0:K.$type)==="Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching"});const I=f.find(y=>y.tags.includes("contact")&&y.type==="Contact");I&&C.push(O({messageId:m,message:[M.ContactMethod,{contactMethodId:I.content.id,groupId:h.id,guideId:I.content.guideId}],group:h}))}return C}case"Contact":return[O({messageId:m,message:[M.ContactMethod,{contactMethodId:o.content.id,groupId:h.id,guideId:o.content.guideId}],group:h})];case"Error":return[O({messageId:m,message:[T.ConversationMessageListItemType.HTML,{body:o.content.message||"Something went wrong."}],group:h})];default:return[]}},a=new Map([["Text",1],["Contact",2]]),d=[],g=t.sort((o,h)=>{const $=a.get(o.type)||20,m=a.get(h.type)||20;return $-m}).filter(o=>!o.relation).reduce((o,h)=>o.concat(h),[]),P=o=>typeof o.actions.selector<"u";for(const o of g){const h=t.filter(m=>m.relation===o.id&&!P(m)),f=z({isUser:!1});(await e(o,f,h)).forEach(m=>{f.items.push(m)}),f.items.length&&d.push(f)}return d};class Z{constructor(t,n,e,a){b(this,"globalState");b(this,"localState");b(this,"clientId");b(this,"entries");this.endpoint=t,this.events=n,this.store=e,this.container=a,this.clientId=S.uuid(),this.entries=[]}async fetchGuide(t){const n={command:{guide:{id:t}},globalState:this.globalState,clientId:this.clientId};return await this.postEnvelope(n)}async postEnvelope(t,n){try{const e=await fetch(this.endpoint,this.getHttpOptions(t));if(!e.ok)throw e;const a=await e.json();return this.handleResponse(a,n)}catch(e){process.env.NODE_ENV!=="production"&&console.warn("Something went wrong when posting the envelope.");let a="Something went wrong";return(e.message==="Failed to fetch"||e.message==="NetworkError when attempting to fetch resource.")&&(a="Lost connection... Please try again."),this.handleResponse({entries:[{id:S.uuid(),type:"Error",timestamp:new Date().toISOString(),content:{message:a},actions:{},tags:[]}]})}}async handleResponse(t,n){this.entries=this.entries.concat(t.entries),this.store.write(this.entries,"entries");const e=t.entries.find(d=>d.type==="Widget");return e&&this.events.dispatch("provider:widget-entry",e.content),t.globalState&&(this.globalState=t.globalState,this.store.write(t.globalState,"globalState")),this.localState=t.entries.reduce((d,g)=>g.localState?g.localState:d,void 0),this.store.write(this.localState,"localState"),await Y(this.container,t.entries)}getHttpOptions(t){const n={method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"}};return t.funnel=this.container.get("$widget").name,t.localState=t.localState||this.localState,Object.assign({},n,{body:JSON.stringify(t),credentials:"same-origin"})}}const tt="@telia-ace/conversational-hub-bot-provider",et="0.0.16",nt="./index.js",it="./index.d.ts",ot={".":{import:"./index.mjs",require:"./index.js"}},st={"@telia-ace/widget-conversation":"*","@webprovisions/platform":"^1.1.4","@telia-ace/knowledge-widget-core":"*","@telia-ace/widget-utilities":"*","@telia-ace/widget-services":"*","@telia-ace/widget-core":"*","@telia-ace/knowledge-data-client":"*","@telia-ace/knowledge-widget-adapters":"*","@telia-ace/knowledge-widget-ui":"*","@telia-ace/widget-forms":"*"},rt={"@emotion/react":"11.11.1","@emotion/styled":"11.11.0",react:"18.2.0"},E={name:tt,version:et,main:nt,types:it,exports:ot,dependencies:st,peerDependencies:rt},at=async i=>{var H,j,A,_,V;const t="chub-plugin",n=i.get("$widget"),e=(V=(_=(A=(j=(H=n==null?void 0:n.container)==null?void 0:H.get("$settings"))==null?void 0:j.components)==null?void 0:A.conversation)==null?void 0:_.properties)==null?void 0:V.conversationalHubPluginSettings;let a,d,g,P=(e==null?void 0:e.connectionAttempts)??5,o,h,f;S.Logger.info((E==null?void 0:E.name)+" version: "+(E==null?void 0:E.version)),T.registerCustomMessageComponent(i,M.ContactMethod,Promise.resolve().then(()=>require("./contact-method-cda1f273.js")));const $=await x.createStorageWriter(i,"conversational-hub-session",x.StorageCategory.Necessary),m=(r,c)=>{const{knowledgeBotEndpoint:l}=c.properties();if(l)return`${l}/conversations`;const{data:u}=r.get("$settings");if(!u||!u.projection)throw new Error("Missing Knowledge Bot endpoint");return`${u.projection}/conversations`};(await T.ConversationPlatform.getInstance(i)).registerProvider(t,(r,c)=>{a=r,d=a.controller,g=a.createAgent({name:e==null?void 0:e.botName,avatar:e==null?void 0:e.avatar}),f=m(i,c);const{events:l}=i.get("$widget"),u=new W(i);h=new Z(f,l,u,i),k();const p=()=>d.providers.includes(t);window.controller=d,c.actions.create("submit",s=>{const{events:v}=i.get("$widget");v.dispatch("conversational-hub-provider:form-submitted",s)}),c.actions.watch("conversation.action",(s,v)=>(p()&&C(s),v(s))),c.actions.watch("conversation.user-submit",(s,v)=>{if(!p())return v(s);I(s.text),a.user.print(s.text.replace(/</g,"&lt;").replace(/>/g,"&gt;"))})});async function k(r=!0){const c=await x.readStorage(i,"conversational-hub-session");c!=null&&c.sessionId?o=c==null?void 0:c.sessionId:await y(e.baseUrl+"/initialize",`{"extension": "${e.extension}"}`,r)}async function C(r){await y(`${e.baseUrl}/input/${o}`,`{"type":"button_click","language":"${e.language}","content":{"button_text":"${r.label}","value":"${r.actionKey}"}}`)}async function I(r){const c={text:r};await y(`${e.baseUrl}/input/${o}`,`{"type":"text","language":"${e.language}","content":${JSON.stringify(c)}}`)}async function y(r,c,l=!0){var v,L,U,q;const u=a.loading();let p,s;try{p=await fetch(r,{method:"POST",body:c}),s=await(p==null?void 0:p.json())}catch(N){N instanceof SyntaxError?S.Logger.error("Incorrect JSON format.",N):S.Logger.error("Network error: check connection or baseUrl.",N),u(),g.print(e.errorMessage);return}if(!(p!=null&&p.ok)){if(S.Logger.error(`HTTP ${p==null?void 0:p.status}.`,JSON.stringify(s)),u(),!!((v=s==null?void 0:s.errors)!=null&&v.filter(w=>w.code==="1003").length)&&P>0){P--,await new Promise(R=>setTimeout(R,500)),await k(!1);const w=JSON.parse(c);(L=w==null?void 0:w.content)!=null&&L.text?await I(w.content.text):(U=w==null?void 0:w.content)!=null&&U.action&&await C((q=w==null?void 0:w.content)==null?void 0:q.action)}else g.print(e.errorMessage);return}u(),P=(e==null?void 0:e.connectionAttempts)??5,s!=null&&s.action_payload&&K(s.action_payload),o=s==null?void 0:s.session_id,$({sessionId:o}),l&&J(s)}async function K(r){var p;const c=(p=r==null?void 0:r.transfer_parameters)==null?void 0:p.contactGuide,l=a.loading(),u=await h.fetchGuide(parseInt(c));if(l(),u){const s=u.concat(u);if(s.length){const v=s[0].items.map(L=>L.message);g.print(v)}}}function J(r){var c;r==null||r.agent_response.forEach(l=>{g.print(l.payload.text)}),(c=r==null?void 0:r.prompt)!=null&&c.items&&g.print(["button-list",{actions:r.prompt.items.map(l=>{let u;return l.type==="button"&&(u={actionKey:l.value,label:l.text}),l.type==="link"&&(u={actionKey:l.value,label:l.text,data:{href:l.url,target:(e==null?void 0:e.linkTarget)??"_blank"}}),u})}])}};exports.ConversationalHubPlugin=at;exports.updateForm=Q;
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-9dc8b716.js");require("react/jsx-runtime");require("react");require("react-dom");exports.ConversationalHubPlugin=e.ConversationalHubPlugin;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-f7510e09.js");require("@telia-ace/widget-conversation");require("@telia-ace/widget-services");require("@telia-ace/widget-utilities");require("@telia-ace/widget-forms");exports.ConversationalHubPlugin=e.ConversationalHubPlugin;
package/index.mjs CHANGED
@@ -1,7 +1,8 @@
1
- import { t as p } from "./index-1ea9093c.mjs";
2
- import "react/jsx-runtime";
3
- import "react";
4
- import "react-dom";
1
+ import { C as a } from "./index-e5b52381.mjs";
2
+ import "@telia-ace/widget-conversation";
3
+ import "@telia-ace/widget-services";
4
+ import "@telia-ace/widget-utilities";
5
+ import "@telia-ace/widget-forms";
5
6
  export {
6
- p as ConversationalHubPlugin
7
+ a as ConversationalHubPlugin
7
8
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telia-ace/conversational-hub-bot-provider",
3
- "version": "0.0.14",
3
+ "version": "0.0.16",
4
4
  "main": "./index.js",
5
5
  "types": "./index.d.ts",
6
6
  "exports": {
@@ -1,3 +1,9 @@
1
1
  import React from 'react';
2
- declare const ContactMethod: React.FC<any>;
2
+ type Props = {
3
+ contactMethodId: string;
4
+ groupId: string;
5
+ guideId?: string;
6
+ className?: string;
7
+ };
8
+ declare const ContactMethod: React.FC<Props>;
3
9
  export default ContactMethod;