@shware/analytics 3.0.2 → 3.0.4
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.
|
@@ -58,12 +58,10 @@ function getScrollPercent() {
|
|
|
58
58
|
return (scrollTop + windowHeight) * 100 / docHeight;
|
|
59
59
|
}
|
|
60
60
|
function onPageHide() {
|
|
61
|
-
console.log("onPageHide");
|
|
62
61
|
import_session.session.pagehide();
|
|
63
62
|
sendUserEngagement("pagehide");
|
|
64
63
|
}
|
|
65
64
|
function onVisibilityChange() {
|
|
66
|
-
console.log("onVisibilityChange");
|
|
67
65
|
import_session.session.visibilitychange(document.visibilityState);
|
|
68
66
|
if (document.visibilityState === "hidden") {
|
|
69
67
|
sendUserEngagement("visibilitychange");
|
|
@@ -87,25 +85,23 @@ function useWebAnalytics(pathname) {
|
|
|
87
85
|
}, 500);
|
|
88
86
|
const checkpointEvents = ["mousedown", "keydown", "touchstart"];
|
|
89
87
|
const checkpoint = (0, import_utils.throttle)(import_session.session.updateAccumulator, 1e3);
|
|
90
|
-
window.addEventListener("focus", import_session.session.focus
|
|
91
|
-
window.addEventListener("blur", import_session.session.blur
|
|
92
|
-
window.addEventListener("pageshow", import_session.session.pageshow, { passive: true });
|
|
93
|
-
window.addEventListener("pagehide", onPageHide, { passive: true });
|
|
88
|
+
window.addEventListener("focus", import_session.session.focus);
|
|
89
|
+
window.addEventListener("blur", import_session.session.blur);
|
|
94
90
|
window.addEventListener("scroll", onScroll, { passive: true });
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
window.addEventListener("pageshow", import_session.session.pageshow);
|
|
92
|
+
window.addEventListener("pagehide", onPageHide);
|
|
93
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
94
|
+
checkpointEvents.forEach((e) => {
|
|
95
|
+
window.addEventListener(e, checkpoint, { passive: true, capture: true });
|
|
98
96
|
});
|
|
99
97
|
return () => {
|
|
100
98
|
window.removeEventListener("focus", import_session.session.focus);
|
|
101
99
|
window.removeEventListener("blur", import_session.session.blur);
|
|
100
|
+
window.removeEventListener("scroll", onScroll);
|
|
102
101
|
window.removeEventListener("pageshow", import_session.session.pageshow);
|
|
103
102
|
window.removeEventListener("pagehide", onPageHide);
|
|
104
|
-
window.removeEventListener("scroll", onScroll);
|
|
105
103
|
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
106
|
-
checkpointEvents.forEach((
|
|
107
|
-
window.removeEventListener(event, checkpoint);
|
|
108
|
-
});
|
|
104
|
+
checkpointEvents.forEach((e) => window.removeEventListener(e, checkpoint));
|
|
109
105
|
onScroll.cancel();
|
|
110
106
|
checkpoint.cancel();
|
|
111
107
|
};
|
|
@@ -1 +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 track('first_visit', {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement(trigger: 'pagehide' | 'visibilitychange') {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n sendBeacon('user_engagement', { engagement_time_msec, trigger });\n}\n\nfunction sendScroll() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('scroll', { engagement_time_msec });\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
|
|
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 track('first_visit', {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement(trigger: 'pagehide' | 'visibilitychange') {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n sendBeacon('user_engagement', { engagement_time_msec, trigger });\n}\n\nfunction sendScroll() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('scroll', { engagement_time_msec });\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('pagehide');\n}\n\nfunction onVisibilityChange() {\n session.visibilitychange(document.visibilityState);\n if (document.visibilityState === 'hidden') {\n sendUserEngagement('visibilitychange');\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);\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);\n window.addEventListener('blur', session.blur);\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('pageshow', session.pageshow);\n window.addEventListener('pagehide', onPageHide);\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n // save checkpoint\n checkpointEvents.forEach((e) => {\n window.addEventListener(e, checkpoint, { passive: true, capture: true });\n });\n\n return () => {\n window.removeEventListener('focus', session.focus);\n window.removeEventListener('blur', session.blur);\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('pageshow', session.pageshow);\n window.removeEventListener('pagehide', onPageHide);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n checkpointEvents.forEach((e) => window.removeEventListener(e, checkpoint));\n\n onScroll.cancel();\n checkpoint.cancel();\n };\n }, []);\n\n useEffect(() => {\n track('page_view', {\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 }, [pathname]);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -34,12 +34,10 @@ function getScrollPercent() {
|
|
|
34
34
|
return (scrollTop + windowHeight) * 100 / docHeight;
|
|
35
35
|
}
|
|
36
36
|
function onPageHide() {
|
|
37
|
-
console.log("onPageHide");
|
|
38
37
|
session.pagehide();
|
|
39
38
|
sendUserEngagement("pagehide");
|
|
40
39
|
}
|
|
41
40
|
function onVisibilityChange() {
|
|
42
|
-
console.log("onVisibilityChange");
|
|
43
41
|
session.visibilitychange(document.visibilityState);
|
|
44
42
|
if (document.visibilityState === "hidden") {
|
|
45
43
|
sendUserEngagement("visibilitychange");
|
|
@@ -63,25 +61,23 @@ function useWebAnalytics(pathname) {
|
|
|
63
61
|
}, 500);
|
|
64
62
|
const checkpointEvents = ["mousedown", "keydown", "touchstart"];
|
|
65
63
|
const checkpoint = throttle(session.updateAccumulator, 1e3);
|
|
66
|
-
window.addEventListener("focus", session.focus
|
|
67
|
-
window.addEventListener("blur", session.blur
|
|
68
|
-
window.addEventListener("pageshow", session.pageshow, { passive: true });
|
|
69
|
-
window.addEventListener("pagehide", onPageHide, { passive: true });
|
|
64
|
+
window.addEventListener("focus", session.focus);
|
|
65
|
+
window.addEventListener("blur", session.blur);
|
|
70
66
|
window.addEventListener("scroll", onScroll, { passive: true });
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
67
|
+
window.addEventListener("pageshow", session.pageshow);
|
|
68
|
+
window.addEventListener("pagehide", onPageHide);
|
|
69
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
70
|
+
checkpointEvents.forEach((e) => {
|
|
71
|
+
window.addEventListener(e, checkpoint, { passive: true, capture: true });
|
|
74
72
|
});
|
|
75
73
|
return () => {
|
|
76
74
|
window.removeEventListener("focus", session.focus);
|
|
77
75
|
window.removeEventListener("blur", session.blur);
|
|
76
|
+
window.removeEventListener("scroll", onScroll);
|
|
78
77
|
window.removeEventListener("pageshow", session.pageshow);
|
|
79
78
|
window.removeEventListener("pagehide", onPageHide);
|
|
80
|
-
window.removeEventListener("scroll", onScroll);
|
|
81
79
|
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
82
|
-
checkpointEvents.forEach((
|
|
83
|
-
window.removeEventListener(event, checkpoint);
|
|
84
|
-
});
|
|
80
|
+
checkpointEvents.forEach((e) => window.removeEventListener(e, checkpoint));
|
|
85
81
|
onScroll.cancel();
|
|
86
82
|
checkpoint.cancel();
|
|
87
83
|
};
|
|
@@ -1 +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 track('first_visit', {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement(trigger: 'pagehide' | 'visibilitychange') {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n sendBeacon('user_engagement', { engagement_time_msec, trigger });\n}\n\nfunction sendScroll() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('scroll', { engagement_time_msec });\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
|
|
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 track('first_visit', {\n page_path: pathname,\n page_title: document.title,\n page_referrer: document.referrer,\n page_location: window.location.href,\n });\n config.storage.setItem(key, new Date().toISOString());\n}\n\nfunction sendUserEngagement(trigger: 'pagehide' | 'visibilitychange') {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n sendBeacon('user_engagement', { engagement_time_msec, trigger });\n}\n\nfunction sendScroll() {\n const engagement_time_msec = session.flush();\n if (engagement_time_msec <= 0) return;\n track('scroll', { engagement_time_msec });\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('pagehide');\n}\n\nfunction onVisibilityChange() {\n session.visibilitychange(document.visibilityState);\n if (document.visibilityState === 'hidden') {\n sendUserEngagement('visibilitychange');\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);\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);\n window.addEventListener('blur', session.blur);\n window.addEventListener('scroll', onScroll, { passive: true });\n window.addEventListener('pageshow', session.pageshow);\n window.addEventListener('pagehide', onPageHide);\n document.addEventListener('visibilitychange', onVisibilityChange);\n\n // save checkpoint\n checkpointEvents.forEach((e) => {\n window.addEventListener(e, checkpoint, { passive: true, capture: true });\n });\n\n return () => {\n window.removeEventListener('focus', session.focus);\n window.removeEventListener('blur', session.blur);\n window.removeEventListener('scroll', onScroll);\n window.removeEventListener('pageshow', session.pageshow);\n window.removeEventListener('pagehide', onPageHide);\n document.removeEventListener('visibilitychange', onVisibilityChange);\n checkpointEvents.forEach((e) => window.removeEventListener(e, checkpoint));\n\n onScroll.cancel();\n checkpoint.cancel();\n };\n }, []);\n\n useEffect(() => {\n track('page_view', {\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 }, [pathname]);\n}\n"],"mappings":"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","names":[]}
|