personal web client for Bluesky
typescript
solidjs
bluesky
atcute
1import type { Did } from '@atcute/lexicons';
2
3import { createProfileQuery } from '~/api/queries/profile';
4import { createProfileFeedsQuery } from '~/api/queries/profile-feeds';
5
6import { useParams, useTitle } from '~/lib/navigation/router';
7
8import FeedItem from '~/components/feeds/feed-item';
9import * as Page from '~/components/page';
10import PagedList from '~/components/paged-list';
11import VirtualItem from '~/components/virtual-item';
12
13const ProfileFeedsPage = () => {
14 const { did } = useParams<{ did: Did }>();
15
16 const feeds = createProfileFeedsQuery(() => did);
17 const profile = createProfileQuery(() => did);
18
19 useTitle(() => {
20 const data = profile.data;
21 if (data) {
22 const handle = data.handle.toLowerCase();
23
24 return `Feeds by @${handle} — ${import.meta.env.VITE_APP_NAME}`;
25 }
26
27 return `Feeds — ${import.meta.env.VITE_APP_NAME}`;
28 });
29
30 return (
31 <>
32 <Page.Header>
33 <Page.HeaderAccessory>
34 <Page.Back to={`/${did}`} />
35 </Page.HeaderAccessory>
36
37 <Page.Heading
38 title="Feeds"
39 subtitle={(() => {
40 const subject = profile.data;
41 if (subject) {
42 return '@' + subject.handle.toLowerCase();
43 }
44 })()}
45 />
46 </Page.Header>
47
48 <PagedList
49 data={feeds.data?.pages.map((page) => page.feeds)}
50 error={feeds.error}
51 render={(item) => {
52 return (
53 <VirtualItem estimateHeight={125}>
54 <FeedItem item={item} />
55 </VirtualItem>
56 );
57 }}
58 hasNextPage={feeds.hasNextPage}
59 isFetchingNextPage={feeds.isFetching}
60 onEndReached={() => feeds.fetchNextPage()}
61 />
62 </>
63 );
64};
65
66export default ProfileFeedsPage;