import {useMemo} from 'react' import {View} from 'react-native' import { ChatBskyConvoDefs, moderateProfile, type ModerationOpts, } from '@atproto/api' import {useLingui} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {makeProfileLink} from '#/lib/routes/links' import {type NavigationProp} from '#/lib/routes/types' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useSession} from '#/state/session' import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useTheme} from '#/alf' import {AvatarBubbles} from '#/components/AvatarBubbles' import {Button, ButtonIcon} from '#/components/Button' import {ConvoMenu} from '#/components/dms/ConvoMenu' import {Bell2Off_Filled_Corner0_Rounded as BellOffIcon} from '#/components/icons/Bell2' import {DotGrid3x1_Stroke2_Corner0_Rounded as DotsHorizontalIcon} from '#/components/icons/DotGrid' import * as Layout from '#/components/Layout' import {Link} from '#/components/Link' import {ProfileBadges} from '#/components/ProfileBadges' import {Text} from '#/components/Typography' import {IS_LIQUID_GLASS, IS_WEB} from '#/env' import {type ConvoWithDetails} from './util' const PFP_SIZE = IS_WEB ? 40 : Layout.HEADER_SLOT_SIZE export function MessagesListHeader({convo}: {convo?: ConvoWithDetails | null}) { const t = useTheme() const moderationOpts = useModerationOpts() return ( {convo && moderationOpts ? ( convo.kind === 'direct' ? ( ) : ( ) ) : ( <> )} ) } function ProfileHeaderReady({ convo, moderationOpts, }: { convo: Extract moderationOpts: ModerationOpts }) { const {t: l} = useLingui() const {currentAccount} = useSession() const profile = useProfileShadow(convo.primaryMember) const moderation = moderateProfile(profile, moderationOpts) const blockInfo = useMemo(() => { 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]) const isDeletedAccount = profile?.handle === 'missing.invalid' const displayName = isDeletedAccount ? l`Deleted Account` : createSanitizedDisplayName(profile, true, moderation.ui('displayName')) const latestReportableMessage = ChatBskyConvoDefs.isMessageView(convo.view.lastMessage) && convo.view.lastMessage.sender?.did !== currentAccount?.did ? convo.view.lastMessage : undefined return ( {displayName} } muted={convo.view.muted} settings={ } /> ) } function GroupHeaderReady({ convo, }: { convo: Extract }) { const {t: l} = useLingui() const navigation = useNavigation() const handleNavigateToSettings = () => { navigation.navigate('MessagesConversationSettings', { conversation: convo.view.id, }) } return ( {convo.details.name} } muted={convo.view.muted} settings={ } /> ) } function Wrapper({ heading, muted, settings, }: { heading: React.ReactNode muted: boolean settings: React.ReactNode }) { return ( {heading} {settings} ) } function MuteStatus({muted}: {muted: boolean}) { const t = useTheme() return muted ? ( <> · ) : undefined }