From f67a181e8393039c22b5f0757b5c46f032137bcb Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Mon, 5 Feb 2024 13:07:01 -0500
Subject: [PATCH] conversationsadapter: clear source models when removing
 account

If we detect that the current account has been deleted, remove the proxy model source models immediately.

Gitlab: #1557
Change-Id: Iaf84198438b54e44d31a46870acdfa9569be6daa
---
 src/app/accountadapter.cpp       | 10 ++++++++++
 src/app/accountadapter.h         | 11 +++--------
 src/app/conversationsadapter.cpp | 16 ++++++++++++++--
 src/app/conversationsadapter.h   |  2 +-
 src/app/lrcinstance.cpp          | 16 +++++++++++++++-
 src/app/lrcinstance.h            |  4 ++++
 6 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/src/app/accountadapter.cpp b/src/app/accountadapter.cpp
index e022e70d3..f70edbc48 100644
--- a/src/app/accountadapter.cpp
+++ b/src/app/accountadapter.cpp
@@ -22,6 +22,8 @@
 
 #include "appsettingsmanager.h"
 #include "qtutils.h"
+#include "systemtray.h"
+#include "lrcinstance.h"
 #include "accountlistmodel.h"
 
 #include <QtConcurrent/QtConcurrent>
@@ -61,6 +63,14 @@ AccountAdapter::getModel()
     return &(lrcInstance_->accountModel());
 }
 
+AccountAdapter*
+AccountAdapter::create(QQmlEngine*, QJSEngine*)
+{
+    return new AccountAdapter(qApp->property("AppSettingsManager").value<AppSettingsManager*>(),
+                              qApp->property("SystemTray").value<SystemTray*>(),
+                              qApp->property("LRCInstance").value<LRCInstance*>());
+}
+
 void
 AccountAdapter::changeAccount(int row)
 {
diff --git a/src/app/accountadapter.h b/src/app/accountadapter.h
index 8ff685db7..8ce2583a3 100644
--- a/src/app/accountadapter.h
+++ b/src/app/accountadapter.h
@@ -20,8 +20,7 @@
 
 #include "qmladapterbase.h"
 
-#include "systemtray.h"
-#include "lrcinstance.h"
+#include "api/accountmodel.h"
 
 #include <QSettings>
 #include <QString>
@@ -29,6 +28,7 @@
 #include <QApplication> // QML registration
 
 class AppSettingsManager;
+class SystemTray;
 
 class AccountAdapter final : public QmlAdapterBase
 {
@@ -44,12 +44,7 @@ Q_SIGNALS:
     void modelChanged();
 
 public:
-    static AccountAdapter* create(QQmlEngine*, QJSEngine*)
-    {
-        return new AccountAdapter(qApp->property("AppSettingsManager").value<AppSettingsManager*>(),
-                                  qApp->property("SystemTray").value<SystemTray*>(),
-                                  qApp->property("LRCInstance").value<LRCInstance*>());
-    }
+    static AccountAdapter* create(QQmlEngine*, QJSEngine*);
 
     explicit AccountAdapter(AppSettingsManager* settingsManager,
                             SystemTray* systemTray,
diff --git a/src/app/conversationsadapter.cpp b/src/app/conversationsadapter.cpp
index 8e9ecaaa0..ea7484b09 100644
--- a/src/app/conversationsadapter.cpp
+++ b/src/app/conversationsadapter.cpp
@@ -21,8 +21,6 @@
 
 #include "qtutils.h"
 #include "systemtray.h"
-#include "qmlregister.h"
-#include "qtutils.h"
 
 #ifdef Q_OS_LINUX
 #include "namedirectory.h"
@@ -139,6 +137,12 @@ ConversationsAdapter::ConversationsAdapter(SystemTray* systemTray,
             this,
             &ConversationsAdapter::onCurrentAccountIdChanged);
 
+    connect(lrcInstance_,
+            &LRCInstance::currentAccountRemoved,
+            this,
+            &ConversationsAdapter::onCurrentAccountRemoved,
+            Qt::DirectConnection);
+
     connectConversationModel();
 }
 
@@ -595,6 +599,14 @@ ConversationsAdapter::openDialogConversationWith(const QString& peerUri)
     lrcInstance_->selectConversation(convInfo.uid);
 }
 
+void
+ConversationsAdapter::onCurrentAccountRemoved()
+{
+    // Unbind proxy model source models.
+    convModel_->bindSourceModel(nullptr);
+    searchModel_->bindSourceModel(nullptr);
+}
+
 void
 ConversationsAdapter::connectConversationModel()
 {
diff --git a/src/app/conversationsadapter.h b/src/app/conversationsadapter.h
index 0a1114f3b..c92d34e14 100644
--- a/src/app/conversationsadapter.h
+++ b/src/app/conversationsadapter.h
@@ -19,7 +19,6 @@
 
 #pragma once
 
-#include "lrcinstance.h"
 #include "qmladapterbase.h"
 #include "conversationlistmodel.h"
 #include "searchresultslistmodel.h"
@@ -91,6 +90,7 @@ Q_SIGNALS:
     void conversationReady(const QString& convId);
 
 private Q_SLOTS:
+    void onCurrentAccountRemoved();
     void onCurrentAccountIdChanged();
 
     // cross-account slots
diff --git a/src/app/lrcinstance.cpp b/src/app/lrcinstance.cpp
index 2dedd992c..d6f00540a 100644
--- a/src/app/lrcinstance.cpp
+++ b/src/app/lrcinstance.cpp
@@ -70,6 +70,12 @@ LRCInstance::LRCInstance(migrateCallback willMigrateCb,
         set_currentAccountAvatarSet(!getCurrentAccountInfo().profileInfo.avatar.isEmpty());
     });
 
+    connect(&accountModel(),
+            &AccountModel::accountRemoved,
+            this,
+            &LRCInstance::onAccountRemoved,
+            Qt::DirectConnection);
+
     // set the current account if any
     auto accountList = accountModel().getAccountList();
     if (accountList.size()) {
@@ -469,4 +475,12 @@ VectorMapStringString
 LRCInstance::getChannelList(const QString& accountId, const QString& uid)
 {
     return Lrc::getChannelList(accountId, uid);
-}
\ No newline at end of file
+}
+
+void
+LRCInstance::onAccountRemoved(const QString& accountId)
+{
+    if (accountId != currentAccountId_)
+        return;
+    Q_EMIT currentAccountRemoved();
+}
diff --git a/src/app/lrcinstance.h b/src/app/lrcinstance.h
index 2a2e168d5..261ea2a20 100644
--- a/src/app/lrcinstance.h
+++ b/src/app/lrcinstance.h
@@ -141,6 +141,7 @@ public:
 
 Q_SIGNALS:
     void accountListChanged();
+    void currentAccountRemoved();
     void selectedConvUidChanged();
     void restoreAppRequested();
     void notificationClicked();
@@ -148,6 +149,9 @@ Q_SIGNALS:
     void draftSaved(const QString& convId);
     void base64SwarmAvatarChanged();
 
+private Q_SLOTS:
+    void onAccountRemoved(const QString& accountId);
+
 private:
     std::unique_ptr<Lrc> lrc_;
     std::unique_ptr<AppVersionManager> updateManager_;
-- 
GitLab