diff --git a/lib/src/screens/settings/connection_sync_page.dart b/lib/src/screens/settings/connection_sync_page.dart index bec2e6296..5ef878bdd 100644 --- a/lib/src/screens/settings/connection_sync_page.dart +++ b/lib/src/screens/settings/connection_sync_page.dart @@ -8,6 +8,7 @@ import 'package:cake_wallet/utils/feature_flag.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/view_model/settings/sync_mode.dart'; +import 'package:cake_wallet/view_model/settings/tor_connection.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/generated/i18n.dart'; @@ -89,17 +90,31 @@ class ConnectionSyncPage extends BasePage { ), const StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)), ], - if (FeatureFlag.isInAppTorEnabled) - SettingsCellWithArrow( - title: S.current.tor_connection, - handler: (context) => Navigator.of(context).pushNamed(Routes.torPage), + if (FeatureFlag.isInAppTorEnabled) ...[ + Observer(builder: (context) { + return SettingsPickerCell<TorConnection>( + title: S.current.background_sync_mode, + items: TorConnection.all, + displayItem: (TorConnection torConnection) => torConnection.name, + selectedItem: dashboardViewModel.torConnection, + onItemSelected: dashboardViewModel.setTorConnection, + ); + }), + Container( + color: Colors.amber, // TODO: CW-519 change + child: Column(children: [ + SettingsCellWithArrow( + title: S.current.tor_connection, + handler: (context) => Navigator.of(context).pushNamed(Routes.torPage), + ), + ]), ), + ], ], ), ); } - Future<void> _presentReconnectAlert(BuildContext context) async { await showPopUp<void>( context: context, diff --git a/lib/src/screens/settings/widgets/settings_tor_status.dart b/lib/src/screens/settings/widgets/settings_tor_status.dart new file mode 100644 index 000000000..180942f84 --- /dev/null +++ b/lib/src/screens/settings/widgets/settings_tor_status.dart @@ -0,0 +1,67 @@ +import 'package:cake_wallet/routes.dart'; +import 'package:cake_wallet/src/screens/nodes/widgets/node_indicator.dart'; +import 'package:cake_wallet/src/widgets/standard_list.dart'; +import 'package:cake_wallet/themes/extensions/receive_page_theme.dart'; +import 'package:cw_core/node.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/themes/extensions/filter_theme.dart'; + +class NodeListRow extends StandardListRow { + NodeListRow( + {required String title, + required this.node, + required void Function(BuildContext context) onTap, + required bool isSelected, + required this.isPow}) + : super(title: title, onTap: onTap, isSelected: isSelected); + + final Node node; + final bool isPow; + + @override + Widget buildLeading(BuildContext context) { + return FutureBuilder( + future: node.requestNode(), + builder: (context, snapshot) { + switch (snapshot.connectionState) { + case ConnectionState.done: + return NodeIndicator(isLive: (snapshot.data as bool?) ?? false); + default: + return NodeIndicator(isLive: false); + } + }); + } + + @override + Widget buildTrailing(BuildContext context) { + return GestureDetector( + onTap: () => Navigator.of(context).pushNamed(isPow ? Routes.newPowNode : Routes.newNode, + arguments: {'editingNode': node, 'isSelected': isSelected}), + child: Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Theme.of(context) + .extension<ReceivePageTheme>()! + .iconsBackgroundColor), + child: Icon(Icons.edit, + size: 14, + color: Theme.of(context) + .extension<ReceivePageTheme>()! + .iconsColor))); + } +} + +class NodeHeaderListRow extends StandardListRow { + NodeHeaderListRow({required String title, required void Function(BuildContext context) onTap}) + : super(title: title, onTap: onTap, isSelected: false); + + @override + Widget buildTrailing(BuildContext context) { + return SizedBox( + width: 20, + child: Icon(Icons.add, + color: Theme.of(context).extension<FilterTheme>()!.titlesColor,size: 24.0), + ); + } +} diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index f71282b5a..314583210 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -19,6 +19,7 @@ import 'package:cake_wallet/exchange/provider/trocador_exchange_provider.dart'; import 'package:cake_wallet/view_model/settings/sync_mode.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/ethereum/ethereum.dart'; +import 'package:cake_wallet/view_model/settings/tor_connection.dart'; import 'package:cw_core/transaction_priority.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_list.dart'; @@ -671,6 +672,9 @@ abstract class SettingsStoreBase with Store { @observable SyncMode currentSyncMode; + @observable + TorConnection currentTorConnection; + @observable bool currentSyncAll; diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index a794c2262..55db250c2 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -27,6 +27,7 @@ import 'package:cake_wallet/view_model/dashboard/order_list_item.dart'; import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart'; import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart'; import 'package:cake_wallet/view_model/settings/sync_mode.dart'; +import 'package:cake_wallet/view_model/settings/tor_connection.dart'; import 'package:cake_wallet/wallet_type_utils.dart'; import 'package:cryptography/cryptography.dart'; import 'package:cw_core/balance.dart'; @@ -460,6 +461,12 @@ abstract class DashboardViewModelBase with Store { @action void setSyncMode(SyncMode syncMode) => settingsStore.currentSyncMode = syncMode; + @computed + TorConnection get torConnection => settingsStore.currentTorConnection; + + @action + void setTorConnection(TorConnection torConnection) => settingsStore.currentTorConnection = torConnection; + @computed bool get syncAll => settingsStore.currentSyncAll; diff --git a/lib/view_model/settings/tor_connection.dart b/lib/view_model/settings/tor_connection.dart new file mode 100644 index 000000000..c0dc628bb --- /dev/null +++ b/lib/view_model/settings/tor_connection.dart @@ -0,0 +1,14 @@ +enum TorConnectionType { enabled, disabled, onionOnly } + +class TorConnection { + TorConnection(this.name, this.type); + + final String name; + final TorConnectionType type; + + static final all = [ + TorConnection("Enabled", TorConnectionType.enabled), + TorConnection("Disabled", TorConnectionType.disabled), + TorConnection("Onion Only", TorConnectionType.onionOnly), + ]; +}