personal web client for Bluesky
typescript solidjs bluesky atcute
at trunk 1.6 kB view raw
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;