diff --git a/app/definitions/rest/v1/chat.ts b/app/definitions/rest/v1/chat.ts index f611c829423..b89ba13173a 100644 --- a/app/definitions/rest/v1/chat.ts +++ b/app/definitions/rest/v1/chat.ts @@ -8,6 +8,11 @@ export type ChatEndpoints = { message: IMessage; }; }; + 'chat.getMessageByFileId': { + GET: (params: { fileId: string }) => { + message: IMessage; + }; + }; 'chat.followMessage': { POST: (params: { mid: IMessage['_id'] }) => void; }; diff --git a/app/lib/services/restApi.ts b/app/lib/services/restApi.ts index c6f087b8209..af651cdc1de 100644 --- a/app/lib/services/restApi.ts +++ b/app/lib/services/restApi.ts @@ -786,6 +786,10 @@ export const getFiles = (roomId: string, type: SubscriptionType, offset: number) }); }; +export const getMessageByFileId = (fileId: string) => + // RC 8.10.0 + sdk.get('chat.getMessageByFileId', { fileId }); + export const getMessages = ({ roomId, type, diff --git a/app/views/MessagesView/index.tsx b/app/views/MessagesView/index.tsx index 4175ab9141a..92dfda086d6 100644 --- a/app/views/MessagesView/index.tsx +++ b/app/views/MessagesView/index.tsx @@ -31,7 +31,15 @@ import { type TAnyMessageModel, type IUrl } from '../../definitions'; -import { getFiles, getMessages, getPinnedMessages, togglePinMessage, toggleStarMessage } from '../../lib/services/restApi'; +import { + getFiles, + getMessageByFileId, + getMessages, + getPinnedMessages, + togglePinMessage, + toggleStarMessage +} from '../../lib/services/restApi'; +import { compareServerVersion, showErrorAlert } from '../../lib/methods/helpers'; import { type TNavigation } from '../../stacks/stackType'; import AudioManager from '../../lib/methods/AudioManager'; import { Encryption } from '../../lib/encryption'; @@ -54,6 +62,7 @@ interface IMessagesViewProps { showActionSheet: (params: { options: string[]; hasCancel: boolean }) => void; isMasterDetail: boolean; insets: EdgeInsets; + serverVersion: string | null; } interface IMessagesViewState { @@ -136,11 +145,31 @@ class MessagesView extends Component { navigation.navigate('RoomInfoView', navParam); }; + resolveMessageId = async (item: IMessage): Promise => { + const { route, serverVersion } = this.props; + if (route.params?.name !== 'Files' || compareServerVersion(serverVersion, 'lowerThan', '8.9.0')) { + return item._id; + } + + try { + const result = await getMessageByFileId(item._id); + if (result.success && result.message) { + return result.message._id; + } + } catch {} + return null; + }; + jumpToMessage = async ({ item }: { item: IMessage }) => { const { isMasterDetail } = this.props; + const jumpToMessageId = await this.resolveMessageId(item); + if (!jumpToMessageId) { + showErrorAlert(I18n.t('Message_not_found'), I18n.t('Oops')); + return; + } let params: IParams = { rid: this.rid, - jumpToMessageId: item._id, + jumpToMessageId, t: this.t, room: this.room }; @@ -149,7 +178,7 @@ class MessagesView extends Component { params = { ...params, tmid: item.tmid, - name: await getThreadName(this.rid, item.tmid, item._id), + name: await getThreadName(this.rid, item.tmid, jumpToMessageId), t: SubscriptionType.THREAD }; Navigation.push('RoomView', params); @@ -367,7 +396,8 @@ class MessagesView extends Component { const mapStateToProps = (state: IApplicationState) => ({ baseUrl: state.server.server, - user: getUserSelector(state) + user: getUserSelector(state), + serverVersion: state.server.version }); export default connect(mapStateToProps)(withTheme(withActionSheet(withMasterDetail(withSafeAreaInsets(MessagesView)))));