Skip to content

Commit

Permalink
[D1X] Pull out follow-backs for higher signal (#4719)
Browse files Browse the repository at this point in the history
* Pull out follow-backs for higher signal

* Gate it

* Fix early gate check

---------

Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
  • Loading branch information
estrattonbailey and gaearon committed Jul 4, 2024
1 parent 0ed99b8 commit 4f02da9
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 10 deletions.
5 changes: 3 additions & 2 deletions src/lib/statsig/gates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ export type Gate =
// Keep this alphabetic please.
| 'debug_show_feedcontext'
| 'native_pwi_disabled'
| 'new_user_guided_tour'
| 'new_user_progress_guide'
| 'onboarding_minimum_interests'
| 'request_notifications_permission_after_onboarding_v2'
| 'show_avi_follow_button'
| 'show_follow_back_label_v2'
| 'new_user_guided_tour'
| 'new_user_progress_guide'
| 'suggested_feeds_interstitial'
| 'suggested_follows_interstitial'
| 'ungroup_follow_backs'
3 changes: 3 additions & 0 deletions src/state/queries/notifications/feed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
useQueryClient,
} from '@tanstack/react-query'

import {useGate} from '#/lib/statsig/statsig'
import {useAgent} from '#/state/session'
import {useModerationOpts} from '../../preferences/moderation-opts'
import {STALE} from '..'
Expand Down Expand Up @@ -56,6 +57,7 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
const unreads = useUnreadNotificationsApi()
const enabled = opts?.enabled !== false
const lastPageCountRef = useRef(0)
const gate = useGate()

const query = useInfiniteQuery<
FeedPage,
Expand All @@ -81,6 +83,7 @@ export function useNotificationFeedQuery(opts?: {enabled?: boolean}) {
queryClient,
moderationOpts,
fetchAdditionalData: true,
shouldUngroupFollowBacks: () => gate('ungroup_follow_backs'),
})
).page
}
Expand Down
5 changes: 4 additions & 1 deletion src/state/queries/notifications/unread.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {useQueryClient} from '@tanstack/react-query'
import EventEmitter from 'eventemitter3'

import BroadcastChannel from '#/lib/broadcast'
import {useGate} from '#/lib/statsig/statsig'
import {logger} from '#/logger'
import {useAgent, useSession} from '#/state/session'
import {resetBadgeCount} from 'lib/notifications/notifications'
Expand Down Expand Up @@ -47,6 +48,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
const agent = useAgent()
const queryClient = useQueryClient()
const moderationOpts = useModerationOpts()
const gate = useGate()

const [numUnread, setNumUnread] = React.useState('')

Expand Down Expand Up @@ -149,6 +151,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
// only fetch subjects when the page is going to be used
// in the notifications query, otherwise skip it
fetchAdditionalData: !!invalidate,
shouldUngroupFollowBacks: () => gate('ungroup_follow_backs'),
})
const unreadCount = countUnread(page)
const unreadCountStr =
Expand Down Expand Up @@ -189,7 +192,7 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
}
},
}
}, [setNumUnread, queryClient, moderationOpts, agent])
}, [setNumUnread, queryClient, moderationOpts, agent, gate])
checkUnreadRef.current = api.checkUnread

return (
Expand Down
23 changes: 18 additions & 5 deletions src/state/queries/notifications/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,15 @@ export async function fetchPage({
queryClient,
moderationOpts,
fetchAdditionalData,
shouldUngroupFollowBacks,
}: {
agent: BskyAgent
cursor: string | undefined
limit: number
queryClient: QueryClient
moderationOpts: ModerationOpts | undefined
fetchAdditionalData: boolean
shouldUngroupFollowBacks?: () => boolean
}): Promise<{page: FeedPage; indexedAt: string | undefined}> {
const res = await agent.listNotifications({
limit,
Expand All @@ -51,7 +53,7 @@ export async function fetchPage({
)

// group notifications which are essentially similar (follows, likes on a post)
let notifsGrouped = groupNotifications(notifs)
let notifsGrouped = groupNotifications(notifs, {shouldUngroupFollowBacks})

// we fetch subjects of notifications (usually posts) now instead of lazily
// in the UI to avoid relayouts
Expand Down Expand Up @@ -109,6 +111,7 @@ export function shouldFilterNotif(

export function groupNotifications(
notifs: AppBskyNotificationListNotifications.Notification[],
options?: {shouldUngroupFollowBacks?: () => boolean},
): FeedNotification[] {
const groupedNotifs: FeedNotification[] = []
for (const notif of notifs) {
Expand All @@ -123,10 +126,20 @@ export function groupNotifications(
notif.reasonSubject === groupedNotif.notification.reasonSubject &&
notif.author.did !== groupedNotif.notification.author.did
) {
groupedNotif.additional = groupedNotif.additional || []
groupedNotif.additional.push(notif)
grouped = true
break
const nextIsFollowBack =
notif.reason === 'follow' && notif.author.viewer?.following
const prevIsFollowBack =
groupedNotif.notification.reason === 'follow' &&
groupedNotif.notification.author.viewer?.following
const shouldUngroup =
(nextIsFollowBack || prevIsFollowBack) &&
options?.shouldUngroupFollowBacks?.()
if (!shouldUngroup) {
groupedNotif.additional = groupedNotif.additional || []
groupedNotif.additional.push(notif)
grouped = true
break
}
}
}
}
Expand Down
15 changes: 13 additions & 2 deletions src/view/com/notifications/FeedItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {msg, plural, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react'
import {useQueryClient} from '@tanstack/react-query'

import {useGate} from '#/lib/statsig/statsig'
import {FeedNotification} from '#/state/queries/notifications/feed'
import {useAnimatedValue} from 'lib/hooks/useAnimatedValue'
import {usePalette} from 'lib/hooks/usePalette'
Expand Down Expand Up @@ -86,6 +87,7 @@ let FeedItem = ({
const pal = usePalette('default')
const {_} = useLingui()
const t = useTheme()
const gate = useGate()
const [isAuthorsExpanded, setAuthorsExpanded] = useState<boolean>(false)
const itemHref = useMemo(() => {
if (item.type === 'post-like' || item.type === 'repost') {
Expand Down Expand Up @@ -168,6 +170,7 @@ let FeedItem = ({
)
}

let isFollowBack = false
let action = ''
let icon = (
<HeartIconFilled
Expand All @@ -184,7 +187,15 @@ let FeedItem = ({
action = _(msg`reposted your post`)
icon = <RepostIcon size="xl" style={{color: t.palette.positive_600}} />
} else if (item.type === 'follow') {
action = _(msg`followed you`)
if (
item.notification.author.viewer?.following &&
gate('ungroup_follow_backs')
) {
isFollowBack = true
action = _(msg`followed you back`)
} else {
action = _(msg`followed you`)
}
icon = <PersonPlusIcon size="xl" style={{color: t.palette.primary_500}} />
} else if (item.type === 'feedgen-like') {
action = _(msg`liked your custom feed`)
Expand Down Expand Up @@ -260,7 +271,7 @@ let FeedItem = ({
visible={!isAuthorsExpanded}
authors={authors}
onToggleAuthorsExpanded={onToggleAuthorsExpanded}
showDmButton={item.type === 'starterpack-joined'}
showDmButton={item.type === 'starterpack-joined' || isFollowBack}
/>
<ExpandedAuthorsList visible={isAuthorsExpanded} authors={authors} />
<Text style={styles.meta}>
Expand Down

0 comments on commit 4f02da9

Please sign in to comment.