import React from 'react' import {View} from 'react-native' import { AppBskyActorDefs, ChatBskyConvoDefs, moderateProfile, ModerationOpts, } from '@atproto/api' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useNavigation} from '@react-navigation/native' import {NavigationProp} from '#/lib/routes/types' import {isNative} from '#/platform/detection' import {useProfileShadow} from '#/state/cache/profile-shadow' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useSession} from '#/state/session' import {sanitizeDisplayName} from 'lib/strings/display-names' import {TimeElapsed} from '#/view/com/util/TimeElapsed' import {UserAvatar} from '#/view/com/util/UserAvatar' import {atoms as a, useBreakpoints, useTheme, web} from '#/alf' import {Button} from '#/components/Button' import {ConvoMenu} from '#/components/dms/ConvoMenu' import {Bell2Off_Filled_Corner0_Rounded as BellStroke} from '#/components/icons/Bell2' import {useMenuControl} from '#/components/Menu' import {Text} from '#/components/Typography' export function ChatListItem({convo}: {convo: ChatBskyConvoDefs.ConvoView}) { const {currentAccount} = useSession() const otherUser = convo.members.find( member => member.did !== currentAccount?.did, ) const moderationOpts = useModerationOpts() if (!otherUser || !moderationOpts) { return null } return ( ) } function ChatListItemReady({ convo, profile: profileUnshadowed, moderationOpts, }: { convo: ChatBskyConvoDefs.ConvoView profile: AppBskyActorDefs.ProfileViewBasic moderationOpts: ModerationOpts }) { const t = useTheme() const {_} = useLingui() const {currentAccount} = useSession() const menuControl = useMenuControl() const {gtMobile} = useBreakpoints() const profile = useProfileShadow(profileUnshadowed) const moderation = React.useMemo( () => moderateProfile(profile, moderationOpts), [profile, moderationOpts], ) const isDeletedAccount = profile.handle === 'missing.invalid' const displayName = isDeletedAccount ? 'Deleted Account' : sanitizeDisplayName( profile.displayName || profile.handle, moderation.ui('displayName'), ) let lastMessage = _(msg`No messages yet`) let lastMessageSentAt: string | null = null if (ChatBskyConvoDefs.isMessageView(convo.lastMessage)) { if (convo.lastMessage.sender?.did === currentAccount?.did) { lastMessage = _(msg`You: ${convo.lastMessage.text}`) } else { lastMessage = convo.lastMessage.text } lastMessageSentAt = convo.lastMessage.sentAt } if (ChatBskyConvoDefs.isDeletedMessageView(convo.lastMessage)) { lastMessage = _(msg`Message deleted`) } const navigation = useNavigation() const [showActions, setShowActions] = React.useState(false) const onMouseEnter = React.useCallback(() => { setShowActions(true) }, []) const onMouseLeave = React.useCallback(() => { setShowActions(false) }, []) const onFocus = React.useCallback(e => { if (e.nativeEvent.relatedTarget == null) return setShowActions(true) }, []) const onPress = React.useCallback(() => { navigation.push('MessagesConversation', { conversation: convo.id, }) }, [convo.id, navigation]) return ( ) }