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; + } +}