import React, {MutableRefObject} from 'react' import {observer} from 'mobx-react-lite' import { ActivityIndicator, View, FlatList, StyleProp, StyleSheet, ViewStyle, } from 'react-native' import {PostFeedLoadingPlaceholder} from '../util/LoadingPlaceholder' import {EmptyState} from '../util/EmptyState' import {ErrorMessage} from '../util/error/ErrorMessage' import {FeedModel} from '../../../state/models/feed-view' import {FeedItem} from './FeedItem' import {PromptButtons} from './PromptButtons' import {OnScrollCb} from '../../lib/hooks/useOnMainScroll' import {s} from '../../lib/styles' const COMPOSE_PROMPT_ITEM = {_reactKey: '__prompt__'} const EMPTY_FEED_ITEM = {_reactKey: '__empty__'} export const Feed = observer(function Feed({ feed, style, scrollElRef, onPressCompose, onPressTryAgain, onScroll, testID, }: { feed: FeedModel style?: StyleProp scrollElRef?: MutableRefObject | null> onPressCompose: (imagesOpen?: boolean) => void onPressTryAgain?: () => void onScroll?: OnScrollCb testID?: string }) { // TODO optimize renderItem or FeedItem, we're getting this notice from RN: -prf // VirtualizedList: You have a large list that is slow to update - make sure your // renderItem function renders components that follow React performance best practices // like PureComponent, shouldComponentUpdate, etc const renderItem = ({item}: {item: any}) => { if (item === COMPOSE_PROMPT_ITEM) { return } else if (item === EMPTY_FEED_ITEM) { return ( ) } else { return } } const onRefresh = () => { feed .refresh() .catch(err => feed.rootStore.log.error('Failed to refresh posts feed', err), ) } const onEndReached = () => { feed .loadMore() .catch(err => feed.rootStore.log.error('Failed to load more posts', err)) } let data if (feed.hasLoaded) { if (feed.isEmpty) { data = [COMPOSE_PROMPT_ITEM, EMPTY_FEED_ITEM] } else { data = [COMPOSE_PROMPT_ITEM].concat(feed.feed) } } const FeedFooter = () => feed.isLoading ? ( ) : ( ) return ( {!data && } {feed.isLoading && !data && } {feed.hasError && ( )} {feed.hasLoaded && data && ( item._reactKey} renderItem={renderItem} ListFooterComponent={FeedFooter} refreshing={feed.isRefreshing} contentContainerStyle={s.contentContainer} onScroll={onScroll} onRefresh={onRefresh} onEndReached={onEndReached} /> )} ) }) const styles = StyleSheet.create({ feedFooter: {paddingTop: 20}, emptyState: {paddingVertical: 40}, })