import React, {useEffect, useState} from 'react' import {ActivityIndicator, StyleSheet, View} from 'react-native' import {observer} from 'mobx-react-lite' import {ViewSelector} from '../com/util/ViewSelector' import {ScreenParams} from '../routes' import {ProfileUiModel, Sections} from '../../state/models/profile-ui' import {useStores} from '../../state' import {ProfileHeader} from '../com/profile/ProfileHeader' import {FeedItem} from '../com/posts/FeedItem' import {PostFeedLoadingPlaceholder} from '../com/util/LoadingPlaceholder' import {ErrorScreen} from '../com/util/error/ErrorScreen' import {ErrorMessage} from '../com/util/error/ErrorMessage' import {EmptyState} from '../com/util/EmptyState' import {Text} from '../com/util/text/Text' import {FAB} from '../com/util/FAB' import {s, colors} from '../lib/styles' import {useOnMainScroll} from '../lib/hooks/useOnMainScroll' const LOADING_ITEM = {_reactKey: '__loading__'} const END_ITEM = {_reactKey: '__end__'} const EMPTY_ITEM = {_reactKey: '__empty__'} export const Profile = observer(({navIdx, visible, params}: ScreenParams) => { const store = useStores() const onMainScroll = useOnMainScroll(store) const [hasSetup, setHasSetup] = useState(false) const uiState = React.useMemo( () => new ProfileUiModel(store, {user: params.name}), [params.user], ) useEffect(() => { let aborted = false const feedCleanup = uiState.feed.registerListeners() if (!visible) { return feedCleanup } if (hasSetup) { uiState.update() } else { store.nav.setTitle(navIdx, params.name) uiState.setup().then(() => { if (aborted) { return } setHasSetup(true) }) } return () => { aborted = true feedCleanup() } }, [visible, params.name, store]) // events // = const onSelectView = (index: number) => { uiState.setSelectedViewIndex(index) } const onRefresh = () => { uiState .refresh() .catch((err: any) => store.log.error('Failed to refresh user profile', err), ) } const onEndReached = () => { uiState .loadMore() .catch((err: any) => store.log.error('Failed to load more entries in user profile', err), ) } const onPressTryAgain = () => { uiState.setup() } const onPressCompose = () => { store.shell.openComposer({}) } // rendering // = const renderHeader = () => { if (!uiState) { return } return } let renderItem let Footer let items: any[] = [] if (uiState) { if (uiState.isInitialLoading) { items = items.concat([LOADING_ITEM]) renderItem = () => } else if (uiState.currentView.hasError) { items = items.concat([ { _reactKey: '__error__', error: uiState.currentView.error, }, ]) renderItem = (item: any) => ( ) } else { if ( uiState.selectedView === Sections.Posts || uiState.selectedView === Sections.PostsWithReplies ) { if (uiState.feed.hasContent) { if (uiState.selectedView === Sections.Posts) { items = uiState.feed.nonReplyFeed } else { items = uiState.feed.feed.slice() } if (!uiState.feed.hasMore) { items = items.concat([END_ITEM]) } else { Footer = LoadingMoreFooter } renderItem = (item: any) => { if (item === END_ITEM) { return - end of feed - } return } } else if (uiState.feed.isEmpty) { items = items.concat([EMPTY_ITEM]) renderItem = () => ( ) } } else { items = items.concat([EMPTY_ITEM]) renderItem = () => TODO } } } if (!renderItem) { renderItem = () => } return ( {uiState.profile.hasError ? ( ) : uiState.profile.hasLoaded ? ( ) : ( renderHeader() )} ) }) function LoadingMoreFooter() { return ( ) } const styles = StyleSheet.create({ container: { flexDirection: 'column', height: '100%', }, loading: { paddingVertical: 10, paddingHorizontal: 14, }, endItem: { paddingTop: 20, paddingBottom: 30, color: colors.gray5, textAlign: 'center', }, })