@shware/analytics 2.17.3 → 3.0.0

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 (63) hide show
  1. package/dist/hooks/use-app-analytics.cjs +73 -0
  2. package/dist/hooks/use-app-analytics.cjs.map +1 -0
  3. package/dist/hooks/use-app-analytics.d.cts +3 -0
  4. package/dist/hooks/use-app-analytics.d.ts +3 -0
  5. package/dist/hooks/use-app-analytics.mjs +48 -0
  6. package/dist/hooks/use-app-analytics.mjs.map +1 -0
  7. package/dist/hooks/use-web-analytics.cjs +128 -0
  8. package/dist/hooks/use-web-analytics.cjs.map +1 -0
  9. package/dist/hooks/{use-web-session-analytics.d.cts → use-web-analytics.d.cts} +2 -2
  10. package/dist/hooks/{use-web-session-analytics.d.ts → use-web-analytics.d.ts} +2 -2
  11. package/dist/hooks/use-web-analytics.mjs +103 -0
  12. package/dist/hooks/use-web-analytics.mjs.map +1 -0
  13. package/dist/native/index.cjs +3 -6
  14. package/dist/native/index.cjs.map +1 -1
  15. package/dist/native/index.d.cts +1 -2
  16. package/dist/native/index.d.ts +1 -2
  17. package/dist/native/index.mjs +2 -4
  18. package/dist/native/index.mjs.map +1 -1
  19. package/dist/next/index.cjs +2 -4
  20. package/dist/next/index.cjs.map +1 -1
  21. package/dist/next/index.mjs +2 -4
  22. package/dist/next/index.mjs.map +1 -1
  23. package/dist/react-router/index.cjs +2 -4
  24. package/dist/react-router/index.cjs.map +1 -1
  25. package/dist/react-router/index.mjs +2 -4
  26. package/dist/react-router/index.mjs.map +1 -1
  27. package/dist/setup/session.cjs +77 -22
  28. package/dist/setup/session.cjs.map +1 -1
  29. package/dist/setup/session.d.cts +27 -9
  30. package/dist/setup/session.d.ts +27 -9
  31. package/dist/setup/session.mjs +76 -18
  32. package/dist/setup/session.mjs.map +1 -1
  33. package/dist/track/gtag.cjs.map +1 -1
  34. package/dist/track/gtag.d.cts +0 -2
  35. package/dist/track/gtag.d.ts +0 -2
  36. package/dist/track/gtag.mjs.map +1 -1
  37. package/dist/track/index.cjs +6 -8
  38. package/dist/track/index.cjs.map +1 -1
  39. package/dist/track/index.mjs +7 -14
  40. package/dist/track/index.mjs.map +1 -1
  41. package/package.json +1 -5
  42. package/dist/hooks/use-app-session-analytics.cjs +0 -68
  43. package/dist/hooks/use-app-session-analytics.cjs.map +0 -1
  44. package/dist/hooks/use-app-session-analytics.d.cts +0 -3
  45. package/dist/hooks/use-app-session-analytics.d.ts +0 -3
  46. package/dist/hooks/use-app-session-analytics.mjs +0 -43
  47. package/dist/hooks/use-app-session-analytics.mjs.map +0 -1
  48. package/dist/hooks/use-page-view-analytics.cjs +0 -82
  49. package/dist/hooks/use-page-view-analytics.cjs.map +0 -1
  50. package/dist/hooks/use-page-view-analytics.d.cts +0 -3
  51. package/dist/hooks/use-page-view-analytics.d.ts +0 -3
  52. package/dist/hooks/use-page-view-analytics.mjs +0 -57
  53. package/dist/hooks/use-page-view-analytics.mjs.map +0 -1
  54. package/dist/hooks/use-screen-view-analytics.cjs +0 -76
  55. package/dist/hooks/use-screen-view-analytics.cjs.map +0 -1
  56. package/dist/hooks/use-screen-view-analytics.d.cts +0 -3
  57. package/dist/hooks/use-screen-view-analytics.d.ts +0 -3
  58. package/dist/hooks/use-screen-view-analytics.mjs +0 -51
  59. package/dist/hooks/use-screen-view-analytics.mjs.map +0 -1
  60. package/dist/hooks/use-web-session-analytics.cjs +0 -137
  61. package/dist/hooks/use-web-session-analytics.cjs.map +0 -1
  62. package/dist/hooks/use-web-session-analytics.mjs +0 -112
  63. package/dist/hooks/use-web-session-analytics.mjs.map +0 -1
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/hooks/use-app-analytics.ts
21
+ var use_app_analytics_exports = {};
22
+ __export(use_app_analytics_exports, {
23
+ useAppAnalytics: () => useAppAnalytics
24
+ });
25
+ module.exports = __toCommonJS(use_app_analytics_exports);
26
+ var import_react = require("react");
27
+ var import_react_native = require("react-native");
28
+ var import_setup = require("../setup/index.cjs");
29
+ var import_session = require("../setup/session.cjs");
30
+ var import_track = require("../track/index.cjs");
31
+ var import_use_previous = require("./use-previous.cjs");
32
+ function sendFirstOpen(pathname) {
33
+ const key = "first_open_time";
34
+ if (import_setup.config.storage.getItem(key)) return;
35
+ const properties = { screen_name: pathname, screen_class: pathname };
36
+ (0, import_track.track)("first_open", properties, { enableThirdPartyTracking: false });
37
+ import_setup.config.storage.setItem(key, (/* @__PURE__ */ new Date()).toISOString());
38
+ }
39
+ function sendUserEngagement() {
40
+ const engagement_time_msec = import_session.session.flush();
41
+ if (engagement_time_msec <= 0) return;
42
+ (0, import_track.track)("user_engagement", { engagement_time_msec }, { enableThirdPartyTracking: false });
43
+ }
44
+ function useAppAnalytics(pathname) {
45
+ const prevPathname = (0, import_use_previous.usePrevious)(pathname);
46
+ (0, import_react.useEffect)(() => {
47
+ sendFirstOpen(pathname);
48
+ (0, import_track.track)("session_start", void 0, { enableThirdPartyTracking: false });
49
+ const subscription = import_react_native.AppState.addEventListener("change", (state) => {
50
+ import_session.session.updateAccumulator();
51
+ if (state === "active" && !import_session.session.isActive()) {
52
+ import_session.session.updateActive(true);
53
+ } else if (state !== "active" && import_session.session.isActive()) {
54
+ import_session.session.updateActive(false);
55
+ sendUserEngagement();
56
+ }
57
+ });
58
+ return () => subscription.remove();
59
+ }, []);
60
+ (0, import_react.useEffect)(() => {
61
+ (0, import_track.track)("screen_view", {
62
+ screen_name: pathname,
63
+ screen_class: pathname,
64
+ previous_screen_class: prevPathname ?? void 0,
65
+ engagement_time_msec: prevPathname ? import_session.session.flush() : void 0
66
+ });
67
+ }, [pathname]);
68
+ }
69
+ // Annotate the CommonJS export names for ESM import in node:
70
+ 0 && (module.exports = {
71
+ useAppAnalytics
72
+ });
73
+ //# sourceMappingURL=use-app-analytics.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/use-app-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { AppState } from 'react-native';\nimport { config } from '../setup/index';\nimport { session } from '../setup/session';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nfunction sendFirstOpen(pathname: string) {\n const key = 'first_open_time';\n if (config.storage.getItem(key)) return;\n const properties = { screen_name: pathname, screen_class: pathname };\n track('first_open', properties, { enableThirdPartyTracking: false });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('user_engagement', { engagement_time_msec }, { enableThirdPartyTracking: false });\n}\n\nexport function useAppAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n\n useEffect(() => {\n sendFirstOpen(pathname);\n track('session_start', undefined, { enableThirdPartyTracking: false });\n\n const subscription = AppState.addEventListener('change', (state) => {\n session.updateAccumulator();\n // when returning to the foreground from the background\n if (state === 'active' && !session.isActive()) {\n session.updateActive(true);\n }\n // when entering the background\n else if (state !== 'active' && session.isActive()) {\n session.updateActive(false);\n sendUserEngagement();\n }\n });\n\n return () => subscription.remove();\n }, []);\n\n // when the screen is switched, the engagement time of the previous screen is recorded\n useEffect(() => {\n track('screen_view', {\n screen_name: pathname,\n screen_class: pathname,\n previous_screen_class: prevPathname ?? undefined,\n engagement_time_msec: prevPathname ? session.flush() : undefined,\n });\n }, [pathname]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA0B;AAC1B,0BAAyB;AACzB,mBAAuB;AACvB,qBAAwB;AACxB,mBAAsB;AACtB,0BAA4B;AAE5B,SAAS,cAAc,UAAkB;AACvC,QAAM,MAAM;AACZ,MAAI,oBAAO,QAAQ,QAAQ,GAAG,EAAG;AACjC,QAAM,aAAa,EAAE,aAAa,UAAU,cAAc,SAAS;AACnE,0BAAM,cAAc,YAAY,EAAE,0BAA0B,MAAM,CAAC;AACnE,sBAAO,QAAQ,QAAQ,MAAK,oBAAI,KAAK,GAAE,YAAY,CAAC;AACtD;AAEA,SAAS,qBAAqB;AAC5B,QAAM,uBAAuB,uBAAQ,MAAM;AAC3C,MAAI,wBAAwB,EAAG;AAC/B,0BAAM,mBAAmB,EAAE,qBAAqB,GAAG,EAAE,0BAA0B,MAAM,CAAC;AACxF;AAEO,SAAS,gBAAgB,UAAkB;AAChD,QAAM,mBAAe,iCAAY,QAAQ;AAEzC,8BAAU,MAAM;AACd,kBAAc,QAAQ;AACtB,4BAAM,iBAAiB,QAAW,EAAE,0BAA0B,MAAM,CAAC;AAErE,UAAM,eAAe,6BAAS,iBAAiB,UAAU,CAAC,UAAU;AAClE,6BAAQ,kBAAkB;AAE1B,UAAI,UAAU,YAAY,CAAC,uBAAQ,SAAS,GAAG;AAC7C,+BAAQ,aAAa,IAAI;AAAA,MAC3B,WAES,UAAU,YAAY,uBAAQ,SAAS,GAAG;AACjD,+BAAQ,aAAa,KAAK;AAC1B,2BAAmB;AAAA,MACrB;AAAA,IACF,CAAC;AAED,WAAO,MAAM,aAAa,OAAO;AAAA,EACnC,GAAG,CAAC,CAAC;AAGL,8BAAU,MAAM;AACd,4BAAM,eAAe;AAAA,MACnB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,uBAAuB,gBAAgB;AAAA,MACvC,sBAAsB,eAAe,uBAAQ,MAAM,IAAI;AAAA,IACzD,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,CAAC;AACf;","names":[]}
@@ -0,0 +1,3 @@
1
+ declare function useAppAnalytics(pathname: string): void;
2
+
3
+ export { useAppAnalytics };
@@ -0,0 +1,3 @@
1
+ declare function useAppAnalytics(pathname: string): void;
2
+
3
+ export { useAppAnalytics };
@@ -0,0 +1,48 @@
1
+ // src/hooks/use-app-analytics.ts
2
+ import { useEffect } from "react";
3
+ import { AppState } from "react-native";
4
+ import { config } from "../setup/index.mjs";
5
+ import { session } from "../setup/session.mjs";
6
+ import { track } from "../track/index.mjs";
7
+ import { usePrevious } from "./use-previous.mjs";
8
+ function sendFirstOpen(pathname) {
9
+ const key = "first_open_time";
10
+ if (config.storage.getItem(key)) return;
11
+ const properties = { screen_name: pathname, screen_class: pathname };
12
+ track("first_open", properties, { enableThirdPartyTracking: false });
13
+ config.storage.setItem(key, (/* @__PURE__ */ new Date()).toISOString());
14
+ }
15
+ function sendUserEngagement() {
16
+ const engagement_time_msec = session.flush();
17
+ if (engagement_time_msec <= 0) return;
18
+ track("user_engagement", { engagement_time_msec }, { enableThirdPartyTracking: false });
19
+ }
20
+ function useAppAnalytics(pathname) {
21
+ const prevPathname = usePrevious(pathname);
22
+ useEffect(() => {
23
+ sendFirstOpen(pathname);
24
+ track("session_start", void 0, { enableThirdPartyTracking: false });
25
+ const subscription = AppState.addEventListener("change", (state) => {
26
+ session.updateAccumulator();
27
+ if (state === "active" && !session.isActive()) {
28
+ session.updateActive(true);
29
+ } else if (state !== "active" && session.isActive()) {
30
+ session.updateActive(false);
31
+ sendUserEngagement();
32
+ }
33
+ });
34
+ return () => subscription.remove();
35
+ }, []);
36
+ useEffect(() => {
37
+ track("screen_view", {
38
+ screen_name: pathname,
39
+ screen_class: pathname,
40
+ previous_screen_class: prevPathname ?? void 0,
41
+ engagement_time_msec: prevPathname ? session.flush() : void 0
42
+ });
43
+ }, [pathname]);
44
+ }
45
+ export {
46
+ useAppAnalytics
47
+ };
48
+ //# sourceMappingURL=use-app-analytics.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/use-app-analytics.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { AppState } from 'react-native';\nimport { config } from '../setup/index';\nimport { session } from '../setup/session';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nfunction sendFirstOpen(pathname: string) {\n const key = 'first_open_time';\n if (config.storage.getItem(key)) return;\n const properties = { screen_name: pathname, screen_class: pathname };\n track('first_open', properties, { enableThirdPartyTracking: false });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('user_engagement', { engagement_time_msec }, { enableThirdPartyTracking: false });\n}\n\nexport function useAppAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n\n useEffect(() => {\n sendFirstOpen(pathname);\n track('session_start', undefined, { enableThirdPartyTracking: false });\n\n const subscription = AppState.addEventListener('change', (state) => {\n session.updateAccumulator();\n // when returning to the foreground from the background\n if (state === 'active' && !session.isActive()) {\n session.updateActive(true);\n }\n // when entering the background\n else if (state !== 'active' && session.isActive()) {\n session.updateActive(false);\n sendUserEngagement();\n }\n });\n\n return () => subscription.remove();\n }, []);\n\n // when the screen is switched, the engagement time of the previous screen is recorded\n useEffect(() => {\n track('screen_view', {\n screen_name: pathname,\n screen_class: pathname,\n previous_screen_class: prevPathname ?? undefined,\n engagement_time_msec: prevPathname ? session.flush() : undefined,\n });\n }, [pathname]);\n}\n"],"mappings":";AAAA,SAAS,iBAAiB;AAC1B,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAE5B,SAAS,cAAc,UAAkB;AACvC,QAAM,MAAM;AACZ,MAAI,OAAO,QAAQ,QAAQ,GAAG,EAAG;AACjC,QAAM,aAAa,EAAE,aAAa,UAAU,cAAc,SAAS;AACnE,QAAM,cAAc,YAAY,EAAE,0BAA0B,MAAM,CAAC;AACnE,SAAO,QAAQ,QAAQ,MAAK,oBAAI,KAAK,GAAE,YAAY,CAAC;AACtD;AAEA,SAAS,qBAAqB;AAC5B,QAAM,uBAAuB,QAAQ,MAAM;AAC3C,MAAI,wBAAwB,EAAG;AAC/B,QAAM,mBAAmB,EAAE,qBAAqB,GAAG,EAAE,0BAA0B,MAAM,CAAC;AACxF;AAEO,SAAS,gBAAgB,UAAkB;AAChD,QAAM,eAAe,YAAY,QAAQ;AAEzC,YAAU,MAAM;AACd,kBAAc,QAAQ;AACtB,UAAM,iBAAiB,QAAW,EAAE,0BAA0B,MAAM,CAAC;AAErE,UAAM,eAAe,SAAS,iBAAiB,UAAU,CAAC,UAAU;AAClE,cAAQ,kBAAkB;AAE1B,UAAI,UAAU,YAAY,CAAC,QAAQ,SAAS,GAAG;AAC7C,gBAAQ,aAAa,IAAI;AAAA,MAC3B,WAES,UAAU,YAAY,QAAQ,SAAS,GAAG;AACjD,gBAAQ,aAAa,KAAK;AAC1B,2BAAmB;AAAA,MACrB;AAAA,IACF,CAAC;AAED,WAAO,MAAM,aAAa,OAAO;AAAA,EACnC,GAAG,CAAC,CAAC;AAGL,YAAU,MAAM;AACd,UAAM,eAAe;AAAA,MACnB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,uBAAuB,gBAAgB;AAAA,MACvC,sBAAsB,eAAe,QAAQ,MAAM,IAAI;AAAA,IACzD,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,CAAC;AACf;","names":[]}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/hooks/use-web-analytics.ts
21
+ var use_web_analytics_exports = {};
22
+ __export(use_web_analytics_exports, {
23
+ useWebAnalytics: () => useWebAnalytics
24
+ });
25
+ module.exports = __toCommonJS(use_web_analytics_exports);
26
+ var import_utils = require("@shware/utils");
27
+ var import_react = require("react");
28
+ var import_setup = require("../setup/index.cjs");
29
+ var import_session = require("../setup/session.cjs");
30
+ var import_track = require("../track/index.cjs");
31
+ var import_use_previous = require("./use-previous.cjs");
32
+ function sendFirstVisit(pathname) {
33
+ const key = "first_visit_time";
34
+ if (import_setup.config.storage.getItem(key)) return;
35
+ const properties = {
36
+ page_path: pathname,
37
+ page_title: document.title,
38
+ page_referrer: document.referrer,
39
+ page_location: window.location.href
40
+ };
41
+ (0, import_track.track)("first_visit", properties, { enableThirdPartyTracking: false });
42
+ import_setup.config.storage.setItem(key, (/* @__PURE__ */ new Date()).toISOString());
43
+ }
44
+ function sendUserEngagement() {
45
+ const engagement_time_msec = import_session.session.flush();
46
+ if (engagement_time_msec <= 0) return;
47
+ (0, import_track.sendBeacon)("user_engagement", { engagement_time_msec });
48
+ }
49
+ function sendScroll() {
50
+ const engagement_time_msec = import_session.session.flush();
51
+ if (engagement_time_msec <= 0) return;
52
+ (0, import_track.track)("scroll", { engagement_time_msec }, { enableThirdPartyTracking: false });
53
+ }
54
+ function getScrollPercent() {
55
+ const scrollTop = window.scrollY || document.documentElement.scrollTop;
56
+ const windowHeight = window.innerHeight;
57
+ const docHeight = document.documentElement.scrollHeight;
58
+ if (docHeight === 0) return 0;
59
+ return (scrollTop + windowHeight) * 100 / docHeight;
60
+ }
61
+ function onPageHide() {
62
+ import_session.session.pagehide();
63
+ sendUserEngagement();
64
+ }
65
+ function onVisibilityChange() {
66
+ import_session.session.visibilitychange(document.visibilityState);
67
+ if (document.visibilityState === "hidden") {
68
+ sendUserEngagement();
69
+ }
70
+ }
71
+ function useWebAnalytics(pathname) {
72
+ const prevPathname = (0, import_use_previous.usePrevious)(pathname);
73
+ const hasSendScroll = (0, import_react.useRef)(false);
74
+ (0, import_react.useEffect)(() => {
75
+ hasSendScroll.current = false;
76
+ }, [pathname]);
77
+ (0, import_react.useEffect)(() => {
78
+ sendFirstVisit(pathname);
79
+ (0, import_track.track)("session_start", void 0, { enableThirdPartyTracking: false });
80
+ const onScroll = (0, import_utils.throttle)(() => {
81
+ import_session.session.updateAccumulator();
82
+ if (hasSendScroll.current) return;
83
+ if (getScrollPercent() < 90) return;
84
+ hasSendScroll.current = true;
85
+ sendScroll();
86
+ }, 500);
87
+ const checkpointEvents = ["mousedown", "keydown", "touchstart"];
88
+ const checkpoint = (0, import_utils.throttle)(import_session.session.updateAccumulator, 1e3);
89
+ window.addEventListener("focus", import_session.session.focus, { passive: true });
90
+ window.addEventListener("blur", import_session.session.blur, { passive: true });
91
+ window.addEventListener("pageshow", import_session.session.pageshow, { passive: true });
92
+ window.addEventListener("pagehide", onPageHide, { passive: true });
93
+ window.addEventListener("scroll", onScroll, { passive: true });
94
+ document.addEventListener("visibilitychange", onVisibilityChange, { passive: true });
95
+ checkpointEvents.forEach((event) => {
96
+ window.addEventListener(event, checkpoint, { passive: true, capture: true });
97
+ });
98
+ return () => {
99
+ window.removeEventListener("focus", import_session.session.focus);
100
+ window.removeEventListener("blur", import_session.session.blur);
101
+ window.removeEventListener("pageshow", import_session.session.pageshow);
102
+ window.removeEventListener("pagehide", onPageHide);
103
+ window.removeEventListener("scroll", onScroll);
104
+ document.removeEventListener("visibilitychange", onVisibilityChange);
105
+ checkpointEvents.forEach((event) => {
106
+ window.removeEventListener(event, checkpoint);
107
+ });
108
+ onScroll.cancel();
109
+ checkpoint.cancel();
110
+ };
111
+ }, []);
112
+ (0, import_react.useEffect)(() => {
113
+ const properties = {
114
+ page_path: pathname,
115
+ page_title: document.title,
116
+ page_referrer: document.referrer,
117
+ page_location: window.location.href,
118
+ previous_page_path: prevPathname ?? void 0,
119
+ engagement_time_msec: prevPathname ? import_session.session.flush() : void 0
120
+ };
121
+ (0, import_track.track)("page_view", properties, { enableThirdPartyTracking: false });
122
+ }, [pathname]);
123
+ }
124
+ // Annotate the CommonJS export names for ESM import in node:
125
+ 0 && (module.exports = {
126
+ useWebAnalytics
127
+ });
128
+ //# sourceMappingURL=use-web-analytics.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/use-web-analytics.ts"],"sourcesContent":["import { throttle } from '@shware/utils';\nimport { useEffect, useRef } from 'react';\nimport { config } from '../setup/index';\nimport { session } from '../setup/session';\nimport { sendBeacon, track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nfunction sendFirstVisit(pathname: string) {\n const key = 'first_visit_time';\n if (config.storage.getItem(key)) return;\n const properties = {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n };\n track('first_visit', properties, { enableThirdPartyTracking: false });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n sendBeacon('user_engagement', { engagement_time_msec });\n}\n\nfunction sendScroll() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('scroll', { engagement_time_msec }, { enableThirdPartyTracking: false });\n}\n\nfunction getScrollPercent() {\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const windowHeight = window.innerHeight;\n const docHeight = document.documentElement.scrollHeight;\n if (docHeight === 0) return 0;\n return ((scrollTop + windowHeight) * 100) / docHeight;\n}\n\nfunction onPageHide() {\n session.pagehide();\n sendUserEngagement();\n}\n\nfunction onVisibilityChange() {\n session.visibilitychange(document.visibilityState);\n if (document.visibilityState === 'hidden') {\n sendUserEngagement();\n }\n}\n\n/**\n * 1. send session_start event when the page is loaded\n * 2. send scroll event when the user scrolls more than 90% of the page\n * 3. send user_engagement event when the page is hidden or the user is not focused\n */\nexport function useWebAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n\n // reset state when the pathname changes and send scroll when the user navigates to a new page\n const hasSendScroll = useRef(false);\n useEffect(() => {\n hasSendScroll.current = false;\n }, [pathname]);\n\n useEffect(() => {\n sendFirstVisit(pathname);\n track('session_start', undefined, { enableThirdPartyTracking: false });\n\n const onScroll = throttle(() => {\n session.updateAccumulator();\n if (hasSendScroll.current) return;\n // only send scroll when the user has scrolled more than 90% of the page\n if (getScrollPercent() < 90) return;\n hasSendScroll.current = true;\n sendScroll();\n }, 500);\n\n const checkpointEvents = ['mousedown', 'keydown', 'touchstart'];\n const checkpoint = throttle(session.updateAccumulator, 1000);\n\n window.addEventListener('focus', session.focus, { passive: true });\n window.addEventListener('blur', session.blur, { passive: true });\n window.addEventListener('pageshow', session.pageshow, { passive: true });\n window.addEventListener('pagehide', onPageHide, { passive: true });\n window.addEventListener('scroll', onScroll, { passive: true });\n document.addEventListener('visibilitychange', onVisibilityChange, { passive: true });\n\n // save checkpoint\n checkpointEvents.forEach((event) => {\n window.addEventListener(event, checkpoint, { passive: true, capture: true });\n });\n\n return () => {\n window.removeEventListener('focus', session.focus);\n window.removeEventListener('blur', session.blur);\n window.removeEventListener('pageshow', session.pageshow);\n window.removeEventListener('pagehide', onPageHide);\n window.removeEventListener('scroll', onScroll);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n\n checkpointEvents.forEach((event) => {\n window.removeEventListener(event, checkpoint);\n });\n\n onScroll.cancel();\n checkpoint.cancel();\n };\n }, []);\n\n useEffect(() => {\n const properties = {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n previous_page_path: prevPathname ?? undefined,\n engagement_time_msec: prevPathname ? session.flush() : undefined,\n };\n\n track('page_view', properties, { enableThirdPartyTracking: false });\n }, [pathname]);\n}\n"],"mappings":"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","names":[]}
@@ -3,6 +3,6 @@
3
3
  * 2. send scroll event when the user scrolls more than 90% of the page
4
4
  * 3. send user_engagement event when the page is hidden or the user is not focused
5
5
  */
6
- declare function useWebSessionAnalytics(pathname: string): void;
6
+ declare function useWebAnalytics(pathname: string): void;
7
7
 
8
- export { useWebSessionAnalytics };
8
+ export { useWebAnalytics };
@@ -3,6 +3,6 @@
3
3
  * 2. send scroll event when the user scrolls more than 90% of the page
4
4
  * 3. send user_engagement event when the page is hidden or the user is not focused
5
5
  */
6
- declare function useWebSessionAnalytics(pathname: string): void;
6
+ declare function useWebAnalytics(pathname: string): void;
7
7
 
8
- export { useWebSessionAnalytics };
8
+ export { useWebAnalytics };
@@ -0,0 +1,103 @@
1
+ // src/hooks/use-web-analytics.ts
2
+ import { throttle } from "@shware/utils";
3
+ import { useEffect, useRef } from "react";
4
+ import { config } from "../setup/index.mjs";
5
+ import { session } from "../setup/session.mjs";
6
+ import { sendBeacon, track } from "../track/index.mjs";
7
+ import { usePrevious } from "./use-previous.mjs";
8
+ function sendFirstVisit(pathname) {
9
+ const key = "first_visit_time";
10
+ if (config.storage.getItem(key)) return;
11
+ const properties = {
12
+ page_path: pathname,
13
+ page_title: document.title,
14
+ page_referrer: document.referrer,
15
+ page_location: window.location.href
16
+ };
17
+ track("first_visit", properties, { enableThirdPartyTracking: false });
18
+ config.storage.setItem(key, (/* @__PURE__ */ new Date()).toISOString());
19
+ }
20
+ function sendUserEngagement() {
21
+ const engagement_time_msec = session.flush();
22
+ if (engagement_time_msec <= 0) return;
23
+ sendBeacon("user_engagement", { engagement_time_msec });
24
+ }
25
+ function sendScroll() {
26
+ const engagement_time_msec = session.flush();
27
+ if (engagement_time_msec <= 0) return;
28
+ track("scroll", { engagement_time_msec }, { enableThirdPartyTracking: false });
29
+ }
30
+ function getScrollPercent() {
31
+ const scrollTop = window.scrollY || document.documentElement.scrollTop;
32
+ const windowHeight = window.innerHeight;
33
+ const docHeight = document.documentElement.scrollHeight;
34
+ if (docHeight === 0) return 0;
35
+ return (scrollTop + windowHeight) * 100 / docHeight;
36
+ }
37
+ function onPageHide() {
38
+ session.pagehide();
39
+ sendUserEngagement();
40
+ }
41
+ function onVisibilityChange() {
42
+ session.visibilitychange(document.visibilityState);
43
+ if (document.visibilityState === "hidden") {
44
+ sendUserEngagement();
45
+ }
46
+ }
47
+ function useWebAnalytics(pathname) {
48
+ const prevPathname = usePrevious(pathname);
49
+ const hasSendScroll = useRef(false);
50
+ useEffect(() => {
51
+ hasSendScroll.current = false;
52
+ }, [pathname]);
53
+ useEffect(() => {
54
+ sendFirstVisit(pathname);
55
+ track("session_start", void 0, { enableThirdPartyTracking: false });
56
+ const onScroll = throttle(() => {
57
+ session.updateAccumulator();
58
+ if (hasSendScroll.current) return;
59
+ if (getScrollPercent() < 90) return;
60
+ hasSendScroll.current = true;
61
+ sendScroll();
62
+ }, 500);
63
+ const checkpointEvents = ["mousedown", "keydown", "touchstart"];
64
+ const checkpoint = throttle(session.updateAccumulator, 1e3);
65
+ window.addEventListener("focus", session.focus, { passive: true });
66
+ window.addEventListener("blur", session.blur, { passive: true });
67
+ window.addEventListener("pageshow", session.pageshow, { passive: true });
68
+ window.addEventListener("pagehide", onPageHide, { passive: true });
69
+ window.addEventListener("scroll", onScroll, { passive: true });
70
+ document.addEventListener("visibilitychange", onVisibilityChange, { passive: true });
71
+ checkpointEvents.forEach((event) => {
72
+ window.addEventListener(event, checkpoint, { passive: true, capture: true });
73
+ });
74
+ return () => {
75
+ window.removeEventListener("focus", session.focus);
76
+ window.removeEventListener("blur", session.blur);
77
+ window.removeEventListener("pageshow", session.pageshow);
78
+ window.removeEventListener("pagehide", onPageHide);
79
+ window.removeEventListener("scroll", onScroll);
80
+ document.removeEventListener("visibilitychange", onVisibilityChange);
81
+ checkpointEvents.forEach((event) => {
82
+ window.removeEventListener(event, checkpoint);
83
+ });
84
+ onScroll.cancel();
85
+ checkpoint.cancel();
86
+ };
87
+ }, []);
88
+ useEffect(() => {
89
+ const properties = {
90
+ page_path: pathname,
91
+ page_title: document.title,
92
+ page_referrer: document.referrer,
93
+ page_location: window.location.href,
94
+ previous_page_path: prevPathname ?? void 0,
95
+ engagement_time_msec: prevPathname ? session.flush() : void 0
96
+ };
97
+ track("page_view", properties, { enableThirdPartyTracking: false });
98
+ }, [pathname]);
99
+ }
100
+ export {
101
+ useWebAnalytics
102
+ };
103
+ //# sourceMappingURL=use-web-analytics.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/hooks/use-web-analytics.ts"],"sourcesContent":["import { throttle } from '@shware/utils';\nimport { useEffect, useRef } from 'react';\nimport { config } from '../setup/index';\nimport { session } from '../setup/session';\nimport { sendBeacon, track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nfunction sendFirstVisit(pathname: string) {\n const key = 'first_visit_time';\n if (config.storage.getItem(key)) return;\n const properties = {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n };\n track('first_visit', properties, { enableThirdPartyTracking: false });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n sendBeacon('user_engagement', { engagement_time_msec });\n}\n\nfunction sendScroll() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('scroll', { engagement_time_msec }, { enableThirdPartyTracking: false });\n}\n\nfunction getScrollPercent() {\n const scrollTop = window.scrollY || document.documentElement.scrollTop;\n const windowHeight = window.innerHeight;\n const docHeight = document.documentElement.scrollHeight;\n if (docHeight === 0) return 0;\n return ((scrollTop + windowHeight) * 100) / docHeight;\n}\n\nfunction onPageHide() {\n session.pagehide();\n sendUserEngagement();\n}\n\nfunction onVisibilityChange() {\n session.visibilitychange(document.visibilityState);\n if (document.visibilityState === 'hidden') {\n sendUserEngagement();\n }\n}\n\n/**\n * 1. send session_start event when the page is loaded\n * 2. send scroll event when the user scrolls more than 90% of the page\n * 3. send user_engagement event when the page is hidden or the user is not focused\n */\nexport function useWebAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n\n // reset state when the pathname changes and send scroll when the user navigates to a new page\n const hasSendScroll = useRef(false);\n useEffect(() => {\n hasSendScroll.current = false;\n }, [pathname]);\n\n useEffect(() => {\n sendFirstVisit(pathname);\n track('session_start', undefined, { enableThirdPartyTracking: false });\n\n const onScroll = throttle(() => {\n session.updateAccumulator();\n if (hasSendScroll.current) return;\n // only send scroll when the user has scrolled more than 90% of the page\n if (getScrollPercent() < 90) return;\n hasSendScroll.current = true;\n sendScroll();\n }, 500);\n\n const checkpointEvents = ['mousedown', 'keydown', 'touchstart'];\n const checkpoint = throttle(session.updateAccumulator, 1000);\n\n window.addEventListener('focus', session.focus, { passive: true });\n window.addEventListener('blur', session.blur, { passive: true });\n window.addEventListener('pageshow', session.pageshow, { passive: true });\n window.addEventListener('pagehide', onPageHide, { passive: true });\n window.addEventListener('scroll', onScroll, { passive: true });\n document.addEventListener('visibilitychange', onVisibilityChange, { passive: true });\n\n // save checkpoint\n checkpointEvents.forEach((event) => {\n window.addEventListener(event, checkpoint, { passive: true, capture: true });\n });\n\n return () => {\n window.removeEventListener('focus', session.focus);\n window.removeEventListener('blur', session.blur);\n window.removeEventListener('pageshow', session.pageshow);\n window.removeEventListener('pagehide', onPageHide);\n window.removeEventListener('scroll', onScroll);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n\n checkpointEvents.forEach((event) => {\n window.removeEventListener(event, checkpoint);\n });\n\n onScroll.cancel();\n checkpoint.cancel();\n };\n }, []);\n\n useEffect(() => {\n const properties = {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n previous_page_path: prevPathname ?? undefined,\n engagement_time_msec: prevPathname ? session.flush() : undefined,\n };\n\n track('page_view', properties, { enableThirdPartyTracking: false });\n }, [pathname]);\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AACzB,SAAS,WAAW,cAAc;AAClC,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,YAAY,aAAa;AAClC,SAAS,mBAAmB;AAE5B,SAAS,eAAe,UAAkB;AACxC,QAAM,MAAM;AACZ,MAAI,OAAO,QAAQ,QAAQ,GAAG,EAAG;AACjC,QAAM,aAAa;AAAA,IACjB,WAAW;AAAA,IACX,YAAY,SAAS;AAAA,IACrB,eAAe,SAAS;AAAA,IACxB,eAAe,OAAO,SAAS;AAAA,EACjC;AACA,QAAM,eAAe,YAAY,EAAE,0BAA0B,MAAM,CAAC;AACpE,SAAO,QAAQ,QAAQ,MAAK,oBAAI,KAAK,GAAE,YAAY,CAAC;AACtD;AAEA,SAAS,qBAAqB;AAC5B,QAAM,uBAAuB,QAAQ,MAAM;AAC3C,MAAI,wBAAwB,EAAG;AAC/B,aAAW,mBAAmB,EAAE,qBAAqB,CAAC;AACxD;AAEA,SAAS,aAAa;AACpB,QAAM,uBAAuB,QAAQ,MAAM;AAC3C,MAAI,wBAAwB,EAAG;AAC/B,QAAM,UAAU,EAAE,qBAAqB,GAAG,EAAE,0BAA0B,MAAM,CAAC;AAC/E;AAEA,SAAS,mBAAmB;AAC1B,QAAM,YAAY,OAAO,WAAW,SAAS,gBAAgB;AAC7D,QAAM,eAAe,OAAO;AAC5B,QAAM,YAAY,SAAS,gBAAgB;AAC3C,MAAI,cAAc,EAAG,QAAO;AAC5B,UAAS,YAAY,gBAAgB,MAAO;AAC9C;AAEA,SAAS,aAAa;AACpB,UAAQ,SAAS;AACjB,qBAAmB;AACrB;AAEA,SAAS,qBAAqB;AAC5B,UAAQ,iBAAiB,SAAS,eAAe;AACjD,MAAI,SAAS,oBAAoB,UAAU;AACzC,uBAAmB;AAAA,EACrB;AACF;AAOO,SAAS,gBAAgB,UAAkB;AAChD,QAAM,eAAe,YAAY,QAAQ;AAGzC,QAAM,gBAAgB,OAAO,KAAK;AAClC,YAAU,MAAM;AACd,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEb,YAAU,MAAM;AACd,mBAAe,QAAQ;AACvB,UAAM,iBAAiB,QAAW,EAAE,0BAA0B,MAAM,CAAC;AAErE,UAAM,WAAW,SAAS,MAAM;AAC9B,cAAQ,kBAAkB;AAC1B,UAAI,cAAc,QAAS;AAE3B,UAAI,iBAAiB,IAAI,GAAI;AAC7B,oBAAc,UAAU;AACxB,iBAAW;AAAA,IACb,GAAG,GAAG;AAEN,UAAM,mBAAmB,CAAC,aAAa,WAAW,YAAY;AAC9D,UAAM,aAAa,SAAS,QAAQ,mBAAmB,GAAI;AAE3D,WAAO,iBAAiB,SAAS,QAAQ,OAAO,EAAE,SAAS,KAAK,CAAC;AACjE,WAAO,iBAAiB,QAAQ,QAAQ,MAAM,EAAE,SAAS,KAAK,CAAC;AAC/D,WAAO,iBAAiB,YAAY,QAAQ,UAAU,EAAE,SAAS,KAAK,CAAC;AACvE,WAAO,iBAAiB,YAAY,YAAY,EAAE,SAAS,KAAK,CAAC;AACjE,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,aAAS,iBAAiB,oBAAoB,oBAAoB,EAAE,SAAS,KAAK,CAAC;AAGnF,qBAAiB,QAAQ,CAAC,UAAU;AAClC,aAAO,iBAAiB,OAAO,YAAY,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAAA,IAC7E,CAAC;AAED,WAAO,MAAM;AACX,aAAO,oBAAoB,SAAS,QAAQ,KAAK;AACjD,aAAO,oBAAoB,QAAQ,QAAQ,IAAI;AAC/C,aAAO,oBAAoB,YAAY,QAAQ,QAAQ;AACvD,aAAO,oBAAoB,YAAY,UAAU;AACjD,aAAO,oBAAoB,UAAU,QAAQ;AAC7C,eAAS,oBAAoB,oBAAoB,kBAAkB;AAEnE,uBAAiB,QAAQ,CAAC,UAAU;AAClC,eAAO,oBAAoB,OAAO,UAAU;AAAA,MAC9C,CAAC;AAED,eAAS,OAAO;AAChB,iBAAW,OAAO;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,aAAa;AAAA,MACjB,WAAW;AAAA,MACX,YAAY,SAAS;AAAA,MACrB,eAAe,SAAS;AAAA,MACxB,eAAe,OAAO,SAAS;AAAA,MAC/B,oBAAoB,gBAAgB;AAAA,MACpC,sBAAsB,eAAe,QAAQ,MAAM,IAAI;AAAA,IACzD;AAEA,UAAM,aAAa,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAAA,EACpE,GAAG,CAAC,QAAQ,CAAC;AACf;","names":[]}
@@ -26,13 +26,11 @@ __export(native_exports, {
26
26
  getProbabilisticFingerprint: () => import_fingerprint.getProbabilisticFingerprint,
27
27
  getTags: () => import_setup.getTags,
28
28
  storage: () => import_setup.storage,
29
- useAppSessionAnalytics: () => import_use_app_session_analytics.useAppSessionAnalytics,
30
- useScreenViewAnalytics: () => import_use_screen_view_analytics.useScreenViewAnalytics
29
+ useAppAnalytics: () => import_use_app_analytics.useAppAnalytics
31
30
  });
32
31
  module.exports = __toCommonJS(native_exports);
33
32
  var import_setup = require("./setup.cjs");
34
- var import_use_screen_view_analytics = require("../hooks/use-screen-view-analytics.cjs");
35
- var import_use_app_session_analytics = require("../hooks/use-app-session-analytics.cjs");
33
+ var import_use_app_analytics = require("../hooks/use-app-analytics.cjs");
36
34
  var import_fingerprint = require("./fingerprint.cjs");
37
35
  // Annotate the CommonJS export names for ESM import in node:
38
36
  0 && (module.exports = {
@@ -42,7 +40,6 @@ var import_fingerprint = require("./fingerprint.cjs");
42
40
  getProbabilisticFingerprint,
43
41
  getTags,
44
42
  storage,
45
- useAppSessionAnalytics,
46
- useScreenViewAnalytics
43
+ useAppAnalytics
47
44
  });
48
45
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/native/index.ts"],"sourcesContent":["export { getDeviceId, getDeviceType, getTags, storage } from './setup';\nexport { useScreenViewAnalytics } from '../hooks/use-screen-view-analytics';\nexport { useAppSessionAnalytics } from '../hooks/use-app-session-analytics';\nexport { getDeterministicFingerprint, getProbabilisticFingerprint } from './fingerprint';\n\nexport type { DeterministicFingerprint, ProbabilisticFingerprint } from './fingerprint';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6D;AAC7D,uCAAuC;AACvC,uCAAuC;AACvC,yBAAyE;","names":[]}
1
+ {"version":3,"sources":["../../src/native/index.ts"],"sourcesContent":["export { getDeviceId, getDeviceType, getTags, storage } from './setup';\nexport { useAppAnalytics } from '../hooks/use-app-analytics';\nexport { getDeterministicFingerprint, getProbabilisticFingerprint } from './fingerprint';\n\nexport type { DeterministicFingerprint, ProbabilisticFingerprint } from './fingerprint';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA6D;AAC7D,+BAAgC;AAChC,yBAAyE;","names":[]}
@@ -1,6 +1,5 @@
1
1
  export { getDeviceId, getDeviceType, getTags, storage } from './setup.cjs';
2
- export { useScreenViewAnalytics } from '../hooks/use-screen-view-analytics.cjs';
3
- export { useAppSessionAnalytics } from '../hooks/use-app-session-analytics.cjs';
2
+ export { useAppAnalytics } from '../hooks/use-app-analytics.cjs';
4
3
  export { DeterministicFingerprint, ProbabilisticFingerprint, getDeterministicFingerprint, getProbabilisticFingerprint } from './fingerprint.cjs';
5
4
  import '../setup/index.cjs';
6
5
  import '../track/types.cjs';
@@ -1,6 +1,5 @@
1
1
  export { getDeviceId, getDeviceType, getTags, storage } from './setup.js';
2
- export { useScreenViewAnalytics } from '../hooks/use-screen-view-analytics.js';
3
- export { useAppSessionAnalytics } from '../hooks/use-app-session-analytics.js';
2
+ export { useAppAnalytics } from '../hooks/use-app-analytics.js';
4
3
  export { DeterministicFingerprint, ProbabilisticFingerprint, getDeterministicFingerprint, getProbabilisticFingerprint } from './fingerprint.js';
5
4
  import '../setup/index.js';
6
5
  import '../track/types.js';
@@ -1,7 +1,6 @@
1
1
  // src/native/index.ts
2
2
  import { getDeviceId, getDeviceType, getTags, storage } from "./setup.mjs";
3
- import { useScreenViewAnalytics } from "../hooks/use-screen-view-analytics.mjs";
4
- import { useAppSessionAnalytics } from "../hooks/use-app-session-analytics.mjs";
3
+ import { useAppAnalytics } from "../hooks/use-app-analytics.mjs";
5
4
  import { getDeterministicFingerprint, getProbabilisticFingerprint } from "./fingerprint.mjs";
6
5
  export {
7
6
  getDeterministicFingerprint,
@@ -10,7 +9,6 @@ export {
10
9
  getProbabilisticFingerprint,
11
10
  getTags,
12
11
  storage,
13
- useAppSessionAnalytics,
14
- useScreenViewAnalytics
12
+ useAppAnalytics
15
13
  };
16
14
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/native/index.ts"],"sourcesContent":["export { getDeviceId, getDeviceType, getTags, storage } from './setup';\nexport { useScreenViewAnalytics } from '../hooks/use-screen-view-analytics';\nexport { useAppSessionAnalytics } from '../hooks/use-app-session-analytics';\nexport { getDeterministicFingerprint, getProbabilisticFingerprint } from './fingerprint';\n\nexport type { DeterministicFingerprint, ProbabilisticFingerprint } from './fingerprint';\n"],"mappings":";AAAA,SAAS,aAAa,eAAe,SAAS,eAAe;AAC7D,SAAS,8BAA8B;AACvC,SAAS,8BAA8B;AACvC,SAAS,6BAA6B,mCAAmC;","names":[]}
1
+ {"version":3,"sources":["../../src/native/index.ts"],"sourcesContent":["export { getDeviceId, getDeviceType, getTags, storage } from './setup';\nexport { useAppAnalytics } from '../hooks/use-app-analytics';\nexport { getDeterministicFingerprint, getProbabilisticFingerprint } from './fingerprint';\n\nexport type { DeterministicFingerprint, ProbabilisticFingerprint } from './fingerprint';\n"],"mappings":";AAAA,SAAS,aAAa,eAAe,SAAS,eAAe;AAC7D,SAAS,uBAAuB;AAChC,SAAS,6BAA6B,mCAAmC;","names":[]}
@@ -39,8 +39,7 @@ var import_script = __toESM(require("next/script"), 1);
39
39
  var import_web_vitals = require("next/web-vitals");
40
40
  var import_use_click_id_persistence = require("../hooks/use-click-id-persistence.cjs");
41
41
  var import_use_outbound_click_analytics = require("../hooks/use-outbound-click-analytics.cjs");
42
- var import_use_page_view_analytics = require("../hooks/use-page-view-analytics.cjs");
43
- var import_use_web_session_analytics = require("../hooks/use-web-session-analytics.cjs");
42
+ var import_use_web_analytics = require("../hooks/use-web-analytics.cjs");
44
43
  var import_track = require("../track/index.cjs");
45
44
  var import_jsx_runtime = require("react/jsx-runtime");
46
45
  function Analytics({
@@ -56,8 +55,7 @@ function Analytics({
56
55
  }) {
57
56
  (0, import_use_click_id_persistence.useClickIdPersistence)();
58
57
  const pathname = (0, import_navigation.usePathname)();
59
- (0, import_use_page_view_analytics.usePageViewAnalytics)(pathname);
60
- (0, import_use_web_session_analytics.useWebSessionAnalytics)(pathname);
58
+ (0, import_use_web_analytics.useWebAnalytics)(pathname);
61
59
  (0, import_use_outbound_click_analytics.useOutboundClickAnalytics)();
62
60
  (0, import_web_vitals.useReportWebVitals)((metric) => {
63
61
  if (!reportWebVitals) return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/next/index.tsx"],"sourcesContent":["'use client';\n\nimport { usePathname } from 'next/navigation';\nimport Script from 'next/script';\nimport { useReportWebVitals } from 'next/web-vitals';\nimport { useClickIdPersistence } from '../hooks/use-click-id-persistence';\nimport { useOutboundClickAnalytics } from '../hooks/use-outbound-click-analytics';\nimport { usePageViewAnalytics } from '../hooks/use-page-view-analytics';\nimport { useWebSessionAnalytics } from '../hooks/use-web-session-analytics';\nimport { track } from '../track/index';\nimport type { PixelId as MetaPixelId } from '../track/fbq';\nimport type { GaId, GtmId } from '../track/gtag';\nimport type { PixelId as RedditPixelId } from '../track/rdt';\n\ntype HotjarId = `${number}`;\n\ninterface Props {\n gaId?: GaId;\n gtmId?: GtmId;\n hotjarId?: HotjarId;\n metaPixelId?: MetaPixelId;\n redditPixelId?: RedditPixelId;\n linkedInPartnerId?: `${number}`;\n facebookAppId?: string;\n nonce?: string;\n debugMode?: boolean;\n reportWebVitals?: boolean;\n}\n\nexport function Analytics({\n gaId,\n nonce,\n debugMode,\n metaPixelId,\n hotjarId,\n redditPixelId,\n linkedInPartnerId,\n facebookAppId,\n reportWebVitals = true,\n}: Props) {\n useClickIdPersistence();\n\n const pathname = usePathname();\n usePageViewAnalytics(pathname);\n useWebSessionAnalytics(pathname);\n\n useOutboundClickAnalytics();\n\n useReportWebVitals((metric) => {\n if (!reportWebVitals) return;\n const properties = {\n id: metric.id,\n rating: metric.rating,\n value: metric.value,\n delta: metric.delta,\n navigation_type: metric.navigationType,\n non_interaction: true, // avoids affecting bounce rate.\n };\n track(metric.name, properties);\n });\n\n return (\n <>\n {facebookAppId && <meta property=\"fb:app_id\" content={facebookAppId} />}\n {gaId && (\n <>\n <Script\n id=\"gtag\"\n nonce={nonce}\n src={`https://www.googletagmanager.com/gtag/js?id=${gaId}`}\n />\n <Script\n nonce={nonce}\n id=\"gtag-init\"\n dangerouslySetInnerHTML={{\n __html: `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}'${debugMode ? \" ,{ 'debug_mode': true }\" : ''});\n `,\n }}\n />\n </>\n )}\n {metaPixelId && (\n <Script\n id=\"meta-pixel\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n !(function (f, b, e, v, n, t, s) {\n if (f.fbq) return;\n n = f.fbq = function () {\n n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n };\n if (!f._fbq) f._fbq = n;\n n.push = n;\n n.loaded = !0;\n n.version = '2.0';\n n.queue = [];\n t = b.createElement(e);\n t.async = !0;\n t.src = v;\n s = b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t, s);\n })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');\n fbq('init', '${metaPixelId}');\n fbq('track', 'PageView');`,\n }}\n />\n )}\n {redditPixelId && (\n <Script\n id=\"reddit-pixel\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n !function(w,d) {\n if(!w.rdt) {\n var p = w.rdt = function() {\n p.sendEvent ? p.sendEvent.apply(p,arguments) : p.callQueue.push(arguments)\n };\n p.callQueue = [];\n var t = d.createElement(\"script\");\n t.src = \"https://www.redditstatic.com/ads/pixel.js\";\n t.async = !0;\n var s = d.getElementsByTagName(\"script\")[0];\n s.parentNode.insertBefore(t,s)\n }\n }(window, document);\n rdt('init', '${redditPixelId}');\n rdt('track', 'PageVisit');`,\n }}\n />\n )}\n {linkedInPartnerId && (\n <Script\n id=\"linkedin-insight-tag\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n _linkedin_partner_id = \"${linkedInPartnerId}\";\n window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];\n window._linkedin_data_partner_ids.push(_linkedin_partner_id);\n\n (function(l) {\n if (!l){\n window.lintrk = function(a,b){ \n window.lintrk.q.push([a,b])\n };\n window.lintrk.q=[]\n }\n var s = document.getElementsByTagName(\"script\")[0];\n var b = document.createElement(\"script\");\n b.type = \"text/javascript\";b.async = true;\n b.src = \"https://snap.licdn.com/li.lms-analytics/insight.min.js\";\n s.parentNode.insertBefore(b, s);\n })(window.lintrk);\n `,\n }}\n />\n )}\n {hotjarId && (\n <Script\n id=\"hotjar\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n (function(h,o,t,j,a,r){\n h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n h._hjSettings={hjid:${hotjarId},hjsv:6};\n a=o.getElementsByTagName('head')[0];\n r=o.createElement('script');r.async=1;\n r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n a.appendChild(r);\n })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n `,\n }}\n />\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAA4B;AAC5B,oBAAmB;AACnB,wBAAmC;AACnC,sCAAsC;AACtC,0CAA0C;AAC1C,qCAAqC;AACrC,uCAAuC;AACvC,mBAAsB;AAsDE;AAlCjB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAAU;AACR,6DAAsB;AAEtB,QAAM,eAAW,+BAAY;AAC7B,2DAAqB,QAAQ;AAC7B,+DAAuB,QAAQ;AAE/B,qEAA0B;AAE1B,4CAAmB,CAAC,WAAW;AAC7B,QAAI,CAAC,gBAAiB;AACtB,UAAM,aAAa;AAAA,MACjB,IAAI,OAAO;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,iBAAiB;AAAA;AAAA,IACnB;AACA,4BAAM,OAAO,MAAM,UAAU;AAAA,EAC/B,CAAC;AAED,SACE,4EACG;AAAA,qBAAiB,4CAAC,UAAK,UAAS,aAAY,SAAS,eAAe;AAAA,IACpE,QACC,4EACE;AAAA;AAAA,QAAC,cAAAA;AAAA,QAAA;AAAA,UACC,IAAG;AAAA,UACH;AAAA,UACA,KAAK,+CAA+C,IAAI;AAAA;AAAA,MAC1D;AAAA,MACA;AAAA,QAAC,cAAAA;AAAA,QAAA;AAAA,UACC;AAAA,UACA,IAAG;AAAA,UACH,yBAAyB;AAAA,YACvB,QAAQ;AAAA;AAAA;AAAA;AAAA,gCAIU,IAAI,IAAI,YAAY,6BAA6B,EAAE;AAAA;AAAA,UAEvE;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAED,eACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAiBO,WAAW;AAAA;AAAA,QAE5B;AAAA;AAAA,IACF;AAAA,IAED,iBACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAcO,aAAa;AAAA;AAAA,QAE9B;AAAA;AAAA,IACF;AAAA,IAED,qBACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA,wCACoB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAkB/C;AAAA;AAAA,IACF;AAAA,IAED,YACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA,oCAGgB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOlC;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":["Script"]}
1
+ {"version":3,"sources":["../../src/next/index.tsx"],"sourcesContent":["'use client';\n\nimport { usePathname } from 'next/navigation';\nimport Script from 'next/script';\nimport { useReportWebVitals } from 'next/web-vitals';\nimport { useClickIdPersistence } from '../hooks/use-click-id-persistence';\nimport { useOutboundClickAnalytics } from '../hooks/use-outbound-click-analytics';\nimport { useWebAnalytics } from '../hooks/use-web-analytics';\nimport { track } from '../track/index';\nimport type { PixelId as MetaPixelId } from '../track/fbq';\nimport type { GaId, GtmId } from '../track/gtag';\nimport type { PixelId as RedditPixelId } from '../track/rdt';\n\ntype HotjarId = `${number}`;\n\ninterface Props {\n gaId?: GaId;\n gtmId?: GtmId;\n hotjarId?: HotjarId;\n metaPixelId?: MetaPixelId;\n redditPixelId?: RedditPixelId;\n linkedInPartnerId?: `${number}`;\n facebookAppId?: string;\n nonce?: string;\n debugMode?: boolean;\n reportWebVitals?: boolean;\n}\n\nexport function Analytics({\n gaId,\n nonce,\n debugMode,\n metaPixelId,\n hotjarId,\n redditPixelId,\n linkedInPartnerId,\n facebookAppId,\n reportWebVitals = true,\n}: Props) {\n useClickIdPersistence();\n\n const pathname = usePathname();\n useWebAnalytics(pathname);\n useOutboundClickAnalytics();\n\n useReportWebVitals((metric) => {\n if (!reportWebVitals) return;\n const properties = {\n id: metric.id,\n rating: metric.rating,\n value: metric.value,\n delta: metric.delta,\n navigation_type: metric.navigationType,\n non_interaction: true, // avoids affecting bounce rate.\n };\n track(metric.name, properties);\n });\n\n return (\n <>\n {facebookAppId && <meta property=\"fb:app_id\" content={facebookAppId} />}\n {gaId && (\n <>\n <Script\n id=\"gtag\"\n nonce={nonce}\n src={`https://www.googletagmanager.com/gtag/js?id=${gaId}`}\n />\n <Script\n nonce={nonce}\n id=\"gtag-init\"\n dangerouslySetInnerHTML={{\n __html: `\n window.dataLayer = window.dataLayer || [];\n function gtag(){dataLayer.push(arguments);}\n gtag('js', new Date());\n gtag('config', '${gaId}'${debugMode ? \" ,{ 'debug_mode': true }\" : ''});\n `,\n }}\n />\n </>\n )}\n {metaPixelId && (\n <Script\n id=\"meta-pixel\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n !(function (f, b, e, v, n, t, s) {\n if (f.fbq) return;\n n = f.fbq = function () {\n n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n };\n if (!f._fbq) f._fbq = n;\n n.push = n;\n n.loaded = !0;\n n.version = '2.0';\n n.queue = [];\n t = b.createElement(e);\n t.async = !0;\n t.src = v;\n s = b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t, s);\n })(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');\n fbq('init', '${metaPixelId}');\n fbq('track', 'PageView');`,\n }}\n />\n )}\n {redditPixelId && (\n <Script\n id=\"reddit-pixel\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n !function(w,d) {\n if(!w.rdt) {\n var p = w.rdt = function() {\n p.sendEvent ? p.sendEvent.apply(p,arguments) : p.callQueue.push(arguments)\n };\n p.callQueue = [];\n var t = d.createElement(\"script\");\n t.src = \"https://www.redditstatic.com/ads/pixel.js\";\n t.async = !0;\n var s = d.getElementsByTagName(\"script\")[0];\n s.parentNode.insertBefore(t,s)\n }\n }(window, document);\n rdt('init', '${redditPixelId}');\n rdt('track', 'PageVisit');`,\n }}\n />\n )}\n {linkedInPartnerId && (\n <Script\n id=\"linkedin-insight-tag\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n _linkedin_partner_id = \"${linkedInPartnerId}\";\n window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];\n window._linkedin_data_partner_ids.push(_linkedin_partner_id);\n\n (function(l) {\n if (!l){\n window.lintrk = function(a,b){ \n window.lintrk.q.push([a,b])\n };\n window.lintrk.q=[]\n }\n var s = document.getElementsByTagName(\"script\")[0];\n var b = document.createElement(\"script\");\n b.type = \"text/javascript\";b.async = true;\n b.src = \"https://snap.licdn.com/li.lms-analytics/insight.min.js\";\n s.parentNode.insertBefore(b, s);\n })(window.lintrk);\n `,\n }}\n />\n )}\n {hotjarId && (\n <Script\n id=\"hotjar\"\n strategy=\"afterInteractive\"\n dangerouslySetInnerHTML={{\n __html: `\n (function(h,o,t,j,a,r){\n h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};\n h._hjSettings={hjid:${hotjarId},hjsv:6};\n a=o.getElementsByTagName('head')[0];\n r=o.createElement('script');r.async=1;\n r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;\n a.appendChild(r);\n })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');\n `,\n }}\n />\n )}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAA4B;AAC5B,oBAAmB;AACnB,wBAAmC;AACnC,sCAAsC;AACtC,0CAA0C;AAC1C,+BAAgC;AAChC,mBAAsB;AAoDE;AAhCjB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAAU;AACR,6DAAsB;AAEtB,QAAM,eAAW,+BAAY;AAC7B,gDAAgB,QAAQ;AACxB,qEAA0B;AAE1B,4CAAmB,CAAC,WAAW;AAC7B,QAAI,CAAC,gBAAiB;AACtB,UAAM,aAAa;AAAA,MACjB,IAAI,OAAO;AAAA,MACX,QAAQ,OAAO;AAAA,MACf,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,iBAAiB,OAAO;AAAA,MACxB,iBAAiB;AAAA;AAAA,IACnB;AACA,4BAAM,OAAO,MAAM,UAAU;AAAA,EAC/B,CAAC;AAED,SACE,4EACG;AAAA,qBAAiB,4CAAC,UAAK,UAAS,aAAY,SAAS,eAAe;AAAA,IACpE,QACC,4EACE;AAAA;AAAA,QAAC,cAAAA;AAAA,QAAA;AAAA,UACC,IAAG;AAAA,UACH;AAAA,UACA,KAAK,+CAA+C,IAAI;AAAA;AAAA,MAC1D;AAAA,MACA;AAAA,QAAC,cAAAA;AAAA,QAAA;AAAA,UACC;AAAA,UACA,IAAG;AAAA,UACH,yBAAyB;AAAA,YACvB,QAAQ;AAAA;AAAA;AAAA;AAAA,gCAIU,IAAI,IAAI,YAAY,6BAA6B,EAAE;AAAA;AAAA,UAEvE;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IAED,eACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAiBO,WAAW;AAAA;AAAA,QAE5B;AAAA;AAAA,IACF;AAAA,IAED,iBACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAcO,aAAa;AAAA;AAAA,QAE9B;AAAA;AAAA,IACF;AAAA,IAED,qBACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA,wCACoB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAkB/C;AAAA;AAAA,IACF;AAAA,IAED,YACC;AAAA,MAAC,cAAAA;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,UAAS;AAAA,QACT,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA,oCAGgB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOlC;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":["Script"]}
@@ -6,8 +6,7 @@ import Script from "next/script";
6
6
  import { useReportWebVitals } from "next/web-vitals";
7
7
  import { useClickIdPersistence } from "../hooks/use-click-id-persistence.mjs";
8
8
  import { useOutboundClickAnalytics } from "../hooks/use-outbound-click-analytics.mjs";
9
- import { usePageViewAnalytics } from "../hooks/use-page-view-analytics.mjs";
10
- import { useWebSessionAnalytics } from "../hooks/use-web-session-analytics.mjs";
9
+ import { useWebAnalytics } from "../hooks/use-web-analytics.mjs";
11
10
  import { track } from "../track/index.mjs";
12
11
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
13
12
  function Analytics({
@@ -23,8 +22,7 @@ function Analytics({
23
22
  }) {
24
23
  useClickIdPersistence();
25
24
  const pathname = usePathname();
26
- usePageViewAnalytics(pathname);
27
- useWebSessionAnalytics(pathname);
25
+ useWebAnalytics(pathname);
28
26
  useOutboundClickAnalytics();
29
27
  useReportWebVitals((metric) => {
30
28
  if (!reportWebVitals) return;