@blotoutio/providers-shop-gpt-sdk 1.22.2 → 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.cjs.js +79 -16
- package/index.d.ts +1 -1
- package/index.js +79 -16
- package/index.mjs +79 -16
- package/package.json +1 -1
- package/stores/shopify/index.cjs.js +111 -3
- package/stores/shopify/index.js +111 -3
- package/stores/shopify/index.mjs +111 -3
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', '
|
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
|
});
|
@@ -5898,12 +5911,26 @@ class ProductItem extends TWLitElement$3 {
|
|
5898
5911
|
this.isStylesheetInjected = true;
|
5899
5912
|
}
|
5900
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
|
+
}
|
5901
5928
|
getLocalPrice(price) {
|
5902
|
-
if (!this.
|
5929
|
+
if (!this.resolvedCurrency) {
|
5903
5930
|
return price;
|
5904
5931
|
}
|
5905
|
-
const localPrice = parseFloat(price) * this.
|
5906
|
-
return formatMoney(localPrice, this.
|
5932
|
+
const localPrice = parseFloat(price) * this.resolvedCurrency.rate;
|
5933
|
+
return formatMoney(localPrice, this.resolvedCurrency.currency);
|
5907
5934
|
}
|
5908
5935
|
getComparedAtPrice(comparedAtPrice, price) {
|
5909
5936
|
if (!comparedAtPrice ||
|
@@ -6051,6 +6078,10 @@ __decorate([
|
|
6051
6078
|
n$1({ type: String }),
|
6052
6079
|
__metadata("design:type", String)
|
6053
6080
|
], ProductItem.prototype, "css", void 0);
|
6081
|
+
__decorate([
|
6082
|
+
r$1(),
|
6083
|
+
__metadata("design:type", Object)
|
6084
|
+
], ProductItem.prototype, "resolvedCurrency", void 0);
|
6054
6085
|
if (!customElements.get('product-item')) {
|
6055
6086
|
customElements.define('product-item', ProductItem);
|
6056
6087
|
}
|
@@ -10085,6 +10116,7 @@ const parseMessage = (message, parseDataAsJSON) => {
|
|
10085
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';
|
10086
10117
|
|
10087
10118
|
const DIALOG_DELAY = 1000;
|
10119
|
+
const SUPPORT_PROMPTS = 'Where is my order,Tracking link for my order,Return my order,Cancel my order';
|
10088
10120
|
const normalizePath = (path) => path.replace(/\/$/, '');
|
10089
10121
|
class ShopGPT extends i$1 {
|
10090
10122
|
constructor() {
|
@@ -10106,6 +10138,7 @@ class ShopGPT extends i$1 {
|
|
10106
10138
|
this.hasUserInteracted = false;
|
10107
10139
|
this.showNudge = false;
|
10108
10140
|
this.shouldAskUserEmail = false;
|
10141
|
+
this.supportRequested = false;
|
10109
10142
|
this.loadData = async () => {
|
10110
10143
|
if (!this.shopGPTAPI) {
|
10111
10144
|
return;
|
@@ -10333,6 +10366,9 @@ class ShopGPT extends i$1 {
|
|
10333
10366
|
this.isFailed = false;
|
10334
10367
|
const currentThreadId = this.selectedThreadId;
|
10335
10368
|
this.selectedThreadId = threadId;
|
10369
|
+
if (!threadId) {
|
10370
|
+
this.supportRequested = false;
|
10371
|
+
}
|
10336
10372
|
if (threadId && !silent) {
|
10337
10373
|
this.shopGPTAPI.sendEvent('switchThread', undefined, undefined, {
|
10338
10374
|
previousThread: currentThreadId,
|
@@ -10531,7 +10567,8 @@ class ShopGPT extends i$1 {
|
|
10531
10567
|
try {
|
10532
10568
|
this.isPreviousMessagePrompt = isPrompt;
|
10533
10569
|
if (!isPrompt) {
|
10534
|
-
|
10570
|
+
const siteCurrency = await this.getSiteCurrency();
|
10571
|
+
this.shopGPTAPI.sendEvent('queryInteractions', siteCurrency.currency, undefined, {
|
10535
10572
|
query: message,
|
10536
10573
|
threadId: this.selectedThreadId,
|
10537
10574
|
});
|
@@ -10564,9 +10601,10 @@ class ShopGPT extends i$1 {
|
|
10564
10601
|
})
|
10565
10602
|
.catch(logger.error);
|
10566
10603
|
}
|
10567
|
-
sendEvent(e) {
|
10604
|
+
async sendEvent(e) {
|
10568
10605
|
e.stopPropagation();
|
10569
|
-
|
10606
|
+
const siteCurrency = await this.getSiteCurrency();
|
10607
|
+
this.shopGPTAPI.sendEvent(e.detail.action, siteCurrency.currency, e.detail.actionData, e.detail.clickData);
|
10570
10608
|
}
|
10571
10609
|
closeNudge(e) {
|
10572
10610
|
e.stopPropagation();
|
@@ -10575,12 +10613,15 @@ class ShopGPT extends i$1 {
|
|
10575
10613
|
}
|
10576
10614
|
async handleNudgePromptClick(e) {
|
10577
10615
|
e.stopPropagation();
|
10578
|
-
this.openModal();
|
10579
10616
|
await this.setSelectedThreadId('');
|
10580
10617
|
await this.createChatThread({ title: '' }, false);
|
10581
10618
|
if (e.detail.id === 'query') {
|
10582
10619
|
this.sendMessageToServer(e, e.detail.message, true);
|
10583
10620
|
}
|
10621
|
+
if (e.detail.id === 'support') {
|
10622
|
+
this.supportRequested = true;
|
10623
|
+
}
|
10624
|
+
this.openModal();
|
10584
10625
|
}
|
10585
10626
|
submitUserData(e) {
|
10586
10627
|
e.stopPropagation();
|
@@ -10591,11 +10632,12 @@ class ShopGPT extends i$1 {
|
|
10591
10632
|
});
|
10592
10633
|
this.shouldAskUserEmail = false;
|
10593
10634
|
}
|
10594
|
-
productClicked(e) {
|
10635
|
+
async productClicked(e) {
|
10595
10636
|
var _a, _b;
|
10596
10637
|
e.stopPropagation();
|
10597
10638
|
setProductAction(this.destination, this.sessionId, e.detail.id, 'clicked', true);
|
10598
|
-
|
10639
|
+
const siteCurrency = await this.getSiteCurrency();
|
10640
|
+
this.shopGPTAPI.sendEvent('productRecommendationClicked', siteCurrency.currency, {
|
10599
10641
|
productId: e.detail.id,
|
10600
10642
|
value: e.detail.value,
|
10601
10643
|
isPrompt: this.isPreviousMessagePrompt,
|
@@ -10603,15 +10645,15 @@ class ShopGPT extends i$1 {
|
|
10603
10645
|
threadId: this.selectedThreadId,
|
10604
10646
|
query: (_a = e.detail.query) !== null && _a !== void 0 ? _a : '',
|
10605
10647
|
response: (_b = e.detail.response) !== null && _b !== void 0 ? _b : '',
|
10606
|
-
currency:
|
10648
|
+
currency: siteCurrency.currency,
|
10607
10649
|
variantId: e.detail.variantId,
|
10608
10650
|
url: e.detail.url,
|
10609
10651
|
title: e.detail.title,
|
10610
10652
|
rank: e.detail.rank,
|
10611
10653
|
}, true);
|
10612
10654
|
}
|
10613
|
-
getSiteCurrency() {
|
10614
|
-
return this.storeAPI.getSiteCurrency();
|
10655
|
+
async getSiteCurrency() {
|
10656
|
+
return await this.storeAPI.getSiteCurrency();
|
10615
10657
|
}
|
10616
10658
|
overlayMode() {
|
10617
10659
|
const thread = this.chatThreads.get(this.selectedThreadId);
|
@@ -10681,6 +10723,7 @@ class ShopGPT extends i$1 {
|
|
10681
10723
|
const thread = this.chatThreads.get(this.selectedThreadId);
|
10682
10724
|
const closeModal = () => {
|
10683
10725
|
this.modalState = 'close';
|
10726
|
+
this.supportRequested = false;
|
10684
10727
|
this.shopGPTAPI.sendEvent('chatbotClosed');
|
10685
10728
|
};
|
10686
10729
|
return x `
|
@@ -10696,7 +10739,9 @@ class ShopGPT extends i$1 {
|
|
10696
10739
|
@submit-user-data=${this.submitUserData}
|
10697
10740
|
>
|
10698
10741
|
<popup-view
|
10699
|
-
.prompts=${this.
|
10742
|
+
.prompts=${this.supportRequested
|
10743
|
+
? SUPPORT_PROMPTS
|
10744
|
+
: this.quickPrompts}
|
10700
10745
|
.brandName=${this.brandName}
|
10701
10746
|
.isFailed=${this.isFailed}
|
10702
10747
|
.isLoadingHistory=${this.isLoadingHistory}
|
@@ -10736,7 +10781,7 @@ class ShopGPT extends i$1 {
|
|
10736
10781
|
>
|
10737
10782
|
<chatbot-icon .css=${this.css}></chatbot-icon>
|
10738
10783
|
</button>
|
10739
|
-
${((_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
|
10740
10785
|
? x ` <div class="nudge">
|
10741
10786
|
<chat-nudge
|
10742
10787
|
.brandName=${this.brandName}
|
@@ -10761,6 +10806,13 @@ class ShopGPT extends i$1 {
|
|
10761
10806
|
}
|
10762
10807
|
startNudgeTimer() {
|
10763
10808
|
var _a, _b;
|
10809
|
+
if (hasNudgeOverride()) {
|
10810
|
+
this.nudgeTimer = window.setTimeout(() => {
|
10811
|
+
this.playNudgeSound();
|
10812
|
+
this.showNudge = true;
|
10813
|
+
}, 2000);
|
10814
|
+
return;
|
10815
|
+
}
|
10764
10816
|
if (this.view !== 'modal' || !((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show)) {
|
10765
10817
|
return;
|
10766
10818
|
}
|
@@ -10777,6 +10829,13 @@ class ShopGPT extends i$1 {
|
|
10777
10829
|
}
|
10778
10830
|
playNudgeSound() {
|
10779
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
|
+
}
|
10780
10839
|
if (!((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.sound) || !navigator.userActivation.hasBeenActive) {
|
10781
10840
|
return;
|
10782
10841
|
}
|
@@ -10867,6 +10926,10 @@ __decorate([
|
|
10867
10926
|
r$1(),
|
10868
10927
|
__metadata("design:type", Object)
|
10869
10928
|
], ShopGPT.prototype, "shouldAskUserEmail", void 0);
|
10929
|
+
__decorate([
|
10930
|
+
r$1(),
|
10931
|
+
__metadata("design:type", Object)
|
10932
|
+
], ShopGPT.prototype, "supportRequested", void 0);
|
10870
10933
|
if (!customElements.get('shop-gpt')) {
|
10871
10934
|
customElements.define('shop-gpt', ShopGPT);
|
10872
10935
|
}
|
package/package.json
CHANGED
@@ -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:
|
32
|
-
rate:
|
139
|
+
currency: 'USD',
|
140
|
+
rate: 1,
|
33
141
|
};
|
34
142
|
},
|
35
143
|
getCurrentProductHandle() {
|
package/stores/shopify/index.js
CHANGED
@@ -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:
|
33
|
-
rate:
|
140
|
+
currency: 'USD',
|
141
|
+
rate: 1,
|
34
142
|
};
|
35
143
|
},
|
36
144
|
getCurrentProductHandle() {
|