diff options
Diffstat (limited to 'src/view/screens')
-rw-r--r-- | src/view/screens/Feeds.tsx | 4 | ||||
-rw-r--r-- | src/view/screens/Notifications.tsx | 21 | ||||
-rw-r--r-- | src/view/screens/Profile.tsx | 18 |
3 files changed, 31 insertions, 12 deletions
diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx index 9b3fd6181..6651084bd 100644 --- a/src/view/screens/Feeds.tsx +++ b/src/view/screens/Feeds.tsx @@ -30,6 +30,7 @@ import { useFeedSourceInfoQuery, useGetPopularFeedsQuery, useSearchPopularFeedsMutation, + getAvatarTypeFromUri, } from '#/state/queries/feed' import {cleanError} from 'lib/strings/errors' import {useComposerControls} from '#/state/shell/composer' @@ -555,6 +556,7 @@ function SavedFeed({feedUri}: {feedUri: string}) { const pal = usePalette('default') const {isMobile} = useWebMediaQueries() const {data: info, error} = useFeedSourceInfoQuery({uri: feedUri}) + const typeAvatar = getAvatarTypeFromUri(feedUri) if (!info) return ( @@ -582,7 +584,7 @@ function SavedFeed({feedUri}: {feedUri: string}) { /> </View> ) : ( - <UserAvatar type="algo" size={28} avatar={info.avatar} /> + <UserAvatar type={typeAvatar} size={28} avatar={info.avatar} /> )} <View style={{flex: 1, flexDirection: 'row', gap: 8, alignItems: 'center'}}> diff --git a/src/view/screens/Notifications.tsx b/src/view/screens/Notifications.tsx index 6e2f18305..03f0a8f61 100644 --- a/src/view/screens/Notifications.tsx +++ b/src/view/screens/Notifications.tsx @@ -27,6 +27,7 @@ import { import {RQKEY as NOTIFS_RQKEY} from '#/state/queries/notifications/feed' import {listenSoftReset, emitSoftReset} from '#/state/events' import {truncateAndInvalidate} from '#/state/queries/util' +import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback' import {isNative} from '#/platform/detection' type Props = NativeStackScreenProps< @@ -38,7 +39,6 @@ export function NotificationsScreen({}: Props) { const setMinimalShellMode = useSetMinimalShellMode() const [isScrolledDown, setIsScrolledDown] = React.useState(false) const scrollElRef = React.useRef<ListMethods>(null) - const checkLatestRef = React.useRef<() => void | null>() const {screen} = useAnalytics() const pal = usePalette('default') const {isDesktop} = useWebMediaQueries() @@ -66,12 +66,19 @@ export function NotificationsScreen({}: Props) { } }, [scrollToTop, queryClient, unreadApi, hasNew]) - const onFocusCheckLatest = React.useCallback(() => { + const onFocusCheckLatest = useNonReactiveCallback(() => { // on focus, check for latest, but only invalidate if the user // isnt scrolled down to avoid moving content underneath them - unreadApi.checkUnread({invalidate: !isScrolledDown}) - }, [unreadApi, isScrolledDown]) - checkLatestRef.current = onFocusCheckLatest + let currentIsScrolledDown + if (isNative) { + currentIsScrolledDown = isScrolledDown + } else { + // On the web, this isn't always updated in time so + // we're just going to look it up synchronously. + currentIsScrolledDown = window.scrollY > 200 + } + unreadApi.checkUnread({invalidate: !currentIsScrolledDown}) + }) // on-visible setup // = @@ -80,8 +87,8 @@ export function NotificationsScreen({}: Props) { setMinimalShellMode(false) logger.debug('NotificationsScreen: Focus') screen('Notifications') - checkLatestRef.current?.() - }, [screen, setMinimalShellMode]), + onFocusCheckLatest() + }, [screen, setMinimalShellMode, onFocusCheckLatest]), ) React.useEffect(() => { if (!isScreenFocused) { diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index 7fc4d7a20..6d0f15d81 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -21,7 +21,10 @@ 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 {FeedDescriptor} from '#/state/queries/post-feed' +import { + FeedDescriptor, + 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' @@ -55,13 +58,13 @@ export function ProfileScreen({route}: Props) { data: resolvedDid, error: resolveError, refetch: refetchDid, - isInitialLoading: isInitialLoadingDid, + isLoading: isLoadingDid, } = useResolveDidQuery(name) const { data: profile, error: profileError, refetch: refetchProfile, - isInitialLoading: isInitialLoadingProfile, + isLoading: isLoadingProfile, } = useProfileQuery({ did: resolvedDid, }) @@ -74,7 +77,14 @@ export function ProfileScreen({route}: Props) { } }, [resolveError, refetchDid, refetchProfile]) - if (isInitialLoadingDid || isInitialLoadingProfile || !moderationOpts) { + // 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) + } + }, [profile?.viewer?.blockedBy, resolvedDid]) + + if (isLoadingDid || isLoadingProfile || !moderationOpts) { return ( <CenteredView> <ProfileHeader |