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