diff --git a/client/core/controllers/api/subscriptionController.cpp b/client/core/controllers/api/subscriptionController.cpp index d5db87f5b..571b7b6a3 100644 --- a/client/core/controllers/api/subscriptionController.cpp +++ b/client/core/controllers/api/subscriptionController.cpp @@ -484,6 +484,12 @@ ErrorCode SubscriptionController::updateServiceFromGateway(const QString &server return ErrorCode::NoError; } +void SubscriptionController::restoreApiV2Config(const QString &serverId, const ApiV2ServerConfig &config) +{ + const QJsonObject json = config.toJson(); + m_serversRepository->editServer(serverId, json, serverConfigUtils::configTypeFromJson(json)); +} + ErrorCode SubscriptionController::deactivateDevice(const QString &serverId) { auto apiV2 = m_serversRepository->apiV2Config(serverId); diff --git a/client/core/controllers/api/subscriptionController.h b/client/core/controllers/api/subscriptionController.h index 5f5429abc..525245bac 100644 --- a/client/core/controllers/api/subscriptionController.h +++ b/client/core/controllers/api/subscriptionController.h @@ -68,6 +68,8 @@ public: ErrorCode updateServiceFromGateway(const QString &serverId, const QString &newCountryCode, bool isConnectEvent); + void restoreApiV2Config(const QString &serverId, const ApiV2ServerConfig &config); + ErrorCode deactivateDevice(const QString &serverId); ErrorCode deactivateExternalDevice(const QString &serverId, const QString &uuid, const QString &serverCountryCode); diff --git a/client/core/controllers/coreSignalHandlers.cpp b/client/core/controllers/coreSignalHandlers.cpp index 2168887b1..f4f38e231 100644 --- a/client/core/controllers/coreSignalHandlers.cpp +++ b/client/core/controllers/coreSignalHandlers.cpp @@ -95,6 +95,7 @@ void CoreSignalHandlers::initErrorMessagesHandler() }); connect(m_coreController->m_connectionUiController, &ConnectionUiController::serverSwitchFailed, this, [this]() { + m_coreController->m_subscriptionUiController->revertLastCountryChange(); emit m_coreController->m_pageController->showNotificationMessage( tr("Failed to switch server. Existing connection maintained.")); }); diff --git a/client/ui/controllers/api/subscriptionUiController.cpp b/client/ui/controllers/api/subscriptionUiController.cpp index eb30f8968..6c3a8171f 100644 --- a/client/ui/controllers/api/subscriptionUiController.cpp +++ b/client/ui/controllers/api/subscriptionUiController.cpp @@ -418,7 +418,8 @@ bool SubscriptionUiController::updateServiceFromGateway(const QString &serverId, { bool isConnectEvent = newCountryCode.isEmpty() && newCountryName.isEmpty() && !reloadServiceConfig; bool wasSubscriptionExpired = false; - if (const auto oldApiV2 = m_serversController->apiV2Config(serverId)) { + const auto oldApiV2 = m_serversController->apiV2Config(serverId); + if (oldApiV2) { wasSubscriptionExpired = oldApiV2->apiConfig.subscriptionExpiredByServer || oldApiV2->apiConfig.isSubscriptionExpired(); } @@ -426,6 +427,10 @@ bool SubscriptionUiController::updateServiceFromGateway(const QString &serverId, ErrorCode errorCode = m_subscriptionController->updateServiceFromGateway(serverId, newCountryCode, isConnectEvent); if (errorCode == ErrorCode::NoError) { + if (!newCountryCode.isEmpty() && oldApiV2) { + m_previousCountryServerId = serverId; + m_previousApiV2Config = oldApiV2; + } if (wasSubscriptionExpired) { emit subscriptionRefreshNeeded(); } @@ -447,6 +452,20 @@ bool SubscriptionUiController::updateServiceFromGateway(const QString &serverId, } } +void SubscriptionUiController::revertLastCountryChange() +{ + if (m_previousCountryServerId.isEmpty() || !m_previousApiV2Config) { + return; + } + const QString serverId = m_previousCountryServerId; + const ApiV2ServerConfig cfg = *m_previousApiV2Config; + m_previousCountryServerId.clear(); + m_previousApiV2Config.reset(); + + m_subscriptionController->restoreApiV2Config(serverId, cfg); + m_apiCountryModel->updateModel(cfg.apiConfig.availableCountries, + cfg.apiConfig.serverCountryCode); +} bool SubscriptionUiController::deactivateDevice(const QString &serverId) { diff --git a/client/ui/controllers/api/subscriptionUiController.h b/client/ui/controllers/api/subscriptionUiController.h index 72716e810..21705d5a1 100644 --- a/client/ui/controllers/api/subscriptionUiController.h +++ b/client/ui/controllers/api/subscriptionUiController.h @@ -50,6 +50,7 @@ public slots: bool importTrialFromGateway(const QString &email); bool updateServiceFromGateway(const QString &serverId, const QString &newCountryCode, const QString &newCountryName, bool reloadServiceConfig = false); + void revertLastCountryChange(); bool deactivateDevice(const QString &serverId); bool deactivateExternalDevice(const QString &serverId, const QString &uuid, const QString &serverCountryCode); @@ -125,6 +126,9 @@ private: ApiDevicesModel* m_apiDevicesModel; SettingsController* m_settingsController; ConnectionController* m_connectionController; + + QString m_previousCountryServerId; + std::optional m_previousApiV2Config; }; #endif // SUBSCRIPTIONUICONTROLLER_H