stone-analytics 0.0.13 → 0.0.15

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 CHANGED
@@ -1,41 +1,63 @@
1
- # Пакет с функцией отправки аналитики stone
2
-
3
- Npm-пакет для отправки аналитики по api/send-event
4
-
5
- ## Установка
6
-
7
- ```sh
8
- npm i stone-analytics@latest
9
- ```
10
-
11
- ### Пример использования
12
-
13
- ```sh
14
- import { useEffect } from 'react'
15
- import { sendAnalytics } from 'stone-analytics'
16
-
17
- export const AllProviders = () => {
18
- useEffect(() => {
19
- sendAnalytics({
20
- event: 'page_view',
21
- name: 'Переход на страницу',
22
- })
23
- }, [])
24
- }
25
- ```
26
-
27
- #### Параметры
28
-
29
- | Поле | Тип | Описание |
30
- | -------- | ------------------------ | ----------------------------------------------------- |
31
- | `event` | `string` | Название события (например, `"click"`, `"page_view"`) |
32
- | `name` | `string` | Уникальное имя события |
33
- | `params` | `TAnalyticsVisitParams?` | Дополнительные параметры события (необязательно) |
34
-
35
- ##### Локальная разработка
36
-
37
- Для того , чтобы локально ничего не отправлялось добавить в env.local
38
-
39
- ```sh
40
- process.env.NEXT_PUBLIC_IS_TEST === 'true'
41
- ```
1
+ # Пакет с функцией отправки аналитики stone
2
+
3
+ Npm-пакет для отправки аналитики по api/send-event
4
+
5
+ ## Установка
6
+
7
+ ```sh
8
+ npm i stone-analytics@latest
9
+ ```
10
+
11
+ ### Метод отправки аналитики
12
+
13
+ Метод для отправки аналитики sendAnalytics
14
+
15
+ ```sh
16
+ import { useEffect } from 'react'
17
+ import { sendAnalytics } from 'stone-analytics'
18
+
19
+ export const AllProviders = () => {
20
+ useEffect(() => {
21
+ sendAnalytics({
22
+ event: 'page_view',
23
+ name: 'Переход на страницу',
24
+ })
25
+ }, [])
26
+ }
27
+ ```
28
+
29
+ #### Параметры
30
+
31
+ | Поле | Тип | Описание |
32
+ | -------- | ------------------------ | ----------------------------------------------------- |
33
+ | `event` | `string` | Название события (например, `"click"`, `"page_view"`) |
34
+ | `name` | `string` | Уникальное имя события |
35
+ | `params` | `TAnalyticsVisitParams?` | Дополнительные параметры события (необязательно) |
36
+
37
+ ### Инициализация сессии
38
+
39
+ Хук для инициализации id сессии и id клиента
40
+
41
+ ```sh
42
+ import { useInitializeMetrics } from 'stone-analytics'
43
+
44
+ export const AppProvider = ({ children }: { children: React.ReactNode }) => {
45
+ useInitializeMetrics()
46
+
47
+ return <>{children}</>
48
+ }
49
+ ```
50
+
51
+ | Поле | Описание |
52
+ | ---------- | --------- |
53
+ | session_id | На сессию |
54
+ | client_id | На год |
55
+
56
+ ### Локальная разработка
57
+
58
+ Для того , чтобы локально ничего не отправлялось добавить в env.local
59
+
60
+ ```sh
61
+ process.env.NEXT_PUBLIC_IS_TEST === 'true'
62
+ ```
63
+
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var p=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var E=(e,t)=>{for(var s in t)p(e,s,{get:t[s],enumerable:!0})},P=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of S(t))!C.call(e,o)&&o!==s&&p(e,o,{get:()=>t[o],enumerable:!(n=h(t,o))||n.enumerable});return e};var A=e=>P(p({},"__esModule",{value:!0}),e);var x={};E(x,{sendAnalytics:()=>a,setClientId:()=>f,setSessionId:()=>d,useInitializeMetrics:()=>L});module.exports=A(x);var _=require("cookies-next");var m=()=>String(Date.now())+String(Math.floor(Math.random()*9e8)+1e8);var d=()=>{let e=m();(0,_.setCookie)("st_session_id",e)},f=()=>{let e=m();(0,_.setCookie)("st_client_id",e,{maxAge:31536e3})};var l=require("cookies-next");var u=e=>{var t,s;if(typeof window<"u"){let n=process.env.NEXT_PUBLIC_IS_TEST==="true",o=window.location.pathname,i=window.location.href,r={event:e.event,st_event_id:(t=e.params)==null?void 0:t.st_event_id,abTestGroup:(s=e.params)==null?void 0:s.abTestGroup,page_path:o,page_url:i};e.params.st_session_id&&(r.st_session_id=e.params.st_session_id),e.params.st_client_id&&(r.st_client_id=e.params.st_client_id),e.params.project&&(r.project=e.params.project),e.params.lot_id&&(r.lot_id=e.params.lot_id),n||(window.dataLayer=window.dataLayer||[],window.dataLayer.push(r),console.log("dataLayerPush:",r))}};var T=e=>{if(typeof ym<"u"&&typeof window<"u"){let t=process.env.NEXT_PUBLIC_IS_TEST==="true";(typeof process.env.NEXT_PUBLIC_YM_COUNTER>"u"||!process.env.NEXT_PUBLIC_YM_COUNTER)&&console.log("Yandex counter \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u0432 \u043A\u043E\u043D\u0444\u0438\u0433\u0435 .env.local"),t||(ym(process.env.NEXT_PUBLIC_YM_COUNTER,"reachGoal",e.target,e.params),console.log("Yandex Metrika "+process.env.NEXT_PUBLIC_YM_COUNTER+" reachGoal: "+e.target,e.params))}else console.log("Yandex Metrika \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430")};var y=async e=>{if(typeof window<"u"){let t=process.env.NEXT_PUBLIC_IS_TEST==="true",s="https://stone.ru/api/analytics/send-event",n=window.location.pathname,o=window.location.href,i={event:e.event,name:e.name,payload:{...e.params,page_path:n,page_url:o}};try{t&&(await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}),console.log("sendAnalyticsToAPI:",i))}catch{console.log("can't sendAnalyticsToAPI")}}else return};var a=e=>{let t=process.env.NEXT_PUBLIC_IS_TEST==="true";e.params=e.params||{},e.params.st_event_id=m();let s=String((0,l.getCookie)("_ym_uid"));s&&s!=""&&(e.params.ym_client_id=s);let n=String((0,l.getCookie)("_ga"));n&&n!=""&&(e.params.ga_client_id=n);let o=String((0,l.getCookie)("st_client_id"));o&&o!=""&&(e.params.st_client_id=o);let i=String((0,l.getCookie)("st_session_id"));i&&i!=""&&(e.params.st_session_id=i),t||(u({event:e.event,params:e.params}),T({target:e.event,params:e.params}),y({event:e.event,name:e.name,params:e.params}))};var c=require("cookies-next");var g=require("react"),L=()=>{let e=!!(0,c.getCookie)("st_client_id"),t=!!(0,c.getCookie)("st_session_id");return e||f(),t||(d(),a({event:"session_start",name:"\u041D\u0430\u0447\u0430\u043B\u043E \u0441\u0435\u0441\u0441\u0438\u0438"})),(0,g.useEffect)(()=>{let s=localStorage.getItem("tabCount"),n=s?parseInt(s):0;n<0&&(localStorage.setItem("tabCount",String(0)),n=0),n++,n&&localStorage.setItem("tabCount",String(n));let o=()=>{let i=localStorage.getItem("tabCount");if(i&&typeof window<"u"){let r=String(Number(i)-1),v=window.scrollY,w=document.documentElement.scrollHeight-document.documentElement.clientHeight,I=v/w*100;a({event:"scroll",name:"\u041F\u0435\u0440\u0435\u0445\u043E\u0434 \u0438\u043B\u0438 \u0443\u0445\u043E\u0434 \u0441\u043E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B",params:{scroll_percent:I.toFixed(0)+"%"}}),r==="0"&&(a({event:"session_end",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"}),(0,c.setCookie)("st_session_id",null)),localStorage.setItem("tabCount",r)}};return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[]),(0,g.useEffect)(()=>{let s,n=()=>{clearTimeout(s),s=setTimeout(()=>{(0,c.setCookie)("st_session_id",null),a({event:"timeout_30min",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"})},18e5)},o=["mousemove","click","touchstart","scroll","keydown"];return o.forEach(i=>{window.addEventListener(i,n)}),n(),()=>{o.forEach(i=>{window.removeEventListener(i,n)}),clearTimeout(s)}},[]),{}};0&&(module.exports={sendAnalytics,setClientId,setSessionId,useInitializeMetrics});
1
+ var p=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var E=(e,t)=>{for(var s in t)p(e,s,{get:t[s],enumerable:!0})},P=(e,t,s,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of S(t))!C.call(e,o)&&o!==s&&p(e,o,{get:()=>t[o],enumerable:!(n=h(t,o))||n.enumerable});return e};var A=e=>P(p({},"__esModule",{value:!0}),e);var x={};E(x,{sendAnalytics:()=>a,setClientId:()=>f,setSessionId:()=>d,useInitializeMetrics:()=>L});module.exports=A(x);var _=require("cookies-next");var m=()=>String(Date.now())+String(Math.floor(Math.random()*9e8)+1e8);var d=()=>{let e=m();(0,_.setCookie)("st_session_id",e)},f=()=>{let e=m();(0,_.setCookie)("st_client_id",e,{maxAge:31536e3})};var l=require("cookies-next");var u=e=>{var t,s;if(typeof window<"u"){let n=process.env.NEXT_PUBLIC_IS_TEST==="true",o=window.location.pathname,i=window.location.href,r={event:e.event,st_event_id:(t=e.params)==null?void 0:t.st_event_id,abTestGroup:(s=e.params)==null?void 0:s.abTestGroup,page_path:o,page_url:i};e.params.st_session_id&&(r.st_session_id=e.params.st_session_id),e.params.st_client_id&&(r.st_client_id=e.params.st_client_id),e.params.project&&(r.project=e.params.project),e.params.lot_id&&(r.lot_id=e.params.lot_id),n||(window.dataLayer=window.dataLayer||[],window.dataLayer.push(r),console.log("dataLayerPush:",r))}};var T=e=>{if(typeof ym<"u"&&typeof window<"u"){let t=process.env.NEXT_PUBLIC_IS_TEST==="true";(typeof process.env.NEXT_PUBLIC_YM_COUNTER>"u"||!process.env.NEXT_PUBLIC_YM_COUNTER)&&console.log("Yandex counter \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u0432 \u043A\u043E\u043D\u0444\u0438\u0433\u0435 .env.local"),t||(ym(process.env.NEXT_PUBLIC_YM_COUNTER,"reachGoal",e.target,e.params),console.log("Yandex Metrika "+process.env.NEXT_PUBLIC_YM_COUNTER+" reachGoal: "+e.target,e.params))}else console.log("Yandex Metrika \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430")};var y=async e=>{if(typeof window<"u"){let t=process.env.NEXT_PUBLIC_IS_TEST==="true",s="https://stone.ru/api/analytics/send-event",n=window.location.pathname,o=window.location.href,i={event:e.event,name:e.name,payload:{...e.params,page_path:n,page_url:o}};try{t||(await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)}),console.log("sendAnalyticsToAPI:",i))}catch{console.log("can't sendAnalyticsToAPI")}}else return};var a=e=>{let t=process.env.NEXT_PUBLIC_IS_TEST==="true";e.params=e.params||{},e.params.st_event_id=m();let s=String((0,l.getCookie)("_ym_uid"));s&&s!=""&&(e.params.ym_client_id=s);let n=String((0,l.getCookie)("_ga"));n&&n!=""&&(e.params.ga_client_id=n);let o=String((0,l.getCookie)("st_client_id"));o&&o!=""&&(e.params.st_client_id=o);let i=String((0,l.getCookie)("st_session_id"));i&&i!=""&&(e.params.st_session_id=i),t||(u({event:e.event,params:e.params}),T({target:e.event,params:e.params}),y({event:e.event,name:e.name,params:e.params}))};var c=require("cookies-next");var g=require("react"),L=()=>{let e=!!(0,c.getCookie)("st_client_id"),t=!!(0,c.getCookie)("st_session_id");return e||f(),t||(d(),a({event:"session_start",name:"\u041D\u0430\u0447\u0430\u043B\u043E \u0441\u0435\u0441\u0441\u0438\u0438"})),(0,g.useEffect)(()=>{let s=localStorage.getItem("tabCount"),n=s?parseInt(s):0;n<0&&(localStorage.setItem("tabCount",String(0)),n=0),n++,n&&localStorage.setItem("tabCount",String(n));let o=()=>{let i=localStorage.getItem("tabCount");if(i&&typeof window<"u"){let r=String(Number(i)-1),v=window.scrollY,w=document.documentElement.scrollHeight-document.documentElement.clientHeight,I=v/w*100;a({event:"scroll",name:"\u041F\u0435\u0440\u0435\u0445\u043E\u0434 \u0438\u043B\u0438 \u0443\u0445\u043E\u0434 \u0441\u043E \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u044B",params:{scroll_percent:I.toFixed(0)+"%"}}),r==="0"&&(a({event:"session_end",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"}),(0,c.setCookie)("st_session_id",null)),localStorage.setItem("tabCount",r)}};return window.addEventListener("beforeunload",o),()=>{window.removeEventListener("beforeunload",o)}},[]),(0,g.useEffect)(()=>{let s,n=()=>{clearTimeout(s),s=setTimeout(()=>{(0,c.setCookie)("st_session_id",null),a({event:"timeout_30min",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"})},18e5)},o=["mousemove","click","touchstart","scroll","keydown"];return o.forEach(i=>{window.addEventListener(i,n)}),n(),()=>{o.forEach(i=>{window.removeEventListener(i,n)}),clearTimeout(s)}},[]),{}};0&&(module.exports={sendAnalytics,setClientId,setSessionId,useInitializeMetrics});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/setId.ts","../src/utils/makeUID.ts","../src/sendAnalytics/sendAnalytics.ts","../src/dataLayerPush/dataLayerPush.ts","../src/ymTarget/ymaTarget.ts","../src/sendAnalyticsToAPI/sendAnalyticsToAPI.ts","../src/hooks/useInitializeMetrics.ts"],"sourcesContent":["export * from './utils/setId'\nexport * from './sendAnalytics/sendAnalytics'\nexport * from './hooks/useInitializeMetrics'","import { setCookie } from 'cookies-next'\nimport { makeTimeBasedUID } from './makeUID'\n\nexport const setSessionId = (): void => {\n\tconst newId = makeTimeBasedUID()\n\tsetCookie('st_session_id', newId)\n}\n\nexport const setClientId = (): void => {\n\tconst newId = makeTimeBasedUID()\n\t//на год\n\tsetCookie('st_client_id', newId, { maxAge: 31536000 })\n}\n\n","export const makeTimeBasedUID = (): string => {\n\treturn (\n\t\tString(Date.now()) + String(Math.floor(Math.random() * (999999999 - 100000000 + 1)) + 100000000)\n\t)\n}","import { getCookie } from 'cookies-next'\nimport { TAnalyticsData } from '../types/analytics'\nimport { dataLayerPush } from '../dataLayerPush/dataLayerPush'\nimport { ymTarget } from '../ymTarget/ymaTarget'\nimport { sendAnalyticsToAPI } from '../sendAnalyticsToAPI/sendAnalyticsToAPI'\nimport { makeTimeBasedUID } from '../utils/makeUID'\n\nexport const sendAnalytics = (data: TAnalyticsData) => {\n\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\n\tdata.params = data.params || {}\n\t//event_id - Уникальный ID события\n\tdata.params.st_event_id = makeTimeBasedUID()\n\n\tconst _ym_uid = String(getCookie('_ym_uid'))\n\tif (_ym_uid && _ym_uid != '') {\n\t\tdata.params.ym_client_id = _ym_uid\n\t}\n\tconst _ga = String(getCookie('_ga'))\n\tif (_ga && _ga != '') {\n\t\tdata.params.ga_client_id = _ga\n\t}\n\tconst st_client_id = String(getCookie('st_client_id'))\n\tif (st_client_id && st_client_id != '') {\n\t\tdata.params.st_client_id = st_client_id\n\t}\n\tconst st_session_id = String(getCookie('st_session_id'))\n\tif (st_session_id && st_session_id != '') {\n\t\tdata.params.st_session_id = st_session_id\n\t}\n\n\tif (!isTest) {\n\t\tdataLayerPush({ event: data.event, params: data.params })\n\t\tymTarget({ target: data.event, params: data.params })\n\t\tsendAnalyticsToAPI({ event: data.event, name: data.name, params: data.params })\n\t}\n}\n\n","import { TAnalyticsVisitParams } from '../types/analytics'\n\nexport type TGADataLayer = {\n\tevent: string\n\tparams: TAnalyticsVisitParams\n}\n\nexport type DataLayerPush = {\n\tevent: string\n\tpage_path: string\n\tpage_url: string\n\tst_event_id?: string\n\tst_client_id?: string\n\tst_session_id?: string\n\tabTestGroup?: string\n\tproject?: string\n\tlot_id?: string | number\n}\n\ndeclare global {\n\tinterface Window {\n\t\tdataLayer: DataLayerPush[]\n\t}\n}\n\nexport const dataLayerPush = (data: TGADataLayer) => {\n\tif (typeof window !== 'undefined') {\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\t\tconst pathname = window.location.pathname\n\t\tconst href = window.location.href\n\t\tconst layerEvent: DataLayerPush = {\n\t\t\tevent: data.event,\n\t\t\tst_event_id: data.params?.st_event_id,\n\t\t\tabTestGroup: data.params?.abTestGroup,\n\t\t\tpage_path: pathname,\n\t\t\tpage_url: href,\n\t\t}\n\t\tif (data.params.st_session_id) {\n\t\t\tlayerEvent.st_session_id = data.params.st_session_id\n\t\t}\n\t\tif (data.params.st_client_id) {\n\t\t\tlayerEvent.st_client_id = data.params.st_client_id\n\t\t}\n\t\tif (data.params.project) {\n\t\t\tlayerEvent.project = data.params.project\n\t\t}\n\t\tif (data.params.lot_id) {\n\t\t\tlayerEvent.lot_id = data.params.lot_id\n\t\t}\n\n\t\tif (!isTest) {\n\t\t\twindow.dataLayer = window.dataLayer || []\n\t\t\twindow.dataLayer.push(layerEvent)\n\n\t\t\tconsole.log('dataLayerPush:', layerEvent)\n\t\t}\n\t}\n}\n\n","import { TAnalyticsVisitParams } from '../types/analytics'\n\nexport type TYMTarget = {\n\ttarget: string\n\tparams: TAnalyticsVisitParams\n}\n\ndeclare let ym: any\n/**\n * Отправка события в Яндек метрику\n * @param data\n */\nexport const ymTarget = (data: TYMTarget) => {\n\tif (typeof ym !== 'undefined' && typeof window !== 'undefined') {\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\t\tif (\n\t\t\ttypeof process.env.NEXT_PUBLIC_YM_COUNTER == 'undefined' ||\n\t\t\t!process.env.NEXT_PUBLIC_YM_COUNTER\n\t\t) {\n\t\t\tconsole.log('Yandex counter не определен в конфиге .env.local')\n\t\t}\n\t\tif (!isTest) {\n\t\t\tym(process.env.NEXT_PUBLIC_YM_COUNTER, 'reachGoal', data.target, data.params)\n\n\t\t\tconsole.log(\n\t\t\t\t'Yandex Metrika ' + process.env.NEXT_PUBLIC_YM_COUNTER + ' reachGoal: ' + data.target,\n\t\t\t\tdata.params\n\t\t\t)\n\t\t}\n\t} else {\n\t\tconsole.log('Yandex Metrika не найдена')\n\t}\n}\n\n","import { TAnalyticsVisitParams } from '../types/analytics'\n\nexport type TAnalyticsApiData = {\n\tevent: string\n\tname: string\n\tmouse_X?: string\n\tmouse_Y?: string\n\tparams: TAnalyticsVisitParams\n}\n\nexport const sendAnalyticsToAPI = async (data: TAnalyticsApiData) => {\n\tif (typeof window !== 'undefined') {\n\t\tconst isNeedSend = process.env.NEXT_PUBLIC_IS_TEST === 'true'\n\t\tconst url = `https://stone.ru/api/analytics/send-event`\n\t\tconst pathname = window.location.pathname\n\t\tconst href = window.location.href\n\n\t\tconst formData = {\n\t\t\tevent: data.event,\n\t\t\tname: data.name,\n\t\t\tpayload: { ...data.params, ...{ page_path: pathname, page_url: href } },\n\t\t}\n\t\ttry {\n\t\t\tif (isNeedSend) {\n\t\t\t\tawait fetch(url, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t},\n\t\t\t\t\tbody: JSON.stringify(formData),\n\t\t\t\t})\n\t\t\t\tconsole.log('sendAnalyticsToAPI:', formData)\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(\"can't sendAnalyticsToAPI\")\n\t\t}\n\t} else return\n}\n\n","import { getCookie, setCookie } from 'cookies-next'\r\nimport { setClientId, setSessionId } from '../utils/setId'\r\nimport { sendAnalytics } from '../sendAnalytics/sendAnalytics'\r\nimport { useEffect } from 'react'\r\n\r\nexport const useInitializeMetrics = () => {\r\n\tconst isClientId = Boolean(getCookie('st_client_id'))\r\n\tconst isSessionId = Boolean(getCookie('st_session_id'))\r\n\r\n\tif (!isClientId) setClientId()\r\n\tif (!isSessionId) {\r\n\t\tsetSessionId()\r\n\t\tsendAnalytics({\r\n\t\t\tevent: 'session_start',\r\n\t\t\tname: 'Начало сессии',\r\n\t\t})\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tconst tabCountStorage = localStorage.getItem('tabCount')\r\n\r\n\t\t// При открытии вкладки\r\n\t\tlet tabCount = tabCountStorage ? parseInt(tabCountStorage) : 0\r\n\t\tif (tabCount < 0) {\r\n\t\t\tlocalStorage.setItem('tabCount', String(0))\r\n\t\t\ttabCount = 0\r\n\t\t}\r\n\r\n\t\ttabCount++\r\n\t\tif (tabCount) localStorage.setItem('tabCount', String(tabCount))\r\n\r\n\t\t// Обработчик для закрытия вкладки\r\n\t\tconst handleBeforeUnload = () => {\r\n\t\t\tconst tabCountStorage = localStorage.getItem('tabCount')\r\n\t\t\tif (tabCountStorage && typeof window !== 'undefined') {\r\n\t\t\t\tconst tabCount = String(Number(tabCountStorage) - 1)\r\n\t\t\t\tconst scrollTop = window.scrollY\r\n\t\t\t\tconst scrollHeight =\r\n\t\t\t\t\tdocument.documentElement.scrollHeight - document.documentElement.clientHeight\r\n\t\t\t\tconst scrollPercent = (scrollTop / scrollHeight) * 100\r\n\r\n\t\t\t\tsendAnalytics({\r\n\t\t\t\t\tevent: 'scroll',\r\n\t\t\t\t\tname: 'Переход или уход со страницы',\r\n\t\t\t\t\tparams: { scroll_percent: scrollPercent.toFixed(0) + '%' },\r\n\t\t\t\t})\r\n\r\n\t\t\t\tif (tabCount === '0') {\r\n\t\t\t\t\tsendAnalytics({\r\n\t\t\t\t\t\tevent: 'session_end',\r\n\t\t\t\t\t\tname: 'Конец сессии',\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tsetCookie('st_session_id', null)\r\n\t\t\t\t}\r\n\t\t\t\tlocalStorage.setItem('tabCount', tabCount)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\twindow.addEventListener('beforeunload', handleBeforeUnload)\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener('beforeunload', handleBeforeUnload)\r\n\t\t}\r\n\t}, [])\r\n\r\n\tuseEffect(() => {\r\n\t\tlet inactivityTimer: NodeJS.Timeout\r\n\r\n\t\tconst resetInactivityTimer = () => {\r\n\t\t\tclearTimeout(inactivityTimer)\r\n\t\t\t// 30 минут\r\n\t\t\tinactivityTimer = setTimeout(() => {\r\n\t\t\t\tsetCookie('st_session_id', null)\r\n\t\t\t\tsendAnalytics({\r\n\t\t\t\t\tevent: 'timeout_30min',\r\n\t\t\t\t\tname: 'Конец сессии',\r\n\t\t\t\t})\r\n\t\t\t}, 30 * 60 * 1000)\r\n\t\t}\r\n\r\n\t\tconst events = ['mousemove', 'click', 'touchstart', 'scroll', 'keydown']\r\n\t\tevents.forEach((event) => {\r\n\t\t\twindow.addEventListener(event, resetInactivityTimer)\r\n\t\t})\r\n\r\n\t\t// Запускаем таймер при монтировании компонента\r\n\t\tresetInactivityTimer()\r\n\t\treturn () => {\r\n\t\t\tevents.forEach((event) => {\r\n\t\t\t\twindow.removeEventListener(event, resetInactivityTimer)\r\n\t\t\t})\r\n\t\t\tclearTimeout(inactivityTimer)\r\n\t\t}\r\n\t}, [])\r\n\r\n\treturn {}\r\n}\r\n"],"mappings":"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","names":["src_exports","__export","sendAnalytics","setClientId","setSessionId","useInitializeMetrics","__toCommonJS","import_cookies_next","makeTimeBasedUID","setSessionId","newId","makeTimeBasedUID","setClientId","import_cookies_next","dataLayerPush","data","_a","_b","isTest","pathname","href","layerEvent","ymTarget","data","isTest","sendAnalyticsToAPI","data","isNeedSend","url","pathname","href","formData","sendAnalytics","data","isTest","makeTimeBasedUID","_ym_uid","_ga","st_client_id","st_session_id","dataLayerPush","ymTarget","sendAnalyticsToAPI","import_cookies_next","import_react","useInitializeMetrics","isClientId","isSessionId","setClientId","setSessionId","sendAnalytics","tabCountStorage","tabCount","handleBeforeUnload","scrollTop","scrollHeight","scrollPercent","inactivityTimer","resetInactivityTimer","events","event"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/setId.ts","../src/utils/makeUID.ts","../src/sendAnalytics/sendAnalytics.ts","../src/dataLayerPush/dataLayerPush.ts","../src/ymTarget/ymaTarget.ts","../src/sendAnalyticsToAPI/sendAnalyticsToAPI.ts","../src/hooks/useInitializeMetrics.ts"],"sourcesContent":["export * from './utils/setId'\r\nexport * from './sendAnalytics/sendAnalytics'\r\nexport * from './hooks/useInitializeMetrics'","import { setCookie } from 'cookies-next'\r\nimport { makeTimeBasedUID } from './makeUID'\r\n\r\nexport const setSessionId = (): void => {\r\n\tconst newId = makeTimeBasedUID()\r\n\tsetCookie('st_session_id', newId)\r\n}\r\n\r\nexport const setClientId = (): void => {\r\n\tconst newId = makeTimeBasedUID()\r\n\t//на год\r\n\tsetCookie('st_client_id', newId, { maxAge: 31536000 })\r\n}\r\n\r\n","export const makeTimeBasedUID = (): string => {\r\n\treturn (\r\n\t\tString(Date.now()) + String(Math.floor(Math.random() * (999999999 - 100000000 + 1)) + 100000000)\r\n\t)\r\n}","import { getCookie } from 'cookies-next'\r\nimport { TAnalyticsData } from '../types/analytics'\r\nimport { dataLayerPush } from '../dataLayerPush/dataLayerPush'\r\nimport { ymTarget } from '../ymTarget/ymaTarget'\r\nimport { sendAnalyticsToAPI } from '../sendAnalyticsToAPI/sendAnalyticsToAPI'\r\nimport { makeTimeBasedUID } from '../utils/makeUID'\r\n\r\nexport const sendAnalytics = (data: TAnalyticsData) => {\r\n\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\r\n\tdata.params = data.params || {}\r\n\t//event_id - Уникальный ID события\r\n\tdata.params.st_event_id = makeTimeBasedUID()\r\n\r\n\tconst _ym_uid = String(getCookie('_ym_uid'))\r\n\tif (_ym_uid && _ym_uid != '') {\r\n\t\tdata.params.ym_client_id = _ym_uid\r\n\t}\r\n\tconst _ga = String(getCookie('_ga'))\r\n\tif (_ga && _ga != '') {\r\n\t\tdata.params.ga_client_id = _ga\r\n\t}\r\n\tconst st_client_id = String(getCookie('st_client_id'))\r\n\tif (st_client_id && st_client_id != '') {\r\n\t\tdata.params.st_client_id = st_client_id\r\n\t}\r\n\tconst st_session_id = String(getCookie('st_session_id'))\r\n\tif (st_session_id && st_session_id != '') {\r\n\t\tdata.params.st_session_id = st_session_id\r\n\t}\r\n\r\n\tif (!isTest) {\r\n\t\tdataLayerPush({ event: data.event, params: data.params })\r\n\t\tymTarget({ target: data.event, params: data.params })\r\n\t\tsendAnalyticsToAPI({ event: data.event, name: data.name, params: data.params })\r\n\t}\r\n}\r\n\r\n","import { TAnalyticsVisitParams } from '../types/analytics'\r\n\r\nexport type TGADataLayer = {\r\n\tevent: string\r\n\tparams: TAnalyticsVisitParams\r\n}\r\n\r\nexport type DataLayerPush = {\r\n\tevent: string\r\n\tpage_path: string\r\n\tpage_url: string\r\n\tst_event_id?: string\r\n\tst_client_id?: string\r\n\tst_session_id?: string\r\n\tabTestGroup?: string\r\n\tproject?: string\r\n\tlot_id?: string | number\r\n}\r\n\r\ndeclare global {\r\n\tinterface Window {\r\n\t\tdataLayer: DataLayerPush[]\r\n\t}\r\n}\r\n\r\nexport const dataLayerPush = (data: TGADataLayer) => {\r\n\tif (typeof window !== 'undefined') {\r\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\t\tconst pathname = window.location.pathname\r\n\t\tconst href = window.location.href\r\n\t\tconst layerEvent: DataLayerPush = {\r\n\t\t\tevent: data.event,\r\n\t\t\tst_event_id: data.params?.st_event_id,\r\n\t\t\tabTestGroup: data.params?.abTestGroup,\r\n\t\t\tpage_path: pathname,\r\n\t\t\tpage_url: href,\r\n\t\t}\r\n\t\tif (data.params.st_session_id) {\r\n\t\t\tlayerEvent.st_session_id = data.params.st_session_id\r\n\t\t}\r\n\t\tif (data.params.st_client_id) {\r\n\t\t\tlayerEvent.st_client_id = data.params.st_client_id\r\n\t\t}\r\n\t\tif (data.params.project) {\r\n\t\t\tlayerEvent.project = data.params.project\r\n\t\t}\r\n\t\tif (data.params.lot_id) {\r\n\t\t\tlayerEvent.lot_id = data.params.lot_id\r\n\t\t}\r\n\r\n\t\tif (!isTest) {\r\n\t\t\twindow.dataLayer = window.dataLayer || []\r\n\t\t\twindow.dataLayer.push(layerEvent)\r\n\r\n\t\t\tconsole.log('dataLayerPush:', layerEvent)\r\n\t\t}\r\n\t}\r\n}\r\n\r\n","import { TAnalyticsVisitParams } from '../types/analytics'\r\n\r\nexport type TYMTarget = {\r\n\ttarget: string\r\n\tparams: TAnalyticsVisitParams\r\n}\r\n\r\ndeclare let ym: any\r\n/**\r\n * Отправка события в Яндек метрику\r\n * @param data\r\n */\r\nexport const ymTarget = (data: TYMTarget) => {\r\n\tif (typeof ym !== 'undefined' && typeof window !== 'undefined') {\r\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\t\tif (\r\n\t\t\ttypeof process.env.NEXT_PUBLIC_YM_COUNTER == 'undefined' ||\r\n\t\t\t!process.env.NEXT_PUBLIC_YM_COUNTER\r\n\t\t) {\r\n\t\t\tconsole.log('Yandex counter не определен в конфиге .env.local')\r\n\t\t}\r\n\t\tif (!isTest) {\r\n\t\t\tym(process.env.NEXT_PUBLIC_YM_COUNTER, 'reachGoal', data.target, data.params)\r\n\r\n\t\t\tconsole.log(\r\n\t\t\t\t'Yandex Metrika ' + process.env.NEXT_PUBLIC_YM_COUNTER + ' reachGoal: ' + data.target,\r\n\t\t\t\tdata.params\r\n\t\t\t)\r\n\t\t}\r\n\t} else {\r\n\t\tconsole.log('Yandex Metrika не найдена')\r\n\t}\r\n}\r\n\r\n","import { TAnalyticsVisitParams } from '../types/analytics'\r\n\r\nexport type TAnalyticsApiData = {\r\n\tevent: string\r\n\tname: string\r\n\tmouse_X?: string\r\n\tmouse_Y?: string\r\n\tparams: TAnalyticsVisitParams\r\n}\r\n\r\nexport const sendAnalyticsToAPI = async (data: TAnalyticsApiData) => {\r\n\tif (typeof window !== 'undefined') {\r\n\t\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\t\tconst url = `https://stone.ru/api/analytics/send-event`\r\n\t\tconst pathname = window.location.pathname\r\n\t\tconst href = window.location.href\r\n\r\n\t\tconst formData = {\r\n\t\t\tevent: data.event,\r\n\t\t\tname: data.name,\r\n\t\t\tpayload: { ...data.params, ...{ page_path: pathname, page_url: href } },\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tif (!isTest) {\r\n\t\t\t\tawait fetch(url, {\r\n\t\t\t\t\tmethod: 'POST',\r\n\t\t\t\t\theaders: {\r\n\t\t\t\t\t\t'Content-Type': 'application/json',\r\n\t\t\t\t\t},\r\n\t\t\t\t\tbody: JSON.stringify(formData),\r\n\t\t\t\t})\r\n\t\t\t\tconsole.log('sendAnalyticsToAPI:', formData)\r\n\t\t\t}\r\n\t\t} catch (e) {\r\n\t\t\tconsole.log(\"can't sendAnalyticsToAPI\")\r\n\t\t}\r\n\t} else return\r\n}\r\n\r\n","import { getCookie, setCookie } from 'cookies-next'\r\nimport { setClientId, setSessionId } from '../utils/setId'\r\nimport { sendAnalytics } from '../sendAnalytics/sendAnalytics'\r\nimport { useEffect } from 'react'\r\n\r\nexport const useInitializeMetrics = () => {\r\n\tconst isClientId = Boolean(getCookie('st_client_id'))\r\n\tconst isSessionId = Boolean(getCookie('st_session_id'))\r\n\r\n\tif (!isClientId) setClientId()\r\n\tif (!isSessionId) {\r\n\t\tsetSessionId()\r\n\t\tsendAnalytics({\r\n\t\t\tevent: 'session_start',\r\n\t\t\tname: 'Начало сессии',\r\n\t\t})\r\n\t}\r\n\r\n\tuseEffect(() => {\r\n\t\tconst tabCountStorage = localStorage.getItem('tabCount')\r\n\r\n\t\t// При открытии вкладки\r\n\t\tlet tabCount = tabCountStorage ? parseInt(tabCountStorage) : 0\r\n\t\tif (tabCount < 0) {\r\n\t\t\tlocalStorage.setItem('tabCount', String(0))\r\n\t\t\ttabCount = 0\r\n\t\t}\r\n\r\n\t\ttabCount++\r\n\t\tif (tabCount) localStorage.setItem('tabCount', String(tabCount))\r\n\r\n\t\t// Обработчик для закрытия вкладки\r\n\t\tconst handleBeforeUnload = () => {\r\n\t\t\tconst tabCountStorage = localStorage.getItem('tabCount')\r\n\t\t\tif (tabCountStorage && typeof window !== 'undefined') {\r\n\t\t\t\tconst tabCount = String(Number(tabCountStorage) - 1)\r\n\t\t\t\tconst scrollTop = window.scrollY\r\n\t\t\t\tconst scrollHeight =\r\n\t\t\t\t\tdocument.documentElement.scrollHeight - document.documentElement.clientHeight\r\n\t\t\t\tconst scrollPercent = (scrollTop / scrollHeight) * 100\r\n\r\n\t\t\t\tsendAnalytics({\r\n\t\t\t\t\tevent: 'scroll',\r\n\t\t\t\t\tname: 'Переход или уход со страницы',\r\n\t\t\t\t\tparams: { scroll_percent: scrollPercent.toFixed(0) + '%' },\r\n\t\t\t\t})\r\n\r\n\t\t\t\tif (tabCount === '0') {\r\n\t\t\t\t\tsendAnalytics({\r\n\t\t\t\t\t\tevent: 'session_end',\r\n\t\t\t\t\t\tname: 'Конец сессии',\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tsetCookie('st_session_id', null)\r\n\t\t\t\t}\r\n\t\t\t\tlocalStorage.setItem('tabCount', tabCount)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\twindow.addEventListener('beforeunload', handleBeforeUnload)\r\n\t\treturn () => {\r\n\t\t\twindow.removeEventListener('beforeunload', handleBeforeUnload)\r\n\t\t}\r\n\t}, [])\r\n\r\n\tuseEffect(() => {\r\n\t\tlet inactivityTimer: NodeJS.Timeout\r\n\r\n\t\tconst resetInactivityTimer = () => {\r\n\t\t\tclearTimeout(inactivityTimer)\r\n\t\t\t// 30 минут\r\n\t\t\tinactivityTimer = setTimeout(() => {\r\n\t\t\t\tsetCookie('st_session_id', null)\r\n\t\t\t\tsendAnalytics({\r\n\t\t\t\t\tevent: 'timeout_30min',\r\n\t\t\t\t\tname: 'Конец сессии',\r\n\t\t\t\t})\r\n\t\t\t}, 30 * 60 * 1000)\r\n\t\t}\r\n\r\n\t\tconst events = ['mousemove', 'click', 'touchstart', 'scroll', 'keydown']\r\n\t\tevents.forEach((event) => {\r\n\t\t\twindow.addEventListener(event, resetInactivityTimer)\r\n\t\t})\r\n\r\n\t\t// Запускаем таймер при монтировании компонента\r\n\t\tresetInactivityTimer()\r\n\t\treturn () => {\r\n\t\t\tevents.forEach((event) => {\r\n\t\t\t\twindow.removeEventListener(event, resetInactivityTimer)\r\n\t\t\t})\r\n\t\t\tclearTimeout(inactivityTimer)\r\n\t\t}\r\n\t}, [])\r\n\r\n\treturn {}\r\n}\r\n"],"mappings":"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","names":["src_exports","__export","sendAnalytics","setClientId","setSessionId","useInitializeMetrics","__toCommonJS","import_cookies_next","makeTimeBasedUID","setSessionId","newId","makeTimeBasedUID","setClientId","import_cookies_next","dataLayerPush","data","_a","_b","isTest","pathname","href","layerEvent","ymTarget","data","isTest","sendAnalyticsToAPI","data","isTest","url","pathname","href","formData","sendAnalytics","data","isTest","makeTimeBasedUID","_ym_uid","_ga","st_client_id","st_session_id","dataLayerPush","ymTarget","sendAnalyticsToAPI","import_cookies_next","import_react","useInitializeMetrics","isClientId","isSessionId","setClientId","setSessionId","sendAnalytics","tabCountStorage","tabCount","handleBeforeUnload","scrollTop","scrollHeight","scrollPercent","inactivityTimer","resetInactivityTimer","events","event"]}
package/package.json CHANGED
@@ -1,40 +1,42 @@
1
- {
2
- "name": "stone-analytics",
3
- "version": "0.0.13",
4
- "description": "send stanal",
5
- "main": "dist/index.cjs",
6
- "module": "dist/index.js",
7
- "types": "dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/index.js",
11
- "require": "./dist/index.cjs"
12
- },
13
- "./*": "./dist/*"
14
- },
15
- "files": [
16
- "dist"
17
- ],
18
- "scripts": {
19
- "build": "tsup",
20
- "version": "npm run build && git add .",
21
- "release": "npm version patch && git push --follow-tags && npm publish",
22
- "prepublishOnly": "npm run build"
23
- },
24
- "dependencies": {
25
- "cookies-next": "^2.1.2",
26
- "react": "18.2.0"
27
- },
28
- "devDependencies": {
29
- "@types/react": "19.0.1",
30
- "tsup": "^7.0.0",
31
- "typescript": "^5.8.2"
32
- },
33
- "engines": {
34
- "node": ">=18"
35
- },
36
- "publishConfig": {
37
- "access": "public"
38
- },
39
- "license": "MIT"
40
- }
1
+ {
2
+ "name": "stone-analytics",
3
+ "version": "0.0.15",
4
+ "description": "send stanal",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "require": "./dist/index.cjs"
12
+ },
13
+ "./*": "./dist/*"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsup",
20
+ "version": "npm run build && git add .",
21
+ "release": "npm version patch && git push --follow-tags && npm publish",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "dependencies": {
25
+ "cookies-next": "^2.1.2",
26
+ "react": "^18.2.0",
27
+ "react-dom": "^18.2.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/react": "19.0.1",
31
+ "@types/react-dom": "18.0.10",
32
+ "tsup": "^7.0.0",
33
+ "typescript": "^5.8.2"
34
+ },
35
+ "engines": {
36
+ "node": ">=18"
37
+ },
38
+ "publishConfig": {
39
+ "access": "public"
40
+ },
41
+ "license": "MIT"
42
+ }