+18
src/logger/metrics.ts
+18
src/logger/metrics.ts
···
301
| 'ExploreSuggestedAccounts'
302
| 'OnboardingSuggestedAccounts'
303
}
304
+
'profile:followers:view': {
305
+
contextProfileDid: string
306
+
isOwnProfile: boolean
307
+
}
308
+
'profile:followers:paginate': {
309
+
contextProfileDid: string
310
+
itemCount: number
311
+
page: number
312
+
}
313
+
'profile:following:view': {
314
+
contextProfileDid: string
315
+
isOwnProfile: boolean
316
+
}
317
+
'profile:following:paginate': {
318
+
contextProfileDid: string
319
+
itemCount: number
320
+
page: number
321
+
}
322
'profileCard:seen': {
323
contextProfileDid?: string
324
profileDid: string
+36
src/view/com/profile/ProfileFollowers.tsx
+36
src/view/com/profile/ProfileFollowers.tsx
···
71
return []
72
}, [data])
73
74
+
// Track pagination events - fire for page 3+ (pages 1-2 may auto-load)
75
+
const paginationTrackingRef = React.useRef<{
76
+
did: string | undefined
77
+
page: number
78
+
}>({did: undefined, page: 0})
79
+
React.useEffect(() => {
80
+
const currentPageCount = data?.pages?.length || 0
81
+
// Reset tracking when profile changes
82
+
if (paginationTrackingRef.current.did !== resolvedDid) {
83
+
paginationTrackingRef.current = {did: resolvedDid, page: currentPageCount}
84
+
return
85
+
}
86
+
if (
87
+
resolvedDid &&
88
+
currentPageCount >= 3 &&
89
+
currentPageCount > paginationTrackingRef.current.page
90
+
) {
91
+
logger.metric('profile:followers:paginate', {
92
+
contextProfileDid: resolvedDid,
93
+
itemCount: followers.length,
94
+
page: currentPageCount,
95
+
})
96
+
}
97
+
paginationTrackingRef.current.page = currentPageCount
98
+
}, [data?.pages?.length, resolvedDid, followers.length])
99
+
100
const onRefresh = React.useCallback(async () => {
101
setIsPTRing(true)
102
try {
···
121
renderItem({item, index, contextProfileDid: resolvedDid}),
122
[resolvedDid],
123
)
124
+
125
+
// track pageview
126
+
React.useEffect(() => {
127
+
if (resolvedDid) {
128
+
logger.metric('profile:followers:view', {
129
+
contextProfileDid: resolvedDid,
130
+
isOwnProfile: isMe,
131
+
})
132
+
}
133
+
}, [resolvedDid, isMe])
134
135
// track seen items
136
const seenItemsRef = React.useRef<Set<string>>(new Set())
+37
-1
src/view/com/profile/ProfileFollows.tsx
+37
-1
src/view/com/profile/ProfileFollows.tsx
···
82
return []
83
}, [data])
84
85
const onRefresh = React.useCallback(async () => {
86
setIsPTRing(true)
87
try {
···
99
} catch (err) {
100
logger.error('Failed to load more follows', {error: err})
101
}
102
-
}, [error, fetchNextPage, hasNextPage, isFetchingNextPage])
103
104
const renderItemWithContext = React.useCallback(
105
({item, index}: {item: ActorDefs.ProfileView; index: number}) =>
106
renderItem({item, index, contextProfileDid: resolvedDid}),
107
[resolvedDid],
108
)
109
110
// track seen items
111
const seenItemsRef = React.useRef<Set<string>>(new Set())
···
82
return []
83
}, [data])
84
85
+
// Track pagination events - fire for page 3+ (pages 1-2 may auto-load)
86
+
const paginationTrackingRef = React.useRef<{
87
+
did: string | undefined
88
+
page: number
89
+
}>({did: undefined, page: 0})
90
+
React.useEffect(() => {
91
+
const currentPageCount = data?.pages?.length || 0
92
+
// Reset tracking when profile changes
93
+
if (paginationTrackingRef.current.did !== resolvedDid) {
94
+
paginationTrackingRef.current = {did: resolvedDid, page: currentPageCount}
95
+
return
96
+
}
97
+
if (
98
+
resolvedDid &&
99
+
currentPageCount >= 3 &&
100
+
currentPageCount > paginationTrackingRef.current.page
101
+
) {
102
+
logger.metric('profile:following:paginate', {
103
+
contextProfileDid: resolvedDid,
104
+
itemCount: follows.length,
105
+
page: currentPageCount,
106
+
})
107
+
}
108
+
paginationTrackingRef.current.page = currentPageCount
109
+
}, [data?.pages?.length, resolvedDid, follows.length])
110
+
111
const onRefresh = React.useCallback(async () => {
112
setIsPTRing(true)
113
try {
···
125
} catch (err) {
126
logger.error('Failed to load more follows', {error: err})
127
}
128
+
}, [isFetchingNextPage, hasNextPage, error, fetchNextPage])
129
130
const renderItemWithContext = React.useCallback(
131
({item, index}: {item: ActorDefs.ProfileView; index: number}) =>
132
renderItem({item, index, contextProfileDid: resolvedDid}),
133
[resolvedDid],
134
)
135
+
136
+
// track pageview
137
+
React.useEffect(() => {
138
+
if (resolvedDid) {
139
+
logger.metric('profile:following:view', {
140
+
contextProfileDid: resolvedDid,
141
+
isOwnProfile: isMe,
142
+
})
143
+
}
144
+
}, [resolvedDid, isMe])
145
146
// track seen items
147
const seenItemsRef = React.useRef<Set<string>>(new Set())