@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.mjs CHANGED
@@ -406,10 +406,29 @@ const createExperiment = (props) => {
406
406
  }
407
407
  };
408
408
 
409
+ const uiActions = new Set([
410
+ 'shopGPTInitialized',
411
+ 'chatbotOpened',
412
+ 'queryInteractions',
413
+ 'promptClicked',
414
+ 'productRecommendationClicked',
415
+ ]);
416
+ new Set([
417
+ ...uiActions,
418
+ 'pageView',
419
+ 'productRecommendationViewed',
420
+ 'productRecommendationAddedToCart',
421
+ 'productRecommendationInitiatedCheckout',
422
+ 'orderPlaced',
423
+ ]);
424
+
409
425
  const packageName = 'shopGPT';
410
- const DEFAULT_MAX_THREAD_AGE = 14;
426
+ const DEFAULT_MAX_THREAD_AGE = 14; // in days
427
+ const DEFAULT_NUDGE_TIMEOUT = 10; // in seconds
411
428
  const previewKeyName = 'previewShopGPT';
412
429
 
430
+ const keyPrefix = `_worker`;
431
+
413
432
  const canLog = () => {
414
433
  try {
415
434
  return localStorage.getItem('edgeTagDebug') === '1';
@@ -442,13 +461,182 @@ const logger = {
442
461
  },
443
462
  };
444
463
 
464
+ const initKey = `${keyPrefix}StoreMultiple`;
465
+ const saveData = (destination, persistType, value, key = initKey) => {
466
+ if (persistType === 'session') {
467
+ const data = getSession(key);
468
+ data[destination] = value;
469
+ saveSession(data, key);
470
+ return;
471
+ }
472
+ const data = getLocal(key);
473
+ data[destination] = value;
474
+ saveLocal(data, key);
475
+ };
476
+ const getData = (destination, persistType, key = initKey) => {
477
+ let data;
478
+ if (persistType === 'session') {
479
+ data = getSession(key);
480
+ }
481
+ else {
482
+ data = getLocal(key);
483
+ }
484
+ return (data === null || data === void 0 ? void 0 : data[destination]) || {};
485
+ };
486
+ const saveLocal = (value, key) => {
487
+ try {
488
+ if (!localStorage) {
489
+ return;
490
+ }
491
+ localStorage.setItem(key, JSON.stringify(value));
492
+ }
493
+ catch {
494
+ logger.log('Local storage not supported.');
495
+ }
496
+ };
497
+ const getLocal = (key) => {
498
+ try {
499
+ if (!localStorage) {
500
+ return {};
501
+ }
502
+ const data = localStorage.getItem(key);
503
+ if (!data) {
504
+ return {};
505
+ }
506
+ return JSON.parse(data) || {};
507
+ }
508
+ catch {
509
+ return {};
510
+ }
511
+ };
512
+ const saveSession = (value, key) => {
513
+ try {
514
+ if (!sessionStorage) {
515
+ return;
516
+ }
517
+ sessionStorage.setItem(key, JSON.stringify(value));
518
+ }
519
+ catch {
520
+ logger.log('Session storage not supported.');
521
+ }
522
+ };
523
+ const getSession = (key) => {
524
+ try {
525
+ if (!sessionStorage) {
526
+ return {};
527
+ }
528
+ const data = sessionStorage.getItem(key);
529
+ if (!data) {
530
+ return {};
531
+ }
532
+ return JSON.parse(data) || {};
533
+ }
534
+ catch {
535
+ return {};
536
+ }
537
+ };
538
+
445
539
  var _a$1;
446
540
  const registryKey = Symbol.for('shop-gpt');
447
541
  if (typeof window != 'undefined') {
448
542
  (_a$1 = window[registryKey]) !== null && _a$1 !== void 0 ? _a$1 : (window[registryKey] = {});
449
543
  }
450
544
 
451
- const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, storeAPI, }) => {
545
+ const SHOP_GPT_SESSION_KEY = 'shopGPTSession';
546
+ const SHOP_GPT_LOCAL_STORAGE_KEY = 'shopGPTLocalStorage';
547
+ const getSessionData = (destination) => {
548
+ const session = getData(destination, 'session', SHOP_GPT_SESSION_KEY);
549
+ return session;
550
+ };
551
+ const saveSessionData = (destination, data) => {
552
+ saveData(destination, 'session', data, SHOP_GPT_SESSION_KEY);
553
+ };
554
+ const getLocalStorageData = (destination) => {
555
+ const local = getData(destination, 'local', SHOP_GPT_LOCAL_STORAGE_KEY);
556
+ return local;
557
+ };
558
+ const saveLocalStorageData = (destination, data) => {
559
+ saveData(destination, 'local', data, SHOP_GPT_LOCAL_STORAGE_KEY);
560
+ };
561
+
562
+ // eslint-disable-next-line @nx/enforce-module-boundaries
563
+ const hasPreviewKey = () => {
564
+ var _a;
565
+ try {
566
+ return ((_a = sessionStorage.getItem(previewKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
567
+ }
568
+ catch {
569
+ return false;
570
+ }
571
+ };
572
+ const isUserInteracted = (destination) => {
573
+ var _a;
574
+ const session = getSessionData(destination);
575
+ return !!((_a = session === null || session === void 0 ? void 0 : session.chatbot) === null || _a === void 0 ? void 0 : _a.hasUserInteracted);
576
+ };
577
+ const setUserInteracted = (destination) => {
578
+ const session = getSessionData(destination);
579
+ saveSessionData(destination, {
580
+ ...session,
581
+ chatbot: { ...session === null || session === void 0 ? void 0 : session.chatbot, hasUserInteracted: true },
582
+ });
583
+ };
584
+ const getProductActions = (destination, sessionId) => {
585
+ var _a;
586
+ const local = getLocalStorageData(destination);
587
+ if (!local || !sessionId) {
588
+ logger.error('No local storage data or session id');
589
+ return null;
590
+ }
591
+ return (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products;
592
+ };
593
+ const setProductAction = (destination, sessionId, productId, action, value) => {
594
+ var _a, _b, _c;
595
+ const local = getLocalStorageData(destination);
596
+ if (!local || !sessionId) {
597
+ logger.error('No local storage data or session id');
598
+ return;
599
+ }
600
+ const productTags = (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products) === null || _b === void 0 ? void 0 : _b[productId];
601
+ local[sessionId] = {
602
+ ...local[sessionId],
603
+ products: {
604
+ ...(_c = local[sessionId]) === null || _c === void 0 ? void 0 : _c.products,
605
+ [productId]: {
606
+ ...productTags,
607
+ [action]: value,
608
+ },
609
+ },
610
+ };
611
+ // Clear other sessions
612
+ const updatedLocal = { [sessionId]: local[sessionId] };
613
+ saveLocalStorageData(destination, updatedLocal);
614
+ };
615
+ const getShopGPTLoaded = (destination, sessionId) => {
616
+ var _a, _b;
617
+ const local = getLocalStorageData(destination);
618
+ if (!local || !sessionId) {
619
+ logger.error('No local storage data or session id');
620
+ return false;
621
+ }
622
+ return (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.isShopGPTLoaded) !== null && _b !== void 0 ? _b : false;
623
+ };
624
+ const setShopGPTLoaded = (destination, sessionId, value) => {
625
+ const local = getLocalStorageData(destination);
626
+ if (!local || !sessionId) {
627
+ logger.error('No local storage data or session id');
628
+ return;
629
+ }
630
+ local[sessionId] = {
631
+ ...local[sessionId],
632
+ isShopGPTLoaded: value,
633
+ };
634
+ // Clear other sessions
635
+ const updatedLocal = { [sessionId]: local[sessionId] };
636
+ saveLocalStorageData(destination, updatedLocal);
637
+ };
638
+
639
+ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, storeAPI, sessionId, }) => {
452
640
  if (!baseURL) {
453
641
  throw new Error(`baseURL missing`);
454
642
  }
@@ -550,13 +738,14 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
550
738
  throw new Error(`Failed to delete all chat threads - ${response.status}: ${await response.text()}`);
551
739
  }
552
740
  };
553
- const saveFeedback = async (messageId, feedback) => {
741
+ const saveFeedback = async (messageId, threadId, feedback) => {
554
742
  const response = await fetchImpl(getURL('/feedback'), {
555
743
  method: 'POST',
556
744
  headers: getHeaders(),
557
745
  credentials: 'include',
558
746
  body: JSON.stringify({
559
747
  messageId,
748
+ threadId,
560
749
  feedback,
561
750
  }),
562
751
  });
@@ -576,6 +765,28 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
576
765
  const data = (await response.json());
577
766
  return data.customPrompts;
578
767
  };
768
+ const sendEvent = async (action, currency, actionData) => {
769
+ var _a;
770
+ const storageData = (_a = getProductActions(baseURL, sessionId)) !== null && _a !== void 0 ? _a : {};
771
+ const response = await fetchImpl(getURL('/user/event'), {
772
+ method: 'POST',
773
+ headers: getHeaders(true),
774
+ body: JSON.stringify({
775
+ action,
776
+ currency,
777
+ actionData,
778
+ storageData: {
779
+ session: storageData,
780
+ preview: hasPreviewKey(),
781
+ isShopGPTLoaded: true, // The fact that sendEvent was called means that the ShopGPT is loaded
782
+ },
783
+ }),
784
+ credentials: 'include',
785
+ });
786
+ if (!response.ok) {
787
+ throw new Error(`Error while recording user event - ${response.status}: ${response.statusText}\n\n${await response.text()}`);
788
+ }
789
+ };
579
790
  return {
580
791
  processQuery,
581
792
  fetchChatHistory,
@@ -585,22 +796,14 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
585
796
  deleteAllThreads,
586
797
  saveFeedback,
587
798
  fetchCustomPrompts,
799
+ sendEvent,
588
800
  };
589
801
  };
590
802
 
591
803
  // eslint-disable-next-line @nx/enforce-module-boundaries
592
804
  const error = (message) => console.error(message);
593
- const hasPreviewKey = () => {
594
- var _a;
595
- try {
596
- return ((_a = sessionStorage.getItem(previewKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
597
- }
598
- catch {
599
- return false;
600
- }
601
- };
602
805
  const init = (params) => {
603
- var _a, _b, _c;
806
+ var _a, _b, _c, _d, _e, _f;
604
807
  if (typeof window == 'undefined' || typeof document == 'undefined') {
605
808
  // if loaded in non-browser SDKs, return early
606
809
  return;
@@ -618,7 +821,8 @@ const init = (params) => {
618
821
  // exit if not in top window
619
822
  return;
620
823
  }
621
- const { enabled, mode, devMode, merchantUrl, profiles, productHandles, targetPath, view, brandName, quickPrompts, merchantImage, latestThreadLoad, botIconUrl, css, } = (_c = params.manifest.variables) !== null && _c !== void 0 ? _c : {};
824
+ 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 : {};
825
+ setShopGPTLoaded(params.baseUrl, (_d = params.session) === null || _d === void 0 ? void 0 : _d.sessionId, !loadUiManually);
622
826
  const experiment = createExperiment({
623
827
  name: getExperimentName(mode),
624
828
  userId: params.userId,
@@ -638,8 +842,10 @@ const init = (params) => {
638
842
  baseURL: params.baseUrl,
639
843
  storeAPI,
640
844
  userId: params.userId,
845
+ sessionId: (_e = params.session) === null || _e === void 0 ? void 0 : _e.sessionId,
641
846
  });
642
847
  uiImplementation.init({
848
+ destination: params.baseUrl,
643
849
  storeAPI,
644
850
  shopGPTAPI,
645
851
  devMode,
@@ -654,14 +860,48 @@ const init = (params) => {
654
860
  latestThreadLoad: latestThreadLoad !== null && latestThreadLoad !== void 0 ? latestThreadLoad : DEFAULT_MAX_THREAD_AGE,
655
861
  botIconUrl,
656
862
  css,
863
+ nudge,
864
+ sessionId: (_f = params.session) === null || _f === void 0 ? void 0 : _f.sessionId,
657
865
  });
866
+ if (!loadUiManually) {
867
+ uiImplementation.loadUI();
868
+ }
658
869
  }
659
870
  };
660
871
 
872
+ const getClickedProductsInContents = (destination, sessionId, data) => {
873
+ const storedData = getProductActions(destination, sessionId);
874
+ const contents = data['contents'];
875
+ if (!contents || !Array.isArray(contents) || !storedData) {
876
+ return;
877
+ }
878
+ return contents.flatMap((content) => { var _a; return ((_a = storedData[content.id]) === null || _a === void 0 ? void 0 : _a.clicked) ? [content.id] : []; });
879
+ };
880
+ const tag = ({ eventName, destination, data, sessionId, }) => {
881
+ var _a;
882
+ const clickedProducts = getClickedProductsInContents(destination, sessionId, data);
883
+ if (eventName === 'AddToCart') {
884
+ clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
885
+ setProductAction(destination, sessionId, id, 'addToCart', true);
886
+ });
887
+ }
888
+ else if (eventName == 'RemoveFromCart') {
889
+ clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
890
+ setProductAction(destination, sessionId, id, 'addToCart', false);
891
+ });
892
+ }
893
+ return {
894
+ session: getProductActions(destination, sessionId),
895
+ preview: hasPreviewKey(),
896
+ isShopGPTLoaded: (_a = getShopGPTLoaded(destination, sessionId)) !== null && _a !== void 0 ? _a : false,
897
+ };
898
+ };
899
+
661
900
  // eslint-disable-next-line @nx/enforce-module-boundaries
662
901
  const data = {
663
902
  name: packageName,
664
903
  init,
904
+ tag,
665
905
  };
666
906
  try {
667
907
  if (typeof window !== 'undefined') {
@@ -874,6 +1114,29 @@ const shopGPTStyles = i$4 `
874
1114
  line-height: 150%;
875
1115
  }
876
1116
 
1117
+ .nudge {
1118
+ position: absolute;
1119
+ color: var(--shopgpt-secondary);
1120
+ padding: 12px 16px;
1121
+ font-size: 16px;
1122
+ line-height: 21px;
1123
+ background: var(--shopgpt-warning);
1124
+ border-radius: 5px;
1125
+ box-shadow: 0px 4px 6px -1px rgba(0, 0, 0, 0.1),
1126
+ 0px 2px 4px -1px rgba(0, 0, 0, 0.06);
1127
+ font-weight: 400;
1128
+ line-height: 150%;
1129
+ right: calc(100% + 10px);
1130
+ top: 0%;
1131
+ transform: translateY(-50%);
1132
+ animation: slideIn 0.5s ease-out forwards;
1133
+ opacity: 0;
1134
+ cursor: pointer;
1135
+ width: 260px;
1136
+ white-space: normal;
1137
+ word-wrap: break-word;
1138
+ }
1139
+
877
1140
  &:hover {
878
1141
  .chatbot-hover-text {
879
1142
  opacity: 1;
@@ -881,6 +1144,17 @@ const shopGPTStyles = i$4 `
881
1144
  }
882
1145
  }
883
1146
 
1147
+ @keyframes slideIn {
1148
+ from {
1149
+ transform: translate(20px, -50%);
1150
+ opacity: 0;
1151
+ }
1152
+ to {
1153
+ transform: translate(0, -50%);
1154
+ opacity: 1;
1155
+ }
1156
+ }
1157
+
884
1158
  .mobile-version {
885
1159
  display: none;
886
1160
 
@@ -1631,19 +1905,38 @@ class ProductItem extends r$2 {
1631
1905
  <p class="product-variation-details">${option.name}: ${option.value}</p>
1632
1906
  `);
1633
1907
  }
1908
+ productClicked(productId, price, url) {
1909
+ if (productId) {
1910
+ this.dispatchEvent(new CustomEvent('product-clicked', {
1911
+ detail: {
1912
+ productId,
1913
+ value: price ? parseFloat(price) : undefined,
1914
+ },
1915
+ composed: true,
1916
+ bubbles: true,
1917
+ }));
1918
+ }
1919
+ this.redirect(url);
1920
+ }
1634
1921
  render() {
1635
1922
  return x `
1636
1923
  <div class="product">
1637
1924
  <img
1638
1925
  src=${this.product.image.url}
1639
1926
  alt=${this.product.image.alt}
1640
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1927
+ @click=${() => {
1928
+ var _a;
1929
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1930
+ }}
1641
1931
  />
1642
1932
  <div class="content">
1643
1933
  <p
1644
1934
  class="product-name"
1645
1935
  title=${this.product.title}
1646
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1936
+ @click=${() => {
1937
+ var _a;
1938
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1939
+ }}
1647
1940
  >
1648
1941
  ${this.product.title}
1649
1942
  </p>
@@ -1654,7 +1947,10 @@ class ProductItem extends r$2 {
1654
1947
  </div>
1655
1948
  <button
1656
1949
  class="btn-view-product"
1657
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1950
+ @click=${() => {
1951
+ var _a;
1952
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1953
+ }}
1658
1954
  >
1659
1955
  View Product
1660
1956
  </button>
@@ -2460,6 +2756,22 @@ const chatSectionStyles = i$4 `
2460
2756
  const capitalizeEachWord = (str) => {
2461
2757
  return str === null || str === void 0 ? void 0 : str.replace(/^\w/, (char) => char.toUpperCase());
2462
2758
  };
2759
+ const adParams = new Set([
2760
+ 'fbclid',
2761
+ 'gclid',
2762
+ 'sccid',
2763
+ 'ttclid',
2764
+ 'epik',
2765
+ 'li_fat_id',
2766
+ 'twclid',
2767
+ 'rdt_cid',
2768
+ 'aleid',
2769
+ 'tabclid',
2770
+ 'msclkid',
2771
+ 'dclid',
2772
+ 'wbraid',
2773
+ ]);
2774
+ const isFromAd = (params) => [...params.keys()].some((key) => adParams.has(key.toLowerCase()));
2463
2775
 
2464
2776
  const plusBtn = b `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
2465
2777
  <path d="M12.75 11.25V6H11.25V11.25H6V12.75H11.25V18H12.75V12.75H18V11.25H12.75Z" fill="white"/>
@@ -3516,6 +3828,7 @@ class FeedbackDialog extends r$2 {
3516
3828
  this.dispatchEvent(new CustomEvent('submit-feedback', {
3517
3829
  detail: {
3518
3830
  messageId: this.messageId,
3831
+ threadId: this.threadId,
3519
3832
  feedback,
3520
3833
  },
3521
3834
  composed: true,
@@ -3587,6 +3900,10 @@ __decorate([
3587
3900
  n({ type: String }),
3588
3901
  __metadata("design:type", Object)
3589
3902
  ], FeedbackDialog.prototype, "messageId", void 0);
3903
+ __decorate([
3904
+ n({ type: String }),
3905
+ __metadata("design:type", Object)
3906
+ ], FeedbackDialog.prototype, "threadId", void 0);
3590
3907
  __decorate([
3591
3908
  n({ type: String }),
3592
3909
  __metadata("design:type", Object)
@@ -3619,19 +3936,26 @@ class ChatSection extends r$2 {
3619
3936
  behavior: 'smooth',
3620
3937
  });
3621
3938
  }
3622
- async processMessage(e, message) {
3939
+ async processMessage(e, message, isPrompt = false) {
3623
3940
  this.scrollToBottom();
3624
3941
  if (!this.thread) {
3625
3942
  await this.createChatThread({ title: '' }, false);
3626
3943
  }
3627
- await this.sendMessageToServer(e, message);
3944
+ await this.sendMessageToServer(e, message, isPrompt);
3945
+ }
3946
+ sendEvent(action, actionData) {
3947
+ this.dispatchEvent(new CustomEvent('send-event', {
3948
+ detail: { action, actionData },
3949
+ composed: true,
3950
+ bubbles: true,
3951
+ }));
3628
3952
  }
3629
3953
  async onSubmit(e) {
3630
3954
  var _a;
3631
3955
  e.preventDefault();
3632
3956
  const message = (_a = this.userQuery) === null || _a === void 0 ? void 0 : _a.trim();
3633
3957
  this.userQuery = '';
3634
- await this.processMessage(e, message);
3958
+ await this.processMessage(e, message, false);
3635
3959
  }
3636
3960
  handleThreadDelete() {
3637
3961
  if (this.deleteAllThreads) {
@@ -3653,13 +3977,19 @@ class ChatSection extends r$2 {
3653
3977
  this.deleteThreadId = '';
3654
3978
  }
3655
3979
  handleFeedback(rating, messageId, comment) {
3980
+ var _a, _b;
3656
3981
  if (rating === 'bad') {
3657
- this.feedbackDetails = { messageId, comment };
3982
+ this.feedbackDetails = {
3983
+ messageId,
3984
+ threadId: ((_a = this.thread) === null || _a === void 0 ? void 0 : _a.threadId) || '',
3985
+ comment,
3986
+ };
3658
3987
  return;
3659
3988
  }
3660
3989
  this.dispatchEvent(new CustomEvent('submit-feedback', {
3661
3990
  detail: {
3662
3991
  messageId: messageId,
3992
+ threadId: (_b = this.thread) === null || _b === void 0 ? void 0 : _b.threadId,
3663
3993
  feedback: {
3664
3994
  rating,
3665
3995
  comment: null,
@@ -3806,7 +4136,10 @@ class ChatSection extends r$2 {
3806
4136
  return x `
3807
4137
  <div
3808
4138
  class="prompt"
3809
- @click=${(e) => this.processMessage(e, prompt)}
4139
+ @click=${(e) => {
4140
+ this.processMessage(e, prompt, true);
4141
+ this.sendEvent('promptClicked');
4142
+ }}
3810
4143
  >
3811
4144
  ${prompt}
3812
4145
  </div>
@@ -3814,7 +4147,13 @@ class ChatSection extends r$2 {
3814
4147
  })}
3815
4148
  ${o$1(customPrompts, ({ prompt, link }) => {
3816
4149
  return x `
3817
- <a class="prompt" href=${link} target="_blank" rel="noopener">
4150
+ <a
4151
+ class="prompt"
4152
+ href=${link}
4153
+ target="_blank"
4154
+ rel="noopener"
4155
+ @click=${() => this.sendEvent('promptClicked')}
4156
+ >
3818
4157
  ${prompt}
3819
4158
  </a>
3820
4159
  `;
@@ -4090,7 +4429,10 @@ class ChatSection extends r$2 {
4090
4429
  </form>
4091
4430
  ${this.viewType === 'modal'
4092
4431
  ? x ` <footer>
4093
- Powered by <a href="https://blotout.io">Blotout</a>
4432
+ Powered by
4433
+ <a target="_blank" href="https://shopgpt.edgeagents.ai"
4434
+ >Blotout</a
4435
+ >
4094
4436
  </footer>`
4095
4437
  : E}
4096
4438
  </div>
@@ -4130,6 +4472,7 @@ class ChatSection extends r$2 {
4130
4472
  ? x `
4131
4473
  <feedback-dialog
4132
4474
  .messageId=${this.feedbackDetails.messageId}
4475
+ .threadId=${this.feedbackDetails.threadId}
4133
4476
  .comment=${this.feedbackDetails.comment}
4134
4477
  @submit-feedback=${() => {
4135
4478
  this.feedbackDetails = undefined;
@@ -4307,12 +4650,15 @@ const parseMessage = (message, parseDataAsJSON) => {
4307
4650
  return result;
4308
4651
  };
4309
4652
 
4653
+ 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';
4654
+
4310
4655
  const DIALOG_DELAY = 1000;
4311
4656
  const normalizePath = (path) => path.replace(/\/$/, '');
4312
4657
  class ShopGPT extends r$2 {
4313
4658
  constructor() {
4314
4659
  super(...arguments);
4315
4660
  this.isStylesheetInjected = false;
4661
+ this.isPreviousMessagePrompt = false;
4316
4662
  this.latestThreadLoad = DEFAULT_MAX_THREAD_AGE;
4317
4663
  this.modalState = 'close';
4318
4664
  this.isLoadingHistory = false;
@@ -4324,6 +4670,8 @@ class ShopGPT extends r$2 {
4324
4670
  this.messages = [];
4325
4671
  this.chatThreads = new Map();
4326
4672
  this.customPrompts = [];
4673
+ this.hasUserInteracted = false;
4674
+ this.showNudge = false;
4327
4675
  this.loadData = async () => {
4328
4676
  if (!this.shopGPTAPI) {
4329
4677
  return;
@@ -4364,17 +4712,23 @@ class ShopGPT extends r$2 {
4364
4712
  }
4365
4713
  }
4366
4714
  this.init();
4715
+ this.startNudgeTimer();
4367
4716
  }
4368
4717
  disconnectedCallback() {
4369
4718
  window.removeEventListener('edgetag-initialized', this.loadData);
4370
4719
  window.removeEventListener('popstate', this.onPopState);
4720
+ if (this.nudgeTimer) {
4721
+ window.clearTimeout(this.nudgeTimer);
4722
+ }
4371
4723
  super.disconnectedCallback();
4372
4724
  }
4373
4725
  init() {
4374
4726
  window.addEventListener('edgetag-initialized', this.loadData);
4375
4727
  window.addEventListener('popstate', this.onPopState);
4728
+ this.shopGPTAPI.sendEvent('shopGPTInitialized', this.getSiteCurrency().currency);
4376
4729
  if (!this.view || this.view === 'overlay') {
4377
- delay(DIALOG_DELAY).then(() => {
4730
+ delay(DIALOG_DELAY)
4731
+ .then(() => {
4378
4732
  var _a;
4379
4733
  if (document.hidden) {
4380
4734
  document.addEventListener('visibilitychange', () => { var _a; return (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal(); }, {
@@ -4384,7 +4738,8 @@ class ShopGPT extends r$2 {
4384
4738
  else {
4385
4739
  (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal();
4386
4740
  }
4387
- });
4741
+ })
4742
+ .catch(logger.error);
4388
4743
  }
4389
4744
  }
4390
4745
  setChatTitle(threadId, title) {
@@ -4412,8 +4767,8 @@ class ShopGPT extends r$2 {
4412
4767
  if (!thread) {
4413
4768
  return;
4414
4769
  }
4415
- const searchParam = new URLSearchParams(window.location.search);
4416
- const fromAd = searchParam.get('shopGPT') === '1';
4770
+ const searchParams = new URLSearchParams(window.location.search);
4771
+ const fromAd = isFromAd(searchParams) || searchParams.get('shopGPT') === '1';
4417
4772
  const productHandle = this.devMode
4418
4773
  ? (_a = thread === null || thread === void 0 ? void 0 : thread.devContext) === null || _a === void 0 ? void 0 : _a.productHandle
4419
4774
  : fromAd
@@ -4650,7 +5005,7 @@ class ShopGPT extends r$2 {
4650
5005
  }
4651
5006
  });
4652
5007
  }
4653
- async sendMessageToServer(e, message) {
5008
+ async sendMessageToServer(e, message, isPrompt = false) {
4654
5009
  e.preventDefault();
4655
5010
  e.stopPropagation();
4656
5011
  if (!message || this.isTyping || this.isLoadingHistory) {
@@ -4658,6 +5013,10 @@ class ShopGPT extends r$2 {
4658
5013
  }
4659
5014
  this.isFailed = false;
4660
5015
  try {
5016
+ this.isPreviousMessagePrompt = isPrompt;
5017
+ if (!isPrompt) {
5018
+ this.shopGPTAPI.sendEvent('queryInteractions', this.getSiteCurrency().currency);
5019
+ }
4661
5020
  this.messages = [{ sender: 'user', message }, ...this.messages];
4662
5021
  this.isTyping = true;
4663
5022
  const response = await this.submitQuery(message);
@@ -4672,7 +5031,7 @@ class ShopGPT extends r$2 {
4672
5031
  submitFeedback(e) {
4673
5032
  e.stopPropagation();
4674
5033
  this.shopGPTAPI
4675
- .saveFeedback(e.detail.messageId, e.detail.feedback)
5034
+ .saveFeedback(e.detail.messageId, e.detail.threadId, e.detail.feedback)
4676
5035
  .then(() => {
4677
5036
  const messages = this.messages;
4678
5037
  const messageIndex = messages.findIndex(({ messageId }) => messageId === e.detail.messageId);
@@ -4681,17 +5040,25 @@ class ShopGPT extends r$2 {
4681
5040
  feedback: e.detail.feedback,
4682
5041
  };
4683
5042
  this.messages = [...messages];
5043
+ })
5044
+ .catch(logger.error);
5045
+ }
5046
+ sendEvent(e) {
5047
+ e.stopPropagation();
5048
+ this.shopGPTAPI.sendEvent(e.detail.action, this.getSiteCurrency().currency, e.detail.actionData);
5049
+ }
5050
+ productClicked(e) {
5051
+ e.stopPropagation();
5052
+ setProductAction(this.destination, this.sessionId, e.detail.productId, 'clicked', true);
5053
+ this.shopGPTAPI.sendEvent('productRecommendationClicked', this.getSiteCurrency().currency, {
5054
+ productId: e.detail.productId,
5055
+ value: e.detail.value,
5056
+ isPrompt: this.isPreviousMessagePrompt,
4684
5057
  });
4685
5058
  }
4686
5059
  getSiteCurrency() {
4687
5060
  return this.storeAPI.getSiteCurrency();
4688
5061
  }
4689
- render() {
4690
- if (this.view === 'modal') {
4691
- return this.modalMode();
4692
- }
4693
- return this.overlayMode();
4694
- }
4695
5062
  overlayMode() {
4696
5063
  const thread = this.chatThreads.get(this.selectedThreadId);
4697
5064
  return x `
@@ -4700,6 +5067,8 @@ class ShopGPT extends r$2 {
4700
5067
  @delete-thread=${this.handleThreadDelete}
4701
5068
  @delete-all-threads=${this.handleAllThreadsDelete}
4702
5069
  @submit-feedback=${this.submitFeedback}
5070
+ @send-event=${this.sendEvent}
5071
+ @product-clicked=${this.productClicked}
4703
5072
  >
4704
5073
  <div class="mobile-version">
4705
5074
  Please switch to the desktop version for the best experience.
@@ -4747,6 +5116,7 @@ class ShopGPT extends r$2 {
4747
5116
  `;
4748
5117
  }
4749
5118
  modalMode() {
5119
+ var _a;
4750
5120
  const thread = this.chatThreads.get(this.selectedThreadId);
4751
5121
  const closeModal = () => {
4752
5122
  this.modalState = 'close';
@@ -4756,12 +5126,28 @@ class ShopGPT extends r$2 {
4756
5126
  <button
4757
5127
  @click=${(e) => {
4758
5128
  e.preventDefault();
5129
+ this.shopGPTAPI.sendEvent('chatbotOpened', this.getSiteCurrency().currency);
4759
5130
  this.modalState = 'open';
5131
+ this.handleUserInteraction();
4760
5132
  }}
4761
5133
  >
4762
5134
  ${chatIcon}
4763
5135
  </button>
4764
- <div class="chatbot-hover-text">What are you looking for today?</div>
5136
+ ${((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show) && this.showNudge
5137
+ ? x `<div
5138
+ class="nudge"
5139
+ @click=${(e) => {
5140
+ e.preventDefault();
5141
+ this.modalState = 'open';
5142
+ this.handleUserInteraction();
5143
+ }}
5144
+ >
5145
+ Hi there! I'm an AI Agent to help you find the perfect product.
5146
+ What are you looking for today?
5147
+ </div>`
5148
+ : x `<div class="chatbot-hover-text">
5149
+ What are you looking for today?
5150
+ </div>`}
4765
5151
  </div>`;
4766
5152
  }
4767
5153
  return x `
@@ -4770,6 +5156,9 @@ class ShopGPT extends r$2 {
4770
5156
  @delete-thread=${this.handleThreadDelete}
4771
5157
  @delete-all-threads=${this.handleAllThreadsDelete}
4772
5158
  @submit-feedback=${this.submitFeedback}
5159
+ @click=${this.handleUserInteraction}
5160
+ @send-event=${this.sendEvent}
5161
+ @product-clicked=${this.productClicked}
4773
5162
  >
4774
5163
  <chat-section
4775
5164
  .prompts=${this.quickPrompts}
@@ -4798,6 +5187,48 @@ class ShopGPT extends r$2 {
4798
5187
  </div>
4799
5188
  `;
4800
5189
  }
5190
+ startNudgeTimer() {
5191
+ var _a, _b;
5192
+ if (this.view !== 'modal' || !((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show)) {
5193
+ return;
5194
+ }
5195
+ this.hasUserInteracted = isUserInteracted(this.destination);
5196
+ if (this.hasUserInteracted || this.nudgeTimer) {
5197
+ return;
5198
+ }
5199
+ this.nudgeTimer = window.setTimeout(() => {
5200
+ if (!this.hasUserInteracted) {
5201
+ this.playNudgeSound();
5202
+ this.showNudge = true;
5203
+ }
5204
+ }, (((_b = this.nudge) === null || _b === void 0 ? void 0 : _b.timeout) || DEFAULT_NUDGE_TIMEOUT) * 1000);
5205
+ }
5206
+ playNudgeSound() {
5207
+ var _a;
5208
+ if (!((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.sound) || !navigator.userActivation.hasBeenActive) {
5209
+ return;
5210
+ }
5211
+ const audio = new Audio(soothingWaterDropSound);
5212
+ audio
5213
+ .play()
5214
+ .catch((error) => logger.error('Error playing nudge sound', error));
5215
+ }
5216
+ handleUserInteraction() {
5217
+ if (!this.hasUserInteracted) {
5218
+ this.hasUserInteracted = true;
5219
+ this.showNudge = false;
5220
+ if (this.nudgeTimer) {
5221
+ window.clearTimeout(this.nudgeTimer);
5222
+ }
5223
+ setUserInteracted(this.destination);
5224
+ }
5225
+ }
5226
+ render() {
5227
+ if (this.view === 'modal') {
5228
+ return this.modalMode();
5229
+ }
5230
+ return this.overlayMode();
5231
+ }
4801
5232
  }
4802
5233
  ShopGPT.styles = [shopGPTStyles];
4803
5234
  __decorate([
@@ -4848,6 +5279,14 @@ __decorate([
4848
5279
  n({ type: Array }),
4849
5280
  __metadata("design:type", Array)
4850
5281
  ], ShopGPT.prototype, "customPrompts", void 0);
5282
+ __decorate([
5283
+ r(),
5284
+ __metadata("design:type", Object)
5285
+ ], ShopGPT.prototype, "hasUserInteracted", void 0);
5286
+ __decorate([
5287
+ r(),
5288
+ __metadata("design:type", Object)
5289
+ ], ShopGPT.prototype, "showNudge", void 0);
4851
5290
  if (!customElements.get('shop-gpt')) {
4852
5291
  customElements.define('shop-gpt', ShopGPT);
4853
5292
  }
@@ -4863,6 +5302,7 @@ if (typeof window != 'undefined' && typeof document != 'undefined') {
4863
5302
  return;
4864
5303
  }
4865
5304
  shopGPT = document.createElement('shop-gpt');
5305
+ shopGPT.destination = params.destination;
4866
5306
  shopGPT.storeAPI = params.storeAPI;
4867
5307
  shopGPT.shopGPTAPI = params.shopGPTAPI;
4868
5308
  shopGPT.devMode = params.devMode;
@@ -4877,12 +5317,26 @@ if (typeof window != 'undefined' && typeof document != 'undefined') {
4877
5317
  shopGPT.latestThreadLoad = params.latestThreadLoad;
4878
5318
  shopGPT.botIconUrl = params.botIconUrl;
4879
5319
  shopGPT.css = params.css;
5320
+ shopGPT.nudge = params.nudge;
5321
+ shopGPT.sessionId = params.sessionId;
5322
+ },
5323
+ loadUI() {
5324
+ if (!shopGPT) {
5325
+ logger.error('ShopGPT component not found!');
5326
+ return;
5327
+ }
5328
+ if (shopGPT.parentNode) {
5329
+ logger.log('ShopGPT component added already!');
5330
+ return;
5331
+ }
4880
5332
  document.body.append(shopGPT);
5333
+ setShopGPTLoaded(shopGPT.destination, shopGPT.sessionId, true);
4881
5334
  },
4882
5335
  destroy() {
4883
5336
  if (!shopGPT) {
4884
5337
  return;
4885
5338
  }
5339
+ setShopGPTLoaded(shopGPT.destination, shopGPT.sessionId, false);
4886
5340
  shopGPT.remove();
4887
5341
  shopGPT = undefined;
4888
5342
  delete window[registryKey];