wineater-bot 1.5.9 → 1.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wineater-chatbot.mjs +123 -95
- package/dist/wineater-chatbot.umd.js +12 -8
- package/package.json +1 -1
- package/src/js/i18n.js +25 -1
- package/src/js/styles.js +4 -0
|
@@ -190,6 +190,10 @@ const f = `
|
|
|
190
190
|
background: white; /* White background for wine items */
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
+
.wine-item a {
|
|
194
|
+
color: #7E27ED;
|
|
195
|
+
}
|
|
196
|
+
|
|
193
197
|
.wine-item img {
|
|
194
198
|
width: 80px; /* Smaller wine image size */
|
|
195
199
|
height: auto;
|
|
@@ -276,28 +280,28 @@ const f = `
|
|
|
276
280
|
}`, p = document.createElement("style");
|
|
277
281
|
p.textContent = f;
|
|
278
282
|
document.head.appendChild(p);
|
|
279
|
-
function b(
|
|
280
|
-
let
|
|
281
|
-
if (
|
|
283
|
+
function b(o, t, e) {
|
|
284
|
+
let n = "";
|
|
285
|
+
if (e) {
|
|
282
286
|
const i = /* @__PURE__ */ new Date();
|
|
283
|
-
i.setTime(i.getTime() +
|
|
287
|
+
i.setTime(i.getTime() + e * 24 * 60 * 60 * 1e3), n = "; expires=" + i.toUTCString();
|
|
284
288
|
}
|
|
285
|
-
document.cookie =
|
|
289
|
+
document.cookie = o + "=" + (t || "") + n + "; path=/; secure; samesite=strict";
|
|
286
290
|
}
|
|
287
|
-
function r(
|
|
288
|
-
const
|
|
289
|
-
if (
|
|
290
|
-
return
|
|
291
|
+
function r(o) {
|
|
292
|
+
const e = `; ${document.cookie}`.split(`; ${o}=`);
|
|
293
|
+
if (e.length === 2)
|
|
294
|
+
return e.pop().split(";").shift();
|
|
291
295
|
}
|
|
292
|
-
function d(
|
|
293
|
-
const
|
|
294
|
-
event:
|
|
296
|
+
function d(o, t) {
|
|
297
|
+
const e = "6f3d90d5b02720f58de3663e3ef675fe", n = "https://api.mixpanel.com/track", i = [{
|
|
298
|
+
event: o,
|
|
295
299
|
properties: {
|
|
296
|
-
token:
|
|
297
|
-
...
|
|
300
|
+
token: e,
|
|
301
|
+
...t
|
|
298
302
|
}
|
|
299
303
|
}];
|
|
300
|
-
fetch(
|
|
304
|
+
fetch(n, {
|
|
301
305
|
method: "POST",
|
|
302
306
|
headers: {
|
|
303
307
|
accept: "text/plain",
|
|
@@ -316,18 +320,18 @@ function h() {
|
|
|
316
320
|
function g() {
|
|
317
321
|
d("Chatbot Closed", { distinct_id: r("chatbotToken") });
|
|
318
322
|
}
|
|
319
|
-
function y(
|
|
320
|
-
d("Message Sent", { distinct_id: r("chatbotToken"), message_content:
|
|
323
|
+
function y(o) {
|
|
324
|
+
d("Message Sent", { distinct_id: r("chatbotToken"), message_content: o });
|
|
321
325
|
}
|
|
322
|
-
function w(
|
|
323
|
-
d("Message Sent", { distinct_id: r("chatbotToken"), products:
|
|
326
|
+
function w(o) {
|
|
327
|
+
d("Message Sent", { distinct_id: r("chatbotToken"), products: o });
|
|
324
328
|
}
|
|
325
|
-
function x(
|
|
326
|
-
d("Product Clicked", { distinct_id: r("chatbotToken"), product_id:
|
|
329
|
+
function x(o) {
|
|
330
|
+
d("Product Clicked", { distinct_id: r("chatbotToken"), product_id: o });
|
|
327
331
|
}
|
|
328
332
|
function u() {
|
|
329
|
-
const
|
|
330
|
-
|
|
333
|
+
const o = document.getElementById("chat-window"), t = document.getElementById("chat-icon");
|
|
334
|
+
o.classList.contains("visible") ? (g(), o.classList.remove("visible"), t.style.display = "flex") : (h(), o.classList.add("visible"), t.style.display = "none");
|
|
331
335
|
}
|
|
332
336
|
function v() {
|
|
333
337
|
g(), document.getElementById("chat-window").classList.remove("visible");
|
|
@@ -338,50 +342,50 @@ function k() {
|
|
|
338
342
|
document.addEventListener("DOMContentLoaded", () => {
|
|
339
343
|
setupCloseButton(), setupOutsideClick();
|
|
340
344
|
});
|
|
341
|
-
const
|
|
345
|
+
const E = ["climats", "telckel", "biobio", "weinpoint"], I = "OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";
|
|
342
346
|
class m {
|
|
343
|
-
constructor(
|
|
344
|
-
var
|
|
345
|
-
this.baseURL = "https://api.wineater.com/", this.store =
|
|
347
|
+
constructor(t) {
|
|
348
|
+
var e;
|
|
349
|
+
this.baseURL = "https://api.wineater.com/", this.store = E.find((n) => window.location.href.includes(n)), this.token = ((e = window == null ? void 0 : window.wineaterData) == null ? void 0 : e.CLIENT_TOKEN) || I;
|
|
346
350
|
}
|
|
347
|
-
async getStoreConfig(
|
|
348
|
-
console.log(
|
|
351
|
+
async getStoreConfig(t) {
|
|
352
|
+
console.log(t);
|
|
349
353
|
try {
|
|
350
|
-
const
|
|
354
|
+
const e = await fetch(`${this.baseURL}stores/store`, {
|
|
351
355
|
method: "POST",
|
|
352
356
|
headers: {
|
|
353
357
|
"Content-Type": "application/json",
|
|
354
358
|
Authorization: `Bearer ${this.token}`
|
|
355
359
|
},
|
|
356
|
-
body: JSON.stringify({ store:
|
|
360
|
+
body: JSON.stringify({ store: t })
|
|
357
361
|
});
|
|
358
|
-
if (!
|
|
359
|
-
throw new Error(`HTTP error! Status: ${
|
|
360
|
-
return await
|
|
361
|
-
} catch (
|
|
362
|
-
throw console.error("Error fetching store configuration:",
|
|
362
|
+
if (!e.ok)
|
|
363
|
+
throw new Error(`HTTP error! Status: ${e.status}`);
|
|
364
|
+
return await e.json();
|
|
365
|
+
} catch (e) {
|
|
366
|
+
throw console.error("Error fetching store configuration:", e), e;
|
|
363
367
|
}
|
|
364
368
|
}
|
|
365
|
-
async getWineRecommendations(
|
|
369
|
+
async getWineRecommendations(t) {
|
|
366
370
|
console.log(window.location.href);
|
|
367
371
|
try {
|
|
368
|
-
const
|
|
372
|
+
const e = await fetch(`${this.baseURL}dish/recommendations`, {
|
|
369
373
|
method: "POST",
|
|
370
374
|
headers: {
|
|
371
375
|
"Content-Type": "application/json",
|
|
372
376
|
Authorization: `Bearer ${this.token}`
|
|
373
377
|
},
|
|
374
|
-
body: JSON.stringify({ text:
|
|
375
|
-
}),
|
|
376
|
-
if (!
|
|
377
|
-
throw new Error(`API call failed with status ${
|
|
378
|
-
return
|
|
379
|
-
} catch (
|
|
380
|
-
throw console.error("Fetching wine recommendations failed:",
|
|
378
|
+
body: JSON.stringify({ text: t, store: this.store ? this.store.toString().charAt(0).toUpperCase() + this.store.slice(1) : void 0 })
|
|
379
|
+
}), n = await e.json();
|
|
380
|
+
if (!e.ok)
|
|
381
|
+
throw new Error(`API call failed with status ${e.status}: ${n.message || "No additional error information"}`);
|
|
382
|
+
return n;
|
|
383
|
+
} catch (e) {
|
|
384
|
+
throw console.error("Fetching wine recommendations failed:", e.message), new Error(`Error in getWineRecommendations: ${e.message}`);
|
|
381
385
|
}
|
|
382
386
|
}
|
|
383
387
|
}
|
|
384
|
-
class
|
|
388
|
+
class C {
|
|
385
389
|
constructor() {
|
|
386
390
|
this.api = new m(), this.language = "en", this.translations = {
|
|
387
391
|
fr: {
|
|
@@ -396,6 +400,18 @@ class I {
|
|
|
396
400
|
type: "Type",
|
|
397
401
|
moreInfo: "Plus d'infos"
|
|
398
402
|
},
|
|
403
|
+
de: {
|
|
404
|
+
welcomeMessage: "Sublimez votre expérience gastronomique. Il vous suffit de donner les détails de votre plat, et obtenez la recommandation de compagnon de vin idéale. Que voulez-vous manger?",
|
|
405
|
+
noResultsFound: "Aucun résultat trouvé.",
|
|
406
|
+
somethingWentWrong: "Désolé, quelque chose a mal tourné.",
|
|
407
|
+
chatButton: "Accorder le vin au dîner",
|
|
408
|
+
inputPlaceholder: "ex., Salade de thon",
|
|
409
|
+
sendButton: "Accorder",
|
|
410
|
+
price: "Prix",
|
|
411
|
+
region: "Région",
|
|
412
|
+
type: "Type",
|
|
413
|
+
moreInfo: "Plus d'infos"
|
|
414
|
+
},
|
|
399
415
|
es: {
|
|
400
416
|
welcomeMessage: "Mejore su experiencia gastronómica. Solo proporcione los detalles de su plato y obtenga la recomendación de vino ideal. ¿Qué le gustaría comer?",
|
|
401
417
|
noResultsFound: "No se encontraron resultados.",
|
|
@@ -419,41 +435,53 @@ class I {
|
|
|
419
435
|
region: "Region",
|
|
420
436
|
type: "Type",
|
|
421
437
|
moreInfo: "More info"
|
|
438
|
+
},
|
|
439
|
+
de: {
|
|
440
|
+
welcomeMessage: "Verbessern Sie Ihr kulinarisches Erlebnis. Geben Sie einfach die Details Ihres Gerichts an und erhalten Sie die ideale Weinempfehlung. Was möchten Sie essen?",
|
|
441
|
+
noResultsFound: "Keine Ergebnisse gefunden.",
|
|
442
|
+
somethingWentWrong: "Entschuldigung, etwas ist schief gelaufen.",
|
|
443
|
+
chatButton: "Wein zum Abendessen kombinieren",
|
|
444
|
+
inputPlaceholder: "z.B., Thunfischsalat",
|
|
445
|
+
sendButton: "Kombinieren",
|
|
446
|
+
price: "Preis",
|
|
447
|
+
region: "Region",
|
|
448
|
+
type: "Typ",
|
|
449
|
+
moreInfo: "Mehr Info"
|
|
422
450
|
}
|
|
423
451
|
};
|
|
424
452
|
}
|
|
425
|
-
async fetchConfig(
|
|
426
|
-
if (
|
|
427
|
-
const
|
|
428
|
-
this.language =
|
|
453
|
+
async fetchConfig(t) {
|
|
454
|
+
if (t) {
|
|
455
|
+
const e = await this.api.getStoreConfig(t);
|
|
456
|
+
this.language = e.lang;
|
|
429
457
|
}
|
|
430
458
|
}
|
|
431
|
-
translate(
|
|
432
|
-
return this.translations[this.language][
|
|
459
|
+
translate(t) {
|
|
460
|
+
return this.translations[this.language][t] || t;
|
|
433
461
|
}
|
|
434
462
|
}
|
|
435
|
-
const a = new
|
|
463
|
+
const a = new C();
|
|
436
464
|
class T {
|
|
437
465
|
constructor() {
|
|
438
466
|
this.api = new m(), this.displayFirstMessage(a.translate("welcomeMessage"));
|
|
439
467
|
}
|
|
440
468
|
initialize() {
|
|
441
|
-
document.getElementById("send-button").addEventListener("click", () => this.handleUserInput()), document.getElementById("user-input").addEventListener("keypress", (
|
|
442
|
-
|
|
469
|
+
document.getElementById("send-button").addEventListener("click", () => this.handleUserInput()), document.getElementById("user-input").addEventListener("keypress", (n) => {
|
|
470
|
+
n.key === "Enter" && this.handleUserInput();
|
|
443
471
|
});
|
|
444
472
|
}
|
|
445
|
-
displayFirstMessage(
|
|
446
|
-
const
|
|
447
|
-
i.className = `message ${
|
|
473
|
+
displayFirstMessage(t, e = "api") {
|
|
474
|
+
const n = document.getElementById("message-container"), i = document.createElement("div");
|
|
475
|
+
i.className = `message ${e}`, i.textContent = t, n.appendChild(i), n.scrollTop = n.scrollHeight;
|
|
448
476
|
}
|
|
449
477
|
async handleUserInput() {
|
|
450
|
-
const
|
|
451
|
-
if (
|
|
452
|
-
this.displayMessage(
|
|
478
|
+
const t = document.getElementById("user-input"), e = t.value.trim();
|
|
479
|
+
if (e) {
|
|
480
|
+
this.displayMessage(e, "user"), t.value = "", this.showTypingIndicator();
|
|
453
481
|
try {
|
|
454
|
-
y(
|
|
455
|
-
const
|
|
456
|
-
this.hideTypingIndicator(),
|
|
482
|
+
y(e);
|
|
483
|
+
const n = await this.api.getWineRecommendations(e);
|
|
484
|
+
this.hideTypingIndicator(), n && n.length ? this.displayResults(n) : this.displayMessage("No results found.", "api");
|
|
457
485
|
} catch {
|
|
458
486
|
this.hideTypingIndicator(), this.displayMessage(a.translate("somethingWentWrong"), "api");
|
|
459
487
|
}
|
|
@@ -465,37 +493,37 @@ class T {
|
|
|
465
493
|
hideTypingIndicator() {
|
|
466
494
|
document.getElementById("typing-indicator").classList.remove("visible");
|
|
467
495
|
}
|
|
468
|
-
displayMessage(
|
|
469
|
-
const
|
|
470
|
-
i.textContent =
|
|
496
|
+
displayMessage(t, e) {
|
|
497
|
+
const n = document.getElementById("message-container"), i = document.createElement("div");
|
|
498
|
+
i.textContent = t, i.className = "message " + e, n.appendChild(i), n.scrollTop = n.scrollHeight;
|
|
471
499
|
}
|
|
472
|
-
sendAnalytics(
|
|
473
|
-
x(
|
|
500
|
+
sendAnalytics(t) {
|
|
501
|
+
x(t);
|
|
474
502
|
}
|
|
475
|
-
displayResults(
|
|
476
|
-
const
|
|
477
|
-
w(
|
|
503
|
+
displayResults(t) {
|
|
504
|
+
const e = document.getElementById("message-container");
|
|
505
|
+
w(t.map((n) => n.Title)), t.forEach((n) => {
|
|
478
506
|
const i = document.createElement("div");
|
|
479
507
|
i.className = "wine-item";
|
|
480
508
|
const s = document.createElement("img");
|
|
481
|
-
s.src =
|
|
509
|
+
s.src = n.Image, i.appendChild(s);
|
|
482
510
|
const c = document.createElement("div");
|
|
483
511
|
c.innerHTML = `
|
|
484
|
-
<strong>${
|
|
485
|
-
${a.translate("price")}: ${
|
|
486
|
-
${a.translate("region")}: ${
|
|
487
|
-
${a.translate("type")}: ${
|
|
488
|
-
<a href="${
|
|
489
|
-
`, i.appendChild(c),
|
|
490
|
-
}),
|
|
512
|
+
<strong>${n.Title}</strong><br>
|
|
513
|
+
${a.translate("price")}: ${n.Price}<br>
|
|
514
|
+
${a.translate("region")}: ${n.Region}<br>
|
|
515
|
+
${a.translate("type")}: ${n.Type}<br>
|
|
516
|
+
<a href="${n.Url}" onclick="sendAnalytics(${n.Title})" target="_blank">${a.translate("moreInfo")}</a>
|
|
517
|
+
`, i.appendChild(c), e.appendChild(i);
|
|
518
|
+
}), e.scrollTop = e.scrollHeight;
|
|
491
519
|
}
|
|
492
520
|
}
|
|
493
521
|
const B = "OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";
|
|
494
522
|
document.addEventListener("DOMContentLoaded", () => {
|
|
495
523
|
window.toggleChatWindow = u, window.closeChatWindow = v, window.openChatWindow = k;
|
|
496
524
|
});
|
|
497
|
-
function
|
|
498
|
-
const
|
|
525
|
+
function W() {
|
|
526
|
+
const o = `
|
|
499
527
|
<div id="chatbot-container">
|
|
500
528
|
<div id="chat-icon" onclick="toggleChatWindow()">
|
|
501
529
|
<img src="https://landing-static.s3.eu-central-1.amazonaws.com/images/chat-icon.svg" alt="Chat Icon"> <!-- Update the path to your logo image -->
|
|
@@ -522,30 +550,30 @@ function L() {
|
|
|
522
550
|
</div>
|
|
523
551
|
</div>
|
|
524
552
|
`;
|
|
525
|
-
document.body.insertAdjacentHTML("beforeend",
|
|
553
|
+
document.body.insertAdjacentHTML("beforeend", o);
|
|
526
554
|
}
|
|
527
555
|
function P() {
|
|
528
556
|
document.getElementById("close-btn").addEventListener("click", u);
|
|
529
557
|
}
|
|
530
|
-
function
|
|
531
|
-
window.addEventListener("click", function(
|
|
532
|
-
const
|
|
533
|
-
!
|
|
558
|
+
function L() {
|
|
559
|
+
window.addEventListener("click", function(o) {
|
|
560
|
+
const t = document.getElementById("chat-window"), e = document.getElementById("chat-icon");
|
|
561
|
+
!t.contains(o.target) && !e.contains(o.target) && (t.classList.remove("visible"), e.style.display = "flex");
|
|
534
562
|
});
|
|
535
563
|
}
|
|
536
|
-
function
|
|
537
|
-
console.log(
|
|
538
|
-
const
|
|
539
|
-
|
|
564
|
+
function S(o) {
|
|
565
|
+
console.log(o);
|
|
566
|
+
const t = document.getElementById("chat-icon"), e = document.getElementById("chat-window");
|
|
567
|
+
t.className = "", e.className = "", o === "right-center" ? (t.classList.add("chat-icon-right-center"), e.classList.add("right-center-aligned")) : t.classList.add("chat-icon-bottom-right");
|
|
540
568
|
}
|
|
541
569
|
var l;
|
|
542
570
|
if (typeof window < "u") {
|
|
543
|
-
const
|
|
571
|
+
const o = ((l = window.wineaterData) == null ? void 0 : l.POSITION) || "bottom-right";
|
|
544
572
|
window.addEventListener("DOMContentLoaded", async () => {
|
|
545
573
|
var s;
|
|
546
|
-
const
|
|
547
|
-
let
|
|
548
|
-
|
|
574
|
+
const e = ["climats", "telckel", "biobio", "weinpoint"].find((c) => window.location.href.includes(c)) || null;
|
|
575
|
+
let n;
|
|
576
|
+
e && (n = e.charAt(0).toUpperCase() + e.slice(1)), await a.fetchConfig(n || null), W(), P(), L(), S(o), b("chatbotToken", ((s = window.wineaterData) == null ? void 0 : s.CLIENT_TOKEN) || B, 365), new T().initialize();
|
|
549
577
|
});
|
|
550
578
|
}
|
|
551
579
|
export {
|
|
@@ -190,6 +190,10 @@
|
|
|
190
190
|
background: white; /* White background for wine items */
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
+
.wine-item a {
|
|
194
|
+
color: #7E27ED;
|
|
195
|
+
}
|
|
196
|
+
|
|
193
197
|
.wine-item img {
|
|
194
198
|
width: 80px; /* Smaller wine image size */
|
|
195
199
|
height: auto;
|
|
@@ -273,13 +277,13 @@
|
|
|
273
277
|
.typing-indicator.visible {
|
|
274
278
|
visibility: visible;
|
|
275
279
|
height: 50px;
|
|
276
|
-
}`,g=document.createElement("style");g.textContent=d,document.head.appendChild(g);function x(
|
|
277
|
-
<strong>${
|
|
278
|
-
${s.translate("price")}: ${
|
|
279
|
-
${s.translate("region")}: ${
|
|
280
|
-
${s.translate("type")}: ${
|
|
281
|
-
<a href="${
|
|
282
|
-
`,i.appendChild(p),e.appendChild(i)}),e.scrollTop=e.scrollHeight}}const
|
|
280
|
+
}`,g=document.createElement("style");g.textContent=d,document.head.appendChild(g);function x(o,t,e){let n="";if(e){const i=new Date;i.setTime(i.getTime()+e*24*60*60*1e3),n="; expires="+i.toUTCString()}document.cookie=o+"="+(t||"")+n+"; path=/; secure; samesite=strict"}function c(o){const e=`; ${document.cookie}`.split(`; ${o}=`);if(e.length===2)return e.pop().split(";").shift()}function l(o,t){const e="6f3d90d5b02720f58de3663e3ef675fe",n="https://api.mixpanel.com/track",i=[{event:o,properties:{token:e,...t}}];fetch(n,{method:"POST",headers:{accept:"text/plain","content-type":"application/json"},body:JSON.stringify(i)}).then(a=>{a.ok||console.error("Mixpanel tracking failed",a)}).catch(a=>{console.error("Mixpanel tracking error",a)})}function u(){l("Chatbot Opened",{distinct_id:c("chatbotToken")})}function m(){l("Chatbot Closed",{distinct_id:c("chatbotToken")})}function v(o){l("Message Sent",{distinct_id:c("chatbotToken"),message_content:o})}function k(o){l("Message Sent",{distinct_id:c("chatbotToken"),products:o})}function E(o){l("Product Clicked",{distinct_id:c("chatbotToken"),product_id:o})}function h(){const o=document.getElementById("chat-window"),t=document.getElementById("chat-icon");o.classList.contains("visible")?(m(),o.classList.remove("visible"),t.style.display="flex"):(u(),o.classList.add("visible"),t.style.display="none")}function f(){m(),document.getElementById("chat-window").classList.remove("visible")}function b(){u(),document.getElementById("chat-window").classList.add("visible")}document.addEventListener("DOMContentLoaded",()=>{setupCloseButton(),setupOutsideClick()});const C=["climats","telckel","biobio","weinpoint"],I="OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";class y{constructor(t){var e;this.baseURL="https://api.wineater.com/",this.store=C.find(n=>window.location.href.includes(n)),this.token=((e=window==null?void 0:window.wineaterData)==null?void 0:e.CLIENT_TOKEN)||I}async getStoreConfig(t){console.log(t);try{const e=await fetch(`${this.baseURL}stores/store`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`},body:JSON.stringify({store:t})});if(!e.ok)throw new Error(`HTTP error! Status: ${e.status}`);return await e.json()}catch(e){throw console.error("Error fetching store configuration:",e),e}}async getWineRecommendations(t){console.log(window.location.href);try{const e=await fetch(`${this.baseURL}dish/recommendations`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.token}`},body:JSON.stringify({text:t,store:this.store?this.store.toString().charAt(0).toUpperCase()+this.store.slice(1):void 0})}),n=await e.json();if(!e.ok)throw new Error(`API call failed with status ${e.status}: ${n.message||"No additional error information"}`);return n}catch(e){throw console.error("Fetching wine recommendations failed:",e.message),new Error(`Error in getWineRecommendations: ${e.message}`)}}}class T{constructor(){this.api=new y,this.language="en",this.translations={fr:{welcomeMessage:"Sublimez votre expérience gastronomique. Il vous suffit de donner les détails de votre plat, et obtenez la recommandation de compagnon de vin idéale. Que voulez-vous manger?",noResultsFound:"Aucun résultat trouvé.",somethingWentWrong:"Désolé, quelque chose a mal tourné.",chatButton:"Accorder le vin au dîner",inputPlaceholder:"ex., Salade de thon",sendButton:"Accorder",price:"Prix",region:"Région",type:"Type",moreInfo:"Plus d'infos"},de:{welcomeMessage:"Sublimez votre expérience gastronomique. Il vous suffit de donner les détails de votre plat, et obtenez la recommandation de compagnon de vin idéale. Que voulez-vous manger?",noResultsFound:"Aucun résultat trouvé.",somethingWentWrong:"Désolé, quelque chose a mal tourné.",chatButton:"Accorder le vin au dîner",inputPlaceholder:"ex., Salade de thon",sendButton:"Accorder",price:"Prix",region:"Région",type:"Type",moreInfo:"Plus d'infos"},es:{welcomeMessage:"Mejore su experiencia gastronómica. Solo proporcione los detalles de su plato y obtenga la recomendación de vino ideal. ¿Qué le gustaría comer?",noResultsFound:"No se encontraron resultados.",somethingWentWrong:"Lo sentimos, algo salió mal.",chatButton:"Maridar vino con cena",inputPlaceholder:"ej., Ensalada de atún",sendButton:"Maridar",price:"Precio",region:"Región",type:"Tipo",moreInfo:"Más info"},en:{welcomeMessage:"Enhance your dining experience. Just provide your dish details and get the ideal wine pairing. What would you like to eat?",noResultsFound:"No results found.",somethingWentWrong:"Sorry, something went wrong.",chatButton:"Pair wine with dinner",inputPlaceholder:"e.g., Tuna Salad",sendButton:"Pair",price:"Price",region:"Region",type:"Type",moreInfo:"More info"},de:{welcomeMessage:"Verbessern Sie Ihr kulinarisches Erlebnis. Geben Sie einfach die Details Ihres Gerichts an und erhalten Sie die ideale Weinempfehlung. Was möchten Sie essen?",noResultsFound:"Keine Ergebnisse gefunden.",somethingWentWrong:"Entschuldigung, etwas ist schief gelaufen.",chatButton:"Wein zum Abendessen kombinieren",inputPlaceholder:"z.B., Thunfischsalat",sendButton:"Kombinieren",price:"Preis",region:"Region",type:"Typ",moreInfo:"Mehr Info"}}}async fetchConfig(t){if(t){const e=await this.api.getStoreConfig(t);this.language=e.lang}}translate(t){return this.translations[this.language][t]||t}}const s=new T;class W{constructor(){this.api=new y,this.displayFirstMessage(s.translate("welcomeMessage"))}initialize(){document.getElementById("send-button").addEventListener("click",()=>this.handleUserInput()),document.getElementById("user-input").addEventListener("keypress",n=>{n.key==="Enter"&&this.handleUserInput()})}displayFirstMessage(t,e="api"){const n=document.getElementById("message-container"),i=document.createElement("div");i.className=`message ${e}`,i.textContent=t,n.appendChild(i),n.scrollTop=n.scrollHeight}async handleUserInput(){const t=document.getElementById("user-input"),e=t.value.trim();if(e){this.displayMessage(e,"user"),t.value="",this.showTypingIndicator();try{v(e);const n=await this.api.getWineRecommendations(e);this.hideTypingIndicator(),n&&n.length?this.displayResults(n):this.displayMessage("No results found.","api")}catch{this.hideTypingIndicator(),this.displayMessage(s.translate("somethingWentWrong"),"api")}}}showTypingIndicator(){document.getElementById("typing-indicator").classList.add("visible")}hideTypingIndicator(){document.getElementById("typing-indicator").classList.remove("visible")}displayMessage(t,e){const n=document.getElementById("message-container"),i=document.createElement("div");i.textContent=t,i.className="message "+e,n.appendChild(i),n.scrollTop=n.scrollHeight}sendAnalytics(t){E(t)}displayResults(t){const e=document.getElementById("message-container");k(t.map(n=>n.Title)),t.forEach(n=>{const i=document.createElement("div");i.className="wine-item";const a=document.createElement("img");a.src=n.Image,i.appendChild(a);const p=document.createElement("div");p.innerHTML=`
|
|
281
|
+
<strong>${n.Title}</strong><br>
|
|
282
|
+
${s.translate("price")}: ${n.Price}<br>
|
|
283
|
+
${s.translate("region")}: ${n.Region}<br>
|
|
284
|
+
${s.translate("type")}: ${n.Type}<br>
|
|
285
|
+
<a href="${n.Url}" onclick="sendAnalytics(${n.Title})" target="_blank">${s.translate("moreInfo")}</a>
|
|
286
|
+
`,i.appendChild(p),e.appendChild(i)}),e.scrollTop=e.scrollHeight}}const B="OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";document.addEventListener("DOMContentLoaded",()=>{window.toggleChatWindow=h,window.closeChatWindow=f,window.openChatWindow=b});function P(){const o=`
|
|
283
287
|
<div id="chatbot-container">
|
|
284
288
|
<div id="chat-icon" onclick="toggleChatWindow()">
|
|
285
289
|
<img src="https://landing-static.s3.eu-central-1.amazonaws.com/images/chat-icon.svg" alt="Chat Icon"> <!-- Update the path to your logo image -->
|
|
@@ -305,4 +309,4 @@
|
|
|
305
309
|
</div>
|
|
306
310
|
</div>
|
|
307
311
|
</div>
|
|
308
|
-
`;document.body.insertAdjacentHTML("beforeend",
|
|
312
|
+
`;document.body.insertAdjacentHTML("beforeend",o)}function L(){document.getElementById("close-btn").addEventListener("click",h)}function S(){window.addEventListener("click",function(o){const t=document.getElementById("chat-window"),e=document.getElementById("chat-icon");!t.contains(o.target)&&!e.contains(o.target)&&(t.classList.remove("visible"),e.style.display="flex")})}function O(o){console.log(o);const t=document.getElementById("chat-icon"),e=document.getElementById("chat-window");t.className="",e.className="",o==="right-center"?(t.classList.add("chat-icon-right-center"),e.classList.add("right-center-aligned")):t.classList.add("chat-icon-bottom-right")}if(typeof window<"u"){const o=((w=window.wineaterData)==null?void 0:w.POSITION)||"bottom-right";window.addEventListener("DOMContentLoaded",async()=>{var a;const e=["climats","telckel","biobio","weinpoint"].find(p=>window.location.href.includes(p))||null;let n;e&&(n=e.charAt(0).toUpperCase()+e.slice(1)),await s.fetchConfig(n||null),P(),L(),S(),O(o),x("chatbotToken",((a=window.wineaterData)==null?void 0:a.CLIENT_TOKEN)||B,365),new W().initialize()})}r.closeChatWindow=f,r.openChatWindow=b,r.toggleChatWindow=h,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
package/src/js/i18n.js
CHANGED
|
@@ -17,6 +17,18 @@ class Translator {
|
|
|
17
17
|
type: "Type",
|
|
18
18
|
moreInfo: "Plus d'infos"
|
|
19
19
|
},
|
|
20
|
+
de: {
|
|
21
|
+
welcomeMessage: "Sublimez votre expérience gastronomique. Il vous suffit de donner les détails de votre plat, et obtenez la recommandation de compagnon de vin idéale. Que voulez-vous manger?",
|
|
22
|
+
noResultsFound: "Aucun résultat trouvé.",
|
|
23
|
+
somethingWentWrong: "Désolé, quelque chose a mal tourné.",
|
|
24
|
+
chatButton: "Accorder le vin au dîner",
|
|
25
|
+
inputPlaceholder: "ex., Salade de thon",
|
|
26
|
+
sendButton: "Accorder",
|
|
27
|
+
price: "Prix",
|
|
28
|
+
region: "Région",
|
|
29
|
+
type: "Type",
|
|
30
|
+
moreInfo: "Plus d'infos"
|
|
31
|
+
},
|
|
20
32
|
es: {
|
|
21
33
|
welcomeMessage: "Mejore su experiencia gastronómica. Solo proporcione los detalles de su plato y obtenga la recomendación de vino ideal. ¿Qué le gustaría comer?",
|
|
22
34
|
noResultsFound: "No se encontraron resultados.",
|
|
@@ -40,7 +52,19 @@ class Translator {
|
|
|
40
52
|
region: "Region",
|
|
41
53
|
type: "Type",
|
|
42
54
|
moreInfo: "More info"
|
|
43
|
-
}
|
|
55
|
+
},
|
|
56
|
+
de: {
|
|
57
|
+
welcomeMessage: "Verbessern Sie Ihr kulinarisches Erlebnis. Geben Sie einfach die Details Ihres Gerichts an und erhalten Sie die ideale Weinempfehlung. Was möchten Sie essen?",
|
|
58
|
+
noResultsFound: "Keine Ergebnisse gefunden.",
|
|
59
|
+
somethingWentWrong: "Entschuldigung, etwas ist schief gelaufen.",
|
|
60
|
+
chatButton: "Wein zum Abendessen kombinieren",
|
|
61
|
+
inputPlaceholder: "z.B., Thunfischsalat",
|
|
62
|
+
sendButton: "Kombinieren",
|
|
63
|
+
price: "Preis",
|
|
64
|
+
region: "Region",
|
|
65
|
+
type: "Typ",
|
|
66
|
+
moreInfo: "Mehr Info"
|
|
67
|
+
}
|
|
44
68
|
};
|
|
45
69
|
}
|
|
46
70
|
|
package/src/js/styles.js
CHANGED