/* eslint-disable react/prop-types */ import React, {useCallback, useMemo, useState} from 'react' import {View} from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {NativeStackScreenProps} from '@react-navigation/native-stack' import {useInitialNumToRender} from '#/lib/hooks/useInitialNumToRender' import {MessagesTabNavigatorParams} from '#/lib/routes/types' import {useGate} from '#/lib/statsig/statsig' import {cleanError} from '#/lib/strings/errors' import {logger} from '#/logger' import {useSession} from '#/state/session' import {List} from '#/view/com/util/List' import {TimeElapsed} from '#/view/com/util/TimeElapsed' import {PreviewableUserAvatar} from '#/view/com/util/UserAvatar' import {ViewHeader} from '#/view/com/util/ViewHeader' import {useBreakpoints, useTheme} from '#/alf' import {atoms as a} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import {DialogControlProps, useDialogControl} from '#/components/Dialog' import {Envelope_Stroke2_Corner0_Rounded as Envelope} from '#/components/icons/Envelope' import {SettingsSliderVertical_Stroke2_Corner0_Rounded as SettingsSlider} from '#/components/icons/SettingsSlider' import {Link} from '#/components/Link' import {ListFooter, ListMaybePlaceholder} from '#/components/Lists' import {Text} from '#/components/Typography' import * as TempDmChatDefs from '#/temp/dm/defs' import {NewChat} from '../../../components/dms/NewChat' import {ClipClopGate} from '../gate' import {useListChats} from '../Temp/query/query' type Props = NativeStackScreenProps export function MessagesListScreen({navigation}: Props) { const {_} = useLingui() const t = useTheme() const newChatControl = useDialogControl() const {gtMobile} = useBreakpoints() const renderButton = useCallback(() => { return ( ) }, [_, t.atoms.text]) const initialNumToRender = useInitialNumToRender() const [isPTRing, setIsPTRing] = useState(false) const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage, error, refetch, } = useListChats() const isError = !!error const conversations = useMemo(() => { if (data?.pages) { return data.pages.flatMap(page => page.chats) } return [] }, [data]) const onRefresh = useCallback(async () => { setIsPTRing(true) try { await refetch() } catch (err) { logger.error('Failed to refresh conversations', {message: err}) } setIsPTRing(false) }, [refetch, setIsPTRing]) const onEndReached = useCallback(async () => { if (isFetchingNextPage || !hasNextPage || isError) return try { await fetchNextPage() } catch (err) { logger.error('Failed to load more conversations', {message: err}) } }, [isFetchingNextPage, hasNextPage, isError, fetchNextPage]) const onNewChat = useCallback( (conversation: string) => navigation.navigate('MessagesConversation', {conversation}), [navigation], ) const onNavigateToSettings = useCallback(() => { navigation.navigate('MessagesSettings') }, [navigation]) const renderItem = useCallback(({item}: {item: TempDmChatDefs.ChatView}) => { return }, []) const gate = useGate() if (!gate('dms')) return if (conversations.length < 1) { return ( <> ) } return ( {!gtMobile && ( )} item.id} refreshing={isPTRing} onRefresh={onRefresh} onEndReached={onEndReached} ListHeaderComponent={ } ListFooterComponent={ } onEndReachedThreshold={3} initialNumToRender={initialNumToRender} windowSize={11} // @ts-ignore our .web version only -sfn desktopFixedHeight /> ) } function ChatListItem({chat}: {chat: TempDmChatDefs.ChatView}) { const t = useTheme() const {_} = useLingui() const {currentAccount} = useSession() let lastMessage = _(msg`No messages yet`) let lastMessageSentAt: string | null = null if (TempDmChatDefs.isMessageView(chat.lastMessage)) { if (chat.lastMessage.sender?.did === currentAccount?.did) { lastMessage = _(msg`You: ${chat.lastMessage.text}`) } else { lastMessage = chat.lastMessage.text } lastMessageSentAt = chat.lastMessage.sentAt } if (TempDmChatDefs.isDeletedMessage(chat.lastMessage)) { lastMessage = _(msg`Message deleted`) } const otherUser = chat.members.find( member => member.did !== currentAccount?.did, ) if (!otherUser) { return null } return ( {({hovered, pressed}) => ( 0 && a.font_bold]}> {otherUser.displayName || otherUser.handle} {' '} {lastMessageSentAt ? ( {({timeElapsed}) => ( @{otherUser.handle} · {timeElapsed} )} ) : ( @{otherUser.handle} )} 0 ? a.font_bold : t.atoms.text_contrast_medium, ]}> {lastMessage} {chat.unreadCount > 0 && ( )} )} ) } function DesktopHeader({ newChatControl, onNavigateToSettings, }: { newChatControl: DialogControlProps onNavigateToSettings: () => void }) { const t = useTheme() const {_} = useLingui() const {gtMobile, gtTablet} = useBreakpoints() if (!gtMobile) { return null } return ( Messages {gtTablet && ( )} ) }