diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index b19d291fa..61c4ed415 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -53,6 +53,7 @@ import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; 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/stack_dialog.dart'; import 'package:stackwallet/widgets/wallet_navigation_bar/components/icons/buy_nav_icon.dart'; @@ -420,6 +421,33 @@ class _WalletViewState extends ConsumerState { eventBus: null, textColor: Theme.of(context).extension()!.textDark, + actionButton: SecondaryButton( + label: "Cancel", + onPressed: () async { + await showDialog( + context: context, + builder: (context) => StackDialog( + title: "Warning!", + message: "Skipping this process can completely" + " break your wallet. It is only meant to be done in" + " emergency situations where the migration fails" + " and will not let you continue. Still skip?", + leftButton: SecondaryButton( + label: "Cancel", + onPressed: + Navigator.of(context, rootNavigator: true).pop, + ), + rightButton: SecondaryButton( + label: "Ok", + onPressed: () { + Navigator.of(context, rootNavigator: true).pop(); + setState(() => _rescanningOnOpen = false); + }, + ), + ), + ); + }, + ), ), ) ], @@ -790,7 +818,6 @@ class _WalletViewState extends ConsumerState { label: "Receive", icon: const ReceiveNavIcon(), onTap: () { - final coin = ref.read(managerProvider).coin; if (mounted) { unawaited( Navigator.of(context).pushNamed( diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart index 512774df8..0d0c408c1 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart @@ -31,7 +31,11 @@ import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart'; import 'package:stackwallet/widgets/custom_loading_overlay.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; +import 'package:stackwallet/widgets/desktop/desktop_dialog.dart'; +import 'package:stackwallet/widgets/desktop/desktop_dialog_close_button.dart'; import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart'; +import 'package:stackwallet/widgets/desktop/primary_button.dart'; +import 'package:stackwallet/widgets/desktop/secondary_button.dart'; import 'package:stackwallet/widgets/hover_text_field.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart'; @@ -150,6 +154,83 @@ class _DesktopWalletViewState extends ConsumerState { subMessage: "This only needs to run once per wallet", eventBus: null, textColor: Theme.of(context).extension()!.textDark, + actionButton: SecondaryButton( + label: "Skip", + buttonHeight: ButtonHeight.l, + onPressed: () async { + await showDialog( + context: context, + builder: (context) => DesktopDialog( + maxWidth: 500, + maxHeight: double.infinity, + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(left: 32), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "Warning!", + style: STextStyles.desktopH3(context), + ), + const DesktopDialogCloseButton(), + ], + ), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 32), + child: Text( + "Skipping this process can completely" + " break your wallet. It is only meant to be done in" + " emergency situations where the migration fails" + " and will not let you continue. Still skip?", + style: STextStyles.desktopTextSmall(context), + ), + ), + const SizedBox( + height: 32, + ), + Padding( + padding: const EdgeInsets.all(32), + child: Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Cancel", + buttonHeight: ButtonHeight.l, + onPressed: Navigator.of(context, + rootNavigator: true) + .pop, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: PrimaryButton( + label: "Ok", + buttonHeight: ButtonHeight.l, + onPressed: () { + Navigator.of(context, + rootNavigator: true) + .pop(); + setState( + () => _rescanningOnOpen = false); + }, + ), + ), + ], + ), + ) + ], + ), + ), + ); + }, + ), ), ) ], diff --git a/lib/widgets/custom_loading_overlay.dart b/lib/widgets/custom_loading_overlay.dart index e05158bc4..e2669d054 100644 --- a/lib/widgets/custom_loading_overlay.dart +++ b/lib/widgets/custom_loading_overlay.dart @@ -5,6 +5,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; +import 'package:stackwallet/utilities/util.dart'; +import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/loading_indicator.dart'; class CustomLoadingOverlay extends ConsumerStatefulWidget { @@ -14,12 +16,14 @@ class CustomLoadingOverlay extends ConsumerStatefulWidget { this.subMessage, required this.eventBus, this.textColor, + this.actionButton, }) : super(key: key); final String message; final String? subMessage; final EventBus? eventBus; final Color? textColor; + final Widget? actionButton; @override ConsumerState createState() => @@ -30,6 +34,7 @@ class _CustomLoadingOverlayState extends ConsumerState { double _percent = 0; late final StreamSubscription? subscription; + final bool isDesktop = Util.isDesktop; @override void initState() { @@ -49,68 +54,97 @@ class _CustomLoadingOverlayState extends ConsumerState { @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Material( - color: Colors.transparent, - child: Center( - child: Column( - children: [ - Text( - widget.message, - textAlign: TextAlign.center, - style: STextStyles.pageTitleH2(context).copyWith( - color: widget.textColor ?? - Theme.of(context) - .extension()! - .loadingOverlayTextColor, + return Material( + color: Colors.transparent, + child: ConditionalParent( + condition: widget.actionButton != null, + builder: (child) => Stack( + children: [ + child, + if (isDesktop) + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.all(16), + child: SizedBox( + width: 100, + child: widget.actionButton!, + ), + ), + ], + ), + if (!isDesktop) + Positioned( + bottom: 1, + left: 0, + right: 1, + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + Expanded(child: widget.actionButton!), + ], ), ), - if (widget.eventBus != null) - const SizedBox( - height: 10, - ), - if (widget.eventBus != null) - Text( - "${(_percent * 100).toStringAsFixed(2)}%", - style: STextStyles.pageTitleH2(context).copyWith( - color: widget.textColor ?? - Theme.of(context) - .extension()! - .loadingOverlayTextColor, - ), - ), - if (widget.subMessage != null) - const SizedBox( - height: 10, - ), - if (widget.subMessage != null) - Text( - widget.subMessage!, - textAlign: TextAlign.center, - style: STextStyles.pageTitleH2(context).copyWith( - fontSize: 14, - color: widget.textColor ?? - Theme.of(context) - .extension()! - .loadingOverlayTextColor, - ), - ) - ], + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + widget.message, + textAlign: TextAlign.center, + style: STextStyles.pageTitleH2(context).copyWith( + color: widget.textColor ?? + Theme.of(context) + .extension()! + .loadingOverlayTextColor, + ), ), - ), + if (widget.eventBus != null) + const SizedBox( + height: 10, + ), + if (widget.eventBus != null) + Text( + "${(_percent * 100).toStringAsFixed(2)}%", + style: STextStyles.pageTitleH2(context).copyWith( + color: widget.textColor ?? + Theme.of(context) + .extension()! + .loadingOverlayTextColor, + ), + ), + if (widget.subMessage != null) + const SizedBox( + height: 10, + ), + if (widget.subMessage != null) + Text( + widget.subMessage!, + textAlign: TextAlign.center, + style: STextStyles.pageTitleH2(context).copyWith( + fontSize: 14, + color: widget.textColor ?? + Theme.of(context) + .extension()! + .loadingOverlayTextColor, + ), + ), + const SizedBox( + height: 64, + ), + const Center( + child: LoadingIndicator( + width: 100, + ), + ), + ], ), - const SizedBox( - height: 64, - ), - const Center( - child: LoadingIndicator( - width: 100, - ), - ), - ], + ), ); } }