@blotoutio/providers-shop-gpt-sdk 1.9.1 → 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.
- package/index.cjs.js +529 -35
- package/index.js +529 -35
- package/index.mjs +529 -35
- 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,
|
909
|
+
});
|
910
|
+
if (!loadUiManually) {
|
911
|
+
uiImplementation.loadUI();
|
912
|
+
}
|
913
|
+
}
|
914
|
+
};
|
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);
|
660
935
|
});
|
661
936
|
}
|
937
|
+
return {
|
938
|
+
session: getProductActions(destination),
|
939
|
+
preview: hasPreviewKey(),
|
940
|
+
isShopGPTLoaded: (_a = getShopGPTLoaded(destination)) !== null && _a !== void 0 ? _a : false,
|
941
|
+
};
|
662
942
|
};
|
663
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=${() => {
|
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=${() => {
|
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=${() => {
|
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 = {
|
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) =>
|
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
|
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
|
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;
|
@@ -4310,12 +4694,15 @@ ${this.comment ? this.comment : E}</textarea
|
|
4310
4694
|
return result;
|
4311
4695
|
};
|
4312
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
|
+
|
4313
4699
|
const DIALOG_DELAY = 1000;
|
4314
4700
|
const normalizePath = (path) => path.replace(/\/$/, '');
|
4315
4701
|
class ShopGPT extends r$2 {
|
4316
4702
|
constructor() {
|
4317
4703
|
super(...arguments);
|
4318
4704
|
this.isStylesheetInjected = false;
|
4705
|
+
this.isPreviousMessagePrompt = false;
|
4319
4706
|
this.latestThreadLoad = DEFAULT_MAX_THREAD_AGE;
|
4320
4707
|
this.modalState = 'close';
|
4321
4708
|
this.isLoadingHistory = false;
|
@@ -4327,6 +4714,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4327
4714
|
this.messages = [];
|
4328
4715
|
this.chatThreads = new Map();
|
4329
4716
|
this.customPrompts = [];
|
4717
|
+
this.hasUserInteracted = false;
|
4718
|
+
this.showNudge = false;
|
4330
4719
|
this.loadData = async () => {
|
4331
4720
|
if (!this.shopGPTAPI) {
|
4332
4721
|
return;
|
@@ -4367,17 +4756,23 @@ ${this.comment ? this.comment : E}</textarea
|
|
4367
4756
|
}
|
4368
4757
|
}
|
4369
4758
|
this.init();
|
4759
|
+
this.startNudgeTimer();
|
4370
4760
|
}
|
4371
4761
|
disconnectedCallback() {
|
4372
4762
|
window.removeEventListener('edgetag-initialized', this.loadData);
|
4373
4763
|
window.removeEventListener('popstate', this.onPopState);
|
4764
|
+
if (this.nudgeTimer) {
|
4765
|
+
window.clearTimeout(this.nudgeTimer);
|
4766
|
+
}
|
4374
4767
|
super.disconnectedCallback();
|
4375
4768
|
}
|
4376
4769
|
init() {
|
4377
4770
|
window.addEventListener('edgetag-initialized', this.loadData);
|
4378
4771
|
window.addEventListener('popstate', this.onPopState);
|
4772
|
+
this.shopGPTAPI.sendEvent('shopGPTInitialized', this.getSiteCurrency().currency);
|
4379
4773
|
if (!this.view || this.view === 'overlay') {
|
4380
|
-
delay(DIALOG_DELAY)
|
4774
|
+
delay(DIALOG_DELAY)
|
4775
|
+
.then(() => {
|
4381
4776
|
var _a;
|
4382
4777
|
if (document.hidden) {
|
4383
4778
|
document.addEventListener('visibilitychange', () => { var _a; return (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal(); }, {
|
@@ -4387,7 +4782,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4387
4782
|
else {
|
4388
4783
|
(_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal();
|
4389
4784
|
}
|
4390
|
-
})
|
4785
|
+
})
|
4786
|
+
.catch(logger.error);
|
4391
4787
|
}
|
4392
4788
|
}
|
4393
4789
|
setChatTitle(threadId, title) {
|
@@ -4415,8 +4811,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4415
4811
|
if (!thread) {
|
4416
4812
|
return;
|
4417
4813
|
}
|
4418
|
-
const
|
4419
|
-
const fromAd =
|
4814
|
+
const searchParams = new URLSearchParams(window.location.search);
|
4815
|
+
const fromAd = isFromAd(searchParams) || searchParams.get('shopGPT') === '1';
|
4420
4816
|
const productHandle = this.devMode
|
4421
4817
|
? (_a = thread === null || thread === void 0 ? void 0 : thread.devContext) === null || _a === void 0 ? void 0 : _a.productHandle
|
4422
4818
|
: fromAd
|
@@ -4653,7 +5049,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4653
5049
|
}
|
4654
5050
|
});
|
4655
5051
|
}
|
4656
|
-
async sendMessageToServer(e, message) {
|
5052
|
+
async sendMessageToServer(e, message, isPrompt = false) {
|
4657
5053
|
e.preventDefault();
|
4658
5054
|
e.stopPropagation();
|
4659
5055
|
if (!message || this.isTyping || this.isLoadingHistory) {
|
@@ -4661,6 +5057,10 @@ ${this.comment ? this.comment : E}</textarea
|
|
4661
5057
|
}
|
4662
5058
|
this.isFailed = false;
|
4663
5059
|
try {
|
5060
|
+
this.isPreviousMessagePrompt = isPrompt;
|
5061
|
+
if (!isPrompt) {
|
5062
|
+
this.shopGPTAPI.sendEvent('queryInteractions', this.getSiteCurrency().currency);
|
5063
|
+
}
|
4664
5064
|
this.messages = [{ sender: 'user', message }, ...this.messages];
|
4665
5065
|
this.isTyping = true;
|
4666
5066
|
const response = await this.submitQuery(message);
|
@@ -4675,7 +5075,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4675
5075
|
submitFeedback(e) {
|
4676
5076
|
e.stopPropagation();
|
4677
5077
|
this.shopGPTAPI
|
4678
|
-
.saveFeedback(e.detail.messageId, e.detail.feedback)
|
5078
|
+
.saveFeedback(e.detail.messageId, e.detail.threadId, e.detail.feedback)
|
4679
5079
|
.then(() => {
|
4680
5080
|
const messages = this.messages;
|
4681
5081
|
const messageIndex = messages.findIndex(({ messageId }) => messageId === e.detail.messageId);
|
@@ -4684,17 +5084,25 @@ ${this.comment ? this.comment : E}</textarea
|
|
4684
5084
|
feedback: e.detail.feedback,
|
4685
5085
|
};
|
4686
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,
|
4687
5101
|
});
|
4688
5102
|
}
|
4689
5103
|
getSiteCurrency() {
|
4690
5104
|
return this.storeAPI.getSiteCurrency();
|
4691
5105
|
}
|
4692
|
-
render() {
|
4693
|
-
if (this.view === 'modal') {
|
4694
|
-
return this.modalMode();
|
4695
|
-
}
|
4696
|
-
return this.overlayMode();
|
4697
|
-
}
|
4698
5106
|
overlayMode() {
|
4699
5107
|
const thread = this.chatThreads.get(this.selectedThreadId);
|
4700
5108
|
return x `
|
@@ -4703,6 +5111,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4703
5111
|
@delete-thread=${this.handleThreadDelete}
|
4704
5112
|
@delete-all-threads=${this.handleAllThreadsDelete}
|
4705
5113
|
@submit-feedback=${this.submitFeedback}
|
5114
|
+
@send-event=${this.sendEvent}
|
5115
|
+
@product-clicked=${this.productClicked}
|
4706
5116
|
>
|
4707
5117
|
<div class="mobile-version">
|
4708
5118
|
Please switch to the desktop version for the best experience.
|
@@ -4750,6 +5160,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4750
5160
|
`;
|
4751
5161
|
}
|
4752
5162
|
modalMode() {
|
5163
|
+
var _a;
|
4753
5164
|
const thread = this.chatThreads.get(this.selectedThreadId);
|
4754
5165
|
const closeModal = () => {
|
4755
5166
|
this.modalState = 'close';
|
@@ -4759,12 +5170,28 @@ ${this.comment ? this.comment : E}</textarea
|
|
4759
5170
|
<button
|
4760
5171
|
@click=${(e) => {
|
4761
5172
|
e.preventDefault();
|
5173
|
+
this.shopGPTAPI.sendEvent('chatbotOpened', this.getSiteCurrency().currency);
|
4762
5174
|
this.modalState = 'open';
|
5175
|
+
this.handleUserInteraction();
|
4763
5176
|
}}
|
4764
5177
|
>
|
4765
5178
|
${chatIcon}
|
4766
5179
|
</button>
|
4767
|
-
|
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>`}
|
4768
5195
|
</div>`;
|
4769
5196
|
}
|
4770
5197
|
return x `
|
@@ -4773,6 +5200,9 @@ ${this.comment ? this.comment : E}</textarea
|
|
4773
5200
|
@delete-thread=${this.handleThreadDelete}
|
4774
5201
|
@delete-all-threads=${this.handleAllThreadsDelete}
|
4775
5202
|
@submit-feedback=${this.submitFeedback}
|
5203
|
+
@click=${this.handleUserInteraction}
|
5204
|
+
@send-event=${this.sendEvent}
|
5205
|
+
@product-clicked=${this.productClicked}
|
4776
5206
|
>
|
4777
5207
|
<chat-section
|
4778
5208
|
.prompts=${this.quickPrompts}
|
@@ -4801,6 +5231,48 @@ ${this.comment ? this.comment : E}</textarea
|
|
4801
5231
|
</div>
|
4802
5232
|
`;
|
4803
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
|
+
}
|
4804
5276
|
}
|
4805
5277
|
ShopGPT.styles = [shopGPTStyles];
|
4806
5278
|
__decorate([
|
@@ -4851,6 +5323,14 @@ ${this.comment ? this.comment : E}</textarea
|
|
4851
5323
|
n({ type: Array }),
|
4852
5324
|
__metadata("design:type", Array)
|
4853
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);
|
4854
5334
|
if (!customElements.get('shop-gpt')) {
|
4855
5335
|
customElements.define('shop-gpt', ShopGPT);
|
4856
5336
|
}
|
@@ -4866,6 +5346,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4866
5346
|
return;
|
4867
5347
|
}
|
4868
5348
|
shopGPT = document.createElement('shop-gpt');
|
5349
|
+
shopGPT.destination = params.destination;
|
4869
5350
|
shopGPT.storeAPI = params.storeAPI;
|
4870
5351
|
shopGPT.shopGPTAPI = params.shopGPTAPI;
|
4871
5352
|
shopGPT.devMode = params.devMode;
|
@@ -4880,12 +5361,25 @@ ${this.comment ? this.comment : E}</textarea
|
|
4880
5361
|
shopGPT.latestThreadLoad = params.latestThreadLoad;
|
4881
5362
|
shopGPT.botIconUrl = params.botIconUrl;
|
4882
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
|
+
}
|
4883
5375
|
document.body.append(shopGPT);
|
5376
|
+
setShopGPTLoaded(shopGPT.destination, true);
|
4884
5377
|
},
|
4885
5378
|
destroy() {
|
4886
5379
|
if (!shopGPT) {
|
4887
5380
|
return;
|
4888
5381
|
}
|
5382
|
+
setShopGPTLoaded(shopGPT.destination, false);
|
4889
5383
|
shopGPT.remove();
|
4890
5384
|
shopGPT = undefined;
|
4891
5385
|
delete window[registryKey];
|