@onedeskpro/chatbot-core 0.2.1 → 0.3.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/README.md +6 -2
- package/dist/index.cjs +254 -23
- package/dist/index.d.cts +110 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.iife.js +254 -23
- package/dist/index.js +1327 -433
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -6,16 +6,21 @@ var e = Object.defineProperty, t = (t, n) => {
|
|
|
6
6
|
enumerable: !0
|
|
7
7
|
});
|
|
8
8
|
return n || e(r, Symbol.toStringTag, { value: "Module" }), r;
|
|
9
|
-
}, n = 3e4;
|
|
10
|
-
function
|
|
9
|
+
}, n = 3e4, r = 12e4;
|
|
10
|
+
function i(e) {
|
|
11
11
|
return typeof e == "object" && !!e && typeof e.message == "string";
|
|
12
12
|
}
|
|
13
|
-
function
|
|
14
|
-
|
|
13
|
+
function a(e) {
|
|
14
|
+
if (typeof e != "object" || !e) return !1;
|
|
15
|
+
let t = e;
|
|
16
|
+
return typeof t.type == "string" && typeof t.url == "string" && typeof t.fileName == "string" && typeof t.size == "number";
|
|
17
|
+
}
|
|
18
|
+
function o(e) {
|
|
19
|
+
return e instanceof Error && "apiError" in e && "status" in e && typeof e.status == "number" && i(e.apiError);
|
|
15
20
|
}
|
|
16
|
-
var
|
|
21
|
+
var s = class {
|
|
17
22
|
constructor(e) {
|
|
18
|
-
this.baseUrl = e.baseUrl.replace(/\/$/, ""), this.apiKey = e.apiKey, this.timeoutMs = e.timeoutMs ?? 3e4;
|
|
23
|
+
this.baseUrl = e.baseUrl.replace(/\/$/, ""), this.apiKey = e.apiKey, this.timeoutMs = e.timeoutMs ?? 3e4, this.uploadTimeoutMs = e.uploadTimeoutMs ?? r;
|
|
19
24
|
}
|
|
20
25
|
fail(e, t, n, r) {
|
|
21
26
|
let i = {
|
|
@@ -30,40 +35,40 @@ var a = class {
|
|
|
30
35
|
status: t
|
|
31
36
|
});
|
|
32
37
|
}
|
|
33
|
-
async request(e, t, n,
|
|
34
|
-
let
|
|
35
|
-
if (
|
|
36
|
-
let
|
|
37
|
-
"Content-Type": "application/json",
|
|
38
|
+
async request(e, t, n, r, a, o = this.timeoutMs) {
|
|
39
|
+
let s = new URL(`${this.baseUrl}${t}`);
|
|
40
|
+
if (r) for (let [e, t] of Object.entries(r)) s.searchParams.set(e, t);
|
|
41
|
+
let c = typeof FormData < "u" && n instanceof FormData, l = {
|
|
42
|
+
...c ? {} : { "Content-Type": "application/json" },
|
|
38
43
|
"X-API-Key": this.apiKey,
|
|
39
44
|
...a
|
|
40
|
-
},
|
|
45
|
+
}, u = new AbortController(), d = setTimeout(() => u.abort(), o), f;
|
|
41
46
|
try {
|
|
42
|
-
|
|
47
|
+
f = await fetch(s.toString(), {
|
|
43
48
|
method: e,
|
|
44
|
-
headers:
|
|
45
|
-
signal:
|
|
46
|
-
...n === void 0 ? {} : { body: JSON.stringify(n) }
|
|
49
|
+
headers: l,
|
|
50
|
+
signal: u.signal,
|
|
51
|
+
...n === void 0 ? {} : { body: c ? n : JSON.stringify(n) }
|
|
47
52
|
});
|
|
48
53
|
} catch (e) {
|
|
49
|
-
|
|
54
|
+
u.signal.aborted && this.fail(`Request timed out after ${o}ms.`, 0, "TIMEOUT", t), this.fail(e instanceof Error ? e.message : "Network request failed.", 0, "NETWORK_ERROR", t);
|
|
50
55
|
} finally {
|
|
51
|
-
clearTimeout(
|
|
56
|
+
clearTimeout(d);
|
|
52
57
|
}
|
|
53
|
-
let
|
|
54
|
-
if (
|
|
55
|
-
|
|
58
|
+
let p = await f.text(), m = null;
|
|
59
|
+
if (p) try {
|
|
60
|
+
m = JSON.parse(p);
|
|
56
61
|
} catch {
|
|
57
|
-
|
|
62
|
+
m = null;
|
|
58
63
|
}
|
|
59
|
-
if (!
|
|
60
|
-
if (
|
|
61
|
-
apiError:
|
|
62
|
-
status:
|
|
64
|
+
if (!f.ok) {
|
|
65
|
+
if (i(m)) throw Object.assign(Error(m.message), {
|
|
66
|
+
apiError: m,
|
|
67
|
+
status: f.status
|
|
63
68
|
});
|
|
64
|
-
this.fail(`Request failed with status ${
|
|
69
|
+
this.fail(`Request failed with status ${f.status} ${f.statusText}`.trim(), f.status, "HTTP_ERROR", t);
|
|
65
70
|
}
|
|
66
|
-
return
|
|
71
|
+
return m === null && this.fail("The server returned an empty or malformed response.", f.status, "BAD_RESPONSE", t), m.data;
|
|
67
72
|
}
|
|
68
73
|
async identify(e) {
|
|
69
74
|
return this.request("POST", "/sdk/identify", e);
|
|
@@ -74,6 +79,12 @@ var a = class {
|
|
|
74
79
|
async sendMessage(e) {
|
|
75
80
|
return this.request("POST", "/sdk/chat", e);
|
|
76
81
|
}
|
|
82
|
+
async uploadAttachment(e, t) {
|
|
83
|
+
let n = new FormData();
|
|
84
|
+
n.append("file", e, e.name);
|
|
85
|
+
let r = await this.request("POST", "/sdk/upload", n, void 0, { "X-Visitor-Token": t }, this.uploadTimeoutMs);
|
|
86
|
+
return a(r) || this.fail("The server returned an unexpected upload response.", 200, "BAD_RESPONSE", "/sdk/upload"), r;
|
|
87
|
+
}
|
|
77
88
|
async fetchConfig() {
|
|
78
89
|
return this.request("GET", "/sdk/config");
|
|
79
90
|
}
|
|
@@ -83,7 +94,158 @@ var a = class {
|
|
|
83
94
|
async fetchTicketStatus(e) {
|
|
84
95
|
return this.request("GET", "/sdk/ticket-status", void 0, void 0, { "X-Visitor-Token": e });
|
|
85
96
|
}
|
|
86
|
-
},
|
|
97
|
+
}, c = "https://api.onedeskpro.com", l = 10485760, u = 10;
|
|
98
|
+
//#endregion
|
|
99
|
+
//#region src/attachments.ts
|
|
100
|
+
function d(e) {
|
|
101
|
+
if (e.length > 10) return "You can send up to 10 files at a time.";
|
|
102
|
+
let t = e.find((e) => e.size > l);
|
|
103
|
+
if (t) {
|
|
104
|
+
let e = Math.round(l / 1048576);
|
|
105
|
+
return `"${t.name || "This file"}" is larger than ${e} MB.`;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
function f(e) {
|
|
110
|
+
return /^(https?:\/\/|blob:)/i.test(e);
|
|
111
|
+
}
|
|
112
|
+
function p(e) {
|
|
113
|
+
return typeof URL > "u" || typeof URL.createObjectURL != "function" ? "" : URL.createObjectURL(e);
|
|
114
|
+
}
|
|
115
|
+
function m(e) {
|
|
116
|
+
e.startsWith("blob:") && typeof URL < "u" && typeof URL.revokeObjectURL == "function" && URL.revokeObjectURL(e);
|
|
117
|
+
}
|
|
118
|
+
function ee(e) {
|
|
119
|
+
return {
|
|
120
|
+
type: e.type || "application/octet-stream",
|
|
121
|
+
url: p(e),
|
|
122
|
+
fileName: e.name || "attachment",
|
|
123
|
+
size: e.size
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function te(e) {
|
|
127
|
+
return !Number.isFinite(e) || e < 0 ? "" : e < 1024 ? `${e} B` : e < 1048576 ? `${(e / 1024).toFixed(+(e < 10240))} KB` : `${(e / 1048576).toFixed(1)} MB`;
|
|
128
|
+
}
|
|
129
|
+
function ne(e) {
|
|
130
|
+
if (!e || typeof e != "object") return [];
|
|
131
|
+
let t = e, n = t.attachments;
|
|
132
|
+
if (!Array.isArray(n) && t.message && typeof t.message == "object" && (n = t.message.attachments), !Array.isArray(n)) return [];
|
|
133
|
+
let r = [];
|
|
134
|
+
for (let e of n) {
|
|
135
|
+
if (!e || typeof e != "object") continue;
|
|
136
|
+
let t = e;
|
|
137
|
+
typeof t.url == "string" && /^https?:\/\//i.test(t.url) && r.push({
|
|
138
|
+
type: typeof t.type == "string" && t.type ? t.type : "application/octet-stream",
|
|
139
|
+
url: t.url,
|
|
140
|
+
fileName: typeof t.fileName == "string" && t.fileName ? t.fileName : "attachment",
|
|
141
|
+
size: typeof t.size == "number" && t.size >= 0 ? t.size : 0,
|
|
142
|
+
...typeof t.durationSeconds == "number" ? { durationSeconds: t.durationSeconds } : {}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return r;
|
|
146
|
+
}
|
|
147
|
+
function re(e, t) {
|
|
148
|
+
let n = e.trim();
|
|
149
|
+
return n ? t.length === 0 ? !1 : t.some((e) => e.fileName === n) || /^\d+ files?$/.test(n) ? !0 : [
|
|
150
|
+
"Image",
|
|
151
|
+
"Video",
|
|
152
|
+
"Audio",
|
|
153
|
+
"Attachment"
|
|
154
|
+
].includes(n) : !0;
|
|
155
|
+
}
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/audio.ts
|
|
158
|
+
var h = 16e3;
|
|
159
|
+
function g(e) {
|
|
160
|
+
return (e ?? "").split(";")[0].trim().toLowerCase() || "audio/webm";
|
|
161
|
+
}
|
|
162
|
+
function ie(e) {
|
|
163
|
+
return e.includes("mpeg") || e.includes("mp3") ? "mp3" : e.includes("wav") ? "wav" : e.includes("mp4") || e.includes("m4a") ? "m4a" : e.includes("ogg") ? "ogg" : "webm";
|
|
164
|
+
}
|
|
165
|
+
function _(e) {
|
|
166
|
+
if (!Number.isFinite(e) || e < 0) return "0:00";
|
|
167
|
+
let t = Math.floor(e), n = Math.floor(t / 60), r = t % 60;
|
|
168
|
+
return `${n}:${String(r).padStart(2, "0")}`;
|
|
169
|
+
}
|
|
170
|
+
function ae() {
|
|
171
|
+
if (typeof window > "u") return null;
|
|
172
|
+
let e = window;
|
|
173
|
+
return e.AudioContext ?? e.webkitAudioContext ?? null;
|
|
174
|
+
}
|
|
175
|
+
function oe() {
|
|
176
|
+
if (typeof window > "u") return null;
|
|
177
|
+
let e = window;
|
|
178
|
+
return e.OfflineAudioContext ?? e.webkitOfflineAudioContext ?? null;
|
|
179
|
+
}
|
|
180
|
+
async function se(e) {
|
|
181
|
+
let t = ae();
|
|
182
|
+
if (!t) return null;
|
|
183
|
+
let n = new t();
|
|
184
|
+
try {
|
|
185
|
+
let t = await e.arrayBuffer();
|
|
186
|
+
return await n.decodeAudioData(t.slice(0));
|
|
187
|
+
} catch {
|
|
188
|
+
return null;
|
|
189
|
+
} finally {
|
|
190
|
+
await n.close().catch(() => void 0);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
async function ce(e) {
|
|
194
|
+
let t = oe();
|
|
195
|
+
if (t) try {
|
|
196
|
+
let n = new t(1, Math.max(1, Math.ceil(e.duration * h)), h), r = n.createBufferSource();
|
|
197
|
+
return r.buffer = e, r.connect(n.destination), r.start(0), {
|
|
198
|
+
samples: (await n.startRendering()).getChannelData(0),
|
|
199
|
+
sampleRate: h
|
|
200
|
+
};
|
|
201
|
+
} catch {}
|
|
202
|
+
return {
|
|
203
|
+
samples: e.getChannelData(0),
|
|
204
|
+
sampleRate: e.sampleRate
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function le(e, t) {
|
|
208
|
+
let n = e.length * 2, r = new ArrayBuffer(44 + n), i = new DataView(r), a = (e, t) => {
|
|
209
|
+
for (let n = 0; n < t.length; n++) i.setUint8(e + n, t.charCodeAt(n));
|
|
210
|
+
};
|
|
211
|
+
a(0, "RIFF"), i.setUint32(4, 36 + n, !0), a(8, "WAVE"), a(12, "fmt "), i.setUint32(16, 16, !0), i.setUint16(20, 1, !0), i.setUint16(22, 1, !0), i.setUint32(24, t, !0), i.setUint32(28, t * 2, !0), i.setUint16(32, 2, !0), i.setUint16(34, 16, !0), a(36, "data"), i.setUint32(40, n, !0);
|
|
212
|
+
let o = 44;
|
|
213
|
+
for (let t = 0; t < e.length; t++) {
|
|
214
|
+
let n = Math.max(-1, Math.min(1, e[t] ?? 0));
|
|
215
|
+
i.setInt16(o, Math.round(n < 0 ? n * 32768 : n * 32767), !0), o += 2;
|
|
216
|
+
}
|
|
217
|
+
return new Blob([r], { type: "audio/wav" });
|
|
218
|
+
}
|
|
219
|
+
function ue(e, t = 48) {
|
|
220
|
+
if (e.length === 0) return [];
|
|
221
|
+
let n = Math.max(1, Math.floor(e.length / t)), r = [], i = 0;
|
|
222
|
+
for (let a = 0; a < t; a++) {
|
|
223
|
+
let t = a * n, o = Math.min(t + n, e.length), s = 0;
|
|
224
|
+
for (let n = t; n < o; n++) {
|
|
225
|
+
let t = e[n] ?? 0;
|
|
226
|
+
s += t * t;
|
|
227
|
+
}
|
|
228
|
+
let c = o > t ? Math.sqrt(s / (o - t)) : 0;
|
|
229
|
+
r.push(c), c > i && (i = c);
|
|
230
|
+
}
|
|
231
|
+
return r.map((e) => i > 0 ? Math.max(8, Math.min(100, Math.round(e / i * 100))) : 8);
|
|
232
|
+
}
|
|
233
|
+
async function de(e) {
|
|
234
|
+
let t = Date.now(), n = Math.max(1, Math.round(e.durationSeconds || 1)), r = g(e.mimeType ?? e.blob.type), i = await se(e.blob);
|
|
235
|
+
if (!i) return {
|
|
236
|
+
file: new File([e.blob], `voice-message-${t}.${ie(r)}`, { type: r }),
|
|
237
|
+
durationSeconds: n
|
|
238
|
+
};
|
|
239
|
+
let { samples: a, sampleRate: o } = await ce(i);
|
|
240
|
+
return {
|
|
241
|
+
file: new File([le(a, o)], `voice-message-${t}.wav`, { type: "audio/wav" }),
|
|
242
|
+
durationSeconds: Math.max(1, Math.round(i.duration || n)),
|
|
243
|
+
waveform: ue(a)
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/event-emitter.ts
|
|
248
|
+
var fe = class {
|
|
87
249
|
constructor() {
|
|
88
250
|
this._listeners = {};
|
|
89
251
|
}
|
|
@@ -101,82 +263,82 @@ var a = class {
|
|
|
101
263
|
removeAllListeners() {
|
|
102
264
|
for (let e of Object.keys(this._listeners)) delete this._listeners[e];
|
|
103
265
|
}
|
|
104
|
-
},
|
|
105
|
-
|
|
106
|
-
var
|
|
107
|
-
Object.keys(
|
|
108
|
-
|
|
266
|
+
}, v = Object.create(null);
|
|
267
|
+
v.open = "0", v.close = "1", v.ping = "2", v.pong = "3", v.message = "4", v.upgrade = "5", v.noop = "6";
|
|
268
|
+
var y = Object.create(null);
|
|
269
|
+
Object.keys(v).forEach((e) => {
|
|
270
|
+
y[v[e]] = e;
|
|
109
271
|
});
|
|
110
|
-
var
|
|
272
|
+
var b = {
|
|
111
273
|
type: "error",
|
|
112
274
|
data: "parser error"
|
|
113
|
-
},
|
|
275
|
+
}, pe = typeof Blob == "function" || typeof Blob < "u" && Object.prototype.toString.call(Blob) === "[object BlobConstructor]", me = typeof ArrayBuffer == "function", he = (e) => typeof ArrayBuffer.isView == "function" ? ArrayBuffer.isView(e) : e && e.buffer instanceof ArrayBuffer, x = ({ type: e, data: t }, n, r) => pe && t instanceof Blob ? n ? r(t) : ge(t, r) : me && (t instanceof ArrayBuffer || he(t)) ? n ? r(t) : ge(new Blob([t]), r) : r(v[e] + (t || "")), ge = (e, t) => {
|
|
114
276
|
let n = new FileReader();
|
|
115
277
|
return n.onload = function() {
|
|
116
278
|
let e = n.result.split(",")[1];
|
|
117
279
|
t("b" + (e || ""));
|
|
118
280
|
}, n.readAsDataURL(e);
|
|
119
281
|
};
|
|
120
|
-
function
|
|
282
|
+
function _e(e) {
|
|
121
283
|
return e instanceof Uint8Array ? e : e instanceof ArrayBuffer ? new Uint8Array(e) : new Uint8Array(e.buffer, e.byteOffset, e.byteLength);
|
|
122
284
|
}
|
|
123
|
-
var
|
|
124
|
-
function
|
|
125
|
-
if (
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
285
|
+
var ve;
|
|
286
|
+
function ye(e, t) {
|
|
287
|
+
if (pe && e.data instanceof Blob) return e.data.arrayBuffer().then(_e).then(t);
|
|
288
|
+
if (me && (e.data instanceof ArrayBuffer || he(e.data))) return t(_e(e.data));
|
|
289
|
+
x(e, !1, (e) => {
|
|
290
|
+
ve ||= new TextEncoder(), t(ve.encode(e));
|
|
129
291
|
});
|
|
130
292
|
}
|
|
131
293
|
//#endregion
|
|
132
294
|
//#region ../../node_modules/.pnpm/engine.io-parser@5.2.3/node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js
|
|
133
|
-
var
|
|
134
|
-
for (let e = 0; e < 64; e++)
|
|
135
|
-
var
|
|
295
|
+
var be = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", S = typeof Uint8Array > "u" ? [] : /* @__PURE__ */ new Uint8Array(256);
|
|
296
|
+
for (let e = 0; e < 64; e++) S[be.charCodeAt(e)] = e;
|
|
297
|
+
var xe = (e) => {
|
|
136
298
|
let t = e.length * .75, n = e.length, r, i = 0, a, o, s, c;
|
|
137
299
|
e[e.length - 1] === "=" && (t--, e[e.length - 2] === "=" && t--);
|
|
138
300
|
let l = new ArrayBuffer(t), u = new Uint8Array(l);
|
|
139
|
-
for (r = 0; r < n; r += 4) a =
|
|
301
|
+
for (r = 0; r < n; r += 4) a = S[e.charCodeAt(r)], o = S[e.charCodeAt(r + 1)], s = S[e.charCodeAt(r + 2)], c = S[e.charCodeAt(r + 3)], u[i++] = a << 2 | o >> 4, u[i++] = (o & 15) << 4 | s >> 2, u[i++] = (s & 3) << 6 | c & 63;
|
|
140
302
|
return l;
|
|
141
|
-
},
|
|
303
|
+
}, Se = typeof ArrayBuffer == "function", C = (e, t) => {
|
|
142
304
|
if (typeof e != "string") return {
|
|
143
305
|
type: "message",
|
|
144
|
-
data:
|
|
306
|
+
data: we(e, t)
|
|
145
307
|
};
|
|
146
308
|
let n = e.charAt(0);
|
|
147
309
|
return n === "b" ? {
|
|
148
310
|
type: "message",
|
|
149
|
-
data:
|
|
150
|
-
} :
|
|
151
|
-
type:
|
|
311
|
+
data: Ce(e.substring(1), t)
|
|
312
|
+
} : y[n] ? e.length > 1 ? {
|
|
313
|
+
type: y[n],
|
|
152
314
|
data: e.substring(1)
|
|
153
|
-
} : { type:
|
|
154
|
-
},
|
|
315
|
+
} : { type: y[n] } : b;
|
|
316
|
+
}, Ce = (e, t) => Se ? we(xe(e), t) : {
|
|
155
317
|
base64: !0,
|
|
156
318
|
data: e
|
|
157
|
-
},
|
|
319
|
+
}, we = (e, t) => {
|
|
158
320
|
switch (t) {
|
|
159
321
|
case "blob": return e instanceof Blob ? e : new Blob([e]);
|
|
160
322
|
default: return e instanceof ArrayBuffer ? e : e.buffer;
|
|
161
323
|
}
|
|
162
|
-
},
|
|
324
|
+
}, Te = "", Ee = (e, t) => {
|
|
163
325
|
let n = e.length, r = Array(n), i = 0;
|
|
164
326
|
e.forEach((e, a) => {
|
|
165
|
-
|
|
166
|
-
r[a] = e, ++i === n && t(r.join(
|
|
327
|
+
x(e, !1, (e) => {
|
|
328
|
+
r[a] = e, ++i === n && t(r.join(Te));
|
|
167
329
|
});
|
|
168
330
|
});
|
|
169
|
-
},
|
|
170
|
-
let n = e.split(
|
|
331
|
+
}, De = (e, t) => {
|
|
332
|
+
let n = e.split(Te), r = [];
|
|
171
333
|
for (let e = 0; e < n.length; e++) {
|
|
172
|
-
let i =
|
|
334
|
+
let i = C(n[e], t);
|
|
173
335
|
if (r.push(i), i.type === "error") break;
|
|
174
336
|
}
|
|
175
337
|
return r;
|
|
176
338
|
};
|
|
177
|
-
function
|
|
339
|
+
function Oe() {
|
|
178
340
|
return new TransformStream({ transform(e, t) {
|
|
179
|
-
|
|
341
|
+
ye(e, (n) => {
|
|
180
342
|
let r = n.length, i;
|
|
181
343
|
if (r < 126) i = /* @__PURE__ */ new Uint8Array(1), new DataView(i.buffer).setUint8(0, r);
|
|
182
344
|
else if (r < 65536) {
|
|
@@ -192,44 +354,44 @@ function le() {
|
|
|
192
354
|
});
|
|
193
355
|
} });
|
|
194
356
|
}
|
|
195
|
-
var
|
|
196
|
-
function
|
|
357
|
+
var ke;
|
|
358
|
+
function w(e) {
|
|
197
359
|
return e.reduce((e, t) => e + t.length, 0);
|
|
198
360
|
}
|
|
199
|
-
function
|
|
361
|
+
function T(e, t) {
|
|
200
362
|
if (e[0].length === t) return e.shift();
|
|
201
363
|
let n = new Uint8Array(t), r = 0;
|
|
202
364
|
for (let i = 0; i < t; i++) n[i] = e[0][r++], r === e[0].length && (e.shift(), r = 0);
|
|
203
365
|
return e.length && r < e[0].length && (e[0] = e[0].slice(r)), n;
|
|
204
366
|
}
|
|
205
|
-
function
|
|
206
|
-
|
|
367
|
+
function Ae(e, t) {
|
|
368
|
+
ke ||= new TextDecoder();
|
|
207
369
|
let n = [], r = 0, i = -1, a = !1;
|
|
208
370
|
return new TransformStream({ transform(o, s) {
|
|
209
371
|
for (n.push(o);;) {
|
|
210
372
|
if (r === 0) {
|
|
211
|
-
if (
|
|
212
|
-
let e =
|
|
373
|
+
if (w(n) < 1) break;
|
|
374
|
+
let e = T(n, 1);
|
|
213
375
|
a = (e[0] & 128) == 128, i = e[0] & 127, r = i < 126 ? 3 : i === 126 ? 1 : 2;
|
|
214
376
|
} else if (r === 1) {
|
|
215
|
-
if (
|
|
216
|
-
let e =
|
|
377
|
+
if (w(n) < 2) break;
|
|
378
|
+
let e = T(n, 2);
|
|
217
379
|
i = new DataView(e.buffer, e.byteOffset, e.length).getUint16(0), r = 3;
|
|
218
380
|
} else if (r === 2) {
|
|
219
|
-
if (
|
|
220
|
-
let e =
|
|
381
|
+
if (w(n) < 8) break;
|
|
382
|
+
let e = T(n, 8), t = new DataView(e.buffer, e.byteOffset, e.length), a = t.getUint32(0);
|
|
221
383
|
if (a > 2 ** 21 - 1) {
|
|
222
|
-
s.enqueue(
|
|
384
|
+
s.enqueue(b);
|
|
223
385
|
break;
|
|
224
386
|
}
|
|
225
387
|
i = a * 2 ** 32 + t.getUint32(4), r = 3;
|
|
226
388
|
} else {
|
|
227
|
-
if (
|
|
228
|
-
let e =
|
|
229
|
-
s.enqueue(
|
|
389
|
+
if (w(n) < i) break;
|
|
390
|
+
let e = T(n, i);
|
|
391
|
+
s.enqueue(C(a ? e : ke.decode(e), t)), r = 0;
|
|
230
392
|
}
|
|
231
393
|
if (i === 0 || i > e) {
|
|
232
|
-
s.enqueue(
|
|
394
|
+
s.enqueue(b);
|
|
233
395
|
break;
|
|
234
396
|
}
|
|
235
397
|
}
|
|
@@ -237,21 +399,21 @@ function de(e, t) {
|
|
|
237
399
|
}
|
|
238
400
|
//#endregion
|
|
239
401
|
//#region ../../node_modules/.pnpm/@socket.io+component-emitter@3.1.2/node_modules/@socket.io/component-emitter/lib/esm/index.js
|
|
240
|
-
function
|
|
241
|
-
if (e) return
|
|
402
|
+
function E(e) {
|
|
403
|
+
if (e) return je(e);
|
|
242
404
|
}
|
|
243
|
-
function
|
|
244
|
-
for (var t in
|
|
405
|
+
function je(e) {
|
|
406
|
+
for (var t in E.prototype) e[t] = E.prototype[t];
|
|
245
407
|
return e;
|
|
246
408
|
}
|
|
247
|
-
|
|
409
|
+
E.prototype.on = E.prototype.addEventListener = function(e, t) {
|
|
248
410
|
return this._callbacks = this._callbacks || {}, (this._callbacks["$" + e] = this._callbacks["$" + e] || []).push(t), this;
|
|
249
|
-
},
|
|
411
|
+
}, E.prototype.once = function(e, t) {
|
|
250
412
|
function n() {
|
|
251
413
|
this.off(e, n), t.apply(this, arguments);
|
|
252
414
|
}
|
|
253
415
|
return n.fn = t, this.on(e, n), this;
|
|
254
|
-
},
|
|
416
|
+
}, E.prototype.off = E.prototype.removeListener = E.prototype.removeAllListeners = E.prototype.removeEventListener = function(e, t) {
|
|
255
417
|
if (this._callbacks = this._callbacks || {}, arguments.length == 0) return this._callbacks = {}, this;
|
|
256
418
|
var n = this._callbacks["$" + e];
|
|
257
419
|
if (!n) return this;
|
|
@@ -261,7 +423,7 @@ S.prototype.on = S.prototype.addEventListener = function(e, t) {
|
|
|
261
423
|
break;
|
|
262
424
|
}
|
|
263
425
|
return n.length === 0 && delete this._callbacks["$" + e], this;
|
|
264
|
-
},
|
|
426
|
+
}, E.prototype.emit = function(e) {
|
|
265
427
|
this._callbacks = this._callbacks || {};
|
|
266
428
|
for (var t = Array(arguments.length - 1), n = this._callbacks["$" + e], r = 1; r < arguments.length; r++) t[r - 1] = arguments[r];
|
|
267
429
|
if (n) {
|
|
@@ -269,43 +431,43 @@ S.prototype.on = S.prototype.addEventListener = function(e, t) {
|
|
|
269
431
|
for (var r = 0, i = n.length; r < i; ++r) n[r].apply(this, t);
|
|
270
432
|
}
|
|
271
433
|
return this;
|
|
272
|
-
},
|
|
434
|
+
}, E.prototype.emitReserved = E.prototype.emit, E.prototype.listeners = function(e) {
|
|
273
435
|
return this._callbacks = this._callbacks || {}, this._callbacks["$" + e] || [];
|
|
274
|
-
},
|
|
436
|
+
}, E.prototype.hasListeners = function(e) {
|
|
275
437
|
return !!this.listeners(e).length;
|
|
276
438
|
};
|
|
277
439
|
//#endregion
|
|
278
440
|
//#region ../../node_modules/.pnpm/engine.io-client@6.6.6_supports-color@8.1.1/node_modules/engine.io-client/build/esm/globals.js
|
|
279
|
-
var
|
|
441
|
+
var D = typeof Promise == "function" && typeof Promise.resolve == "function" ? (e) => Promise.resolve().then(e) : (e, t) => t(e, 0), O = typeof self < "u" ? self : typeof window < "u" ? window : Function("return this")(), Me = "arraybuffer";
|
|
280
442
|
//#endregion
|
|
281
443
|
//#region ../../node_modules/.pnpm/engine.io-client@6.6.6_supports-color@8.1.1/node_modules/engine.io-client/build/esm/util.js
|
|
282
|
-
function
|
|
444
|
+
function Ne(e, ...t) {
|
|
283
445
|
return t.reduce((t, n) => (e.hasOwnProperty(n) && (t[n] = e[n]), t), {});
|
|
284
446
|
}
|
|
285
|
-
var
|
|
286
|
-
function
|
|
287
|
-
t.useNativeTimers ? (e.setTimeoutFn =
|
|
447
|
+
var Pe = O.setTimeout, Fe = O.clearTimeout;
|
|
448
|
+
function k(e, t) {
|
|
449
|
+
t.useNativeTimers ? (e.setTimeoutFn = Pe.bind(O), e.clearTimeoutFn = Fe.bind(O)) : (e.setTimeoutFn = O.setTimeout.bind(O), e.clearTimeoutFn = O.clearTimeout.bind(O));
|
|
288
450
|
}
|
|
289
|
-
var
|
|
290
|
-
function
|
|
291
|
-
return typeof e == "string" ?
|
|
451
|
+
var Ie = 1.33;
|
|
452
|
+
function Le(e) {
|
|
453
|
+
return typeof e == "string" ? Re(e) : Math.ceil((e.byteLength || e.size) * Ie);
|
|
292
454
|
}
|
|
293
|
-
function
|
|
455
|
+
function Re(e) {
|
|
294
456
|
let t = 0, n = 0;
|
|
295
457
|
for (let r = 0, i = e.length; r < i; r++) t = e.charCodeAt(r), t < 128 ? n += 1 : t < 2048 ? n += 2 : t < 55296 || t >= 57344 ? n += 3 : (r++, n += 4);
|
|
296
458
|
return n;
|
|
297
459
|
}
|
|
298
|
-
function
|
|
460
|
+
function ze() {
|
|
299
461
|
return Date.now().toString(36).substring(3) + Math.random().toString(36).substring(2, 5);
|
|
300
462
|
}
|
|
301
463
|
//#endregion
|
|
302
464
|
//#region ../../node_modules/.pnpm/engine.io-client@6.6.6_supports-color@8.1.1/node_modules/engine.io-client/build/esm/contrib/parseqs.js
|
|
303
|
-
function
|
|
465
|
+
function Be(e) {
|
|
304
466
|
let t = "";
|
|
305
467
|
for (let n in e) e.hasOwnProperty(n) && (t.length && (t += "&"), t += encodeURIComponent(n) + "=" + encodeURIComponent(e[n]));
|
|
306
468
|
return t;
|
|
307
469
|
}
|
|
308
|
-
function
|
|
470
|
+
function Ve(e) {
|
|
309
471
|
let t = {}, n = e.split("&");
|
|
310
472
|
for (let e = 0, r = n.length; e < r; e++) {
|
|
311
473
|
let r = n[e].split("=");
|
|
@@ -315,16 +477,16 @@ function Se(e) {
|
|
|
315
477
|
}
|
|
316
478
|
//#endregion
|
|
317
479
|
//#region ../../node_modules/.pnpm/engine.io-client@6.6.6_supports-color@8.1.1/node_modules/engine.io-client/build/esm/transport.js
|
|
318
|
-
var
|
|
480
|
+
var He = class extends Error {
|
|
319
481
|
constructor(e, t, n) {
|
|
320
482
|
super(e), this.description = t, this.context = n, this.type = "TransportError";
|
|
321
483
|
}
|
|
322
|
-
},
|
|
484
|
+
}, A = class extends E {
|
|
323
485
|
constructor(e) {
|
|
324
|
-
super(), this.writable = !1,
|
|
486
|
+
super(), this.writable = !1, k(this, e), this.opts = e, this.query = e.query, this.socket = e.socket, this.supportsBinary = !e.forceBase64;
|
|
325
487
|
}
|
|
326
488
|
onError(e, t, n) {
|
|
327
|
-
return super.emitReserved("error", new
|
|
489
|
+
return super.emitReserved("error", new He(e, t, n)), this;
|
|
328
490
|
}
|
|
329
491
|
open() {
|
|
330
492
|
return this.readyState = "opening", this.doOpen(), this;
|
|
@@ -339,7 +501,7 @@ var Ce = class extends Error {
|
|
|
339
501
|
this.readyState = "open", this.writable = !0, super.emitReserved("open");
|
|
340
502
|
}
|
|
341
503
|
onData(e) {
|
|
342
|
-
let t =
|
|
504
|
+
let t = C(e, this.socket.binaryType);
|
|
343
505
|
this.onPacket(t);
|
|
344
506
|
}
|
|
345
507
|
onPacket(e) {
|
|
@@ -360,10 +522,10 @@ var Ce = class extends Error {
|
|
|
360
522
|
return this.opts.port && (this.opts.secure && Number(this.opts.port) !== 443 || !this.opts.secure && Number(this.opts.port) !== 80) ? ":" + this.opts.port : "";
|
|
361
523
|
}
|
|
362
524
|
_query(e) {
|
|
363
|
-
let t =
|
|
525
|
+
let t = Be(e);
|
|
364
526
|
return t.length ? "?" + t : "";
|
|
365
527
|
}
|
|
366
|
-
},
|
|
528
|
+
}, Ue = class extends A {
|
|
367
529
|
constructor() {
|
|
368
530
|
super(...arguments), this._polling = !1;
|
|
369
531
|
}
|
|
@@ -391,7 +553,7 @@ var Ce = class extends Error {
|
|
|
391
553
|
this._polling = !0, this.doPoll(), this.emitReserved("poll");
|
|
392
554
|
}
|
|
393
555
|
onData(e) {
|
|
394
|
-
|
|
556
|
+
De(e, this.socket.binaryType).forEach((e) => {
|
|
395
557
|
if (this.readyState === "opening" && e.type === "open" && this.onOpen(), e.type === "close") return this.onClose({ description: "transport closed by the server" }), !1;
|
|
396
558
|
this.onPacket(e);
|
|
397
559
|
}), this.readyState !== "closed" && (this._polling = !1, this.emitReserved("pollComplete"), this.readyState === "open" && this._poll());
|
|
@@ -403,7 +565,7 @@ var Ce = class extends Error {
|
|
|
403
565
|
this.readyState === "open" ? e() : this.once("open", e);
|
|
404
566
|
}
|
|
405
567
|
write(e) {
|
|
406
|
-
this.writable = !1,
|
|
568
|
+
this.writable = !1, Ee(e, (e) => {
|
|
407
569
|
this.doWrite(e, () => {
|
|
408
570
|
this.writable = !0, this.emitReserved("drain");
|
|
409
571
|
});
|
|
@@ -411,17 +573,17 @@ var Ce = class extends Error {
|
|
|
411
573
|
}
|
|
412
574
|
uri() {
|
|
413
575
|
let e = this.opts.secure ? "https" : "http", t = this.query || {};
|
|
414
|
-
return !1 !== this.opts.timestampRequests && (t[this.opts.timestampParam] =
|
|
576
|
+
return !1 !== this.opts.timestampRequests && (t[this.opts.timestampParam] = ze()), !this.supportsBinary && !t.sid && (t.b64 = 1), this.createUri(e, t);
|
|
415
577
|
}
|
|
416
|
-
},
|
|
578
|
+
}, We = !1;
|
|
417
579
|
try {
|
|
418
|
-
|
|
580
|
+
We = typeof XMLHttpRequest < "u" && "withCredentials" in new XMLHttpRequest();
|
|
419
581
|
} catch {}
|
|
420
|
-
var
|
|
582
|
+
var Ge = We;
|
|
421
583
|
//#endregion
|
|
422
584
|
//#region ../../node_modules/.pnpm/engine.io-client@6.6.6_supports-color@8.1.1/node_modules/engine.io-client/build/esm/transports/polling-xhr.js
|
|
423
|
-
function
|
|
424
|
-
var
|
|
585
|
+
function Ke() {}
|
|
586
|
+
var qe = class extends Ue {
|
|
425
587
|
constructor(e) {
|
|
426
588
|
if (super(e), typeof location < "u") {
|
|
427
589
|
let t = location.protocol === "https:", n = location.port;
|
|
@@ -443,13 +605,13 @@ var Oe = class extends we {
|
|
|
443
605
|
this.onError("xhr poll error", e, t);
|
|
444
606
|
}), this.pollXhr = e;
|
|
445
607
|
}
|
|
446
|
-
},
|
|
608
|
+
}, j = class e extends E {
|
|
447
609
|
constructor(e, t, n) {
|
|
448
|
-
super(), this.createRequest = e,
|
|
610
|
+
super(), this.createRequest = e, k(this, n), this._opts = n, this._method = n.method || "GET", this._uri = t, this._data = n.data === void 0 ? null : n.data, this._create();
|
|
449
611
|
}
|
|
450
612
|
_create() {
|
|
451
613
|
var t;
|
|
452
|
-
let n =
|
|
614
|
+
let n = Ne(this._opts, "agent", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "autoUnref");
|
|
453
615
|
n.xdomain = !!this._opts.xd;
|
|
454
616
|
let r = this._xhr = this.createRequest(n);
|
|
455
617
|
try {
|
|
@@ -485,7 +647,7 @@ var Oe = class extends we {
|
|
|
485
647
|
}
|
|
486
648
|
_cleanup(t) {
|
|
487
649
|
if (this._xhr !== void 0 && this._xhr !== null) {
|
|
488
|
-
if (this._xhr.onreadystatechange =
|
|
650
|
+
if (this._xhr.onreadystatechange = Ke, t) try {
|
|
489
651
|
this._xhr.abort();
|
|
490
652
|
} catch {}
|
|
491
653
|
typeof document < "u" && delete e.requests[this._index], this._xhr = null;
|
|
@@ -499,46 +661,46 @@ var Oe = class extends we {
|
|
|
499
661
|
this._cleanup();
|
|
500
662
|
}
|
|
501
663
|
};
|
|
502
|
-
if (
|
|
503
|
-
if (typeof attachEvent == "function") attachEvent("onunload",
|
|
664
|
+
if (j.requestsCount = 0, j.requests = {}, typeof document < "u") {
|
|
665
|
+
if (typeof attachEvent == "function") attachEvent("onunload", Je);
|
|
504
666
|
else if (typeof addEventListener == "function") {
|
|
505
|
-
let e = "onpagehide" in
|
|
506
|
-
addEventListener(e,
|
|
667
|
+
let e = "onpagehide" in O ? "pagehide" : "unload";
|
|
668
|
+
addEventListener(e, Je, !1);
|
|
507
669
|
}
|
|
508
670
|
}
|
|
509
|
-
function
|
|
510
|
-
for (let e in
|
|
671
|
+
function Je() {
|
|
672
|
+
for (let e in j.requests) j.requests.hasOwnProperty(e) && j.requests[e].abort();
|
|
511
673
|
}
|
|
512
|
-
var
|
|
513
|
-
let e =
|
|
674
|
+
var Ye = (function() {
|
|
675
|
+
let e = Ze({ xdomain: !1 });
|
|
514
676
|
return e && e.responseType !== null;
|
|
515
|
-
})(),
|
|
677
|
+
})(), Xe = class extends qe {
|
|
516
678
|
constructor(e) {
|
|
517
679
|
super(e);
|
|
518
680
|
let t = e && e.forceBase64;
|
|
519
|
-
this.supportsBinary =
|
|
681
|
+
this.supportsBinary = Ye && !t;
|
|
520
682
|
}
|
|
521
683
|
request(e = {}) {
|
|
522
|
-
return Object.assign(e, { xd: this.xd }, this.opts), new
|
|
684
|
+
return Object.assign(e, { xd: this.xd }, this.opts), new j(Ze, this.uri(), e);
|
|
523
685
|
}
|
|
524
686
|
};
|
|
525
|
-
function
|
|
687
|
+
function Ze(e) {
|
|
526
688
|
let t = e.xdomain;
|
|
527
689
|
try {
|
|
528
|
-
if (typeof XMLHttpRequest < "u" && (!t ||
|
|
690
|
+
if (typeof XMLHttpRequest < "u" && (!t || Ge)) return new XMLHttpRequest();
|
|
529
691
|
} catch {}
|
|
530
692
|
if (!t) try {
|
|
531
|
-
return new
|
|
693
|
+
return new O[["Active", "Object"].join("X")]("Microsoft.XMLHTTP");
|
|
532
694
|
} catch {}
|
|
533
695
|
}
|
|
534
696
|
//#endregion
|
|
535
697
|
//#region ../../node_modules/.pnpm/engine.io-client@6.6.6_supports-color@8.1.1/node_modules/engine.io-client/build/esm/transports/websocket.js
|
|
536
|
-
var
|
|
698
|
+
var Qe = typeof navigator < "u" && typeof navigator.product == "string" && navigator.product.toLowerCase() === "reactnative", $e = class extends A {
|
|
537
699
|
get name() {
|
|
538
700
|
return "websocket";
|
|
539
701
|
}
|
|
540
702
|
doOpen() {
|
|
541
|
-
let e = this.uri(), t = this.opts.protocols, n =
|
|
703
|
+
let e = this.uri(), t = this.opts.protocols, n = Qe ? {} : Ne(this.opts, "agent", "perMessageDeflate", "pfx", "key", "passphrase", "cert", "ca", "ciphers", "rejectUnauthorized", "localAddress", "protocolVersion", "origin", "maxPayload", "family", "checkServerIdentity");
|
|
542
704
|
this.opts.extraHeaders && (n.headers = this.opts.extraHeaders);
|
|
543
705
|
try {
|
|
544
706
|
this.ws = this.createSocket(e, t, n);
|
|
@@ -559,11 +721,11 @@ var Ne = typeof navigator < "u" && typeof navigator.product == "string" && navig
|
|
|
559
721
|
this.writable = !1;
|
|
560
722
|
for (let t = 0; t < e.length; t++) {
|
|
561
723
|
let n = e[t], r = t === e.length - 1;
|
|
562
|
-
|
|
724
|
+
x(n, this.supportsBinary, (e) => {
|
|
563
725
|
try {
|
|
564
726
|
this.doWrite(n, e);
|
|
565
727
|
} catch {}
|
|
566
|
-
r &&
|
|
728
|
+
r && D(() => {
|
|
567
729
|
this.writable = !0, this.emitReserved("drain");
|
|
568
730
|
}, this.setTimeoutFn);
|
|
569
731
|
});
|
|
@@ -574,18 +736,18 @@ var Ne = typeof navigator < "u" && typeof navigator.product == "string" && navig
|
|
|
574
736
|
}
|
|
575
737
|
uri() {
|
|
576
738
|
let e = this.opts.secure ? "wss" : "ws", t = this.query || {};
|
|
577
|
-
return this.opts.timestampRequests && (t[this.opts.timestampParam] =
|
|
739
|
+
return this.opts.timestampRequests && (t[this.opts.timestampParam] = ze()), this.supportsBinary || (t.b64 = 1), this.createUri(e, t);
|
|
578
740
|
}
|
|
579
|
-
},
|
|
580
|
-
websocket: class extends
|
|
741
|
+
}, M = O.WebSocket || O.MozWebSocket, et = {
|
|
742
|
+
websocket: class extends $e {
|
|
581
743
|
createSocket(e, t, n) {
|
|
582
|
-
return
|
|
744
|
+
return Qe ? new M(e, t, n) : t ? new M(e, t) : new M(e);
|
|
583
745
|
}
|
|
584
746
|
doWrite(e, t) {
|
|
585
747
|
this.ws.send(t);
|
|
586
748
|
}
|
|
587
749
|
},
|
|
588
|
-
webtransport: class extends
|
|
750
|
+
webtransport: class extends A {
|
|
589
751
|
get name() {
|
|
590
752
|
return "webtransport";
|
|
591
753
|
}
|
|
@@ -601,7 +763,7 @@ var Ne = typeof navigator < "u" && typeof navigator.product == "string" && navig
|
|
|
601
763
|
this.onError("webtransport error", e);
|
|
602
764
|
}), this._transport.ready.then(() => {
|
|
603
765
|
this._transport.createBidirectionalStream().then((e) => {
|
|
604
|
-
let t =
|
|
766
|
+
let t = Ae(2 ** 53 - 1, this.socket.binaryType), n = e.readable.pipeThrough(t).getReader(), r = Oe();
|
|
605
767
|
r.readable.pipeTo(e.writable), this._writer = r.writable.getWriter();
|
|
606
768
|
let i = () => {
|
|
607
769
|
n.read().then(({ done: e, value: t }) => {
|
|
@@ -619,7 +781,7 @@ var Ne = typeof navigator < "u" && typeof navigator.product == "string" && navig
|
|
|
619
781
|
for (let t = 0; t < e.length; t++) {
|
|
620
782
|
let n = e[t], r = t === e.length - 1;
|
|
621
783
|
this._writer.write(n).then(() => {
|
|
622
|
-
r &&
|
|
784
|
+
r && D(() => {
|
|
623
785
|
this.writable = !0, this.emitReserved("drain");
|
|
624
786
|
}, this.setTimeoutFn);
|
|
625
787
|
});
|
|
@@ -630,8 +792,8 @@ var Ne = typeof navigator < "u" && typeof navigator.product == "string" && navig
|
|
|
630
792
|
(e = this._transport) == null || e.close();
|
|
631
793
|
}
|
|
632
794
|
},
|
|
633
|
-
polling:
|
|
634
|
-
},
|
|
795
|
+
polling: Xe
|
|
796
|
+
}, tt = /^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/, nt = [
|
|
635
797
|
"source",
|
|
636
798
|
"protocol",
|
|
637
799
|
"authority",
|
|
@@ -647,19 +809,19 @@ var Ne = typeof navigator < "u" && typeof navigator.product == "string" && navig
|
|
|
647
809
|
"query",
|
|
648
810
|
"anchor"
|
|
649
811
|
];
|
|
650
|
-
function
|
|
812
|
+
function N(e) {
|
|
651
813
|
if (e.length > 8e3) throw "URI too long";
|
|
652
814
|
let t = e, n = e.indexOf("["), r = e.indexOf("]");
|
|
653
815
|
n != -1 && r != -1 && (e = e.substring(0, n) + e.substring(n, r).replace(/:/g, ";") + e.substring(r, e.length));
|
|
654
|
-
let i =
|
|
655
|
-
for (; o--;) a[
|
|
656
|
-
return n != -1 && r != -1 && (a.source = t, a.host = a.host.substring(1, a.host.length - 1).replace(/;/g, ":"), a.authority = a.authority.replace("[", "").replace("]", "").replace(/;/g, ":"), a.ipv6uri = !0), a.pathNames =
|
|
816
|
+
let i = tt.exec(e || ""), a = {}, o = 14;
|
|
817
|
+
for (; o--;) a[nt[o]] = i[o] || "";
|
|
818
|
+
return n != -1 && r != -1 && (a.source = t, a.host = a.host.substring(1, a.host.length - 1).replace(/;/g, ":"), a.authority = a.authority.replace("[", "").replace("]", "").replace(/;/g, ":"), a.ipv6uri = !0), a.pathNames = rt(a, a.path), a.queryKey = it(a, a.query), a;
|
|
657
819
|
}
|
|
658
|
-
function
|
|
820
|
+
function rt(e, t) {
|
|
659
821
|
let n = t.replace(/\/{2,9}/g, "/").split("/");
|
|
660
822
|
return (t.slice(0, 1) == "/" || t.length === 0) && n.splice(0, 1), t.slice(-1) == "/" && n.splice(n.length - 1, 1), n;
|
|
661
823
|
}
|
|
662
|
-
function
|
|
824
|
+
function it(e, t) {
|
|
663
825
|
let n = {};
|
|
664
826
|
return t.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function(e, t, r) {
|
|
665
827
|
t && (n[t] = r);
|
|
@@ -667,17 +829,17 @@ function ze(e, t) {
|
|
|
667
829
|
}
|
|
668
830
|
//#endregion
|
|
669
831
|
//#region ../../node_modules/.pnpm/engine.io-client@6.6.6_supports-color@8.1.1/node_modules/engine.io-client/build/esm/socket.js
|
|
670
|
-
var
|
|
671
|
-
|
|
672
|
-
|
|
832
|
+
var P = typeof addEventListener == "function" && typeof removeEventListener == "function", F = [];
|
|
833
|
+
P && addEventListener("offline", () => {
|
|
834
|
+
F.forEach((e) => e());
|
|
673
835
|
}, !1);
|
|
674
|
-
var
|
|
836
|
+
var I = class e extends E {
|
|
675
837
|
constructor(e, t) {
|
|
676
|
-
if (super(), this.binaryType =
|
|
677
|
-
let n =
|
|
838
|
+
if (super(), this.binaryType = Me, this.writeBuffer = [], this._prevBufferLen = 0, this._pingInterval = -1, this._pingTimeout = -1, this._maxPayload = -1, this._pingTimeoutTime = Infinity, e && typeof e == "object" && (t = e, e = null), e) {
|
|
839
|
+
let n = N(e);
|
|
678
840
|
t.hostname = n.host, t.secure = n.protocol === "https" || n.protocol === "wss", t.port = n.port, n.query && (t.query = n.query);
|
|
679
|
-
} else t.host && (t.hostname =
|
|
680
|
-
|
|
841
|
+
} else t.host && (t.hostname = N(t.host).host);
|
|
842
|
+
k(this, t), this.secure = t.secure == null ? typeof location < "u" && location.protocol === "https:" : t.secure, t.hostname && !t.port && (t.port = this.secure ? "443" : "80"), this.hostname = t.hostname || (typeof location < "u" ? location.hostname : "localhost"), this.port = t.port || (typeof location < "u" && location.port ? location.port : this.secure ? "443" : "80"), this.transports = [], this._transportsByName = {}, t.transports.forEach((e) => {
|
|
681
843
|
let t = e.prototype.name;
|
|
682
844
|
this.transports.push(t), this._transportsByName[t] = e;
|
|
683
845
|
}), this.opts = Object.assign({
|
|
@@ -692,11 +854,11 @@ var M = class e extends S {
|
|
|
692
854
|
perMessageDeflate: { threshold: 1024 },
|
|
693
855
|
transportOptions: {},
|
|
694
856
|
closeOnBeforeunload: !1
|
|
695
|
-
}, t), this.opts.path = this.opts.path.replace(/\/$/, "") + (this.opts.addTrailingSlash ? "/" : ""), typeof this.opts.query == "string" && (this.opts.query =
|
|
857
|
+
}, t), this.opts.path = this.opts.path.replace(/\/$/, "") + (this.opts.addTrailingSlash ? "/" : ""), typeof this.opts.query == "string" && (this.opts.query = Ve(this.opts.query)), P && (this.opts.closeOnBeforeunload && (this._beforeunloadEventListener = () => {
|
|
696
858
|
this.transport && (this.transport.removeAllListeners(), this.transport.close());
|
|
697
859
|
}, addEventListener("beforeunload", this._beforeunloadEventListener, !1)), this.hostname !== "localhost" && (this._offlineEventListener = () => {
|
|
698
860
|
this._onClose("transport close", { description: "network connection lost" });
|
|
699
|
-
},
|
|
861
|
+
}, F.push(this._offlineEventListener))), this.opts.withCredentials && (this._cookieJar = void 0), this._open();
|
|
700
862
|
}
|
|
701
863
|
createTransport(e) {
|
|
702
864
|
let t = Object.assign({}, this.opts.query);
|
|
@@ -767,7 +929,7 @@ var M = class e extends S {
|
|
|
767
929
|
let e = 1;
|
|
768
930
|
for (let t = 0; t < this.writeBuffer.length; t++) {
|
|
769
931
|
let n = this.writeBuffer[t].data;
|
|
770
|
-
if (n && (e +=
|
|
932
|
+
if (n && (e += Le(n)), t > 0 && e > this._maxPayload) return this.writeBuffer.slice(0, t);
|
|
771
933
|
e += 2;
|
|
772
934
|
}
|
|
773
935
|
return this.writeBuffer;
|
|
@@ -775,7 +937,7 @@ var M = class e extends S {
|
|
|
775
937
|
_hasPingExpired() {
|
|
776
938
|
if (!this._pingTimeoutTime) return !0;
|
|
777
939
|
let e = Date.now() > this._pingTimeoutTime;
|
|
778
|
-
return e && (this._pingTimeoutTime = 0,
|
|
940
|
+
return e && (this._pingTimeoutTime = 0, D(() => {
|
|
779
941
|
this._onClose("ping timeout");
|
|
780
942
|
}, this.setTimeoutFn)), e;
|
|
781
943
|
}
|
|
@@ -813,16 +975,16 @@ var M = class e extends S {
|
|
|
813
975
|
}
|
|
814
976
|
_onClose(e, t) {
|
|
815
977
|
if (this.readyState === "opening" || this.readyState === "open" || this.readyState === "closing") {
|
|
816
|
-
if (this.clearTimeoutFn(this._pingTimeoutTimer), this.transport.removeAllListeners("close"), this.transport.close(), this.transport.removeAllListeners(),
|
|
817
|
-
let e =
|
|
818
|
-
e !== -1 &&
|
|
978
|
+
if (this.clearTimeoutFn(this._pingTimeoutTimer), this.transport.removeAllListeners("close"), this.transport.close(), this.transport.removeAllListeners(), P && (this._beforeunloadEventListener && removeEventListener("beforeunload", this._beforeunloadEventListener, !1), this._offlineEventListener)) {
|
|
979
|
+
let e = F.indexOf(this._offlineEventListener);
|
|
980
|
+
e !== -1 && F.splice(e, 1);
|
|
819
981
|
}
|
|
820
982
|
this.readyState = "closed", this.id = null, this.emitReserved("close", e, t), this.writeBuffer = [], this._prevBufferLen = 0;
|
|
821
983
|
}
|
|
822
984
|
}
|
|
823
985
|
};
|
|
824
|
-
|
|
825
|
-
var
|
|
986
|
+
I.protocol = 4;
|
|
987
|
+
var at = class extends I {
|
|
826
988
|
constructor() {
|
|
827
989
|
super(...arguments), this._upgrades = [];
|
|
828
990
|
}
|
|
@@ -831,7 +993,7 @@ var Be = class extends M {
|
|
|
831
993
|
}
|
|
832
994
|
_probe(e) {
|
|
833
995
|
let t = this.createTransport(e), n = !1;
|
|
834
|
-
|
|
996
|
+
I.priorWebsocketSuccess = !1;
|
|
835
997
|
let r = () => {
|
|
836
998
|
n || (t.send([{
|
|
837
999
|
type: "ping",
|
|
@@ -840,7 +1002,7 @@ var Be = class extends M {
|
|
|
840
1002
|
if (!n) {
|
|
841
1003
|
if (e.type === "pong" && e.data === "probe") {
|
|
842
1004
|
if (this.upgrading = !0, this.emitReserved("upgrading", t), !t) return;
|
|
843
|
-
|
|
1005
|
+
I.priorWebsocketSuccess = t.name === "websocket", this.transport.pause(() => {
|
|
844
1006
|
n || this.readyState !== "closed" && (l(), this.setTransport(t), t.send([{ type: "upgrade" }]), this.emitReserved("upgrade", t), t = null, this.upgrading = !1, this.flush());
|
|
845
1007
|
});
|
|
846
1008
|
} else {
|
|
@@ -881,54 +1043,54 @@ var Be = class extends M {
|
|
|
881
1043
|
for (let n = 0; n < e.length; n++) ~this.transports.indexOf(e[n]) && t.push(e[n]);
|
|
882
1044
|
return t;
|
|
883
1045
|
}
|
|
884
|
-
},
|
|
1046
|
+
}, ot = class extends at {
|
|
885
1047
|
constructor(e, t = {}) {
|
|
886
1048
|
let n = typeof e == "object", r = n ? { ...e } : { ...t };
|
|
887
1049
|
(!r.transports || r.transports && typeof r.transports[0] == "string") && (r.transports = (r.transports || [
|
|
888
1050
|
"polling",
|
|
889
1051
|
"websocket",
|
|
890
1052
|
"webtransport"
|
|
891
|
-
]).map((e) =>
|
|
1053
|
+
]).map((e) => et[e]).filter((e) => !!e)), super(n ? r : e, r);
|
|
892
1054
|
}
|
|
893
1055
|
};
|
|
894
|
-
|
|
1056
|
+
ot.protocol;
|
|
895
1057
|
//#endregion
|
|
896
1058
|
//#region ../../node_modules/.pnpm/socket.io-client@4.8.4_supports-color@8.1.1/node_modules/socket.io-client/build/esm/url.js
|
|
897
|
-
function
|
|
1059
|
+
function st(e, t = "", n) {
|
|
898
1060
|
let r = e;
|
|
899
|
-
n ||= typeof location < "u" && location, e ??= n.protocol + "//" + n.host, typeof e == "string" && (e.charAt(0) === "/" && (e = e.charAt(1) === "/" ? n.protocol + e : n.host + e), /^(https?|wss?):\/\//.test(e) || (e = n === void 0 ? "https://" + e : n.protocol + "//" + e), r =
|
|
1061
|
+
n ||= typeof location < "u" && location, e ??= n.protocol + "//" + n.host, typeof e == "string" && (e.charAt(0) === "/" && (e = e.charAt(1) === "/" ? n.protocol + e : n.host + e), /^(https?|wss?):\/\//.test(e) || (e = n === void 0 ? "https://" + e : n.protocol + "//" + e), r = N(e)), r.port || (/^(http|ws)$/.test(r.protocol) ? r.port = "80" : /^(http|ws)s$/.test(r.protocol) && (r.port = "443")), r.path = r.path || "/";
|
|
900
1062
|
let i = r.host.indexOf(":") === -1 ? r.host : "[" + r.host + "]";
|
|
901
1063
|
return r.id = r.protocol + "://" + i + ":" + r.port + t, r.href = r.protocol + "://" + i + (n && n.port === r.port ? "" : ":" + r.port), r;
|
|
902
1064
|
}
|
|
903
1065
|
//#endregion
|
|
904
1066
|
//#region ../../node_modules/.pnpm/socket.io-parser@4.2.7_supports-color@8.1.1/node_modules/socket.io-parser/build/esm/is-binary.js
|
|
905
|
-
var
|
|
906
|
-
function
|
|
907
|
-
return
|
|
1067
|
+
var ct = typeof ArrayBuffer == "function", lt = (e) => typeof ArrayBuffer.isView == "function" ? ArrayBuffer.isView(e) : e.buffer instanceof ArrayBuffer, ut = Object.prototype.toString, dt = typeof Blob == "function" || typeof Blob < "u" && ut.call(Blob) === "[object BlobConstructor]", ft = typeof File == "function" || typeof File < "u" && ut.call(File) === "[object FileConstructor]";
|
|
1068
|
+
function L(e) {
|
|
1069
|
+
return ct && (e instanceof ArrayBuffer || lt(e)) || dt && e instanceof Blob || ft && e instanceof File;
|
|
908
1070
|
}
|
|
909
|
-
function
|
|
1071
|
+
function R(e, t) {
|
|
910
1072
|
if (!e || typeof e != "object") return !1;
|
|
911
1073
|
if (Array.isArray(e)) {
|
|
912
|
-
for (let t = 0, n = e.length; t < n; t++) if (
|
|
1074
|
+
for (let t = 0, n = e.length; t < n; t++) if (R(e[t])) return !0;
|
|
913
1075
|
return !1;
|
|
914
1076
|
}
|
|
915
|
-
if (
|
|
916
|
-
if (e.toJSON && typeof e.toJSON == "function" && arguments.length === 1) return
|
|
917
|
-
for (let t in e) if (Object.prototype.hasOwnProperty.call(e, t) &&
|
|
1077
|
+
if (L(e)) return !0;
|
|
1078
|
+
if (e.toJSON && typeof e.toJSON == "function" && arguments.length === 1) return R(e.toJSON(), !0);
|
|
1079
|
+
for (let t in e) if (Object.prototype.hasOwnProperty.call(e, t) && R(e[t])) return !0;
|
|
918
1080
|
return !1;
|
|
919
1081
|
}
|
|
920
1082
|
//#endregion
|
|
921
1083
|
//#region ../../node_modules/.pnpm/socket.io-parser@4.2.7_supports-color@8.1.1/node_modules/socket.io-parser/build/esm/binary.js
|
|
922
|
-
function
|
|
1084
|
+
function pt(e) {
|
|
923
1085
|
let t = [], n = e.data, r = e;
|
|
924
|
-
return r.data =
|
|
1086
|
+
return r.data = z(n, t), r.attachments = t.length, {
|
|
925
1087
|
packet: r,
|
|
926
1088
|
buffers: t
|
|
927
1089
|
};
|
|
928
1090
|
}
|
|
929
|
-
function
|
|
1091
|
+
function z(e, t, n) {
|
|
930
1092
|
if (!e) return e;
|
|
931
|
-
if (
|
|
1093
|
+
if (L(e)) {
|
|
932
1094
|
let n = {
|
|
933
1095
|
_placeholder: !0,
|
|
934
1096
|
num: t.length
|
|
@@ -937,56 +1099,56 @@ function L(e, t, n) {
|
|
|
937
1099
|
}
|
|
938
1100
|
if (Array.isArray(e)) {
|
|
939
1101
|
let n = Array(e.length);
|
|
940
|
-
for (let r = 0; r < e.length; r++) n[r] =
|
|
1102
|
+
for (let r = 0; r < e.length; r++) n[r] = z(e[r], t);
|
|
941
1103
|
return n;
|
|
942
1104
|
}
|
|
943
1105
|
if (typeof e == "object" && !(e instanceof Date)) {
|
|
944
|
-
if (e.toJSON && typeof e.toJSON == "function" && !n) return
|
|
1106
|
+
if (e.toJSON && typeof e.toJSON == "function" && !n) return z(e.toJSON(), t, !0);
|
|
945
1107
|
let r = {};
|
|
946
|
-
for (let n in e) Object.prototype.hasOwnProperty.call(e, n) && (r[n] =
|
|
1108
|
+
for (let n in e) Object.prototype.hasOwnProperty.call(e, n) && (r[n] = z(e[n], t));
|
|
947
1109
|
return r;
|
|
948
1110
|
}
|
|
949
1111
|
return e;
|
|
950
1112
|
}
|
|
951
|
-
function
|
|
952
|
-
return e.data =
|
|
1113
|
+
function mt(e, t) {
|
|
1114
|
+
return e.data = B(e.data, t), delete e.attachments, e;
|
|
953
1115
|
}
|
|
954
|
-
function
|
|
1116
|
+
function B(e, t) {
|
|
955
1117
|
if (!e) return e;
|
|
956
1118
|
if (e && e._placeholder === !0) {
|
|
957
1119
|
if (typeof e.num == "number" && e.num >= 0 && e.num < t.length) return t[e.num];
|
|
958
1120
|
throw Error("illegal attachments");
|
|
959
1121
|
}
|
|
960
|
-
if (Array.isArray(e)) for (let n = 0; n < e.length; n++) e[n] =
|
|
961
|
-
else if (typeof e == "object") for (let n in e) Object.prototype.hasOwnProperty.call(e, n) && (e[n] =
|
|
1122
|
+
if (Array.isArray(e)) for (let n = 0; n < e.length; n++) e[n] = B(e[n], t);
|
|
1123
|
+
else if (typeof e == "object") for (let n in e) Object.prototype.hasOwnProperty.call(e, n) && (e[n] = B(e[n], t));
|
|
962
1124
|
return e;
|
|
963
1125
|
}
|
|
964
1126
|
//#endregion
|
|
965
1127
|
//#region ../../node_modules/.pnpm/socket.io-parser@4.2.7_supports-color@8.1.1/node_modules/socket.io-parser/build/esm/index.js
|
|
966
|
-
var
|
|
967
|
-
Decoder: () =>
|
|
968
|
-
Encoder: () =>
|
|
969
|
-
PacketType: () =>
|
|
970
|
-
isPacketValid: () =>
|
|
1128
|
+
var ht = /* @__PURE__ */ t({
|
|
1129
|
+
Decoder: () => vt,
|
|
1130
|
+
Encoder: () => _t,
|
|
1131
|
+
PacketType: () => V,
|
|
1132
|
+
isPacketValid: () => wt,
|
|
971
1133
|
protocol: () => 5
|
|
972
|
-
}),
|
|
1134
|
+
}), gt = [
|
|
973
1135
|
"connect",
|
|
974
1136
|
"connect_error",
|
|
975
1137
|
"disconnect",
|
|
976
1138
|
"disconnecting",
|
|
977
1139
|
"newListener",
|
|
978
1140
|
"removeListener"
|
|
979
|
-
],
|
|
1141
|
+
], V;
|
|
980
1142
|
(function(e) {
|
|
981
1143
|
e[e.CONNECT = 0] = "CONNECT", e[e.DISCONNECT = 1] = "DISCONNECT", e[e.EVENT = 2] = "EVENT", e[e.ACK = 3] = "ACK", e[e.CONNECT_ERROR = 4] = "CONNECT_ERROR", e[e.BINARY_EVENT = 5] = "BINARY_EVENT", e[e.BINARY_ACK = 6] = "BINARY_ACK";
|
|
982
|
-
})(
|
|
983
|
-
var
|
|
1144
|
+
})(V ||= {});
|
|
1145
|
+
var _t = class {
|
|
984
1146
|
constructor(e) {
|
|
985
1147
|
this.replacer = e;
|
|
986
1148
|
}
|
|
987
1149
|
encode(e) {
|
|
988
|
-
return (e.type ===
|
|
989
|
-
type: e.type ===
|
|
1150
|
+
return (e.type === V.EVENT || e.type === V.ACK) && R(e) ? this.encodeAsBinary({
|
|
1151
|
+
type: e.type === V.EVENT ? V.BINARY_EVENT : V.BINARY_ACK,
|
|
990
1152
|
nsp: e.nsp,
|
|
991
1153
|
data: e.data,
|
|
992
1154
|
id: e.id
|
|
@@ -994,13 +1156,13 @@ var Ye = class {
|
|
|
994
1156
|
}
|
|
995
1157
|
encodeAsString(e) {
|
|
996
1158
|
let t = "" + e.type;
|
|
997
|
-
return (e.type ===
|
|
1159
|
+
return (e.type === V.BINARY_EVENT || e.type === V.BINARY_ACK) && (t += e.attachments + "-"), e.nsp && e.nsp !== "/" && (t += e.nsp + ","), e.id != null && (t += e.id), e.data != null && (t += JSON.stringify(e.data, this.replacer)), t;
|
|
998
1160
|
}
|
|
999
1161
|
encodeAsBinary(e) {
|
|
1000
|
-
let t =
|
|
1162
|
+
let t = pt(e), n = this.encodeAsString(t.packet), r = t.buffers;
|
|
1001
1163
|
return r.unshift(n), r;
|
|
1002
1164
|
}
|
|
1003
|
-
},
|
|
1165
|
+
}, vt = class e extends E {
|
|
1004
1166
|
constructor(e) {
|
|
1005
1167
|
super(), this.opts = Object.assign({
|
|
1006
1168
|
reviver: void 0,
|
|
@@ -1012,23 +1174,23 @@ var Ye = class {
|
|
|
1012
1174
|
if (typeof e == "string") {
|
|
1013
1175
|
if (this.reconstructor) throw Error("got plaintext data when reconstructing a packet");
|
|
1014
1176
|
t = this.decodeString(e);
|
|
1015
|
-
let n = t.type ===
|
|
1016
|
-
n || t.type ===
|
|
1017
|
-
} else if (
|
|
1177
|
+
let n = t.type === V.BINARY_EVENT;
|
|
1178
|
+
n || t.type === V.BINARY_ACK ? (t.type = n ? V.EVENT : V.ACK, this.reconstructor = new yt(t)) : super.emitReserved("decoded", t);
|
|
1179
|
+
} else if (L(e) || e.base64) {
|
|
1018
1180
|
if (this.reconstructor) t = this.reconstructor.takeBinaryData(e), t && (this.reconstructor = null, super.emitReserved("decoded", t));
|
|
1019
1181
|
else throw Error("got binary data when not reconstructing a packet");
|
|
1020
1182
|
} else throw Error("Unknown type: " + e);
|
|
1021
1183
|
}
|
|
1022
1184
|
decodeString(t) {
|
|
1023
1185
|
let n = 0, r = { type: Number(t.charAt(0)) };
|
|
1024
|
-
if (
|
|
1025
|
-
if (r.type ===
|
|
1186
|
+
if (V[r.type] === void 0) throw Error("unknown packet type " + r.type);
|
|
1187
|
+
if (r.type === V.BINARY_EVENT || r.type === V.BINARY_ACK) {
|
|
1026
1188
|
let e = n + 1;
|
|
1027
1189
|
for (; t.charAt(++n) !== "-" && n != t.length;);
|
|
1028
1190
|
let i = t.substring(e, n);
|
|
1029
1191
|
if (i != Number(i) || t.charAt(n) !== "-") throw Error("Illegal attachments");
|
|
1030
1192
|
let a = Number(i);
|
|
1031
|
-
if (
|
|
1193
|
+
if (!xt(a) || a < 1) throw Error("Illegal attachments");
|
|
1032
1194
|
if (a > this.opts.maxAttachments) throw Error("too many attachments");
|
|
1033
1195
|
r.attachments = a;
|
|
1034
1196
|
}
|
|
@@ -1066,25 +1228,25 @@ var Ye = class {
|
|
|
1066
1228
|
}
|
|
1067
1229
|
static isPayloadValid(e, t) {
|
|
1068
1230
|
switch (e) {
|
|
1069
|
-
case
|
|
1070
|
-
case
|
|
1071
|
-
case
|
|
1072
|
-
case
|
|
1073
|
-
case
|
|
1074
|
-
case
|
|
1075
|
-
case
|
|
1231
|
+
case V.CONNECT: return H(t);
|
|
1232
|
+
case V.DISCONNECT: return t === void 0;
|
|
1233
|
+
case V.CONNECT_ERROR: return typeof t == "string" || H(t);
|
|
1234
|
+
case V.EVENT:
|
|
1235
|
+
case V.BINARY_EVENT: return Array.isArray(t) && (typeof t[0] == "number" || typeof t[0] == "string" && gt.indexOf(t[0]) === -1);
|
|
1236
|
+
case V.ACK:
|
|
1237
|
+
case V.BINARY_ACK: return Array.isArray(t);
|
|
1076
1238
|
}
|
|
1077
1239
|
}
|
|
1078
1240
|
destroy() {
|
|
1079
1241
|
this.reconstructor &&= (this.reconstructor.finishedReconstruction(), null);
|
|
1080
1242
|
}
|
|
1081
|
-
},
|
|
1243
|
+
}, yt = class {
|
|
1082
1244
|
constructor(e) {
|
|
1083
1245
|
this.packet = e, this.buffers = [], this.reconPack = e;
|
|
1084
1246
|
}
|
|
1085
1247
|
takeBinaryData(e) {
|
|
1086
1248
|
if (this.buffers.push(e), this.buffers.length === this.reconPack.attachments) {
|
|
1087
|
-
let e =
|
|
1249
|
+
let e = mt(this.reconPack, this.buffers);
|
|
1088
1250
|
return this.finishedReconstruction(), e;
|
|
1089
1251
|
}
|
|
1090
1252
|
return null;
|
|
@@ -1093,48 +1255,48 @@ var Ye = class {
|
|
|
1093
1255
|
this.reconPack = null, this.buffers = [];
|
|
1094
1256
|
}
|
|
1095
1257
|
};
|
|
1096
|
-
function
|
|
1258
|
+
function bt(e) {
|
|
1097
1259
|
return typeof e == "string";
|
|
1098
1260
|
}
|
|
1099
|
-
var
|
|
1261
|
+
var xt = Number.isInteger || function(e) {
|
|
1100
1262
|
return typeof e == "number" && isFinite(e) && Math.floor(e) === e;
|
|
1101
1263
|
};
|
|
1102
|
-
function
|
|
1103
|
-
return e === void 0 ||
|
|
1264
|
+
function St(e) {
|
|
1265
|
+
return e === void 0 || xt(e);
|
|
1104
1266
|
}
|
|
1105
|
-
function
|
|
1267
|
+
function H(e) {
|
|
1106
1268
|
return Object.prototype.toString.call(e) === "[object Object]";
|
|
1107
1269
|
}
|
|
1108
|
-
function
|
|
1270
|
+
function Ct(e, t) {
|
|
1109
1271
|
switch (e) {
|
|
1110
|
-
case
|
|
1111
|
-
case
|
|
1112
|
-
case
|
|
1113
|
-
case
|
|
1114
|
-
case
|
|
1272
|
+
case V.CONNECT: return t === void 0 || H(t);
|
|
1273
|
+
case V.DISCONNECT: return t === void 0;
|
|
1274
|
+
case V.EVENT: return Array.isArray(t) && (typeof t[0] == "number" || typeof t[0] == "string" && gt.indexOf(t[0]) === -1);
|
|
1275
|
+
case V.ACK: return Array.isArray(t);
|
|
1276
|
+
case V.CONNECT_ERROR: return typeof t == "string" || H(t);
|
|
1115
1277
|
default: return !1;
|
|
1116
1278
|
}
|
|
1117
1279
|
}
|
|
1118
|
-
function
|
|
1119
|
-
return
|
|
1280
|
+
function wt(e) {
|
|
1281
|
+
return bt(e.nsp) && St(e.id) && Ct(e.type, e.data);
|
|
1120
1282
|
}
|
|
1121
1283
|
//#endregion
|
|
1122
1284
|
//#region ../../node_modules/.pnpm/socket.io-client@4.8.4_supports-color@8.1.1/node_modules/socket.io-client/build/esm/on.js
|
|
1123
|
-
function
|
|
1285
|
+
function U(e, t, n) {
|
|
1124
1286
|
return e.on(t, n), function() {
|
|
1125
1287
|
e.off(t, n);
|
|
1126
1288
|
};
|
|
1127
1289
|
}
|
|
1128
1290
|
//#endregion
|
|
1129
1291
|
//#region ../../node_modules/.pnpm/socket.io-client@4.8.4_supports-color@8.1.1/node_modules/socket.io-client/build/esm/socket.js
|
|
1130
|
-
var
|
|
1292
|
+
var Tt = Object.freeze({
|
|
1131
1293
|
connect: 1,
|
|
1132
1294
|
connect_error: 1,
|
|
1133
1295
|
disconnect: 1,
|
|
1134
1296
|
disconnecting: 1,
|
|
1135
1297
|
newListener: 1,
|
|
1136
1298
|
removeListener: 1
|
|
1137
|
-
}),
|
|
1299
|
+
}), Et = class extends E {
|
|
1138
1300
|
constructor(e, t, n) {
|
|
1139
1301
|
super(), this.connected = !1, this.recovered = !1, this.receiveBuffer = [], this.sendBuffer = [], this._queue = [], this._queueSeq = 0, this.ids = 0, this.acks = {}, this.flags = {}, this.io = e, this.nsp = t, n && n.auth && (this.auth = n.auth), this._opts = Object.assign({}, n), this.io._autoConnect && this.open();
|
|
1140
1302
|
}
|
|
@@ -1145,10 +1307,10 @@ var rt = Object.freeze({
|
|
|
1145
1307
|
if (this.subs) return;
|
|
1146
1308
|
let e = this.io;
|
|
1147
1309
|
this.subs = [
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1310
|
+
U(e, "open", this.onopen.bind(this)),
|
|
1311
|
+
U(e, "packet", this.onpacket.bind(this)),
|
|
1312
|
+
U(e, "error", this.onerror.bind(this)),
|
|
1313
|
+
U(e, "close", this.onclose.bind(this))
|
|
1152
1314
|
];
|
|
1153
1315
|
}
|
|
1154
1316
|
get active() {
|
|
@@ -1164,10 +1326,10 @@ var rt = Object.freeze({
|
|
|
1164
1326
|
return e.unshift("message"), this.emit.apply(this, e), this;
|
|
1165
1327
|
}
|
|
1166
1328
|
emit(e, ...t) {
|
|
1167
|
-
if (
|
|
1329
|
+
if (Tt.hasOwnProperty(e)) throw Error("\"" + e.toString() + "\" is a reserved event name");
|
|
1168
1330
|
if (t.unshift(e), this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) return this._addToQueue(t), this;
|
|
1169
1331
|
let n = {
|
|
1170
|
-
type:
|
|
1332
|
+
type: V.EVENT,
|
|
1171
1333
|
data: t
|
|
1172
1334
|
};
|
|
1173
1335
|
if (n.options = {}, n.options.compress = this.flags.compress !== !1, typeof t[t.length - 1] == "function") {
|
|
@@ -1225,7 +1387,7 @@ var rt = Object.freeze({
|
|
|
1225
1387
|
}
|
|
1226
1388
|
_sendConnectPacket(e) {
|
|
1227
1389
|
this.packet({
|
|
1228
|
-
type:
|
|
1390
|
+
type: V.CONNECT,
|
|
1229
1391
|
data: this._pid ? Object.assign({
|
|
1230
1392
|
pid: this._pid,
|
|
1231
1393
|
offset: this._lastOffset
|
|
@@ -1248,21 +1410,21 @@ var rt = Object.freeze({
|
|
|
1248
1410
|
}
|
|
1249
1411
|
onpacket(e) {
|
|
1250
1412
|
if (e.nsp === this.nsp) switch (e.type) {
|
|
1251
|
-
case
|
|
1413
|
+
case V.CONNECT:
|
|
1252
1414
|
e.data && e.data.sid ? this.onconnect(e.data.sid, e.data.pid) : this.emitReserved("connect_error", /* @__PURE__ */ Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));
|
|
1253
1415
|
break;
|
|
1254
|
-
case
|
|
1255
|
-
case
|
|
1416
|
+
case V.EVENT:
|
|
1417
|
+
case V.BINARY_EVENT:
|
|
1256
1418
|
this.onevent(e);
|
|
1257
1419
|
break;
|
|
1258
|
-
case
|
|
1259
|
-
case
|
|
1420
|
+
case V.ACK:
|
|
1421
|
+
case V.BINARY_ACK:
|
|
1260
1422
|
this.onack(e);
|
|
1261
1423
|
break;
|
|
1262
|
-
case
|
|
1424
|
+
case V.DISCONNECT:
|
|
1263
1425
|
this.ondisconnect();
|
|
1264
1426
|
break;
|
|
1265
|
-
case
|
|
1427
|
+
case V.CONNECT_ERROR:
|
|
1266
1428
|
this.destroy();
|
|
1267
1429
|
let t = Error(e.data.message);
|
|
1268
1430
|
t.data = e.data.data, this.emitReserved("connect_error", t);
|
|
@@ -1283,7 +1445,7 @@ var rt = Object.freeze({
|
|
|
1283
1445
|
let t = this, n = !1;
|
|
1284
1446
|
return function(...r) {
|
|
1285
1447
|
n || (n = !0, t.packet({
|
|
1286
|
-
type:
|
|
1448
|
+
type: V.ACK,
|
|
1287
1449
|
id: e,
|
|
1288
1450
|
data: r
|
|
1289
1451
|
}));
|
|
@@ -1308,7 +1470,7 @@ var rt = Object.freeze({
|
|
|
1308
1470
|
this.subs &&= (this.subs.forEach((e) => e()), void 0), this.io._destroy(this);
|
|
1309
1471
|
}
|
|
1310
1472
|
disconnect() {
|
|
1311
|
-
return this.connected && this.packet({ type:
|
|
1473
|
+
return this.connected && this.packet({ type: V.DISCONNECT }), this.destroy(), this.connected && this.onclose("io client disconnect"), this;
|
|
1312
1474
|
}
|
|
1313
1475
|
close() {
|
|
1314
1476
|
return this.disconnect();
|
|
@@ -1365,35 +1527,35 @@ var rt = Object.freeze({
|
|
|
1365
1527
|
};
|
|
1366
1528
|
//#endregion
|
|
1367
1529
|
//#region ../../node_modules/.pnpm/socket.io-client@4.8.4_supports-color@8.1.1/node_modules/socket.io-client/build/esm/contrib/backo2.js
|
|
1368
|
-
function
|
|
1530
|
+
function W(e) {
|
|
1369
1531
|
e ||= {}, this.ms = e.min || 100, this.max = e.max || 1e4, this.factor = e.factor || 2, this.jitter = e.jitter > 0 && e.jitter <= 1 ? e.jitter : 0, this.attempts = 0;
|
|
1370
1532
|
}
|
|
1371
|
-
|
|
1533
|
+
W.prototype.duration = function() {
|
|
1372
1534
|
var e = this.ms * this.factor ** +this.attempts++;
|
|
1373
1535
|
if (this.jitter) {
|
|
1374
1536
|
var t = Math.random(), n = Math.floor(t * this.jitter * e);
|
|
1375
1537
|
e = Math.floor(t * 10) & 1 ? e + n : e - n;
|
|
1376
1538
|
}
|
|
1377
1539
|
return Math.min(e, this.max) | 0;
|
|
1378
|
-
},
|
|
1540
|
+
}, W.prototype.reset = function() {
|
|
1379
1541
|
this.attempts = 0;
|
|
1380
|
-
},
|
|
1542
|
+
}, W.prototype.setMin = function(e) {
|
|
1381
1543
|
this.ms = e;
|
|
1382
|
-
},
|
|
1544
|
+
}, W.prototype.setMax = function(e) {
|
|
1383
1545
|
this.max = e;
|
|
1384
|
-
},
|
|
1546
|
+
}, W.prototype.setJitter = function(e) {
|
|
1385
1547
|
this.jitter = e;
|
|
1386
1548
|
};
|
|
1387
1549
|
//#endregion
|
|
1388
1550
|
//#region ../../node_modules/.pnpm/socket.io-client@4.8.4_supports-color@8.1.1/node_modules/socket.io-client/build/esm/manager.js
|
|
1389
|
-
var
|
|
1551
|
+
var G = class extends E {
|
|
1390
1552
|
constructor(e, t) {
|
|
1391
|
-
super(), this.nsps = {}, this.subs = [], e && typeof e == "object" && (t = e, e = void 0), t ||= {}, t.path = t.path || "/socket.io", this.opts = t,
|
|
1553
|
+
super(), this.nsps = {}, this.subs = [], e && typeof e == "object" && (t = e, e = void 0), t ||= {}, t.path = t.path || "/socket.io", this.opts = t, k(this, t), this.reconnection(t.reconnection !== !1), this.reconnectionAttempts(t.reconnectionAttempts || Infinity), this.reconnectionDelay(t.reconnectionDelay || 1e3), this.reconnectionDelayMax(t.reconnectionDelayMax || 5e3), this.randomizationFactor(t.randomizationFactor ?? .5), this.backoff = new W({
|
|
1392
1554
|
min: this.reconnectionDelay(),
|
|
1393
1555
|
max: this.reconnectionDelayMax(),
|
|
1394
1556
|
jitter: this.randomizationFactor()
|
|
1395
1557
|
}), this.timeout(t.timeout == null ? 2e4 : t.timeout), this._readyState = "closed", this.uri = e;
|
|
1396
|
-
let n = t.parser ||
|
|
1558
|
+
let n = t.parser || ht;
|
|
1397
1559
|
this.encoder = new n.Encoder(), this.decoder = new n.Decoder(), this._autoConnect = t.autoConnect !== !1, this._autoConnect && this.open();
|
|
1398
1560
|
}
|
|
1399
1561
|
reconnection(e) {
|
|
@@ -1422,14 +1584,14 @@ var W = class extends S {
|
|
|
1422
1584
|
}
|
|
1423
1585
|
open(e) {
|
|
1424
1586
|
if (~this._readyState.indexOf("open")) return this;
|
|
1425
|
-
this.engine = new
|
|
1587
|
+
this.engine = new ot(this.uri, this.opts);
|
|
1426
1588
|
let t = this.engine, n = this;
|
|
1427
1589
|
this._readyState = "opening", this.skipReconnect = !1;
|
|
1428
|
-
let r =
|
|
1590
|
+
let r = U(t, "open", function() {
|
|
1429
1591
|
n.onopen(), e && e();
|
|
1430
1592
|
}), i = (t) => {
|
|
1431
1593
|
this.cleanup(), this._readyState = "closed", this.emitReserved("error", t), e ? e(t) : this.maybeReconnectOnOpen();
|
|
1432
|
-
}, a =
|
|
1594
|
+
}, a = U(t, "error", i);
|
|
1433
1595
|
if (!1 !== this._timeout) {
|
|
1434
1596
|
let e = this._timeout, n = this.setTimeoutFn(() => {
|
|
1435
1597
|
r(), i(/* @__PURE__ */ Error("timeout")), t.close();
|
|
@@ -1446,7 +1608,7 @@ var W = class extends S {
|
|
|
1446
1608
|
onopen() {
|
|
1447
1609
|
this.cleanup(), this._readyState = "open", this.emitReserved("open");
|
|
1448
1610
|
let e = this.engine;
|
|
1449
|
-
this.subs.push(
|
|
1611
|
+
this.subs.push(U(e, "ping", this.onping.bind(this)), U(e, "data", this.ondata.bind(this)), U(e, "error", this.onerror.bind(this)), U(e, "close", this.onclose.bind(this)), U(this.decoder, "decoded", this.ondecoded.bind(this)));
|
|
1450
1612
|
}
|
|
1451
1613
|
onping() {
|
|
1452
1614
|
this.emitReserved("ping");
|
|
@@ -1459,7 +1621,7 @@ var W = class extends S {
|
|
|
1459
1621
|
}
|
|
1460
1622
|
}
|
|
1461
1623
|
ondecoded(e) {
|
|
1462
|
-
|
|
1624
|
+
D(() => {
|
|
1463
1625
|
this.emitReserved("packet", e);
|
|
1464
1626
|
}, this.setTimeoutFn);
|
|
1465
1627
|
}
|
|
@@ -1468,7 +1630,7 @@ var W = class extends S {
|
|
|
1468
1630
|
}
|
|
1469
1631
|
socket(e, t) {
|
|
1470
1632
|
let n = this.nsps[e];
|
|
1471
|
-
return n ? this._autoConnect && !n.active && n.connect() : (n = new
|
|
1633
|
+
return n ? this._autoConnect && !n.active && n.connect() : (n = new Et(this, e, t), this.nsps[e] = n), n;
|
|
1472
1634
|
}
|
|
1473
1635
|
_destroy(e) {
|
|
1474
1636
|
let t = Object.keys(this.nsps);
|
|
@@ -1513,21 +1675,21 @@ var W = class extends S {
|
|
|
1513
1675
|
let e = this.backoff.attempts;
|
|
1514
1676
|
this._reconnecting = !1, this.backoff.reset(), this.emitReserved("reconnect", e);
|
|
1515
1677
|
}
|
|
1516
|
-
},
|
|
1517
|
-
function
|
|
1678
|
+
}, K = {};
|
|
1679
|
+
function q(e, t) {
|
|
1518
1680
|
typeof e == "object" && (t = e, e = void 0), t ||= {};
|
|
1519
|
-
let n =
|
|
1520
|
-
return s ? c = new
|
|
1521
|
-
}
|
|
1522
|
-
Object.assign(
|
|
1523
|
-
Manager:
|
|
1524
|
-
Socket:
|
|
1525
|
-
io:
|
|
1526
|
-
connect:
|
|
1681
|
+
let n = st(e, t.path || "/socket.io"), r = n.source, i = n.id, a = n.path, o = K[i] && a in K[i].nsps, s = t.forceNew || t["force new connection"] || !1 === t.multiplex || o, c;
|
|
1682
|
+
return s ? c = new G(r, t) : (K[i] || (K[i] = new G(r, t)), c = K[i]), n.query && !t.query && (t.query = n.queryKey), c.socket(n.path, t);
|
|
1683
|
+
}
|
|
1684
|
+
Object.assign(q, {
|
|
1685
|
+
Manager: G,
|
|
1686
|
+
Socket: Et,
|
|
1687
|
+
io: q,
|
|
1688
|
+
connect: q
|
|
1527
1689
|
});
|
|
1528
1690
|
//#endregion
|
|
1529
1691
|
//#region src/sdk-socket.ts
|
|
1530
|
-
function
|
|
1692
|
+
function Dt(e) {
|
|
1531
1693
|
let t = e.replace(/\/$/, "");
|
|
1532
1694
|
try {
|
|
1533
1695
|
return `${new URL(t).origin}/sdk`;
|
|
@@ -1535,7 +1697,7 @@ function at(e) {
|
|
|
1535
1697
|
return `${t}/sdk`;
|
|
1536
1698
|
}
|
|
1537
1699
|
}
|
|
1538
|
-
var
|
|
1700
|
+
var Ot = class {
|
|
1539
1701
|
constructor() {
|
|
1540
1702
|
this.socket = null;
|
|
1541
1703
|
}
|
|
@@ -1544,8 +1706,8 @@ var ot = class {
|
|
|
1544
1706
|
}
|
|
1545
1707
|
connect(e) {
|
|
1546
1708
|
this.disconnect();
|
|
1547
|
-
let t =
|
|
1548
|
-
this.socket =
|
|
1709
|
+
let t = Dt(e.baseUrl);
|
|
1710
|
+
this.socket = q(t, {
|
|
1549
1711
|
auth: {
|
|
1550
1712
|
apiKey: e.apiKey,
|
|
1551
1713
|
visitorToken: e.visitorToken
|
|
@@ -1568,41 +1730,182 @@ var ot = class {
|
|
|
1568
1730
|
disconnect() {
|
|
1569
1731
|
this.socket &&= (this.socket.removeAllListeners(), this.socket.disconnect(), null);
|
|
1570
1732
|
}
|
|
1571
|
-
},
|
|
1572
|
-
function
|
|
1733
|
+
}, J = "onedeskpro_visitor_token";
|
|
1734
|
+
function kt(e) {
|
|
1573
1735
|
try {
|
|
1574
1736
|
return typeof window < "u" ? window.localStorage.getItem(e) : null;
|
|
1575
1737
|
} catch {
|
|
1576
1738
|
return null;
|
|
1577
1739
|
}
|
|
1578
1740
|
}
|
|
1579
|
-
function
|
|
1741
|
+
function At(e, t) {
|
|
1580
1742
|
try {
|
|
1581
1743
|
typeof window < "u" && window.localStorage.setItem(e, t);
|
|
1582
1744
|
} catch {}
|
|
1583
1745
|
}
|
|
1584
|
-
function
|
|
1746
|
+
function jt(e) {
|
|
1585
1747
|
try {
|
|
1586
1748
|
typeof window < "u" && window.localStorage.removeItem(e);
|
|
1587
1749
|
} catch {}
|
|
1588
1750
|
}
|
|
1589
|
-
var
|
|
1751
|
+
var Mt = class {
|
|
1590
1752
|
constructor() {
|
|
1591
|
-
this.token = null, this.storageKey =
|
|
1753
|
+
this.token = null, this.storageKey = J;
|
|
1592
1754
|
}
|
|
1593
1755
|
setScope(e) {
|
|
1594
|
-
this.storageKey = e?.trim() ? `${
|
|
1756
|
+
this.storageKey = e?.trim() ? `${J}:${e.trim()}` : J, this.token = kt(this.storageKey);
|
|
1595
1757
|
}
|
|
1596
1758
|
get() {
|
|
1597
|
-
return this.token ??
|
|
1759
|
+
return this.token ?? kt(this.storageKey);
|
|
1598
1760
|
}
|
|
1599
1761
|
set(e) {
|
|
1600
|
-
this.token = e,
|
|
1762
|
+
this.token = e, At(this.storageKey, e);
|
|
1601
1763
|
}
|
|
1602
1764
|
clear() {
|
|
1603
|
-
this.token = null,
|
|
1765
|
+
this.token = null, jt(this.storageKey);
|
|
1766
|
+
}
|
|
1767
|
+
}, Nt = 300, Pt = 250, Ft = 100, It = [
|
|
1768
|
+
"audio/webm;codecs=opus",
|
|
1769
|
+
"audio/webm",
|
|
1770
|
+
"audio/mp4",
|
|
1771
|
+
"audio/ogg;codecs=opus"
|
|
1772
|
+
];
|
|
1773
|
+
function Lt() {
|
|
1774
|
+
return typeof MediaRecorder > "u" || typeof MediaRecorder.isTypeSupported != "function" ? "audio/webm" : It.find((e) => MediaRecorder.isTypeSupported(e)) ?? "audio/webm";
|
|
1775
|
+
}
|
|
1776
|
+
function Rt(e) {
|
|
1777
|
+
let t = e instanceof DOMException ? e.name : "";
|
|
1778
|
+
return t === "NotAllowedError" || t === "PermissionDeniedError" || t === "SecurityError" ? "Microphone access was denied." : t === "NotFoundError" || t === "DevicesNotFoundError" ? "No microphone was found." : "Could not start recording.";
|
|
1779
|
+
}
|
|
1780
|
+
var Y = class e {
|
|
1781
|
+
constructor(e, t = 300) {
|
|
1782
|
+
this.onChange = e, this.maxDurationSeconds = t, this.recorder = null, this.stream = null, this.chunks = [], this.mimeType = "audio/webm", this.startedAt = 0, this.tickTimer = null, this.levelTimer = null, this.maxTimer = null, this.audioContext = null, this.analyser = null, this.snapshot = {
|
|
1783
|
+
state: "idle",
|
|
1784
|
+
elapsedSeconds: 0,
|
|
1785
|
+
level: 0,
|
|
1786
|
+
result: null
|
|
1787
|
+
};
|
|
1788
|
+
}
|
|
1789
|
+
static isSupported() {
|
|
1790
|
+
return typeof navigator < "u" && typeof navigator.mediaDevices?.getUserMedia == "function" && typeof MediaRecorder < "u";
|
|
1791
|
+
}
|
|
1792
|
+
getSnapshot() {
|
|
1793
|
+
return { ...this.snapshot };
|
|
1794
|
+
}
|
|
1795
|
+
async start() {
|
|
1796
|
+
if (!e.isSupported()) throw Error("Voice messages are not supported in this browser.");
|
|
1797
|
+
this.release(), this.chunks = [];
|
|
1798
|
+
let t;
|
|
1799
|
+
try {
|
|
1800
|
+
t = await navigator.mediaDevices.getUserMedia({ audio: !0 });
|
|
1801
|
+
} catch (e) {
|
|
1802
|
+
throw Error(Rt(e));
|
|
1803
|
+
}
|
|
1804
|
+
try {
|
|
1805
|
+
this.mimeType = Lt();
|
|
1806
|
+
let e = new MediaRecorder(t, { mimeType: this.mimeType });
|
|
1807
|
+
e.ondataavailable = (e) => {
|
|
1808
|
+
e.data.size > 0 && this.chunks.push(e.data);
|
|
1809
|
+
}, this.stream = t, this.recorder = e, this.startedAt = Date.now(), e.start(200);
|
|
1810
|
+
} catch (e) {
|
|
1811
|
+
throw t.getTracks().forEach((e) => e.stop()), this.stream = null, this.recorder = null, Error(Rt(e));
|
|
1812
|
+
}
|
|
1813
|
+
this.startLevelMeter(t), this.tickTimer = setInterval(() => {
|
|
1814
|
+
this.update({ elapsedSeconds: Math.floor(this.elapsedMs() / 1e3) });
|
|
1815
|
+
}, Pt), this.maxTimer = setTimeout(() => void this.stop(), this.maxDurationSeconds * 1e3), this.update({
|
|
1816
|
+
state: "recording",
|
|
1817
|
+
elapsedSeconds: 0,
|
|
1818
|
+
level: 0,
|
|
1819
|
+
result: null
|
|
1820
|
+
});
|
|
1821
|
+
}
|
|
1822
|
+
async stop() {
|
|
1823
|
+
let e = this.recorder;
|
|
1824
|
+
if (!e || e.state === "inactive") return this.release(), null;
|
|
1825
|
+
let t = Math.max(1, Math.round(this.elapsedMs() / 1e3));
|
|
1826
|
+
this.clearTimers();
|
|
1827
|
+
let n = await new Promise((t) => {
|
|
1828
|
+
e.onstop = () => {
|
|
1829
|
+
let e = this.chunks;
|
|
1830
|
+
this.chunks = [], t(new Blob(e, { type: g(this.mimeType) }));
|
|
1831
|
+
};
|
|
1832
|
+
try {
|
|
1833
|
+
e.stop();
|
|
1834
|
+
} catch {
|
|
1835
|
+
t(new Blob(this.chunks, { type: g(this.mimeType) }));
|
|
1836
|
+
}
|
|
1837
|
+
});
|
|
1838
|
+
this.releaseMedia();
|
|
1839
|
+
let r = {
|
|
1840
|
+
blob: n,
|
|
1841
|
+
mimeType: g(this.mimeType),
|
|
1842
|
+
durationSeconds: t
|
|
1843
|
+
};
|
|
1844
|
+
return this.update({
|
|
1845
|
+
state: "preview",
|
|
1846
|
+
elapsedSeconds: t,
|
|
1847
|
+
level: 0,
|
|
1848
|
+
result: r
|
|
1849
|
+
}), r;
|
|
1850
|
+
}
|
|
1851
|
+
cancel() {
|
|
1852
|
+
this.release(), this.update({
|
|
1853
|
+
state: "idle",
|
|
1854
|
+
elapsedSeconds: 0,
|
|
1855
|
+
level: 0,
|
|
1856
|
+
result: null
|
|
1857
|
+
});
|
|
1858
|
+
}
|
|
1859
|
+
destroy() {
|
|
1860
|
+
this.release(), this.snapshot = {
|
|
1861
|
+
state: "idle",
|
|
1862
|
+
elapsedSeconds: 0,
|
|
1863
|
+
level: 0,
|
|
1864
|
+
result: null
|
|
1865
|
+
};
|
|
1866
|
+
}
|
|
1867
|
+
update(e) {
|
|
1868
|
+
this.snapshot = {
|
|
1869
|
+
...this.snapshot,
|
|
1870
|
+
...e
|
|
1871
|
+
}, this.onChange({ ...this.snapshot });
|
|
1872
|
+
}
|
|
1873
|
+
elapsedMs() {
|
|
1874
|
+
return this.startedAt > 0 ? Date.now() - this.startedAt : 0;
|
|
1875
|
+
}
|
|
1876
|
+
startLevelMeter(e) {
|
|
1877
|
+
let t = typeof window > "u" ? null : window, n = t?.AudioContext ?? t?.webkitAudioContext;
|
|
1878
|
+
if (n) try {
|
|
1879
|
+
let t = new n(), r = t.createAnalyser();
|
|
1880
|
+
r.fftSize = 256, t.createMediaStreamSource(e).connect(r), t.resume().catch(() => void 0), this.audioContext = t, this.analyser = r;
|
|
1881
|
+
let i = new Uint8Array(r.frequencyBinCount);
|
|
1882
|
+
this.levelTimer = setInterval(() => {
|
|
1883
|
+
r.getByteTimeDomainData(i);
|
|
1884
|
+
let e = 0;
|
|
1885
|
+
for (let t = 0; t < i.length; t++) {
|
|
1886
|
+
let n = ((i[t] ?? 128) - 128) / 128;
|
|
1887
|
+
e += n * n;
|
|
1888
|
+
}
|
|
1889
|
+
this.update({ level: Math.min(1, Math.sqrt(e / i.length) * 3.2) });
|
|
1890
|
+
}, Ft);
|
|
1891
|
+
} catch {}
|
|
1604
1892
|
}
|
|
1605
|
-
|
|
1893
|
+
clearTimers() {
|
|
1894
|
+
this.tickTimer && clearInterval(this.tickTimer), this.levelTimer && clearInterval(this.levelTimer), this.maxTimer && clearTimeout(this.maxTimer), this.tickTimer = null, this.levelTimer = null, this.maxTimer = null;
|
|
1895
|
+
}
|
|
1896
|
+
releaseMedia() {
|
|
1897
|
+
this.stream?.getTracks().forEach((e) => e.stop()), this.stream = null, this.recorder = null, this.analyser = null, this.audioContext &&= (this.audioContext.close().catch(() => void 0), null), this.startedAt = 0;
|
|
1898
|
+
}
|
|
1899
|
+
release() {
|
|
1900
|
+
if (this.clearTimers(), this.recorder && this.recorder.state !== "inactive") {
|
|
1901
|
+
this.recorder.onstop = null;
|
|
1902
|
+
try {
|
|
1903
|
+
this.recorder.stop();
|
|
1904
|
+
} catch {}
|
|
1905
|
+
}
|
|
1906
|
+
this.chunks = [], this.releaseMedia();
|
|
1907
|
+
}
|
|
1908
|
+
}, X = [
|
|
1606
1909
|
{
|
|
1607
1910
|
iso: "BD",
|
|
1608
1911
|
name: "Bangladesh",
|
|
@@ -1969,8 +2272,8 @@ var ut = class {
|
|
|
1969
2272
|
dial: "977",
|
|
1970
2273
|
flag: "🇳🇵"
|
|
1971
2274
|
}
|
|
1972
|
-
],
|
|
1973
|
-
function
|
|
2275
|
+
], zt = X.find((e) => e.iso === "BD") ?? X[0];
|
|
2276
|
+
function Bt(e, t) {
|
|
1974
2277
|
let n = t.trim();
|
|
1975
2278
|
if (n.startsWith("+")) {
|
|
1976
2279
|
let e = n.replace(/\D/g, "");
|
|
@@ -1981,7 +2284,8 @@ function ft(e, t) {
|
|
|
1981
2284
|
}
|
|
1982
2285
|
//#endregion
|
|
1983
2286
|
//#region src/widget/styles.ts
|
|
1984
|
-
|
|
2287
|
+
var Vt = "(max-width: 640px), (max-height: 500px) and (pointer: coarse)";
|
|
2288
|
+
function Ht(e, t) {
|
|
1985
2289
|
let n = `
|
|
1986
2290
|
--ttcb-bg: #ffffff;
|
|
1987
2291
|
--ttcb-bg-secondary: #f3f4f6;
|
|
@@ -2048,6 +2352,7 @@ function pt(e, t) {
|
|
|
2048
2352
|
transition: opacity 0.2s ease, transform 0.25s ease, height 0.2s ease;
|
|
2049
2353
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
2050
2354
|
}
|
|
2355
|
+
.ttcb-panel:focus { outline: none; }
|
|
2051
2356
|
.ttcb-panel.ttcb-mode-chat {
|
|
2052
2357
|
height: 560px;
|
|
2053
2358
|
}
|
|
@@ -2196,7 +2501,7 @@ function pt(e, t) {
|
|
|
2196
2501
|
|
|
2197
2502
|
.ttcb-msg { display: flex; gap: 8px; max-width: 100%; }
|
|
2198
2503
|
.ttcb-msg.human { flex-direction: row-reverse; }
|
|
2199
|
-
.ttcb-msg-body { display: flex; flex-direction: column; gap: 3px; max-width: 78%; }
|
|
2504
|
+
.ttcb-msg-body { display: flex; flex-direction: column; gap: 3px; max-width: 78%; min-width: 0; }
|
|
2200
2505
|
.ttcb-msg.human .ttcb-msg-body { align-items: flex-end; }
|
|
2201
2506
|
.ttcb-msg-label {
|
|
2202
2507
|
font-size: 11px; font-weight: 600; color: var(--ttcb-text-muted);
|
|
@@ -2466,29 +2771,234 @@ function pt(e, t) {
|
|
|
2466
2771
|
flex-shrink: 0;
|
|
2467
2772
|
}
|
|
2468
2773
|
|
|
2774
|
+
.ttcb-form { align-items: center; }
|
|
2775
|
+
.ttcb-attach { position: relative; flex-shrink: 0; }
|
|
2776
|
+
.ttcb-attach-btn {
|
|
2777
|
+
width: 38px; height: 38px; border-radius: 8px;
|
|
2778
|
+
border: 1px solid var(--ttcb-border);
|
|
2779
|
+
background: var(--ttcb-input-bg); color: var(--ttcb-text-muted);
|
|
2780
|
+
cursor: pointer; display: flex; align-items: center; justify-content: center;
|
|
2781
|
+
transition: color 0.15s, border-color 0.15s;
|
|
2782
|
+
}
|
|
2783
|
+
.ttcb-attach-btn:hover { color: var(--ttcb-text); }
|
|
2784
|
+
.ttcb-attach-btn:focus-visible { border-color: ${e}; outline: none; }
|
|
2785
|
+
.ttcb-attach-btn:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
2786
|
+
.ttcb-attach-btn svg { width: 18px; height: 18px; }
|
|
2787
|
+
.ttcb-attach-menu {
|
|
2788
|
+
display: none; position: absolute; left: 0; bottom: calc(100% + 8px);
|
|
2789
|
+
min-width: 170px; padding: 4px;
|
|
2790
|
+
background: var(--ttcb-bg);
|
|
2791
|
+
border: 1px solid var(--ttcb-border); border-radius: 12px;
|
|
2792
|
+
box-shadow: 0 8px 24px rgba(0,0,0,0.12);
|
|
2793
|
+
z-index: 1;
|
|
2794
|
+
}
|
|
2795
|
+
.ttcb-attach-menu.open { display: flex; flex-direction: column; }
|
|
2796
|
+
.ttcb-attach-item {
|
|
2797
|
+
display: flex; align-items: center; gap: 10px;
|
|
2798
|
+
padding: 9px 10px; border: none; border-radius: 8px;
|
|
2799
|
+
background: none; cursor: pointer;
|
|
2800
|
+
font-family: inherit; font-size: 13px; color: var(--ttcb-text);
|
|
2801
|
+
text-align: left; width: 100%;
|
|
2802
|
+
}
|
|
2803
|
+
.ttcb-attach-item:hover, .ttcb-attach-item:focus-visible {
|
|
2804
|
+
background: var(--ttcb-bg-secondary); outline: none;
|
|
2805
|
+
}
|
|
2806
|
+
.ttcb-attach-item svg { width: 16px; height: 16px; color: var(--ttcb-text-muted); flex-shrink: 0; }
|
|
2807
|
+
.ttcb-file-input { display: none; }
|
|
2808
|
+
.ttcb-form.hidden { display: none; }
|
|
2809
|
+
.ttcb-mic-btn {
|
|
2810
|
+
width: 38px; height: 38px; border-radius: 8px; flex-shrink: 0;
|
|
2811
|
+
border: 1px solid var(--ttcb-border);
|
|
2812
|
+
background: var(--ttcb-input-bg); color: var(--ttcb-text-muted);
|
|
2813
|
+
cursor: pointer; display: flex; align-items: center; justify-content: center;
|
|
2814
|
+
transition: color 0.15s, border-color 0.15s;
|
|
2815
|
+
}
|
|
2816
|
+
.ttcb-mic-btn:hover { color: var(--ttcb-text); }
|
|
2817
|
+
.ttcb-mic-btn:focus-visible { border-color: ${e}; outline: none; }
|
|
2818
|
+
.ttcb-mic-btn:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
2819
|
+
.ttcb-mic-btn svg { width: 18px; height: 18px; }
|
|
2820
|
+
|
|
2821
|
+
.ttcb-voice-bar, .ttcb-voice-preview {
|
|
2822
|
+
display: none; align-items: center; gap: 8px;
|
|
2823
|
+
padding: 6px 8px;
|
|
2824
|
+
border: 1px solid var(--ttcb-border); border-radius: 10px;
|
|
2825
|
+
background: var(--ttcb-input-bg);
|
|
2826
|
+
}
|
|
2827
|
+
.ttcb-voice-bar.visible, .ttcb-voice-preview.visible { display: flex; }
|
|
2828
|
+
.ttcb-voice-dot {
|
|
2829
|
+
width: 10px; height: 10px; border-radius: 50%; background: #ef4444; flex-shrink: 0;
|
|
2830
|
+
animation: ttcb-pulse 1.1s ease-in-out infinite;
|
|
2831
|
+
}
|
|
2832
|
+
@keyframes ttcb-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }
|
|
2833
|
+
.ttcb-voice-time {
|
|
2834
|
+
font-size: 13px; font-weight: 500; color: var(--ttcb-text);
|
|
2835
|
+
font-variant-numeric: tabular-nums; flex-shrink: 0;
|
|
2836
|
+
}
|
|
2837
|
+
.ttcb-voice-meter {
|
|
2838
|
+
flex: 1; min-width: 0; height: 6px; border-radius: 999px;
|
|
2839
|
+
background: var(--ttcb-bg-secondary); overflow: hidden;
|
|
2840
|
+
}
|
|
2841
|
+
.ttcb-voice-level {
|
|
2842
|
+
display: block; height: 100%; width: 4%; border-radius: 999px;
|
|
2843
|
+
background: #ef4444; transition: width 0.1s linear;
|
|
2844
|
+
}
|
|
2845
|
+
.ttcb-voice-audio { flex: 1; min-width: 0; height: 32px; }
|
|
2846
|
+
.ttcb-voice-btn {
|
|
2847
|
+
width: 32px; height: 32px; border-radius: 8px; flex-shrink: 0;
|
|
2848
|
+
border: 1px solid var(--ttcb-border);
|
|
2849
|
+
background: var(--ttcb-bg); color: var(--ttcb-text-muted);
|
|
2850
|
+
cursor: pointer; display: flex; align-items: center; justify-content: center;
|
|
2851
|
+
}
|
|
2852
|
+
.ttcb-voice-btn:hover { color: var(--ttcb-text); }
|
|
2853
|
+
.ttcb-voice-btn.primary { background: ${e}; border-color: ${e}; color: #fff; }
|
|
2854
|
+
.ttcb-voice-btn.primary:hover { opacity: 0.9; color: #fff; }
|
|
2855
|
+
.ttcb-voice-btn svg { width: 15px; height: 15px; }
|
|
2856
|
+
.ttcb-voice-btn.primary svg { fill: #fff; }
|
|
2857
|
+
.ttcb-voice-btn.primary svg[fill="none"] { fill: none; }
|
|
2858
|
+
|
|
2859
|
+
.ttcb-pending-tray { display: none; gap: 8px; flex-wrap: wrap; padding-bottom: 10px; }
|
|
2860
|
+
.ttcb-pending-tray.visible { display: flex; }
|
|
2861
|
+
.ttcb-pending-item {
|
|
2862
|
+
display: flex; align-items: center; gap: 8px; max-width: 100%;
|
|
2863
|
+
padding: 5px 6px 5px 5px;
|
|
2864
|
+
border: 1px solid var(--ttcb-border); border-radius: 10px;
|
|
2865
|
+
background: var(--ttcb-bg-secondary);
|
|
2866
|
+
font-size: 12px; color: var(--ttcb-text);
|
|
2867
|
+
}
|
|
2868
|
+
.ttcb-pending-thumb {
|
|
2869
|
+
width: 36px; height: 36px; border-radius: 6px; object-fit: cover;
|
|
2870
|
+
flex-shrink: 0; background: var(--ttcb-bg);
|
|
2871
|
+
}
|
|
2872
|
+
.ttcb-pending-icon {
|
|
2873
|
+
width: 36px; height: 36px; border-radius: 6px; flex-shrink: 0;
|
|
2874
|
+
display: flex; align-items: center; justify-content: center;
|
|
2875
|
+
background: var(--ttcb-bg); color: var(--ttcb-text-muted);
|
|
2876
|
+
}
|
|
2877
|
+
.ttcb-pending-icon svg { width: 18px; height: 18px; }
|
|
2878
|
+
.ttcb-pending-name { max-width: 130px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
2879
|
+
.ttcb-pending-remove {
|
|
2880
|
+
width: 22px; height: 22px; border-radius: 50%; border: none; flex-shrink: 0;
|
|
2881
|
+
background: var(--ttcb-bg); color: var(--ttcb-text-muted); cursor: pointer;
|
|
2882
|
+
display: flex; align-items: center; justify-content: center;
|
|
2883
|
+
}
|
|
2884
|
+
.ttcb-pending-remove:hover { color: var(--ttcb-text); }
|
|
2885
|
+
.ttcb-pending-remove svg { width: 12px; height: 12px; fill: currentColor; }
|
|
2886
|
+
.ttcb-compose-error { display: none; font-size: 12px; color: #ef4444; padding-bottom: 8px; }
|
|
2887
|
+
.ttcb-compose-error.visible { display: block; }
|
|
2888
|
+
|
|
2889
|
+
.ttcb-attachments { display: flex; flex-direction: column; gap: 6px; max-width: 100%; }
|
|
2890
|
+
.ttcb-msg.human .ttcb-attachments { align-items: flex-end; }
|
|
2891
|
+
.ttcb-attachment-image {
|
|
2892
|
+
display: block; max-width: 220px; border-radius: 12px; overflow: hidden;
|
|
2893
|
+
border: 1px solid var(--ttcb-border); background: var(--ttcb-bg-secondary);
|
|
2894
|
+
}
|
|
2895
|
+
.ttcb-attachment-image img { display: block; max-width: 100%; max-height: 240px; object-fit: cover; }
|
|
2896
|
+
.ttcb-attachment-video { display: block; max-width: 220px; border-radius: 12px; background: #000; }
|
|
2897
|
+
.ttcb-attachment-voice { display: flex; flex-direction: column; gap: 2px; width: 220px; max-width: 100%; }
|
|
2898
|
+
.ttcb-attachment-audio { display: block; width: 100%; height: 36px; }
|
|
2899
|
+
.ttcb-attachment-duration { font-size: 11px; color: var(--ttcb-text-muted); padding-left: 2px; }
|
|
2900
|
+
.ttcb-attachment-file {
|
|
2901
|
+
display: flex; align-items: center; gap: 10px;
|
|
2902
|
+
padding: 8px 10px; max-width: 240px;
|
|
2903
|
+
border: 1px solid var(--ttcb-border); border-radius: 12px;
|
|
2904
|
+
background: var(--ttcb-bg); color: var(--ttcb-text);
|
|
2905
|
+
text-decoration: none; font-size: 13px;
|
|
2906
|
+
}
|
|
2907
|
+
a.ttcb-attachment-file:hover { border-color: ${e}; }
|
|
2908
|
+
.ttcb-attachment-icon {
|
|
2909
|
+
width: 32px; height: 32px; border-radius: 8px; flex-shrink: 0;
|
|
2910
|
+
display: flex; align-items: center; justify-content: center;
|
|
2911
|
+
background: var(--ttcb-bg-secondary); color: var(--ttcb-text-muted);
|
|
2912
|
+
}
|
|
2913
|
+
.ttcb-attachment-icon svg { width: 16px; height: 16px; }
|
|
2914
|
+
.ttcb-attachment-meta { display: flex; flex-direction: column; min-width: 0; }
|
|
2915
|
+
.ttcb-attachment-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 500; }
|
|
2916
|
+
.ttcb-attachment-size { font-size: 11px; color: var(--ttcb-text-muted); }
|
|
2917
|
+
.ttcb-msg.ttcb-pending .ttcb-attachments, .ttcb-msg.ttcb-pending .ttcb-bubble { opacity: 0.6; }
|
|
2918
|
+
.ttcb-msg-status { font-size: 11px; color: var(--ttcb-text-muted); padding: 0 2px; }
|
|
2919
|
+
|
|
2469
2920
|
.ttcb-footer.hidden, .ttcb-messages.hidden { display: none; }
|
|
2470
2921
|
|
|
2471
|
-
@media
|
|
2472
|
-
.ttcb-
|
|
2473
|
-
.ttcb-fab.bottom-
|
|
2474
|
-
|
|
2922
|
+
@media ${Vt} {
|
|
2923
|
+
.ttcb-fab.bottom-right { right: 16px; bottom: calc(16px + env(safe-area-inset-bottom, 0px)); }
|
|
2924
|
+
.ttcb-fab.bottom-left { left: 16px; bottom: calc(16px + env(safe-area-inset-bottom, 0px)); }
|
|
2925
|
+
/* The open panel covers the launcher; its own close button takes over. */
|
|
2926
|
+
.ttcb-fab.ttcb-open { display: none; }
|
|
2927
|
+
|
|
2928
|
+
/*
|
|
2929
|
+
* Full screen. Offsets instead of 100vw so a scrollbar never adds width, and
|
|
2930
|
+
* pinned to the visual viewport (--ttcb-vv-*, set by the widget) so the
|
|
2931
|
+
* on-screen keyboard shrinks the panel instead of pushing it off screen.
|
|
2932
|
+
*/
|
|
2933
|
+
.ttcb-panel,
|
|
2934
|
+
.ttcb-panel.bottom-right,
|
|
2935
|
+
.ttcb-panel.bottom-left,
|
|
2936
|
+
.ttcb-panel.ttcb-mode-chat,
|
|
2937
|
+
.ttcb-panel.ttcb-mode-form,
|
|
2938
|
+
.ttcb-panel.ttcb-mode-compact {
|
|
2939
|
+
top: var(--ttcb-vv-top, 0px);
|
|
2940
|
+
left: var(--ttcb-vv-left, 0px);
|
|
2941
|
+
right: auto;
|
|
2942
|
+
bottom: auto;
|
|
2943
|
+
width: var(--ttcb-vv-width, 100%);
|
|
2944
|
+
height: var(--ttcb-vv-height, 100%);
|
|
2945
|
+
max-width: none;
|
|
2946
|
+
max-height: none;
|
|
2947
|
+
border: none;
|
|
2948
|
+
border-radius: 0;
|
|
2949
|
+
box-shadow: none;
|
|
2950
|
+
transition: opacity 0.2s ease, transform 0.25s ease;
|
|
2951
|
+
-webkit-text-size-adjust: 100%;
|
|
2952
|
+
text-size-adjust: 100%;
|
|
2953
|
+
}
|
|
2954
|
+
.ttcb-header {
|
|
2955
|
+
padding-top: max(14px, env(safe-area-inset-top, 0px));
|
|
2956
|
+
padding-left: max(16px, env(safe-area-inset-left, 0px));
|
|
2957
|
+
padding-right: max(16px, env(safe-area-inset-right, 0px));
|
|
2958
|
+
}
|
|
2959
|
+
.ttcb-close-btn { padding: 8px; }
|
|
2960
|
+
.ttcb-close-btn svg { width: 22px; height: 22px; }
|
|
2961
|
+
.ttcb-footer {
|
|
2962
|
+
padding-bottom: max(12px, env(safe-area-inset-bottom, 0px));
|
|
2963
|
+
padding-left: max(12px, env(safe-area-inset-left, 0px));
|
|
2964
|
+
padding-right: max(12px, env(safe-area-inset-right, 0px));
|
|
2965
|
+
}
|
|
2966
|
+
.ttcb-messages {
|
|
2967
|
+
overflow-x: hidden;
|
|
2968
|
+
overscroll-behavior: contain;
|
|
2969
|
+
}
|
|
2970
|
+
.ttcb-panel.ttcb-mode-form .ttcb-identify.visible {
|
|
2971
|
+
flex: 1 1 auto;
|
|
2972
|
+
min-height: 0;
|
|
2973
|
+
overflow-x: hidden;
|
|
2974
|
+
overscroll-behavior: contain;
|
|
2975
|
+
padding-bottom: max(14px, env(safe-area-inset-bottom, 0px));
|
|
2976
|
+
}
|
|
2977
|
+
.ttcb-country-list { overscroll-behavior: contain; }
|
|
2978
|
+
.ttcb-field-hint { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
|
|
2979
|
+
|
|
2980
|
+
/* iOS zooms the page into any field under 16px, then leaves it zoomed and scrollable sideways. */
|
|
2981
|
+
.ttcb-input,
|
|
2982
|
+
.ttcb-identify-input,
|
|
2983
|
+
.ttcb-phone-national,
|
|
2984
|
+
.ttcb-country-search { font-size: 16px; }
|
|
2475
2985
|
}
|
|
2476
2986
|
`;
|
|
2477
2987
|
}
|
|
2478
2988
|
//#endregion
|
|
2479
2989
|
//#region src/widget/render.ts
|
|
2480
|
-
function
|
|
2990
|
+
function Ut(e) {
|
|
2481
2991
|
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
2482
2992
|
}
|
|
2483
|
-
function
|
|
2993
|
+
function Wt(e) {
|
|
2484
2994
|
let t = [], n = e.replace(/```[\w]*\n?([\s\S]*?)```/g, (e, n) => {
|
|
2485
2995
|
let r = t.length;
|
|
2486
|
-
return t.push(`<pre><code>${
|
|
2996
|
+
return t.push(`<pre><code>${Ut(n.trim())}</code></pre>`), `\x04${r}\x05`;
|
|
2487
2997
|
});
|
|
2488
2998
|
n = n.replace(/`([^`\n]+)`/g, (e, n) => {
|
|
2489
2999
|
let r = t.length;
|
|
2490
|
-
return t.push(`<code>${
|
|
2491
|
-
}), n =
|
|
3000
|
+
return t.push(`<code>${Ut(n)}</code>`), `\x02${r}\x03`;
|
|
3001
|
+
}), n = Ut(n);
|
|
2492
3002
|
let r = n.split("\n"), i = [], a = "", o = () => {
|
|
2493
3003
|
a &&= (i.push(`</${a}>`), "");
|
|
2494
3004
|
};
|
|
@@ -2505,88 +3015,172 @@ function mt(e) {
|
|
|
2505
3015
|
}).join("") : "";
|
|
2506
3016
|
}).filter(Boolean).join(""), n = n.replace(/\x04(\d+)\x05/g, (e, n) => t[+n] ?? "").replace(/\x02(\d+)\x03/g, (e, n) => t[+n] ?? ""), n;
|
|
2507
3017
|
}
|
|
2508
|
-
function
|
|
3018
|
+
function Gt() {
|
|
2509
3019
|
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"14\"/>\n <line x1=\"9\" y1=\"11\" x2=\"15\" y2=\"11\"/>\n </svg>";
|
|
2510
3020
|
}
|
|
2511
|
-
function
|
|
3021
|
+
function Kt() {
|
|
2512
3022
|
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 2H4C2.9 2 2 2.9 2 4v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z\"/>\n </svg>";
|
|
2513
3023
|
}
|
|
2514
|
-
function
|
|
3024
|
+
function qt() {
|
|
2515
3025
|
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n </svg>";
|
|
2516
3026
|
}
|
|
2517
|
-
function
|
|
3027
|
+
function Jt() {
|
|
2518
3028
|
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\"/>\n </svg>";
|
|
2519
3029
|
}
|
|
2520
|
-
function
|
|
3030
|
+
function Z() {
|
|
2521
3031
|
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 9V7c0-1.1-.9-2-2-2h-3c0-1.66-1.34-3-3-3S9 3.34 9 5H6c-1.1 0-2 .9-2 2v2c-1.66 0-3 1.34-3 3s1.34 3 3 3v4c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-4c1.66 0 3-1.34 3-3s-1.34-3-3-3zm-2 10H6V7h12v12zm-9-6c-.83 0-1.5-.67-1.5-1.5S8.17 10 9 10s1.5.67 1.5 1.5S9.83 13 9 13zm6 0c-.83 0-1.5-.67-1.5-1.5S14.17 10 15 10s1.5.67 1.5 1.5S15.83 13 15 13z\"/>\n </svg>";
|
|
2522
3032
|
}
|
|
2523
|
-
function
|
|
3033
|
+
function Yt() {
|
|
2524
3034
|
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\"/>\n </svg>";
|
|
2525
3035
|
}
|
|
2526
|
-
function
|
|
3036
|
+
function Xt() {
|
|
2527
3037
|
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"12\" cy=\"7\" r=\"4\"/>\n </svg>";
|
|
2528
3038
|
}
|
|
2529
|
-
function
|
|
3039
|
+
function Zt() {
|
|
2530
3040
|
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/>\n <polyline points=\"22,6 12,13 2,6\"/>\n </svg>";
|
|
2531
3041
|
}
|
|
2532
|
-
function
|
|
3042
|
+
function Qt() {
|
|
2533
3043
|
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"6 9 12 15 18 9\"/>\n </svg>";
|
|
2534
3044
|
}
|
|
2535
|
-
function
|
|
3045
|
+
function $t() {
|
|
2536
3046
|
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n <polyline points=\"12 5 19 12 12 19\"/>\n </svg>";
|
|
2537
3047
|
}
|
|
2538
|
-
function
|
|
3048
|
+
function en() {
|
|
2539
3049
|
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>\n <polyline points=\"9 12 11 14 15 10\"/>\n </svg>";
|
|
2540
3050
|
}
|
|
2541
|
-
function
|
|
3051
|
+
function tn() {
|
|
2542
3052
|
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\"/>\n <path d=\"M9 12l2 2 4-4\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>";
|
|
2543
3053
|
}
|
|
2544
|
-
function
|
|
3054
|
+
function nn() {
|
|
2545
3055
|
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#F59E0B\" d=\"M8 2.5l1.1 2.2 2.4.3-1.7 1.7.4 2.4L8 8l-2.2 1.1.4-2.4L4.5 5l2.4-.3L8 2.5z\"/>\n <path fill=\"#F59E0B\" d=\"M16 3.5l.8 1.6 1.8.2-1.3 1.3.3 1.8L16 7.5l-1.6.9.3-1.8-1.3-1.3 1.8-.2L16 3.5z\"/>\n <path fill=\"#FBBF24\" d=\"M12 11.5l1 2 2.2.3-1.6 1.6.4 2.2-2-1.1-2 1.1.4-2.2-1.6-1.6 2.2-.3 1-2z\"/>\n </svg>";
|
|
2546
3056
|
}
|
|
2547
|
-
function
|
|
3057
|
+
function rn() {
|
|
2548
3058
|
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/>\n <circle cx=\"9\" cy=\"7\" r=\"4\"/>\n <path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"/>\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\"/>\n </svg>";
|
|
2549
3059
|
}
|
|
2550
|
-
function
|
|
2551
|
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
3060
|
+
function an() {
|
|
3061
|
+
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/>\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/>\n </svg>";
|
|
3062
|
+
}
|
|
3063
|
+
function on() {
|
|
3064
|
+
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"/>\n </svg>";
|
|
3065
|
+
}
|
|
3066
|
+
function sn() {
|
|
3067
|
+
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/>\n <polyline points=\"21 15 16 10 5 21\"/>\n </svg>";
|
|
3068
|
+
}
|
|
3069
|
+
function cn() {
|
|
3070
|
+
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"/>\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/>\n <line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/>\n <line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/>\n </svg>";
|
|
3071
|
+
}
|
|
3072
|
+
function ln() {
|
|
3073
|
+
return "<svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\" fill=\"currentColor\"/>\n </svg>";
|
|
3074
|
+
}
|
|
3075
|
+
function un() {
|
|
3076
|
+
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3 6 5 6 21 6\"/>\n <path d=\"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6\"/>\n <path d=\"M10 11v6\"/>\n <path d=\"M14 11v6\"/>\n <path d=\"M9 6V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2\"/>\n </svg>";
|
|
3077
|
+
}
|
|
3078
|
+
function dn() {
|
|
3079
|
+
return "<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/>\n <polyline points=\"14 2 14 8 20 8\"/>\n </svg>";
|
|
3080
|
+
}
|
|
3081
|
+
function fn(e) {
|
|
3082
|
+
let t = f(e.url) ? e.url : "", n = e.type.toLowerCase();
|
|
3083
|
+
if (t && n.startsWith("image/")) {
|
|
3084
|
+
let n = document.createElement("a");
|
|
3085
|
+
n.className = "ttcb-attachment ttcb-attachment-image", n.href = t, n.target = "_blank", n.rel = "noopener noreferrer", n.setAttribute("aria-label", `Open ${e.fileName}`);
|
|
3086
|
+
let r = document.createElement("img");
|
|
3087
|
+
return r.src = t, r.alt = e.fileName, r.loading = "lazy", n.appendChild(r), n;
|
|
3088
|
+
}
|
|
3089
|
+
if (t && n.startsWith("video/")) {
|
|
3090
|
+
let n = document.createElement("video");
|
|
3091
|
+
return n.className = "ttcb-attachment ttcb-attachment-video", n.controls = !0, n.preload = "metadata", n.src = t, n.setAttribute("aria-label", e.fileName), n;
|
|
3092
|
+
}
|
|
3093
|
+
if (t && n.startsWith("audio/")) {
|
|
3094
|
+
let n = document.createElement("div");
|
|
3095
|
+
n.className = "ttcb-attachment ttcb-attachment-voice";
|
|
3096
|
+
let r = document.createElement("audio");
|
|
3097
|
+
if (r.className = "ttcb-attachment-audio", r.controls = !0, r.preload = "metadata", r.src = t, r.setAttribute("aria-label", e.fileName), n.appendChild(r), typeof e.durationSeconds == "number" && e.durationSeconds > 0) {
|
|
3098
|
+
let t = document.createElement("span");
|
|
3099
|
+
t.className = "ttcb-attachment-duration", t.textContent = _(e.durationSeconds), n.appendChild(t);
|
|
3100
|
+
}
|
|
3101
|
+
return n;
|
|
3102
|
+
}
|
|
3103
|
+
let r = document.createElement(t ? "a" : "div");
|
|
3104
|
+
r.className = "ttcb-attachment ttcb-attachment-file", r instanceof HTMLAnchorElement && (r.href = t, r.target = "_blank", r.rel = "noopener noreferrer");
|
|
3105
|
+
let i = document.createElement("span");
|
|
3106
|
+
i.className = "ttcb-attachment-icon", i.setAttribute("aria-hidden", "true"), i.innerHTML = dn();
|
|
3107
|
+
let a = document.createElement("span");
|
|
3108
|
+
a.className = "ttcb-attachment-meta";
|
|
3109
|
+
let o = document.createElement("span");
|
|
3110
|
+
o.className = "ttcb-attachment-name", o.textContent = e.fileName, a.appendChild(o);
|
|
3111
|
+
let s = te(e.size);
|
|
3112
|
+
if (s) {
|
|
2557
3113
|
let e = document.createElement("span");
|
|
2558
|
-
e.className = "ttcb-
|
|
3114
|
+
e.className = "ttcb-attachment-size", e.textContent = s, a.appendChild(e);
|
|
2559
3115
|
}
|
|
3116
|
+
return r.appendChild(i), r.appendChild(a), r;
|
|
3117
|
+
}
|
|
3118
|
+
function pn(e) {
|
|
3119
|
+
let { type: t, content: n } = e, r = e.attachments ?? [], i = document.createElement("div");
|
|
3120
|
+
i.className = `ttcb-msg ${t}`, e.pending && i.classList.add("ttcb-pending");
|
|
2560
3121
|
let a = document.createElement("div");
|
|
2561
|
-
|
|
3122
|
+
a.className = "ttcb-msg-avatar", a.innerHTML = t === "human" ? Yt() : t === "agent" ? Xt() : Z();
|
|
3123
|
+
let o = document.createElement("div");
|
|
3124
|
+
if (o.className = "ttcb-msg-body", t === "agent") {
|
|
3125
|
+
let e = document.createElement("span");
|
|
3126
|
+
e.className = "ttcb-msg-label", e.textContent = "Agent", o.appendChild(e);
|
|
3127
|
+
}
|
|
3128
|
+
if (r.length > 0) {
|
|
3129
|
+
let e = document.createElement("div");
|
|
3130
|
+
e.className = "ttcb-attachments";
|
|
3131
|
+
for (let t of r) e.appendChild(fn(t));
|
|
3132
|
+
o.appendChild(e);
|
|
3133
|
+
}
|
|
3134
|
+
if (r.length === 0 || !re(n, r)) {
|
|
3135
|
+
let e = document.createElement("div");
|
|
3136
|
+
e.className = "ttcb-bubble", t === "human" ? e.textContent = n : e.innerHTML = Wt(n), o.appendChild(e);
|
|
3137
|
+
}
|
|
3138
|
+
if (e.pending) {
|
|
3139
|
+
let e = document.createElement("span");
|
|
3140
|
+
e.className = "ttcb-msg-status", e.textContent = "Uploading…", o.appendChild(e);
|
|
3141
|
+
}
|
|
3142
|
+
return i.appendChild(a), i.appendChild(o), i;
|
|
2562
3143
|
}
|
|
2563
|
-
function
|
|
3144
|
+
function mn() {
|
|
2564
3145
|
let e = document.createElement("div");
|
|
2565
3146
|
e.className = "ttcb-msg ai", e.id = "ttcb-typing";
|
|
2566
3147
|
let t = document.createElement("div");
|
|
2567
|
-
t.className = "ttcb-msg-avatar", t.innerHTML =
|
|
3148
|
+
t.className = "ttcb-msg-avatar", t.innerHTML = Z();
|
|
2568
3149
|
let n = document.createElement("div");
|
|
2569
3150
|
return n.className = "ttcb-typing", n.innerHTML = "<span></span><span></span><span></span>", e.appendChild(t), e.appendChild(n), e;
|
|
2570
3151
|
}
|
|
2571
3152
|
//#endregion
|
|
2572
3153
|
//#region src/widget/widget.ts
|
|
2573
|
-
var
|
|
3154
|
+
var hn = [
|
|
3155
|
+
"image/jpeg",
|
|
3156
|
+
"image/png",
|
|
3157
|
+
"image/gif",
|
|
3158
|
+
"video/mp4",
|
|
3159
|
+
"video/webm",
|
|
3160
|
+
"audio/ogg",
|
|
3161
|
+
"audio/mpeg",
|
|
3162
|
+
"audio/wav",
|
|
3163
|
+
"audio/x-m4a",
|
|
3164
|
+
"audio/aac",
|
|
3165
|
+
"audio/opus",
|
|
3166
|
+
"application/pdf",
|
|
3167
|
+
"text/csv"
|
|
3168
|
+
].join(","), gn = "image/jpeg,image/png,image/gif", _n = class {
|
|
2574
3169
|
constructor(e, t) {
|
|
2575
|
-
this.selectedCountry =
|
|
3170
|
+
this.stopViewportSync = null, this.pendingFiles = [], this.attachMenuOpen = !1, this.recorder = null, this.voicePreviewUrl = "", this.selectedCountry = zt, this.countryOpen = !1, this.isOpen = !1, this.destroyed = !1, this.position = e.position ?? "bottom-right", this.callbacks = t, this.autoOpen = e.autoOpen === !0, this.mount(e);
|
|
2576
3171
|
}
|
|
2577
3172
|
mount(e) {
|
|
2578
3173
|
this.host = document.createElement("div"), this.host.id = "onedeskpro-chatbot-host", this.host.style.display = "none", this.shadow = this.host.attachShadow({ mode: "closed" });
|
|
2579
3174
|
let t = document.createElement("style");
|
|
2580
|
-
t.textContent =
|
|
2581
|
-
let n = document.createElement("
|
|
2582
|
-
n.className =
|
|
2583
|
-
let r = document.createElement("form");
|
|
2584
|
-
r.className = "ttcb-form", r.addEventListener("submit", (e) => {
|
|
3175
|
+
t.textContent = Ht(e.primaryColor ?? "#2563EB", e.theme ?? "auto"), this.shadow.appendChild(t), this.fab = document.createElement("button"), this.fab.className = `ttcb-fab ${this.position}`, this.fab.setAttribute("aria-label", "Open chat"), this.fab.innerHTML = Kt(), this.fab.addEventListener("click", () => this.toggle()), this.shadow.appendChild(this.fab), this.panel = document.createElement("div"), this.panel.className = `ttcb-panel ${this.position} hidden ttcb-mode-compact`, this.panel.tabIndex = -1, this.panel.setAttribute("role", "dialog"), this.panel.setAttribute("aria-modal", "true"), this.panel.setAttribute("aria-label", e.chatbotName ?? "AI Assistant"), this.panel.appendChild(this.buildHeader(e)), this.identifyContainer = document.createElement("div"), this.identifyContainer.className = "ttcb-identify", this.buildIdentifyForm(this.identifyContainer), this.panel.appendChild(this.identifyContainer), this.messagesContainer = document.createElement("div"), this.messagesContainer.className = "ttcb-messages", this.messagesContainer.setAttribute("aria-live", "polite"), this.messagesContainer.setAttribute("aria-label", "Chat messages"), this.panel.appendChild(this.messagesContainer), this.modeBanner = document.createElement("div"), this.modeBanner.className = "ttcb-mode-banner", this.modeBanner.setAttribute("role", "status"), this.panel.appendChild(this.modeBanner), this.footer = document.createElement("div"), this.footer.className = "ttcb-footer", this.pendingTray = document.createElement("div"), this.pendingTray.className = "ttcb-pending-tray", this.pendingTray.setAttribute("role", "list"), this.pendingTray.setAttribute("aria-label", "Files to send"), this.footer.appendChild(this.pendingTray), this.composeError = document.createElement("p"), this.composeError.className = "ttcb-compose-error", this.composeError.setAttribute("role", "alert"), this.footer.appendChild(this.composeError), this.footer.appendChild(this.buildVoiceBar()), this.footer.appendChild(this.buildVoicePreview());
|
|
3176
|
+
let n = document.createElement("form");
|
|
3177
|
+
n.className = "ttcb-form", n.addEventListener("submit", (e) => {
|
|
2585
3178
|
e.preventDefault(), this.handleSend();
|
|
2586
|
-
}), this.input = document.createElement("input"), this.input.type = "text", this.input.className = "ttcb-input", this.input.placeholder = e.placeholder ?? "Type your message…", this.input.setAttribute("aria-label", "Message input"), this.input.setAttribute("autocomplete", "off"), this.sendBtn = document.createElement("button"), this.sendBtn.type = "submit", this.sendBtn.className = "ttcb-send-btn", this.sendBtn.innerHTML =
|
|
2587
|
-
if (!this.countryOpen) return;
|
|
3179
|
+
}), this.composeForm = n, n.appendChild(this.buildAttachControls()), this.input = document.createElement("input"), this.input.type = "text", this.input.className = "ttcb-input", this.input.placeholder = e.placeholder ?? "Type your message…", this.input.setAttribute("aria-label", "Message input"), this.input.setAttribute("autocomplete", "off"), this.sendBtn = document.createElement("button"), this.sendBtn.type = "submit", this.sendBtn.className = "ttcb-send-btn", this.sendBtn.innerHTML = Jt(), this.sendBtn.setAttribute("aria-label", "Send message"), this.micBtn = document.createElement("button"), this.micBtn.type = "button", this.micBtn.className = "ttcb-mic-btn", this.micBtn.setAttribute("aria-label", "Record voice message"), this.micBtn.title = "Record voice message", this.micBtn.innerHTML = cn(), this.micBtn.addEventListener("click", () => void this.startVoice()), n.appendChild(this.input), n.appendChild(this.micBtn), n.appendChild(this.sendBtn), this.footer.appendChild(n), this.panel.appendChild(this.footer), this.shadow.appendChild(this.panel), this.shadow.addEventListener("click", (e) => {
|
|
2588
3180
|
let t = e.target;
|
|
2589
|
-
t && (this.dialBtn.contains(t) || this.countryPopover.contains(t)) || this.closeCountryPopover();
|
|
3181
|
+
this.attachMenuOpen && !(t && (this.attachBtn.contains(t) || this.attachMenu.contains(t))) && this.closeAttachMenu(), this.countryOpen && (t && (this.dialBtn.contains(t) || this.countryPopover.contains(t)) || this.closeCountryPopover());
|
|
3182
|
+
}), this.panel.addEventListener("keydown", (e) => {
|
|
3183
|
+
e.key === "Escape" && this.attachMenuOpen && (e.stopPropagation(), this.closeAttachMenu(), this.attachBtn.focus());
|
|
2590
3184
|
}), this.attachToDocument(), this.showInitialLoading();
|
|
2591
3185
|
}
|
|
2592
3186
|
reveal() {
|
|
@@ -2598,13 +3192,13 @@ var At = class {
|
|
|
2598
3192
|
let n = document.createElement("div");
|
|
2599
3193
|
n.className = "ttcb-avatar-wrap";
|
|
2600
3194
|
let r = document.createElement("div");
|
|
2601
|
-
r.className = "ttcb-avatar", r.innerHTML =
|
|
3195
|
+
r.className = "ttcb-avatar", r.innerHTML = Z(), n.appendChild(r);
|
|
2602
3196
|
let i = document.createElement("div");
|
|
2603
3197
|
i.className = "ttcb-header-main";
|
|
2604
3198
|
let a = document.createElement("div");
|
|
2605
3199
|
a.className = "ttcb-header-title-row", this.headerTitle = document.createElement("span"), this.headerTitle.className = "ttcb-header-title", this.headerTitle.textContent = e.chatbotName ?? "AI Assistant";
|
|
2606
3200
|
let o = document.createElement("span");
|
|
2607
|
-
o.className = "ttcb-verified", o.setAttribute("aria-label", "Verified"), o.innerHTML =
|
|
3201
|
+
o.className = "ttcb-verified", o.setAttribute("aria-label", "Verified"), o.innerHTML = tn(), a.appendChild(this.headerTitle), a.appendChild(o);
|
|
2608
3202
|
let s = document.createElement("div");
|
|
2609
3203
|
s.className = "ttcb-header-meta";
|
|
2610
3204
|
let c = document.createElement("span");
|
|
@@ -2612,11 +3206,146 @@ var At = class {
|
|
|
2612
3206
|
let l = document.createElement("span");
|
|
2613
3207
|
l.className = "ttcb-meta-sep", l.setAttribute("aria-hidden", "true");
|
|
2614
3208
|
let u = document.createElement("span");
|
|
2615
|
-
u.className = "ttcb-meta-replies", u.innerHTML = `${
|
|
3209
|
+
u.className = "ttcb-meta-replies", u.innerHTML = `${nn()}<span>Replies instantly</span>`, s.appendChild(c), s.appendChild(l), s.appendChild(u), i.appendChild(a), i.appendChild(s);
|
|
2616
3210
|
let d = document.createElement("div");
|
|
2617
|
-
d.className = "ttcb-header-actions", this.requestHumanBtn = document.createElement("button"), this.requestHumanBtn.type = "button", this.requestHumanBtn.className = "ttcb-request-human-btn hidden", this.requestHumanBtn.id = "ttcb-request-human-btn", this.requestHumanBtn.setAttribute("aria-label", "Request human agent"), this.requestHumanBtn.title = "Request human agent", this.requestHumanBtn.innerHTML =
|
|
3211
|
+
d.className = "ttcb-header-actions", this.requestHumanBtn = document.createElement("button"), this.requestHumanBtn.type = "button", this.requestHumanBtn.className = "ttcb-request-human-btn hidden", this.requestHumanBtn.id = "ttcb-request-human-btn", this.requestHumanBtn.setAttribute("aria-label", "Request human agent"), this.requestHumanBtn.title = "Request human agent", this.requestHumanBtn.innerHTML = rn(), this.requestHumanBtn.addEventListener("click", () => this.callbacks.onRequestHuman()), this.newSessionBtn = document.createElement("button"), this.newSessionBtn.className = "ttcb-new-session-btn hidden", this.newSessionBtn.setAttribute("aria-label", "New conversation"), this.newSessionBtn.title = "New conversation", this.newSessionBtn.innerHTML = Gt(), this.newSessionBtn.addEventListener("click", () => this.callbacks.onReset());
|
|
2618
3212
|
let f = document.createElement("button");
|
|
2619
|
-
return f.className = "ttcb-close-btn", f.setAttribute("aria-label", "Close chat"), f.innerHTML =
|
|
3213
|
+
return f.className = "ttcb-close-btn", f.setAttribute("aria-label", "Close chat"), f.innerHTML = qt(), f.addEventListener("click", () => this.close()), d.appendChild(this.requestHumanBtn), d.appendChild(this.newSessionBtn), d.appendChild(f), t.appendChild(n), t.appendChild(i), t.appendChild(d), t;
|
|
3214
|
+
}
|
|
3215
|
+
buildAttachControls() {
|
|
3216
|
+
let e = document.createElement("div");
|
|
3217
|
+
e.className = "ttcb-attach", this.attachBtn = document.createElement("button"), this.attachBtn.type = "button", this.attachBtn.className = "ttcb-attach-btn", this.attachBtn.setAttribute("aria-label", "Add attachment"), this.attachBtn.setAttribute("aria-haspopup", "menu"), this.attachBtn.setAttribute("aria-expanded", "false"), this.attachBtn.title = "Add attachment", this.attachBtn.innerHTML = an(), this.attachBtn.addEventListener("click", (e) => {
|
|
3218
|
+
e.preventDefault(), e.stopPropagation(), this.toggleAttachMenu();
|
|
3219
|
+
}), this.attachMenu = document.createElement("div"), this.attachMenu.className = "ttcb-attach-menu", this.attachMenu.setAttribute("role", "menu"), this.attachFileInput = this.createFileInput(hn, "Choose files"), this.attachPhotoInput = this.createFileInput(gn, "Choose photos");
|
|
3220
|
+
let t = [{
|
|
3221
|
+
label: "Attachment",
|
|
3222
|
+
icon: on(),
|
|
3223
|
+
input: this.attachFileInput
|
|
3224
|
+
}, {
|
|
3225
|
+
label: "Photo",
|
|
3226
|
+
icon: sn(),
|
|
3227
|
+
input: this.attachPhotoInput
|
|
3228
|
+
}];
|
|
3229
|
+
for (let e of t) {
|
|
3230
|
+
let t = document.createElement("button");
|
|
3231
|
+
t.type = "button", t.className = "ttcb-attach-item", t.setAttribute("role", "menuitem"), t.innerHTML = `${e.icon}<span>${e.label}</span>`, t.addEventListener("click", () => {
|
|
3232
|
+
this.closeAttachMenu(), e.input.click();
|
|
3233
|
+
}), this.attachMenu.appendChild(t);
|
|
3234
|
+
}
|
|
3235
|
+
return e.appendChild(this.attachBtn), e.appendChild(this.attachMenu), e.appendChild(this.attachFileInput), e.appendChild(this.attachPhotoInput), e;
|
|
3236
|
+
}
|
|
3237
|
+
createFileInput(e, t) {
|
|
3238
|
+
let n = document.createElement("input");
|
|
3239
|
+
return n.type = "file", n.multiple = !0, n.accept = e, n.className = "ttcb-file-input", n.tabIndex = -1, n.setAttribute("aria-label", t), n.addEventListener("change", () => {
|
|
3240
|
+
this.addPendingFiles(Array.from(n.files ?? [])), n.value = "";
|
|
3241
|
+
}), n;
|
|
3242
|
+
}
|
|
3243
|
+
toggleAttachMenu() {
|
|
3244
|
+
this.attachMenuOpen ? this.closeAttachMenu() : this.openAttachMenu();
|
|
3245
|
+
}
|
|
3246
|
+
openAttachMenu() {
|
|
3247
|
+
if (this.attachBtn.disabled) return;
|
|
3248
|
+
this.attachMenuOpen = !0, this.attachMenu.classList.add("open"), this.attachBtn.setAttribute("aria-expanded", "true");
|
|
3249
|
+
let e = this.attachMenu.querySelector(".ttcb-attach-item");
|
|
3250
|
+
queueMicrotask(() => e?.focus());
|
|
3251
|
+
}
|
|
3252
|
+
closeAttachMenu() {
|
|
3253
|
+
this.attachMenuOpen && (this.attachMenuOpen = !1, this.attachMenu.classList.remove("open"), this.attachBtn.setAttribute("aria-expanded", "false"));
|
|
3254
|
+
}
|
|
3255
|
+
addPendingFiles(e) {
|
|
3256
|
+
if (e.length === 0) return;
|
|
3257
|
+
let t = d([...this.pendingFiles.map((e) => e.file), ...e]);
|
|
3258
|
+
if (t) this.showComposeError(t);
|
|
3259
|
+
else {
|
|
3260
|
+
this.showComposeError("");
|
|
3261
|
+
for (let t of e) {
|
|
3262
|
+
let e = t.type.startsWith("image/") ? p(t) : "";
|
|
3263
|
+
this.pendingFiles.push({
|
|
3264
|
+
file: t,
|
|
3265
|
+
previewUrl: e
|
|
3266
|
+
});
|
|
3267
|
+
}
|
|
3268
|
+
this.renderPendingTray(), this.input.focus();
|
|
3269
|
+
}
|
|
3270
|
+
}
|
|
3271
|
+
removePendingFile(e) {
|
|
3272
|
+
let [t] = this.pendingFiles.splice(e, 1);
|
|
3273
|
+
t && m(t.previewUrl), this.renderPendingTray(), this.input.focus();
|
|
3274
|
+
}
|
|
3275
|
+
clearPendingFiles() {
|
|
3276
|
+
for (let e of this.pendingFiles) m(e.previewUrl);
|
|
3277
|
+
this.pendingFiles = [], this.renderPendingTray();
|
|
3278
|
+
}
|
|
3279
|
+
renderPendingTray() {
|
|
3280
|
+
this.pendingTray.innerHTML = "", this.pendingTray.classList.toggle("visible", this.pendingFiles.length > 0), this.pendingFiles.forEach((e, t) => {
|
|
3281
|
+
let n = document.createElement("div");
|
|
3282
|
+
if (n.className = "ttcb-pending-item", n.setAttribute("role", "listitem"), e.previewUrl) {
|
|
3283
|
+
let t = document.createElement("img");
|
|
3284
|
+
t.className = "ttcb-pending-thumb", t.src = e.previewUrl, t.alt = "", n.appendChild(t);
|
|
3285
|
+
} else {
|
|
3286
|
+
let e = document.createElement("span");
|
|
3287
|
+
e.className = "ttcb-pending-icon", e.setAttribute("aria-hidden", "true"), e.innerHTML = dn(), n.appendChild(e);
|
|
3288
|
+
}
|
|
3289
|
+
let r = document.createElement("span");
|
|
3290
|
+
r.className = "ttcb-pending-name", r.textContent = e.file.name || "attachment", r.title = e.file.name, n.appendChild(r);
|
|
3291
|
+
let i = document.createElement("button");
|
|
3292
|
+
i.type = "button", i.className = "ttcb-pending-remove", i.setAttribute("aria-label", `Remove ${e.file.name || "attachment"}`), i.innerHTML = qt(), i.addEventListener("click", () => this.removePendingFile(t)), n.appendChild(i), this.pendingTray.appendChild(n);
|
|
3293
|
+
});
|
|
3294
|
+
}
|
|
3295
|
+
buildVoiceBar() {
|
|
3296
|
+
this.voiceBar = document.createElement("div"), this.voiceBar.className = "ttcb-voice-bar", this.voiceBar.setAttribute("role", "group"), this.voiceBar.setAttribute("aria-label", "Recording voice message");
|
|
3297
|
+
let e = document.createElement("span");
|
|
3298
|
+
e.className = "ttcb-voice-dot", e.setAttribute("aria-hidden", "true"), this.voiceTime = document.createElement("span"), this.voiceTime.className = "ttcb-voice-time", this.voiceTime.setAttribute("role", "timer"), this.voiceTime.textContent = "0:00";
|
|
3299
|
+
let t = document.createElement("div");
|
|
3300
|
+
return t.className = "ttcb-voice-meter", t.setAttribute("aria-hidden", "true"), this.voiceLevel = document.createElement("span"), this.voiceLevel.className = "ttcb-voice-level", t.appendChild(this.voiceLevel), this.voiceCancelBtn = this.createVoiceButton("Cancel recording", un(), () => this.cancelVoice()), this.voiceStopBtn = this.createVoiceButton("Stop recording", ln(), () => void this.stopVoice()), this.voiceStopBtn.classList.add("primary"), this.voiceBar.appendChild(e), this.voiceBar.appendChild(this.voiceTime), this.voiceBar.appendChild(t), this.voiceBar.appendChild(this.voiceCancelBtn), this.voiceBar.appendChild(this.voiceStopBtn), this.voiceBar;
|
|
3301
|
+
}
|
|
3302
|
+
buildVoicePreview() {
|
|
3303
|
+
return this.voicePreview = document.createElement("div"), this.voicePreview.className = "ttcb-voice-preview", this.voicePreview.setAttribute("role", "group"), this.voicePreview.setAttribute("aria-label", "Voice message preview"), this.voiceAudio = document.createElement("audio"), this.voiceAudio.className = "ttcb-voice-audio", this.voiceAudio.controls = !0, this.voiceAudio.preload = "metadata", this.voiceAudio.setAttribute("aria-label", "Recorded voice message"), this.voicePreviewTime = document.createElement("span"), this.voicePreviewTime.className = "ttcb-voice-time", this.voiceDiscardBtn = this.createVoiceButton("Discard voice message", un(), () => this.cancelVoice()), this.voiceSendBtn = this.createVoiceButton("Send voice message", Jt(), () => this.sendVoice()), this.voiceSendBtn.classList.add("primary"), this.voicePreview.appendChild(this.voiceAudio), this.voicePreview.appendChild(this.voicePreviewTime), this.voicePreview.appendChild(this.voiceDiscardBtn), this.voicePreview.appendChild(this.voiceSendBtn), this.voicePreview;
|
|
3304
|
+
}
|
|
3305
|
+
createVoiceButton(e, t, n) {
|
|
3306
|
+
let r = document.createElement("button");
|
|
3307
|
+
return r.type = "button", r.className = "ttcb-voice-btn", r.setAttribute("aria-label", e), r.title = e, r.innerHTML = t, r.addEventListener("click", n), r;
|
|
3308
|
+
}
|
|
3309
|
+
async startVoice() {
|
|
3310
|
+
if (!this.micBtn.disabled) {
|
|
3311
|
+
if (this.closeAttachMenu(), this.showComposeError(""), !Y.isSupported()) this.showComposeError("Voice messages are not supported in this browser.");
|
|
3312
|
+
else {
|
|
3313
|
+
this.recorder?.destroy(), this.recorder = new Y((e) => this.renderVoice(e));
|
|
3314
|
+
try {
|
|
3315
|
+
await this.recorder.start();
|
|
3316
|
+
} catch (e) {
|
|
3317
|
+
this.showComposeError(e instanceof Error ? e.message : "Could not start recording."), this.recorder.destroy(), this.recorder = null, this.renderVoice({
|
|
3318
|
+
state: "idle",
|
|
3319
|
+
elapsedSeconds: 0,
|
|
3320
|
+
level: 0,
|
|
3321
|
+
result: null
|
|
3322
|
+
});
|
|
3323
|
+
}
|
|
3324
|
+
}
|
|
3325
|
+
}
|
|
3326
|
+
}
|
|
3327
|
+
async stopVoice() {
|
|
3328
|
+
await this.recorder?.stop();
|
|
3329
|
+
}
|
|
3330
|
+
cancelVoice() {
|
|
3331
|
+
this.recorder?.cancel(), this.recorder?.destroy(), this.recorder = null, this.renderVoice({
|
|
3332
|
+
state: "idle",
|
|
3333
|
+
elapsedSeconds: 0,
|
|
3334
|
+
level: 0,
|
|
3335
|
+
result: null
|
|
3336
|
+
}), this.input.focus();
|
|
3337
|
+
}
|
|
3338
|
+
sendVoice() {
|
|
3339
|
+
let e = this.recorder?.getSnapshot().result;
|
|
3340
|
+
e && (this.cancelVoice(), this.callbacks.onSendVoice(e));
|
|
3341
|
+
}
|
|
3342
|
+
renderVoice(e) {
|
|
3343
|
+
if (this.destroyed) return;
|
|
3344
|
+
let { state: t } = e;
|
|
3345
|
+
this.composeForm.classList.toggle("hidden", t !== "idle"), this.voiceBar.classList.toggle("visible", t === "recording"), this.voicePreview.classList.toggle("visible", t === "preview"), t === "recording" ? (this.voiceTime.textContent = _(e.elapsedSeconds), this.voiceLevel.style.width = `${Math.max(4, Math.round(e.level * 100))}%`) : (m(this.voicePreviewUrl), this.voicePreviewUrl = "", this.voiceAudio.removeAttribute("src"), t === "preview" && e.result && (this.voicePreviewUrl = p(new File([e.result.blob], "voice-preview", { type: e.result.blob.type })), this.voicePreviewUrl && (this.voiceAudio.src = this.voicePreviewUrl), this.voicePreviewTime.textContent = _(e.result.durationSeconds), queueMicrotask(() => this.voiceSendBtn.focus())));
|
|
3346
|
+
}
|
|
3347
|
+
showComposeError(e) {
|
|
3348
|
+
this.composeError.textContent = e, this.composeError.classList.toggle("visible", !!e);
|
|
2620
3349
|
}
|
|
2621
3350
|
setPanelMode(e) {
|
|
2622
3351
|
this.panel.classList.remove("ttcb-mode-form", "ttcb-mode-chat", "ttcb-mode-compact"), this.panel.classList.add(`ttcb-mode-${e}`), e !== "chat" && (this.requestHumanBtn.classList.add("hidden"), this.newSessionBtn.classList.add("hidden"), this.hideModeBanner());
|
|
@@ -2633,7 +3362,7 @@ var At = class {
|
|
|
2633
3362
|
placeholder: "Your name",
|
|
2634
3363
|
type: "text",
|
|
2635
3364
|
autocomplete: "name",
|
|
2636
|
-
icon:
|
|
3365
|
+
icon: Xt()
|
|
2637
3366
|
}), this.createPhoneField(t), this.emailInput = this.createIconField(t, {
|
|
2638
3367
|
id: "email",
|
|
2639
3368
|
label: "Email (optional)",
|
|
@@ -2642,10 +3371,10 @@ var At = class {
|
|
|
2642
3371
|
placeholder: "Email (optional)",
|
|
2643
3372
|
type: "email",
|
|
2644
3373
|
autocomplete: "email",
|
|
2645
|
-
icon:
|
|
2646
|
-
}), this.identifyError = document.createElement("p"), this.identifyError.className = "ttcb-identify-error", t.appendChild(this.identifyError), this.identifySubmit = document.createElement("button"), this.identifySubmit.type = "submit", this.identifySubmit.className = "ttcb-identify-submit", this.identifySubmit.innerHTML = `<span>Start Chatting</span>${
|
|
3374
|
+
icon: Zt()
|
|
3375
|
+
}), this.identifyError = document.createElement("p"), this.identifyError.className = "ttcb-identify-error", t.appendChild(this.identifyError), this.identifySubmit = document.createElement("button"), this.identifySubmit.type = "submit", this.identifySubmit.className = "ttcb-identify-submit", this.identifySubmit.innerHTML = `<span>Start Chatting</span>${$t()}`, t.appendChild(this.identifySubmit), e.appendChild(t);
|
|
2647
3376
|
let n = document.createElement("div");
|
|
2648
|
-
n.className = "ttcb-trust", n.innerHTML = `${
|
|
3377
|
+
n.className = "ttcb-trust", n.innerHTML = `${en()}<span>Encrypted connection • No spam, ever</span>`, e.appendChild(n);
|
|
2649
3378
|
}
|
|
2650
3379
|
createIconField(e, t) {
|
|
2651
3380
|
let n = document.createElement("div");
|
|
@@ -2675,7 +3404,7 @@ var At = class {
|
|
|
2675
3404
|
let a = document.createElement("div");
|
|
2676
3405
|
a.className = "ttcb-phone-row", a.id = "ttcb-phone-row", this.dialBtn = document.createElement("button"), this.dialBtn.type = "button", this.dialBtn.className = "ttcb-dial-btn", this.dialBtn.setAttribute("aria-label", "Select country code"), this.dialBtn.setAttribute("aria-haspopup", "listbox"), this.dialBtn.setAttribute("aria-expanded", "false"), this.dialFlag = document.createElement("span"), this.dialFlag.className = "ttcb-dial-flag", this.dialCode = document.createElement("span"), this.dialCode.className = "ttcb-dial-code", this.syncDialButton(), this.dialBtn.appendChild(this.dialFlag), this.dialBtn.appendChild(this.dialCode);
|
|
2677
3406
|
let o = document.createElement("span");
|
|
2678
|
-
o.setAttribute("aria-hidden", "true"), o.innerHTML =
|
|
3407
|
+
o.setAttribute("aria-hidden", "true"), o.innerHTML = Qt(), this.dialBtn.appendChild(o), this.dialBtn.addEventListener("click", (e) => {
|
|
2679
3408
|
e.preventDefault(), e.stopPropagation(), this.toggleCountryPopover();
|
|
2680
3409
|
}), this.phoneInput = document.createElement("input"), this.phoneInput.id = "ttcb-tel", this.phoneInput.name = "tel", this.phoneInput.type = "tel", this.phoneInput.className = "ttcb-phone-national", this.phoneInput.placeholder = "1712-345678", this.phoneInput.required = !0, this.phoneInput.autocomplete = "tel-national", this.phoneInput.setAttribute("inputmode", "tel"), a.appendChild(this.dialBtn), a.appendChild(this.phoneInput), this.countryPopover = document.createElement("div"), this.countryPopover.className = "ttcb-country-popover", this.countryPopover.setAttribute("role", "listbox"), this.countrySearch = document.createElement("input"), this.countrySearch.type = "search", this.countrySearch.className = "ttcb-country-search", this.countrySearch.placeholder = "Search country…", this.countrySearch.setAttribute("aria-label", "Search countries"), this.countrySearch.addEventListener("input", () => this.renderCountryList()), this.countryList = document.createElement("div"), this.countryList.className = "ttcb-country-list", this.countryPopover.appendChild(this.countrySearch), this.countryPopover.appendChild(this.countryList), this.renderCountryList(), t.appendChild(n), t.appendChild(a), t.appendChild(this.countryPopover), e.appendChild(t);
|
|
2681
3410
|
}
|
|
@@ -2692,7 +3421,7 @@ var At = class {
|
|
|
2692
3421
|
this.countryOpen = !1, this.countryPopover.classList.remove("open"), this.dialBtn.setAttribute("aria-expanded", "false");
|
|
2693
3422
|
}
|
|
2694
3423
|
renderCountryList() {
|
|
2695
|
-
let e = this.countrySearch.value.trim().toLowerCase(), t =
|
|
3424
|
+
let e = this.countrySearch.value.trim().toLowerCase(), t = X.filter((t) => !e || t.name.toLowerCase().includes(e) || t.dial.includes(e) || t.iso.toLowerCase().includes(e) || `+${t.dial}`.includes(e));
|
|
2696
3425
|
this.countryList.innerHTML = "";
|
|
2697
3426
|
for (let e of t) {
|
|
2698
3427
|
let t = document.createElement("button");
|
|
@@ -2724,7 +3453,7 @@ var At = class {
|
|
|
2724
3453
|
let t = document.createElement("div");
|
|
2725
3454
|
t.className = "ttcb-empty", t.id = "ttcb-empty";
|
|
2726
3455
|
let n = document.createElement("div");
|
|
2727
|
-
n.className = "ttcb-empty-icon", n.innerHTML =
|
|
3456
|
+
n.className = "ttcb-empty-icon", n.innerHTML = Z();
|
|
2728
3457
|
let r = document.createElement("p"), i = document.createElement("strong");
|
|
2729
3458
|
i.textContent = e, r.appendChild(document.createTextNode("Welcome to ")), r.appendChild(i);
|
|
2730
3459
|
let a = document.createElement("p");
|
|
@@ -2736,10 +3465,15 @@ var At = class {
|
|
|
2736
3465
|
}
|
|
2737
3466
|
handleSend() {
|
|
2738
3467
|
let e = this.input.value.trim();
|
|
2739
|
-
|
|
3468
|
+
if (!this.sendBtn.disabled) {
|
|
3469
|
+
if (this.pendingFiles.length > 0) {
|
|
3470
|
+
let t = this.pendingFiles.map((e) => e.file);
|
|
3471
|
+
this.clearPendingFiles(), this.showComposeError(""), this.input.value = "", this.callbacks.onSendAttachments(t, e), this.input.focus();
|
|
3472
|
+
} else e && (this.input.value = "", this.callbacks.onSend(e), this.input.focus());
|
|
3473
|
+
}
|
|
2740
3474
|
}
|
|
2741
3475
|
handleIdentifySubmit() {
|
|
2742
|
-
let e = this.nameInput.value.trim(), t =
|
|
3476
|
+
let e = this.nameInput.value.trim(), t = Bt(this.selectedCountry.dial, this.phoneInput.value), n = this.emailInput.value.trim();
|
|
2743
3477
|
!e || !t ? this.showIdentifyError("Name and phone are required.") : (this.showIdentifyError(""), this.callbacks.onIdentify({
|
|
2744
3478
|
name: e,
|
|
2745
3479
|
phone: t,
|
|
@@ -2748,38 +3482,70 @@ var At = class {
|
|
|
2748
3482
|
}
|
|
2749
3483
|
appendMessage(e) {
|
|
2750
3484
|
this.removeEmptyState();
|
|
2751
|
-
let t =
|
|
2752
|
-
this.messagesContainer.appendChild(
|
|
3485
|
+
let t = this.buildMessage(e);
|
|
3486
|
+
this.messagesContainer.appendChild(t), this.scrollToBottom();
|
|
3487
|
+
}
|
|
3488
|
+
replaceMessage(e, t) {
|
|
3489
|
+
let n = this.findMessageEl(e);
|
|
3490
|
+
n ? (n.replaceWith(this.buildMessage(t)), this.scrollToBottom()) : this.appendMessage(t);
|
|
3491
|
+
}
|
|
3492
|
+
removeMessage(e) {
|
|
3493
|
+
this.findMessageEl(e)?.remove();
|
|
3494
|
+
}
|
|
3495
|
+
buildMessage(e) {
|
|
3496
|
+
if ("message" in e) {
|
|
3497
|
+
let t = pn({
|
|
3498
|
+
...e.message,
|
|
3499
|
+
pending: e.pending
|
|
3500
|
+
});
|
|
3501
|
+
return t.dataset.msgId = String(e.id), t;
|
|
3502
|
+
}
|
|
3503
|
+
return pn(e);
|
|
3504
|
+
}
|
|
3505
|
+
findMessageEl(e) {
|
|
3506
|
+
for (let t of this.messagesContainer.querySelectorAll(".ttcb-msg")) if (t.dataset.msgId === String(e)) return t;
|
|
3507
|
+
return null;
|
|
2753
3508
|
}
|
|
2754
3509
|
setMessages(e) {
|
|
2755
3510
|
if (this.messagesContainer.innerHTML = "", e.length !== 0) {
|
|
2756
|
-
for (let t of e)
|
|
2757
|
-
let e = Ot(t.message.content, t.message.type);
|
|
2758
|
-
this.messagesContainer.appendChild(e);
|
|
2759
|
-
}
|
|
3511
|
+
for (let t of e) this.messagesContainer.appendChild(this.buildMessage(t));
|
|
2760
3512
|
this.scrollToBottom();
|
|
2761
3513
|
}
|
|
2762
3514
|
}
|
|
2763
3515
|
setLoading(e) {
|
|
2764
|
-
if (this.sendBtn.disabled = e || this.input.disabled, e) this.shadow.getElementById("ttcb-typing") || (this.messagesContainer.appendChild(
|
|
3516
|
+
if (this.sendBtn.disabled = e || this.input.disabled, this.attachBtn.disabled = e || this.input.disabled, this.micBtn.disabled = e || this.input.disabled, e) this.closeAttachMenu(), this.shadow.getElementById("ttcb-typing") || (this.messagesContainer.appendChild(mn()), this.scrollToBottom()), this.isFullScreen() || this.input.focus();
|
|
2765
3517
|
else {
|
|
2766
3518
|
let e = this.shadow.getElementById("ttcb-typing");
|
|
2767
|
-
e && e.remove(), this.input.disabled
|
|
3519
|
+
e && e.remove(), !this.input.disabled && !this.isFullScreen() && this.input.focus();
|
|
2768
3520
|
}
|
|
2769
3521
|
}
|
|
2770
3522
|
setIdentifyLoading(e) {
|
|
2771
3523
|
this.identifySubmit.disabled = e, this.nameInput.disabled = e, this.phoneInput.disabled = e, this.emailInput.disabled = e, this.dialBtn.disabled = e, this.shadow.getElementById("ttcb-phone-row")?.classList.toggle("disabled", e);
|
|
2772
3524
|
for (let t of this.identifyContainer.querySelectorAll(".ttcb-input-wrap")) t.classList.toggle("disabled", e);
|
|
2773
|
-
this.identifySubmit.innerHTML = e ? "<span>Starting…</span>" : `<span>Start Chatting</span>${
|
|
3525
|
+
this.identifySubmit.innerHTML = e ? "<span>Starting…</span>" : `<span>Start Chatting</span>${$t()}`, e && this.closeCountryPopover();
|
|
2774
3526
|
}
|
|
2775
3527
|
showIdentifyError(e) {
|
|
2776
3528
|
this.identifyError.textContent = e;
|
|
2777
3529
|
}
|
|
2778
3530
|
open() {
|
|
2779
|
-
this.isOpen = !0, this.panel.classList.remove("hidden"), this.identifyContainer.classList.contains("visible") ? this.nameInput.focus() : this.input.focus(), this.callbacks.onOpen();
|
|
3531
|
+
this.isOpen = !0, this.startViewportSync(), this.panel.classList.remove("hidden"), this.fab.classList.add("ttcb-open"), this.isFullScreen() ? this.panel.focus({ preventScroll: !0 }) : this.identifyContainer.classList.contains("visible") ? this.nameInput.focus() : this.input.focus(), this.callbacks.onOpen();
|
|
2780
3532
|
}
|
|
2781
3533
|
close() {
|
|
2782
|
-
this.isOpen = !1, this.closeCountryPopover(), this.panel.classList.add("hidden"), this.callbacks.onClose();
|
|
3534
|
+
this.isOpen = !1, this.closeCountryPopover(), this.closeAttachMenu(), this.panel.classList.add("hidden"), this.fab.classList.remove("ttcb-open"), this.stopViewportSync?.(), this.stopViewportSync = null, this.fab.focus({ preventScroll: !0 }), this.callbacks.onClose();
|
|
3535
|
+
}
|
|
3536
|
+
isFullScreen() {
|
|
3537
|
+
return typeof window.matchMedia == "function" && window.matchMedia("(max-width: 640px), (max-height: 500px) and (pointer: coarse)").matches;
|
|
3538
|
+
}
|
|
3539
|
+
startViewportSync() {
|
|
3540
|
+
let e = window.visualViewport;
|
|
3541
|
+
if (!e || this.stopViewportSync) return;
|
|
3542
|
+
let t = () => {
|
|
3543
|
+
let t = this.messagesContainer, n = t.scrollHeight - t.scrollTop - t.clientHeight < 40;
|
|
3544
|
+
this.panel.style.setProperty("--ttcb-vv-top", `${e.offsetTop}px`), this.panel.style.setProperty("--ttcb-vv-left", `${e.offsetLeft}px`), this.panel.style.setProperty("--ttcb-vv-width", `${e.width}px`), this.panel.style.setProperty("--ttcb-vv-height", `${e.height}px`), n && this.scrollToBottom();
|
|
3545
|
+
};
|
|
3546
|
+
e.addEventListener("resize", t), e.addEventListener("scroll", t), t(), this.stopViewportSync = () => {
|
|
3547
|
+
e.removeEventListener("resize", t), e.removeEventListener("scroll", t);
|
|
3548
|
+
};
|
|
2783
3549
|
}
|
|
2784
3550
|
toggle() {
|
|
2785
3551
|
this.isOpen ? this.close() : this.open();
|
|
@@ -2794,11 +3560,11 @@ var At = class {
|
|
|
2794
3560
|
}) : this.showEmptyState(e.chatbotName ?? "AI Assistant"), this.setMode("ai");
|
|
2795
3561
|
}
|
|
2796
3562
|
clearMessages(e) {
|
|
2797
|
-
this.messagesContainer.innerHTML = "", this.showEmptyState(e);
|
|
3563
|
+
this.messagesContainer.innerHTML = "", this.clearPendingFiles(), this.showComposeError(""), this.showEmptyState(e);
|
|
2798
3564
|
}
|
|
2799
3565
|
setMode(e, t) {
|
|
2800
3566
|
let n = this.panel.classList.contains("ttcb-mode-chat"), r = t?.agentName, i = t?.canRequestHuman === !0, a = n && i, o = n && e === "closed", s = e === "closed";
|
|
2801
|
-
this.requestHumanBtn.classList.toggle("hidden", !a), this.newSessionBtn.classList.toggle("hidden", !o), this.input.disabled = s, s ? this.sendBtn.disabled = !0 : this.shadow.getElementById("ttcb-typing") || (this.sendBtn.disabled = !1), n ? e === "waiting" ? this.showModeBanner("Waiting for a human agent…", "waiting") : e === "closed" ? this.showModeBanner("This conversation is closed", "closed") : e === "human" && r?.trim() ? this.showModeBanner(`Connected with ${r.trim()}`, "human") : this.hideModeBanner() : this.hideModeBanner();
|
|
3567
|
+
this.requestHumanBtn.classList.toggle("hidden", !a), this.newSessionBtn.classList.toggle("hidden", !o), this.input.disabled = s, s ? (this.sendBtn.disabled = !0, this.attachBtn.disabled = !0, this.micBtn.disabled = !0, this.closeAttachMenu(), this.clearPendingFiles(), this.recorder && this.cancelVoice(), this.showComposeError("")) : this.shadow.getElementById("ttcb-typing") || (this.sendBtn.disabled = !1, this.attachBtn.disabled = !1, this.micBtn.disabled = !1), n ? e === "waiting" ? this.showModeBanner("Waiting for a human agent…", "waiting") : e === "closed" ? this.showModeBanner("This conversation is closed", "closed") : e === "human" && r?.trim() ? this.showModeBanner(`Connected with ${r.trim()}`, "human") : this.hideModeBanner() : this.hideModeBanner();
|
|
2802
3568
|
}
|
|
2803
3569
|
showModeBanner(e, t) {
|
|
2804
3570
|
this.modeBanner.textContent = e, this.modeBanner.className = `ttcb-mode-banner visible ${t}`;
|
|
@@ -2807,13 +3573,13 @@ var At = class {
|
|
|
2807
3573
|
this.modeBanner.textContent = "", this.modeBanner.className = "ttcb-mode-banner";
|
|
2808
3574
|
}
|
|
2809
3575
|
destroy() {
|
|
2810
|
-
this.destroyed = !0, this.host.remove();
|
|
3576
|
+
this.destroyed = !0, this.stopViewportSync?.(), this.stopViewportSync = null, this.clearPendingFiles(), this.recorder?.destroy(), this.recorder = null, m(this.voicePreviewUrl), this.voicePreviewUrl = "", this.host.remove();
|
|
2811
3577
|
}
|
|
2812
3578
|
scrollToBottom() {
|
|
2813
3579
|
this.messagesContainer.scrollTop = this.messagesContainer.scrollHeight;
|
|
2814
3580
|
}
|
|
2815
|
-
},
|
|
2816
|
-
apiBaseUrl:
|
|
3581
|
+
}, vn = {
|
|
3582
|
+
apiBaseUrl: c,
|
|
2817
3583
|
chatbotName: "AI Assistant",
|
|
2818
3584
|
primaryColor: "#2563EB",
|
|
2819
3585
|
theme: "auto",
|
|
@@ -2824,23 +3590,23 @@ var At = class {
|
|
|
2824
3590
|
sessionId: "",
|
|
2825
3591
|
requestTimeoutMs: n
|
|
2826
3592
|
};
|
|
2827
|
-
function
|
|
3593
|
+
function yn(e) {
|
|
2828
3594
|
return Object.fromEntries(Object.entries(e).filter(([, e]) => e !== void 0));
|
|
2829
3595
|
}
|
|
2830
|
-
var
|
|
3596
|
+
var bn = [
|
|
2831
3597
|
5e3,
|
|
2832
3598
|
15e3,
|
|
2833
3599
|
3e4,
|
|
2834
3600
|
6e4
|
|
2835
3601
|
];
|
|
2836
|
-
function
|
|
2837
|
-
return
|
|
3602
|
+
function xn(e) {
|
|
3603
|
+
return o(e) ? e.status === 0 || e.status >= 500 || e.apiError.code === "BAD_RESPONSE" : !1;
|
|
2838
3604
|
}
|
|
2839
|
-
function
|
|
2840
|
-
return
|
|
3605
|
+
function Sn(e) {
|
|
3606
|
+
return o(e) ? e.apiError.message : e instanceof Error ? e.message : "Failed to load chatbot config.";
|
|
2841
3607
|
}
|
|
2842
|
-
var
|
|
2843
|
-
function
|
|
3608
|
+
var Cn = 0, Q = () => Date.now() * 1e3 + Cn++ % 1e3;
|
|
3609
|
+
function wn(e) {
|
|
2844
3610
|
if (!e || typeof e != "object") return null;
|
|
2845
3611
|
let t = e;
|
|
2846
3612
|
if (typeof t.textMessage == "string" && t.textMessage.trim()) return t.textMessage.trim();
|
|
@@ -2852,7 +3618,11 @@ function Lt(e) {
|
|
|
2852
3618
|
}
|
|
2853
3619
|
return null;
|
|
2854
3620
|
}
|
|
2855
|
-
function
|
|
3621
|
+
function Tn(e) {
|
|
3622
|
+
let t = (e.attachments ?? []).map((e) => e.url).join("");
|
|
3623
|
+
return `${e.content}\u0000${t}`;
|
|
3624
|
+
}
|
|
3625
|
+
function En(e) {
|
|
2856
3626
|
if (!e || typeof e != "object") return null;
|
|
2857
3627
|
let t = e;
|
|
2858
3628
|
if (typeof t.id == "string" && t.id) return t.id;
|
|
@@ -2862,9 +3632,9 @@ function Rt(e) {
|
|
|
2862
3632
|
}
|
|
2863
3633
|
return null;
|
|
2864
3634
|
}
|
|
2865
|
-
var
|
|
3635
|
+
var Dn = class {
|
|
2866
3636
|
constructor() {
|
|
2867
|
-
this.emitter = new
|
|
3637
|
+
this.emitter = new fe(), this.visitorTokens = new Mt(), this.widget = null, this.sdkSocket = null, this.callerSetName = !1, this.hasActiveTicket = !1, this.retryTimer = null, this.lastPushId = null, this.initToken = 0, this._state = {
|
|
2868
3638
|
isOpen: !1,
|
|
2869
3639
|
isLoading: !1,
|
|
2870
3640
|
isReady: !1,
|
|
@@ -2899,9 +3669,9 @@ var Q = class {
|
|
|
2899
3669
|
if (!e.apiKey) throw Error("[onedeskpro-chatbot] `apiKey` is required to initialise the chatbot.");
|
|
2900
3670
|
let t = ++this.initToken;
|
|
2901
3671
|
this.clearRetry(), this.disconnectSdkSocket(), this.widget?.destroy(), this.widget = null, this.callerSetName = e.chatbotName !== void 0, this.options = {
|
|
2902
|
-
...
|
|
2903
|
-
...
|
|
2904
|
-
}, this.apiClient = new
|
|
3672
|
+
...vn,
|
|
3673
|
+
...yn(e)
|
|
3674
|
+
}, this.apiClient = new s({
|
|
2905
3675
|
baseUrl: this.options.apiBaseUrl,
|
|
2906
3676
|
apiKey: this.options.apiKey,
|
|
2907
3677
|
timeoutMs: this.options.requestTimeoutMs
|
|
@@ -2922,13 +3692,13 @@ var Q = class {
|
|
|
2922
3692
|
n = await this.apiClient.fetchConfig();
|
|
2923
3693
|
} catch (n) {
|
|
2924
3694
|
if (e !== this.initToken) return;
|
|
2925
|
-
if (
|
|
3695
|
+
if (xn(n)) {
|
|
2926
3696
|
this.setState({
|
|
2927
3697
|
isReady: !1,
|
|
2928
3698
|
blockReason: "server-unavailable",
|
|
2929
|
-
error:
|
|
3699
|
+
error: Sn(n)
|
|
2930
3700
|
});
|
|
2931
|
-
let r =
|
|
3701
|
+
let r = bn[t];
|
|
2932
3702
|
if (r !== void 0) {
|
|
2933
3703
|
this.retryTimer = setTimeout(() => {
|
|
2934
3704
|
this.retryTimer = null, this.checkReadiness(e, t + 1);
|
|
@@ -2949,8 +3719,10 @@ var Q = class {
|
|
|
2949
3719
|
}), i ? (this.mountWidget(), this.visitorTokens.setScope(n.agentId), await this.resolveVisitorGate(e), e === this.initToken && (this.widget?.reveal(), this.emitter.emit("ready"))) : this.emitter.emit("ready");
|
|
2950
3720
|
}
|
|
2951
3721
|
mountWidget() {
|
|
2952
|
-
typeof window < "u" && typeof document < "u" && (this.widget = new
|
|
3722
|
+
typeof window < "u" && typeof document < "u" && (this.widget = new _n(this.options, {
|
|
2953
3723
|
onSend: (e) => void this.sendMessage(e),
|
|
3724
|
+
onSendAttachments: (e, t) => void this.sendAttachments(e, t),
|
|
3725
|
+
onSendVoice: (e) => void this.sendVoice(e),
|
|
2954
3726
|
onIdentify: (e) => void this.submitIdentify(e),
|
|
2955
3727
|
onOpen: () => {
|
|
2956
3728
|
this.setState({ isOpen: !0 }), this.emitter.emit("open");
|
|
@@ -2966,11 +3738,11 @@ var Q = class {
|
|
|
2966
3738
|
this.retryTimer !== null && (clearTimeout(this.retryTimer), this.retryTimer = null);
|
|
2967
3739
|
}
|
|
2968
3740
|
handleConfigError(e) {
|
|
2969
|
-
let t = (
|
|
3741
|
+
let t = (o(e) ? e : null)?.apiError.code === "agent_not_assigned" ? "no-agent" : null;
|
|
2970
3742
|
this.setState({
|
|
2971
3743
|
isReady: !1,
|
|
2972
3744
|
blockReason: t,
|
|
2973
|
-
error:
|
|
3745
|
+
error: Sn(e)
|
|
2974
3746
|
});
|
|
2975
3747
|
}
|
|
2976
3748
|
async resolveVisitorGate(e) {
|
|
@@ -3002,7 +3774,7 @@ var Q = class {
|
|
|
3002
3774
|
}), this.widget?.readyToChat(this.options), this.connectSdkSocket(e), await this.restoreTicketStatus(e, n);
|
|
3003
3775
|
}
|
|
3004
3776
|
connectSdkSocket(e) {
|
|
3005
|
-
this.sdkSocket ||= new
|
|
3777
|
+
this.sdkSocket ||= new Ot(), this.sdkSocket.connect({
|
|
3006
3778
|
baseUrl: this.options.apiBaseUrl,
|
|
3007
3779
|
apiKey: this.options.apiKey,
|
|
3008
3780
|
visitorToken: e,
|
|
@@ -3032,20 +3804,24 @@ var Q = class {
|
|
|
3032
3804
|
}
|
|
3033
3805
|
handleMessageReceive(e) {
|
|
3034
3806
|
if (this._state.mode === "ai") return;
|
|
3035
|
-
let t =
|
|
3036
|
-
if (!t) return;
|
|
3037
|
-
let
|
|
3038
|
-
if (
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3042
|
-
|
|
3807
|
+
let t = wn(e) ?? "", n = ne(e);
|
|
3808
|
+
if (!t && n.length === 0) return;
|
|
3809
|
+
let r = En(e), i = this._state.messages[this._state.messages.length - 1];
|
|
3810
|
+
if (i && Tn(i.message) === Tn({
|
|
3811
|
+
content: t,
|
|
3812
|
+
attachments: n
|
|
3813
|
+
}) && (i.message.type === "ai" || i.message.type === "agent" && (!r || r === this.lastPushId))) return;
|
|
3814
|
+
this.lastPushId = r;
|
|
3815
|
+
let a = this.visitorTokens.get() ?? this._state.visitorToken ?? "", o = {
|
|
3816
|
+
id: Q(),
|
|
3817
|
+
sessionId: a,
|
|
3043
3818
|
message: {
|
|
3044
3819
|
type: "agent",
|
|
3045
|
-
content: t
|
|
3820
|
+
content: t,
|
|
3821
|
+
...n.length > 0 ? { attachments: n } : {}
|
|
3046
3822
|
}
|
|
3047
3823
|
};
|
|
3048
|
-
this.setState({ messages: [...this._state.messages,
|
|
3824
|
+
this.setState({ messages: [...this._state.messages, o] }), this.widget?.appendMessage(o), this.emitter.emit("message", o);
|
|
3049
3825
|
}
|
|
3050
3826
|
async submitIdentify(e) {
|
|
3051
3827
|
if (!this.apiClient || this._state.isLoading || !this._state.isReady) return;
|
|
@@ -3088,9 +3864,26 @@ var Q = class {
|
|
|
3088
3864
|
this.setState({ isLoading: !1 });
|
|
3089
3865
|
}
|
|
3090
3866
|
}
|
|
3091
|
-
|
|
3867
|
+
requireVisitorToken(e) {
|
|
3092
3868
|
let t = this.visitorTokens.get() ?? this._state.visitorToken;
|
|
3093
|
-
if (!this.apiClient || !t) throw Error(
|
|
3869
|
+
if (!this.apiClient || !t) throw Error(`[onedeskpro-chatbot] Identify before ${e}().`);
|
|
3870
|
+
return t;
|
|
3871
|
+
}
|
|
3872
|
+
pushLocalMessage(e) {
|
|
3873
|
+
this.setState({
|
|
3874
|
+
messages: [...this._state.messages, e],
|
|
3875
|
+
isLoading: !0,
|
|
3876
|
+
error: null
|
|
3877
|
+
}), this.widget?.appendMessage(e), this.emitter.emit("message", e);
|
|
3878
|
+
}
|
|
3879
|
+
replaceMessage(e, t) {
|
|
3880
|
+
this.setState({ messages: this._state.messages.map((n) => n.id === e ? t : n) }), this.widget?.replaceMessage(e, t);
|
|
3881
|
+
}
|
|
3882
|
+
removeMessage(e) {
|
|
3883
|
+
this.setState({ messages: this._state.messages.filter((t) => t.id !== e) }), this.widget?.removeMessage(e);
|
|
3884
|
+
}
|
|
3885
|
+
async sendMessage(e) {
|
|
3886
|
+
let t = this.requireVisitorToken("sendMessage");
|
|
3094
3887
|
if (this._state.mode === "closed") {
|
|
3095
3888
|
this.setState({ error: "Conversation is closed" });
|
|
3096
3889
|
return;
|
|
@@ -3098,41 +3891,142 @@ var Q = class {
|
|
|
3098
3891
|
let n = e.trim();
|
|
3099
3892
|
if (!n || this._state.isLoading || this._state.needsIdentify) return;
|
|
3100
3893
|
let r = {
|
|
3101
|
-
id:
|
|
3894
|
+
id: Q(),
|
|
3102
3895
|
sessionId: t,
|
|
3103
3896
|
message: {
|
|
3104
3897
|
type: "human",
|
|
3105
3898
|
content: n
|
|
3106
3899
|
}
|
|
3107
|
-
}, i = this._state.mode
|
|
3108
|
-
this.
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3900
|
+
}, i = this._state.mode;
|
|
3901
|
+
this.pushLocalMessage(r), i === "ai" && this.widget?.setLoading(!0), await this.deliver({
|
|
3902
|
+
chatInput: n,
|
|
3903
|
+
visitorToken: t
|
|
3904
|
+
}, i);
|
|
3905
|
+
}
|
|
3906
|
+
rejectSend(e) {
|
|
3907
|
+
this.setState({ error: e }), this.widget?.showComposeError(e), this.emitter.emit("error", Error(e));
|
|
3908
|
+
}
|
|
3909
|
+
async sendAttachments(e, t = "") {
|
|
3910
|
+
let n = this.requireVisitorToken("sendAttachments");
|
|
3911
|
+
if (this._state.mode === "closed") {
|
|
3912
|
+
this.setState({ error: "Conversation is closed" });
|
|
3913
|
+
return;
|
|
3914
|
+
}
|
|
3915
|
+
if (e.length === 0 || this._state.isLoading || this._state.needsIdentify) return;
|
|
3916
|
+
let r = d(e);
|
|
3917
|
+
r ? this.rejectSend(r) : await this.uploadThenDeliver({
|
|
3918
|
+
visitorToken: n,
|
|
3919
|
+
files: e,
|
|
3920
|
+
previews: e.map(ee),
|
|
3921
|
+
caption: t.trim()
|
|
3922
|
+
});
|
|
3923
|
+
}
|
|
3924
|
+
async sendVoice(e) {
|
|
3925
|
+
let t = this.requireVisitorToken("sendVoice");
|
|
3926
|
+
if (this._state.mode === "closed") {
|
|
3927
|
+
this.setState({ error: "Conversation is closed" });
|
|
3928
|
+
return;
|
|
3929
|
+
}
|
|
3930
|
+
if (!e?.blob || e.blob.size === 0 || this._state.isLoading || this._state.needsIdentify) return;
|
|
3931
|
+
let n;
|
|
3113
3932
|
try {
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3933
|
+
n = await de(e);
|
|
3934
|
+
} catch {
|
|
3935
|
+
this.rejectSend("Could not process the recording.");
|
|
3936
|
+
return;
|
|
3937
|
+
}
|
|
3938
|
+
if (n.file.size > 10485760) {
|
|
3939
|
+
this.rejectSend("This voice message is too long to send.");
|
|
3940
|
+
return;
|
|
3941
|
+
}
|
|
3942
|
+
let r = {
|
|
3943
|
+
durationSeconds: n.durationSeconds,
|
|
3944
|
+
...n.waveform ? { waveform: n.waveform } : {}
|
|
3945
|
+
}, i = {
|
|
3946
|
+
type: n.file.type,
|
|
3947
|
+
url: p(n.file),
|
|
3948
|
+
fileName: n.file.name,
|
|
3949
|
+
size: n.file.size,
|
|
3950
|
+
...r
|
|
3951
|
+
};
|
|
3952
|
+
await this.uploadThenDeliver({
|
|
3953
|
+
visitorToken: t,
|
|
3954
|
+
files: [n.file],
|
|
3955
|
+
previews: [i],
|
|
3956
|
+
caption: "",
|
|
3957
|
+
messageType: "voice",
|
|
3958
|
+
decorate: (e) => ({
|
|
3959
|
+
...e,
|
|
3960
|
+
...r
|
|
3961
|
+
})
|
|
3962
|
+
});
|
|
3963
|
+
}
|
|
3964
|
+
async uploadThenDeliver(e) {
|
|
3965
|
+
let { visitorToken: t, files: n, previews: r, caption: i } = e, a = {
|
|
3966
|
+
id: Q(),
|
|
3967
|
+
sessionId: t,
|
|
3968
|
+
message: {
|
|
3969
|
+
type: "human",
|
|
3970
|
+
content: i,
|
|
3971
|
+
attachments: r
|
|
3972
|
+
},
|
|
3973
|
+
pending: !0
|
|
3974
|
+
}, o = this._state.mode;
|
|
3975
|
+
this.pushLocalMessage(a);
|
|
3976
|
+
let s = [];
|
|
3977
|
+
try {
|
|
3978
|
+
for (let r of n) {
|
|
3979
|
+
let n = await this.apiClient.uploadAttachment(r, t);
|
|
3980
|
+
s.push(e.decorate ? e.decorate(n) : n);
|
|
3981
|
+
}
|
|
3982
|
+
} catch (e) {
|
|
3983
|
+
this.removeMessage(a.id);
|
|
3984
|
+
for (let e of r) m(e.url);
|
|
3985
|
+
let t = e instanceof Error ? e : Error(String(e));
|
|
3986
|
+
this.setState({
|
|
3987
|
+
error: t.message,
|
|
3988
|
+
isLoading: !1
|
|
3989
|
+
}), this.widget?.showComposeError(t.message), this.emitter.emit("error", t);
|
|
3990
|
+
return;
|
|
3991
|
+
}
|
|
3992
|
+
let c = {
|
|
3993
|
+
...a,
|
|
3994
|
+
pending: !1,
|
|
3995
|
+
message: {
|
|
3996
|
+
...a.message,
|
|
3997
|
+
attachments: s
|
|
3998
|
+
}
|
|
3999
|
+
};
|
|
4000
|
+
this.replaceMessage(a.id, c);
|
|
4001
|
+
for (let e of r) m(e.url);
|
|
4002
|
+
o === "ai" && this.widget?.setLoading(!0), await this.deliver({
|
|
4003
|
+
chatInput: i,
|
|
4004
|
+
visitorToken: t,
|
|
4005
|
+
attachments: s,
|
|
4006
|
+
...e.messageType ? { messageType: e.messageType } : {}
|
|
4007
|
+
}, o);
|
|
4008
|
+
}
|
|
4009
|
+
async deliver(e, t) {
|
|
4010
|
+
try {
|
|
4011
|
+
let n = await this.apiClient.sendMessage(e);
|
|
3118
4012
|
this.hasActiveTicket = !0;
|
|
3119
|
-
let r =
|
|
3120
|
-
if (r !==
|
|
3121
|
-
let
|
|
3122
|
-
if (
|
|
3123
|
-
let
|
|
3124
|
-
id:
|
|
3125
|
-
sessionId:
|
|
4013
|
+
let r = n.mode ?? t, i = [...this._state.messages], a = (n.text ?? "").trim();
|
|
4014
|
+
if (r !== t && (this.setState({ mode: r }), this.syncWidgetMode(r), this.emitter.emit("ticket-status", { mode: r })), a) {
|
|
4015
|
+
let e = i[i.length - 1];
|
|
4016
|
+
if (e?.message.type !== "agent" && e?.message.type !== "ai" || e.message.content !== a) {
|
|
4017
|
+
let e = {
|
|
4018
|
+
id: Q(),
|
|
4019
|
+
sessionId: n.sessionId,
|
|
3126
4020
|
message: {
|
|
3127
4021
|
type: "ai",
|
|
3128
|
-
content:
|
|
4022
|
+
content: a
|
|
3129
4023
|
}
|
|
3130
4024
|
};
|
|
3131
|
-
|
|
4025
|
+
i.push(e), this.widget?.appendMessage(e), this.emitter.emit("message", e);
|
|
3132
4026
|
}
|
|
3133
4027
|
}
|
|
3134
4028
|
this.setState({
|
|
3135
|
-
messages:
|
|
4029
|
+
messages: i,
|
|
3136
4030
|
isLoading: !1,
|
|
3137
4031
|
mode: r
|
|
3138
4032
|
}), this.syncWidgetMode(r);
|
|
@@ -3176,13 +4070,13 @@ var Q = class {
|
|
|
3176
4070
|
needsIdentify: !0
|
|
3177
4071
|
});
|
|
3178
4072
|
}
|
|
3179
|
-
}, $ = null,
|
|
4073
|
+
}, $ = null, On = {
|
|
3180
4074
|
async init(e) {
|
|
3181
|
-
return $ = new
|
|
4075
|
+
return $ = new Dn(), await $.init(e), $;
|
|
3182
4076
|
},
|
|
3183
4077
|
getInstance() {
|
|
3184
4078
|
return $;
|
|
3185
4079
|
}
|
|
3186
4080
|
};
|
|
3187
4081
|
//#endregion
|
|
3188
|
-
export {
|
|
4082
|
+
export { s as ApiClient, Dn as ChatbotCore, c as DEFAULT_API_BASE_URL, n as DEFAULT_REQUEST_TIMEOUT_MS, fe as EventEmitter, On as OnedeskProChatbot, u as SDK_CHAT_MAX_ATTACHMENTS, l as SDK_UPLOAD_MAX_BYTES, Ot as SdkSocket, Mt as SessionManager, Nt as VOICE_MAX_DURATION_SECONDS, Y as VoiceRecorder, o as isChatbotRequestError, Dt as resolveSdkSocketUrl };
|