From 6f3691625a8d8e3cca7ae711356887155b0835c1 Mon Sep 17 00:00:00 2001 From: sneurlax Date: Thu, 6 Apr 2023 13:56:35 -0500 Subject: [PATCH] add copy to clipboard button to mobile xpub dialog --- lib/pages/wallet_view/wallet_view.dart | 65 +++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index 8d99d094b..61107e143 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -1,8 +1,11 @@ import 'dart:async'; +import 'package:bip32/bip32.dart' as bip32; +import 'package:bip39/bip39.dart' as bip39; import 'package:decimal/decimal.dart'; import 'package:event_bus/event_bus.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; import 'package:isar/isar.dart'; @@ -38,6 +41,7 @@ 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/utilities/assets.dart'; +import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart'; @@ -72,6 +76,7 @@ class WalletView extends ConsumerStatefulWidget { required this.walletId, required this.managerProvider, this.eventBus, + this.clipboardInterface = const ClipboardWrapper(), }) : super(key: key); static const String routeName = "/wallet"; @@ -81,6 +86,8 @@ class WalletView extends ConsumerStatefulWidget { final ChangeNotifierProvider managerProvider; final EventBus? eventBus; + final ClipboardInterface clipboardInterface; + @override ConsumerState createState() => _WalletViewState(); } @@ -100,10 +107,13 @@ class _WalletViewState extends ConsumerState { bool _rescanningOnOpen = false; + late ClipboardInterface _clipboardInterface; + @override void initState() { walletId = widget.walletId; managerProvider = widget.managerProvider; + _clipboardInterface = widget.clipboardInterface; ref.read(managerProvider).isActiveWallet = true; if (!ref.read(managerProvider).shouldAutoSync) { @@ -189,6 +199,16 @@ class _WalletViewState extends ConsumerState { super.dispose(); } + Future _copy(String xpub) async { + await _clipboardInterface.setData(ClipboardData(text: xpub)); + unawaited(showFloatingFlushBar( + type: FlushBarType.info, + message: "Copied to clipboard", + iconAsset: Assets.svg.copy, + context: context, + )); + } + DateTime? _cachedTime; Future _onWillPop() async { @@ -918,7 +938,50 @@ class _WalletViewState extends ConsumerState { label: "Show xPub", icon: const XPubNavIcon(), onTap: () async { - print("TODO"); + final List mnemonic = await ref + .read(walletsChangeNotifierProvider) + .getManager(walletId) + .mnemonic; + + final seed = bip39.mnemonicToSeed(mnemonic.join(' ')); + final node = bip32.BIP32.fromSeed(seed); + final xpub = node.neutered().toBase58(); + + showDialog( + barrierDismissible: true, + context: context, + builder: (_) => StackDialog( + title: "Wallet xPub", + message: xpub, + leftButton: TextButton( + style: Theme.of(context) + .extension()! + .getSecondaryEnabledButtonStyle(context), + onPressed: () async { + await _copy(xpub); + }, + child: Text( + "Copy to clipboard", + style: STextStyles.button(context).copyWith( + color: Theme.of(context) + .extension()! + .accentColorDark), + ), + ), + rightButton: TextButton( + style: Theme.of(context) + .extension()! + .getPrimaryEnabledButtonStyle(context), + onPressed: () { + Navigator.pop(context); + }, + child: Text( + "Continue", + style: STextStyles.button(context), + ), + ), + ), + ); }, ), ],