@dcl/hooks 2.0.4-20261008193010.commit-84dea9e → 2.0.4-20261008193059.commit-428d6ed
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.
|
@@ -11,8 +11,16 @@ const KEEPALIVE_DELIVERY = {
|
|
|
11
11
|
};
|
|
12
12
|
const AnalyticsContext = createContext(null);
|
|
13
13
|
const AnalyticsProvider = (props) => {
|
|
14
|
-
const { writeKey, userId, traits, cdnUrl, apiHost, children } = props;
|
|
14
|
+
const { writeKey, userId, traits, cdnUrl, apiHost, deliveryStrategy, children, } = props;
|
|
15
15
|
const analyticsRef = useRef(null);
|
|
16
|
+
// Kept out of the effect's dependencies: callers tend to pass it as an inline object, which would
|
|
17
|
+
// reload analytics on every render. It only matters at load time.
|
|
18
|
+
// Synced in an effect declared before the load effect, which runs first, so a render React discards
|
|
19
|
+
// never leaks its value into a load.
|
|
20
|
+
const deliveryStrategyRef = useRef(deliveryStrategy);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
deliveryStrategyRef.current = deliveryStrategy;
|
|
23
|
+
});
|
|
16
24
|
// Identifies the run that owns the instance. Advanced synchronously on every run AND on every
|
|
17
25
|
// cleanup, so a load still awaiting its import when the provider is reconfigured or unmounted sees a
|
|
18
26
|
// stale generation and abandons instead of taking over.
|
|
@@ -45,15 +53,15 @@ const AnalyticsProvider = (props) => {
|
|
|
45
53
|
if (resolvedCdnUrl) {
|
|
46
54
|
settings.cdnURL = resolvedCdnUrl;
|
|
47
55
|
}
|
|
48
|
-
// keepalive lets an event fired right before a navigation (a link click that
|
|
49
|
-
// page in the same tab) finish sending after the page unloads, instead of being
|
|
50
|
-
// with it. analytics-next leaves it off by default.
|
|
56
|
+
// keepalive, the default here, lets an event fired right before a navigation (a link click that
|
|
57
|
+
// loads the next page in the same tab) finish sending after the page unloads, instead of being
|
|
58
|
+
// cancelled with it. analytics-next leaves it off by default.
|
|
51
59
|
const resolvedApiHost = resolveApiHost(apiHost);
|
|
52
60
|
const options = {
|
|
53
61
|
integrations: {
|
|
54
62
|
[SEGMENT_IO]: {
|
|
55
63
|
...(resolvedApiHost ? { apiHost: resolvedApiHost } : {}),
|
|
56
|
-
deliveryStrategy: KEEPALIVE_DELIVERY,
|
|
64
|
+
deliveryStrategy: deliveryStrategyRef.current ?? KEEPALIVE_DELIVERY,
|
|
57
65
|
},
|
|
58
66
|
},
|
|
59
67
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsProvider.js","sourceRoot":"","sources":["../../../src/contexts/analytics/AnalyticsProvider.tsx"],"names":[],"mappings":";AAAA,OAAc,EACZ,aAAa,EACb,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAA;AAMd,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EACL,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAOvD,uEAAuE;AACvE,MAAM,UAAU,GAAG,YAAY,CAAA;AAE/B,MAAM,kBAAkB,GAAG;IACzB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;CACnB,CAAA;AAEV,MAAM,gBAAgB,GAAG,aAAa,CAA8B,IAAI,CAAC,CAAA;AAEzE,MAAM,iBAAiB,GAAqC,CAC1D,KAA6B,EAC7B,EAAE;IACF,MAAM,
|
|
1
|
+
{"version":3,"file":"AnalyticsProvider.js","sourceRoot":"","sources":["../../../src/contexts/analytics/AnalyticsProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { EventProperties } from "@segment/analytics-next";
|
|
1
|
+
import type { EventProperties, InitOptions } from "@segment/analytics-next";
|
|
2
|
+
type SegmentIoOptions = Exclude<NonNullable<NonNullable<InitOptions["integrations"]>["Segment.io"]>, boolean>;
|
|
3
|
+
/** How analytics-next's Segment.io integration sends events: standard (one request per event) or batching. */
|
|
4
|
+
type AnalyticsDeliveryStrategy = NonNullable<SegmentIoOptions["deliveryStrategy"]>;
|
|
2
5
|
type AnalyticsProviderProps = {
|
|
3
6
|
writeKey: string;
|
|
4
7
|
userId?: string;
|
|
@@ -18,6 +21,20 @@ type AnalyticsProviderProps = {
|
|
|
18
21
|
* The provider maps it to the `apiHost` setting of analytics-next's own `Segment.io` integration.
|
|
19
22
|
*/
|
|
20
23
|
apiHost?: string;
|
|
24
|
+
/**
|
|
25
|
+
* How events are delivered. Defaults to standard delivery with `keepalive`, so an event fired right before a
|
|
26
|
+
* same-tab navigation still goes out. Browsers cap all in-flight keepalive requests of a page at 64KB, so an app
|
|
27
|
+
* that sends large or very frequent events can pass its own strategy, e.g. `{ strategy: "batching" }`.
|
|
28
|
+
*
|
|
29
|
+
* A strategy replaces the default entirely: `{ strategy: "standard", config: { priority: "high" } }` turns
|
|
30
|
+
* keepalive off. Batching already flushes with keepalive when the page unloads, so it normally does not lose an event
|
|
31
|
+
* fired right before a navigation. The unload flush shares the same 64KB cap, though, so a large batch `size` or
|
|
32
|
+
* large payloads can still drop part of it; adding `keepalive: true` to batching makes every batch a keepalive
|
|
33
|
+
* request and brings the 64KB pressure back for the whole session.
|
|
34
|
+
*
|
|
35
|
+
* Read when analytics loads: changing it afterwards does not reload analytics.
|
|
36
|
+
*/
|
|
37
|
+
deliveryStrategy?: AnalyticsDeliveryStrategy;
|
|
21
38
|
children: React.ReactNode;
|
|
22
39
|
};
|
|
23
40
|
type TrackPayload = EventProperties;
|
|
@@ -34,4 +51,4 @@ type AnalyticsContextType = {
|
|
|
34
51
|
identify: (userId: string, traits?: Record<string, unknown>) => void;
|
|
35
52
|
page: (name: string, props?: Record<string, unknown>) => void;
|
|
36
53
|
};
|
|
37
|
-
export { type AnalyticsProviderProps, type TrackPayload, type AnalyticsContextType, };
|
|
54
|
+
export { type AnalyticsDeliveryStrategy, type AnalyticsProviderProps, type TrackPayload, type AnalyticsContextType, };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/hooks",
|
|
3
|
-
"version": "2.0.4-
|
|
3
|
+
"version": "2.0.4-20261008193059.commit-428d6ed",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "esm/index.js",
|
|
6
6
|
"module": "esm/index.js",
|
|
@@ -80,5 +80,5 @@
|
|
|
80
80
|
"<rootDir>/test/setup.ts"
|
|
81
81
|
]
|
|
82
82
|
},
|
|
83
|
-
"commit": "
|
|
83
|
+
"commit": "428d6ed0266ea35a87301f76446760f3b8837bdc"
|
|
84
84
|
}
|