wineater-bot 3.4.4 → 3.5.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wineater-bot",
3
- "version": "3.4.4",
3
+ "version": "3.5.1",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "src/index.js",
package/src/js/i18n.js CHANGED
@@ -194,7 +194,7 @@ class Translator {
194
194
 
195
195
  /* -- Новые ключи bar -- */
196
196
  barTitle: "Bar Dishes",
197
- barSubtitle: "Select dishes below and click ‘Send’",
197
+ barSubtitle: "Select dishes below and click 'Send'",
198
198
  barSendButton: "Send",
199
199
  barResetButton: "Reset",
200
200
  barName: "Bar Name",
@@ -259,7 +259,7 @@ class Translator {
259
259
 
260
260
  /* -- Novi ključevi za bar -- */
261
261
  "barTitle": "Jela iz bara",
262
- "barSubtitle": "Izaberite jela ispod i kliknite ‘Pošalji’",
262
+ "barSubtitle": "Izaberite jela ispod i kliknite 'Pošalji'",
263
263
  "barSendButton": "Pošalji",
264
264
  "barResetButton": "Resetuj",
265
265
  "barName": "Naziv bara",
@@ -330,7 +330,7 @@ class Translator {
330
330
 
331
331
  /* -- Новые ключи bar -- */
332
332
  barTitle: "Bar-Auswahl",
333
- barSubtitle: "Wählen Sie Ihre Gerichte und klicken Sie auf „Senden“",
333
+ barSubtitle: "Wählen Sie Ihre Gerichte und klicken Sie auf 'Senden'",
334
334
  barSendButton: "Senden",
335
335
  barResetButton: "Zurücksetzen",
336
336
  barName: "Name der Bar",
@@ -426,7 +426,7 @@ class Translator {
426
426
  winePairingIntro: "К этому вину подходят следующие блюда:",
427
427
  askForDinner: "Что бы вы хотели на ужин?",
428
428
  clearChatButton: "Очистить чат",
429
- widgetTitle: "НАЙДИТЕ ИДЕАЛЬНОЕ ВИНО",
429
+ widgetTitle: "НАЙДИТЬ ИДЕАЛЬНОЕ ВИНО",
430
430
  widgetSubtitle: "Поделитесь вашими предпочтениями — блюдом, настроением, бюджетом или случаем — и наш AI-сомелье подберёт идеальное вино за секунды",
431
431
  searchPlaceholder: "Введите ключевое слово или описание",
432
432
  wineDetails: {
@@ -452,7 +452,7 @@ class Translator {
452
452
 
453
453
  /* -- Новые ключи для бара -- */
454
454
  barTitle: "Закуски к вину",
455
- barSubtitle: "Выберите блюда ниже и нажмите ‘Отправить’",
455
+ barSubtitle: "Выберите блюда ниже и нажмите 'Отправить'",
456
456
  barSendButton: "Отправить",
457
457
  barResetButton: "Сбросить",
458
458
  barName: "Название бара",
@@ -476,10 +476,23 @@ class Translator {
476
476
  async fetchConfig(storeName) {
477
477
  try {
478
478
  const config = await this.api.getStoreConfig(storeName);
479
- this.language = config.lang;
480
- this.currency = config.currency;
479
+
480
+ // ✅ Если язык уже сохранён в localStorage — использовать его
481
+ const storedLang = localStorage.getItem('selectedLanguage');
482
+ if (storedLang && this.translations[storedLang]) {
483
+ this.language = storedLang;
484
+ } else if (config.lang && this.translations[config.lang]) {
485
+ // иначе использовать с бэкенда
486
+ this.language = config.lang;
487
+ localStorage.setItem('selectedLanguage', config.lang);
488
+ } else {
489
+ this.language = 'en';
490
+ }
491
+
492
+ this.currency = config.currency || 'USD';
493
+
481
494
  } catch (e) {
482
- this.language = 'en'; // Fallback to English
495
+ this.language = localStorage.getItem('selectedLanguage') || 'en';
483
496
  this.currency = 'USD';
484
497
  }
485
498
  }
@@ -513,6 +526,10 @@ class Translator {
513
526
 
514
527
  return value;
515
528
  }
529
+
530
+ getSupportedLanguages() {
531
+ return Object.keys(this.translations);
532
+ }
516
533
  }
517
534
 
518
535
  export default new Translator();
@@ -620,14 +620,44 @@ visibility: visible;
620
620
 
621
621
  /* ===================== 13) Блок Powered by ===================== */
622
622
  #powered-by-widget {
623
- border-top:2px solid #f6f7fd; /* разделительная линия сверху */
623
+ position: relative;
624
+ border-top: 2px solid #f6f7fd;
624
625
  font-family: 'Bricolage Grotesque', sans-serif;
625
626
  font-weight: 200;
626
- display: flex;
627
- align-items: center;
628
- justify-content: center;
629
627
  padding: 12px 24px;
628
+ min-height: 40px;
629
+ }
630
+
631
+ #powered-by-widget .powered-by-center {
632
+ position: absolute;
633
+ left: 50%;
634
+ transform: translateX(-50%);
635
+ text-align: center;
630
636
  }
637
+
638
+ #powered-by-widget .powered-by-lang {
639
+ position: absolute;
640
+ right: 0px;
641
+ top: 50%;
642
+ transform: translateY(-50%);
643
+ }
644
+
645
+ .language-dropdown {
646
+ padding: 4px;
647
+ border-radius: 6px;
648
+ border: 2px solid var(--wineater-color);
649
+ background-color: white;
650
+ color: var(--wineater-color);
651
+ font-weight: 500;
652
+ font-family: 'Bricolage Grotesque', sans-serif;
653
+ font-size: 12px;
654
+ cursor: pointer;
655
+ transition: all 0.2sease;
656
+ }
657
+ .language-dropdown:hover {
658
+ box-shadow: 0 4px 8px rgba(123, 43, 235, 0.2);
659
+ }
660
+
631
661
  #powered-by-widget a {
632
662
  text-decoration: none;
633
663
  display: flex;
@@ -652,7 +682,7 @@ visibility: visible;
652
682
  @media screen and (max-width: 768px) {
653
683
  #wine-widget-container {
654
684
  flex-direction: column;
655
- padding: 16px;
685
+ padding: 0px 16px;
656
686
  min-width: 100vw;
657
687
  }
658
688
  #wine-widget-header h1 {
@@ -679,6 +709,9 @@ visibility: visible;
679
709
  #wine-widget-container .tile-details {
680
710
  text-align: center;
681
711
  }
712
+ .powered-by-sommelier {
713
+ display:none;
714
+ }
682
715
  }
683
716
 
684
717
  .card-popup {
@@ -808,7 +841,6 @@ margin: 5px 0;
808
841
  border: none;
809
842
  }
810
843
 
811
-
812
844
  /* Пример более узких экранов (i.e. <480px) можно добавить при необходимости */
813
845
  `;
814
846
  const fontLink = document.createElement('link');
package/src/js/widget.js CHANGED
@@ -26,7 +26,7 @@ export class WineWidget {
26
26
  this.initializeSearchAnimation();
27
27
  this.sendEvent('widgetInitialized', { widgetType: this.widgetType });
28
28
  this.loadInstantRecommendations();
29
-
29
+ this.createLanguageSwitcher();
30
30
  }
31
31
 
32
32
  sendEvent(eventType, data) {
@@ -84,12 +84,15 @@ export class WineWidget {
84
84
  <div id="wine-placeholder"></div>
85
85
  </div>
86
86
  <div id="powered-by-widget">
87
- <a href="https://wineater.com" target="_blank">
88
- <span>${translator.translate('poweredBy')}</span>
89
- <img src="${this.countryCode === '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">
90
- <span>${translator.translate('AI sommelier')}</span>
91
- </a>
92
- </div>
87
+ <div class="powered-by-center">
88
+ <a href="https://wineater.com" target="_blank">
89
+ <span>${translator.translate('poweredBy')}</span>
90
+ <img src="${this.countryCode === '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">
91
+ <span class="powered-by-sommelier">${translator.translate('AI sommelier')}</span>
92
+ </a>
93
+ </div>
94
+ <div class="powered-by-lang"></div>
95
+ </div>
93
96
  </div>
94
97
  </div>
95
98
  `;
@@ -444,4 +447,31 @@ export class WineWidget {
444
447
  typeEffect();
445
448
  });
446
449
  }
447
- }
450
+
451
+ createLanguageSwitcher() {
452
+ const langContainer = document.querySelector('#powered-by-widget .powered-by-lang');
453
+ const languages = translator.getSupportedLanguages();
454
+ const currentLanguage = translator.language;
455
+
456
+ const dropdown = document.createElement('select');
457
+ dropdown.id = 'language-dropdown';
458
+ dropdown.className = 'language-dropdown';
459
+
460
+ languages.forEach(lang => {
461
+ const option = document.createElement('option');
462
+ option.value = lang;
463
+ option.textContent = lang.toUpperCase();
464
+ option.selected = lang === currentLanguage;
465
+ dropdown.appendChild(option);
466
+ });
467
+
468
+ dropdown.onchange = (event) => {
469
+ const selectedLang = event.target.value;
470
+ translator.language = selectedLang;
471
+ localStorage.setItem('selectedLanguage', selectedLang);
472
+ location.reload(); // Reload to apply language change
473
+ };
474
+
475
+ langContainer.appendChild(dropdown);
476
+ }
477
+ }