fix: revert API country selection on server switch failure

This commit is contained in:
cd-amn
2026-05-22 16:12:54 +04:00
parent b6188baeb8
commit 39f9bcfd50
5 changed files with 33 additions and 1 deletions
@@ -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);
@@ -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);
@@ -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."));
});
@@ -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)
{
@@ -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<ApiV2ServerConfig> m_previousApiV2Config;
};
#endif // SUBSCRIPTIONUICONTROLLER_H