import {useMemo} from 'react' import {View} from 'react-native' import { type AppBskyActorDefs, type ModerationCause, type ModerationDecision, } from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {makeProfileLink} from '#/lib/routes/links' import {sanitizeDisplayName} from '#/lib/strings/display-names' import {isWeb} from '#/platform/detection' import {type Shadow} from '#/state/cache/profile-shadow' import {isConvoActive, useConvo} from '#/state/messages/convo' import {type ConvoItem} from '#/state/messages/convo/types' import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme, web} from '#/alf' import {ConvoMenu} from '#/components/dms/ConvoMenu' import {Bell2Off_Filled_Corner0_Rounded as BellStroke} from '#/components/icons/Bell2' import * as Layout from '#/components/Layout' import {Link} from '#/components/Link' import {PostAlerts} from '#/components/moderation/PostAlerts' import {Text} from '#/components/Typography' import {useSimpleVerificationState} from '#/components/verification' import {VerificationCheck} from '#/components/verification/VerificationCheck' const PFP_SIZE = isWeb ? 40 : Layout.HEADER_SLOT_SIZE export function MessagesListHeader({ profile, moderation, }: { profile?: Shadow moderation?: ModerationDecision }) { const t = useTheme() const blockInfo = useMemo(() => { if (!moderation) return const modui = moderation.ui('profileView') const blocks = modui.alerts.filter(alert => alert.type === 'blocking') const listBlocks = blocks.filter(alert => alert.source.type === 'list') const userBlock = blocks.find(alert => alert.source.type === 'user') return { listBlocks, userBlock, } }, [moderation]) return ( {profile && moderation && blockInfo ? ( ) : ( <> )} ) } function HeaderReady({ profile, moderation, blockInfo, }: { profile: Shadow moderation: ModerationDecision blockInfo: { listBlocks: ModerationCause[] userBlock?: ModerationCause } }) { const {_} = useLingui() const t = useTheme() const convoState = useConvo() const verification = useSimpleVerificationState({ profile, }) const isDeletedAccount = profile?.handle === 'missing.invalid' const displayName = isDeletedAccount ? _(msg`Deleted Account`) : sanitizeDisplayName( profile.displayName || profile.handle, moderation.ui('displayName'), ) // @ts-ignore findLast is polyfilled - esb const latestMessageFromOther = convoState.items.findLast( (item: ConvoItem) => item.type === 'message' && item.message.sender.did === profile.did, ) const latestReportableMessage = latestMessageFromOther?.type === 'message' ? latestMessageFromOther.message : undefined return ( {displayName} {verification.showBadge && ( )} {!isDeletedAccount && ( @{profile.handle} {convoState.convo?.muted && ( <> {' '} ·{' '} )} )} {isConvoActive(convoState) && ( )} ) }