Add more client events to profile followers/following pages

This commit is contained in:
Alex Benzer
2025-11-30 14:10:34 -08:00
parent 1eacf427b5
commit db258c3a56
3 changed files with 95 additions and 1 deletions
+20
View File
@@ -296,6 +296,26 @@ export type MetricEvents = {
| 'ExploreSuggestedAccounts' | 'ExploreSuggestedAccounts'
| 'OnboardingSuggestedAccounts' | 'OnboardingSuggestedAccounts'
} }
'profile:followers:view': {
contextProfileDid: string
isOwnProfile: boolean
logContext?: 'ProfileHeader'
}
'profile:followers:paginate': {
contextProfileDid: string
itemCount: number
page: number
}
'profile:following:view': {
contextProfileDid: string
isOwnProfile: boolean
logContext?: 'ProfileHeader'
}
'profile:following:paginate': {
contextProfileDid: string
itemCount: number
page: number
}
'profileCard:seen': { 'profileCard:seen': {
contextProfileDid?: string contextProfileDid?: string
profileDid: string profileDid: string
+37
View File
@@ -71,6 +71,32 @@ export function ProfileFollowers({name}: {name: string}) {
return [] return []
}, [data]) }, [data])
// Track pagination events - fire for page 3+ (pages 1-2 may auto-load)
const paginationTrackingRef = React.useRef<{
did: string | undefined
page: number
}>({did: undefined, page: 0})
React.useEffect(() => {
const currentPageCount = data?.pages?.length || 0
// Reset tracking when profile changes
if (paginationTrackingRef.current.did !== resolvedDid) {
paginationTrackingRef.current = {did: resolvedDid, page: currentPageCount}
return
}
if (
resolvedDid &&
currentPageCount >= 3 &&
currentPageCount > paginationTrackingRef.current.page
) {
logger.metric('profile:followers:paginate', {
contextProfileDid: resolvedDid,
itemCount: followers.length,
page: currentPageCount,
})
}
paginationTrackingRef.current.page = currentPageCount
}, [data?.pages?.length, resolvedDid, followers.length])
const onRefresh = React.useCallback(async () => { const onRefresh = React.useCallback(async () => {
setIsPTRing(true) setIsPTRing(true)
try { try {
@@ -96,6 +122,17 @@ export function ProfileFollowers({name}: {name: string}) {
[resolvedDid], [resolvedDid],
) )
// track pageview
React.useEffect(() => {
if (resolvedDid) {
logger.metric('profile:followers:view', {
contextProfileDid: resolvedDid,
isOwnProfile: isMe,
logContext: 'ProfileHeader',
})
}
}, [resolvedDid, isMe])
// track seen items // track seen items
const seenItemsRef = React.useRef<Set<string>>(new Set()) const seenItemsRef = React.useRef<Set<string>>(new Set())
React.useEffect(() => { React.useEffect(() => {
+38 -1
View File
@@ -82,6 +82,32 @@ export function ProfileFollows({name}: {name: string}) {
return [] return []
}, [data]) }, [data])
// Track pagination events - fire for page 3+ (pages 1-2 may auto-load)
const paginationTrackingRef = React.useRef<{
did: string | undefined
page: number
}>({did: undefined, page: 0})
React.useEffect(() => {
const currentPageCount = data?.pages?.length || 0
// Reset tracking when profile changes
if (paginationTrackingRef.current.did !== resolvedDid) {
paginationTrackingRef.current = {did: resolvedDid, page: currentPageCount}
return
}
if (
resolvedDid &&
currentPageCount >= 3 &&
currentPageCount > paginationTrackingRef.current.page
) {
logger.metric('profile:following:paginate', {
contextProfileDid: resolvedDid,
itemCount: follows.length,
page: currentPageCount,
})
}
paginationTrackingRef.current.page = currentPageCount
}, [data?.pages?.length, resolvedDid, follows.length])
const onRefresh = React.useCallback(async () => { const onRefresh = React.useCallback(async () => {
setIsPTRing(true) setIsPTRing(true)
try { try {
@@ -99,7 +125,7 @@ export function ProfileFollows({name}: {name: string}) {
} catch (err) { } catch (err) {
logger.error('Failed to load more follows', {error: err}) logger.error('Failed to load more follows', {error: err})
} }
}, [error, fetchNextPage, hasNextPage, isFetchingNextPage]) }, [isFetchingNextPage, hasNextPage, error, fetchNextPage])
const renderItemWithContext = React.useCallback( const renderItemWithContext = React.useCallback(
({item, index}: {item: ActorDefs.ProfileView; index: number}) => ({item, index}: {item: ActorDefs.ProfileView; index: number}) =>
@@ -107,6 +133,17 @@ export function ProfileFollows({name}: {name: string}) {
[resolvedDid], [resolvedDid],
) )
// track pageview
React.useEffect(() => {
if (resolvedDid) {
logger.metric('profile:following:view', {
contextProfileDid: resolvedDid,
isOwnProfile: isMe,
logContext: 'ProfileHeader',
})
}
}, [resolvedDid, isMe])
// track seen items // track seen items
const seenItemsRef = React.useRef<Set<string>>(new Set()) const seenItemsRef = React.useRef<Set<string>>(new Set())
React.useEffect(() => { React.useEffect(() => {