diff --git a/app/containers/MessageActions/index.tsx b/app/containers/MessageActions/index.tsx index 9147d061b..8782f940f 100644 --- a/app/containers/MessageActions/index.tsx +++ b/app/containers/MessageActions/index.tsx @@ -15,14 +15,10 @@ import { showConfirmationAlert } from '../../utils/info'; import { useActionSheet } from '../ActionSheet'; import Header, { HEADER_HEIGHT } from './Header'; import events from '../../utils/log/events'; +import { IRoom } from '../../definitions/IRoom'; interface IMessageActions { - room: { - rid: string | number; - autoTranslateLanguage: any; - autoTranslate: any; - reactWhenReadOnly: any; - }; + room: IRoom; tmid?: string; user: { id: string | number; diff --git a/app/definitions/IRoom.ts b/app/definitions/IRoom.ts index cd09b86d6..49b56eefc 100644 --- a/app/definitions/IRoom.ts +++ b/app/definitions/IRoom.ts @@ -24,8 +24,6 @@ export interface IRoom extends IRocketChatRecord, ISubscriptions { teamId?: string; encrypted?: boolean; visitor?: boolean; - autoTranslateLanguage?: boolean; - autoTranslate?: boolean; usedCannedResponse?: string; bannerClosed: boolean; lastOpen?: Date; diff --git a/app/definitions/ISubscriptions.ts b/app/definitions/ISubscriptions.ts index cf4494d7c..aed3afc79 100644 --- a/app/definitions/ISubscriptions.ts +++ b/app/definitions/ISubscriptions.ts @@ -19,6 +19,15 @@ export interface ISubscriptions { sysMes: string; archived: string; broadcast: string; + autoTranslateLanguage: string; + autoTranslate: boolean; + reactWhenReadOnly: boolean; + f: boolean; + ro: boolean; + blocked: boolean; + blocker: boolean; + muted: boolean; + roles: string; } export type TSubscriptionsModel = ISubscriptions & Model; diff --git a/app/stacks/types.ts b/app/stacks/types.ts index 89a67181f..be95f4e3d 100644 --- a/app/stacks/types.ts +++ b/app/stacks/types.ts @@ -6,7 +6,7 @@ import { IOptionsField } from '../views/NotificationPreferencesView/options'; import { IServer } from '../definitions/IServer'; import { IAttachment } from '../definitions/IAttachment'; import { IMessage } from '../definitions/IMessage'; -import { IRoom, RoomType } from '../definitions/IRoom'; +import { IRoom, TRoomModel, RoomType } from '../definitions/IRoom'; import { ModalStackParamList } from './MasterDetailStack/types'; export type ChatsStackParamList = { @@ -21,7 +21,7 @@ export type ChatsStackParamList = { name?: string; fname?: string; prid?: string; - room?: IRoom; + room?: TRoomModel; jumpToMessageId?: string; jumpToThreadId?: string; roomUserId?: string; diff --git a/app/views/RoomView/List/index.tsx b/app/views/RoomView/List/index.tsx index a6f9cf828..bf42c2863 100644 --- a/app/views/RoomView/List/index.tsx +++ b/app/views/RoomView/List/index.tsx @@ -45,7 +45,7 @@ interface IRoomListContainerProps { loading: boolean; listRef: React.RefObject; hideSystemMessages: any[]; - tunread: []; + tunread: string; ignored: []; navigation: StackNavigationProp; showMessageInMainThread: boolean; diff --git a/app/views/RoomView/index.tsx b/app/views/RoomView/index.tsx index 88dc06e1a..81ac5d5a8 100644 --- a/app/views/RoomView/index.tsx +++ b/app/views/RoomView/index.tsx @@ -66,13 +66,27 @@ import UploadProgress from './UploadProgress'; import ReactionPicker from './ReactionPicker'; import List from './List'; import { ChatsStackParamList } from '../../stacks/types'; -import { IRoom, IRoomModel, RoomType } from '../../definitions/IRoom'; +import { IRoom, TRoomModel, RoomType } from '../../definitions/IRoom'; import { IAttachment } from '../../definitions/IAttachment'; import { IThread } from '../../definitions/IThread'; import { ISubscriptions } from '../../definitions/ISubscriptions'; import { ModalStackParamList } from '../../stacks/MasterDetailStack/types'; -const stateAttrsUpdate = [ +type TStateAttrsUpdate = + | 'joined' + | 'lastOpen' + | 'reactionsModalVisible' + | 'canAutoTranslate' + | 'selectedMessage' + | 'loading' + | 'editing' + | 'replying' + | 'reacting' + | 'readOnly' + | 'member' + | 'showingBlockingLoader'; + +const stateAttrsUpdate: TStateAttrsUpdate[] = [ 'joined', 'lastOpen', 'reactionsModalVisible', @@ -86,7 +100,30 @@ const stateAttrsUpdate = [ 'member', 'showingBlockingLoader' ]; -const roomAttrsUpdate = [ + +type TRoomAttrsUpdate = + | 'f' + | 'ro' + | 'blocked' + | 'blocker' + | 'archived' + | 'tunread' + | 'muted' + | 'ignored' + | 'jitsiTimeout' + | 'announcement' + | 'sysMes' + | 'topic' + | 'name' + | 'fname' + | 'roles' + | 'bannerClosed' + | 'visitor' + | 'joinCodeRequired' + | 'teamMain' + | 'teamId'; + +const roomAttrsUpdate: TRoomAttrsUpdate[] = [ 'f', 'ro', 'blocked', @@ -139,6 +176,28 @@ interface IRoomViewProps { }; } +interface IRoomViewState { + joined: boolean; + room: TRoomModel; + roomUpdate: Partial; + member: { + statusText?: string; + }; + lastOpen: Date | null; + reactionsModalVisible: boolean; + selectedMessage: {}; + canAutoTranslate: boolean; + loading: boolean; + showingBlockingLoader: boolean; + editing: boolean; + replying: boolean; + replyWithMention: boolean; + reacting: boolean; + readOnly: boolean; + unreadsCount: number | null; + roomUserId: string; +} + export interface IRoomItem { id: string; t: string; @@ -171,7 +230,7 @@ interface IBlockAction { mid: string; } -class RoomView extends React.Component { +class RoomView extends React.Component { private rid: string; private t: RoomType; private tmid?: string; @@ -219,7 +278,7 @@ class RoomView extends React.Component { name, fname, prid - } as IRoom); + } as TRoomModel); this.jumpToMessageId = props.route.params?.jumpToMessageId; this.jumpToThreadId = props.route.params?.jumpToThreadId; const roomUserId = props.route.params?.roomUserId ?? RocketChat.getUidDirectMessage(room); @@ -296,7 +355,7 @@ class RoomView extends React.Component { console.timeEnd(`${this.constructor.name} mount`); } - shouldComponentUpdate(nextProps: IRoomViewProps, nextState: any) { + shouldComponentUpdate(nextProps: IRoomViewProps, nextState: IRoomViewState) { const { state } = this; const { roomUpdate, member } = state; const { appState, theme, insets, route } = this.props; @@ -322,7 +381,7 @@ class RoomView extends React.Component { return roomAttrsUpdate.some(key => !dequal(nextState.roomUpdate[key], roomUpdate[key])); } - componentDidUpdate(prevProps: IRoomViewProps, prevState: any) { + componentDidUpdate(prevProps: IRoomViewProps, prevState: IRoomViewState) { const { roomUpdate } = this.state; const { appState, insets, route } = this.props; @@ -376,7 +435,7 @@ class RoomView extends React.Component { this.mounted = false; if (!editing && this.messagebox && this.messagebox.current) { const { text } = this.messagebox.current; - let obj: IRoomModel = room; // TODO - test the threadsCollection.find return to change this any; + let obj = room; // TODO - test the threadsCollection.find return to change this any; if (this.tmid) { try { @@ -504,10 +563,10 @@ class RoomView extends React.Component { @@ -1086,7 +1145,7 @@ class RoomView extends React.Component { dateSeparator = item.ts; showUnreadSeparator = moment(item.ts).isAfter(lastOpen); } else { - showUnreadSeparator = lastOpen && moment(item.ts).isSameOrAfter(lastOpen) && moment(previousItem.ts).isBefore(lastOpen); + showUnreadSeparator = lastOpen! && moment(item.ts).isSameOrAfter(lastOpen) && moment(previousItem.ts).isBefore(lastOpen); if (!moment(item.ts).isSame(previousItem.ts, 'day')) { dateSeparator = item.ts; }