@blotoutio/providers-shop-gpt-sdk 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/index.cjs.js +539 -36
  2. package/index.js +539 -36
  3. package/index.mjs +539 -36
  4. package/package.json +1 -1
package/index.js CHANGED
@@ -409,10 +409,65 @@ 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
+
435
+ const getCookieValue = (key) => {
436
+ var _a;
437
+ try {
438
+ if (!document || !document.cookie) {
439
+ return '';
440
+ }
441
+ const cookies = parseCookies(document.cookie);
442
+ return (_a = cookies[key]) !== null && _a !== void 0 ? _a : '';
443
+ }
444
+ catch {
445
+ return '';
446
+ }
447
+ };
448
+ const parseCookies = (cookie) => {
449
+ return Object.fromEntries(cookie
450
+ .split(/;\s+/)
451
+ .map((r) => r.split('=').map((str) => str.trim()))
452
+ .map(([cookieKey, ...cookieValues]) => {
453
+ const cookieValue = cookieValues.join('=');
454
+ if (!cookieKey) {
455
+ return [];
456
+ }
457
+ let decodedValue = '';
458
+ if (cookieValue) {
459
+ try {
460
+ decodedValue = decodeURIComponent(cookieValue);
461
+ }
462
+ catch (e) {
463
+ console.log(`Unable to decode cookie ${cookieKey}: ${e}`);
464
+ decodedValue = cookieValue;
465
+ }
466
+ }
467
+ return [cookieKey, decodedValue];
468
+ }));
469
+ };
470
+
416
471
  const canLog = () => {
417
472
  try {
418
473
  return localStorage.getItem('edgeTagDebug') === '1';
@@ -445,12 +500,188 @@ var ProvidersShopGptSdk = (function () {
445
500
  },
446
501
  };
447
502
 
503
+ const initKey = `${keyPrefix}StoreMultiple`;
504
+ const saveData = (destination, persistType, value, key = initKey) => {
505
+ if (persistType === 'session') {
506
+ const data = getSession(key);
507
+ data[destination] = value;
508
+ saveSession(data, key);
509
+ return;
510
+ }
511
+ const data = getLocal(key);
512
+ data[destination] = value;
513
+ saveLocal(data, key);
514
+ };
515
+ const getData = (destination, persistType, key = initKey) => {
516
+ let data;
517
+ if (persistType === 'session') {
518
+ data = getSession(key);
519
+ }
520
+ else {
521
+ data = getLocal(key);
522
+ }
523
+ return (data === null || data === void 0 ? void 0 : data[destination]) || {};
524
+ };
525
+ const saveLocal = (value, key) => {
526
+ try {
527
+ if (!localStorage) {
528
+ return;
529
+ }
530
+ localStorage.setItem(key, JSON.stringify(value));
531
+ }
532
+ catch {
533
+ logger.log('Local storage not supported.');
534
+ }
535
+ };
536
+ const getLocal = (key) => {
537
+ try {
538
+ if (!localStorage) {
539
+ return {};
540
+ }
541
+ const data = localStorage.getItem(key);
542
+ if (!data) {
543
+ return {};
544
+ }
545
+ return JSON.parse(data) || {};
546
+ }
547
+ catch {
548
+ return {};
549
+ }
550
+ };
551
+ const saveSession = (value, key) => {
552
+ try {
553
+ if (!sessionStorage) {
554
+ return;
555
+ }
556
+ sessionStorage.setItem(key, JSON.stringify(value));
557
+ }
558
+ catch {
559
+ logger.log('Session storage not supported.');
560
+ }
561
+ };
562
+ const getSession = (key) => {
563
+ try {
564
+ if (!sessionStorage) {
565
+ return {};
566
+ }
567
+ const data = sessionStorage.getItem(key);
568
+ if (!data) {
569
+ return {};
570
+ }
571
+ return JSON.parse(data) || {};
572
+ }
573
+ catch {
574
+ return {};
575
+ }
576
+ };
577
+
448
578
  var _a$1;
449
579
  const registryKey = Symbol.for('shop-gpt');
450
580
  if (typeof window != 'undefined') {
451
581
  (_a$1 = window[registryKey]) !== null && _a$1 !== void 0 ? _a$1 : (window[registryKey] = {});
452
582
  }
453
583
 
584
+ const SHOP_GPT_SESSION_KEY = 'shopGPTSession';
585
+ const SHOP_GPT_LOCAL_STORAGE_KEY = 'shopGPTLocalStorage';
586
+ const getSessionData = (destination) => {
587
+ const session = getData(destination, 'session', SHOP_GPT_SESSION_KEY);
588
+ return session;
589
+ };
590
+ const saveSessionData = (destination, data) => {
591
+ saveData(destination, 'session', data, SHOP_GPT_SESSION_KEY);
592
+ };
593
+ const getLocalStorageData = (destination) => {
594
+ const local = getData(destination, 'local', SHOP_GPT_LOCAL_STORAGE_KEY);
595
+ return local;
596
+ };
597
+ const saveLocalStorageData = (destination, data) => {
598
+ saveData(destination, 'local', data, SHOP_GPT_LOCAL_STORAGE_KEY);
599
+ };
600
+ const getSessionId = () => {
601
+ return getCookieValue('tag_session');
602
+ };
603
+
604
+ // eslint-disable-next-line @nx/enforce-module-boundaries
605
+ const hasPreviewKey = () => {
606
+ var _a;
607
+ try {
608
+ return ((_a = sessionStorage.getItem(previewKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
609
+ }
610
+ catch {
611
+ return false;
612
+ }
613
+ };
614
+ const isUserInteracted = (destination) => {
615
+ var _a;
616
+ const session = getSessionData(destination);
617
+ return !!((_a = session === null || session === void 0 ? void 0 : session.chatbot) === null || _a === void 0 ? void 0 : _a.hasUserInteracted);
618
+ };
619
+ const setUserInteracted = (destination) => {
620
+ const session = getSessionData(destination);
621
+ saveSessionData(destination, {
622
+ ...session,
623
+ chatbot: { ...session === null || session === void 0 ? void 0 : session.chatbot, hasUserInteracted: true },
624
+ });
625
+ };
626
+ const getProductActions = (destination) => {
627
+ var _a;
628
+ const local = getLocalStorageData(destination);
629
+ const sessionId = getSessionId();
630
+ if (!local || !sessionId) {
631
+ logger.error('No local storage data or session id');
632
+ return null;
633
+ }
634
+ return (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products;
635
+ };
636
+ const setProductAction = (destination, productId, action, value) => {
637
+ var _a, _b, _c;
638
+ const local = getLocalStorageData(destination);
639
+ const sessionId = getSessionId();
640
+ if (!local || !sessionId) {
641
+ logger.error('No local storage data or session id');
642
+ return;
643
+ }
644
+ const productTags = (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products) === null || _b === void 0 ? void 0 : _b[productId];
645
+ local[sessionId] = {
646
+ ...local[sessionId],
647
+ products: {
648
+ ...(_c = local[sessionId]) === null || _c === void 0 ? void 0 : _c.products,
649
+ [productId]: {
650
+ ...productTags,
651
+ [action]: value,
652
+ },
653
+ },
654
+ };
655
+ // Clear other sessions
656
+ const updatedLocal = { [sessionId]: local[sessionId] };
657
+ saveLocalStorageData(destination, updatedLocal);
658
+ };
659
+ const getShopGPTLoaded = (destination) => {
660
+ var _a, _b;
661
+ const local = getLocalStorageData(destination);
662
+ const sessionId = getSessionId();
663
+ if (!local || !sessionId) {
664
+ logger.error('No local storage data or session id');
665
+ return false;
666
+ }
667
+ return (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.isShopGPTLoaded) !== null && _b !== void 0 ? _b : false;
668
+ };
669
+ const setShopGPTLoaded = (destination, value) => {
670
+ const local = getLocalStorageData(destination);
671
+ const sessionId = getSessionId();
672
+ if (!local || !sessionId) {
673
+ logger.error('No local storage data or session id');
674
+ return;
675
+ }
676
+ local[sessionId] = {
677
+ ...local[sessionId],
678
+ isShopGPTLoaded: value,
679
+ };
680
+ // Clear other sessions
681
+ const updatedLocal = { [sessionId]: local[sessionId] };
682
+ saveLocalStorageData(destination, updatedLocal);
683
+ };
684
+
454
685
  const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, storeAPI, }) => {
455
686
  if (!baseURL) {
456
687
  throw new Error(`baseURL missing`);
@@ -553,13 +784,14 @@ var ProvidersShopGptSdk = (function () {
553
784
  throw new Error(`Failed to delete all chat threads - ${response.status}: ${await response.text()}`);
554
785
  }
555
786
  };
556
- const saveFeedback = async (messageId, feedback) => {
787
+ const saveFeedback = async (messageId, threadId, feedback) => {
557
788
  const response = await fetchImpl(getURL('/feedback'), {
558
789
  method: 'POST',
559
790
  headers: getHeaders(),
560
791
  credentials: 'include',
561
792
  body: JSON.stringify({
562
793
  messageId,
794
+ threadId,
563
795
  feedback,
564
796
  }),
565
797
  });
@@ -579,6 +811,28 @@ var ProvidersShopGptSdk = (function () {
579
811
  const data = (await response.json());
580
812
  return data.customPrompts;
581
813
  };
814
+ const sendEvent = async (action, currency, actionData) => {
815
+ var _a;
816
+ const storageData = (_a = getProductActions(baseURL)) !== null && _a !== void 0 ? _a : {};
817
+ const response = await fetchImpl(getURL('/user/event'), {
818
+ method: 'POST',
819
+ headers: getHeaders(true),
820
+ body: JSON.stringify({
821
+ action,
822
+ currency,
823
+ actionData,
824
+ storageData: {
825
+ session: storageData,
826
+ preview: hasPreviewKey(),
827
+ isShopGPTLoaded: true, // The fact that sendEvent was called means that the ShopGPT is loaded
828
+ },
829
+ }),
830
+ credentials: 'include',
831
+ });
832
+ if (!response.ok) {
833
+ throw new Error(`Error while recording user event - ${response.status}: ${response.statusText}\n\n${await response.text()}`);
834
+ }
835
+ };
582
836
  return {
583
837
  processQuery,
584
838
  fetchChatHistory,
@@ -588,20 +842,12 @@ var ProvidersShopGptSdk = (function () {
588
842
  deleteAllThreads,
589
843
  saveFeedback,
590
844
  fetchCustomPrompts,
845
+ sendEvent,
591
846
  };
592
847
  };
593
848
 
594
849
  // eslint-disable-next-line @nx/enforce-module-boundaries
595
850
  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
851
  const init = (params) => {
606
852
  var _a, _b, _c;
607
853
  if (typeof window == 'undefined' || typeof document == 'undefined') {
@@ -621,7 +867,8 @@ var ProvidersShopGptSdk = (function () {
621
867
  // exit if not in top window
622
868
  return;
623
869
  }
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 : {};
870
+ 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 : {};
871
+ setShopGPTLoaded(params.baseUrl, !loadUiManually);
625
872
  const experiment = createExperiment({
626
873
  name: getExperimentName(mode),
627
874
  userId: params.userId,
@@ -643,6 +890,7 @@ var ProvidersShopGptSdk = (function () {
643
890
  userId: params.userId,
644
891
  });
645
892
  uiImplementation.init({
893
+ destination: params.baseUrl,
646
894
  storeAPI,
647
895
  shopGPTAPI,
648
896
  devMode,
@@ -657,14 +905,47 @@ var ProvidersShopGptSdk = (function () {
657
905
  latestThreadLoad: latestThreadLoad !== null && latestThreadLoad !== void 0 ? latestThreadLoad : DEFAULT_MAX_THREAD_AGE,
658
906
  botIconUrl,
659
907
  css,
908
+ nudge,
660
909
  });
910
+ if (!loadUiManually) {
911
+ uiImplementation.loadUI();
912
+ }
661
913
  }
662
914
  };
663
915
 
916
+ const getClickedProductsInContents = (destination, data) => {
917
+ const storedData = getProductActions(destination);
918
+ const contents = data['contents'];
919
+ if (!contents || !Array.isArray(contents) || !storedData) {
920
+ return;
921
+ }
922
+ return contents.flatMap((content) => { var _a; return ((_a = storedData[content.id]) === null || _a === void 0 ? void 0 : _a.clicked) ? [content.id] : []; });
923
+ };
924
+ const tag = ({ eventName, destination, data, }) => {
925
+ var _a;
926
+ const clickedProducts = getClickedProductsInContents(destination, data);
927
+ if (eventName === 'AddToCart') {
928
+ clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
929
+ setProductAction(destination, id, 'addToCart', true);
930
+ });
931
+ }
932
+ else if (eventName == 'RemoveFromCart') {
933
+ clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
934
+ setProductAction(destination, id, 'addToCart', false);
935
+ });
936
+ }
937
+ return {
938
+ session: getProductActions(destination),
939
+ preview: hasPreviewKey(),
940
+ isShopGPTLoaded: (_a = getShopGPTLoaded(destination)) !== null && _a !== void 0 ? _a : false,
941
+ };
942
+ };
943
+
664
944
  // eslint-disable-next-line @nx/enforce-module-boundaries
665
945
  const data = {
666
946
  name: packageName,
667
947
  init,
948
+ tag,
668
949
  };
669
950
  try {
670
951
  if (typeof window !== 'undefined') {
@@ -877,6 +1158,29 @@ var ProvidersShopGptSdk = (function () {
877
1158
  line-height: 150%;
878
1159
  }
879
1160
 
1161
+ .nudge {
1162
+ position: absolute;
1163
+ color: var(--shopgpt-secondary);
1164
+ padding: 12px 16px;
1165
+ font-size: 16px;
1166
+ line-height: 21px;
1167
+ background: var(--shopgpt-warning);
1168
+ border-radius: 5px;
1169
+ box-shadow: 0px 4px 6px -1px rgba(0, 0, 0, 0.1),
1170
+ 0px 2px 4px -1px rgba(0, 0, 0, 0.06);
1171
+ font-weight: 400;
1172
+ line-height: 150%;
1173
+ right: calc(100% + 10px);
1174
+ top: 0%;
1175
+ transform: translateY(-50%);
1176
+ animation: slideIn 0.5s ease-out forwards;
1177
+ opacity: 0;
1178
+ cursor: pointer;
1179
+ width: 260px;
1180
+ white-space: normal;
1181
+ word-wrap: break-word;
1182
+ }
1183
+
880
1184
  &:hover {
881
1185
  .chatbot-hover-text {
882
1186
  opacity: 1;
@@ -884,6 +1188,17 @@ var ProvidersShopGptSdk = (function () {
884
1188
  }
885
1189
  }
886
1190
 
1191
+ @keyframes slideIn {
1192
+ from {
1193
+ transform: translate(20px, -50%);
1194
+ opacity: 0;
1195
+ }
1196
+ to {
1197
+ transform: translate(0, -50%);
1198
+ opacity: 1;
1199
+ }
1200
+ }
1201
+
887
1202
  .mobile-version {
888
1203
  display: none;
889
1204
 
@@ -1634,19 +1949,38 @@ var ProvidersShopGptSdk = (function () {
1634
1949
  <p class="product-variation-details">${option.name}: ${option.value}</p>
1635
1950
  `);
1636
1951
  }
1952
+ productClicked(productId, price, url) {
1953
+ if (productId) {
1954
+ this.dispatchEvent(new CustomEvent('product-clicked', {
1955
+ detail: {
1956
+ productId,
1957
+ value: price ? parseFloat(price) : undefined,
1958
+ },
1959
+ composed: true,
1960
+ bubbles: true,
1961
+ }));
1962
+ }
1963
+ this.redirect(url);
1964
+ }
1637
1965
  render() {
1638
1966
  return x `
1639
1967
  <div class="product">
1640
1968
  <img
1641
1969
  src=${this.product.image.url}
1642
1970
  alt=${this.product.image.alt}
1643
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1971
+ @click=${() => {
1972
+ var _a;
1973
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1974
+ }}
1644
1975
  />
1645
1976
  <div class="content">
1646
1977
  <p
1647
1978
  class="product-name"
1648
1979
  title=${this.product.title}
1649
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1980
+ @click=${() => {
1981
+ var _a;
1982
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1983
+ }}
1650
1984
  >
1651
1985
  ${this.product.title}
1652
1986
  </p>
@@ -1657,7 +1991,10 @@ var ProvidersShopGptSdk = (function () {
1657
1991
  </div>
1658
1992
  <button
1659
1993
  class="btn-view-product"
1660
- @click=${() => { var _a; return this.redirect((_a = this.product) === null || _a === void 0 ? void 0 : _a.url); }}
1994
+ @click=${() => {
1995
+ var _a;
1996
+ return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
1997
+ }}
1661
1998
  >
1662
1999
  View Product
1663
2000
  </button>
@@ -2463,6 +2800,22 @@ var ProvidersShopGptSdk = (function () {
2463
2800
  const capitalizeEachWord = (str) => {
2464
2801
  return str === null || str === void 0 ? void 0 : str.replace(/^\w/, (char) => char.toUpperCase());
2465
2802
  };
2803
+ const adParams = new Set([
2804
+ 'fbclid',
2805
+ 'gclid',
2806
+ 'sccid',
2807
+ 'ttclid',
2808
+ 'epik',
2809
+ 'li_fat_id',
2810
+ 'twclid',
2811
+ 'rdt_cid',
2812
+ 'aleid',
2813
+ 'tabclid',
2814
+ 'msclkid',
2815
+ 'dclid',
2816
+ 'wbraid',
2817
+ ]);
2818
+ const isFromAd = (params) => [...params.keys()].some((key) => adParams.has(key.toLowerCase()));
2466
2819
 
2467
2820
  const plusBtn = b `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
2468
2821
  <path d="M12.75 11.25V6H11.25V11.25H6V12.75H11.25V18H12.75V12.75H18V11.25H12.75Z" fill="white"/>
@@ -3519,6 +3872,7 @@ var ProvidersShopGptSdk = (function () {
3519
3872
  this.dispatchEvent(new CustomEvent('submit-feedback', {
3520
3873
  detail: {
3521
3874
  messageId: this.messageId,
3875
+ threadId: this.threadId,
3522
3876
  feedback,
3523
3877
  },
3524
3878
  composed: true,
@@ -3590,6 +3944,10 @@ ${this.comment ? this.comment : E}</textarea
3590
3944
  n({ type: String }),
3591
3945
  __metadata("design:type", Object)
3592
3946
  ], FeedbackDialog.prototype, "messageId", void 0);
3947
+ __decorate([
3948
+ n({ type: String }),
3949
+ __metadata("design:type", Object)
3950
+ ], FeedbackDialog.prototype, "threadId", void 0);
3593
3951
  __decorate([
3594
3952
  n({ type: String }),
3595
3953
  __metadata("design:type", Object)
@@ -3622,19 +3980,26 @@ ${this.comment ? this.comment : E}</textarea
3622
3980
  behavior: 'smooth',
3623
3981
  });
3624
3982
  }
3625
- async processMessage(e, message) {
3983
+ async processMessage(e, message, isPrompt = false) {
3626
3984
  this.scrollToBottom();
3627
3985
  if (!this.thread) {
3628
3986
  await this.createChatThread({ title: '' }, false);
3629
3987
  }
3630
- await this.sendMessageToServer(e, message);
3988
+ await this.sendMessageToServer(e, message, isPrompt);
3989
+ }
3990
+ sendEvent(action, actionData) {
3991
+ this.dispatchEvent(new CustomEvent('send-event', {
3992
+ detail: { action, actionData },
3993
+ composed: true,
3994
+ bubbles: true,
3995
+ }));
3631
3996
  }
3632
3997
  async onSubmit(e) {
3633
3998
  var _a;
3634
3999
  e.preventDefault();
3635
4000
  const message = (_a = this.userQuery) === null || _a === void 0 ? void 0 : _a.trim();
3636
4001
  this.userQuery = '';
3637
- await this.processMessage(e, message);
4002
+ await this.processMessage(e, message, false);
3638
4003
  }
3639
4004
  handleThreadDelete() {
3640
4005
  if (this.deleteAllThreads) {
@@ -3656,13 +4021,19 @@ ${this.comment ? this.comment : E}</textarea
3656
4021
  this.deleteThreadId = '';
3657
4022
  }
3658
4023
  handleFeedback(rating, messageId, comment) {
4024
+ var _a, _b;
3659
4025
  if (rating === 'bad') {
3660
- this.feedbackDetails = { messageId, comment };
4026
+ this.feedbackDetails = {
4027
+ messageId,
4028
+ threadId: ((_a = this.thread) === null || _a === void 0 ? void 0 : _a.threadId) || '',
4029
+ comment,
4030
+ };
3661
4031
  return;
3662
4032
  }
3663
4033
  this.dispatchEvent(new CustomEvent('submit-feedback', {
3664
4034
  detail: {
3665
4035
  messageId: messageId,
4036
+ threadId: (_b = this.thread) === null || _b === void 0 ? void 0 : _b.threadId,
3666
4037
  feedback: {
3667
4038
  rating,
3668
4039
  comment: null,
@@ -3809,7 +4180,10 @@ ${this.comment ? this.comment : E}</textarea
3809
4180
  return x `
3810
4181
  <div
3811
4182
  class="prompt"
3812
- @click=${(e) => this.processMessage(e, prompt)}
4183
+ @click=${(e) => {
4184
+ this.processMessage(e, prompt, true);
4185
+ this.sendEvent('promptClicked');
4186
+ }}
3813
4187
  >
3814
4188
  ${prompt}
3815
4189
  </div>
@@ -3817,7 +4191,13 @@ ${this.comment ? this.comment : E}</textarea
3817
4191
  })}
3818
4192
  ${o$1(customPrompts, ({ prompt, link }) => {
3819
4193
  return x `
3820
- <a class="prompt" href=${link} target="_blank" rel="noopener">
4194
+ <a
4195
+ class="prompt"
4196
+ href=${link}
4197
+ target="_blank"
4198
+ rel="noopener"
4199
+ @click=${() => this.sendEvent('promptClicked')}
4200
+ >
3821
4201
  ${prompt}
3822
4202
  </a>
3823
4203
  `;
@@ -4093,7 +4473,10 @@ ${this.comment ? this.comment : E}</textarea
4093
4473
  </form>
4094
4474
  ${this.viewType === 'modal'
4095
4475
  ? x ` <footer>
4096
- Powered by <a href="https://blotout.io">Blotout</a>
4476
+ Powered by
4477
+ <a target="_blank" href="https://shopgpt.edgeagents.ai"
4478
+ >Blotout</a
4479
+ >
4097
4480
  </footer>`
4098
4481
  : E}
4099
4482
  </div>
@@ -4133,6 +4516,7 @@ ${this.comment ? this.comment : E}</textarea
4133
4516
  ? x `
4134
4517
  <feedback-dialog
4135
4518
  .messageId=${this.feedbackDetails.messageId}
4519
+ .threadId=${this.feedbackDetails.threadId}
4136
4520
  .comment=${this.feedbackDetails.comment}
4137
4521
  @submit-feedback=${() => {
4138
4522
  this.feedbackDetails = undefined;
@@ -4252,13 +4636,22 @@ ${this.comment ? this.comment : E}</textarea
4252
4636
  customElements.define('chat-section', ChatSection);
4253
4637
  }
4254
4638
 
4639
+ async function* streamToIterable(stream) {
4640
+ const reader = stream.getReader();
4641
+ while (true) {
4642
+ const { done, value } = await reader.read();
4643
+ if (done)
4644
+ return;
4645
+ yield value;
4646
+ }
4647
+ }
4255
4648
  const handleEventSource = async (response, onEvent) => {
4256
4649
  var _a, _b;
4257
4650
  if (!response.body) {
4258
4651
  throw new Error('No body found in response');
4259
4652
  }
4260
4653
  let buffer = '';
4261
- for await (const chunk of response.body.pipeThrough(new TextDecoderStream())) {
4654
+ for await (const chunk of streamToIterable(response.body.pipeThrough(new TextDecoderStream()))) {
4262
4655
  buffer += chunk;
4263
4656
  const sections = buffer.split('\n\n');
4264
4657
  buffer = sections.pop() || '';
@@ -4301,12 +4694,15 @@ ${this.comment ? this.comment : E}</textarea
4301
4694
  return result;
4302
4695
  };
4303
4696
 
4697
+ 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';
4698
+
4304
4699
  const DIALOG_DELAY = 1000;
4305
4700
  const normalizePath = (path) => path.replace(/\/$/, '');
4306
4701
  class ShopGPT extends r$2 {
4307
4702
  constructor() {
4308
4703
  super(...arguments);
4309
4704
  this.isStylesheetInjected = false;
4705
+ this.isPreviousMessagePrompt = false;
4310
4706
  this.latestThreadLoad = DEFAULT_MAX_THREAD_AGE;
4311
4707
  this.modalState = 'close';
4312
4708
  this.isLoadingHistory = false;
@@ -4318,6 +4714,8 @@ ${this.comment ? this.comment : E}</textarea
4318
4714
  this.messages = [];
4319
4715
  this.chatThreads = new Map();
4320
4716
  this.customPrompts = [];
4717
+ this.hasUserInteracted = false;
4718
+ this.showNudge = false;
4321
4719
  this.loadData = async () => {
4322
4720
  if (!this.shopGPTAPI) {
4323
4721
  return;
@@ -4358,17 +4756,23 @@ ${this.comment ? this.comment : E}</textarea
4358
4756
  }
4359
4757
  }
4360
4758
  this.init();
4759
+ this.startNudgeTimer();
4361
4760
  }
4362
4761
  disconnectedCallback() {
4363
4762
  window.removeEventListener('edgetag-initialized', this.loadData);
4364
4763
  window.removeEventListener('popstate', this.onPopState);
4764
+ if (this.nudgeTimer) {
4765
+ window.clearTimeout(this.nudgeTimer);
4766
+ }
4365
4767
  super.disconnectedCallback();
4366
4768
  }
4367
4769
  init() {
4368
4770
  window.addEventListener('edgetag-initialized', this.loadData);
4369
4771
  window.addEventListener('popstate', this.onPopState);
4772
+ this.shopGPTAPI.sendEvent('shopGPTInitialized', this.getSiteCurrency().currency);
4370
4773
  if (!this.view || this.view === 'overlay') {
4371
- delay(DIALOG_DELAY).then(() => {
4774
+ delay(DIALOG_DELAY)
4775
+ .then(() => {
4372
4776
  var _a;
4373
4777
  if (document.hidden) {
4374
4778
  document.addEventListener('visibilitychange', () => { var _a; return (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal(); }, {
@@ -4378,7 +4782,8 @@ ${this.comment ? this.comment : E}</textarea
4378
4782
  else {
4379
4783
  (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal();
4380
4784
  }
4381
- });
4785
+ })
4786
+ .catch(logger.error);
4382
4787
  }
4383
4788
  }
4384
4789
  setChatTitle(threadId, title) {
@@ -4406,8 +4811,8 @@ ${this.comment ? this.comment : E}</textarea
4406
4811
  if (!thread) {
4407
4812
  return;
4408
4813
  }
4409
- const searchParam = new URLSearchParams(window.location.search);
4410
- const fromAd = searchParam.get('shopGPT') === '1';
4814
+ const searchParams = new URLSearchParams(window.location.search);
4815
+ const fromAd = isFromAd(searchParams) || searchParams.get('shopGPT') === '1';
4411
4816
  const productHandle = this.devMode
4412
4817
  ? (_a = thread === null || thread === void 0 ? void 0 : thread.devContext) === null || _a === void 0 ? void 0 : _a.productHandle
4413
4818
  : fromAd
@@ -4644,7 +5049,7 @@ ${this.comment ? this.comment : E}</textarea
4644
5049
  }
4645
5050
  });
4646
5051
  }
4647
- async sendMessageToServer(e, message) {
5052
+ async sendMessageToServer(e, message, isPrompt = false) {
4648
5053
  e.preventDefault();
4649
5054
  e.stopPropagation();
4650
5055
  if (!message || this.isTyping || this.isLoadingHistory) {
@@ -4652,6 +5057,10 @@ ${this.comment ? this.comment : E}</textarea
4652
5057
  }
4653
5058
  this.isFailed = false;
4654
5059
  try {
5060
+ this.isPreviousMessagePrompt = isPrompt;
5061
+ if (!isPrompt) {
5062
+ this.shopGPTAPI.sendEvent('queryInteractions', this.getSiteCurrency().currency);
5063
+ }
4655
5064
  this.messages = [{ sender: 'user', message }, ...this.messages];
4656
5065
  this.isTyping = true;
4657
5066
  const response = await this.submitQuery(message);
@@ -4666,7 +5075,7 @@ ${this.comment ? this.comment : E}</textarea
4666
5075
  submitFeedback(e) {
4667
5076
  e.stopPropagation();
4668
5077
  this.shopGPTAPI
4669
- .saveFeedback(e.detail.messageId, e.detail.feedback)
5078
+ .saveFeedback(e.detail.messageId, e.detail.threadId, e.detail.feedback)
4670
5079
  .then(() => {
4671
5080
  const messages = this.messages;
4672
5081
  const messageIndex = messages.findIndex(({ messageId }) => messageId === e.detail.messageId);
@@ -4675,17 +5084,25 @@ ${this.comment ? this.comment : E}</textarea
4675
5084
  feedback: e.detail.feedback,
4676
5085
  };
4677
5086
  this.messages = [...messages];
5087
+ })
5088
+ .catch(logger.error);
5089
+ }
5090
+ sendEvent(e) {
5091
+ e.stopPropagation();
5092
+ this.shopGPTAPI.sendEvent(e.detail.action, this.getSiteCurrency().currency, e.detail.actionData);
5093
+ }
5094
+ productClicked(e) {
5095
+ e.stopPropagation();
5096
+ setProductAction(this.destination, e.detail.productId, 'clicked', true);
5097
+ this.shopGPTAPI.sendEvent('productRecommendationClicked', this.getSiteCurrency().currency, {
5098
+ productId: e.detail.productId,
5099
+ value: e.detail.value,
5100
+ isPrompt: this.isPreviousMessagePrompt,
4678
5101
  });
4679
5102
  }
4680
5103
  getSiteCurrency() {
4681
5104
  return this.storeAPI.getSiteCurrency();
4682
5105
  }
4683
- render() {
4684
- if (this.view === 'modal') {
4685
- return this.modalMode();
4686
- }
4687
- return this.overlayMode();
4688
- }
4689
5106
  overlayMode() {
4690
5107
  const thread = this.chatThreads.get(this.selectedThreadId);
4691
5108
  return x `
@@ -4694,6 +5111,8 @@ ${this.comment ? this.comment : E}</textarea
4694
5111
  @delete-thread=${this.handleThreadDelete}
4695
5112
  @delete-all-threads=${this.handleAllThreadsDelete}
4696
5113
  @submit-feedback=${this.submitFeedback}
5114
+ @send-event=${this.sendEvent}
5115
+ @product-clicked=${this.productClicked}
4697
5116
  >
4698
5117
  <div class="mobile-version">
4699
5118
  Please switch to the desktop version for the best experience.
@@ -4741,6 +5160,7 @@ ${this.comment ? this.comment : E}</textarea
4741
5160
  `;
4742
5161
  }
4743
5162
  modalMode() {
5163
+ var _a;
4744
5164
  const thread = this.chatThreads.get(this.selectedThreadId);
4745
5165
  const closeModal = () => {
4746
5166
  this.modalState = 'close';
@@ -4750,12 +5170,28 @@ ${this.comment ? this.comment : E}</textarea
4750
5170
  <button
4751
5171
  @click=${(e) => {
4752
5172
  e.preventDefault();
5173
+ this.shopGPTAPI.sendEvent('chatbotOpened', this.getSiteCurrency().currency);
4753
5174
  this.modalState = 'open';
5175
+ this.handleUserInteraction();
4754
5176
  }}
4755
5177
  >
4756
5178
  ${chatIcon}
4757
5179
  </button>
4758
- <div class="chatbot-hover-text">What are you looking for today?</div>
5180
+ ${((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show) && this.showNudge
5181
+ ? x `<div
5182
+ class="nudge"
5183
+ @click=${(e) => {
5184
+ e.preventDefault();
5185
+ this.modalState = 'open';
5186
+ this.handleUserInteraction();
5187
+ }}
5188
+ >
5189
+ Hi there! I'm an AI Agent to help you find the perfect product.
5190
+ What are you looking for today?
5191
+ </div>`
5192
+ : x `<div class="chatbot-hover-text">
5193
+ What are you looking for today?
5194
+ </div>`}
4759
5195
  </div>`;
4760
5196
  }
4761
5197
  return x `
@@ -4764,6 +5200,9 @@ ${this.comment ? this.comment : E}</textarea
4764
5200
  @delete-thread=${this.handleThreadDelete}
4765
5201
  @delete-all-threads=${this.handleAllThreadsDelete}
4766
5202
  @submit-feedback=${this.submitFeedback}
5203
+ @click=${this.handleUserInteraction}
5204
+ @send-event=${this.sendEvent}
5205
+ @product-clicked=${this.productClicked}
4767
5206
  >
4768
5207
  <chat-section
4769
5208
  .prompts=${this.quickPrompts}
@@ -4792,6 +5231,48 @@ ${this.comment ? this.comment : E}</textarea
4792
5231
  </div>
4793
5232
  `;
4794
5233
  }
5234
+ startNudgeTimer() {
5235
+ var _a, _b;
5236
+ if (this.view !== 'modal' || !((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show)) {
5237
+ return;
5238
+ }
5239
+ this.hasUserInteracted = isUserInteracted(this.destination);
5240
+ if (this.hasUserInteracted || this.nudgeTimer) {
5241
+ return;
5242
+ }
5243
+ this.nudgeTimer = window.setTimeout(() => {
5244
+ if (!this.hasUserInteracted) {
5245
+ this.playNudgeSound();
5246
+ this.showNudge = true;
5247
+ }
5248
+ }, (((_b = this.nudge) === null || _b === void 0 ? void 0 : _b.timeout) || DEFAULT_NUDGE_TIMEOUT) * 1000);
5249
+ }
5250
+ playNudgeSound() {
5251
+ var _a;
5252
+ if (!((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.sound) || !navigator.userActivation.hasBeenActive) {
5253
+ return;
5254
+ }
5255
+ const audio = new Audio(soothingWaterDropSound);
5256
+ audio
5257
+ .play()
5258
+ .catch((error) => logger.error('Error playing nudge sound', error));
5259
+ }
5260
+ handleUserInteraction() {
5261
+ if (!this.hasUserInteracted) {
5262
+ this.hasUserInteracted = true;
5263
+ this.showNudge = false;
5264
+ if (this.nudgeTimer) {
5265
+ window.clearTimeout(this.nudgeTimer);
5266
+ }
5267
+ setUserInteracted(this.destination);
5268
+ }
5269
+ }
5270
+ render() {
5271
+ if (this.view === 'modal') {
5272
+ return this.modalMode();
5273
+ }
5274
+ return this.overlayMode();
5275
+ }
4795
5276
  }
4796
5277
  ShopGPT.styles = [shopGPTStyles];
4797
5278
  __decorate([
@@ -4842,6 +5323,14 @@ ${this.comment ? this.comment : E}</textarea
4842
5323
  n({ type: Array }),
4843
5324
  __metadata("design:type", Array)
4844
5325
  ], ShopGPT.prototype, "customPrompts", void 0);
5326
+ __decorate([
5327
+ r(),
5328
+ __metadata("design:type", Object)
5329
+ ], ShopGPT.prototype, "hasUserInteracted", void 0);
5330
+ __decorate([
5331
+ r(),
5332
+ __metadata("design:type", Object)
5333
+ ], ShopGPT.prototype, "showNudge", void 0);
4845
5334
  if (!customElements.get('shop-gpt')) {
4846
5335
  customElements.define('shop-gpt', ShopGPT);
4847
5336
  }
@@ -4857,6 +5346,7 @@ ${this.comment ? this.comment : E}</textarea
4857
5346
  return;
4858
5347
  }
4859
5348
  shopGPT = document.createElement('shop-gpt');
5349
+ shopGPT.destination = params.destination;
4860
5350
  shopGPT.storeAPI = params.storeAPI;
4861
5351
  shopGPT.shopGPTAPI = params.shopGPTAPI;
4862
5352
  shopGPT.devMode = params.devMode;
@@ -4871,12 +5361,25 @@ ${this.comment ? this.comment : E}</textarea
4871
5361
  shopGPT.latestThreadLoad = params.latestThreadLoad;
4872
5362
  shopGPT.botIconUrl = params.botIconUrl;
4873
5363
  shopGPT.css = params.css;
5364
+ shopGPT.nudge = params.nudge;
5365
+ },
5366
+ loadUI() {
5367
+ if (!shopGPT) {
5368
+ logger.error('ShopGPT component not found!');
5369
+ return;
5370
+ }
5371
+ if (shopGPT.parentNode) {
5372
+ logger.log('ShopGPT component added already!');
5373
+ return;
5374
+ }
4874
5375
  document.body.append(shopGPT);
5376
+ setShopGPTLoaded(shopGPT.destination, true);
4875
5377
  },
4876
5378
  destroy() {
4877
5379
  if (!shopGPT) {
4878
5380
  return;
4879
5381
  }
5382
+ setShopGPTLoaded(shopGPT.destination, false);
4880
5383
  shopGPT.remove();
4881
5384
  shopGPT = undefined;
4882
5385
  delete window[registryKey];