Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/hungry-games-smoke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@rocket.chat/meteor': patch
---

Blocks edit message action for Off-The-Record (OTR) messages.
2 changes: 1 addition & 1 deletion apps/meteor/app/ui/client/lib/ChatMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export class ChatMessages implements ChatAPI {
}

if (!this.currentEditing) {
let lastMessage = await this.data.findLastOwnMessage();
let lastMessage = await this.data.findPreviousOwnMessage();

// Videoconf messages should not be edited
if (lastMessage && isVideoConfMessage(lastMessage)) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { isRoomFederated } from '@rocket.chat/core-typings';
import { isOTRAckMessage, isOTRMessage, isRoomFederated } from '@rocket.chat/core-typings';
import type { IRoom, IMessage, ISubscription } from '@rocket.chat/core-typings';
import { usePermission, useSetting, useUser } from '@rocket.chat/ui-contexts';
import moment from 'moment';
Expand Down Expand Up @@ -26,6 +26,10 @@ export const useEditMessageAction = (
return message.u._id === user?._id;
}

if (isOTRMessage(message) || isOTRAckMessage(message)) {
return false;
}

const editOwn = message.u && message.u._id === user?._id;
if (!canEditMessage && (!isEditAllowed || !editOwn)) {
return false;
Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/client/lib/chats/ChatAPI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export type DataAPI = {
getLastMessage(): Promise<IMessage>;
findLastOwnMessage(): Promise<IMessage | undefined>;
getLastOwnMessage(): Promise<IMessage>;
findPreviousOwnMessage(message: IMessage): Promise<IMessage | undefined>;
findPreviousOwnMessage(message?: IMessage): Promise<IMessage | undefined>;
getPreviousOwnMessage(message: IMessage): Promise<IMessage>;
findNextOwnMessage(message: IMessage): Promise<IMessage | undefined>;
getNextOwnMessage(message: IMessage): Promise<IMessage>;
Expand Down
17 changes: 14 additions & 3 deletions apps/meteor/client/lib/chats/data.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
import type { IEditedMessage, IMessage, IRoom, ISubscription } from '@rocket.chat/core-typings';
import {
isOTRAckMessage,
isOTRMessage,
type IEditedMessage,
type IMessage,
type IRoom,
type ISubscription,
} from '@rocket.chat/core-typings';
import { Random } from '@rocket.chat/random';
import moment from 'moment';

Expand Down Expand Up @@ -85,6 +92,10 @@ export const createDataAPI = ({ rid, tmid }: { rid: IRoom['_id']; tmid: IMessage
return false;
}

if (isOTRMessage(message) || isOTRAckMessage(message)) {
return false;
}

const canEditMessage = hasAtLeastOnePermission('edit-message', message.rid);
const editAllowed = (settings.get('Message_AllowEditing') as boolean | undefined) ?? false;
const editOwn = message?.u && message.u._id === Meteor.userId();
Expand All @@ -104,15 +115,15 @@ export const createDataAPI = ({ rid, tmid }: { rid: IRoom['_id']; tmid: IMessage
return true;
};

const findPreviousOwnMessage = async (message: IMessage): Promise<IMessage | undefined> => {
const findPreviousOwnMessage = async (message?: IMessage): Promise<IMessage | undefined> => {
const uid = Meteor.userId();

if (!uid) {
return undefined;
}

const msg = Messages.findOne(
{ rid, 'tmid': tmid ?? { $exists: false }, 'u._id': uid, '_hidden': { $ne: true }, 'ts': { $lt: message.ts } },
{ rid, 'tmid': tmid ?? { $exists: false }, 'u._id': uid, '_hidden': { $ne: true }, 'ts': { ...(message && { $lt: message.ts }) } },
Comment thread
yash-rajpal marked this conversation as resolved.
{ sort: { ts: -1 }, reactive: false },
);

Expand Down