mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at mod-auth 113 lines 3.2 kB view raw
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}