@blotoutio/providers-shop-gpt-sdk 1.22.1 → 1.22.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.mjs CHANGED
@@ -122,7 +122,7 @@ const isoCountries = new Map([
122
122
  ['FO', 'Faroe Islands'],
123
123
  ['FR', 'France'],
124
124
  ['GA', 'Gabon'],
125
- ['GB', 'United Kingdom of Great Britain and Northern Ireland'],
125
+ ['GB', 'Great Britain'],
126
126
  ['GD', 'Grenada'],
127
127
  ['GE', 'Georgia'],
128
128
  ['GF', 'French Guiana'],
@@ -277,7 +277,7 @@ const isoCountries = new Map([
277
277
  ['TZ', 'Tanzania, United Republic of'],
278
278
  ['UA', 'Ukraine'],
279
279
  ['UG', 'Uganda'],
280
- ['UK', 'United Kingdom'],
280
+ ['UK', 'United Kingdom of Great Britain and Northern Ireland'],
281
281
  ['UM', 'United States Minor Outlying Islands'],
282
282
  ['US', 'United States of America'],
283
283
  ['UY', 'Uruguay'],
@@ -463,6 +463,7 @@ const packageName = 'shopGPT';
463
463
  const DEFAULT_MAX_THREAD_AGE = 14; // in days
464
464
  const DEFAULT_NUDGE_TIMEOUT = 10; // in seconds
465
465
  const previewKeyName = 'previewShopGPT';
466
+ const nudgeOverrideKeyName = 'showShopGPTNudge';
466
467
 
467
468
  const keyPrefix = `_worker`;
468
469
 
@@ -606,6 +607,15 @@ const hasPreviewKey = () => {
606
607
  return false;
607
608
  }
608
609
  };
610
+ const hasNudgeOverride = () => {
611
+ var _a;
612
+ try {
613
+ return ((_a = sessionStorage.getItem(nudgeOverrideKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
614
+ }
615
+ catch {
616
+ return false;
617
+ }
618
+ };
609
619
  const isUserInteracted = (destination) => {
610
620
  var _a;
611
621
  const session = getSessionData(destination);
@@ -741,6 +751,7 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
741
751
  return url;
742
752
  };
743
753
  const processQuery = async (query, threadId, productHandle) => {
754
+ const siteCurrency = await storeAPI.getSiteCurrency();
744
755
  const response = await fetchImpl(getURL('/query'), {
745
756
  method: 'POST',
746
757
  headers: getHeaders(),
@@ -751,6 +762,8 @@ const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, st
751
762
  threadId,
752
763
  pageUrl: window.location.href,
753
764
  customerId: storeAPI.getCustomerId(),
765
+ currencyFormat: siteCurrency.currency,
766
+ conversionRate: siteCurrency.rate,
754
767
  }),
755
768
  credentials: 'include',
756
769
  });
@@ -5885,12 +5898,39 @@ if (!customElements.get('bt-card-wrapper')) {
5885
5898
 
5886
5899
  const TWLitElement$3 = TW(i$1);
5887
5900
  class ProductItem extends TWLitElement$3 {
5901
+ constructor() {
5902
+ super(...arguments);
5903
+ this.isStylesheetInjected = false;
5904
+ }
5905
+ connectedCallback() {
5906
+ super.connectedCallback();
5907
+ if (!this.isStylesheetInjected && this.css) {
5908
+ const sheet = new CSSStyleSheet();
5909
+ sheet.replaceSync(this.css);
5910
+ this.shadowRoot.adoptedStyleSheets.push(sheet);
5911
+ this.isStylesheetInjected = true;
5912
+ }
5913
+ }
5914
+ updated(changedProperties) {
5915
+ super.updated(changedProperties);
5916
+ if (changedProperties.has('siteCurrency') && this.siteCurrency) {
5917
+ this.resolveCurrency();
5918
+ }
5919
+ }
5920
+ async resolveCurrency() {
5921
+ if (this.siteCurrency instanceof Promise) {
5922
+ this.resolvedCurrency = await this.siteCurrency;
5923
+ }
5924
+ else {
5925
+ this.resolvedCurrency = this.siteCurrency;
5926
+ }
5927
+ }
5888
5928
  getLocalPrice(price) {
5889
- if (!this.siteCurrency) {
5929
+ if (!this.resolvedCurrency) {
5890
5930
  return price;
5891
5931
  }
5892
- const localPrice = parseFloat(price) * this.siteCurrency.rate;
5893
- return formatMoney(localPrice, this.siteCurrency.currency);
5932
+ const localPrice = parseFloat(price) * this.resolvedCurrency.rate;
5933
+ return formatMoney(localPrice, this.resolvedCurrency.currency);
5894
5934
  }
5895
5935
  getComparedAtPrice(comparedAtPrice, price) {
5896
5936
  if (!comparedAtPrice ||
@@ -6034,6 +6074,14 @@ __decorate([
6034
6074
  n$1({ type: String }),
6035
6075
  __metadata("design:type", String)
6036
6076
  ], ProductItem.prototype, "viewType", void 0);
6077
+ __decorate([
6078
+ n$1({ type: String }),
6079
+ __metadata("design:type", String)
6080
+ ], ProductItem.prototype, "css", void 0);
6081
+ __decorate([
6082
+ r$1(),
6083
+ __metadata("design:type", Object)
6084
+ ], ProductItem.prototype, "resolvedCurrency", void 0);
6037
6085
  if (!customElements.get('product-item')) {
6038
6086
  customElements.define('product-item', ProductItem);
6039
6087
  }
@@ -6206,6 +6254,7 @@ class ProductsList extends i$1 {
6206
6254
  .userId=${this.userId}
6207
6255
  .viewType=${this.viewType}
6208
6256
  .metafieldDisplayName=${this.metafieldDisplayName}
6257
+ .css=${this.css}
6209
6258
  ></product-item>
6210
6259
  </div>
6211
6260
  `)}
@@ -6255,6 +6304,10 @@ __decorate([
6255
6304
  n$1({ type: String }),
6256
6305
  __metadata("design:type", String)
6257
6306
  ], ProductsList.prototype, "userId", void 0);
6307
+ __decorate([
6308
+ n$1({ type: String }),
6309
+ __metadata("design:type", String)
6310
+ ], ProductsList.prototype, "css", void 0);
6258
6311
  __decorate([
6259
6312
  r$1(),
6260
6313
  __metadata("design:type", Object)
@@ -6325,6 +6378,7 @@ class ProductsSection extends i$1 {
6325
6378
  .rank=${1}
6326
6379
  .userId=${this.userId}
6327
6380
  .metafieldDisplayName=${this.metafieldDisplayName}
6381
+ .css=${this.css}
6328
6382
  ></product-item>
6329
6383
  </div>
6330
6384
  <span class="line"></span>
@@ -6338,6 +6392,7 @@ class ProductsSection extends i$1 {
6338
6392
  .viewType=${'overlay'}
6339
6393
  .userId=${this.userId}
6340
6394
  .metafieldDisplayName=${this.metafieldDisplayName}
6395
+ .css=${this.css}
6341
6396
  ></products-list>
6342
6397
  </div>
6343
6398
  `;
@@ -7955,6 +8010,7 @@ class ChatSection extends i$1 {
7955
8010
  .rank=${1}
7956
8011
  .userId=${this.userId}
7957
8012
  .metafieldDisplayName=${this.metafieldDisplayName}
8013
+ .css=${this.css}
7958
8014
  @product-rendered=${() => {
7959
8015
  // Scroll to show the product
7960
8016
  this.scrollToBottom();
@@ -9371,6 +9427,7 @@ class PopupView extends TWLitElement$1 {
9371
9427
  .viewType=${this.viewType}
9372
9428
  .userId=${this.userId}
9373
9429
  .metafieldDisplayName=${this.metafieldDisplayName}
9430
+ .css=${this.css}
9374
9431
  @products-rendered=${() => {
9375
9432
  this.scrollToBottom();
9376
9433
  }}
@@ -10059,6 +10116,7 @@ const parseMessage = (message, parseDataAsJSON) => {
10059
10116
  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';
10060
10117
 
10061
10118
  const DIALOG_DELAY = 1000;
10119
+ const SUPPORT_PROMPTS = 'Where is my order,Tracking link for my order,Return my order,Cancel my order';
10062
10120
  const normalizePath = (path) => path.replace(/\/$/, '');
10063
10121
  class ShopGPT extends i$1 {
10064
10122
  constructor() {
@@ -10080,6 +10138,7 @@ class ShopGPT extends i$1 {
10080
10138
  this.hasUserInteracted = false;
10081
10139
  this.showNudge = false;
10082
10140
  this.shouldAskUserEmail = false;
10141
+ this.supportRequested = false;
10083
10142
  this.loadData = async () => {
10084
10143
  if (!this.shopGPTAPI) {
10085
10144
  return;
@@ -10307,6 +10366,9 @@ class ShopGPT extends i$1 {
10307
10366
  this.isFailed = false;
10308
10367
  const currentThreadId = this.selectedThreadId;
10309
10368
  this.selectedThreadId = threadId;
10369
+ if (!threadId) {
10370
+ this.supportRequested = false;
10371
+ }
10310
10372
  if (threadId && !silent) {
10311
10373
  this.shopGPTAPI.sendEvent('switchThread', undefined, undefined, {
10312
10374
  previousThread: currentThreadId,
@@ -10505,7 +10567,8 @@ class ShopGPT extends i$1 {
10505
10567
  try {
10506
10568
  this.isPreviousMessagePrompt = isPrompt;
10507
10569
  if (!isPrompt) {
10508
- this.shopGPTAPI.sendEvent('queryInteractions', this.getSiteCurrency().currency, undefined, {
10570
+ const siteCurrency = await this.getSiteCurrency();
10571
+ this.shopGPTAPI.sendEvent('queryInteractions', siteCurrency.currency, undefined, {
10509
10572
  query: message,
10510
10573
  threadId: this.selectedThreadId,
10511
10574
  });
@@ -10538,9 +10601,10 @@ class ShopGPT extends i$1 {
10538
10601
  })
10539
10602
  .catch(logger.error);
10540
10603
  }
10541
- sendEvent(e) {
10604
+ async sendEvent(e) {
10542
10605
  e.stopPropagation();
10543
- this.shopGPTAPI.sendEvent(e.detail.action, this.getSiteCurrency().currency, e.detail.actionData, e.detail.clickData);
10606
+ const siteCurrency = await this.getSiteCurrency();
10607
+ this.shopGPTAPI.sendEvent(e.detail.action, siteCurrency.currency, e.detail.actionData, e.detail.clickData);
10544
10608
  }
10545
10609
  closeNudge(e) {
10546
10610
  e.stopPropagation();
@@ -10549,12 +10613,15 @@ class ShopGPT extends i$1 {
10549
10613
  }
10550
10614
  async handleNudgePromptClick(e) {
10551
10615
  e.stopPropagation();
10552
- this.openModal();
10553
10616
  await this.setSelectedThreadId('');
10554
10617
  await this.createChatThread({ title: '' }, false);
10555
10618
  if (e.detail.id === 'query') {
10556
10619
  this.sendMessageToServer(e, e.detail.message, true);
10557
10620
  }
10621
+ if (e.detail.id === 'support') {
10622
+ this.supportRequested = true;
10623
+ }
10624
+ this.openModal();
10558
10625
  }
10559
10626
  submitUserData(e) {
10560
10627
  e.stopPropagation();
@@ -10565,11 +10632,12 @@ class ShopGPT extends i$1 {
10565
10632
  });
10566
10633
  this.shouldAskUserEmail = false;
10567
10634
  }
10568
- productClicked(e) {
10635
+ async productClicked(e) {
10569
10636
  var _a, _b;
10570
10637
  e.stopPropagation();
10571
10638
  setProductAction(this.destination, this.sessionId, e.detail.id, 'clicked', true);
10572
- this.shopGPTAPI.sendEvent('productRecommendationClicked', this.getSiteCurrency().currency, {
10639
+ const siteCurrency = await this.getSiteCurrency();
10640
+ this.shopGPTAPI.sendEvent('productRecommendationClicked', siteCurrency.currency, {
10573
10641
  productId: e.detail.id,
10574
10642
  value: e.detail.value,
10575
10643
  isPrompt: this.isPreviousMessagePrompt,
@@ -10577,15 +10645,15 @@ class ShopGPT extends i$1 {
10577
10645
  threadId: this.selectedThreadId,
10578
10646
  query: (_a = e.detail.query) !== null && _a !== void 0 ? _a : '',
10579
10647
  response: (_b = e.detail.response) !== null && _b !== void 0 ? _b : '',
10580
- currency: this.getSiteCurrency().currency,
10648
+ currency: siteCurrency.currency,
10581
10649
  variantId: e.detail.variantId,
10582
10650
  url: e.detail.url,
10583
10651
  title: e.detail.title,
10584
10652
  rank: e.detail.rank,
10585
10653
  }, true);
10586
10654
  }
10587
- getSiteCurrency() {
10588
- return this.storeAPI.getSiteCurrency();
10655
+ async getSiteCurrency() {
10656
+ return await this.storeAPI.getSiteCurrency();
10589
10657
  }
10590
10658
  overlayMode() {
10591
10659
  const thread = this.chatThreads.get(this.selectedThreadId);
@@ -10655,6 +10723,7 @@ class ShopGPT extends i$1 {
10655
10723
  const thread = this.chatThreads.get(this.selectedThreadId);
10656
10724
  const closeModal = () => {
10657
10725
  this.modalState = 'close';
10726
+ this.supportRequested = false;
10658
10727
  this.shopGPTAPI.sendEvent('chatbotClosed');
10659
10728
  };
10660
10729
  return x `
@@ -10670,7 +10739,9 @@ class ShopGPT extends i$1 {
10670
10739
  @submit-user-data=${this.submitUserData}
10671
10740
  >
10672
10741
  <popup-view
10673
- .prompts=${this.quickPrompts}
10742
+ .prompts=${this.supportRequested
10743
+ ? SUPPORT_PROMPTS
10744
+ : this.quickPrompts}
10674
10745
  .brandName=${this.brandName}
10675
10746
  .isFailed=${this.isFailed}
10676
10747
  .isLoadingHistory=${this.isLoadingHistory}
@@ -10710,7 +10781,7 @@ class ShopGPT extends i$1 {
10710
10781
  >
10711
10782
  <chatbot-icon .css=${this.css}></chatbot-icon>
10712
10783
  </button>
10713
- ${((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show) && this.showNudge
10784
+ ${(hasNudgeOverride() || ((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show)) && this.showNudge
10714
10785
  ? x ` <div class="nudge">
10715
10786
  <chat-nudge
10716
10787
  .brandName=${this.brandName}
@@ -10735,6 +10806,13 @@ class ShopGPT extends i$1 {
10735
10806
  }
10736
10807
  startNudgeTimer() {
10737
10808
  var _a, _b;
10809
+ if (hasNudgeOverride()) {
10810
+ this.nudgeTimer = window.setTimeout(() => {
10811
+ this.playNudgeSound();
10812
+ this.showNudge = true;
10813
+ }, 2000);
10814
+ return;
10815
+ }
10738
10816
  if (this.view !== 'modal' || !((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show)) {
10739
10817
  return;
10740
10818
  }
@@ -10751,6 +10829,13 @@ class ShopGPT extends i$1 {
10751
10829
  }
10752
10830
  playNudgeSound() {
10753
10831
  var _a;
10832
+ if (hasNudgeOverride()) {
10833
+ const audio = new Audio(soothingWaterDropSound);
10834
+ audio
10835
+ .play()
10836
+ .catch((error) => logger.error('Error playing nudge sound', error));
10837
+ return;
10838
+ }
10754
10839
  if (!((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.sound) || !navigator.userActivation.hasBeenActive) {
10755
10840
  return;
10756
10841
  }
@@ -10841,6 +10926,10 @@ __decorate([
10841
10926
  r$1(),
10842
10927
  __metadata("design:type", Object)
10843
10928
  ], ShopGPT.prototype, "shouldAskUserEmail", void 0);
10929
+ __decorate([
10930
+ r$1(),
10931
+ __metadata("design:type", Object)
10932
+ ], ShopGPT.prototype, "supportRequested", void 0);
10844
10933
  if (!customElements.get('shop-gpt')) {
10845
10934
  customElements.define('shop-gpt', ShopGPT);
10846
10935
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blotoutio/providers-shop-gpt-sdk",
3
- "version": "1.22.1",
3
+ "version": "1.22.3",
4
4
  "description": "Shop GPT SDK for EdgeTag",
5
5
  "author": "Blotout",
6
6
  "license": "MIT",
@@ -6,6 +6,92 @@ if (typeof window != 'undefined') {
6
6
  (_a$1 = window[registryKey]) !== null && _a$1 !== void 0 ? _a$1 : (window[registryKey] = {});
7
7
  }
8
8
 
9
+ const CACHE_KEY = 'shop_gpt_currency_rates';
10
+ const CACHE_DURATION = 14400000; // 4 hours
11
+ let ratesCache = null;
12
+ let ratesPromise = null;
13
+ const getCachedRatesFromStorage = () => {
14
+ try {
15
+ const cached = localStorage.getItem(CACHE_KEY);
16
+ if (!cached) {
17
+ return null;
18
+ }
19
+ const data = JSON.parse(cached);
20
+ if (Date.now() > data.expiresAt) {
21
+ localStorage.removeItem(CACHE_KEY);
22
+ return null;
23
+ }
24
+ return data.rates;
25
+ }
26
+ catch (error) {
27
+ return null;
28
+ }
29
+ };
30
+ const setCachedRatesToStorage = (rates) => {
31
+ try {
32
+ const data = {
33
+ rates,
34
+ timestamp: Date.now(),
35
+ expiresAt: Date.now() + CACHE_DURATION,
36
+ };
37
+ localStorage.setItem(CACHE_KEY, JSON.stringify(data));
38
+ }
39
+ catch (error) {
40
+ // Storage might be full or disabled
41
+ }
42
+ };
43
+ const fetchRatesFromShopify = async () => {
44
+ try {
45
+ const response = await fetch('https://cdn.shopify.com/s/javascripts/currencies.js');
46
+ if (!response.ok) {
47
+ throw new Error(`HTTP error! status: ${response.status} ${response.statusText}`);
48
+ }
49
+ const text = await response.text();
50
+ const ratesMatch = text.match(/rates:\{([^}]+)\}/);
51
+ if (!ratesMatch) {
52
+ throw new Error('Could not parse currency rates from response');
53
+ }
54
+ const ratesString = ratesMatch[1];
55
+ const rates = {};
56
+ const ratePairs = ratesString.split(',');
57
+ for (const pair of ratePairs) {
58
+ const [currency, rate] = pair.split(':');
59
+ if (currency && rate) {
60
+ const rawRate = parseFloat(rate.trim());
61
+ rates[currency.trim()] = 1 / rawRate;
62
+ }
63
+ }
64
+ setCachedRatesToStorage(rates);
65
+ return rates;
66
+ }
67
+ catch (error) {
68
+ return {};
69
+ }
70
+ };
71
+ const getRatesLazy = async () => {
72
+ if (ratesCache) {
73
+ return ratesCache;
74
+ }
75
+ const storedRates = getCachedRatesFromStorage();
76
+ if (storedRates) {
77
+ ratesCache = storedRates;
78
+ return storedRates;
79
+ }
80
+ if (ratesPromise) {
81
+ return ratesPromise;
82
+ }
83
+ ratesPromise = fetchRatesFromShopify();
84
+ ratesCache = await ratesPromise;
85
+ return ratesCache;
86
+ };
87
+ const ensureRatesLoaded = async () => {
88
+ const rates = await getRatesLazy();
89
+ return rates;
90
+ };
91
+ if (typeof window !== 'undefined') {
92
+ getRatesLazy();
93
+ }
94
+
9
95
  var _a, _b;
10
96
  var _c;
11
97
  const addItemToCart = (fetchOverride, itemsToAdd) => fetchOverride(`${window.Shopify.routes.root}cart/add.js`, {
@@ -25,11 +111,33 @@ const createShopApi = (fetchOverride = window.fetch) => ({
25
111
  throw new Error(`Could not add items`, { cause: await response.text() });
26
112
  }
27
113
  },
28
- getSiteCurrency() {
114
+ async getSiteCurrency() {
29
115
  var _a, _b, _c, _d;
116
+ const currency = ((_b = (_a = window.Shopify) === null || _a === void 0 ? void 0 : _a.currency) === null || _b === void 0 ? void 0 : _b.active) || 'USD';
117
+ const shopifyRate = (_d = (_c = window.Shopify) === null || _c === void 0 ? void 0 : _c.currency) === null || _d === void 0 ? void 0 : _d.rate;
118
+ if (currency === 'USD') {
119
+ return {
120
+ currency: 'USD',
121
+ rate: 1,
122
+ };
123
+ }
124
+ if (shopifyRate) {
125
+ return {
126
+ currency,
127
+ rate: parseFloat(shopifyRate),
128
+ };
129
+ }
130
+ const rates = await ensureRatesLoaded();
131
+ if (rates === null || rates === void 0 ? void 0 : rates[currency]) {
132
+ const rate = rates[currency];
133
+ return {
134
+ currency,
135
+ rate,
136
+ };
137
+ }
30
138
  return {
31
- currency: ((_b = (_a = window.Shopify) === null || _a === void 0 ? void 0 : _a.currency) === null || _b === void 0 ? void 0 : _b.active) || 'USD',
32
- rate: parseFloat(((_d = (_c = window.Shopify) === null || _c === void 0 ? void 0 : _c.currency) === null || _d === void 0 ? void 0 : _d.rate) || '1'),
139
+ currency: 'USD',
140
+ rate: 1,
33
141
  };
34
142
  },
35
143
  getCurrentProductHandle() {
@@ -7,6 +7,92 @@
7
7
  (_a$1 = window[registryKey]) !== null && _a$1 !== void 0 ? _a$1 : (window[registryKey] = {});
8
8
  }
9
9
 
10
+ const CACHE_KEY = 'shop_gpt_currency_rates';
11
+ const CACHE_DURATION = 14400000; // 4 hours
12
+ let ratesCache = null;
13
+ let ratesPromise = null;
14
+ const getCachedRatesFromStorage = () => {
15
+ try {
16
+ const cached = localStorage.getItem(CACHE_KEY);
17
+ if (!cached) {
18
+ return null;
19
+ }
20
+ const data = JSON.parse(cached);
21
+ if (Date.now() > data.expiresAt) {
22
+ localStorage.removeItem(CACHE_KEY);
23
+ return null;
24
+ }
25
+ return data.rates;
26
+ }
27
+ catch (error) {
28
+ return null;
29
+ }
30
+ };
31
+ const setCachedRatesToStorage = (rates) => {
32
+ try {
33
+ const data = {
34
+ rates,
35
+ timestamp: Date.now(),
36
+ expiresAt: Date.now() + CACHE_DURATION,
37
+ };
38
+ localStorage.setItem(CACHE_KEY, JSON.stringify(data));
39
+ }
40
+ catch (error) {
41
+ // Storage might be full or disabled
42
+ }
43
+ };
44
+ const fetchRatesFromShopify = async () => {
45
+ try {
46
+ const response = await fetch('https://cdn.shopify.com/s/javascripts/currencies.js');
47
+ if (!response.ok) {
48
+ throw new Error(`HTTP error! status: ${response.status} ${response.statusText}`);
49
+ }
50
+ const text = await response.text();
51
+ const ratesMatch = text.match(/rates:\{([^}]+)\}/);
52
+ if (!ratesMatch) {
53
+ throw new Error('Could not parse currency rates from response');
54
+ }
55
+ const ratesString = ratesMatch[1];
56
+ const rates = {};
57
+ const ratePairs = ratesString.split(',');
58
+ for (const pair of ratePairs) {
59
+ const [currency, rate] = pair.split(':');
60
+ if (currency && rate) {
61
+ const rawRate = parseFloat(rate.trim());
62
+ rates[currency.trim()] = 1 / rawRate;
63
+ }
64
+ }
65
+ setCachedRatesToStorage(rates);
66
+ return rates;
67
+ }
68
+ catch (error) {
69
+ return {};
70
+ }
71
+ };
72
+ const getRatesLazy = async () => {
73
+ if (ratesCache) {
74
+ return ratesCache;
75
+ }
76
+ const storedRates = getCachedRatesFromStorage();
77
+ if (storedRates) {
78
+ ratesCache = storedRates;
79
+ return storedRates;
80
+ }
81
+ if (ratesPromise) {
82
+ return ratesPromise;
83
+ }
84
+ ratesPromise = fetchRatesFromShopify();
85
+ ratesCache = await ratesPromise;
86
+ return ratesCache;
87
+ };
88
+ const ensureRatesLoaded = async () => {
89
+ const rates = await getRatesLazy();
90
+ return rates;
91
+ };
92
+ if (typeof window !== 'undefined') {
93
+ getRatesLazy();
94
+ }
95
+
10
96
  var _a, _b;
11
97
  var _c;
12
98
  const addItemToCart = (fetchOverride, itemsToAdd) => fetchOverride(`${window.Shopify.routes.root}cart/add.js`, {
@@ -26,11 +112,33 @@
26
112
  throw new Error(`Could not add items`, { cause: await response.text() });
27
113
  }
28
114
  },
29
- getSiteCurrency() {
115
+ async getSiteCurrency() {
30
116
  var _a, _b, _c, _d;
117
+ const currency = ((_b = (_a = window.Shopify) === null || _a === void 0 ? void 0 : _a.currency) === null || _b === void 0 ? void 0 : _b.active) || 'USD';
118
+ const shopifyRate = (_d = (_c = window.Shopify) === null || _c === void 0 ? void 0 : _c.currency) === null || _d === void 0 ? void 0 : _d.rate;
119
+ if (currency === 'USD') {
120
+ return {
121
+ currency: 'USD',
122
+ rate: 1,
123
+ };
124
+ }
125
+ if (shopifyRate) {
126
+ return {
127
+ currency,
128
+ rate: parseFloat(shopifyRate),
129
+ };
130
+ }
131
+ const rates = await ensureRatesLoaded();
132
+ if (rates === null || rates === void 0 ? void 0 : rates[currency]) {
133
+ const rate = rates[currency];
134
+ return {
135
+ currency,
136
+ rate,
137
+ };
138
+ }
31
139
  return {
32
- currency: ((_b = (_a = window.Shopify) === null || _a === void 0 ? void 0 : _a.currency) === null || _b === void 0 ? void 0 : _b.active) || 'USD',
33
- rate: parseFloat(((_d = (_c = window.Shopify) === null || _c === void 0 ? void 0 : _c.currency) === null || _d === void 0 ? void 0 : _d.rate) || '1'),
140
+ currency: 'USD',
141
+ rate: 1,
34
142
  };
35
143
  },
36
144
  getCurrentProductHandle() {