Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

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

Fix flashes when replacing For You (#3967)

* Fix flashes when replacing For You

* Switch to Discover if pinned after removing

authored by

dan and committed by
GitHub
08462375 51b4b22d

+54 -34
+40
src/state/queries/preferences/index.ts
··· 6 6 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 7 7 8 8 import {track} from '#/lib/analytics/analytics' 9 + import {PROD_DEFAULT_FEED} from '#/lib/constants' 9 10 import {replaceEqualDeep} from '#/lib/functions' 10 11 import {getAge} from '#/lib/strings/time' 11 12 import {STALE} from '#/state/queries' ··· 236 237 mutationFn: async savedFeed => { 237 238 await getAgent().removeSavedFeeds([savedFeed.id]) 238 239 track('CustomFeed:Unsave') 240 + // triggers a refetch 241 + await queryClient.invalidateQueries({ 242 + queryKey: preferencesQueryKey, 243 + }) 244 + }, 245 + }) 246 + } 247 + 248 + export function useReplaceForYouWithDiscoverFeedMutation() { 249 + const queryClient = useQueryClient() 250 + const {getAgent} = useAgent() 251 + 252 + return useMutation({ 253 + mutationFn: async ({ 254 + forYouFeedConfig, 255 + discoverFeedConfig, 256 + }: { 257 + forYouFeedConfig: AppBskyActorDefs.SavedFeed | undefined 258 + discoverFeedConfig: AppBskyActorDefs.SavedFeed | undefined 259 + }) => { 260 + if (forYouFeedConfig) { 261 + await getAgent().removeSavedFeeds([forYouFeedConfig.id]) 262 + } 263 + if (!discoverFeedConfig) { 264 + await getAgent().addSavedFeeds([ 265 + { 266 + type: 'feed', 267 + value: PROD_DEFAULT_FEED('whats-hot'), 268 + pinned: true, 269 + }, 270 + ]) 271 + } else { 272 + await getAgent().updateSavedFeeds([ 273 + { 274 + ...discoverFeedConfig, 275 + pinned: true, 276 + }, 277 + ]) 278 + } 239 279 // triggers a refetch 240 280 await queryClient.invalidateQueries({ 241 281 queryKey: preferencesQueryKey,
+14 -34
src/view/com/posts/FeedShutdownMsg.tsx
··· 6 6 import {PROD_DEFAULT_FEED} from '#/lib/constants' 7 7 import {logger} from '#/logger' 8 8 import { 9 - useAddSavedFeedsMutation, 10 9 usePreferencesQuery, 11 10 useRemoveFeedMutation, 12 - useUpdateSavedFeedsMutation, 11 + useReplaceForYouWithDiscoverFeedMutation, 13 12 } from '#/state/queries/preferences' 14 13 import {useSetSelectedFeed} from '#/state/shell/selected-feed' 15 14 import * as Toast from '#/view/com/util/Toast' ··· 24 23 const {_} = useLingui() 25 24 const setSelectedFeed = useSetSelectedFeed() 26 25 const {data: preferences} = usePreferencesQuery() 27 - const {mutateAsync: addSavedFeeds, isPending: isAddSavedFeedPending} = 28 - useAddSavedFeedsMutation() 29 26 const {mutateAsync: removeFeed, isPending: isRemovePending} = 30 27 useRemoveFeedMutation() 31 - const {mutateAsync: updateSavedFeeds, isPending: isUpdateFeedPending} = 32 - useUpdateSavedFeedsMutation() 28 + const {mutateAsync: replaceFeedWithDiscover, isPending: isReplacePending} = 29 + useReplaceForYouWithDiscoverFeedMutation() 33 30 34 31 const feedConfig = preferences?.savedFeeds?.find( 35 32 f => f.value === feedUri && f.pinned, ··· 45 42 if (feedConfig) { 46 43 await removeFeed(feedConfig) 47 44 Toast.show(_(msg`Removed from your feeds`)) 45 + } 46 + if (hasDiscoverPinned) { 47 + setSelectedFeed(`feedgen|${PROD_DEFAULT_FEED('whats-hot')}`) 48 48 } 49 49 } catch (err: any) { 50 50 Toast.show( ··· 54 54 ) 55 55 logger.error('Failed up update feeds', {message: err}) 56 56 } 57 - }, [removeFeed, feedConfig, _]) 57 + }, [removeFeed, feedConfig, _, hasDiscoverPinned, setSelectedFeed]) 58 58 59 59 const onReplaceFeed = React.useCallback(async () => { 60 60 try { 61 - if (!discoverFeedConfig) { 62 - await addSavedFeeds([ 63 - { 64 - type: 'feed', 65 - value: PROD_DEFAULT_FEED('whats-hot'), 66 - pinned: true, 67 - }, 68 - ]) 69 - } else { 70 - await updateSavedFeeds([ 71 - { 72 - ...discoverFeedConfig, 73 - pinned: true, 74 - }, 75 - ]) 76 - } 61 + await replaceFeedWithDiscover({ 62 + forYouFeedConfig: feedConfig, 63 + discoverFeedConfig, 64 + }) 77 65 setSelectedFeed(`feedgen|${PROD_DEFAULT_FEED('whats-hot')}`) 78 - if (feedConfig) { 79 - await removeFeed(feedConfig) 80 - } 81 66 Toast.show(_(msg`The feed has been replaced with Discover.`)) 82 67 } catch (err: any) { 83 68 Toast.show( ··· 88 73 logger.error('Failed up update feeds', {message: err}) 89 74 } 90 75 }, [ 91 - addSavedFeeds, 92 - updateSavedFeeds, 93 - removeFeed, 76 + replaceFeedWithDiscover, 94 77 discoverFeedConfig, 95 78 feedConfig, 96 79 setSelectedFeed, 97 80 _, 98 81 ]) 99 82 100 - const isProcessing = 101 - isAddSavedFeedPending || isUpdateFeedPending || isRemovePending 83 + const isProcessing = isReplacePending || isRemovePending 102 84 return ( 103 85 <View 104 86 style={[ ··· 147 129 <ButtonText> 148 130 <Trans>Replace with Discover</Trans> 149 131 </ButtonText> 150 - {(isAddSavedFeedPending || isUpdateFeedPending) && ( 151 - <ButtonIcon icon={Loader} /> 152 - )} 132 + {isReplacePending && <ButtonIcon icon={Loader} />} 153 133 </Button> 154 134 )} 155 135 </View>