@blotoutio/providers-shop-gpt-sdk 1.9.1 → 1.10.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.
Files changed (4) hide show
  1. package/index.cjs.js +491 -37
  2. package/index.js +491 -37
  3. package/index.mjs +491 -37
  4. package/package.json +1 -1
package/index.cjs.js CHANGED
@@ -408,10 +408,29 @@ const createExperiment = (props) => {
408
408
  }
409
409
  };
410
410
 
411
+ const uiActions = new Set([
412
+ 'shopGPTInitialized',
413
+ 'chatbotOpened',
414
+ 'queryInteractions',
415
+ 'promptClicked',
416
+ 'productRecommendationClicked',
417
+ ]);
418
+ new Set([
419
+ ...uiActions,
420
+ 'pageView',
421
+ 'productRecommendationViewed',
422
+ 'productRecommendationAddedToCart',
423
+ 'productRecommendationInitiatedCheckout',
424
+ 'orderPlaced',
425
+ ]);
426
+
411
427
  const packageName = 'shopGPT';
412
- const DEFAULT_MAX_THREAD_AGE = 14;
428
+ const DEFAULT_MAX_THREAD_AGE = 14; // in days
429
+ const DEFAULT_NUDGE_TIMEOUT = 10; // in seconds
413
430
  const previewKeyName = 'previewShopGPT';
414
431
 
432
+ const keyPrefix = `_worker`;
433
+
415
434
  const canLog = () => {
416
435
  try {
417
436
  return localStorage.getItem('edgeTagDebug') === '1';
@@ -444,13 +463,182 @@ const logger = {
444
463
  },
445
464
  };
446
465
 
466
+ const initKey = `${keyPrefix}StoreMultiple`;
467
+ const saveData = (destination, persistType, value, key = initKey) => {
468
+ if (persistType === 'session') {
469
+ const data = getSession(key);
470
+ data[destination] = value;
471
+ saveSession(data, key);
472
+ return;
473
+ }
474
+ const data = getLocal(key);
475
+ data[destination] = value;
476
+ saveLocal(data, key);
477
+ };
478
+ const getData = (destination, persistType, key = initKey) => {
479
+ let data;
480
+ if (persistType === 'session') {
481
+ data = getSession(key);
482
+ }
483
+ else {
484
+ data = getLocal(key);
485
+ }
486
+ return (data === null || data === void 0 ? void 0 : data[destination]) || {};
487
+ };
488
+ const saveLocal = (value, key) => {
489
+ try {
490
+ if (!localStorage) {
491
+ return;
492
+ }
493
+ localStorage.setItem(key, JSON.stringify(value));
494
+ }
495
+ catch {
496
+ logger.log('Local storage not supported.');
497
+ }
498
+ };
499
+ const getLocal = (key) => {
500
+ try {
501
+ if (!localStorage) {
502
+ return {};
503
+ }
504
+ const data = localStorage.getItem(key);
505
+ if (!data) {
506
+ return {};
507
+ }
508
+ return JSON.parse(data) || {};
509
+ }
510
+ catch {
511
+ return {};
512
+ }
513
+ };
514
+ const saveSession = (value, key) => {
515
+ try {
516
+ if (!sessionStorage) {
517
+ return;
518
+ }
519
+ sessionStorage.setItem(key, JSON.stringify(value));
520
+ }
521
+ catch {
522
+ logger.log('Session storage not supported.');
523
+ }
524
+ };
525
+ const getSession = (key) => {
526
+ try {
527
+ if (!sessionStorage) {
528
+ return {};
529
+ }
530
+ const data = sessionStorage.getItem(key);
531
+ if (!data) {
532
+ return {};
533
+ }
534
+ return JSON.parse(data) || {};
535
+ }
536
+ catch {
537
+ return {};
538
+ }
539
+ };
540
+
447
541
  var _a$1;
448
542
  const registryKey = Symbol.for('shop-gpt');
449
543
  if (typeof window != 'undefined') {
450
544
  (_a$1 = window[registryKey]) !== null && _a$1 !== void 0 ? _a$1 : (window[registryKey] = {});
451
545
  }
452
546
 
453
- const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, storeAPI, }) => {
547
+ const SHOP_GPT_SESSION_KEY = 'shopGPTSession';
548
+ const SHOP_GPT_LOCAL_STORAGE_KEY = 'shopGPTLocalStorage';
549
+ const getSessionData = (destination) => {
550
+ const session = getData(destination, 'session', SHOP_GPT_SESSION_KEY);
551
+ return session;
552
+ };
553
+ const saveSessionData = (destination, data) => {
554
+ saveData(destination, 'session', data, SHOP_GPT_SESSION_KEY);
555
+ };
556
+ const getLocalStorageData = (destination) => {
557
+ const local = getData(destination, 'local', SHOP_GPT_LOCAL_STORAGE_KEY);
558
+ return local;
559
+ };
560
+ const saveLocalStorageData = (destination, data) => {
561
+ saveData(destination, 'local', data, SHOP_GPT_LOCAL_STORAGE_KEY);
562
+ };
563
+
564
+ // eslint-disable-next-line @nx/enforce-module-boundaries
565
+ const hasPreviewKey = () => {
566
+ var _a;
567
+ try {
568
+ return ((_a = sessionStorage.getItem(previewKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
569
+ }
570
+ catch {
571
+ return false;
572
+ }
573
+ };
574
+ const isUserInteracted = (destination) => {
575
+ var _a;
576
+ const session = getSessionData(destination);
577
+ return !!((_a = session === null || session === void 0 ? void 0 : session.chatbot) === null || _a === void 0 ? void 0 : _a.hasUserInteracted);
578
+ };
579
+ const setUserInteracted = (destination) => {
580
+ const session = getSessionData(destination);
581
+ saveSessionData(destination, {
582
+ ...session,
583
+ chatbot: { ...session === null || session === void 0 ? void 0 : session.chatbot, hasUserInteracted: true },
584
+ });
585
+ };
586
+ const getProductActions = (destination, sessionId) => {
587
+ var _a;
588
+ const local = getLocalStorageData(destination);
589
+ if (!local || !sessionId) {
590
+ logger.error('No local storage data or session id');
591
+ return null;
592
+ }
593
+ return (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products;
594
+ };
595
+ const setProductAction = (destination, sessionId, productId, action, value) => {
596
+ var _a, _b, _c;
597
+ const local = getLocalStorageData(destination);
598
+ if (!local || !sessionId) {
599
+ logger.error('No local storage data or session id');
600
+ return;
601
+ }
602
+ const productTags = (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products) === null || _b === void 0 ? void 0 : _b[productId];
603
+ local[sessionId] = {
604
+ ...local[sessionId],
605
+ products: {
606
+ ...(_c = local[sessionId]) === null || _c === void 0 ? void 0 : _c.products,
607
+ [productId]: {
608
+ ...productTags,
609
+ [action]: value,
610
+ },
611
+ },
612
+ };
613
+ // Clear other sessions
614
+ const updatedLocal = { [sessionId]: local[sessionId] };
615
+ saveLocalStorageData(destination, updatedLocal);
616
+ };
617
+ const getShopGPTLoaded = (destination, sessionId) => {
618
+ var _a, _b;
619
+ const local = getLocalStorageData(destination);
620
+ if (!local || !sessionId) {
621
+ logger.error('No local storage data or session id');
622
+ return false;
623
+ }
624
+ return (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.isShopGPTLoaded) !== null && _b !== void 0 ? _b : false;
625
+ };
626
+ const setShopGPTLoaded = (destination, sessionId, value) => {
627
+ const local = getLocalStorageData(destination);
628
+ if (!local || !sessionId) {
629
+ logger.error('No local storage data or session id');
630
+ return;
631
+ }
632
+ local[sessionId] = {
633
+ ...local[sessionId],
634
+ isShopGPTLoaded: value,
635
+ };
636
+ // Clear other sessions
637
+ const updatedLocal = { [sessionId]: local[sessionId] };
638
+ saveLocalStorageData(destination, updatedLocal);
639
+ };
640
+
641
+ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, storeAPI, sessionId, }) => {
454
642
  if (!baseURL) {
455
643
  throw new Error(`baseURL missing`);
456
644
  }
@@ -552,13 +740,14 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
552
740
  throw new Error(`Failed to delete all chat threads - ${response.status}: ${await response.text()}`);
553
741
  }
554
742
  };
555
- const saveFeedback = async (messageId, feedback) => {
743
+ const saveFeedback = async (messageId, threadId, feedback) => {
556
744
  const response = await fetchImpl(getURL('/feedback'), {
557
745
  method: 'POST',
558
746
  headers: getHeaders(),
559
747
  credentials: 'include',
560
748
  body: JSON.stringify({
561
749
  messageId,
750
+ threadId,
562
751
  feedback,
563
752
  }),
564
753
  });
@@ -578,6 +767,28 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
578
767
  const data = (await response.json());
579
768
  return data.customPrompts;
580
769
  };
770
+ const sendEvent = async (action, currency, actionData) => {
771
+ var _a;
772
+ const storageData = (_a = getProductActions(baseURL, sessionId)) !== null && _a !== void 0 ? _a : {};
773
+ const response = await fetchImpl(getURL('/user/event'), {
774
+ method: 'POST',
775
+ headers: getHeaders(true),
776
+ body: JSON.stringify({
777
+ action,
778
+ currency,
779
+ actionData,
780
+ storageData: {
781
+ session: storageData,
782
+ preview: hasPreviewKey(),
783
+ isShopGPTLoaded: true, // The fact that sendEvent was called means that the ShopGPT is loaded
784
+ },
785
+ }),
786
+ credentials: 'include',
787
+ });
788
+ if (!response.ok) {
789
+ throw new Error(`Error while recording user event - ${response.status}: ${response.statusText}\n\n${await response.text()}`);
790
+ }
791
+ };
581
792
  return {
582
793
  processQuery,
583
794
  fetchChatHistory,
@@ -587,22 +798,14 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
587
798
  deleteAllThreads,
588
799
  saveFeedback,
589
800
  fetchCustomPrompts,
801
+ sendEvent,
590
802
  };
591
803
  };
592
804
 
593
805
  // eslint-disable-next-line @nx/enforce-module-boundaries
594
806
  const error = (message) => console.error(message);
595
- const hasPreviewKey = () => {
596
- var _a;
597
- try {
598
- return ((_a = sessionStorage.getItem(previewKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
599
- }
600
- catch {
601
- return false;
602
- }
603
- };
604
807
  const init = (params) => {
605
- var _a, _b, _c;
808
+ var _a, _b, _c, _d, _e, _f;
606
809
  if (typeof window == 'undefined' || typeof document == 'undefined') {
607
810
  // if loaded in non-browser SDKs, return early
608
811
  return;
@@ -620,7 +823,8 @@ const init = (params) => {
620
823
  // exit if not in top window
621
824
  return;
622
825
  }
623
- const { enabled, mode, devMode, merchantUrl, profiles, productHandles, targetPath, view, brandName, quickPrompts, merchantImage, latestThreadLoad, botIconUrl, css, } = (_c = params.manifest.variables) !== null && _c !== void 0 ? _c : {};
826
+ const { enabled, mode, devMode, merchantUrl, profiles, productHandles, targetPath, view, brandName, quickPrompts, merchantImage, latestThreadLoad, botIconUrl, css, nudge, loadUiManually, } = (_c = params.manifest.variables) !== null && _c !== void 0 ? _c : {};
827
+ setShopGPTLoaded(params.baseUrl, (_d = params.session) === null || _d === void 0 ? void 0 : _d.sessionId, !loadUiManually);
624
828
  const experiment = createExperiment({
625
829
  name: getExperimentName(mode),
626
830
  userId: params.userId,
@@ -640,8 +844,10 @@ const init = (params) => {
640
844
  baseURL: params.baseUrl,
641
845
  storeAPI,
642
846
  userId: params.userId,
847
+ sessionId: (_e = params.session) === null || _e === void 0 ? void 0 : _e.sessionId,
643
848
  });
644
849
  uiImplementation.init({
850
+ destination: params.baseUrl,
645
851
  storeAPI,
646
852
  shopGPTAPI,
647
853
  devMode,
@@ -656,14 +862,48 @@ const init = (params) => {
656
862
  latestThreadLoad: latestThreadLoad !== null && latestThreadLoad !== void 0 ? latestThreadLoad : DEFAULT_MAX_THREAD_AGE,
657
863
  botIconUrl,
658
864
  css,
865
+ nudge,
866
+ sessionId: (_f = params.session) === null || _f === void 0 ? void 0 : _f.sessionId,
659
867
  });
868
+ if (!loadUiManually) {
869
+ uiImplementation.loadUI();
870
+ }
660
871
  }
661
872
  };
662
873
 
874
+ const getClickedProductsInContents = (destination, sessionId, data) => {
875
+ const storedData = getProductActions(destination, sessionId);
876
+ const contents = data['contents'];
877
+ if (!contents || !Array.isArray(contents) || !storedData) {
878
+ return;
879
+ }
880
+ return contents.flatMap((content) => { var _a; return ((_a = storedData[content.id]) === null || _a === void 0 ? void 0 : _a.clicked) ? [content.id] : []; });
881
+ };
882
+ const tag = ({ eventName, destination, data, sessionId, }) => {
883
+ var _a;
884
+ const clickedProducts = getClickedProductsInContents(destination, sessionId, data);
885
+ if (eventName === 'AddToCart') {
886
+ clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
887
+ setProductAction(destination, sessionId, id, 'addToCart', true);
888
+ });
889
+ }
890
+ else if (eventName == 'RemoveFromCart') {
891
+ clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
892
+ setProductAction(destination, sessionId, id, 'addToCart', false);
893
+ });
894
+ }
895
+ return {
896
+ session: getProductActions(destination, sessionId),
897
+ preview: hasPreviewKey(),
898
+ isShopGPTLoaded: (_a = getShopGPTLoaded(destination, sessionId)) !== null && _a !== void 0 ? _a : false,
899
+ };
900
+ };
901
+
663
902
  // eslint-disable-next-line @nx/enforce-module-boundaries
664
903
  const data = {
665
904
  name: packageName,
666
905
  init,
906
+ tag,
667
907
  };
668
908
  try {
669
909
  if (typeof window !== 'undefined') {
@@ -876,6 +1116,29 @@ const shopGPTStyles = i$4 `
876
1116
  line-height: 150%;
877
1117
  }
878
1118
 
1119
+ .nudge {
1120
+ position: absolute;
1121
+ color: var(--shopgpt-secondary);
1122
+ padding: 12px 16px;
1123
+ font-size: 16px;
1124
+ line-height: 21px;
1125
+ background: var(--shopgpt-warning);
1126
+ border-radius: 5px;
1127
+ box-shadow: 0px 4px 6px -1px rgba(0, 0, 0, 0.1),
1128
+ 0px 2px 4px -1px rgba(0, 0, 0, 0.06);
1129
+ font-weight: 400;
1130
+ line-height: 150%;
1131
+ right: calc(100% + 10px);
1132
+ top: 0%;
1133
+ transform: translateY(-50%);
1134
+ animation: slideIn 0.5s ease-out forwards;
1135
+ opacity: 0;
1136
+ cursor: pointer;
1137
+ width: 260px;
1138
+ white-space: normal;
1139
+ word-wrap: break-word;
1140
+ }
1141
+
879
1142
  &:hover {
880
1143
  .chatbot-hover-text {
881
1144
  opacity: 1;
@@ -883,6 +1146,17 @@ const shopGPTStyles = i$4 `
883
1146
  }
884
1147
  }
885
1148
 
1149
+ @keyframes slideIn {
1150
+ from {
1151
+ transform: translate(20px, -50%);
1152
+ opacity: 0;
1153
+ }
1154
+ to {
1155
+ transform: translate(0, -50%);
1156
+ opacity: 1;
1157
+ }
1158
+ }
1159
+
886
1160
  .mobile-version {
887
1161
  display: none;
888
1162
 
@@ -1633,19 +1907,38 @@ class ProductItem extends r$2 {
1633
1907
  <p class="product-variation-details">${option.name}: ${option.value}</p>
1634
1908
  `);
1635
1909
  }
1910
+ productClicked(productId, price, url) {
1911
+ if (productId) {
1912
+ this.dispatchEvent(new CustomEvent('product-clicked', {
1913
+ detail: {
1914
+ productId,
1915
+ value: price ? parseFloat(price) : undefined,
1916
+ },
1917
+ composed: true,
1918
+ bubbles: true,
1919
+ }));
1920
+ }
1921
+ this.redirect(url);
1922
+ }
1636
1923
  render() {
1637
1924
  return x `
1638
1925
  <div class="product">
1639
1926
  <img
1640
1927
  src=${this.product.image.url}
1641
1928
  alt=${this.product.image.alt}
1642
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1929
+ @click=${() => {
1930
+ var _a;
1931
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1932
+ }}
1643
1933
  />
1644
1934
  <div class="content">
1645
1935
  <p
1646
1936
  class="product-name"
1647
1937
  title=${this.product.title}
1648
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1938
+ @click=${() => {
1939
+ var _a;
1940
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1941
+ }}
1649
1942
  >
1650
1943
  ${this.product.title}
1651
1944
  </p>
@@ -1656,7 +1949,10 @@ class ProductItem extends r$2 {
1656
1949
  </div>
1657
1950
  <button
1658
1951
  class="btn-view-product"
1659
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1952
+ @click=${() => {
1953
+ var _a;
1954
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1955
+ }}
1660
1956
  >
1661
1957
  View Product
1662
1958
  </button>
@@ -2462,6 +2758,22 @@ const chatSectionStyles = i$4 `
2462
2758
  const capitalizeEachWord = (str) => {
2463
2759
  return str === null || str === void 0 ? void 0 : str.replace(/^\w/, (char) => char.toUpperCase());
2464
2760
  };
2761
+ const adParams = new Set([
2762
+ 'fbclid',
2763
+ 'gclid',
2764
+ 'sccid',
2765
+ 'ttclid',
2766
+ 'epik',
2767
+ 'li_fat_id',
2768
+ 'twclid',
2769
+ 'rdt_cid',
2770
+ 'aleid',
2771
+ 'tabclid',
2772
+ 'msclkid',
2773
+ 'dclid',
2774
+ 'wbraid',
2775
+ ]);
2776
+ const isFromAd = (params) => [...params.keys()].some((key) => adParams.has(key.toLowerCase()));
2465
2777
 
2466
2778
  const plusBtn = b `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
2467
2779
  <path d="M12.75 11.25V6H11.25V11.25H6V12.75H11.25V18H12.75V12.75H18V11.25H12.75Z" fill="white"/>
@@ -3518,6 +3830,7 @@ class FeedbackDialog extends r$2 {
3518
3830
  this.dispatchEvent(new CustomEvent('submit-feedback', {
3519
3831
  detail: {
3520
3832
  messageId: this.messageId,
3833
+ threadId: this.threadId,
3521
3834
  feedback,
3522
3835
  },
3523
3836
  composed: true,
@@ -3589,6 +3902,10 @@ __decorate([
3589
3902
  n({ type: String }),
3590
3903
  __metadata("design:type", Object)
3591
3904
  ], FeedbackDialog.prototype, "messageId", void 0);
3905
+ __decorate([
3906
+ n({ type: String }),
3907
+ __metadata("design:type", Object)
3908
+ ], FeedbackDialog.prototype, "threadId", void 0);
3592
3909
  __decorate([
3593
3910
  n({ type: String }),
3594
3911
  __metadata("design:type", Object)
@@ -3621,19 +3938,26 @@ class ChatSection extends r$2 {
3621
3938
  behavior: 'smooth',
3622
3939
  });
3623
3940
  }
3624
- async processMessage(e, message) {
3941
+ async processMessage(e, message, isPrompt = false) {
3625
3942
  this.scrollToBottom();
3626
3943
  if (!this.thread) {
3627
3944
  await this.createChatThread({ title: '' }, false);
3628
3945
  }
3629
- await this.sendMessageToServer(e, message);
3946
+ await this.sendMessageToServer(e, message, isPrompt);
3947
+ }
3948
+ sendEvent(action, actionData) {
3949
+ this.dispatchEvent(new CustomEvent('send-event', {
3950
+ detail: { action, actionData },
3951
+ composed: true,
3952
+ bubbles: true,
3953
+ }));
3630
3954
  }
3631
3955
  async onSubmit(e) {
3632
3956
  var _a;
3633
3957
  e.preventDefault();
3634
3958
  const message = (_a = this.userQuery) === null || _a === void 0 ? void 0 : _a.trim();
3635
3959
  this.userQuery = '';
3636
- await this.processMessage(e, message);
3960
+ await this.processMessage(e, message, false);
3637
3961
  }
3638
3962
  handleThreadDelete() {
3639
3963
  if (this.deleteAllThreads) {
@@ -3655,13 +3979,19 @@ class ChatSection extends r$2 {
3655
3979
  this.deleteThreadId = '';
3656
3980
  }
3657
3981
  handleFeedback(rating, messageId, comment) {
3982
+ var _a, _b;
3658
3983
  if (rating === 'bad') {
3659
- this.feedbackDetails = { messageId, comment };
3984
+ this.feedbackDetails = {
3985
+ messageId,
3986
+ threadId: ((_a = this.thread) === null || _a === void 0 ? void 0 : _a.threadId) || '',
3987
+ comment,
3988
+ };
3660
3989
  return;
3661
3990
  }
3662
3991
  this.dispatchEvent(new CustomEvent('submit-feedback', {
3663
3992
  detail: {
3664
3993
  messageId: messageId,
3994
+ threadId: (_b = this.thread) === null || _b === void 0 ? void 0 : _b.threadId,
3665
3995
  feedback: {
3666
3996
  rating,
3667
3997
  comment: null,
@@ -3808,7 +4138,10 @@ class ChatSection extends r$2 {
3808
4138
  return x `
3809
4139
  <div
3810
4140
  class="prompt"
3811
- @click=${(e) => this.processMessage(e, prompt)}
4141
+ @click=${(e) => {
4142
+ this.processMessage(e, prompt, true);
4143
+ this.sendEvent('promptClicked');
4144
+ }}
3812
4145
  >
3813
4146
  ${prompt}
3814
4147
  </div>
@@ -3816,7 +4149,13 @@ class ChatSection extends r$2 {
3816
4149
  })}
3817
4150
  ${o$1(customPrompts, ({ prompt, link }) => {
3818
4151
  return x `
3819
- <a class="prompt" href=${link} target="_blank" rel="noopener">
4152
+ <a
4153
+ class="prompt"
4154
+ href=${link}
4155
+ target="_blank"
4156
+ rel="noopener"
4157
+ @click=${() => this.sendEvent('promptClicked')}
4158
+ >
3820
4159
  ${prompt}
3821
4160
  </a>
3822
4161
  `;
@@ -4092,7 +4431,10 @@ class ChatSection extends r$2 {
4092
4431
  </form>
4093
4432
  ${this.viewType === 'modal'
4094
4433
  ? x ` <footer>
4095
- Powered by <a href="https://blotout.io">Blotout</a>
4434
+ Powered by
4435
+ <a target="_blank" href="https://shopgpt.edgeagents.ai"
4436
+ >Blotout</a
4437
+ >
4096
4438
  </footer>`
4097
4439
  : E}
4098
4440
  </div>
@@ -4132,6 +4474,7 @@ class ChatSection extends r$2 {
4132
4474
  ? x `
4133
4475
  <feedback-dialog
4134
4476
  .messageId=${this.feedbackDetails.messageId}
4477
+ .threadId=${this.feedbackDetails.threadId}
4135
4478
  .comment=${this.feedbackDetails.comment}
4136
4479
  @submit-feedback=${() => {
4137
4480
  this.feedbackDetails = undefined;
@@ -4309,12 +4652,15 @@ const parseMessage = (message, parseDataAsJSON) => {
4309
4652
  return result;
4310
4653
  };
4311
4654
 
4655
+ const soothingWaterDropSound = 'data:audio/mpeg;base64,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iBeym4zYFAAkYAVmuxNNv+v7c+5J93kKUxDKOKWyMt3ZVsrLlNp3Ib///////7s611TkOqXWZl3uhSiSOQewv1FYTZFKdhJVZBMgiKlDgeGlFFOoqUzGFzKYeAg0RO4QCQcFYedRiB5hURMHA6HQkKGqCXYGAAAAABGgApJl0h7bdv/r82S1SFSqqfmOjO4Wm5alsNMFG/////b9dVlyWpEKmqe9aHhMak+HhGsqBxxQOCxAeEChIKHAKEuwM4PIAACtABSTNSHt//uURO6CIqCNR2qAE/pZMgjtUAJ+DWJBF6oE2cG0yCL1QBX4t2rX16KCd9t30sqUWzrubZLKdC9a3az71olrf//////////T/t0Pp3IzIqdpblOje9GO7Vq6MhpGbRjEdEe4dgUA6KIBGwAq9dj2r///////////6W/eDhP1ZcjzJWbcDYTA0WE///////8uT5Zf9azM11Vxps81NTe63cJduNWlkq5ShrwPgRqhhppVlmu6EHCxk5tqaLA4HSCrD1D0gaM2QTGwJB4jiiCRsAKvXY9q7///////////8pPXQrb9l97FaKqad0uiKqLfVOqE////////W6JfMjW2K+v6bfFIfEspmm2OPb5lv/Z7llsUapI0XhNl30zkDXTZIq0aKBUSy9ImIjqwkOIZGymx8KTVFCDEAFAAbQAPquiW9Xb9v/+r///////X5cpV5I9ZjVCEsMyBIJ7LqqX//////Mv6JSLfFev2nda4Zrx8Km2io+FM1XRobWl0v4DX//uURNmGYkU6SHqAE/hREakPUAKbTLI/F6oFGcGhR6L1QRs5Ao+prOmkimTgXyZNBA1DB6wUnLlJJGijDhQCSMBRQIpycHiihiCAABxoAH1XRJfOdv2/f///////+1/PekqIdq7KiLDq7sOxJjr1q3O6Pf62///////6n2mfT7/m5GN2p2XnmlemqGhc2+zu+2KlsjnPBMFsfHHG0IcposI7mkSiMo6zJ8/UDkOe8jSY4aefp5AUQQCgVsAKrXRNN+3+n/////////5eAyMgGMzOqlnUebFkm5rRSdiUSHX///////8iM+fHvc/b/P3drfb+G3XZJqmV+sqzaxiSUGkD7zYktN+kcKPZZh0lEDTiybgbECfnAeO5Rjl7FbZAYQACi1sAKrXNS5v/+tvr6vIhqleWdHN22tT3b60XZ6ZE0VU///////3m9JJvsdKUs7I5M52kR2Z0UjRyHGGq4kwgOFmOwmUwDB9WExESOivUVYouLEMg0sTcOiAycKIY//ukRNOCI22QRWqBNnBvcgitUEbODTpBF6oE2cGUyCL1QBagWGgRQ4oYSjAAAACIgBTjQPba9f2lZF1qSU6EWjIc5mlMxtmV6HUrOdSMV3QtdVb////////+1eV3dWkZbkZjyDllIlWOplzrGMNynsyIVHMdDHOchzKQIoxhRBkXQxVYy3Rx9g8JEHEoAAAAAtgAU4zQq7a/99PZkdndankap3PkTmIJyUR56VnXRrV////////5fvyt+1L6OVKmWplIUtxJXj0UeR2PNO4kgmiJOQWOGjRyWMZWKxROY4aYzlcTDg8wmEhW4IABGwAq9cwapt9///////////oajVpKYiofa790LnJKO52cjGujXoxZVQs////////V8tJN9m7bt1nzMqHX3110dv6NVi+nmouWVGAqokJTckosMtmIQWSVPNCTjj5KUXBZBXVJpaBR9O5YJCRoNQrbEAAjQAVeuYNU2+///////////w1LsmB8PUySiIApz5pXEueQvL///////+oZBr5PMj9q25R7EantpRahl50b2unDPb6YZbjNWMWmIMZ1EM0nTgjkuZbkTRp+r50BQQsyY+HVGSFGu2nN6TTdEYYAAAAegD6rmDVd///////////9/Zn7//ukRNuCIw6QRuqAK/heEgjdUAV+Di5BFaoI2cG2SCK1QKc4vopluyIyIRjgjuRhyPT9+yZ/X//////b0Mnc5SF9bTxuv8x3b7TIIPb5VoVq3MQU6kDlEkkjzET0LWxJcL0GYEzSXsUes8UFGFkwoIBQesLIkmSOocchqWBgaRIjYgAAADoAfVcoNU3of//////////9k/KWWv/OGYSAzsXxKU4D6//z////+mdish1u/JQb2GVsH6rn8emS9X1iGEWpNqLZNE5A7uVblEsvWWTwSVznj0WXIJv16ZFiw20bUP2VXUExBHBlKqK8TtpicSjACyABTzsmZ7b////t7f/////skbIyzcvmO7kAxOZmFMONiogsDGSEkAZf///////5aMv8+cO5F5+Z1Vgd96JswiPNgwOh1CzUOochYq4d+I5M4A+B6sDGIXhhQCQwtFVKqCglEgowAAB6gFPO1e3oN907XqtPzOxGYqWndnVEqjmc7ohp6LJVZ7Vndf////////6+Wr6qrElOixGNY6TGQUdxIYxDVI5o4ysVqUZCniJhlo8PTDI8OCwmhzECDh1jxIimK4fEih/BQBuAALGAFOMfNEwq1f+hvTSX/VdkMWhU3m3NYhFFlW9Fot7L//ukROoEA5+QROKCNnBvkgicUCnODNZBGaoEecGPyCMxQBW8uZ1Wv//////+/6p96rRtKKiLSpVVplPIdXdlaYOB5GO7tlmF1FB0hiIZhylQxIi4Fh5Rx1FRYeOINMLDAcRUoiHCjXCgAAAAREAKSZZ1Vav7PVbNTNa9lqpKEVltRD6rZL+6J2RFT/////////p6du62ewPOqKxW3BsppGvO6IiCxRJpgamFsFSIAzIZArhGCqziTlKOrIRWLBuPKAABIiAFLMnHtV/95tGN6mfRCNOY102HIRndHoU6GVW3ya3ejU2b/////////6ptU+2l6UUWZCLVTVFHQqJdTEQyEbIOiysw0ggc4rkBCHKJOriaIg8SOPFJhpBASMDBUuAaMAGREmsMr/////7IdIDxh8owNTpM0LLMi8okxrBdE8//////+xt+1G4j9SgKi9i3JNykqKJFCIbC1RpAKAAAAI2AFTMn3U1fpVf//////////czlKQXntGnKNVMSoFpSEWiwjZFZf/////8PO5/3H3XGku1vWkaJLrzB++pZDtxRYrXSmvFb2IJUuzsSqoKixOKwaUo44sYzjAiYPaMH04c0SMQsaosgFAAAAEbACpmX6mr96v////////////uURPEEY0GQRmqALUBZEgjtUAJ/DAo9G6oArej0AaS9JIgEm7zzpZa8tDqh0YspmrZ0ZWVGop1cYm47B//////9PXdNzrfZvfkfXfS21te9i87xtU7m7Mmpi2PSIpnGF5Zvl0BAtJ7SoYdBygCieKTWmPqVFngcmoxCRM6SUiExSRg0kAAwCnmTle9//st2////////+/+EOfloy9FCeOQKHjY+dGzn///////+fj/f8l893LMZjUcjid21C9hvv5FPY7U8S1hS7g+Opw2XggyK4x0key5VXMk+C023IGFSFV+snynTukZQWugUABTzLlNrqS/V//////////yc1xk3S95nOjMHxSvQ0eJ2nP///////+cyq/+/zPjxr7H+ed+vpMrcb7h55+SReJ2SRMhLHaYUkWlqGlGn1BRx0iC2hSRg9iSZGL3ZIHEwSFkUMJoZ0AAAAACRgBTjJ1TWf////////////d3QjynB4DJKFkxsUTZW1Z6sxAn///////ukRO+DM2GQRWqBRnB10gitUEbODN5BFooFOcGfyCLRQJs4///qfmvuN/65eld5y/ypx6Xklc7ZpsozrhhtaqjXMy7NJxAFf52kCZepE9womyXLQWZ6OeG24aUolMe/AAAAARogBSTJ1SNB1f/3o0vS6EWzd70uhpmUYjFOjEdnorGZ2fZ2WitVf/////////1SRcp7MptCZSs9GWxmZ21VSzidBcg48YUP3LONGSEYhBKg5iDHJQWqOF2OwM5IZ2XAASQAKWZXd6VVeyuv75ddq6nI61cznMRrVnchZ1RZVViaM3///////sn/ptuqujo59KzjXkGsY5pRMpR67OPO4TEhw7ElDkzCphcaJoJKLCwsEVVRYTOQoSixBJQ4BzCrEFiCIztFAAsYAUszd3pVe3prWh08YzNszSIpmrQm7WTZz9e8jV////////tp0Oaq6tvdSIsjKs7HUqOQgo0hjpMRXJOIKJEOrRpFEiiruICjuODzud3ZCua4iNQcx2EzDXCFMgAAAOgCpmfXt///////////8/MiS5NKXgCdWeVyTrzQDo5SHB/////L/8srH5V7hDYX4+qncnZ9Y7pT1TXosbl5uxXqJWj8ZKzLZiBYdYmzkmjESxxDnYIM//uURPUCI0KQReqBNnBhkejdUAVvTNZBGaoAr8F9SCM1QBX4lJMsqjp6RM4e0gBGYVZRkSBCRRbEDkgAAAfAFTLn17V2r///////////0XR9LV7HWd1Ocp56OPkV7tVmTZkozp/T////+3VE1cpiu/2N7L+svbyZXZVJROcspHq9k93SklZKcgd+T5qclemWmUVUYWmoRzSH2JEeIh5kPQJkRwyK7ttRGIiZpCVvny6WEQskAAdAoACpEniCmxqkip1f/6yfUpa///zEYy////2W4doWS8C4DszAA2zMZnMDs5w6ep5////+8qRQwAfUPZSu/7pPJfMTYaMblJ1APmE0aBKaZCmsgbYRKLulJRa2B0uvbaFpZGVNK+KLzXKsNlSpGolJkeLqiojiPLoyxowJxdY0UQkwscAAlAoDZAAVIk8QU2NUlqdX/6k1l9Wr//+6nJ////Qmzre50qpjud6oFM5MjupkSb3SitRetX9P+n///rtuq3azK3xm19h8//u0RNsBA3KQRMqBTnB58gicUEnOELJBEaoFOcIjyCI1QSc4jN05t1bVPjsimzhHwlpZ2Et5FWc8iKlSza6OBE2oefFEQomyXzXJgqVZQCptpokVONECKbMyeCAtAo5cTEAmSWVRAAAQhlIAHYHhywnUgyKX//czJs4////Ohjf/6a5L07HLsmTuLJeqkspbSMzyN1Vn92S7o1VtJ3PT///W3ojVkndw4IqoJmC/as1+V0F0NhyExr8dXVEZ0scrQoLGRWeFds7ZZSKfPnWSebHrjhTHhe2VCQOCLGTx5IK0p6g2JooHlWiVoR0ifLLK8Okg/lI9XefLTuxZJBfClxgAAQAQBIAAegqF1QuEixql//1pk2c///85DG////+1HXLux8azIrh3Ei3IjGKRXmdWctF0tbv7M2j+/v/T9ur3dOplKbfcpB/t5r0MLPwu3on23Rw1Mmr3Pbtrjy7CWb38nHaxxtsO0kLB2fOqkQteq6+4pKy+wgvuJqxIRqhFYyEsKTgHiwPiozOyeJI+tHJ7TUIhWIAABgBeDtjyVkf//RUkv//+Yn////////wi3IXxOKH5Cfk/mv//////zCTCs8pSl/5S///tZFqsYxjnlqrKzUlorCpqiJq40RNUia9qylsalKSLLoiehQsrQFR0SiI1AVE0VASPuRTQodQs1vtDCMgAAIBgAAAUghyMUkf//qS///zEL///////81//f+zD5CNC4TRfn////kzXxM/E8lt/uPpEinGrqKFl//u0RO2DBNSQQuKCZnCVsghtUEzODe5BDIgFOcHeyCFw0Kc4ZFJbfGviyLVYYIg1NmSxoQvQpItuMcKkqSLbQoUKwqXFLpWhhGmvIqCJLhUMnGyUs24VHB4KmUSwWBIVKkxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUZOGP8AAAf4AAAAgAAA/wAAABAAABpAAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';
4656
+
4312
4657
  const DIALOG_DELAY = 1000;
4313
4658
  const normalizePath = (path) => path.replace(/\/$/, '');
4314
4659
  class ShopGPT extends r$2 {
4315
4660
  constructor() {
4316
4661
  super(...arguments);
4317
4662
  this.isStylesheetInjected = false;
4663
+ this.isPreviousMessagePrompt = false;
4318
4664
  this.latestThreadLoad = DEFAULT_MAX_THREAD_AGE;
4319
4665
  this.modalState = 'close';
4320
4666
  this.isLoadingHistory = false;
@@ -4326,6 +4672,8 @@ class ShopGPT extends r$2 {
4326
4672
  this.messages = [];
4327
4673
  this.chatThreads = new Map();
4328
4674
  this.customPrompts = [];
4675
+ this.hasUserInteracted = false;
4676
+ this.showNudge = false;
4329
4677
  this.loadData = async () => {
4330
4678
  if (!this.shopGPTAPI) {
4331
4679
  return;
@@ -4366,17 +4714,23 @@ class ShopGPT extends r$2 {
4366
4714
  }
4367
4715
  }
4368
4716
  this.init();
4717
+ this.startNudgeTimer();
4369
4718
  }
4370
4719
  disconnectedCallback() {
4371
4720
  window.removeEventListener('edgetag-initialized', this.loadData);
4372
4721
  window.removeEventListener('popstate', this.onPopState);
4722
+ if (this.nudgeTimer) {
4723
+ window.clearTimeout(this.nudgeTimer);
4724
+ }
4373
4725
  super.disconnectedCallback();
4374
4726
  }
4375
4727
  init() {
4376
4728
  window.addEventListener('edgetag-initialized', this.loadData);
4377
4729
  window.addEventListener('popstate', this.onPopState);
4730
+ this.shopGPTAPI.sendEvent('shopGPTInitialized', this.getSiteCurrency().currency);
4378
4731
  if (!this.view || this.view === 'overlay') {
4379
- delay(DIALOG_DELAY).then(() => {
4732
+ delay(DIALOG_DELAY)
4733
+ .then(() => {
4380
4734
  var _a;
4381
4735
  if (document.hidden) {
4382
4736
  document.addEventListener('visibilitychange', () => { var _a; return (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal(); }, {
@@ -4386,7 +4740,8 @@ class ShopGPT extends r$2 {
4386
4740
  else {
4387
4741
  (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal();
4388
4742
  }
4389
- });
4743
+ })
4744
+ .catch(logger.error);
4390
4745
  }
4391
4746
  }
4392
4747
  setChatTitle(threadId, title) {
@@ -4414,8 +4769,8 @@ class ShopGPT extends r$2 {
4414
4769
  if (!thread) {
4415
4770
  return;
4416
4771
  }
4417
- const searchParam = new URLSearchParams(window.location.search);
4418
- const fromAd = searchParam.get('shopGPT') === '1';
4772
+ const searchParams = new URLSearchParams(window.location.search);
4773
+ const fromAd = isFromAd(searchParams) || searchParams.get('shopGPT') === '1';
4419
4774
  const productHandle = this.devMode
4420
4775
  ? (_a = thread === null || thread === void 0 ? void 0 : thread.devContext) === null || _a === void 0 ? void 0 : _a.productHandle
4421
4776
  : fromAd
@@ -4652,7 +5007,7 @@ class ShopGPT extends r$2 {
4652
5007
  }
4653
5008
  });
4654
5009
  }
4655
- async sendMessageToServer(e, message) {
5010
+ async sendMessageToServer(e, message, isPrompt = false) {
4656
5011
  e.preventDefault();
4657
5012
  e.stopPropagation();
4658
5013
  if (!message || this.isTyping || this.isLoadingHistory) {
@@ -4660,6 +5015,10 @@ class ShopGPT extends r$2 {
4660
5015
  }
4661
5016
  this.isFailed = false;
4662
5017
  try {
5018
+ this.isPreviousMessagePrompt = isPrompt;
5019
+ if (!isPrompt) {
5020
+ this.shopGPTAPI.sendEvent('queryInteractions', this.getSiteCurrency().currency);
5021
+ }
4663
5022
  this.messages = [{ sender: 'user', message }, ...this.messages];
4664
5023
  this.isTyping = true;
4665
5024
  const response = await this.submitQuery(message);
@@ -4674,7 +5033,7 @@ class ShopGPT extends r$2 {
4674
5033
  submitFeedback(e) {
4675
5034
  e.stopPropagation();
4676
5035
  this.shopGPTAPI
4677
- .saveFeedback(e.detail.messageId, e.detail.feedback)
5036
+ .saveFeedback(e.detail.messageId, e.detail.threadId, e.detail.feedback)
4678
5037
  .then(() => {
4679
5038
  const messages = this.messages;
4680
5039
  const messageIndex = messages.findIndex(({ messageId }) => messageId === e.detail.messageId);
@@ -4683,17 +5042,25 @@ class ShopGPT extends r$2 {
4683
5042
  feedback: e.detail.feedback,
4684
5043
  };
4685
5044
  this.messages = [...messages];
5045
+ })
5046
+ .catch(logger.error);
5047
+ }
5048
+ sendEvent(e) {
5049
+ e.stopPropagation();
5050
+ this.shopGPTAPI.sendEvent(e.detail.action, this.getSiteCurrency().currency, e.detail.actionData);
5051
+ }
5052
+ productClicked(e) {
5053
+ e.stopPropagation();
5054
+ setProductAction(this.destination, this.sessionId, e.detail.productId, 'clicked', true);
5055
+ this.shopGPTAPI.sendEvent('productRecommendationClicked', this.getSiteCurrency().currency, {
5056
+ productId: e.detail.productId,
5057
+ value: e.detail.value,
5058
+ isPrompt: this.isPreviousMessagePrompt,
4686
5059
  });
4687
5060
  }
4688
5061
  getSiteCurrency() {
4689
5062
  return this.storeAPI.getSiteCurrency();
4690
5063
  }
4691
- render() {
4692
- if (this.view === 'modal') {
4693
- return this.modalMode();
4694
- }
4695
- return this.overlayMode();
4696
- }
4697
5064
  overlayMode() {
4698
5065
  const thread = this.chatThreads.get(this.selectedThreadId);
4699
5066
  return x `
@@ -4702,6 +5069,8 @@ class ShopGPT extends r$2 {
4702
5069
  @delete-thread=${this.handleThreadDelete}
4703
5070
  @delete-all-threads=${this.handleAllThreadsDelete}
4704
5071
  @submit-feedback=${this.submitFeedback}
5072
+ @send-event=${this.sendEvent}
5073
+ @product-clicked=${this.productClicked}
4705
5074
  >
4706
5075
  <div class="mobile-version">
4707
5076
  Please switch to the desktop version for the best experience.
@@ -4749,6 +5118,7 @@ class ShopGPT extends r$2 {
4749
5118
  `;
4750
5119
  }
4751
5120
  modalMode() {
5121
+ var _a;
4752
5122
  const thread = this.chatThreads.get(this.selectedThreadId);
4753
5123
  const closeModal = () => {
4754
5124
  this.modalState = 'close';
@@ -4758,12 +5128,28 @@ class ShopGPT extends r$2 {
4758
5128
  <button
4759
5129
  @click=${(e) => {
4760
5130
  e.preventDefault();
5131
+ this.shopGPTAPI.sendEvent('chatbotOpened', this.getSiteCurrency().currency);
4761
5132
  this.modalState = 'open';
5133
+ this.handleUserInteraction();
4762
5134
  }}
4763
5135
  >
4764
5136
  ${chatIcon}
4765
5137
  </button>
4766
- <div class="chatbot-hover-text">What are you looking for today?</div>
5138
+ ${((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show) && this.showNudge
5139
+ ? x `<div
5140
+ class="nudge"
5141
+ @click=${(e) => {
5142
+ e.preventDefault();
5143
+ this.modalState = 'open';
5144
+ this.handleUserInteraction();
5145
+ }}
5146
+ >
5147
+ Hi there! I'm an AI Agent to help you find the perfect product.
5148
+ What are you looking for today?
5149
+ </div>`
5150
+ : x `<div class="chatbot-hover-text">
5151
+ What are you looking for today?
5152
+ </div>`}
4767
5153
  </div>`;
4768
5154
  }
4769
5155
  return x `
@@ -4772,6 +5158,9 @@ class ShopGPT extends r$2 {
4772
5158
  @delete-thread=${this.handleThreadDelete}
4773
5159
  @delete-all-threads=${this.handleAllThreadsDelete}
4774
5160
  @submit-feedback=${this.submitFeedback}
5161
+ @click=${this.handleUserInteraction}
5162
+ @send-event=${this.sendEvent}
5163
+ @product-clicked=${this.productClicked}
4775
5164
  >
4776
5165
  <chat-section
4777
5166
  .prompts=${this.quickPrompts}
@@ -4800,6 +5189,48 @@ class ShopGPT extends r$2 {
4800
5189
  </div>
4801
5190
  `;
4802
5191
  }
5192
+ startNudgeTimer() {
5193
+ var _a, _b;
5194
+ if (this.view !== 'modal' || !((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show)) {
5195
+ return;
5196
+ }
5197
+ this.hasUserInteracted = isUserInteracted(this.destination);
5198
+ if (this.hasUserInteracted || this.nudgeTimer) {
5199
+ return;
5200
+ }
5201
+ this.nudgeTimer = window.setTimeout(() => {
5202
+ if (!this.hasUserInteracted) {
5203
+ this.playNudgeSound();
5204
+ this.showNudge = true;
5205
+ }
5206
+ }, (((_b = this.nudge) === null || _b === void 0 ? void 0 : _b.timeout) || DEFAULT_NUDGE_TIMEOUT) * 1000);
5207
+ }
5208
+ playNudgeSound() {
5209
+ var _a;
5210
+ if (!((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.sound) || !navigator.userActivation.hasBeenActive) {
5211
+ return;
5212
+ }
5213
+ const audio = new Audio(soothingWaterDropSound);
5214
+ audio
5215
+ .play()
5216
+ .catch((error) => logger.error('Error playing nudge sound', error));
5217
+ }
5218
+ handleUserInteraction() {
5219
+ if (!this.hasUserInteracted) {
5220
+ this.hasUserInteracted = true;
5221
+ this.showNudge = false;
5222
+ if (this.nudgeTimer) {
5223
+ window.clearTimeout(this.nudgeTimer);
5224
+ }
5225
+ setUserInteracted(this.destination);
5226
+ }
5227
+ }
5228
+ render() {
5229
+ if (this.view === 'modal') {
5230
+ return this.modalMode();
5231
+ }
5232
+ return this.overlayMode();
5233
+ }
4803
5234
  }
4804
5235
  ShopGPT.styles = [shopGPTStyles];
4805
5236
  __decorate([
@@ -4850,6 +5281,14 @@ __decorate([
4850
5281
  n({ type: Array }),
4851
5282
  __metadata("design:type", Array)
4852
5283
  ], ShopGPT.prototype, "customPrompts", void 0);
5284
+ __decorate([
5285
+ r(),
5286
+ __metadata("design:type", Object)
5287
+ ], ShopGPT.prototype, "hasUserInteracted", void 0);
5288
+ __decorate([
5289
+ r(),
5290
+ __metadata("design:type", Object)
5291
+ ], ShopGPT.prototype, "showNudge", void 0);
4853
5292
  if (!customElements.get('shop-gpt')) {
4854
5293
  customElements.define('shop-gpt', ShopGPT);
4855
5294
  }
@@ -4865,6 +5304,7 @@ if (typeof window != 'undefined' && typeof document != 'undefined') {
4865
5304
  return;
4866
5305
  }
4867
5306
  shopGPT = document.createElement('shop-gpt');
5307
+ shopGPT.destination = params.destination;
4868
5308
  shopGPT.storeAPI = params.storeAPI;
4869
5309
  shopGPT.shopGPTAPI = params.shopGPTAPI;
4870
5310
  shopGPT.devMode = params.devMode;
@@ -4879,12 +5319,26 @@ if (typeof window != 'undefined' && typeof document != 'undefined') {
4879
5319
  shopGPT.latestThreadLoad = params.latestThreadLoad;
4880
5320
  shopGPT.botIconUrl = params.botIconUrl;
4881
5321
  shopGPT.css = params.css;
5322
+ shopGPT.nudge = params.nudge;
5323
+ shopGPT.sessionId = params.sessionId;
5324
+ },
5325
+ loadUI() {
5326
+ if (!shopGPT) {
5327
+ logger.error('ShopGPT component not found!');
5328
+ return;
5329
+ }
5330
+ if (shopGPT.parentNode) {
5331
+ logger.log('ShopGPT component added already!');
5332
+ return;
5333
+ }
4882
5334
  document.body.append(shopGPT);
5335
+ setShopGPTLoaded(shopGPT.destination, shopGPT.sessionId, true);
4883
5336
  },
4884
5337
  destroy() {
4885
5338
  if (!shopGPT) {
4886
5339
  return;
4887
5340
  }
5341
+ setShopGPTLoaded(shopGPT.destination, shopGPT.sessionId, false);
4888
5342
  shopGPT.remove();
4889
5343
  shopGPT = undefined;
4890
5344
  delete window[registryKey];