Handle home algo with backwards compat

This commit is contained in:
Eric Bailey
2024-04-16 20:38:14 -05:00
parent 41b5b5b283
commit e3a4fcc152
8 changed files with 109 additions and 39 deletions
+3
View File
@@ -89,3 +89,6 @@ export const BSKY_FEED_OWNER_DIDS = [
'did:plc:vpkhqolt662uhesyj6nxm7ys',
'did:plc:q6gjnaw2blty4crticxkmujt',
]
export const DISCOVER_FEED_URI =
'at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot'
+1 -1
View File
@@ -8,5 +8,5 @@ export type Gate =
| 'new_search'
| 'receive_updates'
| 'show_follow_back_label'
| 'start_session_with_following'
| 'use_new_suggestions_endpoint'
| 'reduced_onboarding_and_home_algo'
+45 -5
View File
@@ -13,6 +13,8 @@ import {
useQuery,
} from '@tanstack/react-query'
import {DISCOVER_FEED_URI} from '#/lib/constants'
import {useGate} from '#/lib/statsig/statsig'
import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles'
import {STALE} from '#/state/queries'
@@ -199,10 +201,13 @@ export function useSearchPopularFeedsMutation() {
})
}
const FOLLOWING_FEED_STUB: FeedSourceInfo = {
/**
* The following feed, with fallbacks to Discover
*/
const HOME_FEED_STUB: FeedSourceInfo = {
type: 'feed',
displayName: 'Following',
uri: '',
uri: 'home',
route: {
href: '/',
name: 'Home',
@@ -219,7 +224,24 @@ const FOLLOWING_FEED_STUB: FeedSourceInfo = {
const DISCOVER_FEED_STUB: FeedSourceInfo = {
type: 'feed',
displayName: 'Discover',
uri: '',
uri: DISCOVER_FEED_URI, // TODO may not want this
route: {
href: '/',
name: 'Home',
params: {},
},
cid: '',
avatar: '',
description: new RichText({text: ''}),
creatorDid: '',
creatorHandle: '',
likeCount: 0,
likeUri: '',
}
const HOME_ALGO_FEED_STUB: FeedSourceInfo = {
type: 'feed',
displayName: 'Home',
uri: 'home-algo',
route: {
href: '/',
name: 'Home',
@@ -239,7 +261,17 @@ const pinnedFeedInfosQueryKeyRoot = 'pinnedFeedsInfos'
export function usePinnedFeedsInfos() {
const {hasSession} = useSession()
const {data: preferences, isLoading: isLoadingPrefs} = usePreferencesQuery()
const pinnedUris = preferences?.feeds?.pinned ?? []
const isHomeAlgoExperimentEnabled = useGate(
'reduced_onboarding_and_home_algo',
)
const homeAlgo = preferences?.homeAlgo
const pinnedUris = (preferences?.feeds?.pinned ?? []).filter(f => {
if (isHomeAlgoExperimentEnabled && hasSession && homeAlgo) {
// remove duplicate feed
return f !== homeAlgo.uri
}
return true
})
return useQuery({
staleTime: STALE.INFINITY,
@@ -285,7 +317,15 @@ export function usePinnedFeedsInfos() {
)
// The returned result will have the original order.
const result = [hasSession ? FOLLOWING_FEED_STUB : DISCOVER_FEED_STUB]
let result = [hasSession ? HOME_FEED_STUB : DISCOVER_FEED_STUB]
if (isHomeAlgoExperimentEnabled && hasSession && preferences?.homeAlgo) {
const {enabled, uri} = preferences.homeAlgo
if (enabled && uri) {
result = [HOME_ALGO_FEED_STUB, HOME_FEED_STUB]
}
}
await Promise.allSettled([feedsPromise, ...listsPromises])
for (let pinnedUri of pinnedUris) {
if (resolved.has(pinnedUri)) {
+1
View File
@@ -44,6 +44,7 @@ type AuthorFilter =
type FeedUri = string
type ListUri = string
export type FeedDescriptor =
| 'home-algo'
| 'home'
| 'following'
| `author|${ActorDid}|${AuthorFilter}`
+5 -4
View File
@@ -1,8 +1,8 @@
import {
UsePreferencesQueryResponse,
ThreadViewPreferences,
} from '#/state/queries/preferences/types'
import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation'
import {
ThreadViewPreferences,
UsePreferencesQueryResponse,
} from '#/state/queries/preferences/types'
export const DEFAULT_HOME_FEED_PREFS: UsePreferencesQueryResponse['feedViewPrefs'] =
{
@@ -45,4 +45,5 @@ export const DEFAULT_LOGGED_OUT_PREFERENCES: UsePreferencesQueryResponse = {
threadViewPrefs: DEFAULT_THREAD_VIEW_PREFS,
userAge: 13, // TODO(pwi)
interests: {tags: []},
homeAlgo: {enabled: undefined},
}
+8 -5
View File
@@ -1,12 +1,13 @@
import React from 'react'
import {RenderTabBarFnProps} from 'view/com/pager/Pager'
import {HomeHeaderLayout} from './HomeHeaderLayout'
import {FeedSourceInfo} from '#/state/queries/feed'
import {useNavigation} from '@react-navigation/native'
import {usePalette} from '#/lib/hooks/usePalette'
import {FeedSourceInfo} from '#/state/queries/feed'
import {NavigationProp} from 'lib/routes/types'
import {isWeb} from 'platform/detection'
import {RenderTabBarFnProps} from 'view/com/pager/Pager'
import {TabBar} from '../pager/TabBar'
import {usePalette} from '#/lib/hooks/usePalette'
import {HomeHeaderLayout} from './HomeHeaderLayout'
export function HomeHeader(
props: RenderTabBarFnProps & {
@@ -20,7 +21,9 @@ export function HomeHeader(
const pal = usePalette('default')
const hasPinnedCustom = React.useMemo<boolean>(() => {
return feeds.some(tab => tab.uri !== '')
return feeds.some(
tab => !['home', 'home-algo', 'following'].includes(tab.uri),
)
}, [feeds])
const items = React.useMemo(() => {
+32 -13
View File
@@ -53,19 +53,34 @@ function HomeScreenReady({
pinnedFeedInfos: FeedSourceInfo[]
}) {
useOTAUpdates()
const isHomeAlgoExperimentEnabled = useGate(
'reduced_onboarding_and_home_algo',
)
const allFeeds = React.useMemo(() => {
const feeds: FeedDescriptor[] = []
feeds.push('home')
for (const {uri} of pinnedFeedInfos) {
if (uri.includes('app.bsky.feed.generator')) {
feeds.push(`feedgen|${uri}`)
} else if (uri.includes('app.bsky.graph.list')) {
feeds.push(`list|${uri}`)
} else if (uri === 'home-algo') {
// TODO can I ever end up here without a feed?
if (
isHomeAlgoExperimentEnabled &&
preferences.homeAlgo.enabled &&
preferences.homeAlgo.uri
) {
feeds.push(`feedgen|${preferences.homeAlgo.uri}`)
}
} else if (uri === 'home') {
feeds.push('home')
} else if (uri === 'following') {
feeds.push('following')
}
}
return feeds
}, [pinnedFeedInfos])
}, [pinnedFeedInfos, isHomeAlgoExperimentEnabled, preferences.homeAlgo])
const rawSelectedFeed = useSelectedFeed()
const setSelectedFeed = useSetSelectedFeed()
@@ -186,7 +201,6 @@ function HomeScreenReady({
return <CustomFeedEmptyState />
}, [])
const [homeFeed, ...customFeeds] = allFeeds
const homeFeedParams = React.useMemo<FeedParams>(() => {
return {
mergeFeedEnabled: Boolean(preferences.feedViewPrefs.lab_mergeFeedEnabled),
@@ -206,16 +220,21 @@ function HomeScreenReady({
onPageSelected={onPageSelected}
onPageScrollStateChanged={onPageScrollStateChanged}
renderTabBar={renderTabBar}>
<FeedPage
key={homeFeed}
testID="followingFeedPage"
isPageFocused={selectedFeed === homeFeed}
feed={homeFeed}
feedParams={homeFeedParams}
renderEmptyState={renderFollowingEmptyState}
renderEndOfFeed={FollowingEndOfFeed}
/>
{customFeeds.map(feed => {
{allFeeds.map(feed => {
if (feed === 'home') {
return (
<FeedPage
key={'home'}
testID="followingFeedPage"
isPageFocused={selectedFeed === 'home'}
feed={'home'}
feedParams={homeFeedParams}
renderEmptyState={renderFollowingEmptyState}
renderEndOfFeed={FollowingEndOfFeed}
/>
)
}
return (
<FeedPage
key={feed}
+14 -11
View File
@@ -1,16 +1,17 @@
import React from 'react'
import {View, StyleSheet} from 'react-native'
import {useNavigationState, useNavigation} from '@react-navigation/native'
import {usePalette} from 'lib/hooks/usePalette'
import {TextLink} from 'view/com/util/Link'
import {getCurrentRoute} from 'lib/routes/helpers'
import {useLingui} from '@lingui/react'
import {StyleSheet, View} from 'react-native'
import {msg} from '@lingui/macro'
import {usePinnedFeedsInfos} from '#/state/queries/feed'
import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed'
import {FeedDescriptor} from '#/state/queries/post-feed'
import {NavigationProp} from 'lib/routes/types'
import {useLingui} from '@lingui/react'
import {useNavigation, useNavigationState} from '@react-navigation/native'
import {emitSoftReset} from '#/state/events'
import {usePinnedFeedsInfos} from '#/state/queries/feed'
import {FeedDescriptor} from '#/state/queries/post-feed'
import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed'
import {usePalette} from 'lib/hooks/usePalette'
import {getCurrentRoute} from 'lib/routes/helpers'
import {NavigationProp} from 'lib/routes/types'
import {TextLink} from 'view/com/util/Link'
export function DesktopFeeds() {
const pal = usePalette('default')
@@ -33,8 +34,10 @@ export function DesktopFeeds() {
{pinnedFeedInfos.map(feedInfo => {
const uri = feedInfo.uri
let feed: FeedDescriptor
if (!uri) {
if (uri === 'home') {
feed = 'home'
} else if (uri === 'home-algo') {
feed = 'home-algo'
} else if (uri.includes('app.bsky.feed.generator')) {
feed = `feedgen|${uri}`
} else if (uri.includes('app.bsky.graph.list')) {