Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regression: broken message exhibition when edited #28180

Merged
merged 9 commits into from Mar 2, 2023
2 changes: 1 addition & 1 deletion apps/meteor/.eslintcache

Large diffs are not rendered by default.

Expand Up @@ -45,7 +45,7 @@ export class FederationHooks {
callbacks.add(
'federation.beforeAddUserToARoom',
(params: { user: IUser | string; inviter?: IUser }, room: IRoom): void => {
if (!params || !params.user || !room) {
if (!params?.user || !room) {
return;
}
Promise.await(callback(params.user, room));
Expand All @@ -59,7 +59,7 @@ export class FederationHooks {
callbacks.add(
'federation.beforeAddUserToARoom',
(params: { user: IUser | string; inviter: IUser }, room: IRoom): void => {
if (!params || !params.user || !params.inviter || !room || !settings.get('Federation_Matrix_enabled')) {
if (!params?.user || !params.inviter || !room || !settings.get('Federation_Matrix_enabled')) {
return;
}

Expand Down Expand Up @@ -160,7 +160,7 @@ export class FederationHooks {
) {
return message;
}
if (!isEditedMessage(message)) {
if (!isEditedMessage(message) || !message.editedBy) {
ggazzo marked this conversation as resolved.
Show resolved Hide resolved
return message;
}
Promise.await(callback(message, room._id, message.editedBy._id));
Expand Down
14 changes: 8 additions & 6 deletions apps/meteor/app/lib/server/functions/updateMessage.ts
@@ -1,4 +1,4 @@
import type { IMessage, IMessageEdited, IUser } from '@rocket.chat/core-typings';
import type { IEditedMessage, IMessage, IUser } from '@rocket.chat/core-typings';
import { Meteor } from 'meteor/meteor';

import { Messages, Rooms } from '../../../models/server';
Expand Down Expand Up @@ -35,11 +35,13 @@ export const updateMessage = function (message: IMessage, user: IUser, originalM
Messages.cloneAndSaveAsHistoryById(message._id, user);
}

(message as IMessageEdited).editedAt = new Date();
(message as IMessageEdited).editedBy = {
_id: user._id,
username: user.username,
};
Object.assign<IMessage, Omit<IEditedMessage, keyof IMessage>>(message, {
editedAt: new Date(),
editedBy: {
_id: user._id,
username: user.username,
},
});

parseUrlsInMessage(message);

Expand Down
2 changes: 1 addition & 1 deletion apps/meteor/client/components/message/StatusIndicators.tsx
Expand Up @@ -31,7 +31,7 @@ const StatusIndicators = ({ message }: StatusIndicatorsProps): ReactElement => {
{following && <MessageStatusIndicatorItem name='bell' title={t('Following')} />}

{message.sentByEmail && <MessageStatusIndicatorItem name='mail' title={t('Message_sent_by_email')} />}
{isEditedMessage(message) && (
{isEditedMessage(message) && message.editedBy !== null && message.editedAt && (
<MessageStatusIndicatorItem
name='edit'
color={message.u._id !== message.editedBy._id ? 'danger' : undefined}
Expand Down
16 changes: 3 additions & 13 deletions packages/core-typings/src/IMessage/IMessage.ts
Expand Up @@ -208,13 +208,12 @@ export type MessageSystem = {
};

export interface IEditedMessage extends IMessage {
editedAt: Date;
editedBy: Pick<IUser, '_id' | 'username'>;
editedAt: Date | null;
editedBy: Pick<IUser, '_id' | 'username'> | null;
}

export const isEditedMessage = (message: IMessage): message is IEditedMessage => 'editedAt' in message && 'editedBy' in message;
export const isDeletedMessage = (message: IMessage): message is IEditedMessage =>
'editedAt' in message && 'editedBy' in message && message.t === 'rm';
export const isDeletedMessage = (message: IMessage): message is IEditedMessage => isEditedMessage(message) && message.t === 'rm';
export const isMessageFromMatrixFederation = (message: IMessage): boolean =>
'federation' in message && Boolean(message.federation?.eventId);

Expand Down Expand Up @@ -316,15 +315,6 @@ export const isMessageDiscussion = (message: IMessage): message is IMessageDiscu
return 'drid' in message;
};

export type IMessageEdited = IMessage & {
editedAt: Date;
editedBy: Pick<IUser, '_id' | 'username'>;
};

export const isMessageEdited = (message: IMessage): message is IMessageEdited => {
return 'editedAt' in message && 'editedBy' in message;
};

export type IMessageInbox = IMessage & {
// email inbox fields
email?: {
Expand Down