UNPKG

@optic7409/resolvo-analytics

Version:

Simplified analytics client library for Next.js with automatic SSR handling, one-line integration, and comprehensive tracking

134 lines (133 loc) 4.56 kB
import { useContext, useEffect, useState } from 'react'; import { AnalyticsClient } from '../../core/AnalyticsClient'; import { AnalyticsContext } from '../components/AnalyticsProvider'; import { shouldEnableAnalytics } from '../../utils/environment'; export function useAnalytics(config) { const context = useContext(AnalyticsContext); const [client, setClient] = useState(null); const [isReady, setIsReady] = useState(false); const [error, setError] = useState(null); useEffect(() => { // SSR Safety: Don't run on server unless explicitly enabled if (typeof window === 'undefined' && !config?.ssr) { return; } // Use context client if available if (context && context.client) { setClient(context.client); setIsReady(context.isReady); return; } // Create new client if config provided if (config) { try { // Check if analytics should be enabled if (!shouldEnableAnalytics(config)) { return; } const analyticsClient = new AnalyticsClient(config); setClient(analyticsClient); setIsReady(true); if (config.debug) { console.log('[Resolvo Analytics] Hook initialized with config:', config); } } catch (err) { const errorMessage = err instanceof Error ? err.message : 'Unknown error'; setError(errorMessage); if (config.debug) { console.error('[Resolvo Analytics] Hook initialization error:', err); } } } }, [config, context]); const track = async (eventName, properties) => { if (!client || !isReady) { if (config?.debug) { console.warn('[Resolvo Analytics] Client not ready, event not tracked:', eventName); } return; } try { await client.track(eventName, properties); if (config?.debug) { console.log('[Resolvo Analytics] Event sent:', eventName, properties); } } catch (err) { if (config?.debug) { console.error('[Resolvo Analytics] Error tracking event:', err); } throw err; } }; const trackPageView = async (url, title) => { if (!client || !isReady) { if (config?.debug) { console.warn('[Resolvo Analytics] Client not ready, page view not tracked'); } return; } try { await client.trackPageView(url, title); if (config?.debug) { console.log('[Resolvo Analytics] Page view tracked:', url, title); } } catch (err) { if (config?.debug) { console.error('[Resolvo Analytics] Error tracking page view:', err); } throw err; } }; const identify = async (userId, properties) => { if (!client || !isReady) { if (config?.debug) { console.warn('[Resolvo Analytics] Client not ready, user not identified'); } return; } try { await client.identify(userId, properties); if (config?.debug) { console.log('[Resolvo Analytics] User identified:', userId, properties); } } catch (err) { if (config?.debug) { console.error('[Resolvo Analytics] Error identifying user:', err); } throw err; } }; const trackClick = async (element, text, url) => { if (!client || !isReady) { if (config?.debug) { console.warn('[Resolvo Analytics] Client not ready, click not tracked'); } return; } try { await client.trackClick({ element, text, url }); if (config?.debug) { console.log('[Resolvo Analytics] Click tracked:', element, text, url); } } catch (err) { if (config?.debug) { console.error('[Resolvo Analytics] Error tracking click:', err); } throw err; } }; return { track, trackPageView, identify, trackClick, client, isReady, error }; }