# React Integration Guide Integrate analytics into React applications with hooks and context. ## Installation ```bash npm install @analytics/client ``` ## Setup ### 1. Create Analytics Provider ```tsx // analytics-provider.tsx import { createContext, useContext, useMemo, type ReactNode } from 'react'; import { AnalyticsClient, type AnalyticsConfig } from '@analytics/client'; interface AnalyticsContextValue { client: AnalyticsClient; trackEvent: (type: string, action: string, metadata?: Record) => void; identify: (userId: string, traits?: Record) => void; } const AnalyticsContext = createContext(null); interface AnalyticsProviderProps { children: ReactNode; config: AnalyticsConfig; } export function AnalyticsProvider({ children, config }: AnalyticsProviderProps) { const value = useMemo(() => { const client = new AnalyticsClient(config); return { client, trackEvent: (type, action, metadata) => { client.trackEngagement({ type, action, metadata }); }, identify: (userId, traits) => { client.identify(userId, traits); }, }; }, [config]); return ( {children} ); } export function useAnalytics() { const context = useContext(AnalyticsContext); if (!context) { throw new Error('useAnalytics must be used within AnalyticsProvider'); } return context; } ``` ### 2. Wrap Your App ```tsx // App.tsx import { AnalyticsProvider } from './analytics-provider'; function App() { return ( ); } ``` ## Hooks ### usePageTracking Track page views on route changes. ```tsx // hooks/use-page-tracking.ts import { useEffect } from 'react'; import { useLocation } from 'react-router-dom'; import { useAnalytics } from '../analytics-provider'; export function usePageTracking() { const location = useLocation(); const { trackEvent } = useAnalytics(); useEffect(() => { trackEvent('navigation', 'page_view', { path: location.pathname, search: location.search, }); }, [location.pathname, location.search, trackEvent]); } // Usage: Call once in your root component function AppContent() { usePageTracking(); return ; } ``` ### useClickTracking Track element clicks. ```tsx // hooks/use-click-tracking.ts import { useCallback } from 'react'; import { useAnalytics } from '../analytics-provider'; export function useClickTracking() { const { trackEvent } = useAnalytics(); return useCallback(( elementName: string, metadata?: Record ) => { trackEvent('click', elementName, metadata); }, [trackEvent]); } // Usage function CTAButton() { const trackClick = useClickTracking(); return ( ); } ``` ### useFormTracking Track form interactions. ```tsx // hooks/use-form-tracking.ts import { useCallback } from 'react'; import { useAnalytics } from '../analytics-provider'; export function useFormTracking(formName: string) { const { trackEvent } = useAnalytics(); const trackStart = useCallback(() => { trackEvent('form', 'start', { formName }); }, [trackEvent, formName]); const trackField = useCallback((fieldName: string) => { trackEvent('form', 'field_focus', { formName, fieldName }); }, [trackEvent, formName]); const trackSubmit = useCallback((success: boolean, error?: string) => { trackEvent('form', success ? 'submit_success' : 'submit_error', { formName, success, error, }); }, [trackEvent, formName]); const trackAbandonment = useCallback((lastField?: string) => { trackEvent('form', 'abandonment', { formName, lastField }); }, [trackEvent, formName]); return { trackStart, trackField, trackSubmit, trackAbandonment }; } ``` ### useScrollTracking Track scroll depth. ```tsx // hooks/use-scroll-tracking.ts import { useEffect, useRef } from 'react'; import { useAnalytics } from '../analytics-provider'; export function useScrollTracking() { const { trackEvent } = useAnalytics(); const trackedDepths = useRef(new Set()); useEffect(() => { const thresholds = [25, 50, 75, 90, 100]; const handleScroll = () => { const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; const scrollPercent = Math.round((window.scrollY / scrollHeight) * 100); for (const threshold of thresholds) { if (scrollPercent >= threshold && !trackedDepths.current.has(threshold)) { trackedDepths.current.add(threshold); trackEvent('scroll', 'depth', { percent: threshold }); } } }; window.addEventListener('scroll', handleScroll, { passive: true }); return () => window.removeEventListener('scroll', handleScroll); }, [trackEvent]); } ``` ## Component Patterns ### Tracked Link ```tsx import { Link, type LinkProps } from 'react-router-dom'; import { useClickTracking } from '../hooks/use-click-tracking'; interface TrackedLinkProps extends LinkProps { trackingName: string; trackingMetadata?: Record; } export function TrackedLink({ trackingName, trackingMetadata, onClick, ...props }: TrackedLinkProps) { const trackClick = useClickTracking(); const handleClick = (e: React.MouseEvent) => { trackClick(trackingName, trackingMetadata); onClick?.(e); }; return ; } ``` ### Tracked Button ```tsx interface TrackedButtonProps extends React.ButtonHTMLAttributes { trackingName: string; trackingMetadata?: Record; } export function TrackedButton({ trackingName, trackingMetadata, onClick, ...props }: TrackedButtonProps) { const trackClick = useClickTracking(); const handleClick = (e: React.MouseEvent) => { trackClick(trackingName, trackingMetadata); onClick?.(e); }; return