add moderation, follow button to profile card

This commit is contained in:
Hailey
2024-06-19 19:01:45 -07:00
parent 4f8b7e5893
commit 9d0d48850b
2 changed files with 32 additions and 10 deletions
+14 -8
View File
@@ -2,8 +2,10 @@ import React from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {AppBskyActorDefs, moderateProfile, ModerationOpts} from '@atproto/api' import {AppBskyActorDefs, moderateProfile, ModerationOpts} from '@atproto/api'
import {sanitizeDisplayName} from 'lib/strings/display-names' import {createSanitizedDisplayName} from 'lib/moderation/create-sanitized-display-name'
import {sanitizeHandle} from 'lib/strings/handles' import {sanitizeHandle} from 'lib/strings/handles'
import {useProfileShadow} from 'state/cache/profile-shadow'
import {FollowButton} from 'view/com/profile/FollowButton'
import {ProfileCardPills} from 'view/com/profile/ProfileCard' import {ProfileCardPills} from 'view/com/profile/ProfileCard'
import {UserAvatar} from 'view/com/util/UserAvatar' import {UserAvatar} from 'view/com/util/UserAvatar'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
@@ -11,20 +13,19 @@ import {Link} from '#/components/Link'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
export function Default({ export function Default({
profile, profile: profileUnshadowed,
moderationOpts, moderationOpts,
logContext,
}: { }: {
profile: AppBskyActorDefs.ProfileViewDetailed profile: AppBskyActorDefs.ProfileViewDetailed
moderationOpts: ModerationOpts moderationOpts: ModerationOpts
logContext: 'ProfileCard' | 'StarterPackProfilesList'
}) { }) {
const t = useTheme() const t = useTheme()
const profile = useProfileShadow(profileUnshadowed)
const name = createSanitizedDisplayName(profile)
const handle = `@${sanitizeHandle(profile.handle)}` const handle = `@${sanitizeHandle(profile.handle)}`
const name =
profile.displayName != null && profile.displayName !== ''
? sanitizeDisplayName(profile.displayName)
: handle
const moderation = moderateProfile(profile, moderationOpts) const moderation = moderateProfile(profile, moderationOpts)
return ( return (
@@ -48,6 +49,11 @@ export function Default({
{handle} {handle}
</Text> </Text>
</View> </View>
<View style={[a.justify_center, {marginLeft: 'auto'}]}>
<FollowButton profile={profile} logContext={logContext} />
</View>
</View>
<View style={[a.mb_xs]}>
<ProfileCardPills <ProfileCardPills
followedBy={Boolean(profile.viewer?.followedBy)} followedBy={Boolean(profile.viewer?.followedBy)}
moderation={moderation} moderation={moderation}
@@ -67,7 +73,7 @@ function Wrapper({did, children}: {did: string; children: React.ReactNode}) {
screen: 'Profile', screen: 'Profile',
params: {name: did}, params: {name: did},
}}> }}>
<View style={[a.flex_1, a.gap_md]}>{children}</View> <View style={[a.flex_1, a.gap_xs]}>{children}</View>
</Link> </Link>
) )
} }
@@ -3,11 +3,12 @@ import {ListRenderItemInfo, View} from 'react-native'
import {AppBskyActorDefs, AtUri, ModerationOpts} from '@atproto/api' import {AppBskyActorDefs, AtUri, ModerationOpts} from '@atproto/api'
import {useBottomBarOffset} from 'lib/hooks/useBottomBarOffset' import {useBottomBarOffset} from 'lib/hooks/useBottomBarOffset'
import {isNative} from 'platform/detection' import {isNative, isWeb} from 'platform/detection'
import {useListMembersQuery} from 'state/queries/list-members' import {useListMembersQuery} from 'state/queries/list-members'
import {useSession} from 'state/session' import {useSession} from 'state/session'
import {List, ListRef} from 'view/com/util/List' import {List, ListRef} from 'view/com/util/List'
import {SectionRef} from '#/screens/Profile/Sections/types' import {SectionRef} from '#/screens/Profile/Sections/types'
import {atoms as a, useTheme} from '#/alf'
import {Default as ProfileCard} from '#/components/ProfileCard' import {Default as ProfileCard} from '#/components/ProfileCard'
function keyExtractor(item: AppBskyActorDefs.ProfileViewBasic, index: number) { function keyExtractor(item: AppBskyActorDefs.ProfileViewBasic, index: number) {
@@ -26,6 +27,7 @@ export const ProfilesList = React.forwardRef<SectionRef, ProfilesListProps>(
{listUri, headerHeight, scrollElRef, moderationOpts}, {listUri, headerHeight, scrollElRef, moderationOpts},
ref, ref,
) { ) {
const t = useTheme()
const [initialHeaderHeight] = React.useState(headerHeight) const [initialHeaderHeight] = React.useState(headerHeight)
const bottomBarOffset = useBottomBarOffset(20) const bottomBarOffset = useBottomBarOffset(20)
const {currentAccount} = useSession() const {currentAccount} = useSession()
@@ -65,8 +67,22 @@ export const ProfilesList = React.forwardRef<SectionRef, ProfilesListProps>(
const renderItem = ({ const renderItem = ({
item, item,
index,
}: ListRenderItemInfo<AppBskyActorDefs.ProfileViewBasic>) => { }: ListRenderItemInfo<AppBskyActorDefs.ProfileViewBasic>) => {
return <ProfileCard profile={item} moderationOpts={moderationOpts} /> return (
<View
style={[
a.p_lg,
t.atoms.border_contrast_low,
(isWeb || index !== 0) && a.border_t,
]}>
<ProfileCard
profile={item}
moderationOpts={moderationOpts}
logContext="StarterPackProfilesList"
/>
</View>
)
} }
return ( return (