wineater-bot 3.0.22 → 3.1.1
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 +1599 -1346
- package/dist/wineater-chatbot.umd.js +546 -397
- package/index.html +3 -3
- package/package.json +1 -1
- package/src/js/i18n.js +96 -0
- package/src/js/styles.js +15 -11
- package/src/js/widget-styles.js +439 -334
- package/src/js/widget.js +114 -28
package/src/js/widget.js
CHANGED
|
@@ -8,6 +8,9 @@ export class WineWidget {
|
|
|
8
8
|
constructor() {
|
|
9
9
|
// Определяем тип виджета: 'store' (старый) или 'bar' (новый)
|
|
10
10
|
this.widgetType = window?.wineaterData?.WIDGET_TYPE || 'store';
|
|
11
|
+
this.widgetWrapper = window?.wineaterData?.WIDGET_WRAPPER || 'wineater-widget-conteiner';
|
|
12
|
+
this.titleText = window?.wineaterData?.TITLE_TEXT;
|
|
13
|
+
this.subtitleText = window?.wineaterData?.SUBTITLE_TEXT;
|
|
11
14
|
this.api = new Api();
|
|
12
15
|
|
|
13
16
|
// Фильтры для store
|
|
@@ -37,19 +40,43 @@ export class WineWidget {
|
|
|
37
40
|
}
|
|
38
41
|
|
|
39
42
|
initializeWidget() {
|
|
40
|
-
const widgetContainer = document.getElementById(
|
|
43
|
+
const widgetContainer = document.getElementById(this.widgetWrapper);
|
|
41
44
|
if (this.widgetType === 'store') {
|
|
42
45
|
const widgetHTML = `
|
|
43
46
|
<div id="wine-widget-container">
|
|
44
47
|
<div class="wine-widget-wrapper">
|
|
45
48
|
<div id="wine-widget-header">
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
<h1 class="wine-widget-big-title">
|
|
50
|
+
${translator.translate('headerLine1')}
|
|
51
|
+
<span class="icon icon-meal"></span>
|
|
52
|
+
<span class="icon-label">${translator.translate('headerMeal')}</span>,
|
|
53
|
+
<span class="icon icon-mood"></span>
|
|
54
|
+
<span class="icon-label">${translator.translate('headerMood')}</span>
|
|
55
|
+
</br>
|
|
56
|
+
<!-- <span class="icon icon-budget"></span> -->
|
|
57
|
+
<!-- <span class="icon-label">${translator.translate('headerBudget')}</span>, -->
|
|
58
|
+
${translator.translate('headerOr')}
|
|
59
|
+
<span class="icon icon-occasion"></span>
|
|
60
|
+
<span class="icon-label">${translator.translate('headerOccasion')}</span>
|
|
61
|
+
${translator.translate('headerLine2')}
|
|
62
|
+
</h1>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<div id="wine-widget-search">
|
|
66
|
+
<!-- Иконка поиска слева -->
|
|
67
|
+
<span class="search-icon"></span>
|
|
68
|
+
|
|
69
|
+
<!-- Поле ввода -->
|
|
70
|
+
<input
|
|
71
|
+
type="text"
|
|
72
|
+
id="wine-search-input"
|
|
73
|
+
placeholder="${translator.translate('searchPlaceholder')}">
|
|
74
|
+
|
|
75
|
+
<!-- Кнопка -->
|
|
76
|
+
<button id="wine-search-button">
|
|
77
|
+
${translator.translate('searchButton')}
|
|
78
|
+
</button>
|
|
79
|
+
</div>
|
|
53
80
|
<div id="wine-widget-right">
|
|
54
81
|
<div id="loading-indicator" class="hidden">
|
|
55
82
|
<div id="typing-indicator" class="typing-indicator">
|
|
@@ -61,7 +88,8 @@ export class WineWidget {
|
|
|
61
88
|
<div id="powered-by-widget">
|
|
62
89
|
<a href="https://wineater.com" target="_blank">
|
|
63
90
|
<span>${translator.translate('poweredBy')}</span>
|
|
64
|
-
<img src="https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media/
|
|
91
|
+
<img src="${translator.translate('lang') === 'ru' ? 'https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media/divino_logo.svg?x=5' : 'https://czvgkhagwvmknscoerfy.supabase.co/storage/v1/object/public/static-media/logo_medium_gray.svg'}" alt="Wineater Logo">
|
|
92
|
+
<span>${translator.translate('AI sommelier')}</span>
|
|
65
93
|
</a>
|
|
66
94
|
</div>
|
|
67
95
|
</div>
|
|
@@ -207,28 +235,86 @@ export class WineWidget {
|
|
|
207
235
|
const resultsContainer = document.getElementById('wine-placeholder');
|
|
208
236
|
this.hideLoadingIndicator();
|
|
209
237
|
resultsContainer.innerHTML = '';
|
|
210
|
-
|
|
238
|
+
|
|
211
239
|
wines.forEach((wine, index) => {
|
|
212
|
-
|
|
213
|
-
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
// А потом при генерации чипса:
|
|
243
|
+
const paramChips = [];
|
|
244
|
+
if (wine.type || wine.Type) {
|
|
245
|
+
paramChips.push(wine.type || wine.Type);
|
|
214
246
|
}
|
|
215
|
-
|
|
247
|
+
if (wine.country || wine.Country) {
|
|
248
|
+
paramChips.push(wine.country || wine.Country);
|
|
249
|
+
}
|
|
250
|
+
if (wine.region || wine.Region) {
|
|
251
|
+
paramChips.push(wine.region || wine.Region);
|
|
252
|
+
};
|
|
253
|
+
if (wine.grape || wine.Grape) {
|
|
254
|
+
paramChips.push(wine.grape || wine.Grape);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const paramList = [];
|
|
258
|
+
if (wine.type || wine.Type) paramList.push(wine.type || wine.Type);
|
|
259
|
+
if (wine.country || wine.Country) paramList.push(wine.country || wine.Country);
|
|
260
|
+
if (wine.region || wine.Region) paramList.push(wine.region || wine.Region);
|
|
261
|
+
if (wine.grape || wine.Grape) paramList.push(wine.grape || wine.Grape);
|
|
262
|
+
|
|
263
|
+
// Допустим, первые 3 идут в одну строку, а если есть 4‑й,
|
|
264
|
+
// мы выведем его на вторую строку. Или всё в одну строку — на вкус.
|
|
265
|
+
const line1 = paramList.slice(0, 3).join(' • ');
|
|
266
|
+
const line2 = paramList.slice(3).join(' • ');
|
|
216
267
|
const wineHTML = `
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
268
|
+
<div class="wine-recommendation-tile ${wine.isSommSelection ? 'somm-selection' : ''}">
|
|
269
|
+
${
|
|
270
|
+
wine.isSommSelection
|
|
271
|
+
? `<div class="somm-selection-badge">
|
|
272
|
+
${translator.translate('wineDetails.sommSelection')}
|
|
273
|
+
</div>`
|
|
274
|
+
: ''
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
<div class="tile-top">
|
|
278
|
+
<!-- Большое изображение по центру -->
|
|
279
|
+
${
|
|
280
|
+
(wine.image || wine.Image)
|
|
281
|
+
? `<img src="${wine.image || wine.Image}"
|
|
282
|
+
alt="${wine.title || wine.Title}"
|
|
283
|
+
class="wine-image" />`
|
|
284
|
+
: ''
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
<!-- Цена над названием -->
|
|
288
|
+
<div class="wine-price">
|
|
289
|
+
${wine.price || wine.Price}
|
|
290
|
+
</div>
|
|
291
|
+
|
|
292
|
+
<!-- Название вина (больше шрифт) -->
|
|
293
|
+
<h2 class="wine-title">
|
|
294
|
+
${wine.title || wine.Title}
|
|
295
|
+
</h2>
|
|
296
|
+
</div>
|
|
297
|
+
|
|
298
|
+
<!-- Параметры через точки -->
|
|
299
|
+
${
|
|
300
|
+
line1
|
|
301
|
+
? `<div class="wine-params">${line1}</div>`
|
|
302
|
+
: ''
|
|
303
|
+
}
|
|
304
|
+
${
|
|
305
|
+
line2
|
|
306
|
+
? `<div class="wine-params">${line2}</div>`
|
|
307
|
+
: ''
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
<!-- Кнопка Buy, видна только при наведении -->
|
|
311
|
+
<div class="bottom-row">
|
|
312
|
+
<button class="buy-btn">
|
|
313
|
+
${translator.translate('Buy') || 'Buy'}
|
|
314
|
+
</button>
|
|
315
|
+
</div>
|
|
316
|
+
</div>
|
|
317
|
+
`;
|
|
232
318
|
resultsContainer.insertAdjacentHTML('beforeend', wineHTML);
|
|
233
319
|
|
|
234
320
|
// Найти только что добавленную карточку
|