mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import React, {useCallback, useMemo, useState} from 'react'
2import {AppBskyActorDefs as ActorDefs} 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 {usePostRepostedByQuery} from '#/state/queries/post-reposted-by'
9import {useResolveUriQuery} from '#/state/queries/resolve-uri'
10import {useInitialNumToRender} from 'lib/hooks/useInitialNumToRender'
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: ActorDefs.ProfileViewBasic}) {
16 return <ProfileCardWithFollowBtn key={item.did} profile={item} />
17}
18
19function keyExtractor(item: ActorDefs.ProfileViewBasic) {
20 return item.did
21}
22
23export function PostRepostedBy({uri}: {uri: string}) {
24 const {_} = useLingui()
25 const initialNumToRender = useInitialNumToRender()
26
27 const [isPTRing, setIsPTRing] = useState(false)
28
29 const {
30 data: resolvedUri,
31 error: resolveError,
32 isLoading: isLoadingUri,
33 } = useResolveUriQuery(uri)
34 const {
35 data,
36 isLoading: isLoadingRepostedBy,
37 isFetchingNextPage,
38 hasNextPage,
39 fetchNextPage,
40 error,
41 refetch,
42 } = usePostRepostedByQuery(resolvedUri?.uri)
43
44 const isError = Boolean(resolveError || error)
45
46 const repostedBy = useMemo(() => {
47 if (data?.pages) {
48 return data.pages.flatMap(page => page.repostedBy)
49 }
50 return []
51 }, [data])
52
53 const onRefresh = useCallback(async () => {
54 setIsPTRing(true)
55 try {
56 await refetch()
57 } catch (err) {
58 logger.error('Failed to refresh reposts', {message: err})
59 }
60 setIsPTRing(false)
61 }, [refetch, setIsPTRing])
62
63 const onEndReached = useCallback(async () => {
64 if (isFetchingNextPage || !hasNextPage || isError) return
65 try {
66 await fetchNextPage()
67 } catch (err) {
68 logger.error('Failed to load more reposts', {message: err})
69 }
70 }, [isFetchingNextPage, hasNextPage, isError, fetchNextPage])
71
72 if (repostedBy.length < 1) {
73 return (
74 <ListMaybePlaceholder
75 isLoading={isLoadingUri || isLoadingRepostedBy}
76 isError={isError}
77 emptyType="results"
78 emptyTitle={_(msg`No reposts yet`)}
79 emptyMessage={_(
80 msg`Nobody has reposted this yet. Maybe you should be the first!`,
81 )}
82 errorMessage={cleanError(resolveError || error)}
83 sideBorders={false}
84 />
85 )
86 }
87
88 // loaded
89 // =
90 return (
91 <List
92 data={repostedBy}
93 renderItem={renderItem}
94 keyExtractor={keyExtractor}
95 refreshing={isPTRing}
96 onRefresh={onRefresh}
97 onEndReached={onEndReached}
98 onEndReachedThreshold={4}
99 ListFooterComponent={
100 <ListFooter
101 isFetchingNextPage={isFetchingNextPage}
102 error={cleanError(error)}
103 onRetry={fetchNextPage}
104 />
105 }
106 // @ts-ignore our .web version only -prf
107 desktopFixedHeight
108 initialNumToRender={initialNumToRender}
109 windowSize={11}
110 sideBorders={false}
111 />
112 )
113}