@blotoutio/providers-shop-gpt-sdk 1.9.0 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.cjs.js +539 -36
- package/index.js +539 -36
- package/index.mjs +539 -36
- package/package.json +1 -1
package/index.js
CHANGED
@@ -409,10 +409,65 @@ var ProvidersShopGptSdk = (function () {
|
|
409
409
|
}
|
410
410
|
};
|
411
411
|
|
412
|
+
const uiActions = new Set([
|
413
|
+
'shopGPTInitialized',
|
414
|
+
'chatbotOpened',
|
415
|
+
'queryInteractions',
|
416
|
+
'promptClicked',
|
417
|
+
'productRecommendationClicked',
|
418
|
+
]);
|
419
|
+
new Set([
|
420
|
+
...uiActions,
|
421
|
+
'pageView',
|
422
|
+
'productRecommendationViewed',
|
423
|
+
'productRecommendationAddedToCart',
|
424
|
+
'productRecommendationInitiatedCheckout',
|
425
|
+
'orderPlaced',
|
426
|
+
]);
|
427
|
+
|
412
428
|
const packageName = 'shopGPT';
|
413
|
-
const DEFAULT_MAX_THREAD_AGE = 14;
|
429
|
+
const DEFAULT_MAX_THREAD_AGE = 14; // in days
|
430
|
+
const DEFAULT_NUDGE_TIMEOUT = 10; // in seconds
|
414
431
|
const previewKeyName = 'previewShopGPT';
|
415
432
|
|
433
|
+
const keyPrefix = `_worker`;
|
434
|
+
|
435
|
+
const getCookieValue = (key) => {
|
436
|
+
var _a;
|
437
|
+
try {
|
438
|
+
if (!document || !document.cookie) {
|
439
|
+
return '';
|
440
|
+
}
|
441
|
+
const cookies = parseCookies(document.cookie);
|
442
|
+
return (_a = cookies[key]) !== null && _a !== void 0 ? _a : '';
|
443
|
+
}
|
444
|
+
catch {
|
445
|
+
return '';
|
446
|
+
}
|
447
|
+
};
|
448
|
+
const parseCookies = (cookie) => {
|
449
|
+
return Object.fromEntries(cookie
|
450
|
+
.split(/;\s+/)
|
451
|
+
.map((r) => r.split('=').map((str) => str.trim()))
|
452
|
+
.map(([cookieKey, ...cookieValues]) => {
|
453
|
+
const cookieValue = cookieValues.join('=');
|
454
|
+
if (!cookieKey) {
|
455
|
+
return [];
|
456
|
+
}
|
457
|
+
let decodedValue = '';
|
458
|
+
if (cookieValue) {
|
459
|
+
try {
|
460
|
+
decodedValue = decodeURIComponent(cookieValue);
|
461
|
+
}
|
462
|
+
catch (e) {
|
463
|
+
console.log(`Unable to decode cookie ${cookieKey}: ${e}`);
|
464
|
+
decodedValue = cookieValue;
|
465
|
+
}
|
466
|
+
}
|
467
|
+
return [cookieKey, decodedValue];
|
468
|
+
}));
|
469
|
+
};
|
470
|
+
|
416
471
|
const canLog = () => {
|
417
472
|
try {
|
418
473
|
return localStorage.getItem('edgeTagDebug') === '1';
|
@@ -445,12 +500,188 @@ var ProvidersShopGptSdk = (function () {
|
|
445
500
|
},
|
446
501
|
};
|
447
502
|
|
503
|
+
const initKey = `${keyPrefix}StoreMultiple`;
|
504
|
+
const saveData = (destination, persistType, value, key = initKey) => {
|
505
|
+
if (persistType === 'session') {
|
506
|
+
const data = getSession(key);
|
507
|
+
data[destination] = value;
|
508
|
+
saveSession(data, key);
|
509
|
+
return;
|
510
|
+
}
|
511
|
+
const data = getLocal(key);
|
512
|
+
data[destination] = value;
|
513
|
+
saveLocal(data, key);
|
514
|
+
};
|
515
|
+
const getData = (destination, persistType, key = initKey) => {
|
516
|
+
let data;
|
517
|
+
if (persistType === 'session') {
|
518
|
+
data = getSession(key);
|
519
|
+
}
|
520
|
+
else {
|
521
|
+
data = getLocal(key);
|
522
|
+
}
|
523
|
+
return (data === null || data === void 0 ? void 0 : data[destination]) || {};
|
524
|
+
};
|
525
|
+
const saveLocal = (value, key) => {
|
526
|
+
try {
|
527
|
+
if (!localStorage) {
|
528
|
+
return;
|
529
|
+
}
|
530
|
+
localStorage.setItem(key, JSON.stringify(value));
|
531
|
+
}
|
532
|
+
catch {
|
533
|
+
logger.log('Local storage not supported.');
|
534
|
+
}
|
535
|
+
};
|
536
|
+
const getLocal = (key) => {
|
537
|
+
try {
|
538
|
+
if (!localStorage) {
|
539
|
+
return {};
|
540
|
+
}
|
541
|
+
const data = localStorage.getItem(key);
|
542
|
+
if (!data) {
|
543
|
+
return {};
|
544
|
+
}
|
545
|
+
return JSON.parse(data) || {};
|
546
|
+
}
|
547
|
+
catch {
|
548
|
+
return {};
|
549
|
+
}
|
550
|
+
};
|
551
|
+
const saveSession = (value, key) => {
|
552
|
+
try {
|
553
|
+
if (!sessionStorage) {
|
554
|
+
return;
|
555
|
+
}
|
556
|
+
sessionStorage.setItem(key, JSON.stringify(value));
|
557
|
+
}
|
558
|
+
catch {
|
559
|
+
logger.log('Session storage not supported.');
|
560
|
+
}
|
561
|
+
};
|
562
|
+
const getSession = (key) => {
|
563
|
+
try {
|
564
|
+
if (!sessionStorage) {
|
565
|
+
return {};
|
566
|
+
}
|
567
|
+
const data = sessionStorage.getItem(key);
|
568
|
+
if (!data) {
|
569
|
+
return {};
|
570
|
+
}
|
571
|
+
return JSON.parse(data) || {};
|
572
|
+
}
|
573
|
+
catch {
|
574
|
+
return {};
|
575
|
+
}
|
576
|
+
};
|
577
|
+
|
448
578
|
var _a$1;
|
449
579
|
const registryKey = Symbol.for('shop-gpt');
|
450
580
|
if (typeof window != 'undefined') {
|
451
581
|
(_a$1 = window[registryKey]) !== null && _a$1 !== void 0 ? _a$1 : (window[registryKey] = {});
|
452
582
|
}
|
453
583
|
|
584
|
+
const SHOP_GPT_SESSION_KEY = 'shopGPTSession';
|
585
|
+
const SHOP_GPT_LOCAL_STORAGE_KEY = 'shopGPTLocalStorage';
|
586
|
+
const getSessionData = (destination) => {
|
587
|
+
const session = getData(destination, 'session', SHOP_GPT_SESSION_KEY);
|
588
|
+
return session;
|
589
|
+
};
|
590
|
+
const saveSessionData = (destination, data) => {
|
591
|
+
saveData(destination, 'session', data, SHOP_GPT_SESSION_KEY);
|
592
|
+
};
|
593
|
+
const getLocalStorageData = (destination) => {
|
594
|
+
const local = getData(destination, 'local', SHOP_GPT_LOCAL_STORAGE_KEY);
|
595
|
+
return local;
|
596
|
+
};
|
597
|
+
const saveLocalStorageData = (destination, data) => {
|
598
|
+
saveData(destination, 'local', data, SHOP_GPT_LOCAL_STORAGE_KEY);
|
599
|
+
};
|
600
|
+
const getSessionId = () => {
|
601
|
+
return getCookieValue('tag_session');
|
602
|
+
};
|
603
|
+
|
604
|
+
// eslint-disable-next-line @nx/enforce-module-boundaries
|
605
|
+
const hasPreviewKey = () => {
|
606
|
+
var _a;
|
607
|
+
try {
|
608
|
+
return ((_a = sessionStorage.getItem(previewKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
|
609
|
+
}
|
610
|
+
catch {
|
611
|
+
return false;
|
612
|
+
}
|
613
|
+
};
|
614
|
+
const isUserInteracted = (destination) => {
|
615
|
+
var _a;
|
616
|
+
const session = getSessionData(destination);
|
617
|
+
return !!((_a = session === null || session === void 0 ? void 0 : session.chatbot) === null || _a === void 0 ? void 0 : _a.hasUserInteracted);
|
618
|
+
};
|
619
|
+
const setUserInteracted = (destination) => {
|
620
|
+
const session = getSessionData(destination);
|
621
|
+
saveSessionData(destination, {
|
622
|
+
...session,
|
623
|
+
chatbot: { ...session === null || session === void 0 ? void 0 : session.chatbot, hasUserInteracted: true },
|
624
|
+
});
|
625
|
+
};
|
626
|
+
const getProductActions = (destination) => {
|
627
|
+
var _a;
|
628
|
+
const local = getLocalStorageData(destination);
|
629
|
+
const sessionId = getSessionId();
|
630
|
+
if (!local || !sessionId) {
|
631
|
+
logger.error('No local storage data or session id');
|
632
|
+
return null;
|
633
|
+
}
|
634
|
+
return (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products;
|
635
|
+
};
|
636
|
+
const setProductAction = (destination, productId, action, value) => {
|
637
|
+
var _a, _b, _c;
|
638
|
+
const local = getLocalStorageData(destination);
|
639
|
+
const sessionId = getSessionId();
|
640
|
+
if (!local || !sessionId) {
|
641
|
+
logger.error('No local storage data or session id');
|
642
|
+
return;
|
643
|
+
}
|
644
|
+
const productTags = (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.products) === null || _b === void 0 ? void 0 : _b[productId];
|
645
|
+
local[sessionId] = {
|
646
|
+
...local[sessionId],
|
647
|
+
products: {
|
648
|
+
...(_c = local[sessionId]) === null || _c === void 0 ? void 0 : _c.products,
|
649
|
+
[productId]: {
|
650
|
+
...productTags,
|
651
|
+
[action]: value,
|
652
|
+
},
|
653
|
+
},
|
654
|
+
};
|
655
|
+
// Clear other sessions
|
656
|
+
const updatedLocal = { [sessionId]: local[sessionId] };
|
657
|
+
saveLocalStorageData(destination, updatedLocal);
|
658
|
+
};
|
659
|
+
const getShopGPTLoaded = (destination) => {
|
660
|
+
var _a, _b;
|
661
|
+
const local = getLocalStorageData(destination);
|
662
|
+
const sessionId = getSessionId();
|
663
|
+
if (!local || !sessionId) {
|
664
|
+
logger.error('No local storage data or session id');
|
665
|
+
return false;
|
666
|
+
}
|
667
|
+
return (_b = (_a = local[sessionId]) === null || _a === void 0 ? void 0 : _a.isShopGPTLoaded) !== null && _b !== void 0 ? _b : false;
|
668
|
+
};
|
669
|
+
const setShopGPTLoaded = (destination, value) => {
|
670
|
+
const local = getLocalStorageData(destination);
|
671
|
+
const sessionId = getSessionId();
|
672
|
+
if (!local || !sessionId) {
|
673
|
+
logger.error('No local storage data or session id');
|
674
|
+
return;
|
675
|
+
}
|
676
|
+
local[sessionId] = {
|
677
|
+
...local[sessionId],
|
678
|
+
isShopGPTLoaded: value,
|
679
|
+
};
|
680
|
+
// Clear other sessions
|
681
|
+
const updatedLocal = { [sessionId]: local[sessionId] };
|
682
|
+
saveLocalStorageData(destination, updatedLocal);
|
683
|
+
};
|
684
|
+
|
454
685
|
const createShopGPTAPI = ({ fetch: fetchImpl = window.fetch, baseURL, userId, storeAPI, }) => {
|
455
686
|
if (!baseURL) {
|
456
687
|
throw new Error(`baseURL missing`);
|
@@ -553,13 +784,14 @@ var ProvidersShopGptSdk = (function () {
|
|
553
784
|
throw new Error(`Failed to delete all chat threads - ${response.status}: ${await response.text()}`);
|
554
785
|
}
|
555
786
|
};
|
556
|
-
const saveFeedback = async (messageId, feedback) => {
|
787
|
+
const saveFeedback = async (messageId, threadId, feedback) => {
|
557
788
|
const response = await fetchImpl(getURL('/feedback'), {
|
558
789
|
method: 'POST',
|
559
790
|
headers: getHeaders(),
|
560
791
|
credentials: 'include',
|
561
792
|
body: JSON.stringify({
|
562
793
|
messageId,
|
794
|
+
threadId,
|
563
795
|
feedback,
|
564
796
|
}),
|
565
797
|
});
|
@@ -579,6 +811,28 @@ var ProvidersShopGptSdk = (function () {
|
|
579
811
|
const data = (await response.json());
|
580
812
|
return data.customPrompts;
|
581
813
|
};
|
814
|
+
const sendEvent = async (action, currency, actionData) => {
|
815
|
+
var _a;
|
816
|
+
const storageData = (_a = getProductActions(baseURL)) !== null && _a !== void 0 ? _a : {};
|
817
|
+
const response = await fetchImpl(getURL('/user/event'), {
|
818
|
+
method: 'POST',
|
819
|
+
headers: getHeaders(true),
|
820
|
+
body: JSON.stringify({
|
821
|
+
action,
|
822
|
+
currency,
|
823
|
+
actionData,
|
824
|
+
storageData: {
|
825
|
+
session: storageData,
|
826
|
+
preview: hasPreviewKey(),
|
827
|
+
isShopGPTLoaded: true, // The fact that sendEvent was called means that the ShopGPT is loaded
|
828
|
+
},
|
829
|
+
}),
|
830
|
+
credentials: 'include',
|
831
|
+
});
|
832
|
+
if (!response.ok) {
|
833
|
+
throw new Error(`Error while recording user event - ${response.status}: ${response.statusText}\n\n${await response.text()}`);
|
834
|
+
}
|
835
|
+
};
|
582
836
|
return {
|
583
837
|
processQuery,
|
584
838
|
fetchChatHistory,
|
@@ -588,20 +842,12 @@ var ProvidersShopGptSdk = (function () {
|
|
588
842
|
deleteAllThreads,
|
589
843
|
saveFeedback,
|
590
844
|
fetchCustomPrompts,
|
845
|
+
sendEvent,
|
591
846
|
};
|
592
847
|
};
|
593
848
|
|
594
849
|
// eslint-disable-next-line @nx/enforce-module-boundaries
|
595
850
|
const error = (message) => console.error(message);
|
596
|
-
const hasPreviewKey = () => {
|
597
|
-
var _a;
|
598
|
-
try {
|
599
|
-
return ((_a = sessionStorage.getItem(previewKeyName)) !== null && _a !== void 0 ? _a : '0') == '1';
|
600
|
-
}
|
601
|
-
catch {
|
602
|
-
return false;
|
603
|
-
}
|
604
|
-
};
|
605
851
|
const init = (params) => {
|
606
852
|
var _a, _b, _c;
|
607
853
|
if (typeof window == 'undefined' || typeof document == 'undefined') {
|
@@ -621,7 +867,8 @@ var ProvidersShopGptSdk = (function () {
|
|
621
867
|
// exit if not in top window
|
622
868
|
return;
|
623
869
|
}
|
624
|
-
const { enabled, mode, devMode, merchantUrl, profiles, productHandles, targetPath, view, brandName, quickPrompts, merchantImage, latestThreadLoad, botIconUrl, css, } = (_c = params.manifest.variables) !== null && _c !== void 0 ? _c : {};
|
870
|
+
const { enabled, mode, devMode, merchantUrl, profiles, productHandles, targetPath, view, brandName, quickPrompts, merchantImage, latestThreadLoad, botIconUrl, css, nudge, loadUiManually, } = (_c = params.manifest.variables) !== null && _c !== void 0 ? _c : {};
|
871
|
+
setShopGPTLoaded(params.baseUrl, !loadUiManually);
|
625
872
|
const experiment = createExperiment({
|
626
873
|
name: getExperimentName(mode),
|
627
874
|
userId: params.userId,
|
@@ -643,6 +890,7 @@ var ProvidersShopGptSdk = (function () {
|
|
643
890
|
userId: params.userId,
|
644
891
|
});
|
645
892
|
uiImplementation.init({
|
893
|
+
destination: params.baseUrl,
|
646
894
|
storeAPI,
|
647
895
|
shopGPTAPI,
|
648
896
|
devMode,
|
@@ -657,14 +905,47 @@ var ProvidersShopGptSdk = (function () {
|
|
657
905
|
latestThreadLoad: latestThreadLoad !== null && latestThreadLoad !== void 0 ? latestThreadLoad : DEFAULT_MAX_THREAD_AGE,
|
658
906
|
botIconUrl,
|
659
907
|
css,
|
908
|
+
nudge,
|
660
909
|
});
|
910
|
+
if (!loadUiManually) {
|
911
|
+
uiImplementation.loadUI();
|
912
|
+
}
|
661
913
|
}
|
662
914
|
};
|
663
915
|
|
916
|
+
const getClickedProductsInContents = (destination, data) => {
|
917
|
+
const storedData = getProductActions(destination);
|
918
|
+
const contents = data['contents'];
|
919
|
+
if (!contents || !Array.isArray(contents) || !storedData) {
|
920
|
+
return;
|
921
|
+
}
|
922
|
+
return contents.flatMap((content) => { var _a; return ((_a = storedData[content.id]) === null || _a === void 0 ? void 0 : _a.clicked) ? [content.id] : []; });
|
923
|
+
};
|
924
|
+
const tag = ({ eventName, destination, data, }) => {
|
925
|
+
var _a;
|
926
|
+
const clickedProducts = getClickedProductsInContents(destination, data);
|
927
|
+
if (eventName === 'AddToCart') {
|
928
|
+
clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
|
929
|
+
setProductAction(destination, id, 'addToCart', true);
|
930
|
+
});
|
931
|
+
}
|
932
|
+
else if (eventName == 'RemoveFromCart') {
|
933
|
+
clickedProducts === null || clickedProducts === void 0 ? void 0 : clickedProducts.forEach((id) => {
|
934
|
+
setProductAction(destination, id, 'addToCart', false);
|
935
|
+
});
|
936
|
+
}
|
937
|
+
return {
|
938
|
+
session: getProductActions(destination),
|
939
|
+
preview: hasPreviewKey(),
|
940
|
+
isShopGPTLoaded: (_a = getShopGPTLoaded(destination)) !== null && _a !== void 0 ? _a : false,
|
941
|
+
};
|
942
|
+
};
|
943
|
+
|
664
944
|
// eslint-disable-next-line @nx/enforce-module-boundaries
|
665
945
|
const data = {
|
666
946
|
name: packageName,
|
667
947
|
init,
|
948
|
+
tag,
|
668
949
|
};
|
669
950
|
try {
|
670
951
|
if (typeof window !== 'undefined') {
|
@@ -877,6 +1158,29 @@ var ProvidersShopGptSdk = (function () {
|
|
877
1158
|
line-height: 150%;
|
878
1159
|
}
|
879
1160
|
|
1161
|
+
.nudge {
|
1162
|
+
position: absolute;
|
1163
|
+
color: var(--shopgpt-secondary);
|
1164
|
+
padding: 12px 16px;
|
1165
|
+
font-size: 16px;
|
1166
|
+
line-height: 21px;
|
1167
|
+
background: var(--shopgpt-warning);
|
1168
|
+
border-radius: 5px;
|
1169
|
+
box-shadow: 0px 4px 6px -1px rgba(0, 0, 0, 0.1),
|
1170
|
+
0px 2px 4px -1px rgba(0, 0, 0, 0.06);
|
1171
|
+
font-weight: 400;
|
1172
|
+
line-height: 150%;
|
1173
|
+
right: calc(100% + 10px);
|
1174
|
+
top: 0%;
|
1175
|
+
transform: translateY(-50%);
|
1176
|
+
animation: slideIn 0.5s ease-out forwards;
|
1177
|
+
opacity: 0;
|
1178
|
+
cursor: pointer;
|
1179
|
+
width: 260px;
|
1180
|
+
white-space: normal;
|
1181
|
+
word-wrap: break-word;
|
1182
|
+
}
|
1183
|
+
|
880
1184
|
&:hover {
|
881
1185
|
.chatbot-hover-text {
|
882
1186
|
opacity: 1;
|
@@ -884,6 +1188,17 @@ var ProvidersShopGptSdk = (function () {
|
|
884
1188
|
}
|
885
1189
|
}
|
886
1190
|
|
1191
|
+
@keyframes slideIn {
|
1192
|
+
from {
|
1193
|
+
transform: translate(20px, -50%);
|
1194
|
+
opacity: 0;
|
1195
|
+
}
|
1196
|
+
to {
|
1197
|
+
transform: translate(0, -50%);
|
1198
|
+
opacity: 1;
|
1199
|
+
}
|
1200
|
+
}
|
1201
|
+
|
887
1202
|
.mobile-version {
|
888
1203
|
display: none;
|
889
1204
|
|
@@ -1634,19 +1949,38 @@ var ProvidersShopGptSdk = (function () {
|
|
1634
1949
|
<p class="product-variation-details">${option.name}: ${option.value}</p>
|
1635
1950
|
`);
|
1636
1951
|
}
|
1952
|
+
productClicked(productId, price, url) {
|
1953
|
+
if (productId) {
|
1954
|
+
this.dispatchEvent(new CustomEvent('product-clicked', {
|
1955
|
+
detail: {
|
1956
|
+
productId,
|
1957
|
+
value: price ? parseFloat(price) : undefined,
|
1958
|
+
},
|
1959
|
+
composed: true,
|
1960
|
+
bubbles: true,
|
1961
|
+
}));
|
1962
|
+
}
|
1963
|
+
this.redirect(url);
|
1964
|
+
}
|
1637
1965
|
render() {
|
1638
1966
|
return x `
|
1639
1967
|
<div class="product">
|
1640
1968
|
<img
|
1641
1969
|
src=${this.product.image.url}
|
1642
1970
|
alt=${this.product.image.alt}
|
1643
|
-
@click=${() => {
|
1971
|
+
@click=${() => {
|
1972
|
+
var _a;
|
1973
|
+
return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
|
1974
|
+
}}
|
1644
1975
|
/>
|
1645
1976
|
<div class="content">
|
1646
1977
|
<p
|
1647
1978
|
class="product-name"
|
1648
1979
|
title=${this.product.title}
|
1649
|
-
@click=${() => {
|
1980
|
+
@click=${() => {
|
1981
|
+
var _a;
|
1982
|
+
return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
|
1983
|
+
}}
|
1650
1984
|
>
|
1651
1985
|
${this.product.title}
|
1652
1986
|
</p>
|
@@ -1657,7 +1991,10 @@ var ProvidersShopGptSdk = (function () {
|
|
1657
1991
|
</div>
|
1658
1992
|
<button
|
1659
1993
|
class="btn-view-product"
|
1660
|
-
@click=${() => {
|
1994
|
+
@click=${() => {
|
1995
|
+
var _a;
|
1996
|
+
return this.productClicked(this.product.id, this.product.variants[0].price, (_a = this.product) === null || _a === void 0 ? void 0 : _a.url);
|
1997
|
+
}}
|
1661
1998
|
>
|
1662
1999
|
View Product
|
1663
2000
|
</button>
|
@@ -2463,6 +2800,22 @@ var ProvidersShopGptSdk = (function () {
|
|
2463
2800
|
const capitalizeEachWord = (str) => {
|
2464
2801
|
return str === null || str === void 0 ? void 0 : str.replace(/^\w/, (char) => char.toUpperCase());
|
2465
2802
|
};
|
2803
|
+
const adParams = new Set([
|
2804
|
+
'fbclid',
|
2805
|
+
'gclid',
|
2806
|
+
'sccid',
|
2807
|
+
'ttclid',
|
2808
|
+
'epik',
|
2809
|
+
'li_fat_id',
|
2810
|
+
'twclid',
|
2811
|
+
'rdt_cid',
|
2812
|
+
'aleid',
|
2813
|
+
'tabclid',
|
2814
|
+
'msclkid',
|
2815
|
+
'dclid',
|
2816
|
+
'wbraid',
|
2817
|
+
]);
|
2818
|
+
const isFromAd = (params) => [...params.keys()].some((key) => adParams.has(key.toLowerCase()));
|
2466
2819
|
|
2467
2820
|
const plusBtn = b `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none">
|
2468
2821
|
<path d="M12.75 11.25V6H11.25V11.25H6V12.75H11.25V18H12.75V12.75H18V11.25H12.75Z" fill="white"/>
|
@@ -3519,6 +3872,7 @@ var ProvidersShopGptSdk = (function () {
|
|
3519
3872
|
this.dispatchEvent(new CustomEvent('submit-feedback', {
|
3520
3873
|
detail: {
|
3521
3874
|
messageId: this.messageId,
|
3875
|
+
threadId: this.threadId,
|
3522
3876
|
feedback,
|
3523
3877
|
},
|
3524
3878
|
composed: true,
|
@@ -3590,6 +3944,10 @@ ${this.comment ? this.comment : E}</textarea
|
|
3590
3944
|
n({ type: String }),
|
3591
3945
|
__metadata("design:type", Object)
|
3592
3946
|
], FeedbackDialog.prototype, "messageId", void 0);
|
3947
|
+
__decorate([
|
3948
|
+
n({ type: String }),
|
3949
|
+
__metadata("design:type", Object)
|
3950
|
+
], FeedbackDialog.prototype, "threadId", void 0);
|
3593
3951
|
__decorate([
|
3594
3952
|
n({ type: String }),
|
3595
3953
|
__metadata("design:type", Object)
|
@@ -3622,19 +3980,26 @@ ${this.comment ? this.comment : E}</textarea
|
|
3622
3980
|
behavior: 'smooth',
|
3623
3981
|
});
|
3624
3982
|
}
|
3625
|
-
async processMessage(e, message) {
|
3983
|
+
async processMessage(e, message, isPrompt = false) {
|
3626
3984
|
this.scrollToBottom();
|
3627
3985
|
if (!this.thread) {
|
3628
3986
|
await this.createChatThread({ title: '' }, false);
|
3629
3987
|
}
|
3630
|
-
await this.sendMessageToServer(e, message);
|
3988
|
+
await this.sendMessageToServer(e, message, isPrompt);
|
3989
|
+
}
|
3990
|
+
sendEvent(action, actionData) {
|
3991
|
+
this.dispatchEvent(new CustomEvent('send-event', {
|
3992
|
+
detail: { action, actionData },
|
3993
|
+
composed: true,
|
3994
|
+
bubbles: true,
|
3995
|
+
}));
|
3631
3996
|
}
|
3632
3997
|
async onSubmit(e) {
|
3633
3998
|
var _a;
|
3634
3999
|
e.preventDefault();
|
3635
4000
|
const message = (_a = this.userQuery) === null || _a === void 0 ? void 0 : _a.trim();
|
3636
4001
|
this.userQuery = '';
|
3637
|
-
await this.processMessage(e, message);
|
4002
|
+
await this.processMessage(e, message, false);
|
3638
4003
|
}
|
3639
4004
|
handleThreadDelete() {
|
3640
4005
|
if (this.deleteAllThreads) {
|
@@ -3656,13 +4021,19 @@ ${this.comment ? this.comment : E}</textarea
|
|
3656
4021
|
this.deleteThreadId = '';
|
3657
4022
|
}
|
3658
4023
|
handleFeedback(rating, messageId, comment) {
|
4024
|
+
var _a, _b;
|
3659
4025
|
if (rating === 'bad') {
|
3660
|
-
this.feedbackDetails = {
|
4026
|
+
this.feedbackDetails = {
|
4027
|
+
messageId,
|
4028
|
+
threadId: ((_a = this.thread) === null || _a === void 0 ? void 0 : _a.threadId) || '',
|
4029
|
+
comment,
|
4030
|
+
};
|
3661
4031
|
return;
|
3662
4032
|
}
|
3663
4033
|
this.dispatchEvent(new CustomEvent('submit-feedback', {
|
3664
4034
|
detail: {
|
3665
4035
|
messageId: messageId,
|
4036
|
+
threadId: (_b = this.thread) === null || _b === void 0 ? void 0 : _b.threadId,
|
3666
4037
|
feedback: {
|
3667
4038
|
rating,
|
3668
4039
|
comment: null,
|
@@ -3809,7 +4180,10 @@ ${this.comment ? this.comment : E}</textarea
|
|
3809
4180
|
return x `
|
3810
4181
|
<div
|
3811
4182
|
class="prompt"
|
3812
|
-
@click=${(e) =>
|
4183
|
+
@click=${(e) => {
|
4184
|
+
this.processMessage(e, prompt, true);
|
4185
|
+
this.sendEvent('promptClicked');
|
4186
|
+
}}
|
3813
4187
|
>
|
3814
4188
|
${prompt}
|
3815
4189
|
</div>
|
@@ -3817,7 +4191,13 @@ ${this.comment ? this.comment : E}</textarea
|
|
3817
4191
|
})}
|
3818
4192
|
${o$1(customPrompts, ({ prompt, link }) => {
|
3819
4193
|
return x `
|
3820
|
-
<a
|
4194
|
+
<a
|
4195
|
+
class="prompt"
|
4196
|
+
href=${link}
|
4197
|
+
target="_blank"
|
4198
|
+
rel="noopener"
|
4199
|
+
@click=${() => this.sendEvent('promptClicked')}
|
4200
|
+
>
|
3821
4201
|
${prompt}
|
3822
4202
|
</a>
|
3823
4203
|
`;
|
@@ -4093,7 +4473,10 @@ ${this.comment ? this.comment : E}</textarea
|
|
4093
4473
|
</form>
|
4094
4474
|
${this.viewType === 'modal'
|
4095
4475
|
? x ` <footer>
|
4096
|
-
Powered by
|
4476
|
+
Powered by
|
4477
|
+
<a target="_blank" href="https://shopgpt.edgeagents.ai"
|
4478
|
+
>Blotout</a
|
4479
|
+
>
|
4097
4480
|
</footer>`
|
4098
4481
|
: E}
|
4099
4482
|
</div>
|
@@ -4133,6 +4516,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4133
4516
|
? x `
|
4134
4517
|
<feedback-dialog
|
4135
4518
|
.messageId=${this.feedbackDetails.messageId}
|
4519
|
+
.threadId=${this.feedbackDetails.threadId}
|
4136
4520
|
.comment=${this.feedbackDetails.comment}
|
4137
4521
|
@submit-feedback=${() => {
|
4138
4522
|
this.feedbackDetails = undefined;
|
@@ -4252,13 +4636,22 @@ ${this.comment ? this.comment : E}</textarea
|
|
4252
4636
|
customElements.define('chat-section', ChatSection);
|
4253
4637
|
}
|
4254
4638
|
|
4639
|
+
async function* streamToIterable(stream) {
|
4640
|
+
const reader = stream.getReader();
|
4641
|
+
while (true) {
|
4642
|
+
const { done, value } = await reader.read();
|
4643
|
+
if (done)
|
4644
|
+
return;
|
4645
|
+
yield value;
|
4646
|
+
}
|
4647
|
+
}
|
4255
4648
|
const handleEventSource = async (response, onEvent) => {
|
4256
4649
|
var _a, _b;
|
4257
4650
|
if (!response.body) {
|
4258
4651
|
throw new Error('No body found in response');
|
4259
4652
|
}
|
4260
4653
|
let buffer = '';
|
4261
|
-
for await (const chunk of response.body.pipeThrough(new TextDecoderStream())) {
|
4654
|
+
for await (const chunk of streamToIterable(response.body.pipeThrough(new TextDecoderStream()))) {
|
4262
4655
|
buffer += chunk;
|
4263
4656
|
const sections = buffer.split('\n\n');
|
4264
4657
|
buffer = sections.pop() || '';
|
@@ -4301,12 +4694,15 @@ ${this.comment ? this.comment : E}</textarea
|
|
4301
4694
|
return result;
|
4302
4695
|
};
|
4303
4696
|
|
4697
|
+
const soothingWaterDropSound = 'data:audio/mpeg;base64,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iBeym4zYFAAkYAVmuxNNv+v7c+5J93kKUxDKOKWyMt3ZVsrLlNp3Ib///////7s611TkOqXWZl3uhSiSOQewv1FYTZFKdhJVZBMgiKlDgeGlFFOoqUzGFzKYeAg0RO4QCQcFYedRiB5hURMHA6HQkKGqCXYGAAAAABGgApJl0h7bdv/r82S1SFSqqfmOjO4Wm5alsNMFG/////b9dVlyWpEKmqe9aHhMak+HhGsqBxxQOCxAeEChIKHAKEuwM4PIAACtABSTNSHt//uURO6CIqCNR2qAE/pZMgjtUAJ+DWJBF6oE2cG0yCL1QBX4t2rX16KCd9t30sqUWzrubZLKdC9a3az71olrf//////////T/t0Pp3IzIqdpblOje9GO7Vq6MhpGbRjEdEe4dgUA6KIBGwAq9dj2r///////////6W/eDhP1ZcjzJWbcDYTA0WE///////8uT5Zf9azM11Vxps81NTe63cJduNWlkq5ShrwPgRqhhppVlmu6EHCxk5tqaLA4HSCrD1D0gaM2QTGwJB4jiiCRsAKvXY9q7///////////8pPXQrb9l97FaKqad0uiKqLfVOqE////////W6JfMjW2K+v6bfFIfEspmm2OPb5lv/Z7llsUapI0XhNl30zkDXTZIq0aKBUSy9ImIjqwkOIZGymx8KTVFCDEAFAAbQAPquiW9Xb9v/+r///////X5cpV5I9ZjVCEsMyBIJ7LqqX//////Mv6JSLfFev2nda4Zrx8Km2io+FM1XRobWl0v4DX//uURNmGYkU6SHqAE/hREakPUAKbTLI/F6oFGcGhR6L1QRs5Ao+prOmkimTgXyZNBA1DB6wUnLlJJGijDhQCSMBRQIpycHiihiCAABxoAH1XRJfOdv2/f///////+1/PekqIdq7KiLDq7sOxJjr1q3O6Pf62///////6n2mfT7/m5GN2p2XnmlemqGhc2+zu+2KlsjnPBMFsfHHG0IcposI7mkSiMo6zJ8/UDkOe8jSY4aefp5AUQQCgVsAKrXRNN+3+n/////////5eAyMgGMzOqlnUebFkm5rRSdiUSHX///////8iM+fHvc/b/P3drfb+G3XZJqmV+sqzaxiSUGkD7zYktN+kcKPZZh0lEDTiybgbECfnAeO5Rjl7FbZAYQACi1sAKrXNS5v/+tvr6vIhqleWdHN22tT3b60XZ6ZE0VU///////3m9JJvsdKUs7I5M52kR2Z0UjRyHGGq4kwgOFmOwmUwDB9WExESOivUVYouLEMg0sTcOiAycKIY//ukRNOCI22QRWqBNnBvcgitUEbODTpBF6oE2cGUyCL1QBagWGgRQ4oYSjAAAACIgBTjQPba9f2lZF1qSU6EWjIc5mlMxtmV6HUrOdSMV3QtdVb////////+1eV3dWkZbkZjyDllIlWOplzrGMNynsyIVHMdDHOchzKQIoxhRBkXQxVYy3Rx9g8JEHEoAAAAAtgAU4zQq7a/99PZkdndankap3PkTmIJyUR56VnXRrV////////5fvyt+1L6OVKmWplIUtxJXj0UeR2PNO4kgmiJOQWOGjRyWMZWKxROY4aYzlcTDg8wmEhW4IABGwAq9cwapt9///////////oajVpKYiofa790LnJKO52cjGujXoxZVQs////////V8tJN9m7bt1nzMqHX3110dv6NVi+nmouWVGAqokJTckosMtmIQWSVPNCTjj5KUXBZBXVJpaBR9O5YJCRoNQrbEAAjQAVeuYNU2+///////////w1LsmB8PUySiIApz5pXEueQvL///////+oZBr5PMj9q25R7EantpRahl50b2unDPb6YZbjNWMWmIMZ1EM0nTgjkuZbkTRp+r50BQQsyY+HVGSFGu2nN6TTdEYYAAAAegD6rmDVd///////////9/Zn7//ukRNuCIw6QRuqAK/heEgjdUAV+Di5BFaoI2cG2SCK1QKc4vopluyIyIRjgjuRhyPT9+yZ/X//////b0Mnc5SF9bTxuv8x3b7TIIPb5VoVq3MQU6kDlEkkjzET0LWxJcL0GYEzSXsUes8UFGFkwoIBQesLIkmSOocchqWBgaRIjYgAAADoAfVcoNU3of//////////9k/KWWv/OGYSAzsXxKU4D6//z////+mdish1u/JQb2GVsH6rn8emS9X1iGEWpNqLZNE5A7uVblEsvWWTwSVznj0WXIJv16ZFiw20bUP2VXUExBHBlKqK8TtpicSjACyABTzsmZ7b////t7f/////skbIyzcvmO7kAxOZmFMONiogsDGSEkAZf///////5aMv8+cO5F5+Z1Vgd96JswiPNgwOh1CzUOochYq4d+I5M4A+B6sDGIXhhQCQwtFVKqCglEgowAAB6gFPO1e3oN907XqtPzOxGYqWndnVEqjmc7ohp6LJVZ7Vndf////////6+Wr6qrElOixGNY6TGQUdxIYxDVI5o4ysVqUZCniJhlo8PTDI8OCwmhzECDh1jxIimK4fEih/BQBuAALGAFOMfNEwq1f+hvTSX/VdkMWhU3m3NYhFFlW9Fot7L//ukROoEA5+QROKCNnBvkgicUCnODNZBGaoEecGPyCMxQBW8uZ1Wv//////+/6p96rRtKKiLSpVVplPIdXdlaYOB5GO7tlmF1FB0hiIZhylQxIi4Fh5Rx1FRYeOINMLDAcRUoiHCjXCgAAAAREAKSZZ1Vav7PVbNTNa9lqpKEVltRD6rZL+6J2RFT/////////p6du62ewPOqKxW3BsppGvO6IiCxRJpgamFsFSIAzIZArhGCqziTlKOrIRWLBuPKAABIiAFLMnHtV/95tGN6mfRCNOY102HIRndHoU6GVW3ya3ejU2b/////////6ptU+2l6UUWZCLVTVFHQqJdTEQyEbIOiysw0ggc4rkBCHKJOriaIg8SOPFJhpBASMDBUuAaMAGREmsMr/////7IdIDxh8owNTpM0LLMi8okxrBdE8//////+xt+1G4j9SgKi9i3JNykqKJFCIbC1RpAKAAAAI2AFTMn3U1fpVf//////////czlKQXntGnKNVMSoFpSEWiwjZFZf/////8PO5/3H3XGku1vWkaJLrzB++pZDtxRYrXSmvFb2IJUuzsSqoKixOKwaUo44sYzjAiYPaMH04c0SMQsaosgFAAAAEbACpmX6mr96v////////////uURPEEY0GQRmqALUBZEgjtUAJ/DAo9G6oArej0AaS9JIgEm7zzpZa8tDqh0YspmrZ0ZWVGop1cYm47B//////9PXdNzrfZvfkfXfS21te9i87xtU7m7Mmpi2PSIpnGF5Zvl0BAtJ7SoYdBygCieKTWmPqVFngcmoxCRM6SUiExSRg0kAAwCnmTle9//st2////////+/+EOfloy9FCeOQKHjY+dGzn///////+fj/f8l893LMZjUcjid21C9hvv5FPY7U8S1hS7g+Opw2XggyK4x0key5VXMk+C023IGFSFV+snynTukZQWugUABTzLlNrqS/V//////////yc1xk3S95nOjMHxSvQ0eJ2nP///////+cyq/+/zPjxr7H+ed+vpMrcb7h55+SReJ2SRMhLHaYUkWlqGlGn1BRx0iC2hSRg9iSZGL3ZIHEwSFkUMJoZ0AAAAACRgBTjJ1TWf////////////d3QjynB4DJKFkxsUTZW1Z6sxAn///////ukRO+DM2GQRWqBRnB10gitUEbODN5BFooFOcGfyCLRQJs4///qfmvuN/65eld5y/ypx6Xklc7ZpsozrhhtaqjXMy7NJxAFf52kCZepE9womyXLQWZ6OeG24aUolMe/AAAAARogBSTJ1SNB1f/3o0vS6EWzd70uhpmUYjFOjEdnorGZ2fZ2WitVf/////////1SRcp7MptCZSs9GWxmZ21VSzidBcg48YUP3LONGSEYhBKg5iDHJQWqOF2OwM5IZ2XAASQAKWZXd6VVeyuv75ddq6nI61cznMRrVnchZ1RZVViaM3///////sn/ptuqujo59KzjXkGsY5pRMpR67OPO4TEhw7ElDkzCphcaJoJKLCwsEVVRYTOQoSixBJQ4BzCrEFiCIztFAAsYAUszd3pVe3prWh08YzNszSIpmrQm7WTZz9e8jV////////tp0Oaq6tvdSIsjKs7HUqOQgo0hjpMRXJOIKJEOrRpFEiiruICjuODzud3ZCua4iNQcx2EzDXCFMgAAAOgCpmfXt///////////8/MiS5NKXgCdWeVyTrzQDo5SHB/////L/8srH5V7hDYX4+qncnZ9Y7pT1TXosbl5uxXqJWj8ZKzLZiBYdYmzkmjESxxDnYIM//uURPUCI0KQReqBNnBhkejdUAVvTNZBGaoAr8F9SCM1QBX4lJMsqjp6RM4e0gBGYVZRkSBCRRbEDkgAAAfAFTLn17V2r///////////0XR9LV7HWd1Ocp56OPkV7tVmTZkozp/T////+3VE1cpiu/2N7L+svbyZXZVJROcspHq9k93SklZKcgd+T5qclemWmUVUYWmoRzSH2JEeIh5kPQJkRwyK7ttRGIiZpCVvny6WEQskAAdAoACpEniCmxqkip1f/6yfUpa///zEYy////2W4doWS8C4DszAA2zMZnMDs5w6ep5////+8qRQwAfUPZSu/7pPJfMTYaMblJ1APmE0aBKaZCmsgbYRKLulJRa2B0uvbaFpZGVNK+KLzXKsNlSpGolJkeLqiojiPLoyxowJxdY0UQkwscAAlAoDZAAVIk8QU2NUlqdX/6k1l9Wr//+6nJ////Qmzre50qpjud6oFM5MjupkSb3SitRetX9P+n///rtuq3azK3xm19h8//u0RNsBA3KQRMqBTnB58gicUEnOELJBEaoFOcIjyCI1QSc4jN05t1bVPjsimzhHwlpZ2Et5FWc8iKlSza6OBE2oefFEQomyXzXJgqVZQCptpokVONECKbMyeCAtAo5cTEAmSWVRAAAQhlIAHYHhywnUgyKX//czJs4////Ohjf/6a5L07HLsmTuLJeqkspbSMzyN1Vn92S7o1VtJ3PT///W3ojVkndw4IqoJmC/as1+V0F0NhyExr8dXVEZ0scrQoLGRWeFds7ZZSKfPnWSebHrjhTHhe2VCQOCLGTx5IK0p6g2JooHlWiVoR0ifLLK8Okg/lI9XefLTuxZJBfClxgAAQAQBIAAegqF1QuEixql//1pk2c///85DG////+1HXLux8azIrh3Ei3IjGKRXmdWctF0tbv7M2j+/v/T9ur3dOplKbfcpB/t5r0MLPwu3on23Rw1Mmr3Pbtrjy7CWb38nHaxxtsO0kLB2fOqkQteq6+4pKy+wgvuJqxIRqhFYyEsKTgHiwPiozOyeJI+tHJ7TUIhWIAABgBeDtjyVkf//RUkv//+Yn////////wi3IXxOKH5Cfk/mv//////zCTCs8pSl/5S///tZFqsYxjnlqrKzUlorCpqiJq40RNUia9qylsalKSLLoiehQsrQFR0SiI1AVE0VASPuRTQodQs1vtDCMgAAIBgAAAUghyMUkf//qS///zEL///////81//f+zD5CNC4TRfn////kzXxM/E8lt/uPpEinGrqKFl//u0RO2DBNSQQuKCZnCVsghtUEzODe5BDIgFOcHeyCFw0Kc4ZFJbfGviyLVYYIg1NmSxoQvQpItuMcKkqSLbQoUKwqXFLpWhhGmvIqCJLhUMnGyUs24VHB4KmUSwWBIVKkxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy4xMDCqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sUZOGP8AAAf4AAAAgAAA/wAAABAAABpAAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq';
|
4698
|
+
|
4304
4699
|
const DIALOG_DELAY = 1000;
|
4305
4700
|
const normalizePath = (path) => path.replace(/\/$/, '');
|
4306
4701
|
class ShopGPT extends r$2 {
|
4307
4702
|
constructor() {
|
4308
4703
|
super(...arguments);
|
4309
4704
|
this.isStylesheetInjected = false;
|
4705
|
+
this.isPreviousMessagePrompt = false;
|
4310
4706
|
this.latestThreadLoad = DEFAULT_MAX_THREAD_AGE;
|
4311
4707
|
this.modalState = 'close';
|
4312
4708
|
this.isLoadingHistory = false;
|
@@ -4318,6 +4714,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4318
4714
|
this.messages = [];
|
4319
4715
|
this.chatThreads = new Map();
|
4320
4716
|
this.customPrompts = [];
|
4717
|
+
this.hasUserInteracted = false;
|
4718
|
+
this.showNudge = false;
|
4321
4719
|
this.loadData = async () => {
|
4322
4720
|
if (!this.shopGPTAPI) {
|
4323
4721
|
return;
|
@@ -4358,17 +4756,23 @@ ${this.comment ? this.comment : E}</textarea
|
|
4358
4756
|
}
|
4359
4757
|
}
|
4360
4758
|
this.init();
|
4759
|
+
this.startNudgeTimer();
|
4361
4760
|
}
|
4362
4761
|
disconnectedCallback() {
|
4363
4762
|
window.removeEventListener('edgetag-initialized', this.loadData);
|
4364
4763
|
window.removeEventListener('popstate', this.onPopState);
|
4764
|
+
if (this.nudgeTimer) {
|
4765
|
+
window.clearTimeout(this.nudgeTimer);
|
4766
|
+
}
|
4365
4767
|
super.disconnectedCallback();
|
4366
4768
|
}
|
4367
4769
|
init() {
|
4368
4770
|
window.addEventListener('edgetag-initialized', this.loadData);
|
4369
4771
|
window.addEventListener('popstate', this.onPopState);
|
4772
|
+
this.shopGPTAPI.sendEvent('shopGPTInitialized', this.getSiteCurrency().currency);
|
4370
4773
|
if (!this.view || this.view === 'overlay') {
|
4371
|
-
delay(DIALOG_DELAY)
|
4774
|
+
delay(DIALOG_DELAY)
|
4775
|
+
.then(() => {
|
4372
4776
|
var _a;
|
4373
4777
|
if (document.hidden) {
|
4374
4778
|
document.addEventListener('visibilitychange', () => { var _a; return (_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal(); }, {
|
@@ -4378,7 +4782,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4378
4782
|
else {
|
4379
4783
|
(_a = this.shopGPTDialog) === null || _a === void 0 ? void 0 : _a.showModal();
|
4380
4784
|
}
|
4381
|
-
})
|
4785
|
+
})
|
4786
|
+
.catch(logger.error);
|
4382
4787
|
}
|
4383
4788
|
}
|
4384
4789
|
setChatTitle(threadId, title) {
|
@@ -4406,8 +4811,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4406
4811
|
if (!thread) {
|
4407
4812
|
return;
|
4408
4813
|
}
|
4409
|
-
const
|
4410
|
-
const fromAd =
|
4814
|
+
const searchParams = new URLSearchParams(window.location.search);
|
4815
|
+
const fromAd = isFromAd(searchParams) || searchParams.get('shopGPT') === '1';
|
4411
4816
|
const productHandle = this.devMode
|
4412
4817
|
? (_a = thread === null || thread === void 0 ? void 0 : thread.devContext) === null || _a === void 0 ? void 0 : _a.productHandle
|
4413
4818
|
: fromAd
|
@@ -4644,7 +5049,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4644
5049
|
}
|
4645
5050
|
});
|
4646
5051
|
}
|
4647
|
-
async sendMessageToServer(e, message) {
|
5052
|
+
async sendMessageToServer(e, message, isPrompt = false) {
|
4648
5053
|
e.preventDefault();
|
4649
5054
|
e.stopPropagation();
|
4650
5055
|
if (!message || this.isTyping || this.isLoadingHistory) {
|
@@ -4652,6 +5057,10 @@ ${this.comment ? this.comment : E}</textarea
|
|
4652
5057
|
}
|
4653
5058
|
this.isFailed = false;
|
4654
5059
|
try {
|
5060
|
+
this.isPreviousMessagePrompt = isPrompt;
|
5061
|
+
if (!isPrompt) {
|
5062
|
+
this.shopGPTAPI.sendEvent('queryInteractions', this.getSiteCurrency().currency);
|
5063
|
+
}
|
4655
5064
|
this.messages = [{ sender: 'user', message }, ...this.messages];
|
4656
5065
|
this.isTyping = true;
|
4657
5066
|
const response = await this.submitQuery(message);
|
@@ -4666,7 +5075,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4666
5075
|
submitFeedback(e) {
|
4667
5076
|
e.stopPropagation();
|
4668
5077
|
this.shopGPTAPI
|
4669
|
-
.saveFeedback(e.detail.messageId, e.detail.feedback)
|
5078
|
+
.saveFeedback(e.detail.messageId, e.detail.threadId, e.detail.feedback)
|
4670
5079
|
.then(() => {
|
4671
5080
|
const messages = this.messages;
|
4672
5081
|
const messageIndex = messages.findIndex(({ messageId }) => messageId === e.detail.messageId);
|
@@ -4675,17 +5084,25 @@ ${this.comment ? this.comment : E}</textarea
|
|
4675
5084
|
feedback: e.detail.feedback,
|
4676
5085
|
};
|
4677
5086
|
this.messages = [...messages];
|
5087
|
+
})
|
5088
|
+
.catch(logger.error);
|
5089
|
+
}
|
5090
|
+
sendEvent(e) {
|
5091
|
+
e.stopPropagation();
|
5092
|
+
this.shopGPTAPI.sendEvent(e.detail.action, this.getSiteCurrency().currency, e.detail.actionData);
|
5093
|
+
}
|
5094
|
+
productClicked(e) {
|
5095
|
+
e.stopPropagation();
|
5096
|
+
setProductAction(this.destination, e.detail.productId, 'clicked', true);
|
5097
|
+
this.shopGPTAPI.sendEvent('productRecommendationClicked', this.getSiteCurrency().currency, {
|
5098
|
+
productId: e.detail.productId,
|
5099
|
+
value: e.detail.value,
|
5100
|
+
isPrompt: this.isPreviousMessagePrompt,
|
4678
5101
|
});
|
4679
5102
|
}
|
4680
5103
|
getSiteCurrency() {
|
4681
5104
|
return this.storeAPI.getSiteCurrency();
|
4682
5105
|
}
|
4683
|
-
render() {
|
4684
|
-
if (this.view === 'modal') {
|
4685
|
-
return this.modalMode();
|
4686
|
-
}
|
4687
|
-
return this.overlayMode();
|
4688
|
-
}
|
4689
5106
|
overlayMode() {
|
4690
5107
|
const thread = this.chatThreads.get(this.selectedThreadId);
|
4691
5108
|
return x `
|
@@ -4694,6 +5111,8 @@ ${this.comment ? this.comment : E}</textarea
|
|
4694
5111
|
@delete-thread=${this.handleThreadDelete}
|
4695
5112
|
@delete-all-threads=${this.handleAllThreadsDelete}
|
4696
5113
|
@submit-feedback=${this.submitFeedback}
|
5114
|
+
@send-event=${this.sendEvent}
|
5115
|
+
@product-clicked=${this.productClicked}
|
4697
5116
|
>
|
4698
5117
|
<div class="mobile-version">
|
4699
5118
|
Please switch to the desktop version for the best experience.
|
@@ -4741,6 +5160,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4741
5160
|
`;
|
4742
5161
|
}
|
4743
5162
|
modalMode() {
|
5163
|
+
var _a;
|
4744
5164
|
const thread = this.chatThreads.get(this.selectedThreadId);
|
4745
5165
|
const closeModal = () => {
|
4746
5166
|
this.modalState = 'close';
|
@@ -4750,12 +5170,28 @@ ${this.comment ? this.comment : E}</textarea
|
|
4750
5170
|
<button
|
4751
5171
|
@click=${(e) => {
|
4752
5172
|
e.preventDefault();
|
5173
|
+
this.shopGPTAPI.sendEvent('chatbotOpened', this.getSiteCurrency().currency);
|
4753
5174
|
this.modalState = 'open';
|
5175
|
+
this.handleUserInteraction();
|
4754
5176
|
}}
|
4755
5177
|
>
|
4756
5178
|
${chatIcon}
|
4757
5179
|
</button>
|
4758
|
-
|
5180
|
+
${((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show) && this.showNudge
|
5181
|
+
? x `<div
|
5182
|
+
class="nudge"
|
5183
|
+
@click=${(e) => {
|
5184
|
+
e.preventDefault();
|
5185
|
+
this.modalState = 'open';
|
5186
|
+
this.handleUserInteraction();
|
5187
|
+
}}
|
5188
|
+
>
|
5189
|
+
Hi there! I'm an AI Agent to help you find the perfect product.
|
5190
|
+
What are you looking for today?
|
5191
|
+
</div>`
|
5192
|
+
: x `<div class="chatbot-hover-text">
|
5193
|
+
What are you looking for today?
|
5194
|
+
</div>`}
|
4759
5195
|
</div>`;
|
4760
5196
|
}
|
4761
5197
|
return x `
|
@@ -4764,6 +5200,9 @@ ${this.comment ? this.comment : E}</textarea
|
|
4764
5200
|
@delete-thread=${this.handleThreadDelete}
|
4765
5201
|
@delete-all-threads=${this.handleAllThreadsDelete}
|
4766
5202
|
@submit-feedback=${this.submitFeedback}
|
5203
|
+
@click=${this.handleUserInteraction}
|
5204
|
+
@send-event=${this.sendEvent}
|
5205
|
+
@product-clicked=${this.productClicked}
|
4767
5206
|
>
|
4768
5207
|
<chat-section
|
4769
5208
|
.prompts=${this.quickPrompts}
|
@@ -4792,6 +5231,48 @@ ${this.comment ? this.comment : E}</textarea
|
|
4792
5231
|
</div>
|
4793
5232
|
`;
|
4794
5233
|
}
|
5234
|
+
startNudgeTimer() {
|
5235
|
+
var _a, _b;
|
5236
|
+
if (this.view !== 'modal' || !((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.show)) {
|
5237
|
+
return;
|
5238
|
+
}
|
5239
|
+
this.hasUserInteracted = isUserInteracted(this.destination);
|
5240
|
+
if (this.hasUserInteracted || this.nudgeTimer) {
|
5241
|
+
return;
|
5242
|
+
}
|
5243
|
+
this.nudgeTimer = window.setTimeout(() => {
|
5244
|
+
if (!this.hasUserInteracted) {
|
5245
|
+
this.playNudgeSound();
|
5246
|
+
this.showNudge = true;
|
5247
|
+
}
|
5248
|
+
}, (((_b = this.nudge) === null || _b === void 0 ? void 0 : _b.timeout) || DEFAULT_NUDGE_TIMEOUT) * 1000);
|
5249
|
+
}
|
5250
|
+
playNudgeSound() {
|
5251
|
+
var _a;
|
5252
|
+
if (!((_a = this.nudge) === null || _a === void 0 ? void 0 : _a.sound) || !navigator.userActivation.hasBeenActive) {
|
5253
|
+
return;
|
5254
|
+
}
|
5255
|
+
const audio = new Audio(soothingWaterDropSound);
|
5256
|
+
audio
|
5257
|
+
.play()
|
5258
|
+
.catch((error) => logger.error('Error playing nudge sound', error));
|
5259
|
+
}
|
5260
|
+
handleUserInteraction() {
|
5261
|
+
if (!this.hasUserInteracted) {
|
5262
|
+
this.hasUserInteracted = true;
|
5263
|
+
this.showNudge = false;
|
5264
|
+
if (this.nudgeTimer) {
|
5265
|
+
window.clearTimeout(this.nudgeTimer);
|
5266
|
+
}
|
5267
|
+
setUserInteracted(this.destination);
|
5268
|
+
}
|
5269
|
+
}
|
5270
|
+
render() {
|
5271
|
+
if (this.view === 'modal') {
|
5272
|
+
return this.modalMode();
|
5273
|
+
}
|
5274
|
+
return this.overlayMode();
|
5275
|
+
}
|
4795
5276
|
}
|
4796
5277
|
ShopGPT.styles = [shopGPTStyles];
|
4797
5278
|
__decorate([
|
@@ -4842,6 +5323,14 @@ ${this.comment ? this.comment : E}</textarea
|
|
4842
5323
|
n({ type: Array }),
|
4843
5324
|
__metadata("design:type", Array)
|
4844
5325
|
], ShopGPT.prototype, "customPrompts", void 0);
|
5326
|
+
__decorate([
|
5327
|
+
r(),
|
5328
|
+
__metadata("design:type", Object)
|
5329
|
+
], ShopGPT.prototype, "hasUserInteracted", void 0);
|
5330
|
+
__decorate([
|
5331
|
+
r(),
|
5332
|
+
__metadata("design:type", Object)
|
5333
|
+
], ShopGPT.prototype, "showNudge", void 0);
|
4845
5334
|
if (!customElements.get('shop-gpt')) {
|
4846
5335
|
customElements.define('shop-gpt', ShopGPT);
|
4847
5336
|
}
|
@@ -4857,6 +5346,7 @@ ${this.comment ? this.comment : E}</textarea
|
|
4857
5346
|
return;
|
4858
5347
|
}
|
4859
5348
|
shopGPT = document.createElement('shop-gpt');
|
5349
|
+
shopGPT.destination = params.destination;
|
4860
5350
|
shopGPT.storeAPI = params.storeAPI;
|
4861
5351
|
shopGPT.shopGPTAPI = params.shopGPTAPI;
|
4862
5352
|
shopGPT.devMode = params.devMode;
|
@@ -4871,12 +5361,25 @@ ${this.comment ? this.comment : E}</textarea
|
|
4871
5361
|
shopGPT.latestThreadLoad = params.latestThreadLoad;
|
4872
5362
|
shopGPT.botIconUrl = params.botIconUrl;
|
4873
5363
|
shopGPT.css = params.css;
|
5364
|
+
shopGPT.nudge = params.nudge;
|
5365
|
+
},
|
5366
|
+
loadUI() {
|
5367
|
+
if (!shopGPT) {
|
5368
|
+
logger.error('ShopGPT component not found!');
|
5369
|
+
return;
|
5370
|
+
}
|
5371
|
+
if (shopGPT.parentNode) {
|
5372
|
+
logger.log('ShopGPT component added already!');
|
5373
|
+
return;
|
5374
|
+
}
|
4874
5375
|
document.body.append(shopGPT);
|
5376
|
+
setShopGPTLoaded(shopGPT.destination, true);
|
4875
5377
|
},
|
4876
5378
|
destroy() {
|
4877
5379
|
if (!shopGPT) {
|
4878
5380
|
return;
|
4879
5381
|
}
|
5382
|
+
setShopGPTLoaded(shopGPT.destination, false);
|
4880
5383
|
shopGPT.remove();
|
4881
5384
|
shopGPT = undefined;
|
4882
5385
|
delete window[registryKey];
|