stone-analytics 0.0.17 → 0.0.19
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/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var p=Object.defineProperty;var L=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var D=(e,t)=>{for(var n in t)p(e,n,{get:t[n],enumerable:!0})},M=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of P(t))!A.call(e,o)&&o!==n&&p(e,o,{get:()=>t[o],enumerable:!(i=L(t,o))||i.enumerable});return e};var x=e=>M(p({},"__esModule",{value:!0}),e);var O={};D(O,{checkTimeStamp:()=>d,sendAnalytics:()=>l,setClientId:()=>g,setSessionId:()=>_,useInitializeMetrics:()=>Y});module.exports=x(O);var m=()=>String(Date.now())+String(Math.floor(Math.random()*9e8)+1e8);var h=typeof localStorage<"u",d=e=>{if(!e)return!1;let t=new Date(e.split("_")[0]),n=new Date(new Date().toISOString());return n.getFullYear()>t.getFullYear()&&n.getMonth()>=t.getMonth()&&n.getDate()>=t.getDate()},_=()=>{let e=m(),t=new Date().toISOString();h&&localStorage.setItem("st_session_id",t+"_"+e)},g=()=>{let e=m(),t=new Date().toISOString();h&&localStorage.setItem("st_client_id",t+"_"+e)};var y=require("cookies-next");var T=e=>{var t,n;if(typeof window<"u"){let i=process.env.NEXT_PUBLIC_IS_TEST==="true",o=window.location.pathname,s=window.location.href,a={event:e.event,st_event_id:(t=e.params)==null?void 0:t.st_event_id,abTestGroup:(n=e.params)==null?void 0:n.abTestGroup,page_path:o,page_url:s};e.params.st_session_id&&(a.st_session_id=e.params.st_session_id),e.params.st_client_id&&(a.st_client_id=e.params.st_client_id),e.params.project&&(a.project=e.params.project),e.params.lot_id&&(a.lot_id=e.params.lot_id),i||(window.dataLayer=window.dataLayer||[],window.dataLayer.push(a),console.log("dataLayerPush:",a))}};var w=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 f=async e=>{if(typeof window<"u"){let t=process.env.NEXT_PUBLIC_IS_TEST==="true",n="https://stone.ru/api/analytics/send-event",i=window.location.pathname,o=window.location.href,s={event:e.event,name:e.name,payload:{...e.params,page_path:i,page_url:o}};try{t||(await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),console.log("sendAnalyticsToAPI:",s))}catch{console.log("can't sendAnalyticsToAPI")}}else return};var u=!1,b=e=>{if(u){e();return}typeof window<"u"&&(typeof ym<"u"?(u=!0,e()):document.addEventListener("yacounter"+process.env.NEXT_PUBLIC_YM_COUNTER+"inited",()=>{u=!0,e()},{once:!0}))},l=(e,t=!1)=>{let n=typeof localStorage<"u",i=process.env.NEXT_PUBLIC_IS_TEST==="true";e.params=e.params||{},e.params.st_event_id=m(),e.params.date=new Date().toISOString();let o=String((0,y.getCookie)("_ym_uid"));o&&o!==""&&(e.params.ym_client_id=o);let s=String((0,y.getCookie)("_ga"));s&&s!==""&&(e.params.ga_client_id=s);let a=n?localStorage.getItem("st_client_id"):void 0;a&&a!==""&&(e.params.st_client_id=a);let r=n?localStorage.getItem("st_session_id"):void 0;r&&r!==""&&(e.params.st_session_id=r);let c=n?localStorage.getItem("st_client_hash_id"):void 0;c&&c!==""&&(e.params.st_client_hash_id=c),i||(T({event:e.event,params:e.params}),w({target:e.event,params:e.params}),t?b(()=>f({event:e.event,name:e.name,params:e.params})):f({event:e.event,name:e.name,params:e.params}))};var S=require("react");var B=typeof localStorage<"u",N=(e,t=0)=>{let n=3735928559^t,i=1103547991^t;for(let o=0,s;o<e.length;o++)s=e.charCodeAt(o),n=Math.imul(n^s,2654435761),i=Math.imul(i^s,1597334677);return n=Math.imul(n^n>>>16,2246822507)^Math.imul(i^i>>>13,3266489909),i=Math.imul(i^i>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),4294967296*(2097151&i)+(n>>>0)},U=()=>{var e,t;if(typeof window<"u"){let n=(navigator==null?void 0:navigator.userAgent)+"|"+((e=window==null?void 0:window.screen)==null?void 0:e.width)+"|"+((t=window==null?void 0:window.screen)==null?void 0:t.height)+"|"+(navigator==null?void 0:navigator.language)+"|"+(navigator==null?void 0:navigator.cookieEnabled);return N(n)}},I=()=>{let e=U();B&&e&&localStorage.setItem("st_client_hash_id",String(e))};var Y=()=>{let e=typeof localStorage<"u",t=!!(e&&localStorage.getItem("st_client_id")),n=!!(e&&localStorage.getItem("st_session_id")),i=d(e?localStorage.getItem("st_client_id"):null);return(!t||i)&&g(),n||(_(),I(),l({event:"session_start",name:"\u041D\u0430\u0447\u0430\u043B\u043E \u0441\u0435\u0441\u0441\u0438\u0438"},!0)),(0,S.useEffect)(()=>{let o=localStorage.getItem("tabCount"),s=o?parseInt(o):0;s<0&&(localStorage.setItem("tabCount",String(0)),s=0),s++,s&&localStorage.setItem("tabCount",String(s));let a=()=>{let r=localStorage.getItem("tabCount");if(r&&typeof window<"u"){let c=String(Number(r)-1),v=window.scrollY,C=document.documentElement.scrollHeight-document.documentElement.clientHeight,E=v/C*100;l({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:E.toFixed(0)+"%"}}),c==="0"&&(l({event:"session_end",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"}),localStorage.setItem("st_session_id",""),localStorage.setItem("st_client_hash_id","")),localStorage.setItem("tabCount",c)}};return window.addEventListener("beforeunload",a),()=>{window.removeEventListener("beforeunload",a)}},[]),(0,S.useEffect)(()=>{let o,s=()=>{clearTimeout(o),o=setTimeout(()=>{localStorage.setItem("st_session_id",""),localStorage.setItem("st_client_hash_id",""),l({event:"timeout_30min",name:"\u041A\u043E\u043D\u0435\u0446 \u0441\u0435\u0441\u0441\u0438\u0438"})},18e5)},a=["mousemove","click","touchstart","scroll","keydown"];return a.forEach(r=>{window.addEventListener(r,s)}),s(),()=>{a.forEach(r=>{window.removeEventListener(r,s)}),clearTimeout(o)}},[]),{}};0&&(module.exports={checkTimeStamp,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/makeUID.ts","../src/utils/sessionClientId.ts","../src/sendAnalytics/sendAnalytics.ts","../src/dataLayerPush/dataLayerPush.ts","../src/ymTarget/ymaTarget.ts","../src/sendAnalyticsToAPI/sendAnalyticsToAPI.ts","../src/hooks/useInitializeMetrics.ts","../src/utils/hashId.ts"],"sourcesContent":["export * from './utils/sessionClientId'\r\nexport * from './sendAnalytics/sendAnalytics'\r\nexport * from './hooks/useInitializeMetrics'","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 {makeTimeBasedUID} from './makeUID'\r\n\r\nconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\nconst checkTimeStamp = (clientId: string | null) => {\r\n if (!clientId) return false\r\n\r\n const ISOSDate = new Date(clientId.split('_')[0])\r\n const ISOSDateNow = new Date(new Date().toISOString())\r\n\r\n return (\r\n ISOSDateNow.getFullYear() > ISOSDate.getFullYear() &&\r\n ISOSDateNow.getMonth() >= ISOSDate.getMonth() &&\r\n ISOSDateNow.getDate() >= ISOSDate.getDate()\r\n )\r\n}\r\n\r\nconst setSessionId = () => {\r\n const newId = makeTimeBasedUID()\r\n const timeStamp = new Date().toISOString()\r\n if (isLocalStorage) localStorage.setItem('st_session_id', timeStamp + '_' + newId)\r\n}\r\n\r\nconst setClientId = () => {\r\n const newId = makeTimeBasedUID()\r\n const timeStamp = new Date().toISOString()\r\n if (isLocalStorage) localStorage.setItem('st_client_id', timeStamp + '_' + newId)\r\n}\r\n\r\n\r\nexport {setClientId, setSessionId, checkTimeStamp}","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\nlet isYMReady = false;\r\ndeclare let ym: any\r\n\r\nconst waitForYM = (callback: () => void) => {\r\n if (isYMReady) {\r\n callback();\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n if (typeof ym !== 'undefined') {\r\n isYMReady = true;\r\n callback();\r\n } else {\r\n document.addEventListener(\r\n 'yacounter' + process.env.NEXT_PUBLIC_YM_COUNTER + 'inited',\r\n () => {\r\n isYMReady = true;\r\n callback();\r\n },\r\n { once: true }\r\n );\r\n }\r\n }\r\n};\r\n\r\nexport const sendAnalytics = (data: TAnalyticsData, waitForYMFlag: boolean = false) => {\r\n const isLocalStorage = typeof localStorage !== 'undefined';\r\n\r\n data.params = data.params || {};\r\n data.params.st_event_id = makeTimeBasedUID();\r\n data.params.date = new Date().toISOString();\r\n\r\n const _ym_uid = String(getCookie('_ym_uid'));\r\n if (_ym_uid && _ym_uid !== '') {\r\n data.params.ym_client_id = _ym_uid;\r\n }\r\n const _ga = String(getCookie('_ga'));\r\n if (_ga && _ga !== '') {\r\n data.params.ga_client_id = _ga;\r\n }\r\n\r\n const st_client_id = isLocalStorage ? localStorage.getItem('st_client_id') : undefined;\r\n if (st_client_id && st_client_id !== '') {\r\n data.params.st_client_id = st_client_id;\r\n }\r\n\r\n const st_session_id = isLocalStorage ? localStorage.getItem('st_session_id') : undefined;\r\n if (st_session_id && st_session_id !== '') {\r\n data.params.st_session_id = st_session_id;\r\n }\r\n\r\n const st_client_hash_id = isLocalStorage ? localStorage.getItem('st_client_hash_id') : undefined;\r\n if (st_client_hash_id && st_client_hash_id !== '') {\r\n data.params.st_client_hash_id = st_client_hash_id;\r\n }\r\n\r\n if (process.env.NEXT_PUBLIC_IS_TEST === 'false') {\r\n dataLayerPush({ event: data.event, params: data.params });\r\n ymTarget({ target: data.event, params: data.params });\r\n\r\n if (waitForYMFlag) {\r\n waitForYM(() => sendAnalyticsToAPI({ event: data.event, name: data.name, params: data.params }));\r\n } else {\r\n sendAnalyticsToAPI({ event: data.event, name: data.name, params: data.params });\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 {checkTimeStamp, setClientId, setSessionId} from '../utils/sessionClientId'\r\nimport {sendAnalytics} from '../sendAnalytics/sendAnalytics'\r\nimport {useEffect} from 'react'\r\nimport {setBrowserId} from \"../utils/hashId\";\r\n\r\nexport const useInitializeMetrics = () => {\r\n\tconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\n\tconst isClientId = Boolean(isLocalStorage ? localStorage.getItem('st_client_id') : null)\r\n\tconst isSessionId = Boolean(isLocalStorage ? localStorage.getItem('st_session_id') : null)\r\n\tconst isYearPast = checkTimeStamp(isLocalStorage ? localStorage.getItem('st_client_id') : null)\r\n\r\n\tif (!isClientId || isYearPast) setClientId()\r\n\r\n\tif (!isSessionId) {\r\n\t\tsetSessionId()\r\n\t\tsetBrowserId()\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\tlocalStorage.setItem('st_session_id', '')\r\n\t\t\t\t\tlocalStorage.setItem('st_client_hash_id', '')\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\tlocalStorage.setItem('st_session_id', '')\r\n\t\t\t\tlocalStorage.setItem('st_client_hash_id', '')\r\n\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","const isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\nconst getStringHash = (str: string, seed = 0) => {\r\n let h1 = 0xdeadbeef ^ seed,\r\n h2 = 0x41c6ce57 ^ seed\r\n for (let i = 0, ch; i < str.length; i++) {\r\n ch = str.charCodeAt(i)\r\n h1 = Math.imul(h1 ^ ch, 2654435761)\r\n h2 = Math.imul(h2 ^ ch, 1597334677)\r\n }\r\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909)\r\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909)\r\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\r\n}\r\n\r\nconst getClientHashId = () => {\r\n if (typeof window !== 'undefined') {\r\n\r\n const userBrowserString =\r\n navigator?.userAgent +\r\n '|' +\r\n window?.screen?.width +\r\n '|' +\r\n window?.screen?.height +\r\n '|' +\r\n navigator?.language +\r\n '|' +\r\n navigator?.cookieEnabled\r\n return getStringHash(userBrowserString)\r\n }\r\n}\r\n\r\nconst setBrowserId = () => {\r\n const newId = getClientHashId()\r\n\r\n if (isLocalStorage && newId) localStorage.setItem('st_client_hash_id', String(newId))\r\n}\r\n\r\nexport {getClientHashId, setBrowserId}"],"mappings":"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","names":["src_exports","__export","checkTimeStamp","sendAnalytics","setClientId","setSessionId","useInitializeMetrics","__toCommonJS","makeTimeBasedUID","isLocalStorage","checkTimeStamp","clientId","ISOSDate","ISOSDateNow","setSessionId","newId","makeTimeBasedUID","timeStamp","setClientId","import_cookies_next","dataLayerPush","data","_a","_b","isTest","pathname","href","layerEvent","ymTarget","data","isTest","sendAnalyticsToAPI","data","isTest","url","pathname","href","formData","isYMReady","waitForYM","callback","sendAnalytics","data","waitForYMFlag","isLocalStorage","makeTimeBasedUID","_ym_uid","_ga","st_client_id","st_session_id","st_client_hash_id","dataLayerPush","ymTarget","sendAnalyticsToAPI","import_react","isLocalStorage","getStringHash","str","seed","h1","h2","i","ch","getClientHashId","_a","_b","userBrowserString","setBrowserId","newId","useInitializeMetrics","isLocalStorage","isClientId","isSessionId","isYearPast","checkTimeStamp","setClientId","setSessionId","setBrowserId","sendAnalytics","tabCountStorage","tabCount","handleBeforeUnload","scrollTop","scrollHeight","scrollPercent","inactivityTimer","resetInactivityTimer","events","event"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/makeUID.ts","../src/utils/sessionClientId.ts","../src/sendAnalytics/sendAnalytics.ts","../src/dataLayerPush/dataLayerPush.ts","../src/ymTarget/ymaTarget.ts","../src/sendAnalyticsToAPI/sendAnalyticsToAPI.ts","../src/hooks/useInitializeMetrics.ts","../src/utils/hashId.ts"],"sourcesContent":["export * from './utils/sessionClientId'\r\nexport * from './sendAnalytics/sendAnalytics'\r\nexport * from './hooks/useInitializeMetrics'","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 {makeTimeBasedUID} from './makeUID'\r\n\r\nconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\nconst checkTimeStamp = (clientId: string | null) => {\r\n if (!clientId) return false\r\n\r\n const ISOSDate = new Date(clientId.split('_')[0])\r\n const ISOSDateNow = new Date(new Date().toISOString())\r\n\r\n return (\r\n ISOSDateNow.getFullYear() > ISOSDate.getFullYear() &&\r\n ISOSDateNow.getMonth() >= ISOSDate.getMonth() &&\r\n ISOSDateNow.getDate() >= ISOSDate.getDate()\r\n )\r\n}\r\n\r\nconst setSessionId = () => {\r\n const newId = makeTimeBasedUID()\r\n const timeStamp = new Date().toISOString()\r\n if (isLocalStorage) localStorage.setItem('st_session_id', timeStamp + '_' + newId)\r\n}\r\n\r\nconst setClientId = () => {\r\n const newId = makeTimeBasedUID()\r\n const timeStamp = new Date().toISOString()\r\n if (isLocalStorage) localStorage.setItem('st_client_id', timeStamp + '_' + newId)\r\n}\r\n\r\n\r\nexport {setClientId, setSessionId, checkTimeStamp}","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\nlet isYMReady = false\r\ndeclare let ym: any\r\n\r\nconst waitForYM = (callback: () => void) => {\r\n\tif (isYMReady) {\r\n\t\tcallback()\r\n\t\treturn\r\n\t}\r\n\r\n\tif (typeof window !== 'undefined') {\r\n\t\tif (typeof ym !== 'undefined') {\r\n\t\t\tisYMReady = true\r\n\t\t\tcallback()\r\n\t\t} else {\r\n\t\t\tdocument.addEventListener(\r\n\t\t\t\t'yacounter' + process.env.NEXT_PUBLIC_YM_COUNTER + 'inited',\r\n\t\t\t\t() => {\r\n\t\t\t\t\tisYMReady = true\r\n\t\t\t\t\tcallback()\r\n\t\t\t\t},\r\n\t\t\t\t{ once: true }\r\n\t\t\t)\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport const sendAnalytics = (data: TAnalyticsData, waitForYMFlag: boolean = false) => {\r\n\tconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\tconst isTest = process.env.NEXT_PUBLIC_IS_TEST === 'true'\r\n\r\n\tdata.params = data.params || {}\r\n\tdata.params.st_event_id = makeTimeBasedUID()\r\n\tdata.params.date = new Date().toISOString()\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\r\n\tconst st_client_id = isLocalStorage ? localStorage.getItem('st_client_id') : undefined\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\r\n\tconst st_session_id = isLocalStorage ? localStorage.getItem('st_session_id') : undefined\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\tconst st_client_hash_id = isLocalStorage ? localStorage.getItem('st_client_hash_id') : undefined\r\n\tif (st_client_hash_id && st_client_hash_id !== '') {\r\n\t\tdata.params.st_client_hash_id = st_client_hash_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\r\n\t\tif (waitForYMFlag) {\r\n\t\t\twaitForYM(() =>\r\n\t\t\t\tsendAnalyticsToAPI({ event: data.event, name: data.name, params: data.params })\r\n\t\t\t)\r\n\t\t} else {\r\n\t\t\tsendAnalyticsToAPI({ event: data.event, name: data.name, params: data.params })\r\n\t\t}\r\n\t}\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 { checkTimeStamp, setClientId, setSessionId } from '../utils/sessionClientId'\r\nimport { sendAnalytics } from '../sendAnalytics/sendAnalytics'\r\nimport { useEffect } from 'react'\r\nimport { setBrowserId } from '../utils/hashId'\r\n\r\nexport const useInitializeMetrics = () => {\r\n\tconst isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\n\tconst isClientId = Boolean(isLocalStorage ? localStorage.getItem('st_client_id') : null)\r\n\tconst isSessionId = Boolean(isLocalStorage ? localStorage.getItem('st_session_id') : null)\r\n\tconst isYearPast = checkTimeStamp(isLocalStorage ? localStorage.getItem('st_client_id') : null)\r\n\r\n\tif (!isClientId || isYearPast) setClientId()\r\n\r\n\tif (!isSessionId) {\r\n\t\tsetSessionId()\r\n\t\tsetBrowserId()\r\n\t\tsendAnalytics(\r\n\t\t\t{\r\n\t\t\t\tevent: 'session_start',\r\n\t\t\t\tname: 'Начало сессии',\r\n\t\t\t},\r\n\t\t\ttrue\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\tlocalStorage.setItem('st_session_id', '')\r\n\t\t\t\t\tlocalStorage.setItem('st_client_hash_id', '')\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\tlocalStorage.setItem('st_session_id', '')\r\n\t\t\t\tlocalStorage.setItem('st_client_hash_id', '')\r\n\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","const isLocalStorage = typeof localStorage !== 'undefined'\r\n\r\nconst getStringHash = (str: string, seed = 0) => {\r\n let h1 = 0xdeadbeef ^ seed,\r\n h2 = 0x41c6ce57 ^ seed\r\n for (let i = 0, ch; i < str.length; i++) {\r\n ch = str.charCodeAt(i)\r\n h1 = Math.imul(h1 ^ ch, 2654435761)\r\n h2 = Math.imul(h2 ^ ch, 1597334677)\r\n }\r\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909)\r\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909)\r\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\r\n}\r\n\r\nconst getClientHashId = () => {\r\n if (typeof window !== 'undefined') {\r\n\r\n const userBrowserString =\r\n navigator?.userAgent +\r\n '|' +\r\n window?.screen?.width +\r\n '|' +\r\n window?.screen?.height +\r\n '|' +\r\n navigator?.language +\r\n '|' +\r\n navigator?.cookieEnabled\r\n return getStringHash(userBrowserString)\r\n }\r\n}\r\n\r\nconst setBrowserId = () => {\r\n const newId = getClientHashId()\r\n\r\n if (isLocalStorage && newId) localStorage.setItem('st_client_hash_id', String(newId))\r\n}\r\n\r\nexport {getClientHashId, setBrowserId}"],"mappings":"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","names":["src_exports","__export","checkTimeStamp","sendAnalytics","setClientId","setSessionId","useInitializeMetrics","__toCommonJS","makeTimeBasedUID","isLocalStorage","checkTimeStamp","clientId","ISOSDate","ISOSDateNow","setSessionId","newId","makeTimeBasedUID","timeStamp","setClientId","import_cookies_next","dataLayerPush","data","_a","_b","isTest","pathname","href","layerEvent","ymTarget","data","isTest","sendAnalyticsToAPI","data","isTest","url","pathname","href","formData","isYMReady","waitForYM","callback","sendAnalytics","data","waitForYMFlag","isLocalStorage","isTest","makeTimeBasedUID","_ym_uid","_ga","st_client_id","st_session_id","st_client_hash_id","dataLayerPush","ymTarget","sendAnalyticsToAPI","import_react","isLocalStorage","getStringHash","str","seed","h1","h2","i","ch","getClientHashId","_a","_b","userBrowserString","setBrowserId","newId","useInitializeMetrics","isLocalStorage","isClientId","isSessionId","isYearPast","checkTimeStamp","setClientId","setSessionId","setBrowserId","sendAnalytics","tabCountStorage","tabCount","handleBeforeUnload","scrollTop","scrollHeight","scrollPercent","inactivityTimer","resetInactivityTimer","events","event"]}
|