personal web client for Bluesky
typescript solidjs bluesky atcute
at trunk 1.5 kB view raw
1import type { Did, RecordKey } from '@atcute/lexicons'; 2 3import { createSubjectLikersQuery } from '~/api/queries/subject-likers'; 4import { makeAtUri } from '~/api/types/at-uri'; 5 6import { useParams, useTitle } from '~/lib/navigation/router'; 7 8import * as Page from '~/components/page'; 9import PagedList from '~/components/paged-list'; 10import ProfileFollowButton from '~/components/profiles/profile-follow-button'; 11import ProfileItem from '~/components/profiles/profile-item'; 12import VirtualItem from '~/components/virtual-item'; 13 14const PostLikesPage = () => { 15 const { did, rkey } = useParams<{ 16 did: Did; 17 rkey: RecordKey; 18 }>(); 19 20 const uri = makeAtUri(did, 'app.bsky.feed.post', rkey); 21 const likers = createSubjectLikersQuery(() => uri); 22 23 useTitle(() => `Users liking this post — ${import.meta.env.VITE_APP_NAME}`); 24 25 return ( 26 <> 27 <Page.Header> 28 <Page.HeaderAccessory> 29 <Page.Back to={`/${did}/${rkey}`} /> 30 </Page.HeaderAccessory> 31 32 <Page.Heading title="Liked by" /> 33 </Page.Header> 34 35 <PagedList 36 data={likers.data?.pages.map((page) => page.profiles)} 37 error={likers.error} 38 render={(item) => { 39 return ( 40 <VirtualItem estimateHeight={64}> 41 <ProfileItem item={item} AsideComponent={<ProfileFollowButton profile={item} />} /> 42 </VirtualItem> 43 ); 44 }} 45 hasNextPage={likers.hasNextPage} 46 isFetchingNextPage={likers.isFetching} 47 onEndReached={() => likers.fetchNextPage()} 48 /> 49 </> 50 ); 51}; 52 53export default PostLikesPage;