diff --git a/app/containers/ActionSheet/Provider.tsx b/app/containers/ActionSheet/Provider.tsx index 8b75577d..0e58ae57 100644 --- a/app/containers/ActionSheet/Provider.tsx +++ b/app/containers/ActionSheet/Provider.tsx @@ -17,7 +17,7 @@ export const useActionSheet = () => useContext(context); const { Provider, Consumer } = context; -export const withActionSheet = (Component: React.FC) => +export const withActionSheet =

(Component: React.ComponentType

) => forwardRef((props: any, ref: ForwardedRef) => ( {(contexts: any) => } )); diff --git a/app/views/MessagesView/index.js b/app/views/MessagesView/index.tsx similarity index 74% rename from app/views/MessagesView/index.js rename to app/views/MessagesView/index.tsx index f0d0d89d..a948edcd 100644 --- a/app/views/MessagesView/index.js +++ b/app/views/MessagesView/index.tsx @@ -1,8 +1,9 @@ import React from 'react'; -import PropTypes from 'prop-types'; import { FlatList, Text, View } from 'react-native'; import { connect } from 'react-redux'; import { dequal } from 'dequal'; +import { StackNavigationProp } from '@react-navigation/stack'; +import { RouteProp } from '@react-navigation/core'; import Message from '../../containers/message'; import ActivityIndicator from '../../containers/ActivityIndicator'; @@ -18,20 +19,67 @@ import SafeAreaView from '../../containers/SafeAreaView'; import getThreadName from '../../lib/methods/getThreadName'; import styles from './styles'; -class MessagesView extends React.Component { - static propTypes = { - user: PropTypes.object, - baseUrl: PropTypes.string, - navigation: PropTypes.object, - route: PropTypes.object, - customEmojis: PropTypes.object, - theme: PropTypes.string, - showActionSheet: PropTypes.func, - useRealName: PropTypes.bool, - isMasterDetail: PropTypes.bool +type TMessagesViewRouteParams = { + MessagesView: { + rid: string; + t: string; + name: string; }; +}; - constructor(props) { +interface IMessagesViewProps { + user: { + id: string; + }; + baseUrl: string; + navigation: StackNavigationProp; + route: RouteProp; + customEmojis: { [key: string]: string }; + theme: string; + showActionSheet: Function; + useRealName: boolean; + isMasterDetail: boolean; +} + +interface IMessagesViewState { + loading: boolean; + messages: []; + fileLoading: boolean; + total: number; +} + +interface IMessageItem { + u?: string; + user?: string; + editedAt?: Date; + attachments?: any; + _id: string; + tmid?: string; + ts?: Date; + uploadedAt?: Date; + name?: string; + description?: string; + msg?: string; + starred: string; + pinned: boolean; +} + +interface IParams { + rid?: string; + jumpToMessageId: string; + t?: string; + room: any; + tmid?: string; + name?: string; +} + +class MessagesView extends React.Component { + private rid?: string; + private t?: string; + private content: any; + private room: any; + + constructor(props: IMessagesViewProps) { super(props); this.state = { loading: false, @@ -48,7 +96,7 @@ class MessagesView extends React.Component { this.load(); } - shouldComponentUpdate(nextProps, nextState) { + shouldComponentUpdate(nextProps: IMessagesViewProps, nextState: any) { const { loading, messages, fileLoading } = this.state; const { theme } = this.props; if (nextProps.theme !== theme) { @@ -73,7 +121,7 @@ class MessagesView extends React.Component { }); }; - navToRoomInfo = navParam => { + navToRoomInfo = (navParam: { rid: string }) => { const { navigation, user } = this.props; if (navParam.rid === user.id) { return; @@ -81,9 +129,9 @@ class MessagesView extends React.Component { navigation.navigate('RoomInfoView', navParam); }; - jumpToMessage = async ({ item }) => { + jumpToMessage = async ({ item }: { item: IMessageItem }) => { const { navigation, isMasterDetail } = this.props; - let params = { + let params: IParams = { rid: this.rid, jumpToMessageId: item._id, t: this.t, @@ -107,9 +155,9 @@ class MessagesView extends React.Component { } }; - defineMessagesViewContent = name => { + defineMessagesViewContent = (name: string) => { const { user, baseUrl, theme, useRealName } = this.props; - const renderItemCommonProps = item => ({ + const renderItemCommonProps = (item: IMessageItem) => ({ item, baseUrl, user, @@ -137,7 +185,7 @@ class MessagesView extends React.Component { }, noDataMsg: I18n.t('No_files'), testID: 'room-files-view', - renderItem: item => ( + renderItem: (item: IMessageItem) => ( + renderItem: (item: IMessageItem) => }, // Starred Messages Screen Starred: { @@ -176,15 +224,15 @@ class MessagesView extends React.Component { }, noDataMsg: I18n.t('No_starred_messages'), testID: 'starred-messages-view', - renderItem: item => ( + renderItem: (item: IMessageItem) => ( this.onLongPress(item)} theme={theme} /> ), - action: message => ({ + action: (message: IMessageItem) => ({ title: I18n.t('Unstar'), icon: message.starred ? 'star-filled' : 'star', onPress: this.handleActionPress }), - handleActionPress: message => RocketChat.toggleStarMessage(message._id, message.starred) + handleActionPress: (message: IMessageItem) => RocketChat.toggleStarMessage(message._id, message.starred) }, // Pinned Messages Screen Pinned: { @@ -195,12 +243,13 @@ class MessagesView extends React.Component { }, noDataMsg: I18n.t('No_pinned_messages'), testID: 'pinned-messages-view', - renderItem: item => ( + renderItem: (item: IMessageItem) => ( this.onLongPress(item)} theme={theme} /> ), action: () => ({ title: I18n.t('Unpin'), icon: 'pin', onPress: this.handleActionPress }), - handleActionPress: message => RocketChat.togglePinMessage(message._id, message.pinned) + handleActionPress: (message: IMessageItem) => RocketChat.togglePinMessage(message._id, message.pinned) } + // @ts-ignore }[name]; }; @@ -227,7 +276,7 @@ class MessagesView extends React.Component { } }; - getCustomEmoji = name => { + getCustomEmoji = (name: string) => { const { customEmojis } = this.props; const emoji = customEmojis[name]; if (emoji) { @@ -236,12 +285,12 @@ class MessagesView extends React.Component { return null; }; - showAttachment = attachment => { + showAttachment = (attachment: any) => { const { navigation } = this.props; navigation.navigate('AttachmentView', { attachment }); }; - onLongPress = message => { + onLongPress = (message: IMessageItem) => { this.setState({ message }, this.showActionSheet); }; @@ -257,8 +306,8 @@ class MessagesView extends React.Component { try { const result = await this.content.handleActionPress(message); if (result.success) { - this.setState(prevState => ({ - messages: prevState.messages.filter(item => item._id !== message._id), + this.setState((prevState: IMessagesViewState) => ({ + messages: prevState.messages.filter((item: IMessageItem) => item._id !== message._id), total: prevState.total - 1 })); } @@ -267,7 +316,7 @@ class MessagesView extends React.Component { } }; - setFileLoading = fileLoading => { + setFileLoading = (fileLoading: boolean) => { this.setState({ fileLoading }); }; @@ -280,7 +329,7 @@ class MessagesView extends React.Component { ); }; - renderItem = ({ item }) => this.content.renderItem(item); + renderItem = ({ item }: { item: IMessageItem }) => this.content.renderItem(item); render() { const { messages, loading } = this.state; @@ -306,7 +355,7 @@ class MessagesView extends React.Component { } } -const mapStateToProps = state => ({ +const mapStateToProps = (state: any) => ({ baseUrl: state.server.server, user: getUserSelector(state), customEmojis: state.customEmojis, diff --git a/app/views/MessagesView/styles.js b/app/views/MessagesView/styles.ts similarity index 100% rename from app/views/MessagesView/styles.js rename to app/views/MessagesView/styles.ts