import React, {useState, useEffect, useRef} from 'react' import {observer} from 'mobx-react-lite' import {ActivityIndicator, FlatList, Text, View} from 'react-native' import { PostThreadViewModel, PostThreadViewPostModel, } from '../../../state/models/post-thread-view' import {useStores} from '../../../state' import {SharePostModel} from '../../../state/models/shell' import {PostThreadItem} from './PostThreadItem' const UPDATE_DELAY = 2e3 // wait 2s before refetching the thread for updates export const PostThread = observer(function PostThread({uri}: {uri: string}) { const store = useStores() const [view, setView] = useState() const [lastUpdate, setLastUpdate] = useState(Date.now()) 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]) // TODO // useFocusEffect(() => { // if (Date.now() - lastUpdate > UPDATE_DELAY) { // view?.update() // setLastUpdate(Date.now()) // } // }) const onPressShare = (uri: string) => { store.shell.openModal(new SharePostModel(uri)) } const onRefresh = () => { view?.refresh().catch(err => console.error('Failed to refresh', err)) } // loading // = if ( !view || (view.isLoading && !view.isRefreshing) || view.params.uri !== uri ) { return ( ) } // error // = if (view.hasError) { return ( {view.error} ) } // loaded // = const posts = view.thread ? Array.from(flattenThread(view.thread)) : [] const renderItem = ({item}: {item: PostThreadViewPostModel}) => ( ) return ( item._reactKey} renderItem={renderItem} refreshing={view.isRefreshing} onRefresh={onRefresh} /> ) }) function* flattenThread( post: PostThreadViewPostModel, ): Generator { if (post.parent) { yield* flattenThread(post.parent) } yield post if (post.replies?.length) { for (const reply of post.replies) { yield* flattenThread(reply) } } }