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