CW-974: Add support for automatic node switching. (#2361)

* feat: Add support for automatic node switching.

This change:
- Adds isTrustedNodeForSwitching property to Node class.
- Adds UI Checkbox to mark a node as trusted for automatic switching in Node create or edit form.
- Implements checkNodeHealth method in wallet classes to verify node connectivity.
- Adds NodeSwitchingService for managing automatic node switching based on health checks.
- Adds setting option for user to enable/disable automated node switching

* fix(automatic-node-switch): Set node health check interval to 5 minutes in NodeSwitchingService

* refactor: Update handler method

* feat: Automatic Node Switching Improvements

This change:
- Moves enable automatic node switch to the Manage Nodes Page
- Adds check to verify node health before attempting to sync in EVM, Sol and Tron Wallets.
- Modifies trusted ndoes list for monero
- Adds trigger for Node Health Check when app resumes from background

* fix: Increase default request timeout for Tron and update health check interval for node switch

* feat: Enhance Node health check functionality.

This change adds additional checks for token balance in EVM, Solana and Tron Wallets in checkNodeHealth.

* fix: Update health check interval to 30 seconds in NodeSwitchingService

* Update bitcoin_electrum_server_list.yml

* fix: Electru wallet not connecting to new node after switching

* fix: Automated Node Switch not working on Decred Wallet

* fix: Add more nodes for AutoSwitching

This change:
- Enables more nodes across wallet types for auto switching
- Modifies CTA for checkbox
- Renames flags to fit

* fix: Add migration function for setting up default nodes for autoswitching

* fix: Review and testing fixes

* chore: Adjust balance and history fetch timer
This commit is contained in:
David Adegoke
2025-07-25 16:42:59 +03:00
committed by GitHub
parent 8f4eed4d9b
commit 4b2af63fa5
73 changed files with 639 additions and 68 deletions
@@ -26,6 +26,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
login = '',
password = '',
trusted = false,
isEnabledForAutoSwitching = false,
useSocksProxy = false,
socksProxyAddress = '';
@@ -56,6 +57,9 @@ abstract class NodeCreateOrEditViewModelBase with Store {
@observable
bool trusted;
@observable
bool isEnabledForAutoSwitching;
@observable
bool useSocksProxy;
@@ -118,6 +122,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
password = '';
useSSL = false;
trusted = false;
isEnabledForAutoSwitching = false;
useSocksProxy = false;
socksProxyAddress = '';
}
@@ -143,6 +148,9 @@ abstract class NodeCreateOrEditViewModelBase with Store {
@action
void setTrusted(bool val) => trusted = val;
@action
void setIsEnabledForAutoSwitching(bool val) => isEnabledForAutoSwitching = val;
@action
void setSocksProxy(bool val) => useSocksProxy = val;
@@ -159,6 +167,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
password: password,
useSSL: useSSL,
trusted: trusted,
isEnabledForAutoSwitching: isEnabledForAutoSwitching,
socksProxyAddress: socksProxyAddress);
try {
state = IsExecutingState();
@@ -190,6 +199,7 @@ abstract class NodeCreateOrEditViewModelBase with Store {
password: password,
useSSL: useSSL,
trusted: trusted,
isEnabledForAutoSwitching: isEnabledForAutoSwitching,
socksProxyAddress: socksProxyAddress);
try {
connectionState = IsExecutingState();
@@ -41,6 +41,13 @@ abstract class NodeListViewModelBase with Store {
S.current.change_current_node(uri) +
'${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + (CakeTor.instance.enabled ? '' : S.current.orbot_running_alert) : ''}';
@computed
bool get enableAutomaticNodeSwitching => settingsStore.enableAutomaticNodeSwitching;
@action
void setEnableAutomaticNodeSwitching(bool value) =>
settingsStore.enableAutomaticNodeSwitching = value;
final ObservableList<Node> nodes;
final SettingsStore settingsStore;
final Box<Node> _nodeSource;
@@ -41,6 +41,13 @@ abstract class PowNodeListViewModelBase with Store {
S.current.change_current_node(uri) +
'${uri.endsWith('.onion') || uri.contains('.onion:') ? '\n' + (CakeTor.instance.enabled ? '' : S.current.orbot_running_alert) : ''}';
@computed
bool get enableAutomaticNodeSwitching => settingsStore.enableAutomaticNodeSwitching;
@action
void setEnableAutomaticNodeSwitching(bool value) =>
settingsStore.enableAutomaticNodeSwitching = value;
final ObservableList<Node> nodes;
final SettingsStore settingsStore;
final Box<Node> _nodeSource;