diff --git a/imports/NeoChat/Dialog/UserDetailDialog.qml b/imports/NeoChat/Dialog/UserDetailDialog.qml index a82ca490d..ef86045c8 100644 --- a/imports/NeoChat/Dialog/UserDetailDialog.qml +++ b/imports/NeoChat/Dialog/UserDetailDialog.qml @@ -146,7 +146,7 @@ Kirigami.OverlaySheet { text: i18n("Open a private chat") icon.name: "document-send" onTriggered: { - Controller.activeConnection.requestDirectChat(user) + Controller.openOrCreateDirectChat(user); root.close() } } diff --git a/src/controller.cpp b/src/controller.cpp index 51717d04d..6ea2760a6 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -47,6 +47,7 @@ #include "neochatuser.h" #include "settings.h" #include "utils.h" +#include "roommanager.h" #include #ifndef Q_OS_ANDROID @@ -592,6 +593,17 @@ void Controller::joinRoom(const QString &alias) }); } +void Controller::openOrCreateDirectChat(NeoChatUser *user) +{ + const auto existing = activeConnection()->directChats(); + + if (existing.contains(user)) { + RoomManager::instance().enterRoom(static_cast(activeConnection()->room(existing.value(user)))); + return; + } + activeConnection()->requestDirectChat(user); +} + QString Controller::formatByteSize(double size, int precision) const { return KFormat().formatByteSize(size, precision); diff --git a/src/controller.h b/src/controller.h index 877f1f1f2..949d3de29 100644 --- a/src/controller.h +++ b/src/controller.h @@ -21,6 +21,7 @@ class QNetworkConfigurationManager; #include "user.h" class NeoChatRoom; +class NeoChatUser; class QQuickWindow; using namespace Quotient; @@ -86,6 +87,8 @@ public: Q_INVOKABLE QString formatDuration(quint64 msecs, KFormat::DurationFormatOptions options = KFormat::DefaultDuration) const; Q_INVOKABLE QString formatByteSize(double size, int precision = 1) const; + + Q_INVOKABLE void openOrCreateDirectChat(NeoChatUser *user); private: explicit Controller(QObject *parent = nullptr); ~Controller() override;