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 minshell-bbar 108 lines 2.9 kB view raw
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}