From 76aeb783b60e86cc888c8f2db5d522a5eb1f40cf Mon Sep 17 00:00:00 2001 From: hayyaksi <193020925+hayaksi1@users.noreply.github.com> Date: Tue, 11 Aug 2026 18:31:35 +0300 Subject: [PATCH] Open linkified room aliases and permalinks in the app rather than the browser (#34507) --- .../event-tile/body/TextualBodyViewModel.tsx | 5 ---- .../message-body/TextualBodyViewModel-test.ts | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/web/src/viewmodels/room/timeline/event-tile/body/TextualBodyViewModel.tsx b/apps/web/src/viewmodels/room/timeline/event-tile/body/TextualBodyViewModel.tsx index b0d5b9baa5..1fca14c81f 100644 --- a/apps/web/src/viewmodels/room/timeline/event-tile/body/TextualBodyViewModel.tsx +++ b/apps/web/src/viewmodels/room/timeline/event-tile/body/TextualBodyViewModel.tsx @@ -9,7 +9,6 @@ import React, { type MouseEvent } from "react"; import { MatrixEventEvent, MsgType, type MatrixEvent } from "matrix-js-sdk/src/matrix"; import { BaseViewModel, - LINKIFIED_DATA_ATTRIBUTE, TextualBodyViewBodyWrapperKind, TextualBodyViewKind, type TextualBodyViewModel as TextualBodyViewModelInterface, @@ -278,10 +277,6 @@ export class TextualBodyViewModel public onRootClick = (event: MouseEvent): void => { let target: HTMLLinkElement | null = event.target as HTMLLinkElement; - if (target.dataset?.[LINKIFIED_DATA_ATTRIBUTE]) { - return; - } - if (target.nodeName !== "A") { target = target.closest("a"); } diff --git a/apps/web/test/viewmodels/message-body/TextualBodyViewModel-test.ts b/apps/web/test/viewmodels/message-body/TextualBodyViewModel-test.ts index e11534fb9c..7de8d414bd 100644 --- a/apps/web/test/viewmodels/message-body/TextualBodyViewModel-test.ts +++ b/apps/web/test/viewmodels/message-body/TextualBodyViewModel-test.ts @@ -213,10 +213,29 @@ describe("TextualBodyViewModel", () => { ).toThrow("TextualBodyViewModel should only render pending moderation for hidden messages"); }); - it("ignores linkified root clicks", () => { + it("rewrites linkified permalink clicks to local hashes", () => { + const vm = createVm(); + const preventDefault = jest.fn(); + jest.spyOn(permalinkUtils, "tryTransformPermalinkToLocalHref").mockReturnValue("#/room/#room:example.org"); + + vm.onRootClick({ + preventDefault, + target: { + dataset: { + [LINKIFIED_DATA_ATTRIBUTE]: "true", + }, + href: "https://matrix.to/#/#room:example.org", + nodeName: "A", + }, + } as any); + + expect(preventDefault).toHaveBeenCalled(); + expect(window.location.hash).toBe("#/room/#room:example.org"); + }); + + it("leaves linkified ordinary links alone", () => { const vm = createVm(); const preventDefault = jest.fn(); - const transformSpy = jest.spyOn(permalinkUtils, "tryTransformPermalinkToLocalHref"); vm.onRootClick({ preventDefault, @@ -229,8 +248,8 @@ describe("TextualBodyViewModel", () => { }, } as any); - expect(transformSpy).not.toHaveBeenCalled(); expect(preventDefault).not.toHaveBeenCalled(); + expect(window.location.hash).toBe(""); }); it("rewrites permalink clicks to local hashes", () => {