diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts index 0e6eef52ca..b898881972 100644 --- a/src/state/queries/post-feed.ts +++ b/src/state/queries/post-feed.ts @@ -3,37 +3,37 @@ import {AppState} from 'react-native' import { AppBskyFeedDefs, AppBskyFeedPost, - ModerationDecision, AtUri, + ModerationDecision, } from '@atproto/api' import { - useInfiniteQuery, InfiniteData, - QueryKey, QueryClient, + QueryKey, + useInfiniteQuery, useQueryClient, } from '@tanstack/react-query' -import {moderatePost_wrapped as moderatePost} from '#/lib/moderatePost_wrapped' -import {useFeedTuners} from '../preferences/feed-tuners' -import {FeedTuner, FeedTunerFn, NoopFeedTuner} from 'lib/api/feed-manip' -import {FeedAPI, ReasonFeedSource} from 'lib/api/feed/types' -import {FollowingFeedAPI} from 'lib/api/feed/following' -import {AuthorFeedAPI} from 'lib/api/feed/author' -import {LikesFeedAPI} from 'lib/api/feed/likes' -import {CustomFeedAPI} from 'lib/api/feed/custom' -import {ListFeedAPI} from 'lib/api/feed/list' -import {MergeFeedAPI} from 'lib/api/feed/merge' + import {HomeFeedAPI} from '#/lib/api/feed/home' +import {moderatePost_wrapped as moderatePost} from '#/lib/moderatePost_wrapped' import {logger} from '#/logger' import {STALE} from '#/state/queries' -import {precacheFeedPostProfiles} from './profile' -import {getAgent} from '#/state/session' import {DEFAULT_LOGGED_OUT_PREFERENCES} from '#/state/queries/preferences/const' -import {KnownError} from '#/view/com/posts/FeedErrorMessage' -import {embedViewRecordToPostView, getEmbeddedPost} from './util' -import {useModerationOpts} from './preferences' -import {queryClient} from 'lib/react-query' +import {getAgent} from '#/state/session' +import {AuthorFeedAPI} from 'lib/api/feed/author' +import {CustomFeedAPI} from 'lib/api/feed/custom' +import {FollowingFeedAPI} from 'lib/api/feed/following' +import {LikesFeedAPI} from 'lib/api/feed/likes' +import {ListFeedAPI} from 'lib/api/feed/list' +import {MergeFeedAPI} from 'lib/api/feed/merge' +import {FeedAPI, ReasonFeedSource} from 'lib/api/feed/types' +import {FeedTuner, FeedTunerFn, NoopFeedTuner} from 'lib/api/feed-manip' import {BSKY_FEED_OWNER_DIDS} from 'lib/constants' +import {KnownError} from '#/view/com/posts/FeedErrorMessage' +import {useFeedTuners} from '../preferences/feed-tuners' +import {useModerationOpts} from './preferences' +import {precacheFeedPostProfiles} from './profile' +import {embedViewRecordToPostView, getEmbeddedPost} from './util' type ActorDid = string type AuthorFilter = @@ -458,7 +458,11 @@ function assertSomePostsPassModeration(feed: AppBskyFeedDefs.FeedViewPost[]) { } } -export function resetProfilePostsQueries(did: string, timeout = 0) { +export function resetProfilePostsQueries( + queryClient: QueryClient, + did: string, + timeout = 0, +) { setTimeout(() => { queryClient.resetQueries({ predicate: query => diff --git a/src/state/queries/profile.ts b/src/state/queries/profile.ts index 3c9e3e41c3..0029008627 100644 --- a/src/state/queries/profile.ts +++ b/src/state/queries/profile.ts @@ -1,32 +1,33 @@ import {useCallback} from 'react' +import {Image as RNImage} from 'react-native-image-crop-picker' import { - AtUri, AppBskyActorDefs, - AppBskyActorProfile, AppBskyActorGetProfile, - AppBskyFeedDefs, + AppBskyActorProfile, AppBskyEmbedRecord, AppBskyEmbedRecordWithMedia, + AppBskyFeedDefs, + AtUri, } from '@atproto/api' import { + QueryClient, + useMutation, useQuery, useQueryClient, - useMutation, - QueryClient, } from '@tanstack/react-query' -import {Image as RNImage} from 'react-native-image-crop-picker' -import {useSession, getAgent} from '../session' -import {updateProfileShadow} from '../cache/profile-shadow' + +import {track} from '#/lib/analytics/analytics' import {uploadBlob} from '#/lib/api' import {until} from '#/lib/async/until' -import {Shadow} from '#/state/cache/types' -import {resetProfilePostsQueries} from '#/state/queries/post-feed' import {useToggleMutationQueue} from '#/lib/hooks/useToggleMutationQueue' -import {RQKEY as RQKEY_MY_MUTED} from './my-muted-accounts' -import {RQKEY as RQKEY_MY_BLOCKED} from './my-blocked-accounts' -import {STALE} from '#/state/queries' -import {track} from '#/lib/analytics/analytics' import {logEvent, LogEvents} from '#/lib/statsig/statsig' +import {Shadow} from '#/state/cache/types' +import {STALE} from '#/state/queries' +import {resetProfilePostsQueries} from '#/state/queries/post-feed' +import {updateProfileShadow} from '../cache/profile-shadow' +import {getAgent, useSession} from '../session' +import {RQKEY as RQKEY_MY_BLOCKED} from './my-blocked-accounts' +import {RQKEY as RQKEY_MY_MUTED} from './my-muted-accounts' import {ThreadNode} from './post-thread' export const RQKEY = (did: string) => ['profile', did] @@ -406,13 +407,14 @@ function useProfileBlockMutation() { }, onSuccess(_, {did}) { queryClient.invalidateQueries({queryKey: RQKEY_MY_BLOCKED()}) - resetProfilePostsQueries(did, 1000) + resetProfilePostsQueries(queryClient, did, 1000) }, }) } function useProfileUnblockMutation() { const {currentAccount} = useSession() + const queryClient = useQueryClient() return useMutation({ mutationFn: async ({blockUri}) => { if (!currentAccount) { @@ -425,7 +427,7 @@ function useProfileUnblockMutation() { }) }, onSuccess(_, {did}) { - resetProfilePostsQueries(did, 1000) + resetProfilePostsQueries(queryClient, did, 1000) }, }) } diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index d5a46c5c98..6073b95716 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -1,6 +1,5 @@ import React, {useMemo} from 'react' import {StyleSheet} from 'react-native' -import {useFocusEffect} from '@react-navigation/native' import { AppBskyActorDefs, moderateProfile, @@ -9,36 +8,38 @@ import { } from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' -import {NativeStackScreenProps, CommonNavigatorParams} from 'lib/routes/types' -import {CenteredView} from '../com/util/Views' -import {ListRef} from '../com/util/List' -import {ScreenHider} from '#/components/moderation/ScreenHider' -import {ProfileLists} from '../com/lists/ProfileLists' -import {ProfileFeedgens} from '../com/feeds/ProfileFeedgens' -import {PagerWithHeader} from 'view/com/pager/PagerWithHeader' -import {ErrorScreen} from '../com/util/error/ErrorScreen' -import {FAB} from '../com/util/fab/FAB' -import {s, colors} from 'lib/styles' -import {useAnalytics} from 'lib/analytics/analytics' -import {ComposeIcon2} from 'lib/icons' -import {useSetTitle} from 'lib/hooks/useSetTitle' -import {combinedDisplayName} from 'lib/strings/display-names' -import {resetProfilePostsQueries} from '#/state/queries/post-feed' -import {useResolveDidQuery} from '#/state/queries/resolve-uri' -import {useProfileQuery} from '#/state/queries/profile' -import {useProfileShadow} from '#/state/cache/profile-shadow' -import {useSession, getAgent} from '#/state/session' -import {useModerationOpts} from '#/state/queries/preferences' -import {useLabelerInfoQuery} from '#/state/queries/labeler' -import {useSetDrawerSwipeDisabled, useSetMinimalShellMode} from '#/state/shell' -import {cleanError} from '#/lib/strings/errors' -import {useComposerControls} from '#/state/shell/composer' -import {listenSoftReset} from '#/state/events' -import {isInvalidHandle} from '#/lib/strings/handles' +import {useFocusEffect} from '@react-navigation/native' +import {useQueryClient} from '@tanstack/react-query' +import {cleanError} from '#/lib/strings/errors' +import {isInvalidHandle} from '#/lib/strings/handles' +import {useProfileShadow} from '#/state/cache/profile-shadow' +import {listenSoftReset} from '#/state/events' +import {useLabelerInfoQuery} from '#/state/queries/labeler' +import {resetProfilePostsQueries} from '#/state/queries/post-feed' +import {useModerationOpts} from '#/state/queries/preferences' +import {useProfileQuery} from '#/state/queries/profile' +import {useResolveDidQuery} from '#/state/queries/resolve-uri' +import {getAgent, useSession} from '#/state/session' +import {useSetDrawerSwipeDisabled, useSetMinimalShellMode} from '#/state/shell' +import {useComposerControls} from '#/state/shell/composer' +import {useAnalytics} from 'lib/analytics/analytics' +import {useSetTitle} from 'lib/hooks/useSetTitle' +import {ComposeIcon2} from 'lib/icons' +import {CommonNavigatorParams, NativeStackScreenProps} from 'lib/routes/types' +import {combinedDisplayName} from 'lib/strings/display-names' +import {colors, s} from 'lib/styles' +import {PagerWithHeader} from 'view/com/pager/PagerWithHeader' +import {ProfileHeader, ProfileHeaderLoading} from '#/screens/Profile/Header' import {ProfileFeedSection} from '#/screens/Profile/Sections/Feed' import {ProfileLabelsSection} from '#/screens/Profile/Sections/Labels' -import {ProfileHeader, ProfileHeaderLoading} from '#/screens/Profile/Header' +import {ScreenHider} from '#/components/moderation/ScreenHider' +import {ProfileFeedgens} from '../com/feeds/ProfileFeedgens' +import {ProfileLists} from '../com/lists/ProfileLists' +import {ErrorScreen} from '../com/util/error/ErrorScreen' +import {FAB} from '../com/util/fab/FAB' +import {ListRef} from '../com/util/List' +import {CenteredView} from '../com/util/Views' interface SectionRef { scrollToTop: () => void @@ -48,6 +49,7 @@ type Props = NativeStackScreenProps export function ProfileScreen({route}: Props) { const {_} = useLingui() const {currentAccount} = useSession() + const queryClient = useQueryClient() const name = route.params.name === 'me' ? currentAccount?.did : route.params.name const moderationOpts = useModerationOpts() @@ -78,9 +80,9 @@ export function ProfileScreen({route}: Props) { // When we open the profile, we want to reset the posts query if we are blocked. React.useEffect(() => { if (resolvedDid && profile?.viewer?.blockedBy) { - resetProfilePostsQueries(resolvedDid) + resetProfilePostsQueries(queryClient, resolvedDid) } - }, [profile?.viewer?.blockedBy, resolvedDid]) + }, [queryClient, profile?.viewer?.blockedBy, resolvedDid]) // Most pushes will happen here, since we will have only placeholder data if (isLoadingDid || isLoadingProfile) {