From 0dbb56ba1e44f4c1d5b58a25b2021c25a72274a3 Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Sun, 23 May 2021 21:43:14 +0200 Subject: [PATCH] Fix creating broken direct chat for user with a direct chat already open Just enter the existing room instead of trying to create a new one but broken. Fix !237 --- imports/NeoChat/Dialog/UserDetailDialog.qml | 2 +- src/controller.cpp | 12 ++++++++++++ src/controller.h | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) 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;