AnalyticsTracker.tsx 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. "use client"
  2. import { useEffect } from 'react'
  3. import { usePathname } from 'next/navigation'
  4. import { useSession } from 'next-auth/react'
  5. // Hook para obtener o crear session ID
  6. function useAnalyticsSessionId() {
  7. useEffect(() => {
  8. // Crear session ID si no existe
  9. if (typeof window !== 'undefined' && !localStorage.getItem('analytics_session_id')) {
  10. localStorage.setItem('analytics_session_id', crypto.randomUUID())
  11. }
  12. }, [])
  13. return typeof window !== 'undefined'
  14. ? localStorage.getItem('analytics_session_id') || crypto.randomUUID()
  15. : null
  16. }
  17. export default function AnalyticsTracker() {
  18. const pathname = usePathname()
  19. const { data: session } = useSession()
  20. const sessionId = useAnalyticsSessionId()
  21. useEffect(() => {
  22. // No trackear si no tenemos sessionId o si es una ruta de API
  23. if (!sessionId || pathname.startsWith('/api')) {
  24. return
  25. }
  26. // Track page visit
  27. const trackVisit = async () => {
  28. try {
  29. await fetch('/api/analytics/track', {
  30. method: 'POST',
  31. headers: {
  32. 'Content-Type': 'application/json',
  33. },
  34. body: JSON.stringify({
  35. userId: session?.user?.id || null,
  36. sessionId,
  37. path: pathname,
  38. }),
  39. })
  40. } catch (error) {
  41. // Silent fail - analytics no debe romper la app
  42. console.error('Analytics tracking failed:', error)
  43. }
  44. }
  45. trackVisit()
  46. }, [pathname, sessionId, session?.user?.id])
  47. // Este componente no renderiza nada
  48. return null
  49. }