/* 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;