dishub-analytics.sdk 1.1.1 → 1.1.2

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.esm.js CHANGED
@@ -295,12 +295,17 @@ class AnalyticsClient {
295
295
  const width = window.innerWidth;
296
296
  const target = e.target;
297
297
  const selector = this.getSelector(target);
298
+ // Calculation for centering accuracy:
299
+ // We store the X relative to the center of the viewport.
300
+ // This is crucial for centered layouts where margins change based on screen size.
301
+ const centerX = width / 2;
302
+ const relX = x - centerX;
298
303
  this.request('/track', {
299
304
  type: 'interaction',
300
305
  payload: {
301
306
  sessionId: this.sessionId,
302
- x,
303
- y,
307
+ x: relX, // Store relative X
308
+ y, // Y remains absolute (document relative)
304
309
  width,
305
310
  element: selector,
306
311
  path: window.location.pathname,
@@ -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 this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x,\n y,\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 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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"}
package/dist/index.js CHANGED
@@ -297,12 +297,17 @@ class AnalyticsClient {
297
297
  const width = window.innerWidth;
298
298
  const target = e.target;
299
299
  const selector = this.getSelector(target);
300
+ // Calculation for centering accuracy:
301
+ // We store the X relative to the center of the viewport.
302
+ // This is crucial for centered layouts where margins change based on screen size.
303
+ const centerX = width / 2;
304
+ const relX = x - centerX;
300
305
  this.request('/track', {
301
306
  type: 'interaction',
302
307
  payload: {
303
308
  sessionId: this.sessionId,
304
- x,
305
- y,
309
+ x: relX, // Store relative X
310
+ y, // Y remains absolute (document relative)
306
311
  width,
307
312
  element: selector,
308
313
  path: window.location.pathname,
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 this.request('/track', {\n type: 'interaction',\n payload: {\n sessionId: this.sessionId,\n x,\n y,\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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dishub-analytics.sdk",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "type": "module",
5
5
  "description": "Analytics tracking SDK for Infrabricks Analytics",
6
6
  "main": "dist/index.js",