@@ -22,6 +22,7 @@ import { EventType, RelationType } from "matrix-js-sdk/src/@types/event";
2222import { Relations } from 'matrix-js-sdk/src/models/relations' ;
2323import { RoomMemberEvent } from "matrix-js-sdk/src/models/room-member" ;
2424import { M_POLL_START } from "matrix-events-sdk" ;
25+ import { Thread } from "matrix-js-sdk/src/models/thread" ;
2526
2627import { MatrixClientPeg } from '../../../MatrixClientPeg' ;
2728import dis from '../../../dispatcher/dispatcher' ;
@@ -58,6 +59,8 @@ import { OpenReportEventDialogPayload } from "../../../dispatcher/payloads/OpenR
5859import { createMapSiteLinkFromEvent } from '../../../utils/location' ;
5960import { getForwardableEvent } from '../../../events/forward/getForwardableEvent' ;
6061import { getShareableLocationEvent } from '../../../events/location/getShareableLocationEvent' ;
62+ import { showThread } from "../../../dispatcher/dispatch-actions/threads" ;
63+ import RightPanelStore from "../../../stores/right-panel/RightPanelStore" ;
6164
6265interface 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