better-analytics
Version:
Zero-dependency micro-analytics JavaScript SDK < 3KB gzipped with React/Next.js/Expo support
2 lines (1 loc) • 6.13 kB
JavaScript
;var C=Object.create;var m=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var J=(e,t)=>{for(var n in t)m(e,n,{get:t[n],enumerable:!0})},S=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of q(t))!z.call(e,r)&&r!==n&&m(e,r,{get:()=>t[r],enumerable:!(o=R(t,r))||o.enumerable});return e};var u=(e,t,n)=>(n=e!=null?C($(e)):{},S(t||!e||!e.__esModule?m(n,"default",{value:e,enumerable:!0}):n,e)),V=e=>S(m({},"__esModule",{value:!0}),e);var L={};J(L,{AnalyticsProvider:()=>j,init:()=>D,processEventQueue:()=>x,track:()=>w,trackScreen:()=>A,useAnalytics:()=>F,useExpoRouterTracking:()=>N});module.exports=V(L);var c=u(require("react")),a=u(require("@react-native-async-storage/async-storage")),s=require("react-native"),p=u(require("expo-device")),l=u(require("expo-application")),y=u(require("expo-localization")),h=u(require("expo-network")),d=require("expo-router"),v="ba_event_queue",i=null;function D(e){i=e,e.debug&&(console.log("\u{1F4F1} Better Analytics Expo initialized"),console.log("\u{1F4CD} Endpoint:",e.endpoint||"https://better-analytics.app/api/collect"),console.log("\u{1F3F7}\uFE0F Site:",e.site),console.log("\u{1F4F1} Platform:",s.Platform.OS),console.log("\u{1F9ED} Auto Navigation Tracking:",e.trackNavigation!==!1?"enabled":"disabled")),x()}async function k(){let{width:e,height:t}=s.Dimensions.get("window"),n=s.Dimensions.get("screen");try{let o=l.nativeApplicationVersion||void 0,r=l.nativeBuildVersion||void 0,g=l.applicationId||void 0,f=await Q(),I=p.brand||void 0,P=p.modelName||void 0,_=s.Platform.Version?.toString(),O=!p.isDevice,B=y.timezone,M=y.locale;return{device:{userAgent:i?.userAgent||`Expo/${s.Platform.OS}`,screenWidth:n.width,screenHeight:n.height,language:M,timezone:B,platform:s.Platform.OS,platformVersion:_,brand:I,model:P,isEmulator:O},deviceId:f,sessionId:await T(),app:{version:i?.appVersion||o,buildNumber:r,bundleId:g}}}catch(o){return console.warn("Better Analytics Expo: Error getting device info",o),{device:{platform:s.Platform.OS,screenWidth:n.width,screenHeight:n.height}}}}async function Q(){try{let e=await a.default.getItem("ba_device_id");return e||(e=`expo_${Date.now()}_${Math.random().toString(36).substring(2)}`,await a.default.setItem("ba_device_id",e)),e}catch{return`expo_${Date.now()}_${Math.random().toString(36).substring(2)}`}}async function T(){try{let t=await a.default.getItem("ba_session");if(t){let{id:n,timestamp:o}=JSON.parse(t);if(Date.now()-o<18e5)return await a.default.setItem("ba_session",JSON.stringify({id:n,timestamp:Date.now()})),n}}catch{}let e=`expo_session_${Date.now()}_${Math.random().toString(36).substring(2)}`;try{await a.default.setItem("ba_session",JSON.stringify({id:e,timestamp:Date.now()}))}catch{}return e}async function w(e,t){if(!i){console.warn("Better Analytics Expo: Not initialized. Call init() first.");return}if(!i.site){console.warn("Better Analytics Expo: No site identifier provided.");return}if(x(),!(await h.getNetworkStateAsync()).isConnected){i.debug&&console.log("\u{1F4F1} Better Analytics Expo: Offline, queuing event");let g=l.applicationId||"unknown";await E({event:e,timestamp:Date.now(),site:i.site,url:`app://${g}`,referrer:"",...t&&{props:t}});return}let o=await k(),r={event:e,timestamp:Date.now(),url:`app://${o.app?.bundleId||"unknown"}`,referrer:"",site:i.site,...o,...t&&{props:t}};if(i.beforeSend){let g={type:e==="screen_view"?"pageview":"event",name:e,url:r.url,data:r},f=await i.beforeSend(g);if(!f||!f.data)return;await b(f.data)}else await b(r);i.debug&&console.log("\u{1F4F1} Better Analytics Expo tracked:",e,t)}async function A(e,t){await w("screen_view",{screen_name:e,...t})}async function b(e){if(!i)return;let t=i.endpoint||"https://better-analytics.app/api/collect";try{let n=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json","User-Agent":e.device?.userAgent||"BetterAnalytics-Expo/0.8.0"},body:JSON.stringify(e)});n.ok||(i.debug&&console.warn("Better Analytics Expo: Failed to send event, queuing.",{status:n.status,event:e.event}),await E(e))}catch(n){i.debug&&console.warn("Better Analytics Expo: Network error, queuing event.",n),await E(e)}}async function E(e){try{let t=await a.default.getItem(v),n=t?JSON.parse(t):[],o={event:e.event,timestamp:e.timestamp,url:e.url,referrer:e.referrer,site:e.site,props:e.props};n.push(o),await a.default.setItem(v,JSON.stringify(n))}catch(t){i?.debug&&console.warn("Better Analytics Expo: Failed to queue event.",t)}}async function x(){if(!i)return;if(!(await h.getNetworkStateAsync()).isConnected){i.debug&&console.log("\u{1F4F1} Better Analytics Expo: Offline, skipping queue processing.");return}try{let t=await a.default.getItem(v);if(!t)return;let n=JSON.parse(t);if(n.length===0)return;i.debug&&console.log(`\u{1F4F1} Better Analytics Expo: Processing event queue (${n.length} events).`),await a.default.setItem(v,JSON.stringify([]));let o=await k();for(let r of n)await b({...o,...r})}catch(t){i.debug&&console.warn("Better Analytics Expo: Error processing event queue.",t)}}function N(){let e=(0,d.usePathname)(),t=(0,d.useSegments)(),n=(0,d.useGlobalSearchParams)(),o=(0,c.useRef)(null);(0,c.useEffect)(()=>{if(!(!i||i.trackNavigation===!1)&&e&&e!==o.current){o.current=e;let r=e==="/"?"index":e.replace(/^\//,"").replace(/\//g,"_");A(r,{pathname:e,segments:t.join("/"),params:Object.keys(n).length>0?n:void 0}),i.debug&&(console.log("\u{1F4F1} Better Analytics Expo: Auto-tracked screen change"),console.log(" \u{1F4CD} Pathname:",e),console.log(" \u{1F500} Screen Name:",r),console.log(" \u{1F4CA} Segments:",t),Object.keys(n).length>0&&console.log(" \u{1F4CC} Params:",n))}},[e,t,n])}function j({children:e,...t}){let n=(0,c.useRef)(!1);return(0,c.useEffect)(()=>{n.current||(D(t),n.current=!0)},[t]),N(),c.default.createElement(c.default.Fragment,null,e)}function F(){return{track:w,trackScreen:A,identify:async(e,t)=>{await w("identify",{user_id:e,...t})}}}0&&(module.exports={AnalyticsProvider,init,processEventQueue,track,trackScreen,useAnalytics,useExpoRouterTracking});