@envive-ai/react-hooks 0.3.67 → 0.3.69
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/dist/atoms/app/index.d.cts +7 -7
- package/dist/atoms/app/index.d.ts +1 -1
- package/dist/atoms/app/variant.d.cts +6 -6
- package/dist/atoms/chat/chatState.d.cts +19 -19
- package/dist/atoms/chat/chatState.d.ts +19 -19
- package/dist/atoms/chat/form.d.cts +2 -2
- package/dist/atoms/chat/form.d.ts +2 -2
- package/dist/atoms/chat/index.d.cts +3 -3
- package/dist/atoms/chat/index.d.ts +3 -3
- package/dist/atoms/chat/lastMessage.d.cts +2 -2
- package/dist/atoms/chat/lastMessage.d.ts +2 -2
- package/dist/atoms/chat/messageQueue.d.cts +6 -6
- package/dist/atoms/chat/messageQueue.d.ts +6 -6
- package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
- package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
- package/dist/atoms/chat/renderedWidgetRefs.d.cts +2 -2
- package/dist/atoms/chat/renderedWidgetRefs.d.ts +2 -2
- package/dist/atoms/chat/replies.d.cts +3 -3
- package/dist/atoms/chat/replies.d.ts +2 -2
- package/dist/atoms/chat/suggestions.d.cts +2 -2
- package/dist/atoms/chat/suggestions.d.ts +2 -2
- package/dist/atoms/envive/enviveConfig.d.cts +14 -14
- package/dist/atoms/envive/enviveConfig.d.ts +13 -13
- package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
- package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
- package/dist/atoms/org/customerService.d.cts +6 -6
- package/dist/atoms/org/customerService.d.ts +6 -6
- package/dist/atoms/org/graphqlConfig.d.cts +4 -4
- package/dist/atoms/org/graphqlConfig.d.ts +4 -4
- package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
- package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
- package/dist/atoms/org/orgAnalyticsConfig.d.cts +4 -4
- package/dist/atoms/org/orgAnalyticsConfig.d.ts +4 -4
- package/dist/atoms/search/chatSearch.d.cts +17 -17
- package/dist/atoms/search/chatSearch.d.ts +17 -17
- package/dist/atoms/search/searchAPI.d.cts +13 -13
- package/dist/atoms/search/searchAPI.d.ts +13 -13
- package/dist/atoms/search/types.d.ts +1 -1
- package/dist/atoms/search/utils.d.ts +1 -1
- package/dist/contexts/enviveContext/types.d.cts +1 -1
- package/dist/contexts/pageContext/index.cjs +2 -0
- package/dist/contexts/pageContext/index.d.cts +2 -1
- package/dist/contexts/pageContext/index.d.ts +2 -1
- package/dist/contexts/pageContext/index.js +2 -1
- package/dist/contexts/pageContext/pageContext.cjs +12 -34
- package/dist/contexts/pageContext/pageContext.js +12 -34
- package/dist/contexts/pageContext/pageViewedContext.cjs +42 -0
- package/dist/contexts/pageContext/pageViewedContext.d.cts +16 -0
- package/dist/contexts/pageContext/pageViewedContext.d.ts +16 -0
- package/dist/contexts/pageContext/pageViewedContext.js +42 -0
- package/dist/contexts/systemSettingsContext/systemSettingsContext.d.ts +2 -2
- package/dist/contexts/types.d.cts +1 -1
- package/dist/contexts/types.d.ts +1 -1
- package/dist/contexts/typesV3.cjs +1 -1
- package/dist/contexts/typesV3.d.cts +3 -2
- package/dist/contexts/typesV3.d.ts +3 -2
- package/dist/contexts/typesV3.js +1 -1
- package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.ts +2 -2
- package/dist/hooks/PageViewedEvent/index.cjs +2 -1
- package/dist/hooks/PageViewedEvent/index.d.cts +2 -1
- package/dist/hooks/PageViewedEvent/index.d.ts +2 -1
- package/dist/hooks/PageViewedEvent/index.js +2 -1
- package/dist/hooks/PageViewedEvent/usePageViewedEvent.cjs +8 -34
- package/dist/hooks/PageViewedEvent/usePageViewedEvent.d.cts +9 -8
- package/dist/hooks/PageViewedEvent/usePageViewedEvent.d.ts +9 -8
- package/dist/hooks/PageViewedEvent/usePageViewedEvent.js +8 -33
- package/dist/hooks/utils.d.cts +1 -1
- package/dist/hooks/utils.d.ts +1 -1
- package/package.json +1 -1
- package/src/contexts/pageContext/__tests__/pageContext.test.tsx +92 -14
- package/src/contexts/pageContext/index.ts +1 -0
- package/src/contexts/pageContext/pageContext.tsx +26 -33
- package/src/contexts/pageContext/pageViewedContext.ts +59 -0
- package/src/contexts/typesV3.ts +6 -1
- package/src/hooks/PageViewedEvent/usePageViewedEvent.ts +8 -53
|
@@ -1,50 +1,25 @@
|
|
|
1
|
-
import { VariantTypeEnum } from "../../application/models/variantInfo/variantInfo.js";
|
|
2
|
-
import "../../application/models/index.js";
|
|
3
1
|
import { EnviveMetricsEventName } from "../../services/amplitudeService/eventNames.js";
|
|
4
2
|
import { getQueryParam } from "../../application/utils/urlsParser.js";
|
|
5
3
|
import { hasParsedVariantInfoAtom, variantInfoAtom } from "../../atoms/app/variant.js";
|
|
6
4
|
import { useAmplitude } from "../../contexts/amplitudeContext/amplitudeContext.js";
|
|
7
5
|
import "../../contexts/amplitudeContext/index.js";
|
|
6
|
+
import { extractPageViewedContext } from "../../contexts/pageContext/pageViewedContext.js";
|
|
8
7
|
import { usePage } from "../../contexts/pageContext/pageContext.js";
|
|
9
8
|
import "../../contexts/pageContext/index.js";
|
|
10
9
|
import { useEffect, useRef } from "react";
|
|
11
10
|
import { useAtomValue } from "jotai";
|
|
12
11
|
|
|
13
12
|
//#region src/hooks/PageViewedEvent/usePageViewedEvent.ts
|
|
14
|
-
const extractPageViewedContext = (pageVariant) => {
|
|
15
|
-
switch (pageVariant.variantType) {
|
|
16
|
-
case VariantTypeEnum.Pdp: return {
|
|
17
|
-
page_type: "pdp",
|
|
18
|
-
page_id: pageVariant.productId
|
|
19
|
-
};
|
|
20
|
-
case VariantTypeEnum.Plp: return {
|
|
21
|
-
page_type: "plp",
|
|
22
|
-
page_id: pageVariant.plpId
|
|
23
|
-
};
|
|
24
|
-
case VariantTypeEnum.Home: return {
|
|
25
|
-
page_type: "homepage",
|
|
26
|
-
page_id: pageVariant.url
|
|
27
|
-
};
|
|
28
|
-
case VariantTypeEnum.Other: return {
|
|
29
|
-
page_type: "other",
|
|
30
|
-
page_id: pageVariant.url
|
|
31
|
-
};
|
|
32
|
-
case VariantTypeEnum.PageVisit: return {
|
|
33
|
-
page_type: "other",
|
|
34
|
-
page_id: pageVariant.url
|
|
35
|
-
};
|
|
36
|
-
case VariantTypeEnum.FullPageSalesAgent: return {
|
|
37
|
-
page_type: "adaptive_storefront",
|
|
38
|
-
page_id: pageVariant.url
|
|
39
|
-
};
|
|
40
|
-
default: return null;
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
13
|
/**
|
|
44
14
|
* Fires the [Envive] Page Viewed event once per page load when page context data is ready.
|
|
45
15
|
*
|
|
46
16
|
* This event captures page context information and is intended to eventually replace
|
|
47
17
|
* the [Amplitude] Page Viewed event.
|
|
18
|
+
*
|
|
19
|
+
* @deprecated `PageProvider` (contexts/pageContext) already fires [Envive] Page Viewed;
|
|
20
|
+
* mounting this hook alongside it double-fires the event. Not used by the injection
|
|
21
|
+
* bundle. Retained only for compatibility with the public `./hooks/PageViewedEvent`
|
|
22
|
+
* subpath and will be removed in a future breaking release.
|
|
48
23
|
*/
|
|
49
24
|
const usePageViewedEvent = () => {
|
|
50
25
|
const hasFired = useRef(false);
|
|
@@ -81,5 +56,5 @@ const usePageViewedEvent = () => {
|
|
|
81
56
|
};
|
|
82
57
|
|
|
83
58
|
//#endregion
|
|
84
|
-
export {
|
|
85
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
59
|
+
export { usePageViewedEvent };
|
|
60
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlUGFnZVZpZXdlZEV2ZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9QYWdlVmlld2VkRXZlbnQvdXNlUGFnZVZpZXdlZEV2ZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUF0b21WYWx1ZSB9IGZyb20gJ2pvdGFpJztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0UXVlcnlQYXJhbSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi91dGlscy91cmxzUGFyc2VyJztcbmltcG9ydCB7IGhhc1BhcnNlZFZhcmlhbnRJbmZvQXRvbSwgdmFyaWFudEluZm9BdG9tIH0gZnJvbSAnc3JjL2F0b21zL2FwcC92YXJpYW50JztcbmltcG9ydCB7IEVudml2ZU1ldHJpY3NFdmVudE5hbWUsIHVzZUFtcGxpdHVkZSB9IGZyb20gJ3NyYy9jb250ZXh0cy9hbXBsaXR1ZGVDb250ZXh0JztcbmltcG9ydCB7IHVzZVBhZ2UgfSBmcm9tICdzcmMvY29udGV4dHMvcGFnZUNvbnRleHQnO1xuaW1wb3J0IHsgZXh0cmFjdFBhZ2VWaWV3ZWRDb250ZXh0IH0gZnJvbSAnc3JjL2NvbnRleHRzL3BhZ2VDb250ZXh0L3BhZ2VWaWV3ZWRDb250ZXh0JztcblxuLy8gUmUtZXhwb3J0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcHVibGljIC4vaG9va3MvUGFnZVZpZXdlZEV2ZW50IHN1YnBhdGguXG5leHBvcnQgeyBleHRyYWN0UGFnZVZpZXdlZENvbnRleHQgfTtcblxuLyoqXG4gKiBGaXJlcyB0aGUgW0Vudml2ZV0gUGFnZSBWaWV3ZWQgZXZlbnQgb25jZSBwZXIgcGFnZSBsb2FkIHdoZW4gcGFnZSBjb250ZXh0IGRhdGEgaXMgcmVhZHkuXG4gKlxuICogVGhpcyBldmVudCBjYXB0dXJlcyBwYWdlIGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGlzIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgcmVwbGFjZVxuICogdGhlIFtBbXBsaXR1ZGVdIFBhZ2UgVmlld2VkIGV2ZW50LlxuICpcbiAqIEBkZXByZWNhdGVkIGBQYWdlUHJvdmlkZXJgIChjb250ZXh0cy9wYWdlQ29udGV4dCkgYWxyZWFkeSBmaXJlcyBbRW52aXZlXSBQYWdlIFZpZXdlZDtcbiAqIG1vdW50aW5nIHRoaXMgaG9vayBhbG9uZ3NpZGUgaXQgZG91YmxlLWZpcmVzIHRoZSBldmVudC4gTm90IHVzZWQgYnkgdGhlIGluamVjdGlvblxuICogYnVuZGxlLiBSZXRhaW5lZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHB1YmxpYyBgLi9ob29rcy9QYWdlVmlld2VkRXZlbnRgXG4gKiBzdWJwYXRoIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYnJlYWtpbmcgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVBhZ2VWaWV3ZWRFdmVudCA9ICgpID0+IHtcbiAgY29uc3QgaGFzRmlyZWQgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCB7IHRyYWNrRXZlbnQgfSA9IHVzZUFtcGxpdHVkZSgpO1xuICBjb25zdCB7IHZhcmlhbnRJbmZvOiBwYWdlVmFyaWFudEluZm8sIGlzU3VwcG9ydGVkLCBpc0xvYWRpbmcgfSA9IHVzZVBhZ2UoKTtcbiAgY29uc3QgdmFyaWFudEluZm8gPSB1c2VBdG9tVmFsdWUodmFyaWFudEluZm9BdG9tKTtcbiAgY29uc3QgaGFzUGFyc2VkVmFyaWFudEluZm8gPSB1c2VBdG9tVmFsdWUoaGFzUGFyc2VkVmFyaWFudEluZm9BdG9tKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChoYXNGaXJlZC5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTG9hZGluZyB8fCAhaGFzUGFyc2VkVmFyaWFudEluZm8gfHwgIXBhZ2VWYXJpYW50SW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gZXh0cmFjdFBhZ2VWaWV3ZWRDb250ZXh0KHBhZ2VWYXJpYW50SW5mbyk7XG4gICAgaWYgKCFwYWdlQ29udGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhc0ZpcmVkLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgY29uc3QgZW52aXZlUGxhY2VtZW50ID0gZ2V0UXVlcnlQYXJhbSgnZW52aXZlX3BsYWNlbWVudCcpO1xuXG4gICAgdHJhY2tFdmVudCh7XG4gICAgICBldmVudE5hbWU6IEVudml2ZU1ldHJpY3NFdmVudE5hbWUuUGFnZVZpZXdlZCxcbiAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgJ2NvbnRleHQucGFnZV90eXBlJzogcGFnZUNvbnRleHQucGFnZV90eXBlLFxuICAgICAgICAnY29udGV4dC5wYWdlX2lkJzogcGFnZUNvbnRleHQucGFnZV9pZCxcbiAgICAgICAgLy8gY29udGV4dC5zdXBwb3J0ZWQgYW5kIGNvbnRleHQucmVhZHkgYm90aCBkZXJpdmUgZnJvbSBpc1N1cHBvcnRlZCAocmVzcG9uc2UucmVhZHkpXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIHN1cHBvcnRlZEV2ZW50QXRvbSBpcyBub3QgY3VycmVudGx5IHBvcHVsYXRlZC5cbiAgICAgICAgJ2NvbnRleHQuc3VwcG9ydGVkJzogaXNTdXBwb3J0ZWQsXG4gICAgICAgICdjb250ZXh0LnJlYWR5JzogaXNTdXBwb3J0ZWQsXG4gICAgICAgICdjb250ZXh0LnBhZ2VfdmFyaWFudF9pZCc6IHZhcmlhbnRJbmZvLnZhcmlhbnRJZCxcbiAgICAgICAgLi4uKGVudml2ZVBsYWNlbWVudCA/IHsgJ2NvbnRleHQuZW52aXZlX3BsYWNlbWVudCc6IGVudml2ZVBsYWNlbWVudCB9IDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSwgW2lzTG9hZGluZywgaXNTdXBwb3J0ZWQsIGhhc1BhcnNlZFZhcmlhbnRJbmZvLCBwYWdlVmFyaWFudEluZm8sIHZhcmlhbnRJbmZvLCB0cmFja0V2ZW50XSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxNQUFhLDJCQUEyQjtDQUN0QyxNQUFNLFdBQVcsT0FBTyxNQUFNO0NBQzlCLE1BQU0sRUFBRSxlQUFlLGNBQWM7Q0FDckMsTUFBTSxFQUFFLGFBQWEsaUJBQWlCLGFBQWEsY0FBYyxTQUFTO0NBQzFFLE1BQU0sY0FBYyxhQUFhLGdCQUFnQjtDQUNqRCxNQUFNLHVCQUF1QixhQUFhLHlCQUF5QjtBQUVuRSxpQkFBZ0I7QUFDZCxNQUFJLFNBQVMsUUFDWDtBQUdGLE1BQUksYUFBYSxDQUFDLHdCQUF3QixDQUFDLGdCQUN6QztFQUdGLE1BQU0sY0FBYyx5QkFBeUIsZ0JBQWdCO0FBQzdELE1BQUksQ0FBQyxZQUNIO0FBR0YsV0FBUyxVQUFVO0VBRW5CLE1BQU0sa0JBQWtCLGNBQWMsbUJBQW1CO0FBRXpELGFBQVc7R0FDVCxXQUFXLHVCQUF1QjtHQUNsQyxZQUFZO0lBQ1YscUJBQXFCLFlBQVk7SUFDakMsbUJBQW1CLFlBQVk7SUFHL0IscUJBQXFCO0lBQ3JCLGlCQUFpQjtJQUNqQiwyQkFBMkIsWUFBWTtJQUN2QyxHQUFJLGtCQUFrQixFQUFFLDRCQUE0QixpQkFBaUIsR0FBRyxFQUFFO0lBQzNFO0dBQ0YsQ0FBQztJQUNEO0VBQUM7RUFBVztFQUFhO0VBQXNCO0VBQWlCO0VBQWE7RUFBVyxDQUFDIn0=
|
package/dist/hooks/utils.d.cts
CHANGED
|
@@ -19,4 +19,4 @@ declare enum SearchResultsState {
|
|
|
19
19
|
declare const getSearchResultsState: (isLoadingSearch: boolean, searchData: SearchResult | null) => SearchResultsState;
|
|
20
20
|
//#endregion
|
|
21
21
|
export { SearchResultsState, createAppLoadedEvent, createVisitUserEvent, getSearchResultsState, isElementPartiallyVisible, isWithinBusinessHours };
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC5jdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3V0aWxzLmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvc2VhcmNoJztcbmltcG9ydCB7IFVzZXJFdmVudCwgVmFyaWFudEluZm8gfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGlzRWxlbWVudFBhcnRpYWxseVZpc2libGU6IChlbD86IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4gYm9vbGVhbjtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGNyZWF0ZUFwcExvYWRlZEV2ZW50OiAoKSA9PiBVc2VyRXZlbnQ7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBjcmVhdGVWaXNpdFVzZXJFdmVudDogKHsgdmFyaWFudEluZm8sIH06IHtcbiAgICB2YXJpYW50SW5mbzogVmFyaWFudEluZm87XG59KSA9PiBVc2VyRXZlbnQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBpc1dpdGhpbkJ1c2luZXNzSG91cnM6IChzdGFydFRpbWU6IHN0cmluZywgZW5kVGltZTogc3RyaW5nLCB0aW1lWm9uZTogc3RyaW5nKSA9PiBib29sZWFuO1xuZXhwb3J0IGRlY2xhcmUgZW51bSBTZWFyY2hSZXN1bHRzU3RhdGUge1xuICAgIExvYWRpbmcgPSAwLFxuICAgIFJlc3VsdHMgPSAxLFxuICAgIE5vUmVzdWx0cyA9IDJcbn1cbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGdldFNlYXJjaFJlc3VsdHNTdGF0ZTogKGlzTG9hZGluZ1NlYXJjaDogYm9vbGVhbiwgc2VhcmNoRGF0YTogU2VhcmNoUmVzdWx0IHwgbnVsbCkgPT4gU2VhcmNoUmVzdWx0c1N0YXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUVBLElBQVcsNEJBQTRCLENBQUMsV0FBVyxlQUFlO0FBQ2xFLElBQVcsdUJBQXVCLENBQUMsV0FBVyxVQUFVO0FBQ3hELElBQVcsdUJBQXVCO0NBQUM7T0FBVztPQUFnQjtPQUFBO0NBQUE7QUFDOUQsSUFBVyx3QkFBaUIsQ0FBQSxJQUFBO0FBQzVCLElBQVcscUJBQWdCLENBQUEsSUFBQTtBQUMzQixJQUFXLHdCQUF3QjtDQUFDO09BQVc7T0FBb0I7Q0FBbUIifQ==
|
package/dist/hooks/utils.d.ts
CHANGED
|
@@ -19,4 +19,4 @@ declare enum SearchResultsState {
|
|
|
19
19
|
declare const getSearchResultsState: (isLoadingSearch: boolean, searchData: SearchResult | null) => SearchResultsState;
|
|
20
20
|
//#endregion
|
|
21
21
|
export { SearchResultsState, createAppLoadedEvent, createVisitUserEvent, getSearchResultsState, isElementPartiallyVisible, isWithinBusinessHours };
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXRpbHMuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9zZWFyY2gnO1xuaW1wb3J0IHsgVXNlckV2ZW50LCBWYXJpYW50SW5mbyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgaXNFbGVtZW50UGFydGlhbGx5VmlzaWJsZTogKGVsPzogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiBib29sZWFuO1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgY3JlYXRlQXBwTG9hZGVkRXZlbnQ6ICgpID0+IFVzZXJFdmVudDtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGNyZWF0ZVZpc2l0VXNlckV2ZW50OiAoeyB2YXJpYW50SW5mbywgfToge1xuICAgIHZhcmlhbnRJbmZvOiBWYXJpYW50SW5mbztcbn0pID0+IFVzZXJFdmVudCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGlzV2l0aGluQnVzaW5lc3NIb3VyczogKHN0YXJ0VGltZTogc3RyaW5nLCBlbmRUaW1lOiBzdHJpbmcsIHRpbWVab25lOiBzdHJpbmcpID0+
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXRpbHMuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9zZWFyY2gnO1xuaW1wb3J0IHsgVXNlckV2ZW50LCBWYXJpYW50SW5mbyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgaXNFbGVtZW50UGFydGlhbGx5VmlzaWJsZTogKGVsPzogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiBib29sZWFuO1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgY3JlYXRlQXBwTG9hZGVkRXZlbnQ6ICgpID0+IFVzZXJFdmVudDtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGNyZWF0ZVZpc2l0VXNlckV2ZW50OiAoeyB2YXJpYW50SW5mbywgfToge1xuICAgIHZhcmlhbnRJbmZvOiBWYXJpYW50SW5mbztcbn0pID0+IFVzZXJFdmVudCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGlzV2l0aGluQnVzaW5lc3NIb3VyczogKHN0YXJ0VGltZTogc3RyaW5nLCBlbmRUaW1lOiBzdHJpbmcsIHRpbWVab25lOiBzdHJpbmcpID0+IGJvb2xlYW47XG5leHBvcnQgZGVjbGFyZSBlbnVtIFNlYXJjaFJlc3VsdHNTdGF0ZSB7XG4gICAgTG9hZGluZyA9IDAsXG4gICAgUmVzdWx0cyA9IDEsXG4gICAgTm9SZXN1bHRzID0gMlxufVxuZXhwb3J0IGRlY2xhcmUgY29uc3QgZ2V0U2VhcmNoUmVzdWx0c1N0YXRlOiAoaXNMb2FkaW5nU2VhcmNoOiBib29sZWFuLCBzZWFyY2hEYXRhOiBTZWFyY2hSZXN1bHQgfCBudWxsKSA9PiBTZWFyY2hSZXN1bHRzU3RhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsSUFBVyw0QkFBNEIsQ0FBQyxXQUFXLGVBQWU7QUFDbEUsSUFBVyx1QkFBdUIsQ0FBQyxXQUFXLFVBQVU7QUFDeEQsSUFBVyx1QkFBdUI7Q0FBQztPQUFXO09BQWdCO09BQUE7Q0FBQTtBQUM5RCxJQUFXLHdCQUFpQixDQUFBLElBQUE7QUFDNUIsSUFBVyxxQkFBZ0IsQ0FBQSxJQUFBO0FBQzNCLElBQVcsd0JBQXdCO0NBQUM7T0FBVztPQUFvQjtDQUFtQiJ9
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { PageVisitCategory, UserEventCategory } from '@spiffy-ai/commerce-api-client';
|
|
2
2
|
import { act, render, screen, waitFor } from '@testing-library/react';
|
|
3
|
-
import { Provider, useAtom } from 'jotai';
|
|
3
|
+
import { Provider, createStore, useAtom } from 'jotai';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import CommerceApiClient from 'src/application/commerce-api';
|
|
6
6
|
import Logger from 'src/application/logging/logger';
|
|
7
7
|
import { VariantTypeEnum } from 'src/application/models';
|
|
8
8
|
import {
|
|
9
9
|
UrlResolverResponse,
|
|
10
|
+
hasParsedVariantInfoAtom,
|
|
10
11
|
pageUserEventAtom,
|
|
11
12
|
pageVariantInfoAtom,
|
|
12
13
|
urlResolverAtom,
|
|
@@ -19,14 +20,11 @@ vi.spyOn(Logger.prototype, 'logInfo').mockImplementation(() => {});
|
|
|
19
20
|
vi.spyOn(Logger.prototype, 'logWarn').mockImplementation(() => {});
|
|
20
21
|
vi.spyOn(Logger.prototype, 'logError').mockImplementation(() => {});
|
|
21
22
|
|
|
23
|
+
// Mock useAmplitude (PageProvider dispatches page viewed event internally)
|
|
24
|
+
const { mockTrackEvent } = vi.hoisted(() => ({ mockTrackEvent: vi.fn() }));
|
|
22
25
|
vi.mock('src/contexts/amplitudeContext', () => ({
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
isReady: true,
|
|
26
|
-
}),
|
|
27
|
-
EnviveMetricsEventName: {
|
|
28
|
-
PageViewed: 'Page Viewed',
|
|
29
|
-
},
|
|
26
|
+
EnviveMetricsEventName: { PageViewed: 'Page Viewed' },
|
|
27
|
+
useAmplitude: () => ({ trackEvent: mockTrackEvent, isReady: true }),
|
|
30
28
|
}));
|
|
31
29
|
|
|
32
30
|
// Mock CommerceApiClient
|
|
@@ -37,12 +35,6 @@ vi.mock('src/application/commerce-api', () => ({
|
|
|
37
35
|
},
|
|
38
36
|
}));
|
|
39
37
|
|
|
40
|
-
// Mock useAmplitude (PageProvider dispatches page viewed event internally)
|
|
41
|
-
vi.mock('src/contexts/amplitudeContext', () => ({
|
|
42
|
-
EnviveMetricsEventName: { PageViewed: 'Page Viewed' },
|
|
43
|
-
useAmplitude: () => ({ trackEvent: vi.fn() }),
|
|
44
|
-
}));
|
|
45
|
-
|
|
46
38
|
// Component that uses the usePage hook
|
|
47
39
|
const MockComponent: React.FC = () => {
|
|
48
40
|
const context = usePage();
|
|
@@ -771,6 +763,92 @@ describe('PageProvider', () => {
|
|
|
771
763
|
});
|
|
772
764
|
});
|
|
773
765
|
|
|
766
|
+
describe('Page Viewed event', () => {
|
|
767
|
+
const pdpResponse: UrlResolverResponse = {
|
|
768
|
+
variant_type: VariantTypeEnum.Pdp,
|
|
769
|
+
specific_details: { pdp_attributes: { product_id: 'product-123' } },
|
|
770
|
+
ready: true,
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
type TrackEventArg = { eventName: string; eventProps: Record<string, unknown> };
|
|
774
|
+
// hasParsedVariantInfoAtom is normally set by useUpdateAnalyticsProps elsewhere in the
|
|
775
|
+
// app; seed it so PageProvider's Page Viewed gate opens.
|
|
776
|
+
const renderWithParsedVariantInfo = () => {
|
|
777
|
+
const store = createStore();
|
|
778
|
+
store.set(hasParsedVariantInfoAtom, true);
|
|
779
|
+
return render(
|
|
780
|
+
<Provider store={store}>
|
|
781
|
+
<PageProvider previewMode={false}>
|
|
782
|
+
<MockComponent />
|
|
783
|
+
</PageProvider>
|
|
784
|
+
</Provider>,
|
|
785
|
+
);
|
|
786
|
+
};
|
|
787
|
+
|
|
788
|
+
const getPageViewedProps = () =>
|
|
789
|
+
(mockTrackEvent.mock.calls as [TrackEventArg][]).find(
|
|
790
|
+
([arg]) => arg.eventName === 'Page Viewed',
|
|
791
|
+
)?.[0].eventProps;
|
|
792
|
+
|
|
793
|
+
it('includes context.envive_placement when the envive_placement param is present', async () => {
|
|
794
|
+
mockResolveUrl.mockResolvedValue(pdpResponse);
|
|
795
|
+
window.location.href =
|
|
796
|
+
'https://example.com/product?envive_campaign=spring&envive_placement=homepage-banner';
|
|
797
|
+
|
|
798
|
+
renderWithParsedVariantInfo();
|
|
799
|
+
|
|
800
|
+
await waitFor(() => expect(getPageViewedProps()).toBeDefined());
|
|
801
|
+
expect(getPageViewedProps()).toMatchObject({
|
|
802
|
+
'context.page_type': 'pdp',
|
|
803
|
+
'context.page_id': 'product-123',
|
|
804
|
+
'context.envive_placement': 'homepage-banner',
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
|
|
808
|
+
it('keeps the placement captured at mount when the URL is rewritten before Page Viewed fires', async () => {
|
|
809
|
+
let resolveUrl: (value: UrlResolverResponse) => void = () => {};
|
|
810
|
+
mockResolveUrl.mockReturnValue(
|
|
811
|
+
new Promise<UrlResolverResponse>(resolve => {
|
|
812
|
+
resolveUrl = resolve;
|
|
813
|
+
}),
|
|
814
|
+
);
|
|
815
|
+
window.location.href = 'https://example.com/product?envive_placement=homepage-banner';
|
|
816
|
+
|
|
817
|
+
renderWithParsedVariantInfo();
|
|
818
|
+
|
|
819
|
+
// e.g. a theme's history.replaceState('?variant=…') while url_resolving is in flight
|
|
820
|
+
window.location.href = 'https://example.com/product?variant=123';
|
|
821
|
+
await act(async () => {
|
|
822
|
+
resolveUrl(pdpResponse);
|
|
823
|
+
});
|
|
824
|
+
|
|
825
|
+
await waitFor(() => expect(getPageViewedProps()).toBeDefined());
|
|
826
|
+
expect(getPageViewedProps()).toMatchObject({
|
|
827
|
+
'context.envive_placement': 'homepage-banner',
|
|
828
|
+
});
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
it('omits context.envive_placement when the param is absent', async () => {
|
|
832
|
+
mockResolveUrl.mockResolvedValue(pdpResponse);
|
|
833
|
+
window.location.href = 'https://example.com/product';
|
|
834
|
+
|
|
835
|
+
renderWithParsedVariantInfo();
|
|
836
|
+
|
|
837
|
+
await waitFor(() => expect(getPageViewedProps()).toBeDefined());
|
|
838
|
+
expect(getPageViewedProps()).not.toHaveProperty('context.envive_placement');
|
|
839
|
+
});
|
|
840
|
+
|
|
841
|
+
it('omits context.envive_placement when the param is empty', async () => {
|
|
842
|
+
mockResolveUrl.mockResolvedValue(pdpResponse);
|
|
843
|
+
window.location.href = 'https://example.com/product?envive_placement=';
|
|
844
|
+
|
|
845
|
+
renderWithParsedVariantInfo();
|
|
846
|
+
|
|
847
|
+
await waitFor(() => expect(getPageViewedProps()).toBeDefined());
|
|
848
|
+
expect(getPageViewedProps()).not.toHaveProperty('context.envive_placement');
|
|
849
|
+
});
|
|
850
|
+
});
|
|
851
|
+
|
|
774
852
|
describe('Context Value Memoization', () => {
|
|
775
853
|
it('should memoize context value to prevent unnecessary re-renders', async () => {
|
|
776
854
|
const mockResponse: UrlResolverResponse = {
|
|
@@ -20,9 +20,11 @@ import { useAtom, useAtomValue } from 'jotai';
|
|
|
20
20
|
import { VariantTypeEnum } from 'src/application/models';
|
|
21
21
|
import CommerceApiClient from 'src/application/commerce-api';
|
|
22
22
|
import Logger from 'src/application/logging/logger';
|
|
23
|
+
import { parseHref } from 'src/application/utils/urlsParser';
|
|
23
24
|
import { PageVisitCategory, UserEventCategory } from '@spiffy-ai/commerce-api-client';
|
|
24
25
|
import { EnviveMetricsEventName, useAmplitude } from 'src/contexts/amplitudeContext';
|
|
25
26
|
import { mapApiUserEventToUserEvent, mapUrlResolverResponseToVariantInfo } from './mapping';
|
|
27
|
+
import { extractPageViewedContext } from './pageViewedContext';
|
|
26
28
|
import { PageDetails } from './types';
|
|
27
29
|
|
|
28
30
|
const logger = new Logger('pageContext');
|
|
@@ -43,6 +45,15 @@ export const PageProvider: React.FC<{
|
|
|
43
45
|
onUrlResolverNotReady?: (error: Error) => Promise<unknown> | void;
|
|
44
46
|
}> = ({ children, previewMode = false, onUrlResolverNotReady }) => {
|
|
45
47
|
const [pageUrl, setPageUrl] = useState<string | undefined>(undefined);
|
|
48
|
+
// Merchant-tagged on-site placement (?envive_placement=…) for entry-source attribution,
|
|
49
|
+
// captured on first render: theme/consent scripts can rewrite the URL (replaceState) before
|
|
50
|
+
// the Page Viewed event fires after URL resolution. Empty/absent → undefined (key omitted).
|
|
51
|
+
const [initialEnvivePlacement] = useState(
|
|
52
|
+
() =>
|
|
53
|
+
parseHref(typeof window !== 'undefined' ? window.location.href : '').urlSearchParams?.get(
|
|
54
|
+
'envive_placement',
|
|
55
|
+
) || undefined,
|
|
56
|
+
);
|
|
46
57
|
const [urlResolverResponse, setUrlResolverResponse] = useAtom(urlResolverAtom);
|
|
47
58
|
const [isLoading, setIsLoading] = useState(false);
|
|
48
59
|
const [variantInfo, setVariantInfo] = useAtom(pageVariantInfoAtom);
|
|
@@ -197,36 +208,9 @@ export const PageProvider: React.FC<{
|
|
|
197
208
|
return;
|
|
198
209
|
}
|
|
199
210
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
switch (variantInfo.variantType) {
|
|
204
|
-
case VariantTypeEnum.Pdp:
|
|
205
|
-
pageType = 'pdp';
|
|
206
|
-
pageId = variantInfo.productId;
|
|
207
|
-
break;
|
|
208
|
-
case VariantTypeEnum.Plp:
|
|
209
|
-
pageType = 'plp';
|
|
210
|
-
pageId = variantInfo.plpId;
|
|
211
|
-
break;
|
|
212
|
-
case VariantTypeEnum.Home:
|
|
213
|
-
pageType = 'homepage';
|
|
214
|
-
pageId = variantInfo.url;
|
|
215
|
-
break;
|
|
216
|
-
case VariantTypeEnum.Other:
|
|
217
|
-
pageType = 'other';
|
|
218
|
-
pageId = variantInfo.url;
|
|
219
|
-
break;
|
|
220
|
-
case VariantTypeEnum.PageVisit:
|
|
221
|
-
pageType = 'other';
|
|
222
|
-
pageId = variantInfo.url;
|
|
223
|
-
break;
|
|
224
|
-
case VariantTypeEnum.FullPageSalesAgent:
|
|
225
|
-
pageType = 'adaptive_storefront';
|
|
226
|
-
pageId = variantInfo.url;
|
|
227
|
-
break;
|
|
228
|
-
default:
|
|
229
|
-
return;
|
|
211
|
+
const pageViewedContext = extractPageViewedContext(variantInfo);
|
|
212
|
+
if (!pageViewedContext) {
|
|
213
|
+
return;
|
|
230
214
|
}
|
|
231
215
|
|
|
232
216
|
pageViewedFired.current = true;
|
|
@@ -234,14 +218,23 @@ export const PageProvider: React.FC<{
|
|
|
234
218
|
trackEvent({
|
|
235
219
|
eventName: EnviveMetricsEventName.PageViewed,
|
|
236
220
|
eventProps: {
|
|
237
|
-
'context.page_type':
|
|
238
|
-
'context.page_id':
|
|
221
|
+
'context.page_type': pageViewedContext.page_type,
|
|
222
|
+
'context.page_id': pageViewedContext.page_id,
|
|
239
223
|
'context.supported': isSupported,
|
|
240
224
|
'context.ready': isSupported,
|
|
241
225
|
'context.page_variant_id': resolvedVariantInfo.variantId,
|
|
226
|
+
...(initialEnvivePlacement ? { 'context.envive_placement': initialEnvivePlacement } : {}),
|
|
242
227
|
},
|
|
243
228
|
});
|
|
244
|
-
}, [
|
|
229
|
+
}, [
|
|
230
|
+
isLoading,
|
|
231
|
+
isSupported,
|
|
232
|
+
hasParsedVariantInfo,
|
|
233
|
+
variantInfo,
|
|
234
|
+
resolvedVariantInfo,
|
|
235
|
+
trackEvent,
|
|
236
|
+
initialEnvivePlacement,
|
|
237
|
+
]);
|
|
245
238
|
|
|
246
239
|
const setPageUrlStable = useCallback((url: string) => {
|
|
247
240
|
setPageUrl(url);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { VariantTypeEnum } from 'src/application/models';
|
|
2
|
+
import {
|
|
3
|
+
FullPageSalesAgentVariantInfo,
|
|
4
|
+
HomeVariantInfo,
|
|
5
|
+
OtherVariantInfo,
|
|
6
|
+
PDPPageVariantInfo,
|
|
7
|
+
PLPPageVariantInfo,
|
|
8
|
+
PageVariantInfo,
|
|
9
|
+
VisitPageVariantInfo,
|
|
10
|
+
} from './types';
|
|
11
|
+
|
|
12
|
+
export interface PageViewedContext {
|
|
13
|
+
page_type: string;
|
|
14
|
+
page_id: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Maps a resolved page variant to the `context.page_type` / `context.page_id` pair sent on
|
|
19
|
+
* [Envive] Page Viewed. Single source of truth for that mapping — returns null for variant
|
|
20
|
+
* types that don't emit the event.
|
|
21
|
+
*/
|
|
22
|
+
export const extractPageViewedContext = (
|
|
23
|
+
pageVariant: PageVariantInfo,
|
|
24
|
+
): PageViewedContext | null => {
|
|
25
|
+
switch (pageVariant.variantType) {
|
|
26
|
+
case VariantTypeEnum.Pdp:
|
|
27
|
+
return {
|
|
28
|
+
page_type: 'pdp',
|
|
29
|
+
page_id: (pageVariant as PDPPageVariantInfo).productId,
|
|
30
|
+
};
|
|
31
|
+
case VariantTypeEnum.Plp:
|
|
32
|
+
return {
|
|
33
|
+
page_type: 'plp',
|
|
34
|
+
page_id: (pageVariant as PLPPageVariantInfo).plpId,
|
|
35
|
+
};
|
|
36
|
+
case VariantTypeEnum.Home:
|
|
37
|
+
return {
|
|
38
|
+
page_type: 'homepage',
|
|
39
|
+
page_id: (pageVariant as HomeVariantInfo).url,
|
|
40
|
+
};
|
|
41
|
+
case VariantTypeEnum.Other:
|
|
42
|
+
return {
|
|
43
|
+
page_type: 'other',
|
|
44
|
+
page_id: (pageVariant as OtherVariantInfo).url,
|
|
45
|
+
};
|
|
46
|
+
case VariantTypeEnum.PageVisit:
|
|
47
|
+
return {
|
|
48
|
+
page_type: 'other',
|
|
49
|
+
page_id: (pageVariant as VisitPageVariantInfo).url,
|
|
50
|
+
};
|
|
51
|
+
case VariantTypeEnum.FullPageSalesAgent:
|
|
52
|
+
return {
|
|
53
|
+
page_type: 'adaptive_storefront',
|
|
54
|
+
page_id: (pageVariant as FullPageSalesAgentVariantInfo).url,
|
|
55
|
+
};
|
|
56
|
+
default:
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
};
|
package/src/contexts/typesV3.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { FloatingButtonLocation } from '@envive-ai/react-toolkit-v3/FloatingButton';
|
|
2
2
|
import { ImageGalleryImage, ImageGalleryLayout } from '@envive-ai/react-toolkit-v3/ImageGallery';
|
|
3
3
|
import { PromptButtonVariant } from '@envive-ai/react-toolkit-v3/PromptButton';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
AnimationSpeed,
|
|
6
|
+
PromptCarouselLayout,
|
|
7
|
+
PromptCarouselRows,
|
|
8
|
+
} from '@envive-ai/react-toolkit-v3/PromptCarousel';
|
|
5
9
|
import { DynamicLayout, WidgetKind } from '@envive-ai/react-toolkit-v3/SocialProof';
|
|
6
10
|
import { Theme } from '@envive-ai/react-toolkit-v3/Tokens';
|
|
7
11
|
import { SparkleIconColor } from '@envive-ai/react-toolkit-v3/WelcomeMessage';
|
|
@@ -387,6 +391,7 @@ interface ProductCardWidgetV3Config extends BaseWidgetConfig<WidgetTypeV3.Produc
|
|
|
387
391
|
fallbackColor?: string;
|
|
388
392
|
imageSrc?: string;
|
|
389
393
|
mode?: Mode;
|
|
394
|
+
promptButtonLayout?: PromptCarouselLayout;
|
|
390
395
|
}
|
|
391
396
|
|
|
392
397
|
export enum ProductCarouselLayoutV3 {
|
|
@@ -1,69 +1,24 @@
|
|
|
1
1
|
import { useAtomValue } from 'jotai';
|
|
2
2
|
import { useEffect, useRef } from 'react';
|
|
3
|
-
import { VariantTypeEnum } from 'src/application/models';
|
|
4
3
|
import { getQueryParam } from 'src/application/utils/urlsParser';
|
|
5
4
|
import { hasParsedVariantInfoAtom, variantInfoAtom } from 'src/atoms/app/variant';
|
|
6
5
|
import { EnviveMetricsEventName, useAmplitude } from 'src/contexts/amplitudeContext';
|
|
7
6
|
import { usePage } from 'src/contexts/pageContext';
|
|
8
|
-
import {
|
|
9
|
-
FullPageSalesAgentVariantInfo,
|
|
10
|
-
HomeVariantInfo,
|
|
11
|
-
OtherVariantInfo,
|
|
12
|
-
PDPPageVariantInfo,
|
|
13
|
-
PLPPageVariantInfo,
|
|
14
|
-
PageVariantInfo,
|
|
15
|
-
VisitPageVariantInfo,
|
|
16
|
-
} from 'src/contexts/pageContext/types';
|
|
7
|
+
import { extractPageViewedContext } from 'src/contexts/pageContext/pageViewedContext';
|
|
17
8
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
page_id: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export const extractPageViewedContext = (
|
|
24
|
-
pageVariant: PageVariantInfo,
|
|
25
|
-
): PageViewedContext | null => {
|
|
26
|
-
switch (pageVariant.variantType) {
|
|
27
|
-
case VariantTypeEnum.Pdp:
|
|
28
|
-
return {
|
|
29
|
-
page_type: 'pdp',
|
|
30
|
-
page_id: (pageVariant as PDPPageVariantInfo).productId,
|
|
31
|
-
};
|
|
32
|
-
case VariantTypeEnum.Plp:
|
|
33
|
-
return {
|
|
34
|
-
page_type: 'plp',
|
|
35
|
-
page_id: (pageVariant as PLPPageVariantInfo).plpId,
|
|
36
|
-
};
|
|
37
|
-
case VariantTypeEnum.Home:
|
|
38
|
-
return {
|
|
39
|
-
page_type: 'homepage',
|
|
40
|
-
page_id: (pageVariant as HomeVariantInfo).url,
|
|
41
|
-
};
|
|
42
|
-
case VariantTypeEnum.Other:
|
|
43
|
-
return {
|
|
44
|
-
page_type: 'other',
|
|
45
|
-
page_id: (pageVariant as OtherVariantInfo).url,
|
|
46
|
-
};
|
|
47
|
-
case VariantTypeEnum.PageVisit:
|
|
48
|
-
return {
|
|
49
|
-
page_type: 'other',
|
|
50
|
-
page_id: (pageVariant as VisitPageVariantInfo).url,
|
|
51
|
-
};
|
|
52
|
-
case VariantTypeEnum.FullPageSalesAgent:
|
|
53
|
-
return {
|
|
54
|
-
page_type: 'adaptive_storefront',
|
|
55
|
-
page_id: (pageVariant as FullPageSalesAgentVariantInfo).url,
|
|
56
|
-
};
|
|
57
|
-
default:
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
};
|
|
9
|
+
// Re-exported for compatibility with the public ./hooks/PageViewedEvent subpath.
|
|
10
|
+
export { extractPageViewedContext };
|
|
61
11
|
|
|
62
12
|
/**
|
|
63
13
|
* Fires the [Envive] Page Viewed event once per page load when page context data is ready.
|
|
64
14
|
*
|
|
65
15
|
* This event captures page context information and is intended to eventually replace
|
|
66
16
|
* the [Amplitude] Page Viewed event.
|
|
17
|
+
*
|
|
18
|
+
* @deprecated `PageProvider` (contexts/pageContext) already fires [Envive] Page Viewed;
|
|
19
|
+
* mounting this hook alongside it double-fires the event. Not used by the injection
|
|
20
|
+
* bundle. Retained only for compatibility with the public `./hooks/PageViewedEvent`
|
|
21
|
+
* subpath and will be removed in a future breaking release.
|
|
67
22
|
*/
|
|
68
23
|
export const usePageViewedEvent = () => {
|
|
69
24
|
const hasFired = useRef(false);
|