From 6686ebc232feda4bf8a64b8e22bc01ad5f41efcf Mon Sep 17 00:00:00 2001 From: Alex Benzer Date: Fri, 5 Dec 2025 08:27:35 -0800 Subject: [PATCH] Add more client events to profile followers/following pages (#9466) * Add more client events to profile followers/following pages * Remove unneeded logContext attribute --- src/logger/metrics.ts | 18 +++++++++++ src/view/com/profile/ProfileFollowers.tsx | 36 +++++++++++++++++++++ src/view/com/profile/ProfileFollows.tsx | 38 ++++++++++++++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/src/logger/metrics.ts b/src/logger/metrics.ts index 3903354b7e..fb82a7c1c8 100644 --- a/src/logger/metrics.ts +++ b/src/logger/metrics.ts @@ -301,6 +301,24 @@ export type MetricEvents = { | 'ExploreSuggestedAccounts' | 'OnboardingSuggestedAccounts' } + 'profile:followers:view': { + contextProfileDid: string + isOwnProfile: boolean + } + 'profile:followers:paginate': { + contextProfileDid: string + itemCount: number + page: number + } + 'profile:following:view': { + contextProfileDid: string + isOwnProfile: boolean + } + 'profile:following:paginate': { + contextProfileDid: string + itemCount: number + page: number + } 'profileCard:seen': { contextProfileDid?: string profileDid: string diff --git a/src/view/com/profile/ProfileFollowers.tsx b/src/view/com/profile/ProfileFollowers.tsx index 3bafc0c987..39c251293e 100644 --- a/src/view/com/profile/ProfileFollowers.tsx +++ b/src/view/com/profile/ProfileFollowers.tsx @@ -71,6 +71,32 @@ export function ProfileFollowers({name}: {name: string}) { return [] }, [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 () => { setIsPTRing(true) try { @@ -96,6 +122,16 @@ export function ProfileFollowers({name}: {name: string}) { [resolvedDid], ) + // track pageview + React.useEffect(() => { + if (resolvedDid) { + logger.metric('profile:followers:view', { + contextProfileDid: resolvedDid, + isOwnProfile: isMe, + }) + } + }, [resolvedDid, isMe]) + // track seen items const seenItemsRef = React.useRef>(new Set()) React.useEffect(() => { diff --git a/src/view/com/profile/ProfileFollows.tsx b/src/view/com/profile/ProfileFollows.tsx index 28e3230414..243f3705b5 100644 --- a/src/view/com/profile/ProfileFollows.tsx +++ b/src/view/com/profile/ProfileFollows.tsx @@ -82,6 +82,32 @@ export function ProfileFollows({name}: {name: string}) { return [] }, [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 () => { setIsPTRing(true) try { @@ -99,7 +125,7 @@ export function ProfileFollows({name}: {name: string}) { } catch (err) { logger.error('Failed to load more follows', {error: err}) } - }, [error, fetchNextPage, hasNextPage, isFetchingNextPage]) + }, [isFetchingNextPage, hasNextPage, error, fetchNextPage]) const renderItemWithContext = React.useCallback( ({item, index}: {item: ActorDefs.ProfileView; index: number}) => @@ -107,6 +133,16 @@ export function ProfileFollows({name}: {name: string}) { [resolvedDid], ) + // track pageview + React.useEffect(() => { + if (resolvedDid) { + logger.metric('profile:following:view', { + contextProfileDid: resolvedDid, + isOwnProfile: isMe, + }) + } + }, [resolvedDid, isMe]) + // track seen items const seenItemsRef = React.useRef>(new Set()) React.useEffect(() => {