@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
JavaScript
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
};
}