personal web client for Bluesky
typescript
solidjs
bluesky
atcute
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;