@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.
Files changed (75) hide show
  1. package/dist/atoms/app/index.d.cts +7 -7
  2. package/dist/atoms/app/index.d.ts +1 -1
  3. package/dist/atoms/app/variant.d.cts +6 -6
  4. package/dist/atoms/chat/chatState.d.cts +19 -19
  5. package/dist/atoms/chat/chatState.d.ts +19 -19
  6. package/dist/atoms/chat/form.d.cts +2 -2
  7. package/dist/atoms/chat/form.d.ts +2 -2
  8. package/dist/atoms/chat/index.d.cts +3 -3
  9. package/dist/atoms/chat/index.d.ts +3 -3
  10. package/dist/atoms/chat/lastMessage.d.cts +2 -2
  11. package/dist/atoms/chat/lastMessage.d.ts +2 -2
  12. package/dist/atoms/chat/messageQueue.d.cts +6 -6
  13. package/dist/atoms/chat/messageQueue.d.ts +6 -6
  14. package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
  15. package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
  16. package/dist/atoms/chat/renderedWidgetRefs.d.cts +2 -2
  17. package/dist/atoms/chat/renderedWidgetRefs.d.ts +2 -2
  18. package/dist/atoms/chat/replies.d.cts +3 -3
  19. package/dist/atoms/chat/replies.d.ts +2 -2
  20. package/dist/atoms/chat/suggestions.d.cts +2 -2
  21. package/dist/atoms/chat/suggestions.d.ts +2 -2
  22. package/dist/atoms/envive/enviveConfig.d.cts +14 -14
  23. package/dist/atoms/envive/enviveConfig.d.ts +13 -13
  24. package/dist/atoms/globalSearch/globalSearch.d.cts +5 -5
  25. package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
  26. package/dist/atoms/org/customerService.d.cts +6 -6
  27. package/dist/atoms/org/customerService.d.ts +6 -6
  28. package/dist/atoms/org/graphqlConfig.d.cts +4 -4
  29. package/dist/atoms/org/graphqlConfig.d.ts +4 -4
  30. package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
  31. package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
  32. package/dist/atoms/org/orgAnalyticsConfig.d.cts +4 -4
  33. package/dist/atoms/org/orgAnalyticsConfig.d.ts +4 -4
  34. package/dist/atoms/search/chatSearch.d.cts +17 -17
  35. package/dist/atoms/search/chatSearch.d.ts +17 -17
  36. package/dist/atoms/search/searchAPI.d.cts +13 -13
  37. package/dist/atoms/search/searchAPI.d.ts +13 -13
  38. package/dist/atoms/search/types.d.ts +1 -1
  39. package/dist/atoms/search/utils.d.ts +1 -1
  40. package/dist/contexts/enviveContext/types.d.cts +1 -1
  41. package/dist/contexts/pageContext/index.cjs +2 -0
  42. package/dist/contexts/pageContext/index.d.cts +2 -1
  43. package/dist/contexts/pageContext/index.d.ts +2 -1
  44. package/dist/contexts/pageContext/index.js +2 -1
  45. package/dist/contexts/pageContext/pageContext.cjs +12 -34
  46. package/dist/contexts/pageContext/pageContext.js +12 -34
  47. package/dist/contexts/pageContext/pageViewedContext.cjs +42 -0
  48. package/dist/contexts/pageContext/pageViewedContext.d.cts +16 -0
  49. package/dist/contexts/pageContext/pageViewedContext.d.ts +16 -0
  50. package/dist/contexts/pageContext/pageViewedContext.js +42 -0
  51. package/dist/contexts/systemSettingsContext/systemSettingsContext.d.ts +2 -2
  52. package/dist/contexts/types.d.cts +1 -1
  53. package/dist/contexts/types.d.ts +1 -1
  54. package/dist/contexts/typesV3.cjs +1 -1
  55. package/dist/contexts/typesV3.d.cts +3 -2
  56. package/dist/contexts/typesV3.d.ts +3 -2
  57. package/dist/contexts/typesV3.js +1 -1
  58. package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.ts +2 -2
  59. package/dist/hooks/PageViewedEvent/index.cjs +2 -1
  60. package/dist/hooks/PageViewedEvent/index.d.cts +2 -1
  61. package/dist/hooks/PageViewedEvent/index.d.ts +2 -1
  62. package/dist/hooks/PageViewedEvent/index.js +2 -1
  63. package/dist/hooks/PageViewedEvent/usePageViewedEvent.cjs +8 -34
  64. package/dist/hooks/PageViewedEvent/usePageViewedEvent.d.cts +9 -8
  65. package/dist/hooks/PageViewedEvent/usePageViewedEvent.d.ts +9 -8
  66. package/dist/hooks/PageViewedEvent/usePageViewedEvent.js +8 -33
  67. package/dist/hooks/utils.d.cts +1 -1
  68. package/dist/hooks/utils.d.ts +1 -1
  69. package/package.json +1 -1
  70. package/src/contexts/pageContext/__tests__/pageContext.test.tsx +92 -14
  71. package/src/contexts/pageContext/index.ts +1 -0
  72. package/src/contexts/pageContext/pageContext.tsx +26 -33
  73. package/src/contexts/pageContext/pageViewedContext.ts +59 -0
  74. package/src/contexts/typesV3.ts +6 -1
  75. 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 { extractPageViewedContext, usePageViewedEvent };
85
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlUGFnZVZpZXdlZEV2ZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9QYWdlVmlld2VkRXZlbnQvdXNlUGFnZVZpZXdlZEV2ZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUF0b21WYWx1ZSB9IGZyb20gJ2pvdGFpJztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgVmFyaWFudFR5cGVFbnVtIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5pbXBvcnQgeyBnZXRRdWVyeVBhcmFtIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL3V0aWxzL3VybHNQYXJzZXInO1xuaW1wb3J0IHsgaGFzUGFyc2VkVmFyaWFudEluZm9BdG9tLCB2YXJpYW50SW5mb0F0b20gfSBmcm9tICdzcmMvYXRvbXMvYXBwL3ZhcmlhbnQnO1xuaW1wb3J0IHsgRW52aXZlTWV0cmljc0V2ZW50TmFtZSwgdXNlQW1wbGl0dWRlIH0gZnJvbSAnc3JjL2NvbnRleHRzL2FtcGxpdHVkZUNvbnRleHQnO1xuaW1wb3J0IHsgdXNlUGFnZSB9IGZyb20gJ3NyYy9jb250ZXh0cy9wYWdlQ29udGV4dCc7XG5pbXBvcnQge1xuICBGdWxsUGFnZVNhbGVzQWdlbnRWYXJpYW50SW5mbyxcbiAgSG9tZVZhcmlhbnRJbmZvLFxuICBPdGhlclZhcmlhbnRJbmZvLFxuICBQRFBQYWdlVmFyaWFudEluZm8sXG4gIFBMUFBhZ2VWYXJpYW50SW5mbyxcbiAgUGFnZVZhcmlhbnRJbmZvLFxuICBWaXNpdFBhZ2VWYXJpYW50SW5mbyxcbn0gZnJvbSAnc3JjL2NvbnRleHRzL3BhZ2VDb250ZXh0L3R5cGVzJztcblxuaW50ZXJmYWNlIFBhZ2VWaWV3ZWRDb250ZXh0IHtcbiAgcGFnZV90eXBlOiBzdHJpbmc7XG4gIHBhZ2VfaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RQYWdlVmlld2VkQ29udGV4dCA9IChcbiAgcGFnZVZhcmlhbnQ6IFBhZ2VWYXJpYW50SW5mbyxcbik6IFBhZ2VWaWV3ZWRDb250ZXh0IHwgbnVsbCA9PiB7XG4gIHN3aXRjaCAocGFnZVZhcmlhbnQudmFyaWFudFR5cGUpIHtcbiAgICBjYXNlIFZhcmlhbnRUeXBlRW51bS5QZHA6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYWdlX3R5cGU6ICdwZHAnLFxuICAgICAgICBwYWdlX2lkOiAocGFnZVZhcmlhbnQgYXMgUERQUGFnZVZhcmlhbnRJbmZvKS5wcm9kdWN0SWQsXG4gICAgICB9O1xuICAgIGNhc2UgVmFyaWFudFR5cGVFbnVtLlBscDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhZ2VfdHlwZTogJ3BscCcsXG4gICAgICAgIHBhZ2VfaWQ6IChwYWdlVmFyaWFudCBhcyBQTFBQYWdlVmFyaWFudEluZm8pLnBscElkLFxuICAgICAgfTtcbiAgICBjYXNlIFZhcmlhbnRUeXBlRW51bS5Ib21lOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZV90eXBlOiAnaG9tZXBhZ2UnLFxuICAgICAgICBwYWdlX2lkOiAocGFnZVZhcmlhbnQgYXMgSG9tZVZhcmlhbnRJbmZvKS51cmwsXG4gICAgICB9O1xuICAgIGNhc2UgVmFyaWFudFR5cGVFbnVtLk90aGVyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFnZV90eXBlOiAnb3RoZXInLFxuICAgICAgICBwYWdlX2lkOiAocGFnZVZhcmlhbnQgYXMgT3RoZXJWYXJpYW50SW5mbykudXJsLFxuICAgICAgfTtcbiAgICBjYXNlIFZhcmlhbnRUeXBlRW51bS5QYWdlVmlzaXQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYWdlX3R5cGU6ICdvdGhlcicsXG4gICAgICAgIHBhZ2VfaWQ6IChwYWdlVmFyaWFudCBhcyBWaXNpdFBhZ2VWYXJpYW50SW5mbykudXJsLFxuICAgICAgfTtcbiAgICBjYXNlIFZhcmlhbnRUeXBlRW51bS5GdWxsUGFnZVNhbGVzQWdlbnQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYWdlX3R5cGU6ICdhZGFwdGl2ZV9zdG9yZWZyb250JyxcbiAgICAgICAgcGFnZV9pZDogKHBhZ2VWYXJpYW50IGFzIEZ1bGxQYWdlU2FsZXNBZ2VudFZhcmlhbnRJbmZvKS51cmwsXG4gICAgICB9O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBGaXJlcyB0aGUgW0Vudml2ZV0gUGFnZSBWaWV3ZWQgZXZlbnQgb25jZSBwZXIgcGFnZSBsb2FkIHdoZW4gcGFnZSBjb250ZXh0IGRhdGEgaXMgcmVhZHkuXG4gKlxuICogVGhpcyBldmVudCBjYXB0dXJlcyBwYWdlIGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGlzIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgcmVwbGFjZVxuICogdGhlIFtBbXBsaXR1ZGVdIFBhZ2UgVmlld2VkIGV2ZW50LlxuICovXG5leHBvcnQgY29uc3QgdXNlUGFnZVZpZXdlZEV2ZW50ID0gKCkgPT4ge1xuICBjb25zdCBoYXNGaXJlZCA9IHVzZVJlZihmYWxzZSk7XG4gIGNvbnN0IHsgdHJhY2tFdmVudCB9ID0gdXNlQW1wbGl0dWRlKCk7XG4gIGNvbnN0IHsgdmFyaWFudEluZm86IHBhZ2VWYXJpYW50SW5mbywgaXNTdXBwb3J0ZWQsIGlzTG9hZGluZyB9ID0gdXNlUGFnZSgpO1xuICBjb25zdCB2YXJpYW50SW5mbyA9IHVzZUF0b21WYWx1ZSh2YXJpYW50SW5mb0F0b20pO1xuICBjb25zdCBoYXNQYXJzZWRWYXJpYW50SW5mbyA9IHVzZUF0b21WYWx1ZShoYXNQYXJzZWRWYXJpYW50SW5mb0F0b20pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGhhc0ZpcmVkLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNMb2FkaW5nIHx8ICFoYXNQYXJzZWRWYXJpYW50SW5mbyB8fCAhcGFnZVZhcmlhbnRJbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFnZUNvbnRleHQgPSBleHRyYWN0UGFnZVZpZXdlZENvbnRleHQocGFnZVZhcmlhbnRJbmZvKTtcbiAgICBpZiAoIXBhZ2VDb250ZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGFzRmlyZWQuY3VycmVudCA9IHRydWU7XG5cbiAgICBjb25zdCBlbnZpdmVQbGFjZW1lbnQgPSBnZXRRdWVyeVBhcmFtKCdlbnZpdmVfcGxhY2VtZW50Jyk7XG5cbiAgICB0cmFja0V2ZW50KHtcbiAgICAgIGV2ZW50TmFtZTogRW52aXZlTWV0cmljc0V2ZW50TmFtZS5QYWdlVmlld2VkLFxuICAgICAgZXZlbnRQcm9wczoge1xuICAgICAgICAnY29udGV4dC5wYWdlX3R5cGUnOiBwYWdlQ29udGV4dC5wYWdlX3R5cGUsXG4gICAgICAgICdjb250ZXh0LnBhZ2VfaWQnOiBwYWdlQ29udGV4dC5wYWdlX2lkLFxuICAgICAgICAvLyBjb250ZXh0LnN1cHBvcnRlZCBhbmQgY29udGV4dC5yZWFkeSBib3RoIGRlcml2ZSBmcm9tIGlzU3VwcG9ydGVkIChyZXNwb25zZS5yZWFkeSlcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgc3VwcG9ydGVkRXZlbnRBdG9tIGlzIG5vdCBjdXJyZW50bHkgcG9wdWxhdGVkLlxuICAgICAgICAnY29udGV4dC5zdXBwb3J0ZWQnOiBpc1N1cHBvcnRlZCxcbiAgICAgICAgJ2NvbnRleHQucmVhZHknOiBpc1N1cHBvcnRlZCxcbiAgICAgICAgJ2NvbnRleHQucGFnZV92YXJpYW50X2lkJzogdmFyaWFudEluZm8udmFyaWFudElkLFxuICAgICAgICAuLi4oZW52aXZlUGxhY2VtZW50ID8geyAnY29udGV4dC5lbnZpdmVfcGxhY2VtZW50JzogZW52aXZlUGxhY2VtZW50IH0gOiB7fSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9LCBbaXNMb2FkaW5nLCBpc1N1cHBvcnRlZCwgaGFzUGFyc2VkVmFyaWFudEluZm8sIHBhZ2VWYXJpYW50SW5mbywgdmFyaWFudEluZm8sIHRyYWNrRXZlbnRdKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFzQkEsTUFBYSw0QkFDWCxnQkFDNkI7QUFDN0IsU0FBUSxZQUFZLGFBQXBCO0VBQ0UsS0FBSyxnQkFBZ0IsSUFDbkIsUUFBTztHQUNMLFdBQVc7R0FDWCxTQUFVLFlBQW1DO0dBQzlDO0VBQ0gsS0FBSyxnQkFBZ0IsSUFDbkIsUUFBTztHQUNMLFdBQVc7R0FDWCxTQUFVLFlBQW1DO0dBQzlDO0VBQ0gsS0FBSyxnQkFBZ0IsS0FDbkIsUUFBTztHQUNMLFdBQVc7R0FDWCxTQUFVLFlBQWdDO0dBQzNDO0VBQ0gsS0FBSyxnQkFBZ0IsTUFDbkIsUUFBTztHQUNMLFdBQVc7R0FDWCxTQUFVLFlBQWlDO0dBQzVDO0VBQ0gsS0FBSyxnQkFBZ0IsVUFDbkIsUUFBTztHQUNMLFdBQVc7R0FDWCxTQUFVLFlBQXFDO0dBQ2hEO0VBQ0gsS0FBSyxnQkFBZ0IsbUJBQ25CLFFBQU87R0FDTCxXQUFXO0dBQ1gsU0FBVSxZQUE4QztHQUN6RDtFQUNILFFBQ0UsUUFBTzs7Ozs7Ozs7O0FBVWIsTUFBYSwyQkFBMkI7Q0FDdEMsTUFBTSxXQUFXLE9BQU8sTUFBTTtDQUM5QixNQUFNLEVBQUUsZUFBZSxjQUFjO0NBQ3JDLE1BQU0sRUFBRSxhQUFhLGlCQUFpQixhQUFhLGNBQWMsU0FBUztDQUMxRSxNQUFNLGNBQWMsYUFBYSxnQkFBZ0I7Q0FDakQsTUFBTSx1QkFBdUIsYUFBYSx5QkFBeUI7QUFFbkUsaUJBQWdCO0FBQ2QsTUFBSSxTQUFTLFFBQ1g7QUFHRixNQUFJLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFDekM7RUFHRixNQUFNLGNBQWMseUJBQXlCLGdCQUFnQjtBQUM3RCxNQUFJLENBQUMsWUFDSDtBQUdGLFdBQVMsVUFBVTtFQUVuQixNQUFNLGtCQUFrQixjQUFjLG1CQUFtQjtBQUV6RCxhQUFXO0dBQ1QsV0FBVyx1QkFBdUI7R0FDbEMsWUFBWTtJQUNWLHFCQUFxQixZQUFZO0lBQ2pDLG1CQUFtQixZQUFZO0lBRy9CLHFCQUFxQjtJQUNyQixpQkFBaUI7SUFDakIsMkJBQTJCLFlBQVk7SUFDdkMsR0FBSSxrQkFBa0IsRUFBRSw0QkFBNEIsaUJBQWlCLEdBQUcsRUFBRTtJQUMzRTtHQUNGLENBQUM7SUFDRDtFQUFDO0VBQVc7RUFBYTtFQUFzQjtFQUFpQjtFQUFhO0VBQVcsQ0FBQyJ9
59
+ export { usePageViewedEvent };
60
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlUGFnZVZpZXdlZEV2ZW50LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy9QYWdlVmlld2VkRXZlbnQvdXNlUGFnZVZpZXdlZEV2ZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZUF0b21WYWx1ZSB9IGZyb20gJ2pvdGFpJztcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZ2V0UXVlcnlQYXJhbSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi91dGlscy91cmxzUGFyc2VyJztcbmltcG9ydCB7IGhhc1BhcnNlZFZhcmlhbnRJbmZvQXRvbSwgdmFyaWFudEluZm9BdG9tIH0gZnJvbSAnc3JjL2F0b21zL2FwcC92YXJpYW50JztcbmltcG9ydCB7IEVudml2ZU1ldHJpY3NFdmVudE5hbWUsIHVzZUFtcGxpdHVkZSB9IGZyb20gJ3NyYy9jb250ZXh0cy9hbXBsaXR1ZGVDb250ZXh0JztcbmltcG9ydCB7IHVzZVBhZ2UgfSBmcm9tICdzcmMvY29udGV4dHMvcGFnZUNvbnRleHQnO1xuaW1wb3J0IHsgZXh0cmFjdFBhZ2VWaWV3ZWRDb250ZXh0IH0gZnJvbSAnc3JjL2NvbnRleHRzL3BhZ2VDb250ZXh0L3BhZ2VWaWV3ZWRDb250ZXh0JztcblxuLy8gUmUtZXhwb3J0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgcHVibGljIC4vaG9va3MvUGFnZVZpZXdlZEV2ZW50IHN1YnBhdGguXG5leHBvcnQgeyBleHRyYWN0UGFnZVZpZXdlZENvbnRleHQgfTtcblxuLyoqXG4gKiBGaXJlcyB0aGUgW0Vudml2ZV0gUGFnZSBWaWV3ZWQgZXZlbnQgb25jZSBwZXIgcGFnZSBsb2FkIHdoZW4gcGFnZSBjb250ZXh0IGRhdGEgaXMgcmVhZHkuXG4gKlxuICogVGhpcyBldmVudCBjYXB0dXJlcyBwYWdlIGNvbnRleHQgaW5mb3JtYXRpb24gYW5kIGlzIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgcmVwbGFjZVxuICogdGhlIFtBbXBsaXR1ZGVdIFBhZ2UgVmlld2VkIGV2ZW50LlxuICpcbiAqIEBkZXByZWNhdGVkIGBQYWdlUHJvdmlkZXJgIChjb250ZXh0cy9wYWdlQ29udGV4dCkgYWxyZWFkeSBmaXJlcyBbRW52aXZlXSBQYWdlIFZpZXdlZDtcbiAqIG1vdW50aW5nIHRoaXMgaG9vayBhbG9uZ3NpZGUgaXQgZG91YmxlLWZpcmVzIHRoZSBldmVudC4gTm90IHVzZWQgYnkgdGhlIGluamVjdGlvblxuICogYnVuZGxlLiBSZXRhaW5lZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHB1YmxpYyBgLi9ob29rcy9QYWdlVmlld2VkRXZlbnRgXG4gKiBzdWJwYXRoIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgYnJlYWtpbmcgcmVsZWFzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZVBhZ2VWaWV3ZWRFdmVudCA9ICgpID0+IHtcbiAgY29uc3QgaGFzRmlyZWQgPSB1c2VSZWYoZmFsc2UpO1xuICBjb25zdCB7IHRyYWNrRXZlbnQgfSA9IHVzZUFtcGxpdHVkZSgpO1xuICBjb25zdCB7IHZhcmlhbnRJbmZvOiBwYWdlVmFyaWFudEluZm8sIGlzU3VwcG9ydGVkLCBpc0xvYWRpbmcgfSA9IHVzZVBhZ2UoKTtcbiAgY29uc3QgdmFyaWFudEluZm8gPSB1c2VBdG9tVmFsdWUodmFyaWFudEluZm9BdG9tKTtcbiAgY29uc3QgaGFzUGFyc2VkVmFyaWFudEluZm8gPSB1c2VBdG9tVmFsdWUoaGFzUGFyc2VkVmFyaWFudEluZm9BdG9tKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChoYXNGaXJlZC5jdXJyZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzTG9hZGluZyB8fCAhaGFzUGFyc2VkVmFyaWFudEluZm8gfHwgIXBhZ2VWYXJpYW50SW5mbykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VDb250ZXh0ID0gZXh0cmFjdFBhZ2VWaWV3ZWRDb250ZXh0KHBhZ2VWYXJpYW50SW5mbyk7XG4gICAgaWYgKCFwYWdlQ29udGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhhc0ZpcmVkLmN1cnJlbnQgPSB0cnVlO1xuXG4gICAgY29uc3QgZW52aXZlUGxhY2VtZW50ID0gZ2V0UXVlcnlQYXJhbSgnZW52aXZlX3BsYWNlbWVudCcpO1xuXG4gICAgdHJhY2tFdmVudCh7XG4gICAgICBldmVudE5hbWU6IEVudml2ZU1ldHJpY3NFdmVudE5hbWUuUGFnZVZpZXdlZCxcbiAgICAgIGV2ZW50UHJvcHM6IHtcbiAgICAgICAgJ2NvbnRleHQucGFnZV90eXBlJzogcGFnZUNvbnRleHQucGFnZV90eXBlLFxuICAgICAgICAnY29udGV4dC5wYWdlX2lkJzogcGFnZUNvbnRleHQucGFnZV9pZCxcbiAgICAgICAgLy8gY29udGV4dC5zdXBwb3J0ZWQgYW5kIGNvbnRleHQucmVhZHkgYm90aCBkZXJpdmUgZnJvbSBpc1N1cHBvcnRlZCAocmVzcG9uc2UucmVhZHkpXG4gICAgICAgIC8vIGJlY2F1c2UgdGhlIHN1cHBvcnRlZEV2ZW50QXRvbSBpcyBub3QgY3VycmVudGx5IHBvcHVsYXRlZC5cbiAgICAgICAgJ2NvbnRleHQuc3VwcG9ydGVkJzogaXNTdXBwb3J0ZWQsXG4gICAgICAgICdjb250ZXh0LnJlYWR5JzogaXNTdXBwb3J0ZWQsXG4gICAgICAgICdjb250ZXh0LnBhZ2VfdmFyaWFudF9pZCc6IHZhcmlhbnRJbmZvLnZhcmlhbnRJZCxcbiAgICAgICAgLi4uKGVudml2ZVBsYWNlbWVudCA/IHsgJ2NvbnRleHQuZW52aXZlX3BsYWNlbWVudCc6IGVudml2ZVBsYWNlbWVudCB9IDoge30pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSwgW2lzTG9hZGluZywgaXNTdXBwb3J0ZWQsIGhhc1BhcnNlZFZhcmlhbnRJbmZvLCBwYWdlVmFyaWFudEluZm8sIHZhcmlhbnRJbmZvLCB0cmFja0V2ZW50XSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQSxNQUFhLDJCQUEyQjtDQUN0QyxNQUFNLFdBQVcsT0FBTyxNQUFNO0NBQzlCLE1BQU0sRUFBRSxlQUFlLGNBQWM7Q0FDckMsTUFBTSxFQUFFLGFBQWEsaUJBQWlCLGFBQWEsY0FBYyxTQUFTO0NBQzFFLE1BQU0sY0FBYyxhQUFhLGdCQUFnQjtDQUNqRCxNQUFNLHVCQUF1QixhQUFhLHlCQUF5QjtBQUVuRSxpQkFBZ0I7QUFDZCxNQUFJLFNBQVMsUUFDWDtBQUdGLE1BQUksYUFBYSxDQUFDLHdCQUF3QixDQUFDLGdCQUN6QztFQUdGLE1BQU0sY0FBYyx5QkFBeUIsZ0JBQWdCO0FBQzdELE1BQUksQ0FBQyxZQUNIO0FBR0YsV0FBUyxVQUFVO0VBRW5CLE1BQU0sa0JBQWtCLGNBQWMsbUJBQW1CO0FBRXpELGFBQVc7R0FDVCxXQUFXLHVCQUF1QjtHQUNsQyxZQUFZO0lBQ1YscUJBQXFCLFlBQVk7SUFDakMsbUJBQW1CLFlBQVk7SUFHL0IscUJBQXFCO0lBQ3JCLGlCQUFpQjtJQUNqQiwyQkFBMkIsWUFBWTtJQUN2QyxHQUFJLGtCQUFrQixFQUFFLDRCQUE0QixpQkFBaUIsR0FBRyxFQUFFO0lBQzNFO0dBQ0YsQ0FBQztJQUNEO0VBQUM7RUFBVztFQUFhO0VBQXNCO0VBQWlCO0VBQWE7RUFBVyxDQUFDIn0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC5jdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3V0aWxzLmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvc2VhcmNoJztcbmltcG9ydCB7IFVzZXJFdmVudCwgVmFyaWFudEluZm8gfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGlzRWxlbWVudFBhcnRpYWxseVZpc2libGU6IChlbD86IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4gYm9vbGVhbjtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGNyZWF0ZUFwcExvYWRlZEV2ZW50OiAoKSA9PiBVc2VyRXZlbnQ7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBjcmVhdGVWaXNpdFVzZXJFdmVudDogKHsgdmFyaWFudEluZm8sIH06IHtcbiAgICB2YXJpYW50SW5mbzogVmFyaWFudEluZm87XG59KSA9PiBVc2VyRXZlbnQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBpc1dpdGhpbkJ1c2luZXNzSG91cnM6IChzdGFydFRpbWU6IHN0cmluZywgZW5kVGltZTogc3RyaW5nLCB0aW1lWm9uZTogc3RyaW5nKSA9PiBib29sZWFuO1xuZXhwb3J0IGRlY2xhcmUgZW51bSBTZWFyY2hSZXN1bHRzU3RhdGUge1xuICAgIExvYWRpbmcgPSAwLFxuICAgIFJlc3VsdHMgPSAxLFxuICAgIE5vUmVzdWx0cyA9IDJcbn1cbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGdldFNlYXJjaFJlc3VsdHNTdGF0ZTogKGlzTG9hZGluZ1NlYXJjaDogYm9vbGVhbiwgc2VhcmNoRGF0YTogU2VhcmNoUmVzdWx0IHwgbnVsbCkgPT4gU2VhcmNoUmVzdWx0c1N0YXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUVBLElBQVcsNEJBQTRCLENBQUMsU0FBUyxlQUFlO0FBQ2hFLElBQVcsdUJBQXVCLENBQUMsU0FBUyxVQUFVO0FBQ3RELElBQVcsdUJBQXVCO0NBQUM7T0FBUztPQUFrQjtPQUFBO0NBQUE7QUFDOUQsSUFBVyx3QkFBaUIsQ0FBQSxFQUFBO0FBQzVCLElBQVcscUJBQWdCLENBQUEsRUFBQTtBQUMzQixJQUFXLHdCQUF3QjtDQUFDO09BQVM7T0FBb0I7Q0FBbUIifQ==
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC5jdHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3V0aWxzLmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VhcmNoUmVzdWx0IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvc2VhcmNoJztcbmltcG9ydCB7IFVzZXJFdmVudCwgVmFyaWFudEluZm8gfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzJztcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGlzRWxlbWVudFBhcnRpYWxseVZpc2libGU6IChlbD86IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4gYm9vbGVhbjtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGNyZWF0ZUFwcExvYWRlZEV2ZW50OiAoKSA9PiBVc2VyRXZlbnQ7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBjcmVhdGVWaXNpdFVzZXJFdmVudDogKHsgdmFyaWFudEluZm8sIH06IHtcbiAgICB2YXJpYW50SW5mbzogVmFyaWFudEluZm87XG59KSA9PiBVc2VyRXZlbnQgfCB1bmRlZmluZWQ7XG5leHBvcnQgZGVjbGFyZSBjb25zdCBpc1dpdGhpbkJ1c2luZXNzSG91cnM6IChzdGFydFRpbWU6IHN0cmluZywgZW5kVGltZTogc3RyaW5nLCB0aW1lWm9uZTogc3RyaW5nKSA9PiBib29sZWFuO1xuZXhwb3J0IGRlY2xhcmUgZW51bSBTZWFyY2hSZXN1bHRzU3RhdGUge1xuICAgIExvYWRpbmcgPSAwLFxuICAgIFJlc3VsdHMgPSAxLFxuICAgIE5vUmVzdWx0cyA9IDJcbn1cbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGdldFNlYXJjaFJlc3VsdHNTdGF0ZTogKGlzTG9hZGluZ1NlYXJjaDogYm9vbGVhbiwgc2VhcmNoRGF0YTogU2VhcmNoUmVzdWx0IHwgbnVsbCkgPT4gU2VhcmNoUmVzdWx0c1N0YXRlO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUVBLElBQVcsNEJBQTRCLENBQUMsV0FBVyxlQUFlO0FBQ2xFLElBQVcsdUJBQXVCLENBQUMsV0FBVyxVQUFVO0FBQ3hELElBQVcsdUJBQXVCO0NBQUM7T0FBVztPQUFnQjtPQUFBO0NBQUE7QUFDOUQsSUFBVyx3QkFBaUIsQ0FBQSxJQUFBO0FBQzVCLElBQVcscUJBQWdCLENBQUEsSUFBQTtBQUMzQixJQUFXLHdCQUF3QjtDQUFDO09BQVc7T0FBb0I7Q0FBbUIifQ==
@@ -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+IGJvb2xlYW47XG5leHBvcnQgZGVjbGFyZSBlbnVtIFNlYXJjaFJlc3VsdHNTdGF0ZSB7XG4gICAgTG9hZGluZyA9IDAsXG4gICAgUmVzdWx0cyA9IDEsXG4gICAgTm9SZXN1bHRzID0gMlxufVxuZXhwb3J0IGRlY2xhcmUgY29uc3QgZ2V0U2VhcmNoUmVzdWx0c1N0YXRlOiAoaXNMb2FkaW5nU2VhcmNoOiBib29sZWFuLCBzZWFyY2hEYXRhOiBTZWFyY2hSZXN1bHQgfCBudWxsKSA9PiBTZWFyY2hSZXN1bHRzU3RhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsSUFBVyw0QkFBNEIsQ0FBQyxTQUFTLGVBQWU7QUFDaEUsSUFBVyx1QkFBdUIsQ0FBQyxTQUFTLFVBQVU7QUFDdEQsSUFBVyx1QkFBdUI7Q0FBQztPQUFTO09BQWtCO09BQUE7Q0FBQTtBQUM5RCxJQUFXLHdCQUFpQixDQUFBLEVBQUE7QUFDNUIsSUFBVyxxQkFBZ0IsQ0FBQSxFQUFBO0FBQzNCLElBQVcsd0JBQXdCO0NBQUM7T0FBUztPQUFvQjtDQUFtQiJ9
22
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZC50cyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvaG9va3MvdXRpbHMuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWFyY2hSZXN1bHQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9zZWFyY2gnO1xuaW1wb3J0IHsgVXNlckV2ZW50LCBWYXJpYW50SW5mbyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgaXNFbGVtZW50UGFydGlhbGx5VmlzaWJsZTogKGVsPzogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiBib29sZWFuO1xuZXhwb3J0IGRlY2xhcmUgY29uc3QgY3JlYXRlQXBwTG9hZGVkRXZlbnQ6ICgpID0+IFVzZXJFdmVudDtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGNyZWF0ZVZpc2l0VXNlckV2ZW50OiAoeyB2YXJpYW50SW5mbywgfToge1xuICAgIHZhcmlhbnRJbmZvOiBWYXJpYW50SW5mbztcbn0pID0+IFVzZXJFdmVudCB8IHVuZGVmaW5lZDtcbmV4cG9ydCBkZWNsYXJlIGNvbnN0IGlzV2l0aGluQnVzaW5lc3NIb3VyczogKHN0YXJ0VGltZTogc3RyaW5nLCBlbmRUaW1lOiBzdHJpbmcsIHRpbWVab25lOiBzdHJpbmcpID0+IGJvb2xlYW47XG5leHBvcnQgZGVjbGFyZSBlbnVtIFNlYXJjaFJlc3VsdHNTdGF0ZSB7XG4gICAgTG9hZGluZyA9IDAsXG4gICAgUmVzdWx0cyA9IDEsXG4gICAgTm9SZXN1bHRzID0gMlxufVxuZXhwb3J0IGRlY2xhcmUgY29uc3QgZ2V0U2VhcmNoUmVzdWx0c1N0YXRlOiAoaXNMb2FkaW5nU2VhcmNoOiBib29sZWFuLCBzZWFyY2hEYXRhOiBTZWFyY2hSZXN1bHQgfCBudWxsKSA9PiBTZWFyY2hSZXN1bHRzU3RhdGU7XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsSUFBVyw0QkFBNEIsQ0FBQyxXQUFXLGVBQWU7QUFDbEUsSUFBVyx1QkFBdUIsQ0FBQyxXQUFXLFVBQVU7QUFDeEQsSUFBVyx1QkFBdUI7Q0FBQztPQUFXO09BQWdCO09BQUE7Q0FBQTtBQUM5RCxJQUFXLHdCQUFpQixDQUFBLElBQUE7QUFDNUIsSUFBVyxxQkFBZ0IsQ0FBQSxJQUFBO0FBQzNCLElBQVcsd0JBQXdCO0NBQUM7T0FBVztPQUFvQjtDQUFtQiJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@envive-ai/react-hooks",
3
- "version": "0.3.67",
3
+ "version": "0.3.69",
4
4
  "description": "React hooks for connecting to Envive AI services.",
5
5
  "keywords": [
6
6
  "react",
@@ -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
- useAmplitude: () => ({
24
- trackEvent: vi.fn(),
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 = {
@@ -1,2 +1,3 @@
1
1
  export * from './pageContext';
2
2
  export * from './mapping';
3
+ export * from './pageViewedContext';
@@ -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
- let pageType: string;
201
- let pageId: string;
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': pageType,
238
- 'context.page_id': pageId,
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
- }, [isLoading, isSupported, hasParsedVariantInfo, variantInfo, resolvedVariantInfo, trackEvent]);
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
+ };
@@ -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 { AnimationSpeed, PromptCarouselRows } from '@envive-ai/react-toolkit-v3/PromptCarousel';
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
- interface PageViewedContext {
19
- page_type: string;
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);