From 7d162c8101019aa6c47626c15417519d27460578 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Tue, 14 Feb 2023 15:33:36 -0600 Subject: [PATCH] Fix home feed positioning (closes #189) (#195) * Fix home feed positioning for floating header * Fix positioning of errors in home feed * Fix lint --- src/view/com/posts/Feed.tsx | 33 ++++++++++++++++----------------- src/view/screens/Home.tsx | 17 ++++++++++------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/view/com/posts/Feed.tsx b/src/view/com/posts/Feed.tsx index b33ef2cd53..1ed12f07a8 100644 --- a/src/view/com/posts/Feed.tsx +++ b/src/view/com/posts/Feed.tsx @@ -17,8 +17,8 @@ import {OnScrollCb} from '../../lib/hooks/useOnMainScroll' import {s} from '../../lib/styles' import {useAnalytics} from '@segment/analytics-react-native' -const HEADER_SPACER_ITEM = {_reactKey: '__spacer__'} const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} +const ERROR_FEED_ITEM = {_reactKey: '__error__'} export const Feed = observer(function Feed({ feed, @@ -27,7 +27,7 @@ export const Feed = observer(function Feed({ onPressTryAgain, onScroll, testID, - headerSpacer, + headerOffset = 0, }: { feed: FeedModel style?: StyleProp @@ -35,7 +35,7 @@ export const Feed = observer(function Feed({ onPressTryAgain?: () => void onScroll?: OnScrollCb testID?: string - headerSpacer?: boolean + headerOffset?: number }) { const {screen, track} = useAnalytics() @@ -56,12 +56,12 @@ export const Feed = observer(function Feed({ style={styles.emptyState} /> ) + } else if (item === ERROR_FEED_ITEM) { + return ( + + ) } - if (item === HEADER_SPACER_ITEM) { - return - } else { - return - } + return } const onRefresh = () => { track('Feed:onRefresh') @@ -77,13 +77,13 @@ export const Feed = observer(function Feed({ .loadMore() .catch(err => feed.rootStore.log.error('Failed to load more posts', err)) } - let data = [] - if (headerSpacer) { - data.push(HEADER_SPACER_ITEM) + let data: any[] = [] + if (feed.hasError) { + data = data.concat([ERROR_FEED_ITEM]) } if (feed.hasLoaded) { if (feed.isEmpty) { - data.push(EMPTY_FEED_ITEM) + data = data.concat([EMPTY_FEED_ITEM]) } else { data = data.concat(feed.feed) } @@ -99,10 +99,7 @@ export const Feed = observer(function Feed({ return ( {feed.isLoading && !data && } - {feed.hasError && ( - - )} - {feed.hasLoaded && data && ( + {data && ( )} @@ -122,7 +122,6 @@ export const Feed = observer(function Feed({ }) const styles = StyleSheet.create({ - headerSpacer: {height: 42}, feedFooter: {paddingTop: 20}, emptyState: {paddingVertical: 40}, }) diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 1bc844278b..d6356ad946 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -15,6 +15,7 @@ import {useOnMainScroll} from '../lib/hooks/useOnMainScroll' import {clamp} from 'lodash' import {useAnalytics} from '@segment/analytics-react-native' +const HEADER_HEIGHT = 42 const HITSLOP = {left: 20, top: 20, right: 20, bottom: 20} export const Home = observer(function Home({navIdx, visible}: ScreenParams) { @@ -42,12 +43,14 @@ export const Home = observer(function Home({navIdx, visible}: ScreenParams) { [appState, visible, store], ) - const onSoftReset = () => { - scrollElRef.current?.scrollToOffset({offset: 0}) - } + const scrollToTop = React.useCallback(() => { + // NOTE: the feed is offset by the height of the collapsing header, + // so we scroll to the negative of that height -prf + scrollElRef.current?.scrollToOffset({offset: -HEADER_HEIGHT}) + }, [scrollElRef]) useEffect(() => { - const softResetSub = store.onScreenSoftReset(onSoftReset) + const softResetSub = store.onScreenSoftReset(scrollToTop) const feedCleanup = store.me.mainFeed.registerListeners() const pollInterval = setInterval(() => doPoll(), 15e3) const cleanup = () => { @@ -72,7 +75,7 @@ export const Home = observer(function Home({navIdx, visible}: ScreenParams) { store.me.mainFeed.setup() } return cleanup - }, [visible, store, store.me.mainFeed, navIdx, doPoll, wasVisible]) + }, [visible, store, store.me.mainFeed, navIdx, doPoll, wasVisible, scrollToTop]) const onPressCompose = (imagesOpen?: boolean) => { track('Home:ComposeButtonPressed') @@ -83,7 +86,7 @@ export const Home = observer(function Home({navIdx, visible}: ScreenParams) { } const onPressLoadLatest = () => { store.me.mainFeed.refresh() - scrollElRef?.current?.scrollToOffset({offset: 0}) + scrollToTop() } return ( @@ -96,7 +99,7 @@ export const Home = observer(function Home({navIdx, visible}: ScreenParams) { style={s.h100pct} onPressTryAgain={onPressTryAgain} onScroll={onMainScroll} - headerSpacer + headerOffset={HEADER_HEIGHT} /> {store.me.mainFeed.hasNewLatest && !store.me.mainFeed.isRefreshing ? (