Page MenuHomePhorge

D229.1761624557.diff
No OneTemporary

Size
8 KB
Referenced Files
None
Subscribers
None

D229.1761624557.diff

diff --git a/src/contents/ui/CreateRoomPage.qml b/src/contents/ui/CreateRoomPage.qml
--- a/src/contents/ui/CreateRoomPage.qml
+++ b/src/contents/ui/CreateRoomPage.qml
@@ -11,6 +11,7 @@
import org.kde.kirigami 2.13 as Kirigami
import '.' as Kazv
+import './matrix-helpers.js' as Helpers
import moe.kazv.mxc.kazv 0.0 as MK
@@ -140,6 +141,7 @@
Layout.fillWidth: true
}
Button {
+ id: addInviteUserButton
objectName: 'addInviteUserButton'
text: l10n.get('create-room-page-action-add-invite')
Layout.fillWidth: true
@@ -180,6 +182,9 @@
onResolved: {
if (success) {
+ if (typeDirect.checked && createRoomPage.inviteUserIds.length === 1) {
+ matrixSdk.addDirectRoom(createRoomPage.inviteUserIds[0], data.roomId);
+ }
showPassiveNotification(l10n.get('create-room-page-success-prompt'));
pageStack.removePage(createRoomPage);
} else {
@@ -187,4 +192,10 @@
}
}
}
+
+ function presetPage(userId) {
+ typeDirect.checked = true;
+ newInviteUserId.text = userId;
+ addInviteUserButton.click();
+ }
}
diff --git a/src/contents/ui/JoinRoomPage.qml b/src/contents/ui/JoinRoomPage.qml
--- a/src/contents/ui/JoinRoomPage.qml
+++ b/src/contents/ui/JoinRoomPage.qml
@@ -72,4 +72,9 @@
{
joinRoomHandler.call();
}
+
+ function presetPage(roomIdOrAlias, routingServers) {
+ idOrAlias.text = roomIdOrAlias;
+ servers.text = routingServers.join('\n');
+ }
}
diff --git a/src/contents/ui/RoomPage.qml b/src/contents/ui/RoomPage.qml
--- a/src/contents/ui/RoomPage.qml
+++ b/src/contents/ui/RoomPage.qml
@@ -265,4 +265,8 @@
onViewEventHistoryRequested: (eventId) => {
eventHistoryPopupComp.createObject(applicationWindow().overlay, { eventId }).open();
}
+
+ function goToEvent(eventId) {
+ roomTimelineView.goToEvent(eventId);
+ }
}
diff --git a/src/contents/ui/event-types/TextTemplate.qml b/src/contents/ui/event-types/TextTemplate.qml
--- a/src/contents/ui/event-types/TextTemplate.qml
+++ b/src/contents/ui/event-types/TextTemplate.qml
@@ -109,7 +109,52 @@
}
}
+ // https://github.com/matrix-org/matrix-spec-proposals/blob/main/proposals/2312-matrix-uri.md#operations-on-matrix-uris
function openLink(link) {
- Qt.openUrlExternally(link);
+ const matrixLink = MK.KazvUtil.matrixLink(link);
+ if (!matrixLink.isValid) {
+ Qt.openUrlExternally(link);
+ return;
+ }
+ const action = matrixLink.action;
+ const servers = matrixLink.routingServers;
+ const joinRoom = (roomId, servers) => {
+ pushJoinRoomPage();
+ pageStack.currentItem.presetPage(roomId, servers);
+ };
+ if (matrixLink.isUser) {
+ const userId = matrixLink.identifiers[0];
+ if (action === 'chat') {
+ // If the room with the user already exists, switch to the room.
+ // Otherwise try to create the room.
+ const directRoomIds = matrixSdk.directRoomIds(userId);
+ if (directRoomIds.length !== 0) {
+ switchToRoomRequested(directRoomIds[0]);
+ } else {
+ pushCreateRoomPage();
+ pageStack.currentItem.presetPage(userId);
+ }
+ } else {
+ mentionUserRequested(sender.userId);
+ }
+ } else if (matrixLink.isEvent) {
+ const roomId = matrixLink.identifiers[0];
+ const eventId = matrixLink.identifiers[1];
+ if (sdkVars.roomList.exist(roomId)) {
+ switchToRoomRequested(roomId);
+ pageStack.currentItem.goToEvent(eventId);
+ } else {
+ joinRoom(roomId, servers);
+ }
+ } else if (matrixLink.isRoom) {
+ const roomId = matrixLink.identifiers[0];
+ // If user has joined the room, open it.
+ // Otherwise try to join it.
+ if (sdkVars.roomList.exist(roomId)) {
+ switchToRoomRequested(roomId);
+ } else {
+ joinRoom(roomId, servers);
+ }
+ }
}
}
diff --git a/src/kazv-util.hpp b/src/kazv-util.hpp
--- a/src/kazv-util.hpp
+++ b/src/kazv-util.hpp
@@ -7,6 +7,8 @@
#pragma once
#include <kazv-defs.hpp>
+#include "matrix-link.hpp"
+
#include <QObject>
#include <QString>
#include <QQmlEngine>
@@ -30,6 +32,7 @@
/// @return The user id for a given matrix link, or the empty string
/// if @c url is not a matrix link pointing to a user
QString matrixLinkUserId(const QString &url) const;
+ MatrixLink *matrixLink(const QString &url) const;
private:
int m_kfQtMajorVersion;
diff --git a/src/kazv-util.cpp b/src/kazv-util.cpp
--- a/src/kazv-util.cpp
+++ b/src/kazv-util.cpp
@@ -37,3 +37,8 @@
}
return QStringLiteral("");
}
+
+MatrixLink *KazvUtil::matrixLink(const QString &url) const
+{
+ return new MatrixLink(QUrl(url));
+}
diff --git a/src/matrix-link.hpp b/src/matrix-link.hpp
--- a/src/matrix-link.hpp
+++ b/src/matrix-link.hpp
@@ -17,14 +17,16 @@
/**
* A link that represents a Matrix object.
*/
-class MatrixLink
+class MatrixLink : public QObject
{
- Q_GADGET
+ Q_OBJECT
+ Q_PROPERTY(bool isValid READ isValid CONSTANT)
Q_PROPERTY(bool isUser READ isUser CONSTANT)
Q_PROPERTY(bool isRoom READ isRoom CONSTANT)
Q_PROPERTY(bool isEvent READ isEvent CONSTANT)
Q_PROPERTY(QStringList identifiers READ identifiers CONSTANT)
Q_PROPERTY(QStringList routingServers READ routingServers CONSTANT)
+ Q_PROPERTY(QString action READ action CONSTANT)
public:
enum Type {
diff --git a/src/matrix-room-list.hpp b/src/matrix-room-list.hpp
--- a/src/matrix-room-list.hpp
+++ b/src/matrix-room-list.hpp
@@ -45,4 +45,5 @@
Q_INVOKABLE MatrixRoom *at(int index) const;
Q_INVOKABLE QString roomIdAt(int index) const;
Q_INVOKABLE MatrixRoom *room(QString roomId) const;
+ Q_INVOKABLE bool exist(QString roomId) const;
};
diff --git a/src/matrix-room-list.cpp b/src/matrix-room-list.cpp
--- a/src/matrix-room-list.cpp
+++ b/src/matrix-room-list.cpp
@@ -192,3 +192,8 @@
userGivenNicknameMapFor(m_client)
);
}
+
+bool MatrixRoomList::exist(QString roomId) const
+{
+ return roomIds().contains(roomId);
+}
diff --git a/src/matrix-sdk.hpp b/src/matrix-sdk.hpp
--- a/src/matrix-sdk.hpp
+++ b/src/matrix-sdk.hpp
@@ -11,10 +11,12 @@
#include <QQmlEngine>
#include <QString>
+#include <string>
#include <memory>
#include <filesystem>
#include <lager/extra/qt.hpp>
+#include <immer/map.hpp>
#include <sdk-model.hpp>
#include <random-generator.hpp>
@@ -99,6 +101,9 @@
LAGER_QT_READER(QString, deviceId);
LAGER_QT_READER(immer::array<std::string>, specVersions); // The versions of the Matrix Spec supported by the server.
+ using immerStrMap = immer::map<std::string, std::string>;
+ LAGER_QT_READER(immerStrMap, directRoomMap);
+
Q_INVOKABLE MatrixRoomList *roomList() const;
Q_INVOKABLE QString mxcUriToHttp(QString mxcUri) const;
@@ -113,6 +118,8 @@
// Return true if the spec version of server in the range [minVer, maxVer]
Q_INVOKABLE bool checkSpecVersionRange(QString minVer, QString maxVer) const;
+ Q_INVOKABLE QStringList directRoomIds(QString userId) const;
+
Kazv::RandomInterface &randomGenerator() const;
private:
@@ -300,6 +307,8 @@
*/
MatrixPromise *getSpecVersions();
+ MatrixPromise *addDirectRoom(const QString &userId, const QString &roomId);
+
private:
MatrixPromise *sendAccountDataImpl(Kazv::Event event);
diff --git a/src/matrix-sdk.cpp b/src/matrix-sdk.cpp
--- a/src/matrix-sdk.cpp
+++ b/src/matrix-sdk.cpp
@@ -306,6 +306,7 @@
LAGER_QT(token) = m_d->clientOnSecondaryRoot.token().xform(strToQt); Q_EMIT tokenChanged(token());
LAGER_QT(deviceId) = m_d->clientOnSecondaryRoot.deviceId().xform(strToQt); Q_EMIT deviceIdChanged(deviceId());
LAGER_QT(specVersions) = m_d->clientOnSecondaryRoot.supportVersions(); Q_EMIT specVersionsChanged(specVersions());
+ LAGER_QT(directRoomMap) = m_d->clientOnSecondaryRoot.directRoomMap(); Q_EMIT directRoomMapChanged(directRoomMap());
m_d->watchable.afterAll(
[this](KazvEvent e) {
@@ -459,6 +460,17 @@
}) != specVersions().end();
}
+QStringList MatrixSdk::directRoomIds(QString userId) const
+{
+ auto roomIds = QStringList{};
+ for (auto i : directRoomMap()) {
+ if (i.second == userId) {
+ roomIds.push_back(QString::fromStdString(i.first));
+ }
+ }
+ return roomIds;
+}
+
std::string MatrixSdk::validateHomeserverUrl(const QString &url)
{
if (url.isEmpty()) {
@@ -887,6 +899,11 @@
return new MatrixPromise(m_d->clientOnSecondaryRoot.getVersions(LAGER_QT(serverUrl).get().toStdString()));
}
+MatrixPromise *MatrixSdk::addDirectRoom(const QString &userId, const QString &roomId)
+{
+ return new MatrixPromise(m_d->clientOnSecondaryRoot.addDirectRoom(userId.toStdString(), roomId.toStdString()));
+}
+
void MatrixSdk::setUserDataDir(const std::string &userDataDir)
{
m_d->userDataDir = userDataDir;

File Metadata

Mime Type
text/plain
Expires
Mon, Oct 27, 9:09 PM (19 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
566485
Default Alt Text
D229.1761624557.diff (8 KB)

Event Timeline