react-lens-analytics
Version:
This is test button made for a tutorial
3 lines (2 loc) • 4.13 kB
JavaScript
import{useState as t,useCallback as e,useEffect as o,useRef as n}from"react";const r="visitorId";const i="geolocationData";const a="https://test-hono-backend.kartik20044.workers.dev",c=()=>"complete"===document.readyState;function s(s){const d=function(){const[n,i]=t(""),a=e((()=>{if("undefined"==typeof window)return"";const t=localStorage.getItem(r);if(t)return t;const e=crypto.randomUUID();return localStorage.setItem(r,e),e}),[]);return o((()=>{i(a())}),[a]),n}(),u=function(){const[e,n]=t(null);return o((()=>{(async()=>{try{const t=localStorage.getItem(i);if(t){const{data:e,timestamp:o}=JSON.parse(t);if(Date.now()-o<864e5)return void n(e)}const e=await fetch("https://api.ipify.org?format=json"),o=await e.json(),r=await fetch(`https://ipapi.co/${o.ip}/json/`),a=await r.json(),c={country:a.country_name||"",countryCode:a.country_code||"",city:a.city||"",region:a.region||""};n(c),localStorage.setItem(i,JSON.stringify({data:c,timestamp:Date.now()}))}catch(t){console.error("Error fetching geolocation data:",t)}})()}),[]),e}(),f=n(null),l=n(!1),w=e((async(t,e,o=!1)=>{try{if(o&&l.current)return;o||(f.current?.abort(),f.current=new AbortController);const n=await fetch(`${a}/${t}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e),mode:"cors",signal:o?void 0:f.current?.signal});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);o&&(l.current=!0)}catch(e){if(e instanceof Error&&"AbortError"===e.name)return;console.error(`Analytics error (${t}):`,e)}}),[]),p=e((()=>{if("undefined"==typeof window||!u||!d||l.current)return;const t={projectId:s,url:window.location.href,visitorId:d,userAgent:window.navigator.userAgent,referrer:document.referrer||"",duration:0,isExit:!1,...u};w("create-analytics",t,!0)}),[s,d,u,w]),m=e((()=>{if("undefined"==typeof window||document.hidden)return;const t={projectId:s,visitorId:d,lastActiveTime:Date.now(),page:window.location.href};w("activity",t)}),[s,d,w]);o((()=>{if("undefined"==typeof window||!d||!u)return;let t,e=0;const o=()=>{const n=Date.now();!document.hidden&&n-e>=6e4&&c()&&(m(),e=n),t=setTimeout(o,1e3)},n=()=>{p(),o()};c()?n():window.addEventListener("load",n);const r=()=>{document.hidden||(m(),e=Date.now())};return c()?document.addEventListener("visibilitychange",r):window.addEventListener("load",(()=>{document.addEventListener("visibilitychange",r)})),()=>{clearTimeout(t),window.removeEventListener("load",n),document.removeEventListener("visibilitychange",r),f.current?.abort()}}),[p,m,s,d,u,w])}const d=t=>(s(t.projectId),null),u="visitorId",f="geolocationData";function l(){if("undefined"==typeof window)return"";const t=localStorage.getItem(u);if(t)return t;const e=crypto.randomUUID();return localStorage.setItem(u,e),e}async function w(t,e,o){if("undefined"==typeof window)return;const n=l();if(!n)return;const r=await async function(){try{const t=localStorage.getItem(f);if(t){const{data:e,timestamp:o}=JSON.parse(t);if(Date.now()-o<864e5)return e}const e=await fetch("https://api.ipify.org?format=json"),o=await e.json(),n=await fetch(`https://ipapi.co/${o.ip}/json/`),r=await n.json(),i={country:r.country_name||"",countryCode:r.country_code||"",city:r.city||"",region:r.region||""};return localStorage.setItem(f,JSON.stringify({data:i,timestamp:Date.now()})),i}catch(t){return console.error("Error fetching geolocation data:",t),null}}(),i={en:e,ed:o||{},projectId:t,visitorId:n,url:window.location.href,timestamp:Date.now(),...r||{}};try{await fetch(`${a}/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i),mode:"cors",keepalive:!0})}catch(t){console.error("Event tracking error:",t)}}function p(t,e,o){if("undefined"==typeof window)return;const n=l();if(!n)return;const r=localStorage.getItem(f),i=r?JSON.parse(r).data:null,c={en:e,ed:o||{},projectId:t,visitorId:n,url:window.location.href,timestamp:Date.now(),...i||{}};fetch(`${a}/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c),keepalive:!0}).catch((t=>console.error("Event tracking error:",t)))}export{d as Analytics,w as track,p as trackSync};
//# sourceMappingURL=index.js.map