import {ScrollView, View} from 'react-native' import {moderateProfile, type ModerationOpts} from '@atproto/api' import {msg} from '@lingui/core/macro' import {useLingui} from '@lingui/react' import {Trans} from '@lingui/react/macro' import {useNavigation} from '@react-navigation/native' import {isBlockedOrBlocking, isMuted} from '#/lib/moderation/blocked-and-muted' import {createSanitizedDisplayName} from '#/lib/moderation/create-sanitized-display-name' import {type NavigationProp} from '#/lib/routes/types' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useEnableSquareButtons} from '#/state/preferences/enable-square-buttons' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useListConvosQuery} from '#/state/queries/messages/list-conversations' import {useSession} from '#/state/session' import {UserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, tokens, useTheme} from '#/alf' import {AvatarBubbles} from '#/components/AvatarBubbles' import {Button} from '#/components/Button' import {useDialogContext} from '#/components/Dialog' import {type ConvoWithDetails, parseConvoView} from '#/components/dms/util' import {ProfileBadges} from '#/components/ProfileBadges' import {Text} from '#/components/Typography' import {useAnalytics} from '#/analytics' export function RecentChats({ postUri, onBeforePress, }: { postUri: string onBeforePress?: () => void }) { const ax = useAnalytics() const control = useDialogContext() const {currentAccount} = useSession() const {data} = useListConvosQuery({status: 'accepted'}) const convos = data?.pages[0]?.convos?.slice(0, 10) const moderationOpts = useModerationOpts() const navigation = useNavigation() const onSelectChat = (convoId: string) => { onBeforePress?.() control.close(() => { ax.metric('share:press:recentDm', {}) navigation.navigate('MessagesConversation', { conversation: convoId, embed: postUri, }) }) } if (!moderationOpts) return null return ( {convos && convos.length > 0 ? ( convos.map(c => { const convo = parseConvoView(c, currentAccount?.did) if (!convo) return null if ( (convo.kind === 'direct' && convo.primaryMember.handle === 'missing.invalid') || convo.view.muted ) { return null } return ( onSelectChat(convo.view.id)} moderationOpts={moderationOpts} /> ) }) ) : ( <> )} {convos && convos.length === 0 && } ) } const WIDTH = 80 function RecentChatItem({ onPress, moderationOpts, convo, }: { onPress: () => void moderationOpts: ModerationOpts convo: ConvoWithDetails }) { const {_} = useLingui() const t = useTheme() const primaryProfile = useProfileShadow(convo.primaryMember) const moderation = moderateProfile(primaryProfile, moderationOpts) const name = convo.kind === 'group' ? convo.details.name : createSanitizedDisplayName( primaryProfile, true, moderation.ui('displayName'), ) if ( convo.kind === 'direct' && (isBlockedOrBlocking(primaryProfile) || isMuted(primaryProfile)) ) { return null } return ( ) } function ConvoSkeleton() { const t = useTheme() const enableSquareButtons = useEnableSquareButtons() return ( ) } function NoConvos() { const t = useTheme() return ( Start a conversation, and it will appear here. ) }