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