diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 3809090bbd..b92d51d8ed 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -82,6 +82,7 @@ import SpaceRoomView from "./SpaceRoomView"; import { IOpts } from "../../createRoom"; import { replaceableComponent } from "../../utils/replaceableComponent"; import UIStore from "../../stores/UIStore"; +import EditorStateTransfer from "../../utils/EditorStateTransfer"; const DEBUG = false; let debuglog = function(msg: string) {}; @@ -192,6 +193,7 @@ export interface IState { // whether or not a spaces context switch brought us here, // if it did we don't want the room to be marked as read as soon as it is loaded. wasContextSwitch?: boolean; + editState?: EditorStateTransfer; } @replaceableComponent("structures.RoomView") @@ -815,6 +817,32 @@ export default class RoomView extends React.Component { case 'focus_search': this.onSearchClick(); break; + + case "edit_event": { + const editState = payload.event ? new EditorStateTransfer(payload.event) : null; + this.setState({ editState }, () => { + if (payload.event) { + this.messagePanel?.scrollToEventIfNeeded(payload.event.getId()); + } + }); + break; + } + + case Action.ComposerInsert: { + // re-dispatch to the correct composer + if (this.state.editState) { + dis.dispatch({ + ...payload, + action: "edit_composer_insert", + }); + } else { + dis.dispatch({ + ...payload, + action: "send_composer_insert", + }); + } + break; + } } }; @@ -2025,7 +2053,6 @@ export default class RoomView extends React.Component { manageReadReceipts={!this.state.isPeeking} sendReadReceiptOnLoad={!this.state.wasContextSwitch} manageReadMarkers={!this.state.isPeeking} - manageComposerDispatches={true} hidden={hideMessagePanel} highlightedEventId={highlightedEventId} eventId={this.state.initialEventId} diff --git a/src/components/structures/TimelinePanel.js b/src/components/structures/TimelinePanel.js index a1e8fa7ded..61b7fc0555 100644 --- a/src/components/structures/TimelinePanel.js +++ b/src/components/structures/TimelinePanel.js @@ -447,38 +447,6 @@ class TimelinePanel extends React.Component { this.forceUpdate(); break; - case "edit_event": { - if (this.props.manageComposerDispatches) { - const editState = payload.event ? new EditorStateTransfer(payload.event) : null; - this.setState({editState}, () => { - if (payload.event && this._messagePanel.current) { - this._messagePanel.current.scrollToEventIfNeeded( - payload.event.getId(), - ); - } - }); - } - break; - } - - case Action.ComposerInsert: { - if (this.props.manageComposerDispatches) { - // re-dispatch to the correct composer - if (this.state.editState) { - dis.dispatch({ - ...payload, - action: "edit_composer_insert", - }); - } else { - dis.dispatch({ - ...payload, - action: "send_composer_insert", - }); - } - } - break; - } - case "scroll_to_bottom": this.jumpToLiveTimeline(); break; @@ -872,6 +840,12 @@ class TimelinePanel extends React.Component { } }; + scrollToEventIfNeeded = (eventId) => { + if (this._messagePanel.current) { + this._messagePanel.current.scrollToEventIfNeeded(eventId); + } + } + /* scroll to show the read-up-to marker. We put it 1/3 of the way down * the container. */ @@ -1479,7 +1453,7 @@ class TimelinePanel extends React.Component { tileShape={this.props.tileShape} resizeNotifier={this.props.resizeNotifier} getRelationsForEvent={this.getRelationsForEvent} - editState={this.state.editState} + editState={this.props.editState} showReactions={this.props.showReactions} layout={this.props.layout} enableFlair={SettingsStore.getValue(UIFeature.Flair)}