wineater-bot 1.4.4 → 1.5.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.
@@ -276,40 +276,43 @@ const f = `
276
276
  }`, p = document.createElement("style");
277
277
  p.textContent = f;
278
278
  document.head.appendChild(p);
279
- function b(n, e, t) {
279
+ function b(n, t, e) {
280
280
  let o = "";
281
- if (t) {
281
+ if (e) {
282
282
  const i = /* @__PURE__ */ new Date();
283
- i.setTime(i.getTime() + t * 24 * 60 * 60 * 1e3), o = "; expires=" + i.toUTCString();
283
+ i.setTime(i.getTime() + e * 24 * 60 * 60 * 1e3), o = "; expires=" + i.toUTCString();
284
284
  }
285
- document.cookie = n + "=" + (e || "") + o + "; path=/; secure; samesite=strict";
285
+ document.cookie = n + "=" + (t || "") + o + "; path=/; secure; samesite=strict";
286
286
  }
287
287
  function r(n) {
288
- const t = `; ${document.cookie}`.split(`; ${n}=`);
289
- if (t.length === 2)
290
- return t.pop().split(";").shift();
291
- }
292
- function d(n, e) {
293
- fetch("https://api-eu.mixpanel.com/track", {
288
+ const e = `; ${document.cookie}`.split(`; ${n}=`);
289
+ if (e.length === 2)
290
+ return e.pop().split(";").shift();
291
+ }
292
+ function d(n, t) {
293
+ const e = "6f3d90d5b02720f58de3663e3ef675fe", o = "https://api-eu.mixpanel.com/track", i = {
294
+ event: n,
295
+ properties: {
296
+ token: e,
297
+ ...t
298
+ }
299
+ };
300
+ fetch(o, {
294
301
  method: "POST",
295
302
  headers: {
296
- "Content-Type": "application/json",
297
- Authentication: "6f3d90d5b02720f58de3663e3ef675fe"
303
+ "Content-Type": "application/json"
298
304
  },
299
- body: JSON.stringify({
300
- event: n,
301
- properties: e
302
- })
303
- }).then((a) => {
304
- a.ok || console.error("Mixpanel tracking failed", a);
305
- }).catch((a) => {
306
- console.error("Mixpanel tracking error", a);
305
+ body: JSON.stringify(i)
306
+ }).then((s) => {
307
+ s.ok || console.error("Mixpanel tracking failed", s);
308
+ }).catch((s) => {
309
+ console.error("Mixpanel tracking error", s);
307
310
  });
308
311
  }
309
- function h() {
312
+ function g() {
310
313
  d("Chatbot Opened", { distinct_id: r("chatbotToken") });
311
314
  }
312
- function g() {
315
+ function h() {
313
316
  d("Chatbot Closed", { distinct_id: r("chatbotToken") });
314
317
  }
315
318
  function y(n) {
@@ -322,58 +325,58 @@ function x(n) {
322
325
  d("Product Clicked", { distinct_id: r("chatbotToken"), product_id: n });
323
326
  }
324
327
  function u() {
325
- const n = document.getElementById("chat-window"), e = document.getElementById("chat-icon");
326
- n.classList.contains("visible") ? (g(), n.classList.remove("visible"), e.style.display = "flex") : (h(), n.classList.add("visible"), e.style.display = "none");
328
+ const n = document.getElementById("chat-window"), t = document.getElementById("chat-icon");
329
+ n.classList.contains("visible") ? (h(), n.classList.remove("visible"), t.style.display = "flex") : (g(), n.classList.add("visible"), t.style.display = "none");
327
330
  }
328
331
  function v() {
329
- g(), document.getElementById("chat-window").classList.remove("visible");
332
+ h(), document.getElementById("chat-window").classList.remove("visible");
330
333
  }
331
334
  function k() {
332
- h(), document.getElementById("chat-window").classList.add("visible");
335
+ g(), document.getElementById("chat-window").classList.add("visible");
333
336
  }
334
337
  document.addEventListener("DOMContentLoaded", () => {
335
338
  setupCloseButton(), setupOutsideClick();
336
339
  });
337
340
  const C = ["climats", "telckel", "biobio", "weinpoint"], E = "OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";
338
341
  class m {
339
- constructor(e) {
340
- var t;
341
- this.baseURL = "https://api.wineater.com/", this.store = C.find((o) => window.location.href.includes(o)), this.token = ((t = window == null ? void 0 : window.wineaterData) == null ? void 0 : t.CLIENT_TOKEN) || E;
342
+ constructor(t) {
343
+ var e;
344
+ this.baseURL = "https://api.wineater.com/", this.store = C.find((o) => window.location.href.includes(o)), this.token = ((e = window == null ? void 0 : window.wineaterData) == null ? void 0 : e.CLIENT_TOKEN) || E;
342
345
  }
343
- async getStoreConfig(e) {
344
- console.log(e);
346
+ async getStoreConfig(t) {
347
+ console.log(t);
345
348
  try {
346
- const t = await fetch(`${this.baseURL}stores/store`, {
349
+ const e = await fetch(`${this.baseURL}stores/store`, {
347
350
  method: "POST",
348
351
  headers: {
349
352
  "Content-Type": "application/json",
350
353
  Authorization: `Bearer ${this.token}`
351
354
  },
352
- body: JSON.stringify({ store: e })
355
+ body: JSON.stringify({ store: t })
353
356
  });
354
- if (!t.ok)
355
- throw new Error(`HTTP error! Status: ${t.status}`);
356
- return await t.json();
357
- } catch (t) {
358
- throw console.error("Error fetching store configuration:", t), t;
357
+ if (!e.ok)
358
+ throw new Error(`HTTP error! Status: ${e.status}`);
359
+ return await e.json();
360
+ } catch (e) {
361
+ throw console.error("Error fetching store configuration:", e), e;
359
362
  }
360
363
  }
361
- async getWineRecommendations(e) {
364
+ async getWineRecommendations(t) {
362
365
  console.log(window.location.href);
363
366
  try {
364
- const t = await fetch(`${this.baseURL}dish/recommendations`, {
367
+ const e = await fetch(`${this.baseURL}dish/recommendations`, {
365
368
  method: "POST",
366
369
  headers: {
367
370
  "Content-Type": "application/json",
368
371
  Authorization: `Bearer ${this.token}`
369
372
  },
370
- body: JSON.stringify({ text: e, store: this.store ? this.store.toString().charAt(0).toUpperCase() + this.store.slice(1) : void 0 })
371
- }), o = await t.json();
372
- if (!t.ok)
373
- throw new Error(`API call failed with status ${t.status}: ${o.message || "No additional error information"}`);
373
+ body: JSON.stringify({ text: t, store: this.store ? this.store.toString().charAt(0).toUpperCase() + this.store.slice(1) : void 0 })
374
+ }), o = await e.json();
375
+ if (!e.ok)
376
+ throw new Error(`API call failed with status ${e.status}: ${o.message || "No additional error information"}`);
374
377
  return o;
375
- } catch (t) {
376
- throw console.error("Fetching wine recommendations failed:", t.message), new Error(`Error in getWineRecommendations: ${t.message}`);
378
+ } catch (e) {
379
+ throw console.error("Fetching wine recommendations failed:", e.message), new Error(`Error in getWineRecommendations: ${e.message}`);
377
380
  }
378
381
  }
379
382
  }
@@ -418,40 +421,40 @@ class I {
418
421
  }
419
422
  };
420
423
  }
421
- async fetchConfig(e) {
422
- if (e) {
423
- const t = await this.api.getStoreConfig(e);
424
- this.language = t.lang;
424
+ async fetchConfig(t) {
425
+ if (t) {
426
+ const e = await this.api.getStoreConfig(t);
427
+ this.language = e.lang;
425
428
  }
426
429
  }
427
- translate(e) {
428
- return this.translations[this.language][e] || e;
430
+ translate(t) {
431
+ return this.translations[this.language][t] || t;
429
432
  }
430
433
  }
431
- const s = new I();
434
+ const a = new I();
432
435
  class T {
433
436
  constructor() {
434
- this.api = new m(), this.displayFirstMessage(s.translate("welcomeMessage"));
437
+ this.api = new m(), this.displayFirstMessage(a.translate("welcomeMessage"));
435
438
  }
436
439
  initialize() {
437
440
  document.getElementById("send-button").addEventListener("click", () => this.handleUserInput()), document.getElementById("user-input").addEventListener("keypress", (o) => {
438
441
  o.key === "Enter" && this.handleUserInput();
439
442
  });
440
443
  }
441
- displayFirstMessage(e, t = "api") {
444
+ displayFirstMessage(t, e = "api") {
442
445
  const o = document.getElementById("message-container"), i = document.createElement("div");
443
- i.className = `message ${t}`, i.textContent = e, o.appendChild(i), o.scrollTop = o.scrollHeight;
446
+ i.className = `message ${e}`, i.textContent = t, o.appendChild(i), o.scrollTop = o.scrollHeight;
444
447
  }
445
448
  async handleUserInput() {
446
- const e = document.getElementById("user-input"), t = e.value.trim();
447
- if (t) {
448
- this.displayMessage(t, "user"), e.value = "", this.showTypingIndicator();
449
+ const t = document.getElementById("user-input"), e = t.value.trim();
450
+ if (e) {
451
+ this.displayMessage(e, "user"), t.value = "", this.showTypingIndicator();
449
452
  try {
450
- y(t);
451
- const o = await this.api.getWineRecommendations(t);
453
+ y(e);
454
+ const o = await this.api.getWineRecommendations(e);
452
455
  this.hideTypingIndicator(), o && o.length ? this.displayResults(o) : this.displayMessage("No results found.", "api");
453
456
  } catch {
454
- this.hideTypingIndicator(), this.displayMessage(s.translate("somethingWentWrong"), "api");
457
+ this.hideTypingIndicator(), this.displayMessage(a.translate("somethingWentWrong"), "api");
455
458
  }
456
459
  }
457
460
  }
@@ -461,29 +464,29 @@ class T {
461
464
  hideTypingIndicator() {
462
465
  document.getElementById("typing-indicator").classList.remove("visible");
463
466
  }
464
- displayMessage(e, t) {
467
+ displayMessage(t, e) {
465
468
  const o = document.getElementById("message-container"), i = document.createElement("div");
466
- i.textContent = e, i.className = "message " + t, o.appendChild(i), o.scrollTop = o.scrollHeight;
469
+ i.textContent = t, i.className = "message " + e, o.appendChild(i), o.scrollTop = o.scrollHeight;
467
470
  }
468
- sendAnalytics(e) {
469
- x(e);
471
+ sendAnalytics(t) {
472
+ x(t);
470
473
  }
471
- displayResults(e) {
472
- const t = document.getElementById("message-container");
473
- w(e.map((o) => o.Title)), e.forEach((o) => {
474
+ displayResults(t) {
475
+ const e = document.getElementById("message-container");
476
+ w(t.map((o) => o.Title)), t.forEach((o) => {
474
477
  const i = document.createElement("div");
475
478
  i.className = "wine-item";
476
- const a = document.createElement("img");
477
- a.src = o.Image, i.appendChild(a);
479
+ const s = document.createElement("img");
480
+ s.src = o.Image, i.appendChild(s);
478
481
  const c = document.createElement("div");
479
482
  c.innerHTML = `
480
483
  <strong>${o.Title}</strong><br>
481
- ${s.translate("price")}: ${o.Price}<br>
482
- ${s.translate("region")}: ${o.Region}<br>
483
- ${s.translate("type")}: ${o.Type}<br>
484
- <a href="${o.Url}" onclick="sendAnalytics(${o.Title})" target="_blank">${s.translate("moreInfo")}</a>
485
- `, i.appendChild(c), t.appendChild(i);
486
- }), t.scrollTop = t.scrollHeight;
484
+ ${a.translate("price")}: ${o.Price}<br>
485
+ ${a.translate("region")}: ${o.Region}<br>
486
+ ${a.translate("type")}: ${o.Type}<br>
487
+ <a href="${o.Url}" onclick="sendAnalytics(${o.Title})" target="_blank">${a.translate("moreInfo")}</a>
488
+ `, i.appendChild(c), e.appendChild(i);
489
+ }), e.scrollTop = e.scrollHeight;
487
490
  }
488
491
  }
489
492
  document.addEventListener("DOMContentLoaded", () => {
@@ -494,7 +497,7 @@ function B() {
494
497
  <div id="chatbot-container">
495
498
  <div id="chat-icon" onclick="toggleChatWindow()">
496
499
  <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 -->
497
- <span>${s.translate("chatButton")}</span>
500
+ <span>${a.translate("chatButton")}</span>
498
501
  </div>
499
502
 
500
503
  <div id="chat-window" class="hidden">
@@ -511,8 +514,8 @@ function B() {
511
514
  <span></span><span></span><span></span>
512
515
  </div>
513
516
  <div id="input-container">
514
- <input type="text" id="user-input" placeholder="${s.translate("inputPlaceholder")}">
515
- <button id="send-button">${s.translate("sendButton")}</button>
517
+ <input type="text" id="user-input" placeholder="${a.translate("inputPlaceholder")}">
518
+ <button id="send-button">${a.translate("sendButton")}</button>
516
519
  </div>
517
520
  </div>
518
521
  </div>
@@ -524,23 +527,23 @@ function L() {
524
527
  }
525
528
  function P() {
526
529
  window.addEventListener("click", function(n) {
527
- const e = document.getElementById("chat-window"), t = document.getElementById("chat-icon");
528
- !e.contains(n.target) && !t.contains(n.target) && (e.classList.remove("visible"), t.style.display = "flex");
530
+ const t = document.getElementById("chat-window"), e = document.getElementById("chat-icon");
531
+ !t.contains(n.target) && !e.contains(n.target) && (t.classList.remove("visible"), e.style.display = "flex");
529
532
  });
530
533
  }
531
534
  function W(n) {
532
535
  console.log(n);
533
- const e = document.getElementById("chat-icon"), t = document.getElementById("chat-window");
534
- e.className = "", t.className = "", n === "right-center" ? (e.classList.add("chat-icon-right-center"), t.classList.add("right-center-aligned")) : e.classList.add("chat-icon-bottom-right");
536
+ const t = document.getElementById("chat-icon"), e = document.getElementById("chat-window");
537
+ t.className = "", e.className = "", n === "right-center" ? (t.classList.add("chat-icon-right-center"), e.classList.add("right-center-aligned")) : t.classList.add("chat-icon-bottom-right");
535
538
  }
536
539
  var l;
537
540
  if (typeof window < "u") {
538
541
  const n = ((l = window.wineaterData) == null ? void 0 : l.POSITION) || "bottom-right";
539
542
  window.addEventListener("DOMContentLoaded", async () => {
540
- var a;
541
- const t = ["climats", "telckel", "biobio", "weinpoint"].find((c) => window.location.href.includes(c)) || null;
543
+ var s;
544
+ const e = ["climats", "telckel", "biobio", "weinpoint"].find((c) => window.location.href.includes(c)) || null;
542
545
  let o;
543
- t && (o = t.charAt(0).toUpperCase() + t.slice(1)), await s.fetchConfig(o || null), B(), L(), P(), W(n), b("chatbotToken", (a = window.wineaterData) == null ? void 0 : a.CLIENT_TOKEN, 365), new T().initialize();
546
+ e && (o = e.charAt(0).toUpperCase() + e.slice(1)), await a.fetchConfig(o || null), B(), L(), P(), W(n), b("chatbotToken", (s = window.wineaterData) == null ? void 0 : s.CLIENT_TOKEN, 365), new T().initialize();
544
547
  });
545
548
  }
546
549
  export {
@@ -273,17 +273,17 @@
273
273
  .typing-indicator.visible {
274
274
  visibility: visible;
275
275
  height: 50px;
276
- }`,g=document.createElement("style");g.textContent=d,document.head.appendChild(g);function x(n,t,e){let o="";if(e){const i=new Date;i.setTime(i.getTime()+e*24*60*60*1e3),o="; expires="+i.toUTCString()}document.cookie=n+"="+(t||"")+o+"; path=/; secure; samesite=strict"}function c(n){const e=`; ${document.cookie}`.split(`; ${n}=`);if(e.length===2)return e.pop().split(";").shift()}function l(n,t){fetch("https://api-eu.mixpanel.com/track",{method:"POST",headers:{"Content-Type":"application/json",Authentication:"6f3d90d5b02720f58de3663e3ef675fe"},body:JSON.stringify({event:n,properties:t})}).then(s=>{s.ok||console.error("Mixpanel tracking failed",s)}).catch(s=>{console.error("Mixpanel tracking error",s)})}function u(){l("Chatbot Opened",{distinct_id:c("chatbotToken")})}function m(){l("Chatbot Closed",{distinct_id:c("chatbotToken")})}function v(n){l("Message Sent",{distinct_id:c("chatbotToken"),message_content:n})}function k(n){l("Message Sent",{distinct_id:c("chatbotToken"),products:n})}function C(n){l("Product Clicked",{distinct_id:c("chatbotToken"),product_id:n})}function h(){const n=document.getElementById("chat-window"),t=document.getElementById("chat-icon");n.classList.contains("visible")?(m(),n.classList.remove("visible"),t.style.display="flex"):(u(),n.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 E=["climats","telckel","biobio","weinpoint"],I="OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";class y{constructor(t){var e;this.baseURL="https://api.wineater.com/",this.store=E.find(o=>window.location.href.includes(o)),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})}),o=await e.json();if(!e.ok)throw new Error(`API call failed with status ${e.status}: ${o.message||"No additional error information"}`);return o}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"},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"}}}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 a=new T;class B{constructor(){this.api=new y,this.displayFirstMessage(a.translate("welcomeMessage"))}initialize(){document.getElementById("send-button").addEventListener("click",()=>this.handleUserInput()),document.getElementById("user-input").addEventListener("keypress",o=>{o.key==="Enter"&&this.handleUserInput()})}displayFirstMessage(t,e="api"){const o=document.getElementById("message-container"),i=document.createElement("div");i.className=`message ${e}`,i.textContent=t,o.appendChild(i),o.scrollTop=o.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 o=await this.api.getWineRecommendations(e);this.hideTypingIndicator(),o&&o.length?this.displayResults(o):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 o=document.getElementById("message-container"),i=document.createElement("div");i.textContent=t,i.className="message "+e,o.appendChild(i),o.scrollTop=o.scrollHeight}sendAnalytics(t){C(t)}displayResults(t){const e=document.getElementById("message-container");k(t.map(o=>o.Title)),t.forEach(o=>{const i=document.createElement("div");i.className="wine-item";const s=document.createElement("img");s.src=o.Image,i.appendChild(s);const p=document.createElement("div");p.innerHTML=`
276
+ }`,g=document.createElement("style");g.textContent=d,document.head.appendChild(g);function x(n,t,e){let o="";if(e){const i=new Date;i.setTime(i.getTime()+e*24*60*60*1e3),o="; expires="+i.toUTCString()}document.cookie=n+"="+(t||"")+o+"; path=/; secure; samesite=strict"}function c(n){const e=`; ${document.cookie}`.split(`; ${n}=`);if(e.length===2)return e.pop().split(";").shift()}function l(n,t){const e="6f3d90d5b02720f58de3663e3ef675fe",o="https://api-eu.mixpanel.com/track",i={event:n,properties:{token:e,...t}};fetch(o,{method:"POST",headers:{"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(n){l("Message Sent",{distinct_id:c("chatbotToken"),message_content:n})}function k(n){l("Message Sent",{distinct_id:c("chatbotToken"),products:n})}function C(n){l("Product Clicked",{distinct_id:c("chatbotToken"),product_id:n})}function h(){const n=document.getElementById("chat-window"),t=document.getElementById("chat-icon");n.classList.contains("visible")?(m(),n.classList.remove("visible"),t.style.display="flex"):(u(),n.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 E=["climats","telckel","biobio","weinpoint"],I="OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";class y{constructor(t){var e;this.baseURL="https://api.wineater.com/",this.store=E.find(o=>window.location.href.includes(o)),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})}),o=await e.json();if(!e.ok)throw new Error(`API call failed with status ${e.status}: ${o.message||"No additional error information"}`);return o}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"},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"}}}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 B{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",o=>{o.key==="Enter"&&this.handleUserInput()})}displayFirstMessage(t,e="api"){const o=document.getElementById("message-container"),i=document.createElement("div");i.className=`message ${e}`,i.textContent=t,o.appendChild(i),o.scrollTop=o.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 o=await this.api.getWineRecommendations(e);this.hideTypingIndicator(),o&&o.length?this.displayResults(o):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 o=document.getElementById("message-container"),i=document.createElement("div");i.textContent=t,i.className="message "+e,o.appendChild(i),o.scrollTop=o.scrollHeight}sendAnalytics(t){C(t)}displayResults(t){const e=document.getElementById("message-container");k(t.map(o=>o.Title)),t.forEach(o=>{const i=document.createElement("div");i.className="wine-item";const a=document.createElement("img");a.src=o.Image,i.appendChild(a);const p=document.createElement("div");p.innerHTML=`
277
277
  <strong>${o.Title}</strong><br>
278
- ${a.translate("price")}: ${o.Price}<br>
279
- ${a.translate("region")}: ${o.Region}<br>
280
- ${a.translate("type")}: ${o.Type}<br>
281
- <a href="${o.Url}" onclick="sendAnalytics(${o.Title})" target="_blank">${a.translate("moreInfo")}</a>
278
+ ${s.translate("price")}: ${o.Price}<br>
279
+ ${s.translate("region")}: ${o.Region}<br>
280
+ ${s.translate("type")}: ${o.Type}<br>
281
+ <a href="${o.Url}" onclick="sendAnalytics(${o.Title})" target="_blank">${s.translate("moreInfo")}</a>
282
282
  `,i.appendChild(p),e.appendChild(i)}),e.scrollTop=e.scrollHeight}}document.addEventListener("DOMContentLoaded",()=>{window.toggleChatWindow=h,window.closeChatWindow=f,window.openChatWindow=b});function L(){const n=`
283
283
  <div id="chatbot-container">
284
284
  <div id="chat-icon" onclick="toggleChatWindow()">
285
285
  <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 -->
286
- <span>${a.translate("chatButton")}</span>
286
+ <span>${s.translate("chatButton")}</span>
287
287
  </div>
288
288
 
289
289
  <div id="chat-window" class="hidden">
@@ -300,9 +300,9 @@
300
300
  <span></span><span></span><span></span>
301
301
  </div>
302
302
  <div id="input-container">
303
- <input type="text" id="user-input" placeholder="${a.translate("inputPlaceholder")}">
304
- <button id="send-button">${a.translate("sendButton")}</button>
303
+ <input type="text" id="user-input" placeholder="${s.translate("inputPlaceholder")}">
304
+ <button id="send-button">${s.translate("sendButton")}</button>
305
305
  </div>
306
306
  </div>
307
307
  </div>
308
- `;document.body.insertAdjacentHTML("beforeend",n)}function W(){document.getElementById("close-btn").addEventListener("click",h)}function P(){window.addEventListener("click",function(n){const t=document.getElementById("chat-window"),e=document.getElementById("chat-icon");!t.contains(n.target)&&!e.contains(n.target)&&(t.classList.remove("visible"),e.style.display="flex")})}function S(n){console.log(n);const t=document.getElementById("chat-icon"),e=document.getElementById("chat-window");t.className="",e.className="",n==="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 n=((w=window.wineaterData)==null?void 0:w.POSITION)||"bottom-right";window.addEventListener("DOMContentLoaded",async()=>{var s;const e=["climats","telckel","biobio","weinpoint"].find(p=>window.location.href.includes(p))||null;let o;e&&(o=e.charAt(0).toUpperCase()+e.slice(1)),await a.fetchConfig(o||null),L(),W(),P(),S(n),x("chatbotToken",(s=window.wineaterData)==null?void 0:s.CLIENT_TOKEN,365),new B().initialize()})}r.closeChatWindow=f,r.openChatWindow=b,r.toggleChatWindow=h,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
308
+ `;document.body.insertAdjacentHTML("beforeend",n)}function W(){document.getElementById("close-btn").addEventListener("click",h)}function P(){window.addEventListener("click",function(n){const t=document.getElementById("chat-window"),e=document.getElementById("chat-icon");!t.contains(n.target)&&!e.contains(n.target)&&(t.classList.remove("visible"),e.style.display="flex")})}function S(n){console.log(n);const t=document.getElementById("chat-icon"),e=document.getElementById("chat-window");t.className="",e.className="",n==="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 n=((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 o;e&&(o=e.charAt(0).toUpperCase()+e.slice(1)),await s.fetchConfig(o||null),L(),W(),P(),S(n),x("chatbotToken",(a=window.wineaterData)==null?void 0:a.CLIENT_TOKEN,365),new B().initialize()})}r.closeChatWindow=f,r.openChatWindow=b,r.toggleChatWindow=h,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wineater-bot",
3
- "version": "1.4.4",
3
+ "version": "1.5.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "src/index.js",
@@ -15,13 +15,6 @@ function setCookie(name, value, days) {
15
15
  const parts = value.split(`; ${name}=`);
16
16
  if (parts.length === 2) return parts.pop().split(';').shift();
17
17
  }
18
-
19
- // Function to URL encode the data
20
- function urlEncodeData(data) {
21
- return Object.keys(data)
22
- .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
23
- .join('&');
24
- }
25
18
 
26
19
  // Функция для отправки событий в Mixpanel
27
20
  function trackEvent(event, properties) {
@@ -29,16 +22,18 @@ function urlEncodeData(data) {
29
22
  const endpoint = 'https://api-eu.mixpanel.com/track';
30
23
  const data = {
31
24
  event: event,
32
- properties: properties
25
+ properties: {
26
+ token: token,
27
+ ...properties
28
+ }
33
29
  };
34
30
 
35
31
  fetch(endpoint, {
36
32
  method: 'POST',
37
33
  headers: {
38
- 'Content-Type': 'application/x-www-form-urlencoded',
39
- 'Authentication': token
34
+ 'Content-Type': 'application/json'
40
35
  },
41
- body: urlEncodeData(data)
36
+ body: JSON.stringify(data)
42
37
  }).then(response => {
43
38
  if (!response.ok) {
44
39
  console.error('Mixpanel tracking failed', response);