From e1ba649560b9bb619dd445520ed9ea867f78ed4d Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Wed, 27 Dec 2023 08:53:24 -0800 Subject: [PATCH] Fixes to feed load triggers (#2323) * Add soft-reset support to ProfileFeed and ProfileList * Fix: correctly unsubscribe the notifications soft-reset listener --- src/view/screens/Notifications.tsx | 8 ++++++-- src/view/screens/ProfileFeed.tsx | 9 +++++++++ src/view/screens/ProfileList.tsx | 9 +++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/view/screens/Notifications.tsx b/src/view/screens/Notifications.tsx index e28a67e370..6e2f183056 100644 --- a/src/view/screens/Notifications.tsx +++ b/src/view/screens/Notifications.tsx @@ -1,6 +1,6 @@ import React from 'react' import {View} from 'react-native' -import {useFocusEffect} from '@react-navigation/native' +import {useFocusEffect, useIsFocused} from '@react-navigation/native' import {useQueryClient} from '@tanstack/react-query' import { NativeStackScreenProps, @@ -46,6 +46,7 @@ export function NotificationsScreen({}: Props) { const unreadNotifs = useUnreadNotifications() const unreadApi = useUnreadNotificationsApi() const hasNew = !!unreadNotifs + const isScreenFocused = useIsFocused() // event handlers // = @@ -83,8 +84,11 @@ export function NotificationsScreen({}: Props) { }, [screen, setMinimalShellMode]), ) React.useEffect(() => { + if (!isScreenFocused) { + return + } return listenSoftReset(onPressLoadLatest) - }, [onPressLoadLatest]) + }, [onPressLoadLatest, isScreenFocused]) const ListHeaderComponent = React.useCallback(() => { if (isDesktop) { diff --git a/src/view/screens/ProfileFeed.tsx b/src/view/screens/ProfileFeed.tsx index cde39a33f4..211306c0d0 100644 --- a/src/view/screens/ProfileFeed.tsx +++ b/src/view/screens/ProfileFeed.tsx @@ -57,6 +57,7 @@ import {useLikeMutation, useUnlikeMutation} from '#/state/queries/like' import {useComposerControls} from '#/state/shell/composer' import {truncateAndInvalidate} from '#/state/queries/util' import {isNative} from '#/platform/detection' +import {listenSoftReset} from '#/state/events' const SECTION_TITLES = ['Posts', 'About'] @@ -446,6 +447,7 @@ const FeedSection = React.forwardRef( const [hasNew, setHasNew] = React.useState(false) const [isScrolledDown, setIsScrolledDown] = React.useState(false) const queryClient = useQueryClient() + const isScreenFocused = useIsFocused() const onScrollToTop = useCallback(() => { scrollElRef.current?.scrollToOffset({ @@ -460,6 +462,13 @@ const FeedSection = React.forwardRef( scrollToTop: onScrollToTop, })) + React.useEffect(() => { + if (!isScreenFocused) { + return + } + return listenSoftReset(onScrollToTop) + }, [onScrollToTop, isScreenFocused]) + const renderPostsEmpty = useCallback(() => { return }, []) diff --git a/src/view/screens/ProfileList.tsx b/src/view/screens/ProfileList.tsx index 2db768cc57..c51758ae51 100644 --- a/src/view/screens/ProfileList.tsx +++ b/src/view/screens/ProfileList.tsx @@ -57,6 +57,7 @@ import { } from '#/state/queries/preferences' import {logger} from '#/logger' import {useAnalytics} from '#/lib/analytics/analytics' +import {listenSoftReset} from '#/state/events' const SECTION_TITLES_CURATE = ['Posts', 'About'] const SECTION_TITLES_MOD = ['About'] @@ -601,6 +602,7 @@ const FeedSection = React.forwardRef( const queryClient = useQueryClient() const [hasNew, setHasNew] = React.useState(false) const [isScrolledDown, setIsScrolledDown] = React.useState(false) + const isScreenFocused = useIsFocused() const onScrollToTop = useCallback(() => { scrollElRef.current?.scrollToOffset({ @@ -614,6 +616,13 @@ const FeedSection = React.forwardRef( scrollToTop: onScrollToTop, })) + React.useEffect(() => { + if (!isScreenFocused) { + return + } + return listenSoftReset(onScrollToTop) + }, [onScrollToTop, isScreenFocused]) + const renderPostsEmpty = useCallback(() => { return }, [])