/* eslint-disable react/prop-types */ import React, { useEffect, useState } from 'react'; import PropTypes from 'prop-types'; import { FlatList } from 'react-native'; import { useSelector } from 'react-redux'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { HeaderBackButton } from '@react-navigation/stack'; import ActivityIndicator from '../containers/ActivityIndicator'; import I18n from '../i18n'; import StatusBar from '../containers/StatusBar'; import log from '../utils/log'; import debounce from '../utils/debounce'; import { themes } from '../constants/colors'; import SafeAreaView from '../containers/SafeAreaView'; import * as HeaderButton from '../containers/HeaderButton'; import * as List from '../containers/List'; import BackgroundContainer from '../containers/BackgroundContainer'; import { isIOS } from '../utils/deviceInfo'; import { getHeaderTitlePosition } from '../containers/Header'; import SearchHeader from './ThreadMessagesView/SearchHeader'; import { useTheme } from '../theme'; import Message from '../containers/message'; import RocketChat from '../lib/rocketchat'; const API_FETCH_COUNT = 25; const DiscussionMessagesView = ({ navigation, route }) => { const rid = route.params?.rid; const canAutoTranslate = route.params?.canAutoTranslate; const autoTranslate = route.params?.autoTranslate; const autoTranslateLanguage = route.params?.autoTranslateLanguage; const navToRoomInfo = route.params?.navToRoomInfo; const user = useSelector(state => state.login?.user); const baseUrl = useSelector(state => state.server.server); const useRealName = useSelector(state => state.settings.UI_Use_Real_Name); const Message_TimeFormat = useSelector(state => state.settings.Message_TimeFormat); const isMasterDetail = useSelector(state => state.app.isMasterDetail); const [loading, setLoading] = useState(false); const [discussions, setDiscussions] = useState([]); const [search, setSearch] = useState([]); const [isSearching, setIsSearching] = useState(false); const { theme } = useTheme(); const insets = useSafeAreaInsets(); const load = async() => { if (loading) { return; } setLoading(true); try { const result = await RocketChat.getDiscussions({ roomId: rid, offset: discussions.length, count: API_FETCH_COUNT }); if (result.success) { if (isSearching) { setSearch(result.messages); } else { setDiscussions(result.messages); } } setLoading(false); } catch (e) { log(e); setLoading(false); } }; const onSearchChangeText = debounce(async(text) => { setLoading(true); try { const result = await RocketChat.getDiscussions({ roomId: rid, offset: search.length, count: API_FETCH_COUNT, text }); if (result.success) { setSearch(result.messages); } setLoading(false); } catch (e) { log(e); setLoading(false); } }, 300); const onCancelSearchPress = () => { setIsSearching(false); load(); }; const onSearchPress = () => { setIsSearching(true); }; const setHeader = () => { if (isSearching) { const headerTitlePosition = getHeaderTitlePosition({ insets, numIconsRight: 1 }); return { headerTitleAlign: 'left', headerLeft: () => ( ), headerTitle: () => , headerTitleContainerStyle: { left: headerTitlePosition.left, right: headerTitlePosition.right }, headerRight: () => null }; } const options = { headerLeft: () => ( navigation.pop()} tintColor={themes[theme].headerTintColor} /> ), headerTitleAlign: 'center', headerTitle: I18n.t('Discussions'), headerTitleContainerStyle: { left: null, right: null } }; if (isMasterDetail) { options.headerLeft = () => ; } options.headerRight = () => ( ); return options; }; useEffect(() => { load(); }, []); useEffect(() => { const options = setHeader(); navigation.setOptions(options); }, [navigation, isSearching]); const onDiscussionPress = debounce((item) => { navigation.push('RoomView', { rid: item.drid, prid: item.rid, name: item.msg, t: 'p' }); }, 1000, true); const renderItem = ({ item }) => ( ); if (!discussions?.length) { return ( <> ); } return ( item.msg} style={{ backgroundColor: themes[theme].backgroundColor }} onEndReachedThreshold={0.5} maxToRenderPerBatch={5} windowSize={10} initialNumToRender={7} removeClippedSubviews={isIOS} onEndReached={() => discussions.length > 25 ?? load()} ItemSeparatorComponent={List.Separator} ListFooterComponent={loading ? : null} scrollIndicatorInsets={{ right: 1 }} /> ); }; DiscussionMessagesView.propTypes = { navigation: PropTypes.object, route: PropTypes.object }; export default DiscussionMessagesView;