From c61da0f3510e9cabb3b527a65c4bef86410cbb98 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Tue, 7 Nov 2023 00:56:20 +0000 Subject: [PATCH] wip --- src/view/screens/Profile.tsx | 224 ++++++++++++----------------------- 1 file changed, 76 insertions(+), 148 deletions(-) diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index f183ebbc2b..3751a51886 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -8,10 +8,12 @@ import {ViewSelector, ViewSelectorHandle} from '../com/util/ViewSelector' import {CenteredView} from '../com/util/Views' import {ScreenHider} from 'view/com/util/moderation/ScreenHider' import {ProfileUiModel, Sections} from 'state/models/ui/profile' +import {Feed} from 'view/com/posts/Feed' import {useStores} from 'state/index' import {PostsFeedSliceModel} from 'state/models/feeds/posts-slice' import {ProfileHeader} from '../com/profile/ProfileHeader' import {FeedSlice} from '../com/posts/FeedSlice' +import {PagerWithHeader} from 'view/com/pager/PagerWithHeader' import {ListCard} from 'view/com/lists/ListCard' import { PostFeedLoadingPlaceholder, @@ -31,6 +33,8 @@ import {useSetTitle} from 'lib/hooks/useSetTitle' import {combinedDisplayName} from 'lib/strings/display-names' import {logger} from '#/logger' +const SECTION_TITLES_PROFILE = ['Posts', 'Posts & Replies'] // TODO: Other sections + type Props = NativeStackScreenProps export const ProfileScreen = withAuthRequired( observer(function ProfileScreenImpl({route}: Props) { @@ -99,12 +103,7 @@ export const ProfileScreen = withAuthRequired( : uiState.profile.handle store.shell.openComposer({mention}) }, [store, track, uiState]) - const onSelectView = React.useCallback( - (index: number) => { - uiState.setSelectedViewIndex(index) - }, - [uiState], - ) + const onRefresh = React.useCallback(() => { uiState .refresh() @@ -112,13 +111,7 @@ export const ProfileScreen = withAuthRequired( logger.error('Failed to refresh user profile', {error: err}), ) }, [uiState]) - const onEndReached = React.useCallback(() => { - uiState.loadMore().catch((err: any) => - logger.error('Failed to load more entries in user profile', { - error: err, - }), - ) - }, [uiState]) + const onPressTryAgain = React.useCallback(() => { uiState.setup() }, [uiState]) @@ -139,126 +132,6 @@ export const ProfileScreen = withAuthRequired( ) }, [uiState, onRefresh, route.params.hideBackButton]) - const Footer = React.useMemo(() => { - return uiState.showLoadingMoreFooter ? LoadingMoreFooter : undefined - }, [uiState.showLoadingMoreFooter]) - const renderItem = React.useCallback( - (item: any) => { - // if section is lists - if (uiState.selectedView === Sections.Lists) { - if (item === ProfileUiModel.LOADING_ITEM) { - return - } else if (item._reactKey === '__error__') { - return ( - - - - ) - } else if (item === ProfileUiModel.EMPTY_ITEM) { - return ( - - ) - } else { - return - } - // if section is custom algorithms - } else if (uiState.selectedView === Sections.CustomAlgorithms) { - if (item === ProfileUiModel.LOADING_ITEM) { - return - } else if (item._reactKey === '__error__') { - return ( - - - - ) - } else if (item === ProfileUiModel.EMPTY_ITEM) { - return ( - - ) - } else if (item instanceof FeedSourceModel) { - return ( - - ) - } - // if section is posts or posts & replies - } else { - if (item === ProfileUiModel.END_ITEM) { - return - end of feed - - } else if (item === ProfileUiModel.LOADING_ITEM) { - return - } else if (item._reactKey === '__error__') { - if (uiState.feed.isBlocking) { - return ( - - ) - } - if (uiState.feed.isBlockedBy) { - return ( - - ) - } - return ( - - - - ) - } else if (item === ProfileUiModel.EMPTY_ITEM) { - return ( - - ) - } else if (item instanceof PostsFeedSliceModel) { - return ( - - ) - } - } - return - }, - [ - onPressTryAgain, - uiState.selectedView, - uiState.profile.did, - uiState.feed.isBlocking, - uiState.feed.isBlockedBy, - ], - ) - return ( - ) : uiState.profile.hasLoaded ? ( - ) : ( - {renderHeader()} + + + {({onScroll, headerHeight, isScrolledDown}) => ( + + )} + {({onScroll, headerHeight, isScrolledDown}) => ( + + )} + + )} ( + function FeedSectionImpl( + {feed, onScroll, headerHeight, isScrolledDown}, + ref, + ) { + const hasNew = feed.hasNewLatest && !feed.isRefreshing + const scrollElRef = React.useRef(null) + + const onScrollToTop = React.useCallback(() => { + scrollElRef.current?.scrollToOffset({offset: -headerHeight}) + feed.refresh() + }, [feed, scrollElRef, headerHeight]) + React.useImperativeHandle(ref, () => ({ + scrollToTop: onScrollToTop, + })) + + const renderPostsEmpty = React.useCallback(() => { + return + }, []) + + return ( + + + + ) + }, +) + function LoadingMoreFooter() { return (