import React, {useEffect} from 'react' import {observer} from 'mobx-react-lite' import {ActivityIndicator, FlatList, StyleSheet, View} from 'react-native' import {VotesViewModel, VotesItem} from '../../../state/models/votes-view' import {Link} from '../util/Link' import {Text} from '../util/text/Text' import {ErrorMessage} from '../util/error/ErrorMessage' import {UserAvatar} from '../util/UserAvatar' import {useStores} from '../../../state' import {s, colors} from '../../lib/styles' export const PostVotedBy = observer(function PostVotedBy({ uri, direction, }: { uri: string direction: 'up' | 'down' }) { const store = useStores() const view = React.useMemo( () => new VotesViewModel(store, {uri, direction}), [store, uri, direction], ) useEffect(() => { view.loadMore().catch(err => store.log.error('Failed to fetch votes', err)) }, [view, store.log]) const onRefresh = () => { view.refresh() } const onEndReached = () => { view .loadMore() .catch(err => view?.rootStore.log.error('Failed to load more votes', err)) } if (!view.hasLoaded) { return ( ) } // error // = if (view.hasError) { return ( ) } // loaded // = const renderItem = ({item}: {item: VotesItem}) => return ( item.actor.did} refreshing={view.isRefreshing} onRefresh={onRefresh} onEndReached={onEndReached} renderItem={renderItem} initialNumToRender={15} ListFooterComponent={() => ( {view.isLoading && } )} extraData={view.isLoading} /> ) }) const LikedByItem = ({item}: {item: VotesItem}) => { return ( {item.actor.displayName || item.actor.handle} @{item.actor.handle} ) } const styles = StyleSheet.create({ outer: { marginTop: 1, backgroundColor: colors.white, }, layout: { flexDirection: 'row', }, layoutAvi: { width: 60, paddingLeft: 10, paddingTop: 10, paddingBottom: 10, }, avi: { width: 40, height: 40, borderRadius: 20, resizeMode: 'cover', }, layoutContent: { flex: 1, paddingRight: 10, paddingTop: 10, paddingBottom: 10, }, footer: { height: 200, paddingTop: 20, }, })