mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React, {useCallback, useMemo, useState} from 'react'
2import {AppBskyFeedGetLikes as GetLikes} from '@atproto/api'
3import {msg} from '@lingui/macro'
4import {useLingui} from '@lingui/react'
5
6import {cleanError} from '#/lib/strings/errors'
7import {logger} from '#/logger'
8import {useLikedByQuery} from '#/state/queries/post-liked-by'
9import {useResolveUriQuery} from '#/state/queries/resolve-uri'
10import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender'
11import {
12 ListFooter,
13 ListHeaderDesktop,
14 ListMaybePlaceholder,
15} from '#/components/Lists'
16import {ProfileCardWithFollowBtn} from '../profile/ProfileCard'
17import {List} from '../util/List'
18
19function renderItem({item}: {item: GetLikes.Like}) {
20 return <ProfileCardWithFollowBtn key={item.actor.did} profile={item.actor} />
21}
22
23function keyExtractor(item: GetLikes.Like) {
24 return item.actor.did
25}
26
27export function PostLikedBy({uri}: {uri: string}) {
28 const {_} = useLingui()
29 const initialNumToRender = useInitialNumToRender()
30
31 const [isPTRing, setIsPTRing] = useState(false)
32
33 const {
34 data: resolvedUri,
35 error: resolveError,
36 isLoading: isLoadingUri,
37 } = useResolveUriQuery(uri)
38 const {
39 data,
40 isLoading: isLoadingLikes,
41 isFetchingNextPage,
42 hasNextPage,
43 fetchNextPage,
44 error,
45 refetch,
46 } = useLikedByQuery(resolvedUri?.uri)
47
48 const isError = Boolean(resolveError || error)
49
50 const likes = useMemo(() => {
51 if (data?.pages) {
52 return data.pages.flatMap(page => page.likes)
53 }
54 return []
55 }, [data])
56
57 const onRefresh = useCallback(async () => {
58 setIsPTRing(true)
59 try {
60 await refetch()
61 } catch (err) {
62 logger.error('Failed to refresh likes', {message: err})
63 }
64 setIsPTRing(false)
65 }, [refetch, setIsPTRing])
66
67 const onEndReached = useCallback(async () => {
68 if (isFetchingNextPage || !hasNextPage || isError) return
69 try {
70 await fetchNextPage()
71 } catch (err) {
72 logger.error('Failed to load more likes', {message: err})
73 }
74 }, [isFetchingNextPage, hasNextPage, isError, fetchNextPage])
75
76 if (likes.length < 1) {
77 return (
78 <ListMaybePlaceholder
79 isLoading={isLoadingUri || isLoadingLikes}
80 isError={isError}
81 />
82 )
83 }
84
85 return (
86 <List
87 data={likes}
88 renderItem={renderItem}
89 keyExtractor={keyExtractor}
90 refreshing={isPTRing}
91 onRefresh={onRefresh}
92 onEndReached={onEndReached}
93 onEndReachedThreshold={4}
94 ListHeaderComponent={<ListHeaderDesktop title={_(msg`Liked By`)} />}
95 ListFooterComponent={
96 <ListFooter
97 isFetchingNextPage={isFetchingNextPage}
98 error={cleanError(error)}
99 onRetry={fetchNextPage}
100 />
101 }
102 // @ts-ignore our .web version only -prf
103 desktopFixedHeight
104 initialNumToRender={initialNumToRender}
105 windowSize={11}
106 />
107 )
108}