Skip to content

Commit c50ce33

Browse files
Merge pull request #12 from reserve-protocol/chore/tracking
Chore: improve tracking
2 parents bf5249c + 3f576a0 commit c50ce33

13 files changed

Lines changed: 351 additions & 84 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [1.3.7] - 2025-10-01
2+
3+
### Changed
4+
5+
- Tracking was improved (sessionId, quoteId, sourceId, retryId)
6+
17
## [1.3.6] - 2025-09-26
28

39
### Fixed

package-lock.json

Lines changed: 22 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@reserve-protocol/react-zapper",
3-
"version": "1.3.6",
3+
"version": "1.3.7",
44
"type": "module",
55
"description": "React component for DTF minting with zap functionality",
66
"main": "dist/index.cjs.js",
@@ -62,10 +62,11 @@
6262
"lucide-react": "^0.461.0",
6363
"mixpanel-browser": "^2.56.0",
6464
"next-themes": "^0.2.1",
65-
"react": "18.3.1",
65+
"react": "^18.0.0",
6666
"react-dom": "18.3.1",
6767
"sonner": "^1.4.0",
68-
"tailwind-merge": "^2.5.5"
68+
"tailwind-merge": "^2.5.5",
69+
"uuid": "^13.0.0"
6970
},
7071
"devDependencies": {
7172
"@radix-ui/react-select": "^2.2.5",

src/components/updaters.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
} from '../state/atoms'
2323
import { Token } from '../types'
2424
import TokenBalancesUpdater from './updaters/token-balances-updater'
25+
import SessionTracker from './updaters/session-tracker'
2526
import { zapperDebugAtom } from './zap-mint/atom'
2627

2728
type IndexDTFBrand = {
@@ -37,6 +38,7 @@ interface UpdatersProps {
3738
connectWallet?: () => void
3839
defaultSource?: QuoteSource
3940
debug?: boolean
41+
mode?: 'modal' | 'inline'
4042
}
4143

4244
const IndexDTFMetadataUpdater: React.FC<{
@@ -214,6 +216,7 @@ const Updaters: React.FC<UpdatersProps> = ({
214216
connectWallet,
215217
defaultSource,
216218
debug,
219+
mode = 'modal',
217220
}) => {
218221
return (
219222
<>
@@ -227,6 +230,7 @@ const Updaters: React.FC<UpdatersProps> = ({
227230
<TokenBalancesUpdater dtfAddress={dtfAddress} />
228231
<QuoteSourceUpdater defaultSource={defaultSource} />
229232
<DebugUpdater debug={debug} />
233+
<SessionTracker mode={mode} />
230234
</>
231235
)
232236
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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

src/components/zap-mint/buy/index.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Skeleton } from '@/components/ui/skeleton'
12
import { useAtom, useAtomValue, useSetAtom } from 'jotai'
23
import { useCallback, useEffect } from 'react'
34
import { formatEther, parseUnits } from 'viem'
@@ -6,7 +7,11 @@ import { usePrice } from '../../../hooks/usePrice'
67
import useZapSwapQuery from '../../../hooks/useZapSwapQuery'
78
import { chainIdAtom, indexDTFAtom, walletAtom } from '../../../state/atoms'
89
import { Token } from '../../../types'
9-
import { formatCurrency, useTrackQuoteErrorUX } from '../../../utils'
10+
import {
11+
formatCurrency,
12+
resetTempRegistrations,
13+
useTrackQuoteErrorUX,
14+
} from '../../../utils'
1015
import Swap from '../../ui/swap'
1116
import {
1217
forceMintAtom,
@@ -23,10 +28,9 @@ import {
2328
zapperDebugAtom,
2429
zapRefetchAtom,
2530
} from '../atom'
31+
import { Debug } from '../debug/debug'
2632
import SubmitZap from '../submit-zap'
2733
import ZapDetails, { ZapPriceImpact } from '../zap-details'
28-
import { Skeleton } from '@/components/ui/skeleton'
29-
import { Debug } from '../debug/debug'
3034

3135
const Buy = () => {
3236
const account = useAtomValue(walletAtom)
@@ -99,6 +103,7 @@ const Buy = () => {
99103
setCurrentTab(newTab)
100104
setInputToken(tokens[0])
101105
setInputAmount('')
106+
resetTempRegistrations()
102107
}
103108

104109
useEffect(() => {

src/components/zap-mint/sell/index.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Skeleton } from '@/components/ui/skeleton'
12
import { useAtom, useAtomValue, useSetAtom } from 'jotai'
23
import { useCallback, useEffect } from 'react'
34
import { formatEther, formatUnits, parseEther } from 'viem'
@@ -9,7 +10,11 @@ import {
910
walletAtom,
1011
} from '../../../state/atoms'
1112
import { Token } from '../../../types'
12-
import { formatCurrency, useTrackQuoteErrorUX } from '../../../utils'
13+
import {
14+
formatCurrency,
15+
resetTempRegistrations,
16+
useTrackQuoteErrorUX,
17+
} from '../../../utils'
1318
import Swap from '../../ui/swap'
1419
import {
1520
forceMintAtom,
@@ -26,10 +31,9 @@ import {
2631
zapperDebugAtom,
2732
zapRefetchAtom,
2833
} from '../atom'
34+
import { Debug } from '../debug/debug'
2935
import SubmitZap from '../submit-zap'
3036
import ZapDetails, { ZapPriceImpact } from '../zap-details'
31-
import { Skeleton } from '@/components/ui/skeleton'
32-
import { Debug } from '../debug/debug'
3337

3438
const Sell = () => {
3539
const account = useAtomValue(walletAtom)
@@ -100,6 +104,7 @@ const Sell = () => {
100104
setCurrentTab(newTab)
101105
setOutputToken(tokens[0])
102106
setInputAmount('')
107+
resetTempRegistrations()
103108
}
104109

105110
useEffect(() => {

src/components/zapper.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ export const Zapper: React.FC<ZapperProps> = ({
238238
connectWallet={connectWallet}
239239
defaultSource={defaultSource}
240240
debug={debug}
241+
mode={mode}
241242
/>
242243
<ZapperContent mode={mode} />
243244
</QueryClientProvider>

src/hooks/useWatchTransaction.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { useAtomValue } from 'jotai'
2-
import mixpanel from 'mixpanel-browser/src/loaders/loader-module-core'
32
import { ReactNode, useEffect, useRef } from 'react'
43
import { chainIdAtom } from '../state/atoms'
54
import { CHAIN_TAGS } from '../utils/chains'
65
import { Hex, TransactionReceipt } from 'viem'
76
import { useWaitForTransactionReceipt } from 'wagmi'
87
import useNotification from './use-notification'
8+
import { mixpanelTrack } from '@/utils'
99

1010
interface WatchOptions {
1111
hash: Hex | undefined
@@ -59,7 +59,7 @@ const useWatchTransaction = ({
5959
successMessage?.type ?? 'success',
6060
successMessage?.icon
6161
)
62-
mixpanel.track('transaction', {
62+
mixpanelTrack('transaction', {
6363
product: label,
6464
action: 'transaction_succeeded',
6565
payload: {
@@ -72,7 +72,7 @@ const useWatchTransaction = ({
7272
} else if (status === 'error') {
7373
notifiedRef.current[notificationKey] = true
7474
notify(`Transaction reverted`, error?.message ?? 'Unknown error', 'error')
75-
mixpanel.track('transaction', {
75+
mixpanelTrack('transaction', {
7676
product: label,
7777
action: 'transaction_reverted',
7878
payload: {

0 commit comments

Comments
 (0)