wineater-bot 1.2.1 → 1.4.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/dist/wineater-chatbot.mjs +32 -26
- package/dist/wineater-chatbot.umd.js +4 -4
- package/index.html +1 -2
- package/package.json +1 -1
- package/src/index.js +2 -5
- package/src/js/api.js +6 -3
- package/src/js/styles.js +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const p = `
|
|
2
2
|
@font-face {
|
|
3
3
|
font-family: 'Poppins';
|
|
4
4
|
src: url('https://fonts.googleapis.com/css2?family=Poppins:wght@400&display=swap');
|
|
@@ -39,7 +39,7 @@ const g = `
|
|
|
39
39
|
.chat-icon-right-center {
|
|
40
40
|
position: fixed;
|
|
41
41
|
top: 50%;
|
|
42
|
-
right: -
|
|
42
|
+
right: -85px;
|
|
43
43
|
transform: translateY(-50%) rotate(90deg);
|
|
44
44
|
/* Additional styling for the button */
|
|
45
45
|
/* ... */
|
|
@@ -273,26 +273,27 @@ const g = `
|
|
|
273
273
|
.typing-indicator.visible {
|
|
274
274
|
visibility: visible;
|
|
275
275
|
height: 50px;
|
|
276
|
-
}`,
|
|
277
|
-
|
|
278
|
-
document.head.appendChild(
|
|
279
|
-
function
|
|
276
|
+
}`, d = document.createElement("style");
|
|
277
|
+
d.textContent = p;
|
|
278
|
+
document.head.appendChild(d);
|
|
279
|
+
function c() {
|
|
280
280
|
const n = document.getElementById("chat-window"), t = document.getElementById("chat-icon");
|
|
281
281
|
n.classList.contains("visible") ? (n.classList.remove("visible"), t.style.display = "flex") : (n.classList.add("visible"), t.style.display = "none");
|
|
282
282
|
}
|
|
283
|
-
function
|
|
283
|
+
function g() {
|
|
284
284
|
document.getElementById("chat-window").classList.remove("visible");
|
|
285
285
|
}
|
|
286
|
-
function
|
|
286
|
+
function h() {
|
|
287
287
|
document.getElementById("chat-window").classList.add("visible");
|
|
288
288
|
}
|
|
289
289
|
document.addEventListener("DOMContentLoaded", () => {
|
|
290
290
|
setupCloseButton(), setupOutsideClick();
|
|
291
291
|
});
|
|
292
|
-
const
|
|
293
|
-
class
|
|
292
|
+
const u = ["climats", "telckel", "biobio", "weinpoint"], m = "OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";
|
|
293
|
+
class l {
|
|
294
294
|
constructor(t) {
|
|
295
|
-
|
|
295
|
+
var e;
|
|
296
|
+
this.baseURL = "https://api.wineater.com/", this.store = u.find((o) => window.location.href.includes(o)), this.token = ((e = window == null ? void 0 : window.wineaterData) == null ? void 0 : e.CLIENT_TOKEN) || m;
|
|
296
297
|
}
|
|
297
298
|
async getStoreConfig(t) {
|
|
298
299
|
console.log(t);
|
|
@@ -300,7 +301,8 @@ class p {
|
|
|
300
301
|
const e = await fetch(`${this.baseURL}stores/store`, {
|
|
301
302
|
method: "POST",
|
|
302
303
|
headers: {
|
|
303
|
-
"Content-Type": "application/json"
|
|
304
|
+
"Content-Type": "application/json",
|
|
305
|
+
Authorization: `Bearer ${this.token}`
|
|
304
306
|
},
|
|
305
307
|
body: JSON.stringify({ store: t })
|
|
306
308
|
});
|
|
@@ -317,7 +319,8 @@ class p {
|
|
|
317
319
|
const e = await fetch(`${this.baseURL}dish/recommendations`, {
|
|
318
320
|
method: "POST",
|
|
319
321
|
headers: {
|
|
320
|
-
"Content-Type": "application/json"
|
|
322
|
+
"Content-Type": "application/json",
|
|
323
|
+
Authorization: `Bearer ${this.token}`
|
|
321
324
|
},
|
|
322
325
|
body: JSON.stringify({ text: t, store: this.store ? this.store.toString().charAt(0).toUpperCase() + this.store.slice(1) : void 0 })
|
|
323
326
|
}), o = await e.json();
|
|
@@ -331,7 +334,7 @@ class p {
|
|
|
331
334
|
}
|
|
332
335
|
class f {
|
|
333
336
|
constructor() {
|
|
334
|
-
this.api = new
|
|
337
|
+
this.api = new l(), this.language = "en", this.translations = {
|
|
335
338
|
fr: {
|
|
336
339
|
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?",
|
|
337
340
|
noResultsFound: "Aucun résultat trouvé.",
|
|
@@ -383,7 +386,7 @@ class f {
|
|
|
383
386
|
const s = new f();
|
|
384
387
|
class y {
|
|
385
388
|
constructor() {
|
|
386
|
-
this.api = new
|
|
389
|
+
this.api = new l(), this.displayFirstMessage(s.translate("welcomeMessage"));
|
|
387
390
|
}
|
|
388
391
|
initialize() {
|
|
389
392
|
document.getElementById("send-button").addEventListener("click", () => this.handleUserInput()), document.getElementById("user-input").addEventListener("keypress", (o) => {
|
|
@@ -435,7 +438,7 @@ class y {
|
|
|
435
438
|
}
|
|
436
439
|
}
|
|
437
440
|
document.addEventListener("DOMContentLoaded", () => {
|
|
438
|
-
window.toggleChatWindow =
|
|
441
|
+
window.toggleChatWindow = c, window.closeChatWindow = g, window.openChatWindow = h;
|
|
439
442
|
});
|
|
440
443
|
function b() {
|
|
441
444
|
const n = `
|
|
@@ -468,7 +471,7 @@ function b() {
|
|
|
468
471
|
document.body.insertAdjacentHTML("beforeend", n);
|
|
469
472
|
}
|
|
470
473
|
function w() {
|
|
471
|
-
document.getElementById("close-btn").addEventListener("click",
|
|
474
|
+
document.getElementById("close-btn").addEventListener("click", c);
|
|
472
475
|
}
|
|
473
476
|
function x() {
|
|
474
477
|
window.addEventListener("click", function(n) {
|
|
@@ -476,18 +479,21 @@ function x() {
|
|
|
476
479
|
!t.contains(n.target) && !e.contains(n.target) && (t.classList.remove("visible"), e.style.display = "flex");
|
|
477
480
|
});
|
|
478
481
|
}
|
|
479
|
-
function
|
|
482
|
+
function v(n) {
|
|
480
483
|
console.log(n);
|
|
481
484
|
const t = document.getElementById("chat-icon"), e = document.getElementById("chat-window");
|
|
482
485
|
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");
|
|
483
486
|
}
|
|
484
|
-
typeof window < "u"
|
|
485
|
-
const
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
487
|
+
if (typeof window < "u") {
|
|
488
|
+
const n = window.wineaterData.POSITION || "bottom-right";
|
|
489
|
+
window.addEventListener("DOMContentLoaded", async () => {
|
|
490
|
+
const e = ["climats", "telckel", "biobio", "weinpoint"].find((a) => window.location.href.includes(a)) || null;
|
|
491
|
+
let o;
|
|
492
|
+
e && (o = e.charAt(0).toUpperCase() + e.slice(1)), await s.fetchConfig(o || null), b(), w(), x(), v(n), new y().initialize();
|
|
493
|
+
});
|
|
494
|
+
}
|
|
489
495
|
export {
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
496
|
+
g as closeChatWindow,
|
|
497
|
+
h as openChatWindow,
|
|
498
|
+
c as toggleChatWindow
|
|
493
499
|
};
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
.chat-icon-right-center {
|
|
40
40
|
position: fixed;
|
|
41
41
|
top: 50%;
|
|
42
|
-
right: -
|
|
42
|
+
right: -85px;
|
|
43
43
|
transform: translateY(-50%) rotate(90deg);
|
|
44
44
|
/* Additional styling for the button */
|
|
45
45
|
/* ... */
|
|
@@ -273,13 +273,13 @@
|
|
|
273
273
|
.typing-indicator.visible {
|
|
274
274
|
visibility: visible;
|
|
275
275
|
height: 50px;
|
|
276
|
-
}`,
|
|
276
|
+
}`,l=document.createElement("style");l.textContent=r,document.head.appendChild(l);function c(){const n=document.getElementById("chat-window"),t=document.getElementById("chat-icon");n.classList.contains("visible")?(n.classList.remove("visible"),t.style.display="flex"):(n.classList.add("visible"),t.style.display="none")}function p(){document.getElementById("chat-window").classList.remove("visible")}function g(){document.getElementById("chat-window").classList.add("visible")}document.addEventListener("DOMContentLoaded",()=>{setupCloseButton(),setupOutsideClick()});const m=["climats","telckel","biobio","weinpoint"],f="OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL";class h{constructor(t){var e;this.baseURL="https://api.wineater.com/",this.store=m.find(o=>window.location.href.includes(o)),this.token=((e=window==null?void 0:window.wineaterData)==null?void 0:e.CLIENT_TOKEN)||f}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 y{constructor(){this.api=new h,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 y;class b{constructor(){this.api=new h,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{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}displayResults(t){const e=document.getElementById("message-container");t.forEach(o=>{const i=document.createElement("div");i.className="wine-item";const d=document.createElement("img");d.src=o.Image,i.appendChild(d);const u=document.createElement("div");u.innerHTML=`
|
|
277
277
|
<strong>${o.Title}</strong><br>
|
|
278
278
|
${s.translate("price")}: ${o.Price}<br>
|
|
279
279
|
${s.translate("region")}: ${o.Region}<br>
|
|
280
280
|
${s.translate("type")}: ${o.Type}<br>
|
|
281
281
|
<a href="${o.Url}" target="_blank">${s.translate("moreInfo")}</a>
|
|
282
|
-
`,i.appendChild(
|
|
282
|
+
`,i.appendChild(u),e.appendChild(i)}),e.scrollTop=e.scrollHeight}}document.addEventListener("DOMContentLoaded",()=>{window.toggleChatWindow=c,window.closeChatWindow=p,window.openChatWindow=g});function w(){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 -->
|
|
@@ -305,4 +305,4 @@
|
|
|
305
305
|
</div>
|
|
306
306
|
</div>
|
|
307
307
|
</div>
|
|
308
|
-
`;document.body.insertAdjacentHTML("beforeend",n)}function x(){document.getElementById("close-btn").addEventListener("click",
|
|
308
|
+
`;document.body.insertAdjacentHTML("beforeend",n)}function x(){document.getElementById("close-btn").addEventListener("click",c)}function v(){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 E(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=window.wineaterData.POSITION||"bottom-right";window.addEventListener("DOMContentLoaded",async()=>{const e=["climats","telckel","biobio","weinpoint"].find(d=>window.location.href.includes(d))||null;let o;e&&(o=e.charAt(0).toUpperCase()+e.slice(1)),await s.fetchConfig(o||null),w(),x(),v(),E(n),new b().initialize()})}a.closeChatWindow=p,a.openChatWindow=g,a.toggleChatWindow=c,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|
package/index.html
CHANGED
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
6
|
<title>Chatbot</title>
|
|
7
7
|
<!-- <script type="module" src="https://unpkg.com/wineater-bot@1.0.0/dist/wineater-chatbot.umd.js"></script> -->
|
|
8
|
-
<script type="module" src="./src/index.js"></script>
|
|
9
|
-
|
|
8
|
+
<script>window.wineaterData = {CLIENT_TOKEN: 'Abrakadabra', POSITION: 'right-center'};</script><script type="module" src="./src/index.js"></script>
|
|
10
9
|
</head>
|
|
11
10
|
<body>
|
|
12
11
|
</body>
|
package/package.json
CHANGED
package/src/index.js
CHANGED
|
@@ -91,6 +91,7 @@ function toggleChatIconPosition(position) {
|
|
|
91
91
|
|
|
92
92
|
// If you want to initialize your chatbot automatically when the script is loaded
|
|
93
93
|
if (typeof window !== 'undefined') {
|
|
94
|
+
const position = window.wineaterData['POSITION'] || 'bottom-right';
|
|
94
95
|
window.addEventListener('DOMContentLoaded', async () => {
|
|
95
96
|
const stores = ['climats', 'telckel', 'biobio', 'weinpoint'];
|
|
96
97
|
const store = stores.find(value => window.location.href.includes(value)) || null;
|
|
@@ -102,11 +103,7 @@ if (typeof window !== 'undefined') {
|
|
|
102
103
|
createChatbotUI(); // Create the UI
|
|
103
104
|
setupCloseButton();
|
|
104
105
|
setupOutsideClick();
|
|
105
|
-
|
|
106
|
-
toggleChatIconPosition('right-center');
|
|
107
|
-
} else {
|
|
108
|
-
toggleChatIconPosition('bottom-right');
|
|
109
|
-
}
|
|
106
|
+
toggleChatIconPosition(position);
|
|
110
107
|
const myChatbot = new Chatbot();
|
|
111
108
|
myChatbot.initialize();
|
|
112
109
|
});
|
package/src/js/api.js
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
// api.js
|
|
2
2
|
|
|
3
3
|
const stores = ['climats', 'telckel', 'biobio', 'weinpoint'];
|
|
4
|
+
const DEMO_TOKEN='OuhXJRleF6sROjsQZPWx1yqjrL6APeJxmHswqyOBWbgIqtXcht3MDadvI9DtOOoL';
|
|
4
5
|
|
|
5
6
|
export class Api {
|
|
6
7
|
constructor(apiEndpoint) {
|
|
7
8
|
// Allow users of the library to specify their own endpoint if needed
|
|
8
9
|
this.baseURL = 'https://api.wineater.com/';
|
|
9
10
|
this.store = stores.find(value => window.location.href.includes(value));
|
|
10
|
-
|
|
11
|
+
this.token = window?.wineaterData?.CLIENT_TOKEN || DEMO_TOKEN;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
async getStoreConfig(storeName) {
|
|
@@ -16,7 +17,8 @@ export class Api {
|
|
|
16
17
|
const response = await fetch(`${this.baseURL}stores/store`, {
|
|
17
18
|
method: 'POST',
|
|
18
19
|
headers: {
|
|
19
|
-
'Content-Type': 'application/json'
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
'Authorization': `Bearer ${this.token}`
|
|
20
22
|
},
|
|
21
23
|
body: JSON.stringify({ store: storeName })
|
|
22
24
|
});
|
|
@@ -34,7 +36,8 @@ export class Api {
|
|
|
34
36
|
const response = await fetch(`${this.baseURL}dish/recommendations`, {
|
|
35
37
|
method: 'POST',
|
|
36
38
|
headers: {
|
|
37
|
-
'Content-Type': 'application/json'
|
|
39
|
+
'Content-Type': 'application/json',
|
|
40
|
+
'Authorization': `Bearer ${this.token}`
|
|
38
41
|
},
|
|
39
42
|
body: JSON.stringify({ text: text, store: this.store ? (this.store.toString().charAt(0).toUpperCase() + this.store.slice(1)) : undefined})
|
|
40
43
|
});
|