From b0f4476fc229d36cff9fd5e6519a1c14a50b9b06 Mon Sep 17 00:00:00 2001
From: julian <julian@cypherstack.com>
Date: Wed, 13 Sep 2023 10:11:14 -0600
Subject: [PATCH] refactor mobile status bar tor icon

---
 lib/pages/home_view/home_view.dart            | 48 +-----------
 .../tor_settings/tor_settings_view.dart       | 62 +--------------
 lib/pages/wallet_view/wallet_view.dart        | 48 +-----------
 lib/widgets/small_tor_icon.dart               | 76 +++++++++++++++++++
 lib/widgets/tor_subscription.dart             | 61 +++++++++++++++
 5 files changed, 148 insertions(+), 147 deletions(-)
 create mode 100644 lib/widgets/small_tor_icon.dart
 create mode 100644 lib/widgets/tor_subscription.dart

diff --git a/lib/pages/home_view/home_view.dart b/lib/pages/home_view/home_view.dart
index c2f71bf48..2303333e1 100644
--- a/lib/pages/home_view/home_view.dart
+++ b/lib/pages/home_view/home_view.dart
@@ -20,13 +20,11 @@ import 'package:stackwallet/pages/home_view/sub_widgets/home_view_button_bar.dar
 import 'package:stackwallet/pages/notification_views/notifications_view.dart';
 import 'package:stackwallet/pages/settings_views/global_settings_view/global_settings_view.dart';
 import 'package:stackwallet/pages/settings_views/global_settings_view/hidden_settings.dart';
-import 'package:stackwallet/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart';
 import 'package:stackwallet/pages/wallets_view/wallets_view.dart';
 import 'package:stackwallet/providers/global/notifications_provider.dart';
 import 'package:stackwallet/providers/ui/home_view_index_provider.dart';
 import 'package:stackwallet/providers/ui/unread_notifications_provider.dart';
 import 'package:stackwallet/services/event_bus/events/global/tor_connection_status_changed_event.dart';
-import 'package:stackwallet/services/tor_service.dart';
 import 'package:stackwallet/themes/stack_colors.dart';
 import 'package:stackwallet/themes/theme_providers.dart';
 import 'package:stackwallet/utilities/assets.dart';
@@ -35,6 +33,7 @@ import 'package:stackwallet/utilities/text_styles.dart';
 import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart';
 import 'package:stackwallet/widgets/background.dart';
 import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/small_tor_icon.dart';
 import 'package:stackwallet/widgets/stack_dialog.dart';
 
 class HomeView extends ConsumerStatefulWidget {
@@ -219,54 +218,15 @@ class _HomeViewState extends ConsumerState<HomeView> {
               ],
             ),
             actions: [
-              Padding(
-                padding: const EdgeInsets.only(
+              const Padding(
+                padding: EdgeInsets.only(
                   top: 10,
                   bottom: 10,
                   right: 10,
                 ),
                 child: AspectRatio(
                   aspectRatio: 1,
-                  child: AppBarIconButton(
-                    semanticsLabel:
-                        "Tor Settings Button. Takes To Tor Settings Page.",
-                    key: const Key("walletsViewTorButton"),
-                    size: 36,
-                    shadows: const [],
-                    color: Theme.of(context)
-                        .extension<StackColors>()!
-                        .backgroundAppBar,
-                    icon: ref.watch(pTorService).enabled
-                        ? ref.read(pTorService).proxyInfo.port == -1
-                            ? SvgPicture.asset(
-                                Assets.svg.tor,
-                                color: Theme.of(context)
-                                    .extension<StackColors>()!
-                                    .accentColorYellow,
-                                width: 20,
-                                height: 20,
-                              )
-                            : SvgPicture.asset(
-                                Assets.svg.tor,
-                                color: Theme.of(context)
-                                    .extension<StackColors>()!
-                                    .accentColorGreen,
-                                width: 20,
-                                height: 20,
-                              )
-                        : SvgPicture.asset(
-                            Assets.svg.tor,
-                            color: Theme.of(context)
-                                .extension<StackColors>()!
-                                .textSubtitle3,
-                            width: 20,
-                            height: 20,
-                          ),
-                    onPressed: () {
-                      Navigator.of(context)
-                          .pushNamed(TorSettingsView.routeName);
-                    },
-                  ),
+                  child: SmallTorIcon(),
                 ),
               ),
               Padding(
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 e970f0158..9df8cc8bb 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
@@ -10,13 +10,11 @@
 
 import 'dart:async';
 
-import 'package:event_bus/event_bus.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:flutter_svg/flutter_svg.dart';
 import 'package:stackwallet/providers/global/prefs_provider.dart';
 import 'package:stackwallet/services/event_bus/events/global/tor_connection_status_changed_event.dart';
-import 'package:stackwallet/services/event_bus/global_event_bus.dart';
 import 'package:stackwallet/services/tor_service.dart';
 import 'package:stackwallet/themes/stack_colors.dart';
 import 'package:stackwallet/utilities/assets.dart';
@@ -30,6 +28,7 @@ import 'package:stackwallet/widgets/custom_buttons/draggable_switch_button.dart'
 import 'package:stackwallet/widgets/desktop/secondary_button.dart';
 import 'package:stackwallet/widgets/rounded_white_container.dart';
 import 'package:stackwallet/widgets/stack_dialog.dart';
+import 'package:stackwallet/widgets/tor_subscription.dart';
 
 class TorSettingsView extends ConsumerStatefulWidget {
   const TorSettingsView({Key? key}) : super(key: key);
@@ -280,7 +279,7 @@ class _TorIconState extends ConsumerState<TorIcon> {
 
   @override
   Widget build(BuildContext context) {
-    return _TorSubscriptionBase(
+    return TorSubscription(
       onTorStatusChanged: (status) {
         setState(() {
           _status = status;
@@ -409,7 +408,7 @@ class _TorButtonState extends ConsumerState<TorButton> {
 
   @override
   Widget build(BuildContext context) {
-    return _TorSubscriptionBase(
+    return TorSubscription(
       onTorStatusChanged: (status) {
         setState(() {
           _status = status;
@@ -448,61 +447,6 @@ class _TorButtonState extends ConsumerState<TorButton> {
   }
 }
 
-class _TorSubscriptionBase extends ConsumerStatefulWidget {
-  const _TorSubscriptionBase({
-    super.key,
-    required this.onTorStatusChanged,
-    this.eventBus,
-    required this.child,
-  });
-
-  final Widget child;
-  final void Function(TorConnectionStatus) onTorStatusChanged;
-  final EventBus? eventBus;
-
-  @override
-  ConsumerState<_TorSubscriptionBase> createState() =>
-      _TorSubscriptionBaseState();
-}
-
-class _TorSubscriptionBaseState extends ConsumerState<_TorSubscriptionBase> {
-  /// The global event bus.
-  late final EventBus eventBus;
-
-  /// Subscription to the TorConnectionStatusChangedEvent.
-  late StreamSubscription<TorConnectionStatusChangedEvent>
-      _torConnectionStatusSubscription;
-
-  @override
-  void initState() {
-    // Initialize the global event bus.
-    eventBus = widget.eventBus ?? GlobalEventBus.instance;
-
-    // Subscribe to the TorConnectionStatusChangedEvent.
-    _torConnectionStatusSubscription =
-        eventBus.on<TorConnectionStatusChangedEvent>().listen(
-      (event) async {
-        widget.onTorStatusChanged.call(event.newStatus);
-      },
-    );
-
-    super.initState();
-  }
-
-  @override
-  void dispose() {
-    // Clean up the TorConnectionStatusChangedEvent subscription.
-    _torConnectionStatusSubscription.cancel();
-
-    super.dispose();
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return widget.child;
-  }
-}
-
 /// Connect to the Tor network.
 ///
 /// This method is called when the user taps the "Connect" button.
diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart
index 7e15c6e7d..cf73e8eee 100644
--- a/lib/pages/wallet_view/wallet_view.dart
+++ b/lib/pages/wallet_view/wallet_view.dart
@@ -29,7 +29,6 @@ import 'package:stackwallet/pages/paynym/paynym_claim_view.dart';
 import 'package:stackwallet/pages/paynym/paynym_home_view.dart';
 import 'package:stackwallet/pages/receive_view/receive_view.dart';
 import 'package:stackwallet/pages/send_view/send_view.dart';
-import 'package:stackwallet/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart';
 import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart';
 import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_settings_view.dart';
 import 'package:stackwallet/pages/special/firo_rescan_recovery_error_dialog.dart';
@@ -52,7 +51,6 @@ import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_
 import 'package:stackwallet/services/event_bus/global_event_bus.dart';
 import 'package:stackwallet/services/exchange/exchange_data_loading_service.dart';
 import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
-import 'package:stackwallet/services/tor_service.dart';
 import 'package:stackwallet/themes/coin_icon_provider.dart';
 import 'package:stackwallet/themes/stack_colors.dart';
 import 'package:stackwallet/themes/theme_providers.dart';
@@ -73,6 +71,7 @@ import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
 import 'package:stackwallet/widgets/custom_loading_overlay.dart';
 import 'package:stackwallet/widgets/desktop/secondary_button.dart';
 import 'package:stackwallet/widgets/loading_indicator.dart';
+import 'package:stackwallet/widgets/small_tor_icon.dart';
 import 'package:stackwallet/widgets/stack_dialog.dart';
 import 'package:stackwallet/widgets/wallet_navigation_bar/components/icons/buy_nav_icon.dart';
 import 'package:stackwallet/widgets/wallet_navigation_bar/components/icons/coin_control_nav_icon.dart';
@@ -554,54 +553,15 @@ class _WalletViewState extends ConsumerState<WalletView> {
                     ],
                   ),
                   actions: [
-                    Padding(
-                      padding: const EdgeInsets.only(
+                    const Padding(
+                      padding: EdgeInsets.only(
                         top: 10,
                         bottom: 10,
                         right: 10,
                       ),
                       child: AspectRatio(
                         aspectRatio: 1,
-                        child: AppBarIconButton(
-                          semanticsLabel:
-                              "Tor Settings Button. Takes To Tor Settings Page.",
-                          key: const Key("walletsViewTorButton"),
-                          size: 36,
-                          shadows: const [],
-                          color: Theme.of(context)
-                              .extension<StackColors>()!
-                              .backgroundAppBar,
-                          icon: ref.watch(pTorService).enabled
-                              ? ref.read(pTorService).proxyInfo.port == -1
-                                  ? SvgPicture.asset(
-                                      Assets.svg.tor,
-                                      color: Theme.of(context)
-                                          .extension<StackColors>()!
-                                          .accentColorYellow,
-                                      width: 20,
-                                      height: 20,
-                                    )
-                                  : SvgPicture.asset(
-                                      Assets.svg.tor,
-                                      color: Theme.of(context)
-                                          .extension<StackColors>()!
-                                          .accentColorGreen,
-                                      width: 20,
-                                      height: 20,
-                                    )
-                              : SvgPicture.asset(
-                                  Assets.svg.tor,
-                                  color: Theme.of(context)
-                                      .extension<StackColors>()!
-                                      .textSubtitle3,
-                                  width: 20,
-                                  height: 20,
-                                ),
-                          onPressed: () {
-                            Navigator.of(context)
-                                .pushNamed(TorSettingsView.routeName);
-                          },
-                        ),
+                        child: SmallTorIcon(),
                       ),
                     ),
                     Padding(
diff --git a/lib/widgets/small_tor_icon.dart b/lib/widgets/small_tor_icon.dart
new file mode 100644
index 000000000..c032fbdae
--- /dev/null
+++ b/lib/widgets/small_tor_icon.dart
@@ -0,0 +1,76 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:stackwallet/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart';
+import 'package:stackwallet/services/event_bus/events/global/tor_connection_status_changed_event.dart';
+import 'package:stackwallet/services/tor_service.dart';
+import 'package:stackwallet/themes/stack_colors.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/tor_subscription.dart';
+
+class SmallTorIcon extends ConsumerStatefulWidget {
+  const SmallTorIcon({super.key});
+
+  @override
+  ConsumerState<SmallTorIcon> createState() => _SmallTorIconState();
+}
+
+class _SmallTorIconState extends ConsumerState<SmallTorIcon> {
+  late TorConnectionStatus _status;
+
+  Color _color(
+    TorConnectionStatus status,
+    StackColors colors,
+  ) {
+    switch (status) {
+      case TorConnectionStatus.disconnected:
+        return colors.textSubtitle3;
+
+      case TorConnectionStatus.connected:
+        return colors.accentColorGreen;
+
+      case TorConnectionStatus.connecting:
+        return colors.accentColorYellow;
+    }
+  }
+
+  @override
+  void initState() {
+    _status = ref.read(pTorService).enabled
+        ? TorConnectionStatus.connected
+        : TorConnectionStatus.disconnected;
+
+    super.initState();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return TorSubscription(
+      onTorStatusChanged: (status) {
+        setState(() {
+          _status = status;
+        });
+      },
+      child: AppBarIconButton(
+        semanticsLabel: "Tor Settings Button. Takes To Tor Settings Page.",
+        key: const Key("walletsViewTorButton"),
+        size: 36,
+        shadows: const [],
+        color: Theme.of(context).extension<StackColors>()!.backgroundAppBar,
+        icon: SvgPicture.asset(
+          Assets.svg.tor,
+          color: _color(
+            _status,
+            Theme.of(context).extension<StackColors>()!,
+          ),
+          width: 20,
+          height: 20,
+        ),
+        onPressed: () {
+          Navigator.of(context).pushNamed(TorSettingsView.routeName);
+        },
+      ),
+    );
+  }
+}
diff --git a/lib/widgets/tor_subscription.dart b/lib/widgets/tor_subscription.dart
new file mode 100644
index 000000000..30904e9f4
--- /dev/null
+++ b/lib/widgets/tor_subscription.dart
@@ -0,0 +1,61 @@
+import 'dart:async';
+
+import 'package:event_bus/event_bus.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/services/event_bus/events/global/tor_connection_status_changed_event.dart';
+import 'package:stackwallet/services/event_bus/global_event_bus.dart';
+
+class TorSubscription extends ConsumerStatefulWidget {
+  const TorSubscription({
+    super.key,
+    required this.onTorStatusChanged,
+    this.eventBus,
+    required this.child,
+  });
+
+  final Widget child;
+  final void Function(TorConnectionStatus) onTorStatusChanged;
+  final EventBus? eventBus;
+
+  @override
+  ConsumerState<TorSubscription> createState() => _TorSubscriptionBaseState();
+}
+
+class _TorSubscriptionBaseState extends ConsumerState<TorSubscription> {
+  /// The global event bus.
+  late final EventBus eventBus;
+
+  /// Subscription to the TorConnectionStatusChangedEvent.
+  late StreamSubscription<TorConnectionStatusChangedEvent>
+      _torConnectionStatusSubscription;
+
+  @override
+  void initState() {
+    // Initialize the global event bus.
+    eventBus = widget.eventBus ?? GlobalEventBus.instance;
+
+    // Subscribe to the TorConnectionStatusChangedEvent.
+    _torConnectionStatusSubscription =
+        eventBus.on<TorConnectionStatusChangedEvent>().listen(
+      (event) async {
+        widget.onTorStatusChanged.call(event.newStatus);
+      },
+    );
+
+    super.initState();
+  }
+
+  @override
+  void dispose() {
+    // Clean up the TorConnectionStatusChangedEvent subscription.
+    _torConnectionStatusSubscription.cancel();
+
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return widget.child;
+  }
+}