diff --git a/imports/NeoChat/Component/Timeline/TextDelegate.qml b/imports/NeoChat/Component/Timeline/TextDelegate.qml index 8bf1cec44..9010fdb60 100644 --- a/imports/NeoChat/Component/Timeline/TextDelegate.qml +++ b/imports/NeoChat/Component/Timeline/TextDelegate.qml @@ -45,15 +45,7 @@ a{ textFormat: Text.RichText onLinkActivated: { - if (link.startsWith("https://matrix.to/")) { - var result = link.replace(/\?.*/, "").match("https://matrix.to/#/(!.*:.*)/(\\$.*:.*)") - if (!result || result.length < 3) return - if (result[1] != currentRoom.id) return - if (!result[2]) return - goToEvent(result[2]) - } else { - Qt.openUrlExternally(link) - } + applicationWindow().handleLink(link, currentRoom) } MouseArea { diff --git a/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml b/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml index 179056e19..bdfc328d7 100644 --- a/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml +++ b/imports/NeoChat/Menu/Timeline/MessageDelegateContextMenu.qml @@ -57,15 +57,7 @@ Kirigami.OverlaySheet { wrapMode: Text.WordWrap onLinkActivated: { - if (link.startsWith("https://matrix.to/")) { - var result = link.replace(/\?.*/, "").match("https://matrix.to/#/(!.*:.*)/(\\$.*:.*)") - if (!result || result.length < 3) return - if (result[1] != currentRoom.id) return - if (!result[2]) return - goToEvent(result[2]) - } else { - Qt.openUrlExternally(link) - } + applicationWindow().handleLink(link, currentRoom) } } } diff --git a/qml/main.qml b/qml/main.qml index c55dbe1ba..370a04a81 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -77,6 +77,15 @@ Kirigami.ApplicationWindow { signal leaveRoom(string room); signal openRoom(string room); + function roomByAliasOrId(aliasOrId) { + return spectralRoomListModel.roomByAliasOrId(aliasOrId) + } + + function openRoomAndEvent(room, event) { + enterRoom(room) + roomItem.goToEvent(event) + } + function loadInitialRoom() { if (Config.openRoom) { const room = Controller.activeConnection.room(Config.openRoom); @@ -347,4 +356,37 @@ Kirigami.ApplicationWindow { id: roomWindow RoomWindow {} } + + function handleLink(link, currentRoom) { + if (link.startsWith("https://matrix.to/")) { + var content = link.replace("https://matrix.to/#/", "").replace(/\?.*/, "") + if(content.match("^[#!]")) { + if(content.includes("/")) { + var result = content.match("([!#].*:.*)/(\\$.*)") + if(!result) { + return + } + if(result[1] == currentRoom.id) { + roomManager.roomItem.goToEvent(result[2]) + } else { + roomManager.openRoomAndEvent(roomManager.roomByAliasOrId(result[1]), result[2]) + } + } else { + roomManager.enterRoom(roomManager.roomByAliasOrId(content)) + } + } else if(content.match("^@")) { + let dialog = userDialog.createObject(root.overlay, {room: currentRoom, user: currentRoom.user(content)}) + dialog.open() + console.log(dialog.user) + } + } else { + Qt.openUrlExternally(link) + } + } + + Component { + id: userDialog + UserDetailDialog { + } + } } diff --git a/src/roomlistmodel.cpp b/src/roomlistmodel.cpp index a29ad5f53..51825a7ec 100644 --- a/src/roomlistmodel.cpp +++ b/src/roomlistmodel.cpp @@ -429,3 +429,13 @@ bool RoomListModel::categoryVisible(int category) const { return m_categoryVisibility.value(category, true); } + +NeoChatRoom *RoomListModel::roomByAliasOrId(const QString &aliasOrId) +{ + for(const auto &room : m_rooms) { + if(room->aliases().contains(aliasOrId) || room->id() == aliasOrId) { + return room; + } + } + return nullptr; +} diff --git a/src/roomlistmodel.h b/src/roomlistmodel.h index 43969860f..2d0525436 100644 --- a/src/roomlistmodel.h +++ b/src/roomlistmodel.h @@ -80,6 +80,8 @@ public: return m_notificationCount; } + Q_INVOKABLE NeoChatRoom *roomByAliasOrId(const QString &aliasOrId); + private Q_SLOTS: void doAddRoom(Quotient::Room *room); void updateRoom(Quotient::Room *room, Quotient::Room *prev);