Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 18144ca

Browse files
committed
Add Reply in thread button
Signed-off-by: Šimon Brandner <[email protected]>
1 parent 58b81f6 commit 18144ca

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

res/css/views/context_menus/_MessageContextMenu.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ limitations under the License.
107107
mask-image: url('$(res)/img/element-icons/room/message-bar/reply.svg');
108108
}
109109

110+
.mx_MessageContextMenu_iconReplyInThread::before {
111+
mask-image: url('$(res)/img/element-icons/message/thread.svg');
112+
}
113+
110114
.mx_MessageContextMenu_iconReact::before {
111115
mask-image: url('$(res)/img/element-icons/room/message-bar/emoji.svg');
112116
}

src/components/views/context_menus/MessageContextMenu.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { EventType, RelationType } from "matrix-js-sdk/src/@types/event";
2222
import { Relations } from 'matrix-js-sdk/src/models/relations';
2323
import { RoomMemberEvent } from "matrix-js-sdk/src/models/room-member";
2424
import { M_POLL_START } from "matrix-events-sdk";
25+
import { Thread } from "matrix-js-sdk/src/models/thread";
2526

2627
import { MatrixClientPeg } from '../../../MatrixClientPeg';
2728
import dis from '../../../dispatcher/dispatcher';
@@ -58,6 +59,8 @@ import { OpenReportEventDialogPayload } from "../../../dispatcher/payloads/OpenR
5859
import { createMapSiteLinkFromEvent } from '../../../utils/location';
5960
import { getForwardableEvent } from '../../../events/forward/getForwardableEvent';
6061
import { getShareableLocationEvent } from '../../../events/location/getShareableLocationEvent';
62+
import { showThread } from "../../../dispatcher/dispatch-actions/threads";
63+
import RightPanelStore from "../../../stores/right-panel/RightPanelStore";
6164

6265
interface IProps extends IPosition {
6366
chevronFace: ChevronFace;
@@ -281,6 +284,30 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
281284
this.closeMenu();
282285
};
283286

287+
private onReplyInThreadClick = (): void => {
288+
const { mxEvent } = this.props;
289+
290+
if (!localStorage.getItem("mx_seen_feature_thread")) {
291+
localStorage.setItem("mx_seen_feature_thread", "true");
292+
}
293+
294+
if (mxEvent.getThread() && !mxEvent.isThreadRoot) {
295+
showThread({
296+
rootEvent: mxEvent.getThread().rootEvent,
297+
initialEvent: mxEvent,
298+
scroll_into_view: true,
299+
highlighted: true,
300+
push: RightPanelStore.instance.isOpen,
301+
});
302+
} else {
303+
showThread({
304+
rootEvent: mxEvent,
305+
push: RightPanelStore.instance.isOpen,
306+
});
307+
}
308+
this.closeMenu();
309+
};
310+
284311
private onReactClick = (): void => {
285312
this.setState({ reactionPickerDisplayed: true });
286313
};
@@ -582,6 +609,22 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
582609
);
583610
}
584611

612+
let replyInThreadButton: JSX.Element;
613+
if (
614+
rightClick &&
615+
contentActionable &&
616+
canSendMessages && SettingsStore.getValue("feature_thread") &&
617+
Thread.hasServerSideSupport
618+
) {
619+
replyInThreadButton = (
620+
<IconizedContextMenuOption
621+
iconClassName="mx_MessageContextMenu_iconReplyInThread"
622+
label={_t("Reply in thread")}
623+
onClick={this.onReplyInThreadClick}
624+
/>
625+
);
626+
}
627+
585628
let reactButton;
586629
if (rightClick && contentActionable && canReact) {
587630
reactButton = (
@@ -621,6 +664,7 @@ export default class MessageContextMenu extends React.Component<IProps, IState>
621664
<IconizedContextMenuOptionList>
622665
{ reactButton }
623666
{ replyButton }
667+
{ replyInThreadButton }
624668
{ editButton }
625669
</IconizedContextMenuOptionList>
626670
);

0 commit comments

Comments
 (0)