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 session-alignment 107 lines 3.0 kB view raw
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}