@shware/analytics 2.13.5 → 2.14.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.
- package/README.md +4 -11
- package/dist/hooks/use-page-view-analytics.cjs +0 -1
- package/dist/hooks/use-page-view-analytics.cjs.map +1 -1
- package/dist/hooks/use-page-view-analytics.mjs +0 -1
- package/dist/hooks/use-page-view-analytics.mjs.map +1 -1
- package/dist/hooks/use-session-analytics.cjs +53 -0
- package/dist/hooks/use-session-analytics.cjs.map +1 -0
- package/dist/hooks/use-session-analytics.d.cts +3 -0
- package/dist/hooks/use-session-analytics.d.ts +3 -0
- package/dist/hooks/use-session-analytics.mjs +28 -0
- package/dist/hooks/use-session-analytics.mjs.map +1 -0
- package/dist/native/setup.cjs +6 -3
- package/dist/native/setup.cjs.map +1 -1
- package/dist/native/setup.d.cts +1 -1
- package/dist/native/setup.d.ts +1 -1
- package/dist/native/setup.mjs +6 -3
- package/dist/native/setup.mjs.map +1 -1
- package/dist/next/index.cjs +3 -1
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.mjs +3 -1
- package/dist/next/index.mjs.map +1 -1
- package/dist/react-router/index.cjs +3 -1
- package/dist/react-router/index.cjs.map +1 -1
- package/dist/react-router/index.mjs +3 -1
- package/dist/react-router/index.mjs.map +1 -1
- package/dist/server/ignore-events.cjs +33 -0
- package/dist/server/ignore-events.cjs.map +1 -0
- package/dist/server/ignore-events.d.cts +3 -0
- package/dist/server/ignore-events.d.ts +3 -0
- package/dist/server/ignore-events.mjs +8 -0
- package/dist/server/ignore-events.mjs.map +1 -0
- package/dist/server/linkedin-conversions-api.cjs +2 -2
- package/dist/server/linkedin-conversions-api.cjs.map +1 -1
- package/dist/server/linkedin-conversions-api.mjs +2 -2
- package/dist/server/linkedin-conversions-api.mjs.map +1 -1
- package/dist/server/meta-conversions-api.cjs +3 -3
- package/dist/server/meta-conversions-api.cjs.map +1 -1
- package/dist/server/meta-conversions-api.mjs +3 -3
- package/dist/server/meta-conversions-api.mjs.map +1 -1
- package/dist/server/reddit-conversions-api.cjs +2 -2
- package/dist/server/reddit-conversions-api.cjs.map +1 -1
- package/dist/server/reddit-conversions-api.mjs +2 -2
- package/dist/server/reddit-conversions-api.mjs.map +1 -1
- package/dist/setup/index.cjs +8 -0
- package/dist/setup/index.cjs.map +1 -1
- package/dist/setup/index.d.cts +13 -4
- package/dist/setup/index.d.ts +13 -4
- package/dist/setup/index.mjs +7 -0
- package/dist/setup/index.mjs.map +1 -1
- package/dist/track/gtag.cjs.map +1 -1
- package/dist/track/gtag.d.cts +8 -2
- package/dist/track/gtag.d.ts +8 -2
- package/dist/track/gtag.mjs.map +1 -1
- package/dist/track/index.cjs +15 -0
- package/dist/track/index.cjs.map +1 -1
- package/dist/track/index.d.cts +2 -1
- package/dist/track/index.d.ts +2 -1
- package/dist/track/index.mjs +15 -1
- package/dist/track/index.mjs.map +1 -1
- package/dist/visitor/index.cjs +6 -7
- package/dist/visitor/index.cjs.map +1 -1
- package/dist/visitor/index.mjs +7 -8
- package/dist/visitor/index.mjs.map +1 -1
- package/dist/web/index.cjs +4 -2
- package/dist/web/index.cjs.map +1 -1
- package/dist/web/index.d.cts +1 -1
- package/dist/web/index.d.ts +1 -1
- package/dist/web/index.mjs +4 -2
- package/dist/web/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,21 +6,14 @@ layout.tsx
|
|
|
6
6
|
|
|
7
7
|
```tsx
|
|
8
8
|
import { setupAnalytics } from '@shware/analytics';
|
|
9
|
+
import { getTags, getDeviceId, storage } from '@shware/analytics/web';
|
|
9
10
|
import { v4 as uuidv4 } from 'uuid';
|
|
10
11
|
|
|
11
12
|
setupAnalytics({
|
|
13
|
+
storage,
|
|
14
|
+
getTags,
|
|
15
|
+
getDeviceId,
|
|
12
16
|
endpoint: 'https://api.example.com/v1/analytics',
|
|
13
|
-
storage: {
|
|
14
|
-
getItem: async (key) => localStorage.getItem(key),
|
|
15
|
-
setItem: async (key, value) => localStorage.setItem(key, value),
|
|
16
|
-
},
|
|
17
|
-
deviceIdFetcher: async () => {
|
|
18
|
-
const cached = localStorage.getItem('device_id');
|
|
19
|
-
if (cached) return cached;
|
|
20
|
-
const id = crypto?.randomUUID ? crypto.randomUUID() : uuidv4();
|
|
21
|
-
localStorage.setItem('device_id', id);
|
|
22
|
-
return id;
|
|
23
|
-
},
|
|
24
17
|
});
|
|
25
18
|
|
|
26
19
|
function App() {
|
|
@@ -61,7 +61,6 @@ function usePageViewAnalytics(pathname) {
|
|
|
61
61
|
(0, import_track.track)("page_view", properties, { enableThirdPartyTracking: false });
|
|
62
62
|
session.current = { start: performance.now(), total: 0, isActive: true };
|
|
63
63
|
}, [pathname]);
|
|
64
|
-
(0, import_react.useEffect)(() => (0, import_track.track)("app_launch", { pathname }, { enableThirdPartyTracking: false }), []);
|
|
65
64
|
}
|
|
66
65
|
// Annotate the CommonJS export names for ESM import in node:
|
|
67
66
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-page-view-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nexport function usePageViewAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n const session = useRef({ start: performance.now(), total: 0, isActive: true });\n\n useEffect(() => {\n const handler = () => {\n if (document.hidden) {\n session.current.total += (performance.now() - session.current.start) / 1000;\n session.current.isActive = false;\n } else {\n session.current.start = performance.now();\n session.current.isActive = true;\n }\n };\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n }, []);\n\n useEffect(() => {\n if (!prevPathname) {\n session.current = { start: performance.now(), total: 0, isActive: true };\n }\n\n let duration = session.current.total;\n if (session.current.isActive) {\n duration += (performance.now() - session.current.start) / 1000;\n }\n\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 previous_page_path_duration: prevPathname ? Number(duration.toFixed(2)) : undefined,\n };\n\n track('page_view', properties, { enableThirdPartyTracking: false });\n\n // reset session\n session.current = { start: performance.now(), total: 0, isActive: true };\n }, [pathname]);\n
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/use-page-view-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nexport function usePageViewAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n const session = useRef({ start: performance.now(), total: 0, isActive: true });\n\n useEffect(() => {\n const handler = () => {\n if (document.hidden) {\n session.current.total += (performance.now() - session.current.start) / 1000;\n session.current.isActive = false;\n } else {\n session.current.start = performance.now();\n session.current.isActive = true;\n }\n };\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n }, []);\n\n useEffect(() => {\n if (!prevPathname) {\n session.current = { start: performance.now(), total: 0, isActive: true };\n }\n\n let duration = session.current.total;\n if (session.current.isActive) {\n duration += (performance.now() - session.current.start) / 1000;\n }\n\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 previous_page_path_duration: prevPathname ? Number(duration.toFixed(2)) : undefined,\n };\n\n track('page_view', properties, { enableThirdPartyTracking: false });\n\n // reset session\n session.current = { start: performance.now(), total: 0, isActive: true };\n }, [pathname]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkC;AAClC,mBAAsB;AACtB,0BAA4B;AAErB,SAAS,qBAAqB,UAAkB;AACrD,QAAM,mBAAe,iCAAY,QAAQ;AACzC,QAAM,cAAU,qBAAO,EAAE,OAAO,YAAY,IAAI,GAAG,OAAO,GAAG,UAAU,KAAK,CAAC;AAE7E,8BAAU,MAAM;AACd,UAAM,UAAU,MAAM;AACpB,UAAI,SAAS,QAAQ;AACnB,gBAAQ,QAAQ,UAAU,YAAY,IAAI,IAAI,QAAQ,QAAQ,SAAS;AACvE,gBAAQ,QAAQ,WAAW;AAAA,MAC7B,OAAO;AACL,gBAAQ,QAAQ,QAAQ,YAAY,IAAI;AACxC,gBAAQ,QAAQ,WAAW;AAAA,MAC7B;AAAA,IACF;AACA,aAAS,iBAAiB,oBAAoB,OAAO;AACrD,WAAO,MAAM,SAAS,oBAAoB,oBAAoB,OAAO;AAAA,EACvE,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,QAAI,CAAC,cAAc;AACjB,cAAQ,UAAU,EAAE,OAAO,YAAY,IAAI,GAAG,OAAO,GAAG,UAAU,KAAK;AAAA,IACzE;AAEA,QAAI,WAAW,QAAQ,QAAQ;AAC/B,QAAI,QAAQ,QAAQ,UAAU;AAC5B,mBAAa,YAAY,IAAI,IAAI,QAAQ,QAAQ,SAAS;AAAA,IAC5D;AAEA,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,6BAA6B,eAAe,OAAO,SAAS,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC5E;AAEA,4BAAM,aAAa,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAGlE,YAAQ,UAAU,EAAE,OAAO,YAAY,IAAI,GAAG,OAAO,GAAG,UAAU,KAAK;AAAA,EACzE,GAAG,CAAC,QAAQ,CAAC;AACf;","names":[]}
|
|
@@ -37,7 +37,6 @@ function usePageViewAnalytics(pathname) {
|
|
|
37
37
|
track("page_view", properties, { enableThirdPartyTracking: false });
|
|
38
38
|
session.current = { start: performance.now(), total: 0, isActive: true };
|
|
39
39
|
}, [pathname]);
|
|
40
|
-
useEffect(() => track("app_launch", { pathname }, { enableThirdPartyTracking: false }), []);
|
|
41
40
|
}
|
|
42
41
|
export {
|
|
43
42
|
usePageViewAnalytics
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-page-view-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nexport function usePageViewAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n const session = useRef({ start: performance.now(), total: 0, isActive: true });\n\n useEffect(() => {\n const handler = () => {\n if (document.hidden) {\n session.current.total += (performance.now() - session.current.start) / 1000;\n session.current.isActive = false;\n } else {\n session.current.start = performance.now();\n session.current.isActive = true;\n }\n };\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n }, []);\n\n useEffect(() => {\n if (!prevPathname) {\n session.current = { start: performance.now(), total: 0, isActive: true };\n }\n\n let duration = session.current.total;\n if (session.current.isActive) {\n duration += (performance.now() - session.current.start) / 1000;\n }\n\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 previous_page_path_duration: prevPathname ? Number(duration.toFixed(2)) : undefined,\n };\n\n track('page_view', properties, { enableThirdPartyTracking: false });\n\n // reset session\n session.current = { start: performance.now(), total: 0, isActive: true };\n }, [pathname]);\n
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/use-page-view-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { track } from '../track/index';\nimport { usePrevious } from './use-previous';\n\nexport function usePageViewAnalytics(pathname: string) {\n const prevPathname = usePrevious(pathname);\n const session = useRef({ start: performance.now(), total: 0, isActive: true });\n\n useEffect(() => {\n const handler = () => {\n if (document.hidden) {\n session.current.total += (performance.now() - session.current.start) / 1000;\n session.current.isActive = false;\n } else {\n session.current.start = performance.now();\n session.current.isActive = true;\n }\n };\n document.addEventListener('visibilitychange', handler);\n return () => document.removeEventListener('visibilitychange', handler);\n }, []);\n\n useEffect(() => {\n if (!prevPathname) {\n session.current = { start: performance.now(), total: 0, isActive: true };\n }\n\n let duration = session.current.total;\n if (session.current.isActive) {\n duration += (performance.now() - session.current.start) / 1000;\n }\n\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 previous_page_path_duration: prevPathname ? Number(duration.toFixed(2)) : undefined,\n };\n\n track('page_view', properties, { enableThirdPartyTracking: false });\n\n // reset session\n session.current = { start: performance.now(), total: 0, isActive: true };\n }, [pathname]);\n}\n"],"mappings":";AAAA,SAAS,WAAW,cAAc;AAClC,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAErB,SAAS,qBAAqB,UAAkB;AACrD,QAAM,eAAe,YAAY,QAAQ;AACzC,QAAM,UAAU,OAAO,EAAE,OAAO,YAAY,IAAI,GAAG,OAAO,GAAG,UAAU,KAAK,CAAC;AAE7E,YAAU,MAAM;AACd,UAAM,UAAU,MAAM;AACpB,UAAI,SAAS,QAAQ;AACnB,gBAAQ,QAAQ,UAAU,YAAY,IAAI,IAAI,QAAQ,QAAQ,SAAS;AACvE,gBAAQ,QAAQ,WAAW;AAAA,MAC7B,OAAO;AACL,gBAAQ,QAAQ,QAAQ,YAAY,IAAI;AACxC,gBAAQ,QAAQ,WAAW;AAAA,MAC7B;AAAA,IACF;AACA,aAAS,iBAAiB,oBAAoB,OAAO;AACrD,WAAO,MAAM,SAAS,oBAAoB,oBAAoB,OAAO;AAAA,EACvE,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,QAAI,CAAC,cAAc;AACjB,cAAQ,UAAU,EAAE,OAAO,YAAY,IAAI,GAAG,OAAO,GAAG,UAAU,KAAK;AAAA,IACzE;AAEA,QAAI,WAAW,QAAQ,QAAQ;AAC/B,QAAI,QAAQ,QAAQ,UAAU;AAC5B,mBAAa,YAAY,IAAI,IAAI,QAAQ,QAAQ,SAAS;AAAA,IAC5D;AAEA,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,6BAA6B,eAAe,OAAO,SAAS,QAAQ,CAAC,CAAC,IAAI;AAAA,IAC5E;AAEA,UAAM,aAAa,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAGlE,YAAQ,UAAU,EAAE,OAAO,YAAY,IAAI,GAAG,OAAO,GAAG,UAAU,KAAK;AAAA,EACzE,GAAG,CAAC,QAAQ,CAAC;AACf;","names":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
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-session-analytics.ts
|
|
21
|
+
var use_session_analytics_exports = {};
|
|
22
|
+
__export(use_session_analytics_exports, {
|
|
23
|
+
useSessionAnalytics: () => useSessionAnalytics
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(use_session_analytics_exports);
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_setup = require("../setup.cjs");
|
|
28
|
+
var import_track = require("../track.cjs");
|
|
29
|
+
function useSessionAnalytics() {
|
|
30
|
+
const launched = (0, import_react.useRef)(false);
|
|
31
|
+
(0, import_react.useEffect)(() => {
|
|
32
|
+
if (launched.current) return;
|
|
33
|
+
launched.current = true;
|
|
34
|
+
const properties = { session_id: import_setup.cache.session.id };
|
|
35
|
+
(0, import_track.track)("session_start", properties, { enableThirdPartyTracking: false });
|
|
36
|
+
}, []);
|
|
37
|
+
(0, import_react.useEffect)(() => {
|
|
38
|
+
const onBeforeUnload = () => {
|
|
39
|
+
const started_at = import_setup.cache.session.startedAt;
|
|
40
|
+
const ended_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
41
|
+
const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();
|
|
42
|
+
const duration = Number((ms / 1e3).toFixed(2));
|
|
43
|
+
(0, import_track.sendBeacon)("session_end", { duration, session_id: import_setup.cache.session.id, started_at, ended_at });
|
|
44
|
+
};
|
|
45
|
+
window.addEventListener("beforeunload", onBeforeUnload);
|
|
46
|
+
return () => window.removeEventListener("beforeunload", onBeforeUnload);
|
|
47
|
+
}, []);
|
|
48
|
+
}
|
|
49
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
50
|
+
0 && (module.exports = {
|
|
51
|
+
useSessionAnalytics
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=use-session-analytics.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/use-session-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { cache } from '../setup';\nimport { sendBeacon, track } from '../track';\n\nexport function useSessionAnalytics() {\n const launched = useRef(false);\n\n useEffect(() => {\n if (launched.current) return;\n launched.current = true;\n const properties = { session_id: cache.session.id };\n track('session_start', properties, { enableThirdPartyTracking: false });\n }, []);\n\n useEffect(() => {\n const onBeforeUnload = () => {\n const started_at = cache.session.startedAt;\n const ended_at = new Date().toISOString();\n const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();\n const duration = Number((ms / 1000).toFixed(2));\n sendBeacon('session_end', { duration, session_id: cache.session.id, started_at, ended_at });\n };\n\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, []);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkC;AAClC,mBAAsB;AACtB,mBAAkC;AAE3B,SAAS,sBAAsB;AACpC,QAAM,eAAW,qBAAO,KAAK;AAE7B,8BAAU,MAAM;AACd,QAAI,SAAS,QAAS;AACtB,aAAS,UAAU;AACnB,UAAM,aAAa,EAAE,YAAY,mBAAM,QAAQ,GAAG;AAClD,4BAAM,iBAAiB,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,UAAM,iBAAiB,MAAM;AAC3B,YAAM,aAAa,mBAAM,QAAQ;AACjC,YAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAM,KAAK,IAAI,KAAK,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,QAAQ;AACvE,YAAM,WAAW,QAAQ,KAAK,KAAM,QAAQ,CAAC,CAAC;AAC9C,mCAAW,eAAe,EAAE,UAAU,YAAY,mBAAM,QAAQ,IAAI,YAAY,SAAS,CAAC;AAAA,IAC5F;AAEA,WAAO,iBAAiB,gBAAgB,cAAc;AACtD,WAAO,MAAM,OAAO,oBAAoB,gBAAgB,cAAc;AAAA,EACxE,GAAG,CAAC,CAAC;AACP;","names":[]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// src/hooks/use-session-analytics.ts
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { cache } from "../setup.mjs";
|
|
4
|
+
import { sendBeacon, track } from "../track.mjs";
|
|
5
|
+
function useSessionAnalytics() {
|
|
6
|
+
const launched = useRef(false);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (launched.current) return;
|
|
9
|
+
launched.current = true;
|
|
10
|
+
const properties = { session_id: cache.session.id };
|
|
11
|
+
track("session_start", properties, { enableThirdPartyTracking: false });
|
|
12
|
+
}, []);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const onBeforeUnload = () => {
|
|
15
|
+
const started_at = cache.session.startedAt;
|
|
16
|
+
const ended_at = (/* @__PURE__ */ new Date()).toISOString();
|
|
17
|
+
const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();
|
|
18
|
+
const duration = Number((ms / 1e3).toFixed(2));
|
|
19
|
+
sendBeacon("session_end", { duration, session_id: cache.session.id, started_at, ended_at });
|
|
20
|
+
};
|
|
21
|
+
window.addEventListener("beforeunload", onBeforeUnload);
|
|
22
|
+
return () => window.removeEventListener("beforeunload", onBeforeUnload);
|
|
23
|
+
}, []);
|
|
24
|
+
}
|
|
25
|
+
export {
|
|
26
|
+
useSessionAnalytics
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=use-session-analytics.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/use-session-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { cache } from '../setup';\nimport { sendBeacon, track } from '../track';\n\nexport function useSessionAnalytics() {\n const launched = useRef(false);\n\n useEffect(() => {\n if (launched.current) return;\n launched.current = true;\n const properties = { session_id: cache.session.id };\n track('session_start', properties, { enableThirdPartyTracking: false });\n }, []);\n\n useEffect(() => {\n const onBeforeUnload = () => {\n const started_at = cache.session.startedAt;\n const ended_at = new Date().toISOString();\n const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();\n const duration = Number((ms / 1000).toFixed(2));\n sendBeacon('session_end', { duration, session_id: cache.session.id, started_at, ended_at });\n };\n\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, []);\n}\n"],"mappings":";AAAA,SAAS,WAAW,cAAc;AAClC,SAAS,aAAa;AACtB,SAAS,YAAY,aAAa;AAE3B,SAAS,sBAAsB;AACpC,QAAM,WAAW,OAAO,KAAK;AAE7B,YAAU,MAAM;AACd,QAAI,SAAS,QAAS;AACtB,aAAS,UAAU;AACnB,UAAM,aAAa,EAAE,YAAY,MAAM,QAAQ,GAAG;AAClD,UAAM,iBAAiB,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,iBAAiB,MAAM;AAC3B,YAAM,aAAa,MAAM,QAAQ;AACjC,YAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAM,KAAK,IAAI,KAAK,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,QAAQ;AACvE,YAAM,WAAW,QAAQ,KAAK,KAAM,QAAQ,CAAC,CAAC;AAC9C,iBAAW,eAAe,EAAE,UAAU,YAAY,MAAM,QAAQ,IAAI,YAAY,SAAS,CAAC;AAAA,IAC5F;AAEA,WAAO,iBAAiB,gBAAgB,cAAc;AACtD,WAAO,MAAM,OAAO,oBAAoB,gBAAgB,cAAc;AAAA,EACxE,GAAG,CAAC,CAAC;AACP;","names":[]}
|
package/dist/native/setup.cjs
CHANGED
|
@@ -34,6 +34,7 @@ var import_expo_localization = require("expo-localization");
|
|
|
34
34
|
var import_expo_tracking_transparency = require("expo-tracking-transparency");
|
|
35
35
|
var import_react_native = require("react-native");
|
|
36
36
|
var import_react_native_url_polyfill = require("react-native-url-polyfill");
|
|
37
|
+
var import_setup = require("../setup/index.cjs");
|
|
37
38
|
var map = /* @__PURE__ */ new Map();
|
|
38
39
|
var storage = {
|
|
39
40
|
getItem: (key) => {
|
|
@@ -83,14 +84,14 @@ function getDeviceType() {
|
|
|
83
84
|
return void 0;
|
|
84
85
|
}
|
|
85
86
|
}
|
|
86
|
-
async function getTags(
|
|
87
|
+
async function getTags() {
|
|
87
88
|
var _a, _b, _c, _d;
|
|
88
89
|
const screen = import_react_native.Dimensions.get("screen");
|
|
89
90
|
const screen_width = Math.floor(screen.width);
|
|
90
91
|
const screen_height = Math.floor(screen.height);
|
|
91
92
|
const install_referrer = import_react_native.Platform.OS === "android" ? await (0, import_expo_application.getInstallReferrerAsync)() : void 0;
|
|
92
93
|
const params = new import_react_native_url_polyfill.URLSearchParams(install_referrer);
|
|
93
|
-
|
|
94
|
+
const tags = {
|
|
94
95
|
os: `${import_expo_device.osName} ${import_expo_device.osVersion}`,
|
|
95
96
|
os_name: import_expo_device.osName ?? void 0,
|
|
96
97
|
os_version: import_expo_device.osVersion ?? void 0,
|
|
@@ -104,7 +105,7 @@ async function getTags(release) {
|
|
|
104
105
|
screen_width,
|
|
105
106
|
screen_height,
|
|
106
107
|
screen_resolution: `${screen_width}x${screen_height}`,
|
|
107
|
-
release,
|
|
108
|
+
release: import_setup.config.release,
|
|
108
109
|
language: ((_b = (_a = (0, import_expo_localization.getLocales)()) == null ? void 0 : _a[0]) == null ? void 0 : _b.languageTag) ?? "en",
|
|
109
110
|
time_zone: ((_d = (_c = (0, import_expo_localization.getCalendars)()) == null ? void 0 : _c[0]) == null ? void 0 : _d.timeZone) ?? "UTC",
|
|
110
111
|
environment: __DEV__ ? "development" : "production",
|
|
@@ -123,6 +124,8 @@ async function getTags(release) {
|
|
|
123
124
|
utm_creative_format: params.get("utm_creative_format") ?? void 0,
|
|
124
125
|
utm_marketing_tactic: params.get("utm_marketing_tactic") ?? void 0
|
|
125
126
|
};
|
|
127
|
+
import_setup.cache.tags = tags;
|
|
128
|
+
return tags;
|
|
126
129
|
}
|
|
127
130
|
// Annotate the CommonJS export names for ESM import in node:
|
|
128
131
|
0 && (module.exports = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/native/setup.ts"],"sourcesContent":["import 'expo-sqlite/localStorage/install';\nimport { getAndroidId, getInstallReferrerAsync, getIosIdForVendorAsync } from 'expo-application';\nimport { randomUUID } from 'expo-crypto';\nimport {\n DeviceType,\n deviceType,\n manufacturer,\n modelId,\n modelName,\n osName,\n osVersion,\n} from 'expo-device';\nimport { getCalendars, getLocales } from 'expo-localization';\nimport { getAdvertisingId } from 'expo-tracking-transparency';\nimport { Dimensions, PixelRatio, Platform } from 'react-native';\nimport { URLSearchParams } from 'react-native-url-polyfill';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n\nexport async function getDeviceId(): Promise<string> {\n let deviceId: string | null = null;\n if (Platform.OS === 'ios') {\n deviceId = await getIosIdForVendorAsync();\n } else if (Platform.OS === 'android') {\n deviceId = getAndroidId();\n }\n if (!deviceId) {\n deviceId = localStorage.getItem('device_id');\n if (!deviceId) {\n deviceId = randomUUID();\n localStorage.setItem('device_id', deviceId);\n }\n }\n return deviceId;\n}\n\nexport function getDeviceType(): string | undefined {\n switch (deviceType) {\n case DeviceType.PHONE:\n return 'mobile';\n case DeviceType.TABLET:\n return 'tablet';\n case DeviceType.DESKTOP:\n return 'desktop';\n case DeviceType.TV:\n return 'smarttv';\n default:\n return undefined;\n }\n}\n\nexport async function getTags(
|
|
1
|
+
{"version":3,"sources":["../../src/native/setup.ts"],"sourcesContent":["import 'expo-sqlite/localStorage/install';\nimport { getAndroidId, getInstallReferrerAsync, getIosIdForVendorAsync } from 'expo-application';\nimport { randomUUID } from 'expo-crypto';\nimport {\n DeviceType,\n deviceType,\n manufacturer,\n modelId,\n modelName,\n osName,\n osVersion,\n} from 'expo-device';\nimport { getCalendars, getLocales } from 'expo-localization';\nimport { getAdvertisingId } from 'expo-tracking-transparency';\nimport { Dimensions, PixelRatio, Platform } from 'react-native';\nimport { URLSearchParams } from 'react-native-url-polyfill';\nimport { cache, config } from '../setup/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n\nexport async function getDeviceId(): Promise<string> {\n let deviceId: string | null = null;\n if (Platform.OS === 'ios') {\n deviceId = await getIosIdForVendorAsync();\n } else if (Platform.OS === 'android') {\n deviceId = getAndroidId();\n }\n if (!deviceId) {\n deviceId = localStorage.getItem('device_id');\n if (!deviceId) {\n deviceId = randomUUID();\n localStorage.setItem('device_id', deviceId);\n }\n }\n return deviceId;\n}\n\nexport function getDeviceType(): string | undefined {\n switch (deviceType) {\n case DeviceType.PHONE:\n return 'mobile';\n case DeviceType.TABLET:\n return 'tablet';\n case DeviceType.DESKTOP:\n return 'desktop';\n case DeviceType.TV:\n return 'smarttv';\n default:\n return undefined;\n }\n}\n\nexport async function getTags(): Promise<TrackTags> {\n const screen = Dimensions.get('screen');\n const screen_width = Math.floor(screen.width);\n const screen_height = Math.floor(screen.height);\n\n const install_referrer = Platform.OS === 'android' ? await getInstallReferrerAsync() : undefined;\n const params = new URLSearchParams(install_referrer);\n\n const tags: TrackTags = {\n os: `${osName} ${osVersion}`,\n os_name: osName ?? undefined,\n os_version: osVersion ?? undefined,\n platform: Platform.OS,\n device: modelName ?? undefined,\n device_id: await getDeviceId(),\n device_type: getDeviceType(),\n device_vendor: manufacturer ?? undefined,\n device_model_id: modelId ?? undefined,\n device_pixel_ratio: PixelRatio.get(),\n screen_width,\n screen_height,\n screen_resolution: `${screen_width}x${screen_height}`,\n release: config.release,\n language: getLocales()?.[0]?.languageTag ?? 'en',\n time_zone: getCalendars()?.[0]?.timeZone ?? 'UTC',\n environment: __DEV__ ? 'development' : 'production',\n source: 'app',\n // ads\n advertising_id: getAdvertisingId() ?? undefined,\n install_referrer,\n // utm params\n utm_source: params.get('utm_source') ?? undefined,\n utm_medium: params.get('utm_medium') ?? undefined,\n utm_campaign: params.get('utm_campaign') ?? undefined,\n utm_term: params.get('utm_term') ?? undefined,\n utm_content: params.get('utm_content') ?? undefined,\n utm_id: params.get('utm_id') ?? undefined,\n utm_source_platform: params.get('utm_source_platform') ?? undefined,\n utm_creative_format: params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic: params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAO;AACP,8BAA8E;AAC9E,yBAA2B;AAC3B,yBAQO;AACP,+BAAyC;AACzC,wCAAiC;AACjC,0BAAiD;AACjD,uCAAgC;AAChC,mBAA8B;AAI9B,IAAM,MAAM,oBAAI,IAAoB;AAE7B,IAAM,UAAmB;AAAA,EAC9B,SAAS,CAAC,QAAQ;AAChB,QAAI;AACF,aAAO,aAAa,QAAQ,GAAG;AAAA,IACjC,QAAQ;AACN,cAAQ,MAAM,+BAA+B;AAC7C,aAAO,IAAI,IAAI,GAAG,KAAK;AAAA,IACzB;AAAA,EACF;AAAA,EACA,SAAS,CAAC,KAAK,UAAU;AACvB,QAAI;AACF,mBAAa,QAAQ,KAAK,KAAK;AAAA,IACjC,QAAQ;AACN,cAAQ,MAAM,+BAA+B;AAC7C,UAAI,IAAI,KAAK,KAAK;AAAA,IACpB;AAAA,EACF;AACF;AAEA,eAAsB,cAA+B;AACnD,MAAI,WAA0B;AAC9B,MAAI,6BAAS,OAAO,OAAO;AACzB,eAAW,UAAM,gDAAuB;AAAA,EAC1C,WAAW,6BAAS,OAAO,WAAW;AACpC,mBAAW,sCAAa;AAAA,EAC1B;AACA,MAAI,CAAC,UAAU;AACb,eAAW,aAAa,QAAQ,WAAW;AAC3C,QAAI,CAAC,UAAU;AACb,qBAAW,+BAAW;AACtB,mBAAa,QAAQ,aAAa,QAAQ;AAAA,IAC5C;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAoC;AAClD,UAAQ,+BAAY;AAAA,IAClB,KAAK,8BAAW;AACd,aAAO;AAAA,IACT,KAAK,8BAAW;AACd,aAAO;AAAA,IACT,KAAK,8BAAW;AACd,aAAO;AAAA,IACT,KAAK,8BAAW;AACd,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,eAAsB,UAA8B;AAzEpD;AA0EE,QAAM,SAAS,+BAAW,IAAI,QAAQ;AACtC,QAAM,eAAe,KAAK,MAAM,OAAO,KAAK;AAC5C,QAAM,gBAAgB,KAAK,MAAM,OAAO,MAAM;AAE9C,QAAM,mBAAmB,6BAAS,OAAO,YAAY,UAAM,iDAAwB,IAAI;AACvF,QAAM,SAAS,IAAI,iDAAgB,gBAAgB;AAEnD,QAAM,OAAkB;AAAA,IACtB,IAAI,GAAG,yBAAM,IAAI,4BAAS;AAAA,IAC1B,SAAS,6BAAU;AAAA,IACnB,YAAY,gCAAa;AAAA,IACzB,UAAU,6BAAS;AAAA,IACnB,QAAQ,gCAAa;AAAA,IACrB,WAAW,MAAM,YAAY;AAAA,IAC7B,aAAa,cAAc;AAAA,IAC3B,eAAe,mCAAgB;AAAA,IAC/B,iBAAiB,8BAAW;AAAA,IAC5B,oBAAoB,+BAAW,IAAI;AAAA,IACnC;AAAA,IACA;AAAA,IACA,mBAAmB,GAAG,YAAY,IAAI,aAAa;AAAA,IACnD,SAAS,oBAAO;AAAA,IAChB,YAAU,oDAAW,MAAX,mBAAe,OAAf,mBAAmB,gBAAe;AAAA,IAC5C,aAAW,sDAAa,MAAb,mBAAiB,OAAjB,mBAAqB,aAAY;AAAA,IAC5C,aAAa,UAAU,gBAAgB;AAAA,IACvC,QAAQ;AAAA;AAAA,IAER,oBAAgB,oDAAiB,KAAK;AAAA,IACtC;AAAA;AAAA,IAEA,YAAY,OAAO,IAAI,YAAY,KAAK;AAAA,IACxC,YAAY,OAAO,IAAI,YAAY,KAAK;AAAA,IACxC,cAAc,OAAO,IAAI,cAAc,KAAK;AAAA,IAC5C,UAAU,OAAO,IAAI,UAAU,KAAK;AAAA,IACpC,aAAa,OAAO,IAAI,aAAa,KAAK;AAAA,IAC1C,QAAQ,OAAO,IAAI,QAAQ,KAAK;AAAA,IAChC,qBAAqB,OAAO,IAAI,qBAAqB,KAAK;AAAA,IAC1D,qBAAqB,OAAO,IAAI,qBAAqB,KAAK;AAAA,IAC1D,sBAAsB,OAAO,IAAI,sBAAsB,KAAK;AAAA,EAC9D;AAEA,qBAAM,OAAO;AACb,SAAO;AACT;","names":[]}
|
package/dist/native/setup.d.cts
CHANGED
|
@@ -6,6 +6,6 @@ import '../track/gtag.cjs';
|
|
|
6
6
|
declare const storage: Storage;
|
|
7
7
|
declare function getDeviceId(): Promise<string>;
|
|
8
8
|
declare function getDeviceType(): string | undefined;
|
|
9
|
-
declare function getTags(
|
|
9
|
+
declare function getTags(): Promise<TrackTags>;
|
|
10
10
|
|
|
11
11
|
export { getDeviceId, getDeviceType, getTags, storage };
|
package/dist/native/setup.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ import '../track/gtag.js';
|
|
|
6
6
|
declare const storage: Storage;
|
|
7
7
|
declare function getDeviceId(): Promise<string>;
|
|
8
8
|
declare function getDeviceType(): string | undefined;
|
|
9
|
-
declare function getTags(
|
|
9
|
+
declare function getTags(): Promise<TrackTags>;
|
|
10
10
|
|
|
11
11
|
export { getDeviceId, getDeviceType, getTags, storage };
|
package/dist/native/setup.mjs
CHANGED
|
@@ -15,6 +15,7 @@ import { getCalendars, getLocales } from "expo-localization";
|
|
|
15
15
|
import { getAdvertisingId } from "expo-tracking-transparency";
|
|
16
16
|
import { Dimensions, PixelRatio, Platform } from "react-native";
|
|
17
17
|
import { URLSearchParams } from "react-native-url-polyfill";
|
|
18
|
+
import { cache, config } from "../setup/index.mjs";
|
|
18
19
|
var map = /* @__PURE__ */ new Map();
|
|
19
20
|
var storage = {
|
|
20
21
|
getItem: (key) => {
|
|
@@ -64,14 +65,14 @@ function getDeviceType() {
|
|
|
64
65
|
return void 0;
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
|
-
async function getTags(
|
|
68
|
+
async function getTags() {
|
|
68
69
|
var _a, _b, _c, _d;
|
|
69
70
|
const screen = Dimensions.get("screen");
|
|
70
71
|
const screen_width = Math.floor(screen.width);
|
|
71
72
|
const screen_height = Math.floor(screen.height);
|
|
72
73
|
const install_referrer = Platform.OS === "android" ? await getInstallReferrerAsync() : void 0;
|
|
73
74
|
const params = new URLSearchParams(install_referrer);
|
|
74
|
-
|
|
75
|
+
const tags = {
|
|
75
76
|
os: `${osName} ${osVersion}`,
|
|
76
77
|
os_name: osName ?? void 0,
|
|
77
78
|
os_version: osVersion ?? void 0,
|
|
@@ -85,7 +86,7 @@ async function getTags(release) {
|
|
|
85
86
|
screen_width,
|
|
86
87
|
screen_height,
|
|
87
88
|
screen_resolution: `${screen_width}x${screen_height}`,
|
|
88
|
-
release,
|
|
89
|
+
release: config.release,
|
|
89
90
|
language: ((_b = (_a = getLocales()) == null ? void 0 : _a[0]) == null ? void 0 : _b.languageTag) ?? "en",
|
|
90
91
|
time_zone: ((_d = (_c = getCalendars()) == null ? void 0 : _c[0]) == null ? void 0 : _d.timeZone) ?? "UTC",
|
|
91
92
|
environment: __DEV__ ? "development" : "production",
|
|
@@ -104,6 +105,8 @@ async function getTags(release) {
|
|
|
104
105
|
utm_creative_format: params.get("utm_creative_format") ?? void 0,
|
|
105
106
|
utm_marketing_tactic: params.get("utm_marketing_tactic") ?? void 0
|
|
106
107
|
};
|
|
108
|
+
cache.tags = tags;
|
|
109
|
+
return tags;
|
|
107
110
|
}
|
|
108
111
|
export {
|
|
109
112
|
getDeviceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/native/setup.ts"],"sourcesContent":["import 'expo-sqlite/localStorage/install';\nimport { getAndroidId, getInstallReferrerAsync, getIosIdForVendorAsync } from 'expo-application';\nimport { randomUUID } from 'expo-crypto';\nimport {\n DeviceType,\n deviceType,\n manufacturer,\n modelId,\n modelName,\n osName,\n osVersion,\n} from 'expo-device';\nimport { getCalendars, getLocales } from 'expo-localization';\nimport { getAdvertisingId } from 'expo-tracking-transparency';\nimport { Dimensions, PixelRatio, Platform } from 'react-native';\nimport { URLSearchParams } from 'react-native-url-polyfill';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n\nexport async function getDeviceId(): Promise<string> {\n let deviceId: string | null = null;\n if (Platform.OS === 'ios') {\n deviceId = await getIosIdForVendorAsync();\n } else if (Platform.OS === 'android') {\n deviceId = getAndroidId();\n }\n if (!deviceId) {\n deviceId = localStorage.getItem('device_id');\n if (!deviceId) {\n deviceId = randomUUID();\n localStorage.setItem('device_id', deviceId);\n }\n }\n return deviceId;\n}\n\nexport function getDeviceType(): string | undefined {\n switch (deviceType) {\n case DeviceType.PHONE:\n return 'mobile';\n case DeviceType.TABLET:\n return 'tablet';\n case DeviceType.DESKTOP:\n return 'desktop';\n case DeviceType.TV:\n return 'smarttv';\n default:\n return undefined;\n }\n}\n\nexport async function getTags(
|
|
1
|
+
{"version":3,"sources":["../../src/native/setup.ts"],"sourcesContent":["import 'expo-sqlite/localStorage/install';\nimport { getAndroidId, getInstallReferrerAsync, getIosIdForVendorAsync } from 'expo-application';\nimport { randomUUID } from 'expo-crypto';\nimport {\n DeviceType,\n deviceType,\n manufacturer,\n modelId,\n modelName,\n osName,\n osVersion,\n} from 'expo-device';\nimport { getCalendars, getLocales } from 'expo-localization';\nimport { getAdvertisingId } from 'expo-tracking-transparency';\nimport { Dimensions, PixelRatio, Platform } from 'react-native';\nimport { URLSearchParams } from 'react-native-url-polyfill';\nimport { cache, config } from '../setup/index';\nimport type { Storage } from '../setup/index';\nimport type { TrackTags } from '../track/types';\n\nconst map = new Map<string, string>();\n\nexport const storage: Storage = {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n console.error('localStorage is not available');\n return map.get(key) ?? null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n console.error('localStorage is not available');\n map.set(key, value);\n }\n },\n};\n\nexport async function getDeviceId(): Promise<string> {\n let deviceId: string | null = null;\n if (Platform.OS === 'ios') {\n deviceId = await getIosIdForVendorAsync();\n } else if (Platform.OS === 'android') {\n deviceId = getAndroidId();\n }\n if (!deviceId) {\n deviceId = localStorage.getItem('device_id');\n if (!deviceId) {\n deviceId = randomUUID();\n localStorage.setItem('device_id', deviceId);\n }\n }\n return deviceId;\n}\n\nexport function getDeviceType(): string | undefined {\n switch (deviceType) {\n case DeviceType.PHONE:\n return 'mobile';\n case DeviceType.TABLET:\n return 'tablet';\n case DeviceType.DESKTOP:\n return 'desktop';\n case DeviceType.TV:\n return 'smarttv';\n default:\n return undefined;\n }\n}\n\nexport async function getTags(): Promise<TrackTags> {\n const screen = Dimensions.get('screen');\n const screen_width = Math.floor(screen.width);\n const screen_height = Math.floor(screen.height);\n\n const install_referrer = Platform.OS === 'android' ? await getInstallReferrerAsync() : undefined;\n const params = new URLSearchParams(install_referrer);\n\n const tags: TrackTags = {\n os: `${osName} ${osVersion}`,\n os_name: osName ?? undefined,\n os_version: osVersion ?? undefined,\n platform: Platform.OS,\n device: modelName ?? undefined,\n device_id: await getDeviceId(),\n device_type: getDeviceType(),\n device_vendor: manufacturer ?? undefined,\n device_model_id: modelId ?? undefined,\n device_pixel_ratio: PixelRatio.get(),\n screen_width,\n screen_height,\n screen_resolution: `${screen_width}x${screen_height}`,\n release: config.release,\n language: getLocales()?.[0]?.languageTag ?? 'en',\n time_zone: getCalendars()?.[0]?.timeZone ?? 'UTC',\n environment: __DEV__ ? 'development' : 'production',\n source: 'app',\n // ads\n advertising_id: getAdvertisingId() ?? undefined,\n install_referrer,\n // utm params\n utm_source: params.get('utm_source') ?? undefined,\n utm_medium: params.get('utm_medium') ?? undefined,\n utm_campaign: params.get('utm_campaign') ?? undefined,\n utm_term: params.get('utm_term') ?? undefined,\n utm_content: params.get('utm_content') ?? undefined,\n utm_id: params.get('utm_id') ?? undefined,\n utm_source_platform: params.get('utm_source_platform') ?? undefined,\n utm_creative_format: params.get('utm_creative_format') ?? undefined,\n utm_marketing_tactic: params.get('utm_marketing_tactic') ?? undefined,\n };\n\n cache.tags = tags;\n return tags;\n}\n"],"mappings":"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","names":[]}
|
package/dist/next/index.cjs
CHANGED
|
@@ -39,6 +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_page_view_analytics = require("../hooks/use-page-view-analytics.cjs");
|
|
42
|
+
var import_use_session_analytics = require("../hooks/use-session-analytics.cjs");
|
|
42
43
|
var import_track = require("../track/index.cjs");
|
|
43
44
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
44
45
|
function Analytics({
|
|
@@ -52,9 +53,10 @@ function Analytics({
|
|
|
52
53
|
facebookAppId,
|
|
53
54
|
reportWebVitals = true
|
|
54
55
|
}) {
|
|
56
|
+
(0, import_use_session_analytics.useSessionAnalytics)();
|
|
57
|
+
(0, import_use_click_id_persistence.useClickIdPersistence)();
|
|
55
58
|
const pathname = (0, import_navigation.usePathname)();
|
|
56
59
|
(0, import_use_page_view_analytics.usePageViewAnalytics)(pathname);
|
|
57
|
-
(0, import_use_click_id_persistence.useClickIdPersistence)();
|
|
58
60
|
(0, import_web_vitals.useReportWebVitals)((metric) => {
|
|
59
61
|
if (!reportWebVitals) return;
|
|
60
62
|
const properties = {
|
package/dist/next/index.cjs.map
CHANGED
|
@@ -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 { usePageViewAnalytics } from '../hooks/use-page-view-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 const pathname = usePathname();\n usePageViewAnalytics(pathname);\n\n
|
|
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 { usePageViewAnalytics } from '../hooks/use-page-view-analytics';\nimport { useSessionAnalytics } from '../hooks/use-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 useSessionAnalytics();\n useClickIdPersistence();\n\n const pathname = usePathname();\n usePageViewAnalytics(pathname);\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,qCAAqC;AACrC,mCAAoC;AACpC,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,wDAAoB;AACpB,6DAAsB;AAEtB,QAAM,eAAW,+BAAY;AAC7B,2DAAqB,QAAQ;AAE7B,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"]}
|
package/dist/next/index.mjs
CHANGED
|
@@ -6,6 +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 { usePageViewAnalytics } from "../hooks/use-page-view-analytics.mjs";
|
|
9
|
+
import { useSessionAnalytics } from "../hooks/use-session-analytics.mjs";
|
|
9
10
|
import { track } from "../track/index.mjs";
|
|
10
11
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
11
12
|
function Analytics({
|
|
@@ -19,9 +20,10 @@ function Analytics({
|
|
|
19
20
|
facebookAppId,
|
|
20
21
|
reportWebVitals = true
|
|
21
22
|
}) {
|
|
23
|
+
useSessionAnalytics();
|
|
24
|
+
useClickIdPersistence();
|
|
22
25
|
const pathname = usePathname();
|
|
23
26
|
usePageViewAnalytics(pathname);
|
|
24
|
-
useClickIdPersistence();
|
|
25
27
|
useReportWebVitals((metric) => {
|
|
26
28
|
if (!reportWebVitals) return;
|
|
27
29
|
const properties = {
|
package/dist/next/index.mjs.map
CHANGED
|
@@ -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 { usePageViewAnalytics } from '../hooks/use-page-view-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 const pathname = usePathname();\n usePageViewAnalytics(pathname);\n\n
|
|
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 { usePageViewAnalytics } from '../hooks/use-page-view-analytics';\nimport { useSessionAnalytics } from '../hooks/use-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 useSessionAnalytics();\n useClickIdPersistence();\n\n const pathname = usePathname();\n usePageViewAnalytics(pathname);\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":";;;AAEA,SAAS,mBAAmB;AAC5B,OAAO,YAAY;AACnB,SAAS,0BAA0B;AACnC,SAAS,6BAA6B;AACtC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,aAAa;AAoDE,SAEhB,UAFgB,KAEhB,YAFgB;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,sBAAoB;AACpB,wBAAsB;AAEtB,QAAM,WAAW,YAAY;AAC7B,uBAAqB,QAAQ;AAE7B,qBAAmB,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,UAAM,OAAO,MAAM,UAAU;AAAA,EAC/B,CAAC;AAED,SACE,iCACG;AAAA,qBAAiB,oBAAC,UAAK,UAAS,aAAY,SAAS,eAAe;AAAA,IACpE,QACC,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH;AAAA,UACA,KAAK,+CAA+C,IAAI;AAAA;AAAA,MAC1D;AAAA,MACA;AAAA,QAAC;AAAA;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;AAAA;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;AAAA;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;AAAA;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;AAAA;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":[]}
|
|
@@ -28,6 +28,7 @@ var import_react_router = require("react-router");
|
|
|
28
28
|
var import_web_vitals = require("web-vitals");
|
|
29
29
|
var import_use_click_id_persistence = require("../hooks/use-click-id-persistence.cjs");
|
|
30
30
|
var import_use_page_view_analytics = require("../hooks/use-page-view-analytics.cjs");
|
|
31
|
+
var import_use_session_analytics = require("../hooks/use-session-analytics.cjs");
|
|
31
32
|
var import_track = require("../track/index.cjs");
|
|
32
33
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
33
34
|
function useReportWebVitals(reportWebVitalsFn) {
|
|
@@ -50,9 +51,10 @@ function Analytics({
|
|
|
50
51
|
facebookAppId,
|
|
51
52
|
reportWebVitals = true
|
|
52
53
|
}) {
|
|
54
|
+
(0, import_use_session_analytics.useSessionAnalytics)();
|
|
55
|
+
(0, import_use_click_id_persistence.useClickIdPersistence)();
|
|
53
56
|
const { pathname } = (0, import_react_router.useLocation)();
|
|
54
57
|
(0, import_use_page_view_analytics.usePageViewAnalytics)(pathname);
|
|
55
|
-
(0, import_use_click_id_persistence.useClickIdPersistence)();
|
|
56
58
|
useReportWebVitals((metric) => {
|
|
57
59
|
if (!reportWebVitals) return;
|
|
58
60
|
const properties = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react-router/index.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport { useLocation } from 'react-router';\nimport { type Metric, onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals';\nimport { useClickIdPersistence } from '../hooks/use-click-id-persistence';\nimport { usePageViewAnalytics } from '../hooks/use-page-view-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\nfunction useReportWebVitals(reportWebVitalsFn: (metric: Metric) => void) {\n useEffect(() => {\n onCLS(reportWebVitalsFn);\n onLCP(reportWebVitalsFn);\n onINP(reportWebVitalsFn);\n onFCP(reportWebVitalsFn);\n onTTFB(reportWebVitalsFn);\n }, [reportWebVitalsFn]);\n}\n\ninterface Props {\n gaId?: GaId;\n gtmId?: GtmId;\n metaPixelId?: MetaPixelId;\n redditPixelId?: RedditPixelId;\n linkedInPartnerId?: `${number}`;\n hotjarId?: HotjarId;\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 redditPixelId,\n linkedInPartnerId,\n hotjarId,\n facebookAppId,\n reportWebVitals = true,\n}: Props) {\n const { pathname } = useLocation();\n usePageViewAnalytics(pathname);\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/react-router/index.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport { useLocation } from 'react-router';\nimport { type Metric, onCLS, onFCP, onINP, onLCP, onTTFB } from 'web-vitals';\nimport { useClickIdPersistence } from '../hooks/use-click-id-persistence';\nimport { usePageViewAnalytics } from '../hooks/use-page-view-analytics';\nimport { useSessionAnalytics } from '../hooks/use-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\nfunction useReportWebVitals(reportWebVitalsFn: (metric: Metric) => void) {\n useEffect(() => {\n onCLS(reportWebVitalsFn);\n onLCP(reportWebVitalsFn);\n onINP(reportWebVitalsFn);\n onFCP(reportWebVitalsFn);\n onTTFB(reportWebVitalsFn);\n }, [reportWebVitalsFn]);\n}\n\ninterface Props {\n gaId?: GaId;\n gtmId?: GtmId;\n metaPixelId?: MetaPixelId;\n redditPixelId?: RedditPixelId;\n linkedInPartnerId?: `${number}`;\n hotjarId?: HotjarId;\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 redditPixelId,\n linkedInPartnerId,\n hotjarId,\n facebookAppId,\n reportWebVitals = true,\n}: Props) {\n useSessionAnalytics();\n useClickIdPersistence();\n\n const { pathname } = useLocation();\n usePageViewAnalytics(pathname);\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 async\n id=\"gtag\"\n nonce={nonce}\n src={`https://www.googletagmanager.com/gtag/js?id=${gaId}`}\n />\n <script\n async\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 async\n id=\"meta-pixel\"\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 async\n id=\"reddit-pixel\"\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 async\n id=\"linkedin-insight-tag\"\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 async\n id=\"hotjar\"\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;AAAA,mBAA0B;AAC1B,0BAA4B;AAC5B,wBAAgE;AAChE,sCAAsC;AACtC,qCAAqC;AACrC,mCAAoC;AACpC,mBAAsB;AA8DE;AAvDxB,SAAS,mBAAmB,mBAA6C;AACvE,8BAAU,MAAM;AACd,iCAAM,iBAAiB;AACvB,iCAAM,iBAAiB;AACvB,iCAAM,iBAAiB;AACvB,iCAAM,iBAAiB;AACvB,kCAAO,iBAAiB;AAAA,EAC1B,GAAG,CAAC,iBAAiB,CAAC;AACxB;AAeO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,GAAU;AACR,wDAAoB;AACpB,6DAAsB;AAEtB,QAAM,EAAE,SAAS,QAAI,iCAAY;AACjC,2DAAqB,QAAQ;AAE7B,qBAAmB,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;AAAA;AAAA,UACC,OAAK;AAAA,UACL,IAAG;AAAA,UACH;AAAA,UACA,KAAK,+CAA+C,IAAI;AAAA;AAAA,MAC1D;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,OAAK;AAAA,UACL;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;AAAA;AAAA,QACC,OAAK;AAAA,QACL,IAAG;AAAA,QACH,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;AAAA;AAAA,QACC,OAAK;AAAA,QACL,IAAG;AAAA,QACH,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;AAAA;AAAA,QACC,OAAK;AAAA,QACL,IAAG;AAAA,QACH,yBAAyB;AAAA,UACvB,QAAQ;AAAA,sCACkB,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAkB7C;AAAA;AAAA,IACF;AAAA,IAED,YACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAK;AAAA,QACL,IAAG;AAAA,QACH,yBAAyB;AAAA,UACvB,QAAQ;AAAA;AAAA;AAAA,oCAGgB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOlC;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;","names":[]}
|
|
@@ -4,6 +4,7 @@ import { useLocation } from "react-router";
|
|
|
4
4
|
import { onCLS, onFCP, onINP, onLCP, onTTFB } from "web-vitals";
|
|
5
5
|
import { useClickIdPersistence } from "../hooks/use-click-id-persistence.mjs";
|
|
6
6
|
import { usePageViewAnalytics } from "../hooks/use-page-view-analytics.mjs";
|
|
7
|
+
import { useSessionAnalytics } from "../hooks/use-session-analytics.mjs";
|
|
7
8
|
import { track } from "../track/index.mjs";
|
|
8
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
10
|
function useReportWebVitals(reportWebVitalsFn) {
|
|
@@ -26,9 +27,10 @@ function Analytics({
|
|
|
26
27
|
facebookAppId,
|
|
27
28
|
reportWebVitals = true
|
|
28
29
|
}) {
|
|
30
|
+
useSessionAnalytics();
|
|
31
|
+
useClickIdPersistence();
|
|
29
32
|
const { pathname } = useLocation();
|
|
30
33
|
usePageViewAnalytics(pathname);
|
|
31
|
-
useClickIdPersistence();
|
|
32
34
|
useReportWebVitals((metric) => {
|
|
33
35
|
if (!reportWebVitals) return;
|
|
34
36
|
const properties = {
|