Fix reply action in message context menu notif & file panels (#9895)

pull/28788/head^2
Michael Telatynski 2023-01-12 14:52:52 +00:00 committed by GitHub
parent 098ba1465a
commit 0c30b577e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 4 deletions

View File

@ -335,10 +335,11 @@ export class RoomViewStore extends EventEmitter {
this.reset(); this.reset();
break; break;
case "reply_to_event": case "reply_to_event":
// If currently viewed room does not match the room in which we wish to reply then change rooms // Thread timeline view handles its own reply-to-state
// this can happen when performing a search across all rooms. Persist the data from this event for if (TimelineRenderingType.Thread !== payload.context) {
// both room and search timeline rendering types, search will get auto-closed by RoomView at this time. // If currently viewed room does not match the room in which we wish to reply then change rooms this
if ([TimelineRenderingType.Room, TimelineRenderingType.Search].includes(payload.context)) { // can happen when performing a search across all rooms. Persist the data from this event for both
// room and search timeline rendering types, search will get auto-closed by RoomView at this time.
if (payload.event && payload.event.getRoomId() !== this.state.roomId) { if (payload.event && payload.event.getRoomId() !== this.state.roomId) {
this.dis.dispatch<ViewRoomPayload>({ this.dis.dispatch<ViewRoomPayload>({
action: Action.ViewRoom, action: Action.ViewRoom,

View File

@ -15,6 +15,7 @@ limitations under the License.
*/ */
import { Room } from "matrix-js-sdk/src/matrix"; import { Room } from "matrix-js-sdk/src/matrix";
import { sleep } from "matrix-js-sdk/src/utils";
import { RoomViewStore } from "../../src/stores/RoomViewStore"; import { RoomViewStore } from "../../src/stores/RoomViewStore";
import { Action } from "../../src/dispatcher/actions"; import { Action } from "../../src/dispatcher/actions";
@ -245,6 +246,28 @@ describe("RoomViewStore", function () {
expect(roomViewStore.getRoomId()).toEqual(roomId2); expect(roomViewStore.getRoomId()).toEqual(roomId2);
}); });
it("should ignore reply_to_event for Thread panels", async () => {
expect(roomViewStore.getQuotingEvent()).toBeFalsy();
const replyToEvent = {
getRoomId: () => roomId2,
};
dis.dispatch({ action: "reply_to_event", event: replyToEvent, context: TimelineRenderingType.Thread });
await sleep(100);
expect(roomViewStore.getQuotingEvent()).toBeFalsy();
});
it.each([TimelineRenderingType.Room, TimelineRenderingType.File, TimelineRenderingType.Notification])(
"Should respect reply_to_event for %s rendering context",
async (context) => {
const replyToEvent = {
getRoomId: () => roomId,
};
dis.dispatch({ action: "reply_to_event", event: replyToEvent, context });
await untilDispatch(Action.ViewRoom, dis);
expect(roomViewStore.getQuotingEvent()).toEqual(replyToEvent);
},
);
it("removes the roomId on ViewHomePage", async () => { it("removes the roomId on ViewHomePage", async () => {
dis.dispatch({ action: Action.ViewRoom, room_id: roomId }); dis.dispatch({ action: Action.ViewRoom, room_id: roomId });
await untilDispatch(Action.ActiveRoomChanged, dis); await untilDispatch(Action.ActiveRoomChanged, dis);