import React, {useMemo, useCallback} from 'react' import {ActivityIndicator, FlatList, View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api' import {useResolveUriQuery} from '#/state/queries/resolve-uri' import {useLikedByQuery} from '#/state/queries/post-liked-by' import {cleanError} from '#/lib/strings/errors' import {logger} from '#/logger' import {atoms as a, useTheme} from '#/alf' import {Text} from '#/components/Typography' import * as Dialog from '#/components/Dialog' import {ErrorMessage} from '#/view/com/util/error/ErrorMessage' import {ProfileCardWithFollowBtn} from '#/view/com/profile/ProfileCard' import {Loader} from '#/components/Loader' interface LikesDialogProps { control: Dialog.DialogOuterProps['control'] uri: string } export function LikesDialog(props: LikesDialogProps) { return ( ) } export function LikesDialogInner({control, uri}: LikesDialogProps) { const {_} = useLingui() const t = useTheme() const { data: resolvedUri, error: resolveError, isFetched: hasFetchedResolvedUri, } = useResolveUriQuery(uri) const { data, isFetching: isFetchingLikedBy, isFetched: hasFetchedLikedBy, isFetchingNextPage, hasNextPage, fetchNextPage, isError, error: likedByError, } = useLikedByQuery(resolvedUri?.uri) const isLoading = !hasFetchedResolvedUri || !hasFetchedLikedBy const likes = useMemo(() => { if (data?.pages) { return data.pages.flatMap(page => page.likes) } return [] }, [data]) const onEndReached = useCallback(async () => { if (isFetchingLikedBy || !hasNextPage || isError) return try { await fetchNextPage() } catch (err) { logger.error('Failed to load more likes', {message: err}) } }, [isFetchingLikedBy, hasNextPage, isError, fetchNextPage]) const renderItem = useCallback( ({item}: {item: GetLikes.Like}) => { return ( control.close()} /> ) }, [control], ) return ( Liked by {isLoading ? ( ) : resolveError || likedByError || !data ? ( ) : likes.length === 0 ? ( Nobody has liked this yet. Maybe you should be the first! ) : ( item.actor.did} onEndReached={onEndReached} renderItem={renderItem} initialNumToRender={15} ListFooterComponent={ } /> )} ) } function ListFooterComponent({isFetching}: {isFetching: boolean}) { if (isFetching) { return ( ) } return null }