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