wineater-bot 3.0.21 → 3.1.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/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('wineater-widget-conteiner');
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
- <h1>${translator.translate('widgetTitle')}</h1>
47
- <p>${translator.translate('widgetSubtitle')}</p>
48
- </div>
49
- <div id="wine-widget-search">
50
- <input type="text" id="wine-search-input" placeholder="${translator.translate('searchPlaceholder')}">
51
- <button id="wine-search-button">${translator.translate('searchButton')}</button>
52
- </div>
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/logo.svg" alt="Wineater Logo">
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,24 +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) => {
240
+
241
+
242
+ // А потом при генерации чипса:
243
+ const paramChips = [];
244
+ if (wine.type || wine.Type) {
245
+ paramChips.push(wine.type || wine.Type);
246
+ }
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(' • ');
212
267
  const wineHTML = `
213
- <div class="wine-recommendation-tile ${wine.isSommSelection ? 'somm-selection' : ''}">
214
- ${wine.isSommSelection ? `<div class="somm-selection-badge">${translator.translate('wineDetails.sommSelection')}</div>` : ''}
215
- ${(!!wine.image || !!wine.Image) ? `<img src="${wine.image || wine.Image}" alt="${wine.title || wine.Title}" />` : '' }
216
- <div class="tile-details">
217
- <strong>${wine.title || wine.Title}</strong>
218
- <p>${translator.translate('wineDetails.price')}: ${wine.price || wine.Price}</p>
219
- <p>${translator.translate('wineDetails.region')}: ${wine.region || wine.Region}</p>
220
- <p>${translator.translate('wineDetails.type')}: ${wine.type || wine.Type}</p>
221
- ${this.widgetType === 'bar' ? `<p>${translator.translate('wineDetails.reason')}: ${wine.pairing_recommendation || 'N/A'}</p>` : ''}
222
- ${this.widgetType === 'bar'
223
- ? `<p>${translator.translate('wineDetails.code')}: ${wine.url || 'N/A'}</p>`
224
- : `<a href="${wine.Url}" target="_blank">${translator.translate('wineDetails.moreInfo')}</a>`}
225
- </div>
226
- </div>
227
- `;
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
+ `;
228
318
  resultsContainer.insertAdjacentHTML('beforeend', wineHTML);
229
319
 
230
320
  // Найти только что добавленную карточку