Remove list dual usage from most of FeedCard

This commit is contained in:
Eric Bailey
2024-06-25 18:15:23 -05:00
parent 1a407864c5
commit f2bc06c79e
+19 -60
View File
@@ -3,7 +3,6 @@ import {GestureResponderEvent, View} from 'react-native'
import { import {
AppBskyActorDefs, AppBskyActorDefs,
AppBskyFeedDefs, AppBskyFeedDefs,
AppBskyGraphDefs,
AtUri, AtUri,
RichText as RichTextApi, RichText as RichTextApi,
} from '@atproto/api' } from '@atproto/api'
@@ -18,7 +17,7 @@ import {
useRemoveFeedMutation, useRemoveFeedMutation,
} from '#/state/queries/preferences' } from '#/state/queries/preferences'
import {sanitizeHandle} from 'lib/strings/handles' import {sanitizeHandle} from 'lib/strings/handles'
import {precacheFeedFromGeneratorView, precacheList} from 'state/queries/feed' import {precacheFeedFromGeneratorView} from 'state/queries/feed'
import {useSession} from 'state/session' import {useSession} from 'state/session'
import {UserAvatar} from '#/view/com/util/UserAvatar' import {UserAvatar} from '#/view/com/util/UserAvatar'
import * as Toast from 'view/com/util/Toast' import * as Toast from 'view/com/util/Toast'
@@ -33,45 +32,31 @@ import * as Prompt from '#/components/Prompt'
import {RichText} from '#/components/RichText' import {RichText} from '#/components/RichText'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
type Props = type Props = {
| { view: AppBskyFeedDefs.GeneratorView
type: 'feed' }
view: AppBskyFeedDefs.GeneratorView
}
| {
type: 'list'
view: AppBskyGraphDefs.ListView
}
export function Default(props: Props) { export function Default(props: Props) {
const {type, view} = props const {view} = props
const displayName = type === 'feed' ? view.displayName : view.name
const purpose = type === 'list' ? view.purpose : undefined
return ( return (
<Link label={displayName} {...props}> <Link label={view.displayName} {...props}>
<Outer> <Outer>
<Header> <Header>
<Avatar src={view.avatar} /> <Avatar src={view.avatar} />
<TitleAndByline <TitleAndByline title={view.displayName} creator={view.creator} />
title={displayName} <Action uri={view.uri} pin type="feed" />
creator={view.creator}
type={type}
purpose={purpose}
/>
<Action uri={view.uri} pin type={type} purpose={purpose} />
</Header> </Header>
<Description description={view.description} /> <Description description={view.description} />
{type === 'feed' && <Likes count={view.likeCount || 0} />} <Likes count={view.likeCount || 0} />
</Outer> </Outer>
</Link> </Link>
) )
} }
export function Link({ export function Link({
type,
view, view,
label,
children, children,
...props
}: Props & Omit<LinkProps, 'to'>) { }: Props & Omit<LinkProps, 'to'>) {
const queryClient = useQueryClient() const queryClient = useQueryClient()
@@ -79,17 +64,12 @@ export function Link({
return createProfileFeedHref({feed: view}) return createProfileFeedHref({feed: view})
}, [view]) }, [view])
React.useEffect(() => {
precacheFeedFromGeneratorView(queryClient, view)
}, [view, queryClient])
return ( return (
<InternalLink <InternalLink to={href} {...props}>
to={href}
label={label}
onPress={() => {
if (type === 'feed') {
precacheFeedFromGeneratorView(queryClient, view)
} else {
precacheList(queryClient, view)
}
}}>
{children} {children}
</InternalLink> </InternalLink>
) )
@@ -132,13 +112,9 @@ export function AvatarPlaceholder({size = 40}: Omit<AvatarProps, 'src'>) {
export function TitleAndByline({ export function TitleAndByline({
title, title,
creator, creator,
type,
purpose,
}: { }: {
title: string title: string
creator?: AppBskyActorDefs.ProfileViewBasic creator?: AppBskyActorDefs.ProfileViewBasic
type: 'feed' | 'list'
purpose?: AppBskyGraphDefs.ListView['purpose']
}) { }) {
const t = useTheme() const t = useTheme()
@@ -151,15 +127,7 @@ export function TitleAndByline({
<Text <Text
style={[a.leading_snug, t.atoms.text_contrast_medium]} style={[a.leading_snug, t.atoms.text_contrast_medium]}
numberOfLines={1}> numberOfLines={1}>
{type === 'list' && purpose === 'app.bsky.graph.defs#curatelist' ? ( <Trans>Feed by {sanitizeHandle(creator.handle, '@')}</Trans>
<Trans>List by {sanitizeHandle(creator.handle, '@')}</Trans>
) : type === 'list' && purpose === 'app.bsky.graph.defs#modlist' ? (
<Trans>
Moderation list by {sanitizeHandle(creator.handle, '@')}
</Trans>
) : (
<Trans>Feed by {sanitizeHandle(creator.handle, '@')}</Trans>
)}
</Text> </Text>
)} )}
</View> </View>
@@ -225,19 +193,13 @@ export function Action({
uri, uri,
pin, pin,
type, type,
purpose,
}: { }: {
uri: string uri: string
pin?: boolean pin?: boolean
type: 'feed' | 'list' type: 'feed' | 'list'
purpose?: AppBskyGraphDefs.ListView['purpose']
}) { }) {
const {hasSession} = useSession() const {hasSession} = useSession()
if ( if (!hasSession) return null
!hasSession ||
(type === 'list' && purpose !== 'app.bsky.graph.defs#curatelist')
)
return null
return <ActionInner uri={uri} pin={pin} type={type} /> return <ActionInner uri={uri} pin={pin} type={type} />
} }
@@ -332,12 +294,9 @@ function ActionInner({
export function createProfileFeedHref({ export function createProfileFeedHref({
feed, feed,
}: { }: {
feed: AppBskyFeedDefs.GeneratorView | AppBskyGraphDefs.ListView feed: AppBskyFeedDefs.GeneratorView
}) { }) {
const urip = new AtUri(feed.uri) const urip = new AtUri(feed.uri)
const type = urip.collection === 'app.bsky.feed.generator' ? 'feed' : 'list'
const handleOrDid = feed.creator.handle || feed.creator.did const handleOrDid = feed.creator.handle || feed.creator.did
return `/profile/${handleOrDid}/${type === 'feed' ? 'feed' : 'lists'}/${ return `/profile/${handleOrDid}/feed/${urip.rkey}`
urip.rkey
}`
} }