Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

[Experiment] Turn off interval polling for Discover (#3431)

* Include feed URL in feed events

* [Experiment] Turn off polling interval for Discover

authored by

dan and committed by
GitHub
8188f61e 1150007d

+54 -34
+2
src/lib/statsig/events.ts
··· 45 45 'onboarding:moderation:nextPressed': {} 46 46 'onboarding:finished:nextPressed': {} 47 47 'feed:endReached': { 48 + feedUrl: string 48 49 feedType: string 49 50 itemCount: number 50 51 } 51 52 'feed:refresh': { 53 + feedUrl: string 52 54 feedType: string 53 55 reason: 'pull-to-refresh' | 'soft-reset' | 'load-latest' 54 56 }
+30 -16
src/view/com/feeds/FeedPage.tsx
··· 1 1 import React from 'react' 2 + import {useWindowDimensions, View} from 'react-native' 3 + import {msg} from '@lingui/macro' 4 + import {useLingui} from '@lingui/react' 2 5 import {useNavigation} from '@react-navigation/native' 3 - import {useAnalytics} from 'lib/analytics/analytics' 4 6 import {useQueryClient} from '@tanstack/react-query' 7 + 8 + import {getRootNavigation, getTabState, TabState} from '#/lib/routes/helpers' 9 + import {logEvent, useGate} from '#/lib/statsig/statsig' 10 + import {isNative} from '#/platform/detection' 11 + import {listenSoftReset} from '#/state/events' 5 12 import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed' 6 - import {MainScrollProvider} from '../util/MainScrollProvider' 7 - import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 13 + import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' 14 + import {truncateAndInvalidate} from '#/state/queries/util' 15 + import {useSession} from '#/state/session' 8 16 import {useSetMinimalShellMode} from '#/state/shell' 9 - import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed' 17 + import {useComposerControls} from '#/state/shell/composer' 18 + import {useAnalytics} from 'lib/analytics/analytics' 19 + import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' 10 20 import {ComposeIcon2} from 'lib/icons' 11 21 import {s} from 'lib/styles' 12 - import {View, useWindowDimensions} from 'react-native' 13 - import {ListMethods} from '../util/List' 14 22 import {Feed} from '../posts/Feed' 15 23 import {FAB} from '../util/fab/FAB' 24 + import {ListMethods} from '../util/List' 16 25 import {LoadLatestBtn} from '../util/load-latest/LoadLatestBtn' 17 - import {msg} from '@lingui/macro' 18 - import {useLingui} from '@lingui/react' 19 - import {useSession} from '#/state/session' 20 - import {useComposerControls} from '#/state/shell/composer' 21 - import {listenSoftReset} from '#/state/events' 22 - import {truncateAndInvalidate} from '#/state/queries/util' 23 - import {TabState, getTabState, getRootNavigation} from '#/lib/routes/helpers' 24 - import {isNative} from '#/platform/detection' 25 - import {logEvent} from '#/lib/statsig/statsig' 26 + import {MainScrollProvider} from '../util/MainScrollProvider' 26 27 27 28 const POLL_FREQ = 60e3 // 60sec 28 29 ··· 71 72 setHasNew(false) 72 73 logEvent('feed:refresh', { 73 74 feedType: feed.split('|')[0], 75 + feedUrl: feed, 74 76 reason: 'soft-reset', 75 77 }) 76 78 } ··· 96 98 setHasNew(false) 97 99 logEvent('feed:refresh', { 98 100 feedType: feed.split('|')[0], 101 + feedUrl: feed, 99 102 reason: 'load-latest', 100 103 }) 101 104 }, [scrollToTop, feed, queryClient, setHasNew]) 102 105 106 + let feedPollInterval 107 + if ( 108 + useGate('disable_poll_on_discover') && 109 + feed === // Discover 110 + 'feedgen|at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.generator/whats-hot' 111 + ) { 112 + feedPollInterval = undefined 113 + } else { 114 + feedPollInterval = POLL_FREQ 115 + } 116 + 103 117 return ( 104 118 <View testID={testID} style={s.h100pct}> 105 119 <MainScrollProvider> ··· 108 122 enabled={isPageFocused} 109 123 feed={feed} 110 124 feedParams={feedParams} 111 - pollInterval={POLL_FREQ} 125 + pollInterval={feedPollInterval} 112 126 disablePoll={hasNew} 113 127 scrollElRef={scrollElRef} 114 128 onScrolledDownChange={setIsScrolledDown}
+22 -18
src/view/com/posts/Feed.tsx
··· 8 8 View, 9 9 ViewStyle, 10 10 } from 'react-native' 11 + import {msg} from '@lingui/macro' 12 + import {useLingui} from '@lingui/react' 11 13 import {useQueryClient} from '@tanstack/react-query' 12 - import {List, ListRef} from '../util/List' 13 - import {PostFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' 14 - import {FeedErrorMessage} from './FeedErrorMessage' 15 - import {FeedSlice} from './FeedSlice' 16 - import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' 17 - import {useAnalytics} from 'lib/analytics/analytics' 18 - import {useTheme} from 'lib/ThemeContext' 14 + 15 + import {FALLBACK_MARKER_POST} from '#/lib/api/feed/home' 16 + import {logEvent} from '#/lib/statsig/statsig' 19 17 import {logger} from '#/logger' 18 + import {isWeb} from '#/platform/detection' 19 + import {listenPostCreated} from '#/state/events' 20 + import {STALE} from '#/state/queries' 20 21 import { 21 - RQKEY, 22 22 FeedDescriptor, 23 23 FeedParams, 24 + pollLatest, 25 + RQKEY, 24 26 usePostFeedQuery, 25 - pollLatest, 26 27 } from '#/state/queries/post-feed' 27 - import {isWeb} from '#/platform/detection' 28 - import {listenPostCreated} from '#/state/events' 29 28 import {useSession} from '#/state/session' 30 - import {STALE} from '#/state/queries' 31 - import {msg} from '@lingui/macro' 32 - import {useLingui} from '@lingui/react' 29 + import {useAnalytics} from 'lib/analytics/analytics' 30 + import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender' 31 + import {useTheme} from 'lib/ThemeContext' 32 + import {List, ListRef} from '../util/List' 33 + import {PostFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' 34 + import {LoadMoreRetryBtn} from '../util/LoadMoreRetryBtn' 33 35 import {DiscoverFallbackHeader} from './DiscoverFallbackHeader' 34 - import {FALLBACK_MARKER_POST} from '#/lib/api/feed/home' 35 - import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender' 36 - import {logEvent} from '#/lib/statsig/statsig' 36 + import {FeedErrorMessage} from './FeedErrorMessage' 37 + import {FeedSlice} from './FeedSlice' 37 38 38 39 const LOADING_ITEM = {_reactKey: '__loading__'} 39 40 const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} ··· 217 218 track('Feed:onRefresh') 218 219 logEvent('feed:refresh', { 219 220 feedType: feedType, 221 + feedUrl: feed, 220 222 reason: 'pull-to-refresh', 221 223 }) 222 224 setIsPTRing(true) ··· 227 229 logger.error('Failed to refresh posts feed', {message: err}) 228 230 } 229 231 setIsPTRing(false) 230 - }, [refetch, track, setIsPTRing, onHasNew, feedType]) 232 + }, [refetch, track, setIsPTRing, onHasNew, feed, feedType]) 231 233 232 234 const onEndReached = React.useCallback(async () => { 233 235 if (isFetching || !hasNextPage || isError) return 234 236 235 237 logEvent('feed:endReached', { 236 238 feedType: feedType, 239 + feedUrl: feed, 237 240 itemCount: feedItems.length, 238 241 }) 239 242 track('Feed:onEndReached') ··· 248 251 isError, 249 252 fetchNextPage, 250 253 track, 254 + feed, 251 255 feedType, 252 256 feedItems.length, 253 257 ])