@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.
- package/dist/atoms/app/index.d.cts +1 -1
- package/dist/atoms/app/index.d.ts +1 -1
- package/dist/atoms/app/variant.d.ts +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 +3 -3
- package/dist/atoms/chat/index.d.cts +2 -2
- package/dist/atoms/chat/index.d.ts +2 -2
- 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 +7 -7
- 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 +3 -3
- package/dist/atoms/chat/replies.d.cts +3 -3
- package/dist/atoms/chat/replies.d.ts +3 -3
- package/dist/atoms/chat/suggestions.d.cts +2 -2
- package/dist/atoms/chat/suggestions.d.ts +3 -3
- 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.ts +6 -6
- 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.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/widget/chatPreviewLoading.d.cts +2 -2
- package/dist/atoms/widget/chatPreviewLoading.d.ts +2 -2
- 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.cts +2 -2
- package/dist/contexts/types.d.cts +1 -1
- package/dist/contexts/types.d.ts +1 -1
- package/dist/contexts/typesV3.d.cts +1 -1
- package/dist/contexts/typesV3.d.ts +1 -1
- package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.cts +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/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
|
-
|
|
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
|
+
};
|
|
@@ -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);
|