import React, {useCallback, useMemo, useRef} from 'react' import {FlatList, View, ViewToken} from 'react-native' import {KeyboardAvoidingView} from 'react-native-keyboard-controller' 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 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 [onViewableItemsChanged, viewabilityConfig] = useMemo(() => { return [ (info: {viewableItems: Array; changed: Array}) => { const firstVisibleIndex = info.viewableItems[0]?.index isAtBottom.current = Number(firstVisibleIndex) < 2 }, { itemVisiblePercentThreshold: 50, minimumViewTime: 10, }, ] }, []) const onContentSizeChange = useCallback(() => { if (isAtBottom.current) { 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], ) return ( } removeClippedSubviews={true} ref={flatListRef} keyboardDismissMode="none" /> ) }