diff --git a/src/analytics/features/types.ts b/src/analytics/features/types.ts index 1d6cf131c1..22cf07ad85 100644 --- a/src/analytics/features/types.ts +++ b/src/analytics/features/types.ts @@ -23,5 +23,8 @@ export enum Features { SearchStarterPacksV2Enable = 'search_starter_packs_v2:enable', FollowSortEnable = 'follow_sort:enable', + // values + TrendingDiscoverValues = 'trending_discover:values', + AATest = 'aa-test', } diff --git a/src/analytics/index.tsx b/src/analytics/index.tsx index 20f919f501..51438c2d7b 100644 --- a/src/analytics/index.tsx +++ b/src/analytics/index.tsx @@ -6,7 +6,7 @@ import { useSyncExternalStore, } from 'react' import {Platform} from 'react-native' -import {type Result} from '@growthbook/growthbook-react' +import {type Result, type WidenPrimitives} from '@growthbook/growthbook-react' import {Logger} from '#/logger' import { @@ -67,6 +67,7 @@ export type AnalyticsContextType = { ) => void features: typeof Features & { enabled(feature: Features): boolean + getValue(feature: Features, defaultValue: T): WidenPrimitives } } export type AnalyticsBaseContextType = Omit @@ -83,6 +84,7 @@ function createLogger( warn: logger.warn.bind(logger), error: logger.error.bind(logger), useChild: (context: Exclude) => { + // oxlint-disable-next-line react-hooks/exhaustive-deps return useMemo(() => createLogger(context, metadata), [context, metadata]) }, Context: Logger.Context, @@ -314,6 +316,7 @@ export function AnalyticsFeaturesContext({ ...parentContext, features: { enabled: feats.isOn.bind(feats), + getValue: feats.getFeatureValue.bind(feats), ...Features, }, } diff --git a/src/view/com/posts/PostFeed.tsx b/src/view/com/posts/PostFeed.tsx index 0100856307..4f341922bb 100644 --- a/src/view/com/posts/PostFeed.tsx +++ b/src/view/com/posts/PostFeed.tsx @@ -211,10 +211,6 @@ export type PostFeedRef = { // const REFRESH_AFTER = STALE.HOURS.ONE const CHECK_LATEST_AFTER = STALE.SECONDS.THIRTY -const TRENDING_TOPICS_INDEX = 5 -const TRENDING_VIDEO_INDEX = 30 -const SUGGESTED_FOR_YOU_INDEX = 15 - let PostFeed = ({ feed, description, @@ -280,6 +276,15 @@ let PostFeed = ({ const {rightNavVisible} = useLayoutBreakpoints() const areVideoFeedsEnabled = IS_NATIVE + const trendingIndices = ax.features.getValue( + ax.features.TrendingDiscoverValues, + { + topics: 5, + accounts: 15, + videos: 30, + }, + ) + const [hasPressedShowLessUris, setHasPressedShowLessUris] = useState( () => new Set(), ) @@ -574,19 +579,19 @@ let PostFeed = ({ key: 'composerPrompt-' + sliceIndex, }) } - } else if (sliceIndex === TRENDING_TOPICS_INDEX) { + } else if (sliceIndex === trendingIndices.topics) { arr.push({ type: 'interstitialFeedTrendingTopics', key: 'interstitialFeedTrendingTopics-' + sliceIndex, }) - } else if (sliceIndex === TRENDING_VIDEO_INDEX) { + } else if (sliceIndex === trendingIndices.videos) { if (areVideoFeedsEnabled && !trendingVideoDisabled) { arr.push({ type: 'interstitialTrendingVideos', key: 'interstitial-' + sliceIndex + '-' + lastFetchedAt, }) } - } else if (sliceIndex === SUGGESTED_FOR_YOU_INDEX) { + } else if (sliceIndex === trendingIndices.accounts) { arr.push({ type: 'interstitialFollows', key: 'interstitial-' + sliceIndex + '-' + lastFetchedAt, @@ -739,6 +744,7 @@ let PostFeed = ({ ageAssuranceBannerState, isCurrentFeedAtStartupSelected, blockedOrMutedAuthors, + trendingIndices, ]) // events