bookwiz.io / lib / hooks / useAnalyticsTracking.ts
useAnalyticsTracking.ts
Raw
'use client'

import { useCallback } from 'react'
import { 
  trackAuth, 
  trackBook, 
  trackAI, 
  trackSubscription, 
  trackTemplate, 
  trackUsage, 
  trackContent,
  trackError 
} from '@/lib/analytics'

// Hook for authentication tracking
export const useAuthTracking = () => {
  const trackLogin = useCallback((method: string = 'google') => {
    trackAuth.login(method)
  }, [])

  const trackSignUp = useCallback((method: string = 'google') => {
    trackAuth.signUp(method)
  }, [])

  const trackLogout = useCallback(() => {
    trackAuth.logout()
  }, [])

  return { trackLogin, trackSignUp, trackLogout }
}

// Hook for book-related tracking
export const useBookTracking = () => {
  const trackBookCreate = useCallback((templateId?: string) => {
    trackBook.create(templateId)
  }, [])

  const trackBookOpen = useCallback((bookId: string) => {
    trackBook.open(bookId)
  }, [])

  const trackBookEdit = useCallback((bookId: string, action: 'file_create' | 'file_edit' | 'file_delete') => {
    trackBook.edit(bookId, action)
  }, [])

  const trackBookDelete = useCallback((bookId: string) => {
    trackBook.delete(bookId)
  }, [])

  return { trackBookCreate, trackBookOpen, trackBookEdit, trackBookDelete }
}

// Hook for AI operations tracking
export const useAITracking = () => {
  const trackChatMessage = useCallback((bookId: string, messageLength: number, model: string) => {
    trackAI.chatMessage(bookId, messageLength, model)
  }, [])

  const trackAIOperation = useCallback((operationType: string, bookId: string, success: boolean) => {
    trackAI.operation(operationType, bookId, success)
  }, [])

  const trackAIRevert = useCallback((operationId: string, bookId: string) => {
    trackAI.revert(operationId, bookId)
  }, [])

  return { trackChatMessage, trackAIOperation, trackAIRevert }
}

// Hook for subscription tracking
export const useSubscriptionTracking = () => {
  const trackCheckoutStart = useCallback((planType: string, planPrice: number) => {
    trackSubscription.checkoutStart(planType, planPrice)
  }, [])

  const trackPurchase = useCallback((planType: string, planPrice: number, transactionId: string) => {
    trackSubscription.purchase(planType, planPrice, transactionId)
  }, [])

  const trackCancel = useCallback((planType: string) => {
    trackSubscription.cancel(planType)
  }, [])

  const trackUpgrade = useCallback((fromPlan: string, toPlan: string) => {
    trackSubscription.upgrade(fromPlan, toPlan)
  }, [])

  return { trackCheckoutStart, trackPurchase, trackCancel, trackUpgrade }
}

// Hook for template tracking
export const useTemplateTracking = () => {
  const trackTemplateView = useCallback((templateId: string) => {
    trackTemplate.view(templateId)
  }, [])

  const trackTemplateUse = useCallback((templateId: string) => {
    trackTemplate.use(templateId)
  }, [])

  return { trackTemplateView, trackTemplateUse }
}

// Hook for general usage tracking
export const useUsageTracking = () => {
  const trackFeatureUse = useCallback((feature: string, context?: string) => {
    trackUsage.featureUse(feature, context)
  }, [])

  const trackSearch = useCallback((query: string, resultsCount: number) => {
    trackUsage.searchQuery(query, resultsCount)
  }, [])

  return { trackFeatureUse, trackSearch }
}

// Hook for content engagement tracking
export const useContentTracking = () => {
  const trackBlogView = useCallback((slug: string, title: string) => {
    trackContent.blogView(slug, title)
  }, [])

  const trackBlogEngagement = useCallback((slug: string, action: 'scroll_50' | 'scroll_90' | 'time_on_page') => {
    trackContent.blogEngagement(slug, action)
  }, [])

  return { trackBlogView, trackBlogEngagement }
}

// Hook for error tracking
export const useErrorTracking = () => {
  const trackJSError = useCallback((error: Error, context?: string) => {
    trackError.jsError(error, context)
  }, [])

  const trackAPIError = useCallback((endpoint: string, statusCode: number, errorMessage: string) => {
    trackError.apiError(endpoint, statusCode, errorMessage)
  }, [])

  return { trackJSError, trackAPIError }
}