dishub-analytics.sdk 1.1.3 → 1.1.5

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/client.d.ts CHANGED
@@ -5,6 +5,7 @@ export declare class AnalyticsClient {
5
5
  private sessionId;
6
6
  private heartbeatInterval;
7
7
  constructor(config: AnalyticsConfig);
8
+ private safeStorage;
8
9
  getVisitorId(): string | null;
9
10
  getSessionId(): string | null;
10
11
  init(): Promise<void>;
package/dist/index.d.ts CHANGED
@@ -35,6 +35,7 @@ declare class AnalyticsClient {
35
35
  private sessionId;
36
36
  private heartbeatInterval;
37
37
  constructor(config: AnalyticsConfig);
38
+ private safeStorage;
38
39
  getVisitorId(): string | null;
39
40
  getSessionId(): string | null;
40
41
  init(): Promise<void>;
package/dist/index.esm.js CHANGED
@@ -5,6 +5,28 @@ class AnalyticsClient {
5
5
  this.visitorId = null;
6
6
  this.sessionId = null;
7
7
  this.heartbeatInterval = null;
8
+ this.safeStorage = {
9
+ getItem: (key) => {
10
+ try {
11
+ if (typeof window === 'undefined' || typeof localStorage === 'undefined')
12
+ return null;
13
+ return localStorage.getItem(key);
14
+ }
15
+ catch (e) {
16
+ return null;
17
+ }
18
+ },
19
+ setItem: (key, value) => {
20
+ try {
21
+ if (typeof window === 'undefined' || typeof localStorage === 'undefined')
22
+ return;
23
+ localStorage.setItem(key, value);
24
+ }
25
+ catch (e) {
26
+ // Ignore
27
+ }
28
+ }
29
+ };
8
30
  this.config = {
9
31
  trackPageViews: true,
10
32
  trackClicks: true,
@@ -21,11 +43,11 @@ class AnalyticsClient {
21
43
  }
22
44
  async init() {
23
45
  // Get or create visitor ID
24
- if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {
25
- let id = localStorage.getItem('ib_visitor_id');
46
+ if (typeof window !== 'undefined') {
47
+ let id = this.safeStorage.getItem('ib_visitor_id');
26
48
  if (!id) {
27
49
  id = this.generateId();
28
- localStorage.setItem('ib_visitor_id', id);
50
+ this.safeStorage.setItem('ib_visitor_id', id);
29
51
  }
30
52
  this.visitorId = id;
31
53
  // Track session
@@ -110,9 +132,7 @@ class AnalyticsClient {
110
132
  });
111
133
  if (data?.id) {
112
134
  this.sessionId = data.id;
113
- if (typeof localStorage !== 'undefined') {
114
- localStorage.setItem('ib_v2_session_id', data.id);
115
- }
135
+ this.safeStorage.setItem('ib_v2_session_id', data.id);
116
136
  }
117
137
  }
118
138
  catch (error) {
@@ -121,7 +141,7 @@ class AnalyticsClient {
121
141
  }
122
142
  async trackEvent(name, category, value, metadata) {
123
143
  if (!this.sessionId && typeof window !== 'undefined') {
124
- this.sessionId = localStorage.getItem('ib_v2_session_id');
144
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
125
145
  }
126
146
  if (!this.sessionId)
127
147
  return;
@@ -143,7 +163,7 @@ class AnalyticsClient {
143
163
  }
144
164
  async trackPageView(path, title) {
145
165
  if (!this.sessionId && typeof window !== 'undefined') {
146
- this.sessionId = localStorage.getItem('ib_v2_session_id');
166
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
147
167
  }
148
168
  if (!this.sessionId)
149
169
  return;
@@ -166,7 +186,7 @@ class AnalyticsClient {
166
186
  startHeartbeat() {
167
187
  const sendHeartbeat = async () => {
168
188
  if (!this.sessionId && typeof window !== 'undefined') {
169
- this.sessionId = localStorage.getItem('ib_v2_session_id');
189
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
170
190
  }
171
191
  if (!this.sessionId)
172
192
  return;
@@ -215,7 +235,7 @@ class AnalyticsClient {
215
235
  }
216
236
  async disconnect() {
217
237
  if (!this.sessionId && typeof window !== 'undefined') {
218
- this.sessionId = localStorage.getItem('ib_v2_session_id');
238
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
219
239
  }
220
240
  if (!this.sessionId)
221
241
  return;
@@ -260,7 +280,7 @@ class AnalyticsClient {
260
280
  }
261
281
  async trackInteraction(type, element, x, y, metadata) {
262
282
  if (!this.sessionId && typeof window !== 'undefined') {
263
- this.sessionId = localStorage.getItem('ib_v2_session_id');
283
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
264
284
  }
265
285
  if (!this.sessionId)
266
286
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/client.ts","../src/react.tsx"],"sourcesContent":["import { AnalyticsConfig } from './types';\n\nexport class AnalyticsClient {\n private config: AnalyticsConfig;\n private visitorId: string | null = null;\n private sessionId: string | null = null;\n private heartbeatInterval: NodeJS.Timeout | null = null;\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n trackPageViews: true,\n trackClicks: true,\n trackHeartbeat: true,\n heartbeatInterval: 15000,\n ...config,\n };\n }\n\n public getVisitorId(): string | null {\n return this.visitorId;\n }\n\n public getSessionId(): string | null {\n return this.sessionId;\n }\n\n async init(): Promise<void> {\n // Get or create visitor ID\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n let id = localStorage.getItem('ib_visitor_id');\n if (!id) {\n id = this.generateId();\n localStorage.setItem('ib_visitor_id', id);\n }\n this.visitorId = id;\n\n // Track session\n await this.trackSession();\n\n // Set up heartbeat\n if (this.config.trackHeartbeat) {\n this.startHeartbeat();\n }\n\n // Set up click tracking\n if (this.config.trackClicks) {\n this.setupClickTracking();\n this.setupInteractionTracking();\n }\n\n // Set up disconnect listeners\n this.setupDisconnectListeners();\n }\n }\n\n async identify(userId: string, name?: string): Promise<void> {\n if (!userId) return;\n\n console.log(`[Analytics] Identifying user: ${userId}${name ? ` (${name})` : ''}`);\n const changed = this.config.externalUserId !== userId || this.config.externalUserName !== name;\n this.config.externalUserId = userId;\n this.config.externalUserName = name;\n\n if (changed && typeof window !== 'undefined') {\n // Re-track session to update externalUserId on backend\n await this.trackSession();\n }\n }\n\n private async request(path: string, payload: any, retries = 2): Promise<any> {\n const url = `${this.config.endpoint}${path}`;\n const body = JSON.stringify(payload);\n const headers = {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n };\n\n for (let i = 0; i <= retries; i++) {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n if (i === retries) {\n console.error(`[Analytics] Request failed after ${retries + 1} attempts:`, error);\n throw error;\n }\n const delay = Math.pow(2, i) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n private async trackSession(): Promise<void> {\n if (!this.visitorId) return;\n\n try {\n const data = await this.request('/track', {\n type: 'session',\n payload: {\n visitorId: this.visitorId,\n userAgent: navigator.userAgent,\n referrer: document.referrer,\n deviceType: this.getDeviceType(),\n browser: this.getBrowser(),\n os: this.getOS(),\n language: navigator.language,\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n segment: this.getSegment(),\n externalUserId: this.config.externalUserId,\n externalUserName: this.config.externalUserName,\n utmSource: this.config.utmSource || this.getUtmParam('utm_source'),\n utmMedium: this.config.utmMedium || this.getUtmParam('utm_medium'),\n utmCampaign: this.config.utmCampaign || this.getUtmParam('utm_campaign'),\n },\n });\n\n if (data?.id) {\n this.sessionId = data.id;\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('ib_v2_session_id', data.id);\n }\n }\n } catch (error) {\n console.error('[Analytics] trackSession error:', error);\n }\n }\n\n async trackEvent(name: string, category?: string, value?: string, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'event',\n payload: {\n sessionId: this.sessionId,\n name,\n category,\n value,\n metadata\n }\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n async trackPageView(path?: string, title?: string): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'pageview',\n payload: {\n sessionId: this.sessionId,\n url: window.location.href,\n path: path || window.location.pathname,\n title: title || document.title,\n referrer: document.referrer,\n },\n });\n } catch (error) {\n // Silently fail after retries\n }\n }\n\n private startHeartbeat(): void {\n const sendHeartbeat = async () => {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await fetch(`${this.config.endpoint}/track`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify({\n type: 'heartbeat',\n payload: { sessionId: this.sessionId },\n }),\n });\n } catch (error) {\n // Heartbeat failures are fine to ignore\n }\n };\n\n // Regular interval\n this.heartbeatInterval = setInterval(sendHeartbeat, this.config.heartbeatInterval);\n\n // Immediate heartbeat on tab focus to improve real-time pulse\n if (typeof window !== 'undefined' && window.addEventListener) {\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n sendHeartbeat();\n } else if (document.visibilityState === 'hidden') {\n // When tab is hidden, send one last heartbeat to ensure accuracy\n sendHeartbeat();\n }\n });\n }\n }\n\n private setupDisconnectListeners(): void {\n if (typeof window === 'undefined' || !window.addEventListener) return;\n\n // Use beforeunload to signal departure\n window.addEventListener('beforeunload', () => {\n this.disconnect();\n });\n\n // Some browsers prefer visibilitychange for tracking closure\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n // We don't disconnect on hidden (might be just tab switch), \n // but the backend timeout or beforeunload will handle the rest.\n // However, we could provide an option for strict real-time.\n }\n });\n }\n\n public async disconnect(): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n console.log('[Analytics] Disconnecting session:', this.sessionId);\n\n const url = `${this.config.endpoint}/track`;\n const payload = {\n type: 'disconnect',\n payload: { sessionId: this.sessionId }\n };\n\n try {\n // Use keepalive to ensure the request finishes even if page closes\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n } catch (error) {\n // Ignore disconnect errors\n }\n }\n\n private setupClickTracking(): void {\n if (typeof window === 'undefined') return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const interactive = target.closest('button, a, [role=\"button\"]');\n\n if (interactive) {\n const tag = interactive.tagName.toLowerCase();\n this.trackEvent(`click_${tag}`, 'interaction', undefined, {\n text: (interactive as any).innerText?.trim()?.slice(0, 50),\n id: interactive.id,\n path: window.location.pathname,\n });\n }\n };\n\n window.addEventListener('click', handleClick);\n }\n\n async trackInteraction(type: string, element: string, x?: number, y?: number, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n type,\n element,\n x: x || 0,\n y: y || 0,\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n path: typeof window !== 'undefined' ? window.location.pathname : '/',\n ...metadata\n },\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n private setupInteractionTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Track clicks\n const handleInteraction = (e: MouseEvent) => {\n if (!this.sessionId) return;\n\n const x = e.pageX;\n const y = e.pageY;\n const width = window.innerWidth;\n const target = e.target as HTMLElement;\n const selector = this.getSelector(target);\n\n // Calculation for centering accuracy: \n // We store the X relative to the center of the viewport.\n // This is crucial for centered layouts where margins change based on screen size.\n const centerX = width / 2;\n const relX = x - centerX;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: relX, // Store relative X\n y, // Y remains absolute (document relative)\n width,\n element: selector,\n path: window.location.pathname,\n type: 'click'\n },\n }).catch(() => { });\n };\n\n window.addEventListener('click', handleInteraction, { capture: true });\n\n // Track scroll depth\n let maxScrollDepth = 0;\n let scrollTimeout: NodeJS.Timeout;\n\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n if (!this.sessionId) return;\n\n const scrollDepth = Math.round((window.scrollY + window.innerHeight) / document.documentElement.scrollHeight * 100);\n\n if (scrollDepth > maxScrollDepth) {\n maxScrollDepth = scrollDepth;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: 0,\n y: window.scrollY,\n width: window.innerWidth,\n element: `scroll-depth-${scrollDepth}`,\n path: window.location.pathname,\n type: 'scroll'\n },\n }).catch(() => { });\n }\n }, 500);\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n private getSelector(el: HTMLElement): string {\n try {\n if (el.id) return `#${el.id}`;\n const path: string[] = [];\n let parent: HTMLElement | null = el;\n while (parent && parent.nodeType === Node.ELEMENT_NODE) {\n let selector = parent.nodeName.toLowerCase();\n if (parent.id) {\n selector += `#${parent.id}`;\n path.unshift(selector);\n break;\n } else {\n let sib = parent, nth = 1;\n while (sib = sib.previousElementSibling as HTMLElement) {\n if (sib.nodeName.toLowerCase() == selector) nth++;\n }\n if (nth != 1) selector += `:nth-of-type(${nth})`;\n }\n path.unshift(selector);\n parent = parent.parentElement;\n }\n return path.join(' > ');\n } catch (e) {\n return 'unknown';\n }\n }\n\n private getDeviceType(): string {\n if (typeof window === 'undefined') return 'desktop';\n const ua = navigator.userAgent.toLowerCase();\n\n const isMobile = /mobile|iphone|ipod|android|blackberry|opera mini|iemobile|wpdesktop/i.test(ua);\n // iPad Pro identifies as Macintosh but has touch points. \n const isDisguisedIOS = navigator.userAgent.includes('Macintosh') &&\n navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n const isTablet = /tablet|ipad|playbook|silk|(android(?!.*mobi))/i.test(ua) ||\n (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) >= 768);\n\n if (isTablet) return 'tablet';\n if (isMobile || (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) < 768)) return 'mobile';\n return 'desktop';\n }\n\n private getBrowser(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('Edg/') || ua.includes('Edg')) return 'Edge';\n if (ua.includes('OPR/') || ua.includes('Opera')) return 'Opera';\n if (ua.includes('Firefox') || ua.includes('FxiOS')) return 'Firefox';\n if (ua.includes('CriOS')) return 'Chrome';\n if (ua.includes('SamsungBrowser')) return 'Samsung Browser';\n if (ua.includes('Trident')) return 'Internet Explorer';\n if (ua.includes('Chrome')) return 'Chrome';\n if (ua.includes('Safari')) return 'Safari';\n return 'Unknown';\n }\n\n private getOS(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iPod')) return 'iOS';\n if (ua.includes('CrOS')) return 'ChromeOS';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('Mac OS') || ua.includes('Macintosh')) {\n // Only treat as iOS if it's a touch device and NOT reporting itself as a Mac platform usually.\n // On iPad, navigator.platform is 'MacIntel' but maxTouchPoints > 1.\n if (navigator.maxTouchPoints && navigator.maxTouchPoints > 1) return 'iOS';\n return 'Mac OS';\n }\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Linux')) return 'Linux';\n return 'Unknown';\n }\n\n private getSegment(): string {\n if (this.config.segment) return this.config.segment;\n\n if (typeof window !== 'undefined') {\n const path = window.location.pathname;\n if (path.includes('admin')) return 'admin';\n if (path.includes('investor')) return 'investor';\n if (path.includes('project-owner')) return 'project-owner';\n }\n\n return 'front';\n }\n\n private getUtmParam(param: string): string | undefined {\n if (typeof window === 'undefined') return undefined;\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param) || undefined;\n }\n\n private generateId(): string {\n // Simple UUID v4 generator\n return 'xxxxxxxx-xxxx-4xxx-yxxxxxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n destroy(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { AnalyticsClient } from './client';\nimport { AnalyticsConfig, AnalyticsContext } from './types';\n\nconst Context = createContext<AnalyticsContext | null>(null);\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n apiKey: string;\n endpoint: string;\n config?: Partial<AnalyticsConfig>;\n}\n\nexport function AnalyticsProvider({ children, apiKey, endpoint, config }: AnalyticsProviderProps) {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [visitorId, setVisitorId] = useState<string | null>(null);\n\n const client = useMemo(() => {\n return new AnalyticsClient({\n apiKey,\n endpoint,\n ...config,\n });\n }, [apiKey, endpoint, JSON.stringify(config)]);\n\n useEffect(() => {\n const init = async () => {\n await client.init();\n setVisitorId(client.getVisitorId());\n setSessionId(client.getSessionId());\n };\n\n init();\n\n return () => {\n client.destroy();\n };\n }, [client]);\n\n // Track page views automatically if enabled\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleRouteChange = () => {\n client.trackPageView();\n };\n\n // Track initial page load\n handleRouteChange();\n\n // Listen for history changes (SPA navigation)\n window.addEventListener('popstate', handleRouteChange);\n\n // Standard SPA routing often uses pushState/replaceState\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args);\n handleRouteChange();\n };\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n handleRouteChange();\n };\n\n return () => {\n window.removeEventListener('popstate', handleRouteChange);\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }, [client]);\n\n const contextValue = useMemo(() => ({\n trackEvent: client.trackEvent.bind(client),\n trackInteraction: client.trackInteraction.bind(client),\n identify: async (userId: string, name?: string) => {\n await client.identify(userId, name);\n setSessionId(client.getSessionId());\n },\n sessionId,\n visitorId\n }), [client, sessionId, visitorId]);\n\n return (\n <Context.Provider value={contextValue}>\n {children}\n </Context.Provider>\n );\n}\n\nexport function useAnalytics() {\n const context = useContext(Context);\n if (!context) {\n throw new Error('useAnalytics must be used within an AnalyticsProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/client.ts","../src/react.tsx"],"sourcesContent":["import { AnalyticsConfig } from './types';\n\nexport class AnalyticsClient {\n private config: AnalyticsConfig;\n private visitorId: string | null = null;\n private sessionId: string | null = null;\n private heartbeatInterval: NodeJS.Timeout | null = null;\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n trackPageViews: true,\n trackClicks: true,\n trackHeartbeat: true,\n heartbeatInterval: 15000,\n ...config,\n };\n }\n\n private safeStorage = {\n getItem: (key: string): string | null => {\n try {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return null;\n return localStorage.getItem(key);\n } catch (e) {\n return null;\n }\n },\n setItem: (key: string, value: string): void => {\n try {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n localStorage.setItem(key, value);\n } catch (e) {\n // Ignore\n }\n }\n };\n\n public getVisitorId(): string | null {\n return this.visitorId;\n }\n\n public getSessionId(): string | null {\n return this.sessionId;\n }\n\n async init(): Promise<void> {\n // Get or create visitor ID\n if (typeof window !== 'undefined') {\n let id = this.safeStorage.getItem('ib_visitor_id');\n if (!id) {\n id = this.generateId();\n this.safeStorage.setItem('ib_visitor_id', id);\n }\n this.visitorId = id;\n\n // Track session\n await this.trackSession();\n\n // Set up heartbeat\n if (this.config.trackHeartbeat) {\n this.startHeartbeat();\n }\n\n // Set up click tracking\n if (this.config.trackClicks) {\n this.setupClickTracking();\n this.setupInteractionTracking();\n }\n\n // Set up disconnect listeners\n this.setupDisconnectListeners();\n }\n }\n\n async identify(userId: string, name?: string): Promise<void> {\n if (!userId) return;\n\n console.log(`[Analytics] Identifying user: ${userId}${name ? ` (${name})` : ''}`);\n const changed = this.config.externalUserId !== userId || this.config.externalUserName !== name;\n this.config.externalUserId = userId;\n this.config.externalUserName = name;\n\n if (changed && typeof window !== 'undefined') {\n // Re-track session to update externalUserId on backend\n await this.trackSession();\n }\n }\n\n private async request(path: string, payload: any, retries = 2): Promise<any> {\n const url = `${this.config.endpoint}${path}`;\n const body = JSON.stringify(payload);\n const headers = {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n };\n\n for (let i = 0; i <= retries; i++) {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n if (i === retries) {\n console.error(`[Analytics] Request failed after ${retries + 1} attempts:`, error);\n throw error;\n }\n const delay = Math.pow(2, i) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n private async trackSession(): Promise<void> {\n if (!this.visitorId) return;\n\n try {\n const data = await this.request('/track', {\n type: 'session',\n payload: {\n visitorId: this.visitorId,\n userAgent: navigator.userAgent,\n referrer: document.referrer,\n deviceType: this.getDeviceType(),\n browser: this.getBrowser(),\n os: this.getOS(),\n language: navigator.language,\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n segment: this.getSegment(),\n externalUserId: this.config.externalUserId,\n externalUserName: this.config.externalUserName,\n utmSource: this.config.utmSource || this.getUtmParam('utm_source'),\n utmMedium: this.config.utmMedium || this.getUtmParam('utm_medium'),\n utmCampaign: this.config.utmCampaign || this.getUtmParam('utm_campaign'),\n },\n });\n\n if (data?.id) {\n this.sessionId = data.id;\n this.safeStorage.setItem('ib_v2_session_id', data.id);\n }\n } catch (error) {\n console.error('[Analytics] trackSession error:', error);\n }\n }\n\n async trackEvent(name: string, category?: string, value?: string, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'event',\n payload: {\n sessionId: this.sessionId,\n name,\n category,\n value,\n metadata\n }\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n async trackPageView(path?: string, title?: string): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'pageview',\n payload: {\n sessionId: this.sessionId,\n url: window.location.href,\n path: path || window.location.pathname,\n title: title || document.title,\n referrer: document.referrer,\n },\n });\n } catch (error) {\n // Silently fail after retries\n }\n }\n\n private startHeartbeat(): void {\n const sendHeartbeat = async () => {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await fetch(`${this.config.endpoint}/track`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify({\n type: 'heartbeat',\n payload: { sessionId: this.sessionId },\n }),\n });\n } catch (error) {\n // Heartbeat failures are fine to ignore\n }\n };\n\n // Regular interval\n this.heartbeatInterval = setInterval(sendHeartbeat, this.config.heartbeatInterval);\n\n // Immediate heartbeat on tab focus to improve real-time pulse\n if (typeof window !== 'undefined' && window.addEventListener) {\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n sendHeartbeat();\n } else if (document.visibilityState === 'hidden') {\n // When tab is hidden, send one last heartbeat to ensure accuracy\n sendHeartbeat();\n }\n });\n }\n }\n\n private setupDisconnectListeners(): void {\n if (typeof window === 'undefined' || !window.addEventListener) return;\n\n // Use beforeunload to signal departure\n window.addEventListener('beforeunload', () => {\n this.disconnect();\n });\n\n // Some browsers prefer visibilitychange for tracking closure\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n // We don't disconnect on hidden (might be just tab switch), \n // but the backend timeout or beforeunload will handle the rest.\n // However, we could provide an option for strict real-time.\n }\n });\n }\n\n public async disconnect(): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n console.log('[Analytics] Disconnecting session:', this.sessionId);\n\n const url = `${this.config.endpoint}/track`;\n const payload = {\n type: 'disconnect',\n payload: { sessionId: this.sessionId }\n };\n\n try {\n // Use keepalive to ensure the request finishes even if page closes\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n } catch (error) {\n // Ignore disconnect errors\n }\n }\n\n private setupClickTracking(): void {\n if (typeof window === 'undefined') return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const interactive = target.closest('button, a, [role=\"button\"]');\n\n if (interactive) {\n const tag = interactive.tagName.toLowerCase();\n this.trackEvent(`click_${tag}`, 'interaction', undefined, {\n text: (interactive as any).innerText?.trim()?.slice(0, 50),\n id: interactive.id,\n path: window.location.pathname,\n });\n }\n };\n\n window.addEventListener('click', handleClick);\n }\n\n async trackInteraction(type: string, element: string, x?: number, y?: number, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n type,\n element,\n x: x || 0,\n y: y || 0,\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n path: typeof window !== 'undefined' ? window.location.pathname : '/',\n ...metadata\n },\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n private setupInteractionTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Track clicks\n const handleInteraction = (e: MouseEvent) => {\n if (!this.sessionId) return;\n\n const x = e.pageX;\n const y = e.pageY;\n const width = window.innerWidth;\n const target = e.target as HTMLElement;\n const selector = this.getSelector(target);\n\n // Calculation for centering accuracy: \n // We store the X relative to the center of the viewport.\n // This is crucial for centered layouts where margins change based on screen size.\n const centerX = width / 2;\n const relX = x - centerX;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: relX, // Store relative X\n y, // Y remains absolute (document relative)\n width,\n element: selector,\n path: window.location.pathname,\n type: 'click'\n },\n }).catch(() => { });\n };\n\n window.addEventListener('click', handleInteraction, { capture: true });\n\n // Track scroll depth\n let maxScrollDepth = 0;\n let scrollTimeout: NodeJS.Timeout;\n\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n if (!this.sessionId) return;\n\n const scrollDepth = Math.round((window.scrollY + window.innerHeight) / document.documentElement.scrollHeight * 100);\n\n if (scrollDepth > maxScrollDepth) {\n maxScrollDepth = scrollDepth;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: 0,\n y: window.scrollY,\n width: window.innerWidth,\n element: `scroll-depth-${scrollDepth}`,\n path: window.location.pathname,\n type: 'scroll'\n },\n }).catch(() => { });\n }\n }, 500);\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n private getSelector(el: HTMLElement): string {\n try {\n if (el.id) return `#${el.id}`;\n const path: string[] = [];\n let parent: HTMLElement | null = el;\n while (parent && parent.nodeType === Node.ELEMENT_NODE) {\n let selector = parent.nodeName.toLowerCase();\n if (parent.id) {\n selector += `#${parent.id}`;\n path.unshift(selector);\n break;\n } else {\n let sib = parent, nth = 1;\n while (sib = sib.previousElementSibling as HTMLElement) {\n if (sib.nodeName.toLowerCase() == selector) nth++;\n }\n if (nth != 1) selector += `:nth-of-type(${nth})`;\n }\n path.unshift(selector);\n parent = parent.parentElement;\n }\n return path.join(' > ');\n } catch (e) {\n return 'unknown';\n }\n }\n\n private getDeviceType(): string {\n if (typeof window === 'undefined') return 'desktop';\n const ua = navigator.userAgent.toLowerCase();\n\n const isMobile = /mobile|iphone|ipod|android|blackberry|opera mini|iemobile|wpdesktop/i.test(ua);\n // iPad Pro identifies as Macintosh but has touch points. \n const isDisguisedIOS = navigator.userAgent.includes('Macintosh') &&\n navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n const isTablet = /tablet|ipad|playbook|silk|(android(?!.*mobi))/i.test(ua) ||\n (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) >= 768);\n\n if (isTablet) return 'tablet';\n if (isMobile || (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) < 768)) return 'mobile';\n return 'desktop';\n }\n\n private getBrowser(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('Edg/') || ua.includes('Edg')) return 'Edge';\n if (ua.includes('OPR/') || ua.includes('Opera')) return 'Opera';\n if (ua.includes('Firefox') || ua.includes('FxiOS')) return 'Firefox';\n if (ua.includes('CriOS')) return 'Chrome';\n if (ua.includes('SamsungBrowser')) return 'Samsung Browser';\n if (ua.includes('Trident')) return 'Internet Explorer';\n if (ua.includes('Chrome')) return 'Chrome';\n if (ua.includes('Safari')) return 'Safari';\n return 'Unknown';\n }\n\n private getOS(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iPod')) return 'iOS';\n if (ua.includes('CrOS')) return 'ChromeOS';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('Mac OS') || ua.includes('Macintosh')) {\n // Only treat as iOS if it's a touch device and NOT reporting itself as a Mac platform usually.\n // On iPad, navigator.platform is 'MacIntel' but maxTouchPoints > 1.\n if (navigator.maxTouchPoints && navigator.maxTouchPoints > 1) return 'iOS';\n return 'Mac OS';\n }\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Linux')) return 'Linux';\n return 'Unknown';\n }\n\n private getSegment(): string {\n if (this.config.segment) return this.config.segment;\n\n if (typeof window !== 'undefined') {\n const path = window.location.pathname;\n if (path.includes('admin')) return 'admin';\n if (path.includes('investor')) return 'investor';\n if (path.includes('project-owner')) return 'project-owner';\n }\n\n return 'front';\n }\n\n private getUtmParam(param: string): string | undefined {\n if (typeof window === 'undefined') return undefined;\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param) || undefined;\n }\n\n private generateId(): string {\n // Simple UUID v4 generator\n return 'xxxxxxxx-xxxx-4xxx-yxxxxxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n destroy(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { AnalyticsClient } from './client';\nimport { AnalyticsConfig, AnalyticsContext } from './types';\n\nconst Context = createContext<AnalyticsContext | null>(null);\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n apiKey: string;\n endpoint: string;\n config?: Partial<AnalyticsConfig>;\n}\n\nexport function AnalyticsProvider({ children, apiKey, endpoint, config }: AnalyticsProviderProps) {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [visitorId, setVisitorId] = useState<string | null>(null);\n\n const client = useMemo(() => {\n return new AnalyticsClient({\n apiKey,\n endpoint,\n ...config,\n });\n }, [apiKey, endpoint, JSON.stringify(config)]);\n\n useEffect(() => {\n const init = async () => {\n await client.init();\n setVisitorId(client.getVisitorId());\n setSessionId(client.getSessionId());\n };\n\n init();\n\n return () => {\n client.destroy();\n };\n }, [client]);\n\n // Track page views automatically if enabled\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleRouteChange = () => {\n client.trackPageView();\n };\n\n // Track initial page load\n handleRouteChange();\n\n // Listen for history changes (SPA navigation)\n window.addEventListener('popstate', handleRouteChange);\n\n // Standard SPA routing often uses pushState/replaceState\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args);\n handleRouteChange();\n };\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n handleRouteChange();\n };\n\n return () => {\n window.removeEventListener('popstate', handleRouteChange);\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }, [client]);\n\n const contextValue = useMemo(() => ({\n trackEvent: client.trackEvent.bind(client),\n trackInteraction: client.trackInteraction.bind(client),\n identify: async (userId: string, name?: string) => {\n await client.identify(userId, name);\n setSessionId(client.getSessionId());\n },\n sessionId,\n visitorId\n }), [client, sessionId, visitorId]);\n\n return (\n <Context.Provider value={contextValue}>\n {children}\n </Context.Provider>\n );\n}\n\nexport function useAnalytics() {\n const context = useContext(Context);\n if (!context) {\n throw new Error('useAnalytics must be used within an AnalyticsProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,6 +7,28 @@ class AnalyticsClient {
7
7
  this.visitorId = null;
8
8
  this.sessionId = null;
9
9
  this.heartbeatInterval = null;
10
+ this.safeStorage = {
11
+ getItem: (key) => {
12
+ try {
13
+ if (typeof window === 'undefined' || typeof localStorage === 'undefined')
14
+ return null;
15
+ return localStorage.getItem(key);
16
+ }
17
+ catch (e) {
18
+ return null;
19
+ }
20
+ },
21
+ setItem: (key, value) => {
22
+ try {
23
+ if (typeof window === 'undefined' || typeof localStorage === 'undefined')
24
+ return;
25
+ localStorage.setItem(key, value);
26
+ }
27
+ catch (e) {
28
+ // Ignore
29
+ }
30
+ }
31
+ };
10
32
  this.config = {
11
33
  trackPageViews: true,
12
34
  trackClicks: true,
@@ -23,11 +45,11 @@ class AnalyticsClient {
23
45
  }
24
46
  async init() {
25
47
  // Get or create visitor ID
26
- if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {
27
- let id = localStorage.getItem('ib_visitor_id');
48
+ if (typeof window !== 'undefined') {
49
+ let id = this.safeStorage.getItem('ib_visitor_id');
28
50
  if (!id) {
29
51
  id = this.generateId();
30
- localStorage.setItem('ib_visitor_id', id);
52
+ this.safeStorage.setItem('ib_visitor_id', id);
31
53
  }
32
54
  this.visitorId = id;
33
55
  // Track session
@@ -112,9 +134,7 @@ class AnalyticsClient {
112
134
  });
113
135
  if (data?.id) {
114
136
  this.sessionId = data.id;
115
- if (typeof localStorage !== 'undefined') {
116
- localStorage.setItem('ib_v2_session_id', data.id);
117
- }
137
+ this.safeStorage.setItem('ib_v2_session_id', data.id);
118
138
  }
119
139
  }
120
140
  catch (error) {
@@ -123,7 +143,7 @@ class AnalyticsClient {
123
143
  }
124
144
  async trackEvent(name, category, value, metadata) {
125
145
  if (!this.sessionId && typeof window !== 'undefined') {
126
- this.sessionId = localStorage.getItem('ib_v2_session_id');
146
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
127
147
  }
128
148
  if (!this.sessionId)
129
149
  return;
@@ -145,7 +165,7 @@ class AnalyticsClient {
145
165
  }
146
166
  async trackPageView(path, title) {
147
167
  if (!this.sessionId && typeof window !== 'undefined') {
148
- this.sessionId = localStorage.getItem('ib_v2_session_id');
168
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
149
169
  }
150
170
  if (!this.sessionId)
151
171
  return;
@@ -168,7 +188,7 @@ class AnalyticsClient {
168
188
  startHeartbeat() {
169
189
  const sendHeartbeat = async () => {
170
190
  if (!this.sessionId && typeof window !== 'undefined') {
171
- this.sessionId = localStorage.getItem('ib_v2_session_id');
191
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
172
192
  }
173
193
  if (!this.sessionId)
174
194
  return;
@@ -217,7 +237,7 @@ class AnalyticsClient {
217
237
  }
218
238
  async disconnect() {
219
239
  if (!this.sessionId && typeof window !== 'undefined') {
220
- this.sessionId = localStorage.getItem('ib_v2_session_id');
240
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
221
241
  }
222
242
  if (!this.sessionId)
223
243
  return;
@@ -262,7 +282,7 @@ class AnalyticsClient {
262
282
  }
263
283
  async trackInteraction(type, element, x, y, metadata) {
264
284
  if (!this.sessionId && typeof window !== 'undefined') {
265
- this.sessionId = localStorage.getItem('ib_v2_session_id');
285
+ this.sessionId = this.safeStorage.getItem('ib_v2_session_id');
266
286
  }
267
287
  if (!this.sessionId)
268
288
  return;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/client.ts","../src/react.tsx"],"sourcesContent":["import { AnalyticsConfig } from './types';\n\nexport class AnalyticsClient {\n private config: AnalyticsConfig;\n private visitorId: string | null = null;\n private sessionId: string | null = null;\n private heartbeatInterval: NodeJS.Timeout | null = null;\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n trackPageViews: true,\n trackClicks: true,\n trackHeartbeat: true,\n heartbeatInterval: 15000,\n ...config,\n };\n }\n\n public getVisitorId(): string | null {\n return this.visitorId;\n }\n\n public getSessionId(): string | null {\n return this.sessionId;\n }\n\n async init(): Promise<void> {\n // Get or create visitor ID\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n let id = localStorage.getItem('ib_visitor_id');\n if (!id) {\n id = this.generateId();\n localStorage.setItem('ib_visitor_id', id);\n }\n this.visitorId = id;\n\n // Track session\n await this.trackSession();\n\n // Set up heartbeat\n if (this.config.trackHeartbeat) {\n this.startHeartbeat();\n }\n\n // Set up click tracking\n if (this.config.trackClicks) {\n this.setupClickTracking();\n this.setupInteractionTracking();\n }\n\n // Set up disconnect listeners\n this.setupDisconnectListeners();\n }\n }\n\n async identify(userId: string, name?: string): Promise<void> {\n if (!userId) return;\n\n console.log(`[Analytics] Identifying user: ${userId}${name ? ` (${name})` : ''}`);\n const changed = this.config.externalUserId !== userId || this.config.externalUserName !== name;\n this.config.externalUserId = userId;\n this.config.externalUserName = name;\n\n if (changed && typeof window !== 'undefined') {\n // Re-track session to update externalUserId on backend\n await this.trackSession();\n }\n }\n\n private async request(path: string, payload: any, retries = 2): Promise<any> {\n const url = `${this.config.endpoint}${path}`;\n const body = JSON.stringify(payload);\n const headers = {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n };\n\n for (let i = 0; i <= retries; i++) {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n if (i === retries) {\n console.error(`[Analytics] Request failed after ${retries + 1} attempts:`, error);\n throw error;\n }\n const delay = Math.pow(2, i) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n private async trackSession(): Promise<void> {\n if (!this.visitorId) return;\n\n try {\n const data = await this.request('/track', {\n type: 'session',\n payload: {\n visitorId: this.visitorId,\n userAgent: navigator.userAgent,\n referrer: document.referrer,\n deviceType: this.getDeviceType(),\n browser: this.getBrowser(),\n os: this.getOS(),\n language: navigator.language,\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n segment: this.getSegment(),\n externalUserId: this.config.externalUserId,\n externalUserName: this.config.externalUserName,\n utmSource: this.config.utmSource || this.getUtmParam('utm_source'),\n utmMedium: this.config.utmMedium || this.getUtmParam('utm_medium'),\n utmCampaign: this.config.utmCampaign || this.getUtmParam('utm_campaign'),\n },\n });\n\n if (data?.id) {\n this.sessionId = data.id;\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('ib_v2_session_id', data.id);\n }\n }\n } catch (error) {\n console.error('[Analytics] trackSession error:', error);\n }\n }\n\n async trackEvent(name: string, category?: string, value?: string, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'event',\n payload: {\n sessionId: this.sessionId,\n name,\n category,\n value,\n metadata\n }\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n async trackPageView(path?: string, title?: string): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'pageview',\n payload: {\n sessionId: this.sessionId,\n url: window.location.href,\n path: path || window.location.pathname,\n title: title || document.title,\n referrer: document.referrer,\n },\n });\n } catch (error) {\n // Silently fail after retries\n }\n }\n\n private startHeartbeat(): void {\n const sendHeartbeat = async () => {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await fetch(`${this.config.endpoint}/track`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify({\n type: 'heartbeat',\n payload: { sessionId: this.sessionId },\n }),\n });\n } catch (error) {\n // Heartbeat failures are fine to ignore\n }\n };\n\n // Regular interval\n this.heartbeatInterval = setInterval(sendHeartbeat, this.config.heartbeatInterval);\n\n // Immediate heartbeat on tab focus to improve real-time pulse\n if (typeof window !== 'undefined' && window.addEventListener) {\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n sendHeartbeat();\n } else if (document.visibilityState === 'hidden') {\n // When tab is hidden, send one last heartbeat to ensure accuracy\n sendHeartbeat();\n }\n });\n }\n }\n\n private setupDisconnectListeners(): void {\n if (typeof window === 'undefined' || !window.addEventListener) return;\n\n // Use beforeunload to signal departure\n window.addEventListener('beforeunload', () => {\n this.disconnect();\n });\n\n // Some browsers prefer visibilitychange for tracking closure\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n // We don't disconnect on hidden (might be just tab switch), \n // but the backend timeout or beforeunload will handle the rest.\n // However, we could provide an option for strict real-time.\n }\n });\n }\n\n public async disconnect(): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n console.log('[Analytics] Disconnecting session:', this.sessionId);\n\n const url = `${this.config.endpoint}/track`;\n const payload = {\n type: 'disconnect',\n payload: { sessionId: this.sessionId }\n };\n\n try {\n // Use keepalive to ensure the request finishes even if page closes\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n } catch (error) {\n // Ignore disconnect errors\n }\n }\n\n private setupClickTracking(): void {\n if (typeof window === 'undefined') return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const interactive = target.closest('button, a, [role=\"button\"]');\n\n if (interactive) {\n const tag = interactive.tagName.toLowerCase();\n this.trackEvent(`click_${tag}`, 'interaction', undefined, {\n text: (interactive as any).innerText?.trim()?.slice(0, 50),\n id: interactive.id,\n path: window.location.pathname,\n });\n }\n };\n\n window.addEventListener('click', handleClick);\n }\n\n async trackInteraction(type: string, element: string, x?: number, y?: number, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = localStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n type,\n element,\n x: x || 0,\n y: y || 0,\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n path: typeof window !== 'undefined' ? window.location.pathname : '/',\n ...metadata\n },\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n private setupInteractionTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Track clicks\n const handleInteraction = (e: MouseEvent) => {\n if (!this.sessionId) return;\n\n const x = e.pageX;\n const y = e.pageY;\n const width = window.innerWidth;\n const target = e.target as HTMLElement;\n const selector = this.getSelector(target);\n\n // Calculation for centering accuracy: \n // We store the X relative to the center of the viewport.\n // This is crucial for centered layouts where margins change based on screen size.\n const centerX = width / 2;\n const relX = x - centerX;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: relX, // Store relative X\n y, // Y remains absolute (document relative)\n width,\n element: selector,\n path: window.location.pathname,\n type: 'click'\n },\n }).catch(() => { });\n };\n\n window.addEventListener('click', handleInteraction, { capture: true });\n\n // Track scroll depth\n let maxScrollDepth = 0;\n let scrollTimeout: NodeJS.Timeout;\n\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n if (!this.sessionId) return;\n\n const scrollDepth = Math.round((window.scrollY + window.innerHeight) / document.documentElement.scrollHeight * 100);\n\n if (scrollDepth > maxScrollDepth) {\n maxScrollDepth = scrollDepth;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: 0,\n y: window.scrollY,\n width: window.innerWidth,\n element: `scroll-depth-${scrollDepth}`,\n path: window.location.pathname,\n type: 'scroll'\n },\n }).catch(() => { });\n }\n }, 500);\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n private getSelector(el: HTMLElement): string {\n try {\n if (el.id) return `#${el.id}`;\n const path: string[] = [];\n let parent: HTMLElement | null = el;\n while (parent && parent.nodeType === Node.ELEMENT_NODE) {\n let selector = parent.nodeName.toLowerCase();\n if (parent.id) {\n selector += `#${parent.id}`;\n path.unshift(selector);\n break;\n } else {\n let sib = parent, nth = 1;\n while (sib = sib.previousElementSibling as HTMLElement) {\n if (sib.nodeName.toLowerCase() == selector) nth++;\n }\n if (nth != 1) selector += `:nth-of-type(${nth})`;\n }\n path.unshift(selector);\n parent = parent.parentElement;\n }\n return path.join(' > ');\n } catch (e) {\n return 'unknown';\n }\n }\n\n private getDeviceType(): string {\n if (typeof window === 'undefined') return 'desktop';\n const ua = navigator.userAgent.toLowerCase();\n\n const isMobile = /mobile|iphone|ipod|android|blackberry|opera mini|iemobile|wpdesktop/i.test(ua);\n // iPad Pro identifies as Macintosh but has touch points. \n const isDisguisedIOS = navigator.userAgent.includes('Macintosh') &&\n navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n const isTablet = /tablet|ipad|playbook|silk|(android(?!.*mobi))/i.test(ua) ||\n (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) >= 768);\n\n if (isTablet) return 'tablet';\n if (isMobile || (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) < 768)) return 'mobile';\n return 'desktop';\n }\n\n private getBrowser(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('Edg/') || ua.includes('Edg')) return 'Edge';\n if (ua.includes('OPR/') || ua.includes('Opera')) return 'Opera';\n if (ua.includes('Firefox') || ua.includes('FxiOS')) return 'Firefox';\n if (ua.includes('CriOS')) return 'Chrome';\n if (ua.includes('SamsungBrowser')) return 'Samsung Browser';\n if (ua.includes('Trident')) return 'Internet Explorer';\n if (ua.includes('Chrome')) return 'Chrome';\n if (ua.includes('Safari')) return 'Safari';\n return 'Unknown';\n }\n\n private getOS(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iPod')) return 'iOS';\n if (ua.includes('CrOS')) return 'ChromeOS';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('Mac OS') || ua.includes('Macintosh')) {\n // Only treat as iOS if it's a touch device and NOT reporting itself as a Mac platform usually.\n // On iPad, navigator.platform is 'MacIntel' but maxTouchPoints > 1.\n if (navigator.maxTouchPoints && navigator.maxTouchPoints > 1) return 'iOS';\n return 'Mac OS';\n }\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Linux')) return 'Linux';\n return 'Unknown';\n }\n\n private getSegment(): string {\n if (this.config.segment) return this.config.segment;\n\n if (typeof window !== 'undefined') {\n const path = window.location.pathname;\n if (path.includes('admin')) return 'admin';\n if (path.includes('investor')) return 'investor';\n if (path.includes('project-owner')) return 'project-owner';\n }\n\n return 'front';\n }\n\n private getUtmParam(param: string): string | undefined {\n if (typeof window === 'undefined') return undefined;\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param) || undefined;\n }\n\n private generateId(): string {\n // Simple UUID v4 generator\n return 'xxxxxxxx-xxxx-4xxx-yxxxxxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n destroy(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { AnalyticsClient } from './client';\nimport { AnalyticsConfig, AnalyticsContext } from './types';\n\nconst Context = createContext<AnalyticsContext | null>(null);\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n apiKey: string;\n endpoint: string;\n config?: Partial<AnalyticsConfig>;\n}\n\nexport function AnalyticsProvider({ children, apiKey, endpoint, config }: AnalyticsProviderProps) {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [visitorId, setVisitorId] = useState<string | null>(null);\n\n const client = useMemo(() => {\n return new AnalyticsClient({\n apiKey,\n endpoint,\n ...config,\n });\n }, [apiKey, endpoint, JSON.stringify(config)]);\n\n useEffect(() => {\n const init = async () => {\n await client.init();\n setVisitorId(client.getVisitorId());\n setSessionId(client.getSessionId());\n };\n\n init();\n\n return () => {\n client.destroy();\n };\n }, [client]);\n\n // Track page views automatically if enabled\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleRouteChange = () => {\n client.trackPageView();\n };\n\n // Track initial page load\n handleRouteChange();\n\n // Listen for history changes (SPA navigation)\n window.addEventListener('popstate', handleRouteChange);\n\n // Standard SPA routing often uses pushState/replaceState\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args);\n handleRouteChange();\n };\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n handleRouteChange();\n };\n\n return () => {\n window.removeEventListener('popstate', handleRouteChange);\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }, [client]);\n\n const contextValue = useMemo(() => ({\n trackEvent: client.trackEvent.bind(client),\n trackInteraction: client.trackInteraction.bind(client),\n identify: async (userId: string, name?: string) => {\n await client.identify(userId, name);\n setSessionId(client.getSessionId());\n },\n sessionId,\n visitorId\n }), [client, sessionId, visitorId]);\n\n return (\n <Context.Provider value={contextValue}>\n {children}\n </Context.Provider>\n );\n}\n\nexport function useAnalytics() {\n const context = useContext(Context);\n if (!context) {\n throw new Error('useAnalytics must be used within an AnalyticsProvider');\n }\n return context;\n}\n"],"names":["createContext","useState","useMemo","useEffect","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/client.ts","../src/react.tsx"],"sourcesContent":["import { AnalyticsConfig } from './types';\n\nexport class AnalyticsClient {\n private config: AnalyticsConfig;\n private visitorId: string | null = null;\n private sessionId: string | null = null;\n private heartbeatInterval: NodeJS.Timeout | null = null;\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n trackPageViews: true,\n trackClicks: true,\n trackHeartbeat: true,\n heartbeatInterval: 15000,\n ...config,\n };\n }\n\n private safeStorage = {\n getItem: (key: string): string | null => {\n try {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return null;\n return localStorage.getItem(key);\n } catch (e) {\n return null;\n }\n },\n setItem: (key: string, value: string): void => {\n try {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') return;\n localStorage.setItem(key, value);\n } catch (e) {\n // Ignore\n }\n }\n };\n\n public getVisitorId(): string | null {\n return this.visitorId;\n }\n\n public getSessionId(): string | null {\n return this.sessionId;\n }\n\n async init(): Promise<void> {\n // Get or create visitor ID\n if (typeof window !== 'undefined') {\n let id = this.safeStorage.getItem('ib_visitor_id');\n if (!id) {\n id = this.generateId();\n this.safeStorage.setItem('ib_visitor_id', id);\n }\n this.visitorId = id;\n\n // Track session\n await this.trackSession();\n\n // Set up heartbeat\n if (this.config.trackHeartbeat) {\n this.startHeartbeat();\n }\n\n // Set up click tracking\n if (this.config.trackClicks) {\n this.setupClickTracking();\n this.setupInteractionTracking();\n }\n\n // Set up disconnect listeners\n this.setupDisconnectListeners();\n }\n }\n\n async identify(userId: string, name?: string): Promise<void> {\n if (!userId) return;\n\n console.log(`[Analytics] Identifying user: ${userId}${name ? ` (${name})` : ''}`);\n const changed = this.config.externalUserId !== userId || this.config.externalUserName !== name;\n this.config.externalUserId = userId;\n this.config.externalUserName = name;\n\n if (changed && typeof window !== 'undefined') {\n // Re-track session to update externalUserId on backend\n await this.trackSession();\n }\n }\n\n private async request(path: string, payload: any, retries = 2): Promise<any> {\n const url = `${this.config.endpoint}${path}`;\n const body = JSON.stringify(payload);\n const headers = {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n };\n\n for (let i = 0; i <= retries; i++) {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return await response.json();\n } catch (error) {\n if (i === retries) {\n console.error(`[Analytics] Request failed after ${retries + 1} attempts:`, error);\n throw error;\n }\n const delay = Math.pow(2, i) * 1000;\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n private async trackSession(): Promise<void> {\n if (!this.visitorId) return;\n\n try {\n const data = await this.request('/track', {\n type: 'session',\n payload: {\n visitorId: this.visitorId,\n userAgent: navigator.userAgent,\n referrer: document.referrer,\n deviceType: this.getDeviceType(),\n browser: this.getBrowser(),\n os: this.getOS(),\n language: navigator.language,\n screenWidth: window.screen.width,\n screenHeight: window.screen.height,\n segment: this.getSegment(),\n externalUserId: this.config.externalUserId,\n externalUserName: this.config.externalUserName,\n utmSource: this.config.utmSource || this.getUtmParam('utm_source'),\n utmMedium: this.config.utmMedium || this.getUtmParam('utm_medium'),\n utmCampaign: this.config.utmCampaign || this.getUtmParam('utm_campaign'),\n },\n });\n\n if (data?.id) {\n this.sessionId = data.id;\n this.safeStorage.setItem('ib_v2_session_id', data.id);\n }\n } catch (error) {\n console.error('[Analytics] trackSession error:', error);\n }\n }\n\n async trackEvent(name: string, category?: string, value?: string, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'event',\n payload: {\n sessionId: this.sessionId,\n name,\n category,\n value,\n metadata\n }\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n async trackPageView(path?: string, title?: string): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'pageview',\n payload: {\n sessionId: this.sessionId,\n url: window.location.href,\n path: path || window.location.pathname,\n title: title || document.title,\n referrer: document.referrer,\n },\n });\n } catch (error) {\n // Silently fail after retries\n }\n }\n\n private startHeartbeat(): void {\n const sendHeartbeat = async () => {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await fetch(`${this.config.endpoint}/track`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify({\n type: 'heartbeat',\n payload: { sessionId: this.sessionId },\n }),\n });\n } catch (error) {\n // Heartbeat failures are fine to ignore\n }\n };\n\n // Regular interval\n this.heartbeatInterval = setInterval(sendHeartbeat, this.config.heartbeatInterval);\n\n // Immediate heartbeat on tab focus to improve real-time pulse\n if (typeof window !== 'undefined' && window.addEventListener) {\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'visible') {\n sendHeartbeat();\n } else if (document.visibilityState === 'hidden') {\n // When tab is hidden, send one last heartbeat to ensure accuracy\n sendHeartbeat();\n }\n });\n }\n }\n\n private setupDisconnectListeners(): void {\n if (typeof window === 'undefined' || !window.addEventListener) return;\n\n // Use beforeunload to signal departure\n window.addEventListener('beforeunload', () => {\n this.disconnect();\n });\n\n // Some browsers prefer visibilitychange for tracking closure\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n // We don't disconnect on hidden (might be just tab switch), \n // but the backend timeout or beforeunload will handle the rest.\n // However, we could provide an option for strict real-time.\n }\n });\n }\n\n public async disconnect(): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n console.log('[Analytics] Disconnecting session:', this.sessionId);\n\n const url = `${this.config.endpoint}/track`;\n const payload = {\n type: 'disconnect',\n payload: { sessionId: this.sessionId }\n };\n\n try {\n // Use keepalive to ensure the request finishes even if page closes\n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-tenant-key': this.config.apiKey,\n },\n body: JSON.stringify(payload),\n keepalive: true,\n });\n } catch (error) {\n // Ignore disconnect errors\n }\n }\n\n private setupClickTracking(): void {\n if (typeof window === 'undefined') return;\n\n const handleClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n const interactive = target.closest('button, a, [role=\"button\"]');\n\n if (interactive) {\n const tag = interactive.tagName.toLowerCase();\n this.trackEvent(`click_${tag}`, 'interaction', undefined, {\n text: (interactive as any).innerText?.trim()?.slice(0, 50),\n id: interactive.id,\n path: window.location.pathname,\n });\n }\n };\n\n window.addEventListener('click', handleClick);\n }\n\n async trackInteraction(type: string, element: string, x?: number, y?: number, metadata?: Record<string, any>): Promise<void> {\n if (!this.sessionId && typeof window !== 'undefined') {\n this.sessionId = this.safeStorage.getItem('ib_v2_session_id');\n }\n if (!this.sessionId) return;\n\n try {\n await this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n type,\n element,\n x: x || 0,\n y: y || 0,\n width: typeof window !== 'undefined' ? window.innerWidth : 0,\n path: typeof window !== 'undefined' ? window.location.pathname : '/',\n ...metadata\n },\n });\n } catch (error) {\n // Silently fail\n }\n }\n\n private setupInteractionTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Track clicks\n const handleInteraction = (e: MouseEvent) => {\n if (!this.sessionId) return;\n\n const x = e.pageX;\n const y = e.pageY;\n const width = window.innerWidth;\n const target = e.target as HTMLElement;\n const selector = this.getSelector(target);\n\n // Calculation for centering accuracy: \n // We store the X relative to the center of the viewport.\n // This is crucial for centered layouts where margins change based on screen size.\n const centerX = width / 2;\n const relX = x - centerX;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: relX, // Store relative X\n y, // Y remains absolute (document relative)\n width,\n element: selector,\n path: window.location.pathname,\n type: 'click'\n },\n }).catch(() => { });\n };\n\n window.addEventListener('click', handleInteraction, { capture: true });\n\n // Track scroll depth\n let maxScrollDepth = 0;\n let scrollTimeout: NodeJS.Timeout;\n\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n if (!this.sessionId) return;\n\n const scrollDepth = Math.round((window.scrollY + window.innerHeight) / document.documentElement.scrollHeight * 100);\n\n if (scrollDepth > maxScrollDepth) {\n maxScrollDepth = scrollDepth;\n\n this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x: 0,\n y: window.scrollY,\n width: window.innerWidth,\n element: `scroll-depth-${scrollDepth}`,\n path: window.location.pathname,\n type: 'scroll'\n },\n }).catch(() => { });\n }\n }, 500);\n };\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n private getSelector(el: HTMLElement): string {\n try {\n if (el.id) return `#${el.id}`;\n const path: string[] = [];\n let parent: HTMLElement | null = el;\n while (parent && parent.nodeType === Node.ELEMENT_NODE) {\n let selector = parent.nodeName.toLowerCase();\n if (parent.id) {\n selector += `#${parent.id}`;\n path.unshift(selector);\n break;\n } else {\n let sib = parent, nth = 1;\n while (sib = sib.previousElementSibling as HTMLElement) {\n if (sib.nodeName.toLowerCase() == selector) nth++;\n }\n if (nth != 1) selector += `:nth-of-type(${nth})`;\n }\n path.unshift(selector);\n parent = parent.parentElement;\n }\n return path.join(' > ');\n } catch (e) {\n return 'unknown';\n }\n }\n\n private getDeviceType(): string {\n if (typeof window === 'undefined') return 'desktop';\n const ua = navigator.userAgent.toLowerCase();\n\n const isMobile = /mobile|iphone|ipod|android|blackberry|opera mini|iemobile|wpdesktop/i.test(ua);\n // iPad Pro identifies as Macintosh but has touch points. \n const isDisguisedIOS = navigator.userAgent.includes('Macintosh') &&\n navigator.maxTouchPoints && navigator.maxTouchPoints > 1;\n\n const isTablet = /tablet|ipad|playbook|silk|(android(?!.*mobi))/i.test(ua) ||\n (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) >= 768);\n\n if (isTablet) return 'tablet';\n if (isMobile || (isDisguisedIOS && Math.max(window.screen.width, window.screen.height) < 768)) return 'mobile';\n return 'desktop';\n }\n\n private getBrowser(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('Edg/') || ua.includes('Edg')) return 'Edge';\n if (ua.includes('OPR/') || ua.includes('Opera')) return 'Opera';\n if (ua.includes('Firefox') || ua.includes('FxiOS')) return 'Firefox';\n if (ua.includes('CriOS')) return 'Chrome';\n if (ua.includes('SamsungBrowser')) return 'Samsung Browser';\n if (ua.includes('Trident')) return 'Internet Explorer';\n if (ua.includes('Chrome')) return 'Chrome';\n if (ua.includes('Safari')) return 'Safari';\n return 'Unknown';\n }\n\n private getOS(): string {\n if (typeof window === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n\n if (ua.includes('iPhone') || ua.includes('iPad') || ua.includes('iPod')) return 'iOS';\n if (ua.includes('CrOS')) return 'ChromeOS';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('Mac OS') || ua.includes('Macintosh')) {\n // Only treat as iOS if it's a touch device and NOT reporting itself as a Mac platform usually.\n // On iPad, navigator.platform is 'MacIntel' but maxTouchPoints > 1.\n if (navigator.maxTouchPoints && navigator.maxTouchPoints > 1) return 'iOS';\n return 'Mac OS';\n }\n if (ua.includes('Windows')) return 'Windows';\n if (ua.includes('Linux')) return 'Linux';\n return 'Unknown';\n }\n\n private getSegment(): string {\n if (this.config.segment) return this.config.segment;\n\n if (typeof window !== 'undefined') {\n const path = window.location.pathname;\n if (path.includes('admin')) return 'admin';\n if (path.includes('investor')) return 'investor';\n if (path.includes('project-owner')) return 'project-owner';\n }\n\n return 'front';\n }\n\n private getUtmParam(param: string): string | undefined {\n if (typeof window === 'undefined') return undefined;\n const urlParams = new URLSearchParams(window.location.search);\n return urlParams.get(param) || undefined;\n }\n\n private generateId(): string {\n // Simple UUID v4 generator\n return 'xxxxxxxx-xxxx-4xxx-yxxxxxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n destroy(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { AnalyticsClient } from './client';\nimport { AnalyticsConfig, AnalyticsContext } from './types';\n\nconst Context = createContext<AnalyticsContext | null>(null);\n\nexport interface AnalyticsProviderProps {\n children: React.ReactNode;\n apiKey: string;\n endpoint: string;\n config?: Partial<AnalyticsConfig>;\n}\n\nexport function AnalyticsProvider({ children, apiKey, endpoint, config }: AnalyticsProviderProps) {\n const [sessionId, setSessionId] = useState<string | null>(null);\n const [visitorId, setVisitorId] = useState<string | null>(null);\n\n const client = useMemo(() => {\n return new AnalyticsClient({\n apiKey,\n endpoint,\n ...config,\n });\n }, [apiKey, endpoint, JSON.stringify(config)]);\n\n useEffect(() => {\n const init = async () => {\n await client.init();\n setVisitorId(client.getVisitorId());\n setSessionId(client.getSessionId());\n };\n\n init();\n\n return () => {\n client.destroy();\n };\n }, [client]);\n\n // Track page views automatically if enabled\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const handleRouteChange = () => {\n client.trackPageView();\n };\n\n // Track initial page load\n handleRouteChange();\n\n // Listen for history changes (SPA navigation)\n window.addEventListener('popstate', handleRouteChange);\n\n // Standard SPA routing often uses pushState/replaceState\n const originalPushState = window.history.pushState;\n const originalReplaceState = window.history.replaceState;\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args);\n handleRouteChange();\n };\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args);\n handleRouteChange();\n };\n\n return () => {\n window.removeEventListener('popstate', handleRouteChange);\n window.history.pushState = originalPushState;\n window.history.replaceState = originalReplaceState;\n };\n }, [client]);\n\n const contextValue = useMemo(() => ({\n trackEvent: client.trackEvent.bind(client),\n trackInteraction: client.trackInteraction.bind(client),\n identify: async (userId: string, name?: string) => {\n await client.identify(userId, name);\n setSessionId(client.getSessionId());\n },\n sessionId,\n visitorId\n }), [client, sessionId, visitorId]);\n\n return (\n <Context.Provider value={contextValue}>\n {children}\n </Context.Provider>\n );\n}\n\nexport function useAnalytics() {\n const context = useContext(Context);\n if (!context) {\n throw new Error('useAnalytics must be used within an AnalyticsProvider');\n }\n return context;\n}\n"],"names":["createContext","useState","useMemo","useEffect","useContext"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dishub-analytics.sdk",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "type": "module",
5
5
  "description": "Analytics tracking SDK for Infrabricks Analytics",
6
6
  "main": "dist/index.js",