|
| 1 | +import { openZapMintModalAtom } from '@/components/zap-mint/atom' |
| 2 | +import { walletAtom } from '@/state/atoms' |
| 3 | +import { sessionIdAtom } from '@/state/tracking-atoms' |
| 4 | +import { generateSessionId } from '@/utils/ids' |
| 5 | +import { mixpanelRegister } from '@/utils/tracking' |
| 6 | +import { useAtomValue, useSetAtom } from 'jotai' |
| 7 | +import { useCallback, useEffect, useRef } from 'react' |
| 8 | + |
| 9 | +interface SessionTrackerProps { |
| 10 | + mode: 'modal' | 'inline' |
| 11 | +} |
| 12 | + |
| 13 | +const SessionTracker: React.FC<SessionTrackerProps> = ({ mode }) => { |
| 14 | + const setSessionId = useSetAtom(sessionIdAtom) |
| 15 | + const wallet = useAtomValue(walletAtom) |
| 16 | + const isModalOpen = useAtomValue(openZapMintModalAtom) |
| 17 | + const prevWalletRef = useRef<string | undefined>() |
| 18 | + const hasInitializedRef = useRef(false) |
| 19 | + |
| 20 | + // Generate and register new session ID |
| 21 | + const createNewSession = useCallback(() => { |
| 22 | + const newSessionId = generateSessionId() |
| 23 | + setSessionId(newSessionId) |
| 24 | + mixpanelRegister('sessionId', newSessionId) |
| 25 | + }, [setSessionId]) |
| 26 | + |
| 27 | + useEffect(() => { |
| 28 | + if (mode === 'inline' && !hasInitializedRef.current) { |
| 29 | + // Inline mode: generate session on mount |
| 30 | + createNewSession() |
| 31 | + hasInitializedRef.current = true |
| 32 | + } else if (mode === 'modal' && isModalOpen) { |
| 33 | + // Modal mode: generate session when modal opens |
| 34 | + createNewSession() |
| 35 | + } |
| 36 | + }, [mode, isModalOpen, createNewSession]) |
| 37 | + |
| 38 | + // Handle wallet address changes |
| 39 | + useEffect(() => { |
| 40 | + if ( |
| 41 | + prevWalletRef.current !== undefined && |
| 42 | + prevWalletRef.current !== wallet |
| 43 | + ) { |
| 44 | + createNewSession() |
| 45 | + } |
| 46 | + prevWalletRef.current = wallet |
| 47 | + }, [createNewSession, wallet]) |
| 48 | + |
| 49 | + return null |
| 50 | +} |
| 51 | + |
| 52 | +export default SessionTracker |
0 commit comments