import React, {useCallback, useRef} from 'react' import { FlatList, NativeScrollEvent, NativeSyntheticEvent, View, } from 'react-native' import {KeyboardAvoidingView} from 'react-native-keyboard-controller' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {useChat} from '#/state/messages' import {ConvoItem, ConvoStatus} from '#/state/messages/convo' import {isWeb} from 'platform/detection' import {MessageInput} from '#/screens/Messages/Conversation/MessageInput' import {MessageItem} from '#/screens/Messages/Conversation/MessageItem' import {Button, ButtonText} from '#/components/Button' import {Loader} from '#/components/Loader' import {Text} from '#/components/Typography' function MaybeLoader({isLoading}: {isLoading: boolean}) { return ( {isLoading && } ) } function RetryButton({onPress}: {onPress: () => unknown}) { const {_} = useLingui() return ( ) } function renderItem({item}: {item: ConvoItem}) { if (item.type === 'message' || item.type === 'pending-message') { return } else if (item.type === 'deleted-message') { return Deleted message } else if (item.type === 'pending-retry') { return } return null } function keyExtractor(item: ConvoItem) { return item.key } function onScrollToEndFailed() { // Placeholder function. You have to give FlatList something or else it will error. } export function MessagesList() { const chat = useChat() const flatListRef = useRef(null) // We use this to know if we should scroll after a new clop is added to the list const isAtBottom = useRef(false) const currentOffset = React.useRef(0) const onContentSizeChange = useCallback(() => { if (currentOffset.current <= 100) { flatListRef.current?.scrollToOffset({offset: 0, animated: true}) } }, []) const onEndReached = useCallback(() => { chat.service.fetchMessageHistory() }, [chat]) const onInputFocus = useCallback(() => { if (!isAtBottom.current) { flatListRef.current?.scrollToOffset({offset: 0, animated: true}) } }, []) const onInputBlur = useCallback(() => {}, []) const onSendMessage = useCallback( (text: string) => { chat.service.sendMessage({ text, }) }, [chat.service], ) const onScroll = React.useCallback( (e: NativeSyntheticEvent) => { currentOffset.current = e.nativeEvent.contentOffset.y }, [], ) return ( } removeClippedSubviews={true} ref={flatListRef} keyboardDismissMode="none" /> ) }