diff options
Diffstat (limited to 'src/components/StarterPack')
-rw-r--r-- | src/components/StarterPack/Main/ProfilesList.tsx | 21 | ||||
-rw-r--r-- | src/components/StarterPack/StarterPackCard.tsx | 60 |
2 files changed, 67 insertions, 14 deletions
diff --git a/src/components/StarterPack/Main/ProfilesList.tsx b/src/components/StarterPack/Main/ProfilesList.tsx index 0cc911d66..3249f1b32 100644 --- a/src/components/StarterPack/Main/ProfilesList.tsx +++ b/src/components/StarterPack/Main/ProfilesList.tsx @@ -11,10 +11,12 @@ import {InfiniteData, UseInfiniteQueryResult} from '@tanstack/react-query' import {useBottomBarOffset} from 'lib/hooks/useBottomBarOffset' import {isBlockedOrBlocking} from 'lib/moderation/blocked-and-muted' import {isNative, isWeb} from 'platform/detection' +import {useListMembersQuery} from 'state/queries/list-members' import {useSession} from 'state/session' import {List, ListRef} from 'view/com/util/List' import {SectionRef} from '#/screens/Profile/Sections/types' import {atoms as a, useTheme} from '#/alf' +import {ListMaybePlaceholder} from '#/components/Lists' import {Default as ProfileCard} from '#/components/ProfileCard' function keyExtractor(item: AppBskyActorDefs.ProfileViewBasic, index: number) { @@ -33,18 +35,17 @@ interface ProfilesListProps { export const ProfilesList = React.forwardRef<SectionRef, ProfilesListProps>( function ProfilesListImpl( - {listUri, listMembersQuery, moderationOpts, headerHeight, scrollElRef}, + {listUri, moderationOpts, headerHeight, scrollElRef}, ref, ) { const t = useTheme() const [initialHeaderHeight] = React.useState(headerHeight) const bottomBarOffset = useBottomBarOffset(20) const {currentAccount} = useSession() + const {data, refetch, isError} = useListMembersQuery(listUri, 50) const [isPTRing, setIsPTRing] = React.useState(false) - const {data, refetch} = listMembersQuery - // The server returns these sorted by descending creation date, so we want to invert const profiles = data?.pages .flatMap(p => p.items.map(i => i.subject)) @@ -96,7 +97,19 @@ export const ProfilesList = React.forwardRef<SectionRef, ProfilesListProps>( ) } - if (listMembersQuery) + if (!data) { + return ( + <View style={{marginTop: headerHeight, marginBottom: bottomBarOffset}}> + <ListMaybePlaceholder + isLoading={true} + isError={isError} + onRetry={refetch} + /> + </View> + ) + } + + if (data) return ( <List data={getSortedProfiles()} diff --git a/src/components/StarterPack/StarterPackCard.tsx b/src/components/StarterPack/StarterPackCard.tsx index ab904d7ff..dc9e4b70d 100644 --- a/src/components/StarterPack/StarterPackCard.tsx +++ b/src/components/StarterPack/StarterPackCard.tsx @@ -1,15 +1,20 @@ import React from 'react' import {View} from 'react-native' +import {Image} from 'expo-image' import {AppBskyGraphStarterpack, AtUri} from '@atproto/api' import {StarterPackViewBasic} from '@atproto/api/dist/client/types/app/bsky/graph/defs' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' +import {useQueryClient} from '@tanstack/react-query' import {sanitizeHandle} from 'lib/strings/handles' +import {getStarterPackOgCard} from 'lib/strings/starter-pack' +import {precacheResolvedUri} from 'state/queries/resolve-uri' +import {precacheStarterPack} from 'state/queries/starter-packs' import {useSession} from 'state/session' import {atoms as a, useTheme} from '#/alf' import {StarterPack} from '#/components/icons/StarterPack' -import {Link as InternalLink, LinkProps} from '#/components/Link' +import {BaseLink} from '#/components/Link' import {Text} from '#/components/Typography' export function Default({starterPack}: {starterPack?: StarterPackViewBasic}) { @@ -88,10 +93,13 @@ export function Card({ export function Link({ starterPack, children, - ...rest }: { starterPack: StarterPackViewBasic -} & Omit<LinkProps, 'to'>) { + onPress?: () => void + children: React.ReactNode +}) { + const {_} = useLingui() + const queryClient = useQueryClient() const {record} = starterPack const {rkey, handleOrDid} = React.useMemo(() => { const rkey = new AtUri(starterPack.uri).rkey @@ -104,14 +112,46 @@ export function Link({ } return ( - <InternalLink - label={record.name} - {...rest} - to={{ - screen: 'StarterPack', - params: {name: handleOrDid, rkey}, + <BaseLink + action="push" + to={`/starter-pack/${handleOrDid}/${rkey}`} + label={_(msg`Navigate to ${record.name}`)} + onPress={() => { + precacheResolvedUri( + queryClient, + starterPack.creator.handle, + starterPack.creator.did, + ) + precacheStarterPack(queryClient, starterPack) }}> {children} - </InternalLink> + </BaseLink> + ) +} + +export function Embed({starterPack}: {starterPack: StarterPackViewBasic}) { + const t = useTheme() + const imageUri = getStarterPackOgCard(starterPack) + + return ( + <View + style={[ + a.mt_xs, + a.border, + a.rounded_sm, + a.overflow_hidden, + t.atoms.border_contrast_low, + ]}> + <Link starterPack={starterPack}> + <Image + source={imageUri} + style={[a.w_full, {aspectRatio: 1.91}]} + accessibilityIgnoresInvertColors={true} + /> + <View style={[a.px_sm, a.py_md]}> + <Card starterPack={starterPack} /> + </View> + </Link> + </View> ) } |