wineater-bot 1.7.0 → 1.7.2
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 +72 -70
- package/dist/wineater-chatbot.umd.js +4 -4
- package/package.json +1 -1
- package/src/index.js +2 -2
- package/src/js/api.js +2 -2
- package/src/js/chatbot.js +1 -1
|
@@ -282,35 +282,35 @@ g.textContent = b;
|
|
|
282
282
|
document.head.appendChild(g);
|
|
283
283
|
function y() {
|
|
284
284
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(o) {
|
|
285
|
-
const
|
|
286
|
-
return (o === "x" ?
|
|
285
|
+
const t = Math.random() * 16 | 0;
|
|
286
|
+
return (o === "x" ? t : t & 3 | 8).toString(16);
|
|
287
287
|
});
|
|
288
288
|
}
|
|
289
|
-
function h(o,
|
|
289
|
+
function h(o, t, e) {
|
|
290
290
|
let n = "";
|
|
291
|
-
if (
|
|
291
|
+
if (e) {
|
|
292
292
|
const i = /* @__PURE__ */ new Date();
|
|
293
|
-
i.setTime(i.getTime() +
|
|
293
|
+
i.setTime(i.getTime() + e * 24 * 60 * 60 * 1e3), n = "; expires=" + i.toUTCString();
|
|
294
294
|
}
|
|
295
|
-
document.cookie = o + "=" + (
|
|
295
|
+
document.cookie = o + "=" + (t || "") + n + "; path=/; secure; samesite=strict";
|
|
296
296
|
}
|
|
297
297
|
function s(o) {
|
|
298
|
-
const
|
|
299
|
-
for (let n = 0; n <
|
|
300
|
-
let i =
|
|
298
|
+
const t = o + "=", e = document.cookie.split(";");
|
|
299
|
+
for (let n = 0; n < e.length; n++) {
|
|
300
|
+
let i = e[n];
|
|
301
301
|
for (; i.charAt(0) === " "; )
|
|
302
302
|
i = i.substring(1, i.length);
|
|
303
|
-
if (i.indexOf(
|
|
304
|
-
return i.substring(
|
|
303
|
+
if (i.indexOf(t) === 0)
|
|
304
|
+
return i.substring(t.length, i.length);
|
|
305
305
|
}
|
|
306
306
|
return null;
|
|
307
307
|
}
|
|
308
308
|
function x() {
|
|
309
309
|
const o = "uniqueUserID";
|
|
310
|
-
let
|
|
311
|
-
return
|
|
310
|
+
let t = s(o);
|
|
311
|
+
return t || (t = y(), h(o, t, 365)), t;
|
|
312
312
|
}
|
|
313
|
-
function d(o,
|
|
313
|
+
function d(o, t) {
|
|
314
314
|
fetch("https://api.wineater.com/proxy/track", {
|
|
315
315
|
method: "POST",
|
|
316
316
|
headers: {
|
|
@@ -318,7 +318,7 @@ function d(o, e) {
|
|
|
318
318
|
},
|
|
319
319
|
body: JSON.stringify({
|
|
320
320
|
event: o,
|
|
321
|
-
properties:
|
|
321
|
+
properties: t
|
|
322
322
|
})
|
|
323
323
|
}).then((i) => {
|
|
324
324
|
i.ok || console.error("Mixpanel tracking failed", i);
|
|
@@ -342,8 +342,8 @@ function k(o) {
|
|
|
342
342
|
d("Product Clicked", { distinct_id: s("uniqueUserID"), product_id: o, client: s("chatbotToken") });
|
|
343
343
|
}
|
|
344
344
|
function m() {
|
|
345
|
-
const o = document.getElementById("chat-window"),
|
|
346
|
-
o.classList.contains("visible") ? (u(), o.classList.remove("visible"),
|
|
345
|
+
const o = document.getElementById("chat-window"), t = document.getElementById("chat-icon");
|
|
346
|
+
o.classList.contains("visible") ? (u(), o.classList.remove("visible"), t.style.display = "flex") : (p(), o.classList.add("visible"), t.style.display = "none");
|
|
347
347
|
}
|
|
348
348
|
function I() {
|
|
349
349
|
u(), document.getElementById("chat-window").classList.remove("visible");
|
|
@@ -356,44 +356,44 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
356
356
|
});
|
|
357
357
|
const C = ["climats", "telckel", "biobio", "weinpoint", "vinigrandi"], T = "OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";
|
|
358
358
|
class f {
|
|
359
|
-
constructor(
|
|
360
|
-
var
|
|
361
|
-
this.baseURL = "
|
|
359
|
+
constructor(t) {
|
|
360
|
+
var e;
|
|
361
|
+
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) || T;
|
|
362
362
|
}
|
|
363
|
-
async getStoreConfig(
|
|
364
|
-
console.log(
|
|
363
|
+
async getStoreConfig(t) {
|
|
364
|
+
console.log(t);
|
|
365
365
|
try {
|
|
366
|
-
const
|
|
366
|
+
const e = await fetch(`${this.baseURL}stores/store`, {
|
|
367
367
|
method: "POST",
|
|
368
368
|
headers: {
|
|
369
369
|
"Content-Type": "application/json",
|
|
370
370
|
Authorization: `Bearer ${this.token}`
|
|
371
371
|
},
|
|
372
|
-
body: JSON.stringify({ store:
|
|
372
|
+
body: JSON.stringify({ store: t })
|
|
373
373
|
});
|
|
374
|
-
if (!
|
|
375
|
-
throw new Error(`HTTP error! Status: ${
|
|
376
|
-
return await
|
|
377
|
-
} catch (
|
|
378
|
-
throw console.error("Error fetching store configuration:",
|
|
374
|
+
if (!e.ok)
|
|
375
|
+
throw new Error(`HTTP error! Status: ${e.status}`);
|
|
376
|
+
return await e.json();
|
|
377
|
+
} catch (e) {
|
|
378
|
+
throw console.error("Error fetching store configuration:", e), e;
|
|
379
379
|
}
|
|
380
380
|
}
|
|
381
|
-
async getWineRecommendations(
|
|
381
|
+
async getWineRecommendations(t) {
|
|
382
382
|
console.log(window.location.href);
|
|
383
383
|
try {
|
|
384
|
-
const
|
|
384
|
+
const e = await fetch(`${this.baseURL}dish/recommendations`, {
|
|
385
385
|
method: "POST",
|
|
386
386
|
headers: {
|
|
387
387
|
"Content-Type": "application/json",
|
|
388
388
|
Authorization: `Bearer ${this.token}`
|
|
389
389
|
},
|
|
390
|
-
body: JSON.stringify({ text:
|
|
391
|
-
}), n = await
|
|
392
|
-
if (!
|
|
393
|
-
throw new Error(`API call failed with status ${
|
|
390
|
+
body: JSON.stringify({ text: t, store: this.store ? this.store.toString().charAt(0).toUpperCase() + this.store.slice(1) : void 0 })
|
|
391
|
+
}), n = await e.json();
|
|
392
|
+
if (!e.ok)
|
|
393
|
+
throw new Error(`API call failed with status ${e.status}: ${n.message || "No additional error information"}`);
|
|
394
394
|
return n;
|
|
395
|
-
} catch (
|
|
396
|
-
throw console.error("Fetching wine recommendations failed:",
|
|
395
|
+
} catch (e) {
|
|
396
|
+
throw console.error("Fetching wine recommendations failed:", e.message), new Error(`Error in getWineRecommendations: ${e.message}`);
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
399
|
}
|
|
@@ -454,41 +454,42 @@ class B {
|
|
|
454
454
|
}
|
|
455
455
|
};
|
|
456
456
|
}
|
|
457
|
-
async fetchConfig(
|
|
457
|
+
async fetchConfig(t = "Demo") {
|
|
458
458
|
try {
|
|
459
|
-
const
|
|
460
|
-
this.language =
|
|
459
|
+
const e = await this.api.getStoreConfig(t);
|
|
460
|
+
this.language = e.lang;
|
|
461
461
|
} catch {
|
|
462
462
|
this.language = "en";
|
|
463
463
|
}
|
|
464
464
|
}
|
|
465
|
-
translate(
|
|
466
|
-
return this.translations[this.language][
|
|
465
|
+
translate(t) {
|
|
466
|
+
return this.translations[this.language][t] || t;
|
|
467
467
|
}
|
|
468
468
|
}
|
|
469
469
|
const a = new B();
|
|
470
470
|
class S {
|
|
471
471
|
constructor() {
|
|
472
|
+
var e;
|
|
472
473
|
this.api = new f();
|
|
473
|
-
const e = window.wineaterData.FIRST_MESSAGE_TEXT || a.translate("welcomeMessage");
|
|
474
|
-
this.displayFirstMessage(
|
|
474
|
+
const t = ((e = window == null ? void 0 : window.wineaterData) == null ? void 0 : e.FIRST_MESSAGE_TEXT) || a.translate("welcomeMessage");
|
|
475
|
+
this.displayFirstMessage(t);
|
|
475
476
|
}
|
|
476
477
|
initialize() {
|
|
477
478
|
document.getElementById("send-button").addEventListener("click", () => this.handleUserInput()), document.getElementById("user-input").addEventListener("keypress", (n) => {
|
|
478
479
|
n.key === "Enter" && this.handleUserInput();
|
|
479
480
|
});
|
|
480
481
|
}
|
|
481
|
-
displayFirstMessage(
|
|
482
|
+
displayFirstMessage(t, e = "api") {
|
|
482
483
|
const n = document.getElementById("message-container"), i = document.createElement("div");
|
|
483
|
-
i.className = `message ${
|
|
484
|
+
i.className = `message ${e}`, i.textContent = t, n.appendChild(i), n.scrollTop = n.scrollHeight;
|
|
484
485
|
}
|
|
485
486
|
async handleUserInput() {
|
|
486
|
-
const
|
|
487
|
-
if (
|
|
488
|
-
this.displayMessage(
|
|
487
|
+
const t = document.getElementById("user-input"), e = t.value.trim();
|
|
488
|
+
if (e) {
|
|
489
|
+
this.displayMessage(e, "user"), t.value = "", this.showTypingIndicator();
|
|
489
490
|
try {
|
|
490
|
-
w(
|
|
491
|
-
const n = await this.api.getWineRecommendations(
|
|
491
|
+
w(e);
|
|
492
|
+
const n = await this.api.getWineRecommendations(e);
|
|
492
493
|
this.hideTypingIndicator(), n && n.length ? this.displayResults(n) : this.displayMessage("No results found.", "api");
|
|
493
494
|
} catch {
|
|
494
495
|
this.hideTypingIndicator(), this.displayMessage(a.translate("somethingWentWrong"), "api");
|
|
@@ -501,16 +502,16 @@ class S {
|
|
|
501
502
|
hideTypingIndicator() {
|
|
502
503
|
document.getElementById("typing-indicator").classList.remove("visible");
|
|
503
504
|
}
|
|
504
|
-
displayMessage(
|
|
505
|
+
displayMessage(t, e) {
|
|
505
506
|
const n = document.getElementById("message-container"), i = document.createElement("div");
|
|
506
|
-
i.textContent =
|
|
507
|
+
i.textContent = t, i.className = "message " + e, n.appendChild(i), n.scrollTop = n.scrollHeight;
|
|
507
508
|
}
|
|
508
|
-
sendAnalytics(
|
|
509
|
-
k(
|
|
509
|
+
sendAnalytics(t) {
|
|
510
|
+
k(t);
|
|
510
511
|
}
|
|
511
|
-
displayResults(
|
|
512
|
-
const
|
|
513
|
-
v(
|
|
512
|
+
displayResults(t) {
|
|
513
|
+
const e = document.getElementById("message-container");
|
|
514
|
+
v(t.map((n) => n.Title)), t.forEach((n) => {
|
|
514
515
|
const i = document.createElement("div");
|
|
515
516
|
i.className = "wine-item";
|
|
516
517
|
const r = document.createElement("img");
|
|
@@ -522,8 +523,8 @@ class S {
|
|
|
522
523
|
${a.translate("region")}: ${n.Region}<br>
|
|
523
524
|
${a.translate("type")}: ${n.Type}<br>
|
|
524
525
|
<a href="${n.Url}" onclick="sendAnalytics(${n.Title})" target="_blank">${a.translate("moreInfo")}</a>
|
|
525
|
-
`, i.appendChild(c),
|
|
526
|
-
}),
|
|
526
|
+
`, i.appendChild(c), e.appendChild(i), this.displayFirstMessage(n.Reason);
|
|
527
|
+
}), e.scrollTop = e.scrollHeight;
|
|
527
528
|
}
|
|
528
529
|
}
|
|
529
530
|
const W = "OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";
|
|
@@ -531,11 +532,12 @@ document.addEventListener("DOMContentLoaded", () => {
|
|
|
531
532
|
window.toggleChatWindow = m, window.closeChatWindow = I, window.openChatWindow = E;
|
|
532
533
|
});
|
|
533
534
|
function L() {
|
|
534
|
-
|
|
535
|
+
var e;
|
|
536
|
+
const t = `
|
|
535
537
|
<div id="chatbot-container">
|
|
536
538
|
<div id="chat-icon" onclick="toggleChatWindow()">
|
|
537
539
|
<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 -->
|
|
538
|
-
<span>${window.wineaterData.BUTTON_TEXT || a.translate("chatButton")}</span>
|
|
540
|
+
<span>${((e = window == null ? void 0 : window.wineaterData) == null ? void 0 : e.BUTTON_TEXT) || a.translate("chatButton")}</span>
|
|
539
541
|
</div>
|
|
540
542
|
|
|
541
543
|
<div id="chat-window" class="hidden">
|
|
@@ -560,30 +562,30 @@ function L() {
|
|
|
560
562
|
</div>
|
|
561
563
|
</div>
|
|
562
564
|
`;
|
|
563
|
-
document.body.insertAdjacentHTML("beforeend",
|
|
565
|
+
document.body.insertAdjacentHTML("beforeend", t);
|
|
564
566
|
}
|
|
565
567
|
function P() {
|
|
566
568
|
document.getElementById("close-btn").addEventListener("click", m);
|
|
567
569
|
}
|
|
568
570
|
function O() {
|
|
569
571
|
window.addEventListener("click", function(o) {
|
|
570
|
-
const
|
|
571
|
-
!
|
|
572
|
+
const t = document.getElementById("chat-window"), e = document.getElementById("chat-icon");
|
|
573
|
+
!t.contains(o.target) && !e.contains(o.target) && (t.classList.remove("visible"), e.style.display = "flex");
|
|
572
574
|
});
|
|
573
575
|
}
|
|
574
576
|
function M(o) {
|
|
575
577
|
console.log(o);
|
|
576
|
-
const
|
|
577
|
-
|
|
578
|
+
const t = document.getElementById("chat-icon"), e = document.getElementById("chat-window");
|
|
579
|
+
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");
|
|
578
580
|
}
|
|
579
581
|
var l;
|
|
580
582
|
if (typeof window < "u") {
|
|
581
|
-
let o = ((l = window.wineaterData) == null ? void 0 : l.POSITION) || "bottom-right";
|
|
583
|
+
let o = ((l = window == null ? void 0 : window.wineaterData) == null ? void 0 : l.POSITION) || "bottom-right";
|
|
582
584
|
window.addEventListener("DOMContentLoaded", async () => {
|
|
583
585
|
var r;
|
|
584
|
-
const
|
|
586
|
+
const e = ["climats", "telckel", "biobio", "weinpoint", "vinigrandi"].find((c) => window.location.href.includes(c)) || null;
|
|
585
587
|
let n;
|
|
586
|
-
|
|
588
|
+
e && (n = e.charAt(0).toUpperCase() + e.slice(1), n === "Biobio" && (o = "right-center")), await a.fetchConfig(n || "Demo"), L(), P(), O(), M(o), h("chatbotToken", ((r = window.wineaterData) == null ? void 0 : r.CLIENT_TOKEN) || W, 365), x(), new S().initialize();
|
|
587
589
|
});
|
|
588
590
|
}
|
|
589
591
|
export {
|
|
@@ -277,17 +277,17 @@
|
|
|
277
277
|
.typing-indicator.visible {
|
|
278
278
|
visibility: visible;
|
|
279
279
|
height: 50px;
|
|
280
|
-
}`,p=document.createElement("style");p.textContent=d,document.head.appendChild(p);function v(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(o){const
|
|
280
|
+
}`,p=document.createElement("style");p.textContent=d,document.head.appendChild(p);function v(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(o){const t=Math.random()*16|0;return(o==="x"?t:t&3|8).toString(16)})}function u(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 s(o){const t=o+"=",e=document.cookie.split(";");for(let n=0;n<e.length;n++){let i=e[n];for(;i.charAt(0)===" ";)i=i.substring(1,i.length);if(i.indexOf(t)===0)return i.substring(t.length,i.length)}return null}function k(){const o="uniqueUserID";let t=s(o);return t||(t=v(),u(o,t,365)),t}function c(o,t){fetch("https://api.wineater.com/proxy/track",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({event:o,properties:t})}).then(i=>{i.ok||console.error("Mixpanel tracking failed",i)}).catch(i=>{console.error("Mixpanel tracking error",i)})}function m(){c("Chatbot Opened",{distinct_id:s("uniqueUserID"),client:s("chatbotToken")})}function f(){c("Chatbot Closed",{distinct_id:s("uniqueUserID"),client:s("chatbotToken")})}function I(o){c("Message Sent",{distinct_id:s("uniqueUserID"),message_content:o,client:s("chatbotToken")})}function E(o){c("Products Got",{distinct_id:s("uniqueUserID"),products:o,client:s("chatbotToken")})}function C(o){c("Product Clicked",{distinct_id:s("uniqueUserID"),product_id:o,client:s("chatbotToken")})}function h(){const o=document.getElementById("chat-window"),t=document.getElementById("chat-icon");o.classList.contains("visible")?(f(),o.classList.remove("visible"),t.style.display="flex"):(m(),o.classList.add("visible"),t.style.display="none")}function b(){f(),document.getElementById("chat-window").classList.remove("visible")}function y(){m(),document.getElementById("chat-window").classList.add("visible")}document.addEventListener("DOMContentLoaded",()=>{setupCloseButton(),setupOutsideClick()});const T=["climats","telckel","biobio","weinpoint","vinigrandi"],B="OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";class w{constructor(t){var e;this.baseURL="https://api.wineater.com/",this.store=T.find(n=>window.location.href.includes(n)),this.token=((e=window==null?void 0:window.wineaterData)==null?void 0:e.CLIENT_TOKEN)||B}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 W{constructor(){this.api=new w,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",reason:"Suggestion",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",reason:"Sugerencia",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",reason:"Suggestion",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",inputPlaceholder:"z.B., Thunfischsalat",sendButton:"Kombinieren",price:"Preis",region:"Region",type:"Typ",reason:"Anregung",moreInfo:"Mehr Info"}}}async fetchConfig(t="Demo"){try{const e=await this.api.getStoreConfig(t);this.language=e.lang}catch{this.language="en"}}translate(t){return this.translations[this.language][t]||t}}const a=new W;class S{constructor(){var e;this.api=new w;const t=((e=window==null?void 0:window.wineaterData)==null?void 0:e.FIRST_MESSAGE_TEXT)||a.translate("welcomeMessage");this.displayFirstMessage(t)}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{I(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(a.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){C(t)}displayResults(t){const e=document.getElementById("message-container");E(t.map(n=>n.Title)),t.forEach(n=>{const i=document.createElement("div");i.className="wine-item";const l=document.createElement("img");l.src=n.Image,i.appendChild(l);const g=document.createElement("div");g.innerHTML=`
|
|
281
281
|
<strong>${n.Title}</strong><br>
|
|
282
282
|
${a.translate("price")}: ${n.Price}<br>
|
|
283
283
|
${a.translate("region")}: ${n.Region}<br>
|
|
284
284
|
${a.translate("type")}: ${n.Type}<br>
|
|
285
285
|
<a href="${n.Url}" onclick="sendAnalytics(${n.Title})" target="_blank">${a.translate("moreInfo")}</a>
|
|
286
|
-
`,i.appendChild(g),
|
|
286
|
+
`,i.appendChild(g),e.appendChild(i),this.displayFirstMessage(n.Reason)}),e.scrollTop=e.scrollHeight}}const L="OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";document.addEventListener("DOMContentLoaded",()=>{window.toggleChatWindow=h,window.closeChatWindow=b,window.openChatWindow=y});function P(){var e;const t=`
|
|
287
287
|
<div id="chatbot-container">
|
|
288
288
|
<div id="chat-icon" onclick="toggleChatWindow()">
|
|
289
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 -->
|
|
290
|
-
<span>${window.wineaterData.BUTTON_TEXT||a.translate("chatButton")}</span>
|
|
290
|
+
<span>${((e=window==null?void 0:window.wineaterData)==null?void 0:e.BUTTON_TEXT)||a.translate("chatButton")}</span>
|
|
291
291
|
</div>
|
|
292
292
|
|
|
293
293
|
<div id="chat-window" class="hidden">
|
|
@@ -311,4 +311,4 @@
|
|
|
311
311
|
</div>
|
|
312
312
|
</div>
|
|
313
313
|
</div>
|
|
314
|
-
`;document.body.insertAdjacentHTML("beforeend",
|
|
314
|
+
`;document.body.insertAdjacentHTML("beforeend",t)}function O(){document.getElementById("close-btn").addEventListener("click",h)}function M(){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 D(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"){let o=((x=window==null?void 0:window.wineaterData)==null?void 0:x.POSITION)||"bottom-right";window.addEventListener("DOMContentLoaded",async()=>{var l;const e=["climats","telckel","biobio","weinpoint","vinigrandi"].find(g=>window.location.href.includes(g))||null;let n;e&&(n=e.charAt(0).toUpperCase()+e.slice(1),n==="Biobio"&&(o="right-center")),await a.fetchConfig(n||"Demo"),P(),O(),M(),D(o),u("chatbotToken",((l=window.wineaterData)==null?void 0:l.CLIENT_TOKEN)||L,365),k(),new S().initialize()})}r.closeChatWindow=b,r.openChatWindow=y,r.toggleChatWindow=h,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -28,7 +28,7 @@ export {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
function createChatbotUI() {
|
|
31
|
-
const buttonText = window
|
|
31
|
+
const buttonText = window?.wineaterData?.BUTTON_TEXT || translator.translate('chatButton');
|
|
32
32
|
const chatbotHTML = `
|
|
33
33
|
<div id="chatbot-container">
|
|
34
34
|
<div id="chat-icon" onclick="toggleChatWindow()">
|
|
@@ -98,7 +98,7 @@ function toggleChatIconPosition(position) {
|
|
|
98
98
|
|
|
99
99
|
// If you want to initialize your chatbot automatically when the script is loaded
|
|
100
100
|
if (typeof window !== 'undefined') {
|
|
101
|
-
let position = window
|
|
101
|
+
let position = window?.wineaterData?.POSITION || 'bottom-right';
|
|
102
102
|
window.addEventListener('DOMContentLoaded', async () => {
|
|
103
103
|
const stores = ['climats', 'telckel', 'biobio', 'weinpoint', 'vinigrandi'];
|
|
104
104
|
const store = stores.find(value => window.location.href.includes(value)) || null;
|
package/src/js/api.js
CHANGED
|
@@ -6,8 +6,8 @@ const DEMO_TOKEN='OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOO
|
|
|
6
6
|
export class Api {
|
|
7
7
|
constructor(apiEndpoint) {
|
|
8
8
|
// Allow users of the library to specify their own endpoint if needed
|
|
9
|
-
|
|
10
|
-
this.baseURL = 'http://localhost:3000/'
|
|
9
|
+
this.baseURL = 'https://api.wineater.com/';
|
|
10
|
+
// this.baseURL = 'http://localhost:3000/'
|
|
11
11
|
this.store = stores.find(value => window.location.href.includes(value));
|
|
12
12
|
this.token = window?.wineaterData?.CLIENT_TOKEN || DEMO_TOKEN;
|
|
13
13
|
}
|
package/src/js/chatbot.js
CHANGED
|
@@ -6,7 +6,7 @@ import { trackMessageSent, trackProductClick, trackRecommendationsGet } from './
|
|
|
6
6
|
export class Chatbot {
|
|
7
7
|
constructor() {
|
|
8
8
|
this.api = new Api(); // Instantiate the Api class
|
|
9
|
-
const firstMessageText = window
|
|
9
|
+
const firstMessageText = window?.wineaterData?.FIRST_MESSAGE_TEXT || translator.translate('welcomeMessage');
|
|
10
10
|
this.displayFirstMessage(firstMessageText);
|
|
11
11
|
}
|
|
12
12
|
|