import React from 'react'; import { CompositeNavigationProp } from '@react-navigation/native'; import { StackNavigationOptions, StackNavigationProp } from '@react-navigation/stack'; import { FlatList, ListRenderItem } from 'react-native'; import { connect } from 'react-redux'; import { dequal } from 'dequal'; import I18n from '../../../i18n'; import RoomItem, { ROW_HEIGHT } from '../../../presentation/RoomItem'; import { isIOS, isTablet } from '../../../utils/deviceInfo'; import { getUserSelector } from '../../../selectors/login'; import { withTheme } from '../../../theme'; import { withDimensions } from '../../../dimensions'; import SafeAreaView from '../../../containers/SafeAreaView'; import StatusBar from '../../../containers/StatusBar'; import { goRoom } from '../../../utils/goRoom'; import * as HeaderButton from '../../../containers/HeaderButton'; import RocketChat from '../../../lib/rocketchat'; import { events, logEvent } from '../../../utils/log'; import { getInquiryQueueSelector } from '../selectors/inquiry'; import { IOmnichannelRoom, IApplicationState } from '../../../definitions'; import { DisplayMode, MAX_SIDEBAR_WIDTH, themes } from '../../../lib/constants'; import { ChatsStackParamList } from '../../../stacks/types'; import { MasterDetailInsideStackParamList } from '../../../stacks/MasterDetailStack/types'; import { TSettingsValues } from '../../../reducers/settings'; interface INavigationOptions { isMasterDetail: boolean; navigation: CompositeNavigationProp< StackNavigationProp, StackNavigationProp >; } interface IQueueListView extends INavigationOptions { user: { id: string; username: string; token: string; }; width: number; queued: IOmnichannelRoom[]; server: string; useRealName?: TSettingsValues; theme: string; showAvatar: any; displayMode: DisplayMode; } const INITIAL_NUM_TO_RENDER = isTablet ? 20 : 12; const getItemLayout = (data: IOmnichannelRoom[] | null | undefined, index: number) => ({ length: ROW_HEIGHT, offset: ROW_HEIGHT * index, index }); const keyExtractor = (item: IOmnichannelRoom) => item.rid; class QueueListView extends React.Component { private getScrollRef?: React.Ref>; private onEndReached: ((info: { distanceFromEnd: number }) => void) | null | undefined; static navigationOptions = ({ navigation, isMasterDetail }: INavigationOptions) => { const options: StackNavigationOptions = { title: I18n.t('Queued_chats') }; if (isMasterDetail) { options.headerLeft = () => ; } return options; }; shouldComponentUpdate(nextProps: IQueueListView) { const { queued } = this.props; if (!dequal(nextProps.queued, queued)) { return true; } return false; } onPressItem = (item = {} as IOmnichannelRoom) => { logEvent(events.QL_GO_ROOM); const { navigation, isMasterDetail } = this.props; if (isMasterDetail) { navigation.navigate('DrawerNavigator'); } else { navigation.navigate('RoomsListView'); } goRoom({ item: { ...item, // we're calling v as visitor on our mergeSubscriptionsRooms visitor: item.v }, isMasterDetail }); }; getRoomTitle = (item: IOmnichannelRoom) => RocketChat.getRoomTitle(item); getRoomAvatar = (item: IOmnichannelRoom) => RocketChat.getRoomAvatar(item); getUidDirectMessage = (room: IOmnichannelRoom) => RocketChat.getUidDirectMessage(room); renderItem: ListRenderItem = ({ item }) => { const { user: { id: userId, username, token }, server, useRealName, theme, isMasterDetail, width, showAvatar, displayMode } = this.props; const id = this.getUidDirectMessage(item); return ( ); }; render() { const { queued, theme } = this.props; return ( ); } } const mapStateToProps = (state: IApplicationState) => ({ user: getUserSelector(state), isMasterDetail: state.app.isMasterDetail, server: state.server.server, useRealName: state.settings.UI_Use_Real_Name, queued: getInquiryQueueSelector(state), showAvatar: state.sortPreferences.showAvatar, displayMode: state.sortPreferences.displayMode }); export default connect(mapStateToProps)(withDimensions(withTheme(QueueListView)));