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

[FIX] Unintended "Reply on thread" button showing on thread's first message #27716

Merged
merged 11 commits into from Jan 25, 2023
8 changes: 1 addition & 7 deletions apps/meteor/app/ui-utils/client/lib/MessageAction.ts
Expand Up @@ -172,14 +172,8 @@ export const MessageAction = new (class {
): Promise<MessageActionConfigList> {
const allButtons = group ? this.getButtonsByGroup(group) : MessageAction._getButtons();

const buttons = await this.getButtonsByCondition({ ...props, context }, this.getButtonsByContext(context, allButtons));

// Checks if the message is on thread context, so the "Reply in thread" button
// won't be rendered
const filteredButtons = context === 'threads' ? buttons.filter((button) => button.label !== 'Reply_in_thread') : buttons;

if (props.message) {
return this.getButtonsByCondition({ ...props, context }, this.getButtonsByContext(context, filteredButtons));
return this.getButtonsByCondition({ ...props, context }, this.getButtonsByContext(context, allButtons));
}
return allButtons;
}
Expand Down
4 changes: 2 additions & 2 deletions apps/meteor/client/components/message/ToolboxHolder.tsx
@@ -1,4 +1,4 @@
import type { IMessage } from '@rocket.chat/core-typings';
import type { IThreadMessage, IThreadMainMessage } from '@rocket.chat/core-typings';
import { MessageToolboxWrapper } from '@rocket.chat/fuselage';
import type { ReactElement } from 'react';
import React, { memo, useRef } from 'react';
Expand All @@ -7,7 +7,7 @@ import { useIsVisible } from '../../views/room/hooks/useIsVisible';
import Toolbox from './toolbox/Toolbox';

type ToolboxHolderProps = {
message: IMessage;
message: IThreadMessage | IThreadMainMessage;
hugocostadev marked this conversation as resolved.
Show resolved Hide resolved
};

export const ToolboxHolder = (props: ToolboxHolderProps): ReactElement => {
Expand Down
23 changes: 18 additions & 5 deletions apps/meteor/client/components/message/toolbox/Toolbox.tsx
@@ -1,4 +1,5 @@
import type { IMessage, IUser, IRoom } from '@rocket.chat/core-typings';
import type { IUser, IRoom } from '@rocket.chat/core-typings';
import type { IThreadMessage, IThreadMainMessage } from '@rocket.chat/core-typings';
import { isThreadMessage, isRoomFederated } from '@rocket.chat/core-typings';
import { MessageToolbox, MessageToolboxItem } from '@rocket.chat/fuselage';
import { useUser, useUserSubscription, useSettings, useTranslation } from '@rocket.chat/ui-contexts';
Expand All @@ -14,21 +15,25 @@ import { useRoom } from '../../../views/room/contexts/RoomContext';
import { useToolboxContext } from '../../../views/room/contexts/ToolboxContext';
import MessageActionMenu from './MessageActionMenu';

const getMessageContext = (message: IMessage, room: IRoom): MessageActionContext => {
const isThreadFirstMessage = (message: IThreadMessage | IThreadMainMessage): boolean => {
return message.renderedOnThread;
};
hugocostadev marked this conversation as resolved.
Show resolved Hide resolved

const getMessageContext = (message: IThreadMessage | IThreadMainMessage, room: IRoom): MessageActionContext => {
hugocostadev marked this conversation as resolved.
Show resolved Hide resolved
if (message.t === 'videoconf') {
return 'videoconf';
}
if (isRoomFederated(room)) {
return 'federated';
}
if (isThreadMessage(message) || message.renderedOnThread) {
if (isThreadMessage(message) || isThreadFirstMessage(message)) {
return 'threads';
}
return 'message';
};

type ToolboxProps = {
message: IMessage;
message: IThreadMessage | IThreadMainMessage;
hugocostadev marked this conversation as resolved.
Show resolved Hide resolved
};

const Toolbox = ({ message }: ToolboxProps): ReactElement | null => {
Expand All @@ -54,7 +59,15 @@ const Toolbox = ({ message }: ToolboxProps): ReactElement | null => {
);
const menuActions = await MessageAction.getButtons({ message, room, user, subscription, settings: mapSettings, chat }, context, 'menu');

return { message: messageActions, menu: menuActions };
const filteredActions =
hugocostadev marked this conversation as resolved.
Show resolved Hide resolved
context === 'threads'
? {
message: messageActions.filter((button) => button.label !== 'Reply_in_thread'),
menu: menuActions.filter((button) => button.label !== 'Reply_in_thread'),
}
: { message: messageActions, menu: menuActions };

return filteredActions;
});

const toolbox = useToolboxContext();
Expand Down
Expand Up @@ -41,8 +41,6 @@ const RoomMessage = ({ message, sequential, all, mention, unread }: RoomMessageP
const selected = useIsSelectedMessage(message._id);
useCountSelected();

message.renderedOnThread = false;

return (
<Message
id={message._id}
Expand Down
2 changes: 1 addition & 1 deletion packages/core-typings/src/IMessage/IMessage.ts
Expand Up @@ -134,7 +134,6 @@ export interface IMessage extends IRocketChatRecord {
coordinates: [number, number];
};
starred?: { _id: IUser['_id'] }[];
renderedOnThread?: boolean | undefined;
pinned?: boolean;
unread?: boolean;
temp?: boolean;
Expand Down Expand Up @@ -218,6 +217,7 @@ export interface IThreadMainMessage extends IMessage {
}
export interface IThreadMessage extends IMessage {
tmid: string;
renderedOnThread?: boolean;
}

export const isThreadMainMessage = (message: IMessage): message is IThreadMainMessage => 'tcount' in message && 'tlm' in message;
Expand Down