diff --git a/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart b/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart index a395d3897..f0a944cb5 100644 --- a/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart +++ b/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart @@ -225,11 +225,11 @@ class _TorAnimatedButtonState extends ConsumerState // Connect or disconnect when the user taps the status. switch (_status) { case TorConnectionStatus.disconnected: - await _connectTor(ref, context); + await connectTor(ref, context); break; case TorConnectionStatus.connected: - await _disconnectTor(ref, context); + await disconnectTor(ref, context); break; @@ -435,11 +435,11 @@ class _TorButtonState extends ConsumerState { // Connect or disconnect when the user taps the status. switch (_status) { case TorConnectionStatus.disconnected: - await _connectTor(ref, context); + await connectTor(ref, context); break; case TorConnectionStatus.connected: - await _disconnectTor(ref, context); + await disconnectTor(ref, context); break; @@ -583,7 +583,7 @@ class _UpperCaseTorTextState extends ConsumerState { /// Throws an exception if the Tor service fails to start. /// /// Returns a Future that completes when the Tor service has started. -Future _connectTor(WidgetRef ref, BuildContext context) async { +Future connectTor(WidgetRef ref, BuildContext context) async { try { // Init the Tor service if it hasn't already been. final torDir = await StackFileSystem.applicationTorDirectory(); @@ -600,8 +600,6 @@ Future _connectTor(WidgetRef ref, BuildContext context) async { ); // TODO: show dialog with error message } - - return; } /// Disconnect from the Tor network. @@ -611,7 +609,7 @@ Future _connectTor(WidgetRef ref, BuildContext context) async { /// Throws an exception if the Tor service fails to stop. /// /// Returns a Future that completes when the Tor service has stopped. -Future _disconnectTor(WidgetRef ref, BuildContext context) async { +Future disconnectTor(WidgetRef ref, BuildContext context) async { // Stop the Tor service. try { await ref.read(pTorService).disable(); diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart index ad91b3b07..8ae18a581 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart @@ -16,6 +16,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; import 'package:stackwallet/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart'; +import 'package:stackwallet/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart'; import 'package:stackwallet/pages/settings_views/sub_widgets/nodes_list.dart'; import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_network_settings_view/sub_widgets/confirm_full_rescan.dart'; import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_network_settings_view/sub_widgets/rescanning_dialog.dart'; @@ -35,8 +36,6 @@ import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; -import 'package:stackwallet/utilities/logger.dart'; -import 'package:stackwallet/utilities/stack_file_system.dart'; import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/widgets/animated_text.dart'; @@ -100,6 +99,26 @@ class _WalletNetworkSettingsViewState /// The current status of the Tor connection. late TorConnectionStatus _torConnectionStatus; + bool _buttonLockTor = false; + Future onTorTapped() async { + if (_buttonLockTor) { + return; + } + _buttonLockTor = true; + try { + if (ref.read(prefsChangeNotifierProvider).useTor) { + await disconnectTor(ref, context); + } else { + await connectTor(ref, context); + } + } catch (_) { + // Nothing. Just using finally to ensure button lock is reset in case + // some unexpected error happens + } finally { + _buttonLockTor = false; + } + } + Future _attemptRescan() async { if (!Platform.isLinux) await Wakelock.enable(); @@ -477,17 +496,14 @@ class _WalletNetworkSettingsViewState ? STextStyles.desktopTextExtraExtraSmall(context) : STextStyles.smallMed12(context), ), - GestureDetector( + CustomTextButton( + text: "Resync", onTap: () { ref .read(walletsChangeNotifierProvider) .getManager(widget.walletId) .refresh(); }, - child: Text( - "Resync", - style: STextStyles.link2(context), - ), ), ], ), @@ -769,55 +785,13 @@ class _WalletNetworkSettingsViewState ? STextStyles.desktopTextExtraExtraSmall(context) : STextStyles.smallMed12(context), ), - if (ref.watch( - prefsChangeNotifierProvider.select((value) => value.useTor))) - GestureDetector( - onTap: () async { - // Stop the Tor service. - try { - await ref.read(pTorService).disable(); - - // Toggle the useTor preference on success. - ref.read(prefsChangeNotifierProvider).useTor = false; - } catch (e, s) { - Logging.instance.log( - "Error stopping tor: $e\n$s", - level: LogLevel.Error, - ); - } - }, - child: Text( - "Disconnect", - style: STextStyles.link2(context), - ), - ), - if (!ref.watch( - prefsChangeNotifierProvider.select((value) => value.useTor))) - GestureDetector( - onTap: () async { - try { - // Init the Tor service if it hasn't already been. - final torDir = - await StackFileSystem.applicationTorDirectory(); - ref.read(pTorService).init(torDataDirPath: torDir.path); - // Start the Tor service. - await ref.read(pTorService).start(); - - // Toggle the useTor preference on success. - ref.read(prefsChangeNotifierProvider).useTor = true; - } catch (e, s) { - Logging.instance.log( - "Error starting tor: $e\n$s", - level: LogLevel.Error, - ); - // TODO: show dialog with error message - } - }, - child: Text( - "Connect", - style: STextStyles.link2(context), - ), - ), + CustomTextButton( + text: ref.watch(prefsChangeNotifierProvider + .select((value) => value.useTor)) + ? "Disconnect" + : "Connect", + onTap: onTorTapped, + ), ], ), SizedBox(