@envive-ai/react-hooks 0.3.68 → 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 (68) hide show
  1. package/dist/atoms/app/index.d.cts +1 -1
  2. package/dist/atoms/app/index.d.ts +1 -1
  3. package/dist/atoms/app/variant.d.ts +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 +3 -3
  8. package/dist/atoms/chat/index.d.cts +2 -2
  9. package/dist/atoms/chat/index.d.ts +2 -2
  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 +7 -7
  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 +3 -3
  18. package/dist/atoms/chat/replies.d.cts +3 -3
  19. package/dist/atoms/chat/replies.d.ts +3 -3
  20. package/dist/atoms/chat/suggestions.d.cts +2 -2
  21. package/dist/atoms/chat/suggestions.d.ts +3 -3
  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.ts +6 -6
  27. package/dist/atoms/org/graphqlConfig.d.ts +4 -4
  28. package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
  29. package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
  30. package/dist/atoms/org/orgAnalyticsConfig.d.ts +4 -4
  31. package/dist/atoms/search/chatSearch.d.cts +17 -17
  32. package/dist/atoms/search/chatSearch.d.ts +17 -17
  33. package/dist/atoms/search/searchAPI.d.cts +13 -13
  34. package/dist/atoms/search/searchAPI.d.ts +13 -13
  35. package/dist/atoms/widget/chatPreviewLoading.d.cts +2 -2
  36. package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
  37. package/dist/contexts/pageContext/index.cjs +2 -0
  38. package/dist/contexts/pageContext/index.d.cts +2 -1
  39. package/dist/contexts/pageContext/index.d.ts +2 -1
  40. package/dist/contexts/pageContext/index.js +2 -1
  41. package/dist/contexts/pageContext/pageContext.cjs +12 -34
  42. package/dist/contexts/pageContext/pageContext.js +12 -34
  43. package/dist/contexts/pageContext/pageViewedContext.cjs +42 -0
  44. package/dist/contexts/pageContext/pageViewedContext.d.cts +16 -0
  45. package/dist/contexts/pageContext/pageViewedContext.d.ts +16 -0
  46. package/dist/contexts/pageContext/pageViewedContext.js +42 -0
  47. package/dist/contexts/systemSettingsContext/systemSettingsContext.d.cts +2 -2
  48. package/dist/contexts/types.d.cts +1 -1
  49. package/dist/contexts/types.d.ts +1 -1
  50. package/dist/contexts/typesV3.d.cts +1 -1
  51. package/dist/contexts/typesV3.d.ts +1 -1
  52. package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.cts +2 -2
  53. package/dist/hooks/PageViewedEvent/index.cjs +2 -1
  54. package/dist/hooks/PageViewedEvent/index.d.cts +2 -1
  55. package/dist/hooks/PageViewedEvent/index.d.ts +2 -1
  56. package/dist/hooks/PageViewedEvent/index.js +2 -1
  57. package/dist/hooks/PageViewedEvent/usePageViewedEvent.cjs +8 -34
  58. package/dist/hooks/PageViewedEvent/usePageViewedEvent.d.cts +9 -8
  59. package/dist/hooks/PageViewedEvent/usePageViewedEvent.d.ts +9 -8
  60. package/dist/hooks/PageViewedEvent/usePageViewedEvent.js +8 -33
  61. package/dist/hooks/utils.d.cts +1 -1
  62. package/dist/hooks/utils.d.ts +1 -1
  63. package/package.json +1 -1
  64. package/src/contexts/pageContext/__tests__/pageContext.test.tsx +92 -14
  65. package/src/contexts/pageContext/index.ts +1 -0
  66. package/src/contexts/pageContext/pageContext.tsx +26 -33
  67. package/src/contexts/pageContext/pageViewedContext.ts +59 -0
  68. package/src/hooks/PageViewedEvent/usePageViewedEvent.ts +8 -53
@@ -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,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);