diff --git a/app/components/AuthProvider.tsx b/app/components/AuthProvider.tsx index a375334..1602989 100644 --- a/app/components/AuthProvider.tsx +++ b/app/components/AuthProvider.tsx @@ -3,6 +3,7 @@ import { DynamicContextProvider, DynamicWidget, useDynamicContext } from '@dynamic-labs/sdk-react-core'; import { EthereumWalletConnectors } from '@dynamic-labs/ethereum'; import { createContext, useContext, useEffect, useState, useCallback, ReactNode } from 'react'; +import { trackUserLoggedIn } from '@/lib/analytics'; interface SubscriptionData { isActive: boolean; @@ -148,6 +149,8 @@ export function AuthProvider({ children }: { children: ReactNode }) { const handleAuthStateChange = useCallback((isAuth: boolean, dynamicUser: any) => { console.log('[AuthProvider] Auth state changed:', { isAuth, hasUser: !!dynamicUser, userAddress: dynamicUser?.verifiedCredentials?.[0]?.address }); + + const wasAuthenticated = isAuthenticated; setIsAuthenticated(isAuth); setUser(dynamicUser); @@ -157,14 +160,20 @@ export function AuthProvider({ children }: { children: ReactNode }) { setSubscriptionData(null); setCheckingSubscription(false); } else if (dynamicUser && isDynamicInitialized) { - // User logged in and Dynamic is initialized, check subscription + // User logged in const walletAddress = dynamicUser?.verifiedCredentials?.[0]?.address; if (walletAddress) { console.log('[AuthProvider] User logged in, checking subscription:', walletAddress); + + // Track login event (only on new login, not on page refresh) + if (!wasAuthenticated) { + trackUserLoggedIn(); + } + checkSubscription(walletAddress); } } - }, [isDynamicInitialized, checkSubscription]); + }, [isDynamicInitialized, checkSubscription, isAuthenticated]); // If Dynamic is not enabled (no environment ID), render children with default auth context if (!isDynamicEnabled) { diff --git a/app/components/CustomizationModal.tsx b/app/components/CustomizationModal.tsx index a219824..dd67326 100644 --- a/app/components/CustomizationModal.tsx +++ b/app/components/CustomizationModal.tsx @@ -3,6 +3,7 @@ import { useState, useEffect } from "react"; import { createPortal } from "react-dom"; import { useCustomization, UserCustomization } from "./CustomizationContext"; +import { trackPersonalizationUpdated } from "@/lib/analytics"; type CustomizationModalProps = { isOpen: boolean; @@ -137,6 +138,10 @@ export default function CustomizationModal({ isOpen, onClose }: CustomizationMod }; await saveCustomization(data, password); + + // Track personalization update + trackPersonalizationUpdated(); + // Don't close - let user decide with buttons } catch (err) { setError(err instanceof Error ? err.message : 'Failed to save customization'); diff --git a/app/components/DisclaimerModal.tsx b/app/components/DisclaimerModal.tsx index 844da58..722b8fd 100644 --- a/app/components/DisclaimerModal.tsx +++ b/app/components/DisclaimerModal.tsx @@ -2,7 +2,6 @@ import { useEffect, useState } from "react"; import { createPortal } from "react-dom"; -import { trackModalOpen, trackModalClose, trackDisclaimerView } from "@/lib/analytics"; type DisclaimerModalProps = { isOpen: boolean; @@ -21,8 +20,7 @@ export default function DisclaimerModal({ isOpen, onClose, type, onAccept }: Dis useEffect(() => { if (isOpen) { - trackModalOpen(type === 'initial' ? 'disclaimer_initial' : 'disclaimer_result'); - trackDisclaimerView(); + // Removed granular modal tracking - no longer needed } else { setHasScrolledToBottom(false); } @@ -99,7 +97,6 @@ export default function DisclaimerModal({ isOpen, onClose, type, onAccept }: Dis