import React, {useState, useEffect} from 'react' import {observer} from 'mobx-react-lite' import {ActivityIndicator, FlatList, Text, View} from 'react-native' import {OnNavigateContent} from '../../routes/types' import { PostThreadViewModel, PostThreadViewPostModel, } from '../../../state/models/post-thread-view' import {useStores} from '../../../state' import {PostThreadItem} from './PostThreadItem' export const PostThread = observer(function PostThread({ uri, onNavigateContent, }: { uri: string onNavigateContent: OnNavigateContent }) { const store = useStores() const [view, setView] = useState() useEffect(() => { if (view?.params.uri === uri) { console.log('Post thread doing nothing') return // no change needed? or trigger refresh? } console.log('Fetching post thread', uri) const newView = new PostThreadViewModel(store, {uri}) setView(newView) newView.setup().catch(err => console.error('Failed to fetch thread', err)) }, [uri, view?.params.uri, store]) // not yet setup if ( !view || (view.isLoading && !view.isRefreshing) || view.params.uri !== uri ) { return ( ) } // error if (view.hasError) { return ( {view.error} ) } // rendering const posts = Array.from(flattenThread(view.thread)) const renderItem = ({item}: {item: PostThreadViewPostModel}) => ( ) const onRefresh = () => { view.refresh().catch(err => console.error('Failed to refresh', err)) } return ( {view.isRefreshing && } {view.hasContent && ( item._reactKey} renderItem={renderItem} refreshing={view.isRefreshing} onRefresh={onRefresh} /> )} ) }) function* flattenThread( post: PostThreadViewPostModel, ): Generator { yield post if (post.replies?.length) { for (const reply of post.replies) { yield* flattenThread(reply) } } }