diff --git a/src/ChatPage.cc b/src/ChatPage.cc
index d8280a4a..cf78d8a1 100644
--- a/src/ChatPage.cc
+++ b/src/ChatPage.cc
@@ -29,6 +29,8 @@
#include "StateEvent.h"
+constexpr int MAX_INITIAL_SYNC_FAILURES = 5;
+
namespace events = matrix::events;
ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
@@ -192,6 +194,24 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
SIGNAL(initialSyncCompleted(const SyncResponse &)),
this,
SLOT(initialSyncCompleted(const SyncResponse &)));
+ connect(client_.data(), &MatrixClient::initialSyncFailed, this, [=](const QString &msg) {
+ initialSyncFailures += 1;
+
+ if (initialSyncFailures >= MAX_INITIAL_SYNC_FAILURES) {
+ initialSyncFailures = 0;
+
+ deleteConfigs();
+
+ emit showLoginPage(msg);
+ emit contentLoaded();
+ return;
+ }
+
+ qWarning() << msg;
+ qWarning() << "Retrying initial sync";
+
+ client_->initialSync();
+ });
connect(client_.data(),
SIGNAL(syncCompleted(const SyncResponse &)),
this,
@@ -239,7 +259,29 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent)
void
ChatPage::logout()
{
- // Delete all config parameters.
+ deleteConfigs();
+
+ resetUI();
+
+ emit close();
+}
+
+void
+ChatPage::resetUI()
+{
+ room_avatars_.clear();
+ room_list_->clear();
+ settingsManager_.clear();
+ state_manager_.clear();
+ top_bar_->reset();
+ user_info_widget_->reset();
+ view_manager_->clearAll();
+ AvatarProvider::clear();
+}
+
+void
+ChatPage::deleteConfigs()
+{
QSettings settings;
settings.beginGroup("auth");
settings.remove("");
@@ -253,21 +295,7 @@ ChatPage::logout()
cache_->deleteData();
- // Clear the environment.
- room_list_->clear();
- view_manager_->clearAll();
-
- top_bar_->reset();
- user_info_widget_->reset();
client_->reset();
-
- state_manager_.clear();
- settingsManager_.clear();
- room_avatars_.clear();
-
- AvatarProvider::clear();
-
- emit close();
}
void
|