@arthurreira/analytics 0.2.1 → 0.3.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/dist/client.js +56 -11
- package/dist/index.js +14 -7
- package/package.json +34 -28
package/dist/client.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
"use client";
|
|
3
|
+
|
|
4
|
+
// src/components/Analytics.tsx
|
|
5
|
+
import { useEffect as useEffect2, useRef as useRef2 } from "react";
|
|
6
|
+
|
|
7
|
+
// src/hooks/useAnalytics.ts
|
|
8
|
+
import { useEffect, useRef } from "react";
|
|
2
9
|
|
|
3
10
|
// src/lib/api.ts
|
|
4
11
|
var BASE_FIELDS = (sessionId, eventType, path) => ({
|
|
5
12
|
session_id: sessionId,
|
|
6
13
|
event_type: eventType,
|
|
7
14
|
path,
|
|
8
|
-
page_url: window.location.href
|
|
15
|
+
page_url: typeof window !== "undefined" ? window.location.href : ""
|
|
9
16
|
});
|
|
10
17
|
async function createSession(apiUrl, apiKey, visitorId) {
|
|
11
18
|
const response = await fetch(`${apiUrl}/sessions`, {
|
|
@@ -32,9 +39,8 @@ async function sendEvent(apiUrl, apiKey, payload) {
|
|
|
32
39
|
async function trackPageview(apiUrl, apiKey, sessionId, path) {
|
|
33
40
|
await sendEvent(apiUrl, apiKey, {
|
|
34
41
|
...BASE_FIELDS(sessionId, "pageview", path),
|
|
35
|
-
page_url: `${window.location.origin}${path}`,
|
|
36
|
-
|
|
37
|
-
referrer: document.referrer || null,
|
|
42
|
+
page_url: `${typeof window !== "undefined" ? window.location.origin : ""}${path}`,
|
|
43
|
+
referrer: typeof document !== "undefined" ? document.referrer || null : null,
|
|
38
44
|
scroll_depth: 0
|
|
39
45
|
});
|
|
40
46
|
}
|
|
@@ -57,7 +63,7 @@ async function trackScroll(apiUrl, apiKey, sessionId, path, depth) {
|
|
|
57
63
|
async function trackCopy(apiUrl, apiKey, sessionId, path) {
|
|
58
64
|
await sendEvent(apiUrl, apiKey, {
|
|
59
65
|
...BASE_FIELDS(sessionId, "copy", path),
|
|
60
|
-
copied_text: window.getSelection()?.toString().slice(0, 200) || null
|
|
66
|
+
copied_text: typeof window !== "undefined" ? window.getSelection()?.toString().slice(0, 200) || null : null
|
|
61
67
|
});
|
|
62
68
|
}
|
|
63
69
|
async function trackSearch(apiUrl, apiKey, sessionId, path, query) {
|
|
@@ -130,15 +136,54 @@ function useAnalytics(apiUrl, apiKey) {
|
|
|
130
136
|
|
|
131
137
|
// src/components/Analytics.tsx
|
|
132
138
|
function Analytics({ apiKey, apiUrl }) {
|
|
133
|
-
const { trackPageview: trackPageview2 } = useAnalytics(apiUrl, apiKey);
|
|
134
|
-
const lastTracked =
|
|
139
|
+
const { trackPageview: trackPageview2, trackClick: trackClick2, trackScroll: trackScroll2, trackCopy: trackCopy2, trackError: trackError2 } = useAnalytics(apiUrl, apiKey);
|
|
140
|
+
const lastTracked = useRef2(null);
|
|
141
|
+
const lastScrollDepth = useRef2(0);
|
|
135
142
|
const pathname = typeof window !== "undefined" ? window.location.pathname : "";
|
|
136
|
-
|
|
143
|
+
useEffect2(() => {
|
|
137
144
|
if (lastTracked.current === pathname) return;
|
|
138
145
|
lastTracked.current = pathname;
|
|
139
146
|
trackPageview2(pathname);
|
|
140
147
|
}, [pathname, trackPageview2]);
|
|
148
|
+
useEffect2(() => {
|
|
149
|
+
if (typeof window === "undefined") return;
|
|
150
|
+
const handler = (e) => trackClick2(e, e.target);
|
|
151
|
+
window.addEventListener("click", handler);
|
|
152
|
+
return () => window.removeEventListener("click", handler);
|
|
153
|
+
}, [trackClick2]);
|
|
154
|
+
useEffect2(() => {
|
|
155
|
+
if (typeof window === "undefined") return;
|
|
156
|
+
const handler = () => {
|
|
157
|
+
const scrolled = window.scrollY;
|
|
158
|
+
const total = document.documentElement.scrollHeight - window.innerHeight;
|
|
159
|
+
if (total <= 0) return;
|
|
160
|
+
const depth = Math.round(scrolled / total * 100);
|
|
161
|
+
const milestones = [25, 50, 75, 100];
|
|
162
|
+
for (const m of milestones) {
|
|
163
|
+
if (depth >= m && lastScrollDepth.current < m) {
|
|
164
|
+
lastScrollDepth.current = m;
|
|
165
|
+
trackScroll2(m);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
window.addEventListener("scroll", handler, { passive: true });
|
|
170
|
+
return () => window.removeEventListener("scroll", handler);
|
|
171
|
+
}, [trackScroll2]);
|
|
172
|
+
useEffect2(() => {
|
|
173
|
+
if (typeof window === "undefined") return;
|
|
174
|
+
const handler = () => trackCopy2();
|
|
175
|
+
window.addEventListener("copy", handler);
|
|
176
|
+
return () => window.removeEventListener("copy", handler);
|
|
177
|
+
}, [trackCopy2]);
|
|
178
|
+
useEffect2(() => {
|
|
179
|
+
if (typeof window === "undefined") return;
|
|
180
|
+
const handler = (e) => trackError2(new Error(e.message));
|
|
181
|
+
window.addEventListener("error", handler);
|
|
182
|
+
return () => window.removeEventListener("error", handler);
|
|
183
|
+
}, [trackError2]);
|
|
141
184
|
return null;
|
|
142
185
|
}
|
|
143
|
-
|
|
144
|
-
|
|
186
|
+
export {
|
|
187
|
+
Analytics,
|
|
188
|
+
useAnalytics
|
|
189
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var BASE_FIELDS = (sessionId, eventType, path) => ({
|
|
|
3
3
|
session_id: sessionId,
|
|
4
4
|
event_type: eventType,
|
|
5
5
|
path,
|
|
6
|
-
page_url: window.location.href
|
|
6
|
+
page_url: typeof window !== "undefined" ? window.location.href : ""
|
|
7
7
|
});
|
|
8
8
|
async function createSession(apiUrl, apiKey, visitorId) {
|
|
9
9
|
const response = await fetch(`${apiUrl}/sessions`, {
|
|
@@ -30,9 +30,8 @@ async function sendEvent(apiUrl, apiKey, payload) {
|
|
|
30
30
|
async function trackPageview(apiUrl, apiKey, sessionId, path) {
|
|
31
31
|
await sendEvent(apiUrl, apiKey, {
|
|
32
32
|
...BASE_FIELDS(sessionId, "pageview", path),
|
|
33
|
-
page_url: `${window.location.origin}${path}`,
|
|
34
|
-
|
|
35
|
-
referrer: document.referrer || null,
|
|
33
|
+
page_url: `${typeof window !== "undefined" ? window.location.origin : ""}${path}`,
|
|
34
|
+
referrer: typeof document !== "undefined" ? document.referrer || null : null,
|
|
36
35
|
scroll_depth: 0
|
|
37
36
|
});
|
|
38
37
|
}
|
|
@@ -55,7 +54,7 @@ async function trackScroll(apiUrl, apiKey, sessionId, path, depth) {
|
|
|
55
54
|
async function trackCopy(apiUrl, apiKey, sessionId, path) {
|
|
56
55
|
await sendEvent(apiUrl, apiKey, {
|
|
57
56
|
...BASE_FIELDS(sessionId, "copy", path),
|
|
58
|
-
copied_text: window.getSelection()?.toString().slice(0, 200) || null
|
|
57
|
+
copied_text: typeof window !== "undefined" ? window.getSelection()?.toString().slice(0, 200) || null : null
|
|
59
58
|
});
|
|
60
59
|
}
|
|
61
60
|
async function trackSearch(apiUrl, apiKey, sessionId, path, query) {
|
|
@@ -78,5 +77,13 @@ async function trackCTA(apiUrl, apiKey, sessionId, path, ctaId, ctaVariant) {
|
|
|
78
77
|
cta_variant: ctaVariant || null
|
|
79
78
|
});
|
|
80
79
|
}
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
export {
|
|
81
|
+
createSession,
|
|
82
|
+
trackCTA,
|
|
83
|
+
trackClick,
|
|
84
|
+
trackCopy,
|
|
85
|
+
trackError,
|
|
86
|
+
trackPageview,
|
|
87
|
+
trackScroll,
|
|
88
|
+
trackSearch
|
|
89
|
+
};
|
package/package.json
CHANGED
|
@@ -1,29 +1,35 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
1
|
+
{ "name": "@arthurreira/analytics",
|
|
2
|
+
"version": "0.3.0",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"scripts": {
|
|
5
|
+
"build": "tsup",
|
|
6
|
+
"prepare": "tsup",
|
|
7
|
+
"dev": "tsup src/index.ts --format esm --dts --watch"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./client": {
|
|
15
|
+
"types": "./dist/client.d.ts",
|
|
16
|
+
"import": "./dist/client.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"description": "Analytics SDK for af-analytics (browser client + helpers)",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"dependencies": {},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"tsup": "^8.5.1",
|
|
28
|
+
"typescript": "^5.9.2",
|
|
29
|
+
"@types/react": "^19.0.0"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"next": "^14.0.0 || ^15.0.0 || ^16.0.0",
|
|
33
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
34
|
+
}
|
|
29
35
|
}
|