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