mostly (roughly) refactored with new wallet providers as well as using a TxData object in place of dynamic Maps

This commit is contained in:
julian 2023-11-03 13:46:55 -06:00
parent be39ad2cd7
commit 5ba29b7299
190 changed files with 3262 additions and 2963 deletions
lib
db/isar
pages
add_wallet_views
address_book_views
buy_view
cashfusion
coin_control
exchange_view
manage_favorites_view
monkey
ordinals
paynym
pinpad_views
receive_view
send_view
settings_views
special
token_view
wallet_view
wallets_view
pages_desktop_specific

View file

@ -21,7 +21,7 @@ import 'package:stackwallet/models/isar/stack_theme.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/stack_file_system.dart'; import 'package:stackwallet/utilities/stack_file_system.dart';
import 'package:stackwallet/wallets/isar_models/wallet_info.dart'; import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
part '../queries/queries.dart'; part '../queries/queries.dart';

View file

@ -31,6 +31,7 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/default_eth_tokens.dart'; import 'package:stackwallet/utilities/default_eth_tokens.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -99,7 +100,7 @@ class _EditWalletTokensViewState extends ConsumerState<EditWalletTokensView> {
.toList(); .toList();
final ethWallet = final ethWallet =
ref.read(pWallets).getManager(widget.walletId).wallet as EthereumWallet; ref.read(pWallets).getWallet(widget.walletId) as EthereumWallet;
await ethWallet.updateTokenContracts(selectedTokens); await ethWallet.updateTokenContracts(selectedTokens);
if (mounted) { if (mounted) {
@ -179,11 +180,9 @@ class _EditWalletTokensViewState extends ConsumerState<EditWalletTokensView> {
tokenEntities.addAll(contracts.map((e) => AddTokenListElementData(e))); tokenEntities.addAll(contracts.map((e) => AddTokenListElementData(e)));
final walletContracts = (ref final walletContracts =
.read(pWallets) (ref.read(pWallets).getWallet(widget.walletId) as EthereumWallet)
.getManager(widget.walletId) .getWalletTokenContractAddresses();
.wallet as EthereumWallet)
.getWalletTokenContractAddresses();
final shouldMarkAsSelectedContracts = [ final shouldMarkAsSelectedContracts = [
...walletContracts, ...walletContracts,
@ -207,8 +206,7 @@ class _EditWalletTokensViewState extends ConsumerState<EditWalletTokensView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final walletName = ref.watch(pWallets final walletName = ref.watch(pWalletName(widget.walletId));
.select((value) => value.getManager(widget.walletId).walletName));
if (isDesktop) { if (isDesktop) {
return ConditionalParent( return ConditionalParent(

View file

@ -12,22 +12,22 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:isar/isar.dart';
import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart'; import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet_options_view.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart';
import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart'; import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/global/wallets_service_provider.dart'; import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart'; import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/add_wallet_type_enum.dart'; import 'package:stackwallet/utilities/enums/add_wallet_type_enum.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/name_generator.dart'; import 'package:stackwallet/utilities/name_generator.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
@ -81,10 +81,15 @@ class _NameYourWalletViewState extends ConsumerState<NameYourWalletView> {
void initState() { void initState() {
isDesktop = Util.isDesktop; isDesktop = Util.isDesktop;
ref.read(walletsServiceChangeNotifierProvider).walletNames.then( ref
(value) => namesToExclude.addAll( .read(mainDBProvider)
value.values.map((e) => e.name), .isar
), .walletInfo
.where()
.nameProperty()
.findAll()
.then(
(values) => namesToExclude.addAll(values),
); );
generator = NameGenerator(); generator = NameGenerator();
addWalletType = widget.addWalletType; addWalletType = widget.addWalletType;
@ -333,64 +338,48 @@ class _NameYourWalletViewState extends ConsumerState<NameYourWalletView> {
child: TextButton( child: TextButton(
onPressed: _nextEnabled onPressed: _nextEnabled
? () async { ? () async {
final walletsService =
ref.read(walletsServiceChangeNotifierProvider);
final name = textEditingController.text; final name = textEditingController.text;
final hasDuplicateName =
await walletsService.checkForDuplicate(name);
if (mounted) { if (mounted) {
if (hasDuplicateName) { // hide keyboard if has focus
unawaited(showFloatingFlushBar( if (FocusScope.of(context).hasFocus) {
type: FlushBarType.warning, FocusScope.of(context).unfocus();
message: "Wallet name already in use.", await Future<void>.delayed(
iconAsset: Assets.svg.circleAlert, const Duration(milliseconds: 50));
context: context, }
));
} else {
// hide keyboard if has focus
if (FocusScope.of(context).hasFocus) {
FocusScope.of(context).unfocus();
await Future<void>.delayed(
const Duration(milliseconds: 50));
}
if (mounted) { if (mounted) {
ref ref.read(mnemonicWordCountStateProvider.state).state =
.read(mnemonicWordCountStateProvider.state) Constants.possibleLengthsForCoin(coin).last;
.state = ref.read(pNewWalletOptions.notifier).state = null;
Constants.possibleLengthsForCoin(coin).last;
ref.read(pNewWalletOptions.notifier).state = null;
switch (widget.addWalletType) { switch (widget.addWalletType) {
case AddWalletType.New: case AddWalletType.New:
unawaited( unawaited(
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
coin.hasMnemonicPassphraseSupport coin.hasMnemonicPassphraseSupport
? NewWalletOptionsView.routeName ? NewWalletOptionsView.routeName
: NewWalletRecoveryPhraseWarningView : NewWalletRecoveryPhraseWarningView
.routeName, .routeName,
arguments: Tuple2( arguments: Tuple2(
name, name,
coin, coin,
),
), ),
); ),
break; );
break;
case AddWalletType.Restore: case AddWalletType.Restore:
unawaited( unawaited(
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
RestoreOptionsView.routeName, RestoreOptionsView.routeName,
arguments: Tuple2( arguments: Tuple2(
name, name,
coin, coin,
),
), ),
); ),
break; );
} break;
} }
} }
} }

View file

@ -22,13 +22,14 @@ import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/v
import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart'; import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart'; import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
@ -37,14 +38,14 @@ import 'package:tuple/tuple.dart';
class NewWalletRecoveryPhraseView extends ConsumerStatefulWidget { class NewWalletRecoveryPhraseView extends ConsumerStatefulWidget {
const NewWalletRecoveryPhraseView({ const NewWalletRecoveryPhraseView({
Key? key, Key? key,
required this.manager, required this.wallet,
required this.mnemonic, required this.mnemonic,
this.clipboardInterface = const ClipboardWrapper(), this.clipboardInterface = const ClipboardWrapper(),
}) : super(key: key); }) : super(key: key);
static const routeName = "/newWalletRecoveryPhrase"; static const routeName = "/newWalletRecoveryPhrase";
final Manager manager; final Wallet wallet;
final List<String> mnemonic; final List<String> mnemonic;
final ClipboardInterface clipboardInterface; final ClipboardInterface clipboardInterface;
@ -58,14 +59,14 @@ class _NewWalletRecoveryPhraseViewState
extends ConsumerState<NewWalletRecoveryPhraseView> extends ConsumerState<NewWalletRecoveryPhraseView>
// with WidgetsBindingObserver // with WidgetsBindingObserver
{ {
late Manager _manager; late Wallet _wallet;
late List<String> _mnemonic; late List<String> _mnemonic;
late ClipboardInterface _clipboardInterface; late ClipboardInterface _clipboardInterface;
late final bool isDesktop; late final bool isDesktop;
@override @override
void initState() { void initState() {
_manager = widget.manager; _wallet = widget.wallet;
_mnemonic = widget.mnemonic; _mnemonic = widget.mnemonic;
_clipboardInterface = widget.clipboardInterface; _clipboardInterface = widget.clipboardInterface;
isDesktop = Util.isDesktop; isDesktop = Util.isDesktop;
@ -78,14 +79,12 @@ class _NewWalletRecoveryPhraseViewState
} }
Future<void> delete() async { Future<void> delete() async {
await ref await _wallet.exit();
.read(walletsServiceChangeNotifierProvider) await ref.read(pWallets).deleteWallet(_wallet.walletId);
.deleteWallet(_manager.walletName, false);
await _manager.exitCurrentWallet();
} }
Future<void> _copy() async { Future<void> _copy() async {
final words = await _manager.mnemonic; final words = _mnemonic;
await _clipboardInterface.setData(ClipboardData(text: words.join(" "))); await _clipboardInterface.setData(ClipboardData(text: words.join(" ")));
unawaited(showFloatingFlushBar( unawaited(showFloatingFlushBar(
type: FlushBarType.info, type: FlushBarType.info,
@ -191,7 +190,7 @@ class _NewWalletRecoveryPhraseViewState
), ),
if (!isDesktop) if (!isDesktop)
Text( Text(
_manager.walletName, ref.watch(pWalletName(_wallet.walletId)),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: STextStyles.label(context).copyWith( style: STextStyles.label(context).copyWith(
fontSize: 12, fontSize: 12,
@ -305,7 +304,7 @@ class _NewWalletRecoveryPhraseViewState
unawaited(Navigator.of(context).pushNamed( unawaited(Navigator.of(context).pushNamed(
VerifyRecoveryPhraseView.routeName, VerifyRecoveryPhraseView.routeName,
arguments: Tuple2(_manager, _mnemonic), arguments: Tuple2(_wallet, _mnemonic),
)); ));
}, },
style: Theme.of(context) style: Theme.of(context)

View file

@ -17,10 +17,9 @@ import 'package:stackwallet/pages/add_wallet_views/new_wallet_options/new_wallet
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/recovery_phrase_explanation_dialog.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/recovery_phrase_explanation_dialog.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/secure_store_provider.dart'; import 'package:stackwallet/providers/global/secure_store_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/coin_service.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/services/transaction_notification_tracker.dart'; import 'package:stackwallet/services/transaction_notification_tracker.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
@ -30,6 +29,9 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
import 'package:stackwallet/wallets/wallet/bip39_wallet.dart';
import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
@ -453,14 +455,9 @@ class _NewWalletRecoveryPhraseWarningViewState
}, },
)); ));
final walletsService = ref.read( final info = WalletInfo.createNew(
walletsServiceChangeNotifierProvider); coin: widget.coin,
name: widget.walletName,
final walletId =
await walletsService.addNewWallet(
name: walletName,
coin: coin,
shouldNotifyListeners: false,
); );
var node = ref var node = ref
@ -480,43 +477,45 @@ class _NewWalletRecoveryPhraseWarningViewState
final txTracker = final txTracker =
TransactionNotificationTracker( TransactionNotificationTracker(
walletId: walletId!); walletId: info.walletId,
);
final failovers = ref final failovers = ref
.read(nodeServiceChangeNotifierProvider) .read(nodeServiceChangeNotifierProvider)
.failoverNodesFor(coin: widget.coin); .failoverNodesFor(coin: widget.coin);
final wallet = CoinServiceAPI.from( final wallet = await Wallet.create(
coin, walletInfo: info,
walletId, mainDB: ref.read(mainDBProvider),
walletName, secureStorageInterface:
ref.read(secureStoreProvider), ref.read(secureStoreProvider),
node, nodeService: ref.read(
txTracker, nodeServiceChangeNotifierProvider),
ref.read(prefsChangeNotifierProvider), prefs:
failovers, ref.read(prefsChangeNotifierProvider),
); );
final manager = Manager(wallet); await wallet.init();
if (coin.hasMnemonicPassphraseSupport && // TODO: [prio=high] finish fleshing this out
ref // if (coin.hasMnemonicPassphraseSupport &&
.read(pNewWalletOptions.state) // ref
.state != // .read(pNewWalletOptions.state)
null) { // .state !=
await manager.initializeNew(( // null) {
mnemonicPassphrase: ref // await manager.initializeNew((
.read(pNewWalletOptions.state) // mnemonicPassphrase: ref
.state! // .read(pNewWalletOptions.state)
.mnemonicPassphrase, // .state!
wordCount: ref // .mnemonicPassphrase,
.read(pNewWalletOptions.state) // wordCount: ref
.state! // .read(pNewWalletOptions.state)
.mnemonicWordsCount, // .state!
)); // .mnemonicWordsCount,
} else { // ));
await manager.initializeNew(null); // } else {
} // await manager.initializeNew(null);
// }
// pop progress dialog // pop progress dialog
if (mounted) { if (mounted) {
@ -531,8 +530,9 @@ class _NewWalletRecoveryPhraseWarningViewState
unawaited(Navigator.of(context).pushNamed( unawaited(Navigator.of(context).pushNamed(
NewWalletRecoveryPhraseView.routeName, NewWalletRecoveryPhraseView.routeName,
arguments: Tuple2( arguments: Tuple2(
manager, wallet.walletId,
await manager.mnemonic, await (wallet as Bip39Wallet)
.getMnemonicAsWords(),
), ),
)); ));
} }

View file

@ -32,10 +32,9 @@ import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/v
import 'package:stackwallet/pages/home_view/home_view.dart'; import 'package:stackwallet/pages/home_view/home_view.dart';
import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart'; import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/secure_store_provider.dart'; import 'package:stackwallet/providers/global/secure_store_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/coin_service.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/services/transaction_notification_tracker.dart'; import 'package:stackwallet/services/transaction_notification_tracker.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/address_utils.dart'; import 'package:stackwallet/utilities/address_utils.dart';
@ -50,6 +49,8 @@ import 'package:stackwallet/utilities/enums/form_input_status_enum.dart';
import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart'; import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
@ -239,13 +240,13 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
)); ));
} else { } else {
if (!Platform.isLinux) await Wakelock.enable(); if (!Platform.isLinux) await Wakelock.enable();
final walletsService = ref.read(walletsServiceChangeNotifierProvider);
final walletId = await walletsService.addNewWallet( final info = WalletInfo.createNew(
name: widget.walletName, coin: widget.coin,
coin: widget.coin, name: widget.walletName,
shouldNotifyListeners: false, );
);
bool isRestoring = true; bool isRestoring = true;
// show restoring in progress // show restoring in progress
unawaited(showDialog<dynamic>( unawaited(showDialog<dynamic>(
@ -256,12 +257,10 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
return RestoringDialog( return RestoringDialog(
onCancel: () async { onCancel: () async {
isRestoring = false; isRestoring = false;
ref.read(pWallets.notifier).removeWallet(walletId: walletId!);
await walletsService.deleteWallet( await ref.read(pWallets).deleteWallet(
widget.walletName, info.walletId,
false, );
);
}, },
); );
}, },
@ -279,49 +278,29 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
); );
} }
final txTracker = TransactionNotificationTracker(walletId: walletId!); final txTracker =
TransactionNotificationTracker(walletId: info.walletId);
final failovers = ref
.read(nodeServiceChangeNotifierProvider)
.failoverNodesFor(coin: widget.coin);
final wallet = CoinServiceAPI.from(
widget.coin,
walletId,
widget.walletName,
ref.read(secureStoreProvider),
node,
txTracker,
ref.read(prefsChangeNotifierProvider),
failovers,
);
final manager = Manager(wallet);
try { try {
// TODO GUI option to set maxUnusedAddressGap? final wallet = await Wallet.create(
// default is 20 but it may miss some transactions if walletInfo: info,
// the previous wallet software generated many addresses mainDB: ref.read(mainDBProvider),
// without using them secureStorageInterface: ref.read(secureStoreProvider),
await manager.recoverFromMnemonic( nodeService: ref.read(nodeServiceChangeNotifierProvider),
mnemonic: mnemonic, prefs: ref.read(prefsChangeNotifierProvider),
mnemonicPassphrase: widget.mnemonicPassphrase, mnemonicPassphrase: widget.mnemonicPassphrase,
maxUnusedAddressGap: widget.coin == Coin.firo ? 50 : 20, mnemonic: mnemonic,
maxNumberOfIndexesToCheck: 1000,
height: height,
); );
await wallet.recover(isRescan: false);
// check if state is still active before continuing // check if state is still active before continuing
if (mounted) { if (mounted) {
await ref await wallet.info.setMnemonicVerified(
.read(walletsServiceChangeNotifierProvider) isar: ref.read(mainDBProvider).isar,
.setMnemonicVerified( );
walletId: manager.walletId,
);
ref ref.read(pWallets).addWallet(wallet);
.read(pWallets.notifier)
.addWallet(walletId: manager.walletId, manager: manager);
final isCreateSpecialEthWallet = final isCreateSpecialEthWallet =
ref.read(createSpecialEthWalletRoutingFlag); ref.read(createSpecialEthWalletRoutingFlag);
@ -358,11 +337,11 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
(route) => false, (route) => false,
), ),
); );
if (manager.coin == Coin.ethereum) { if (info.coin == Coin.ethereum) {
unawaited( unawaited(
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
EditWalletTokensView.routeName, EditWalletTokensView.routeName,
arguments: manager.walletId, arguments: wallet.walletId,
), ),
); );
} }
@ -408,8 +387,8 @@ class _RestoreWalletViewState extends ConsumerState<RestoreWalletView> {
builder: (context) { builder: (context) {
return RestoreFailedDialog( return RestoreFailedDialog(
errorMessage: e.toString(), errorMessage: e.toString(),
walletId: wallet.walletId, walletId: info.walletId,
walletName: wallet.walletName, walletName: info.name,
); );
}, },
); );

View file

@ -63,12 +63,8 @@ class _RestoreFailedDialogState extends ConsumerState<RestoreFailedDialog> {
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
onPressed: () async { onPressed: () async {
ref.read(pWallets.notifier).removeWallet(walletId: walletId); await ref.read(pWallets).deleteWallet(walletId);
await ref.read(walletsServiceChangeNotifierProvider).deleteWallet(
walletName,
false,
);
if (mounted) { if (mounted) {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }

View file

@ -16,11 +16,10 @@ import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/eth_token_
import 'package:stackwallet/pages/add_wallet_views/add_token_view/edit_wallet_tokens_view.dart'; import 'package:stackwallet/pages/add_wallet_views/add_token_view/edit_wallet_tokens_view.dart';
import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart'; import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart';
import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart'; import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart';
import 'package:stackwallet/providers/global/wallets_service_provider.dart';
import 'package:stackwallet/services/wallets_service.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/all_wallets_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -54,8 +53,6 @@ class SelectWalletForTokenView extends ConsumerStatefulWidget {
class _SelectWalletForTokenViewState class _SelectWalletForTokenViewState
extends ConsumerState<SelectWalletForTokenView> { extends ConsumerState<SelectWalletForTokenView> {
final isDesktop = Util.isDesktop; final isDesktop = Util.isDesktop;
late final List<String> ethWalletIds;
bool _hasEthWallets = false;
String? _selectedWalletId; String? _selectedWalletId;
@ -77,18 +74,19 @@ class _SelectWalletForTokenViewState
); );
} }
late int _cachedWalletCount; @override
Widget build(BuildContext context) {
final ethWalletInfos = ref
.watch(pAllWalletsInfo)
.where((e) => e.coin == widget.entity.coin)
.toList();
void _updateWalletsList(Map<String, WalletInfo> walletsData) { final _hasEthWallets = ethWalletInfos.isNotEmpty;
_cachedWalletCount = walletsData.length;
walletsData.removeWhere((key, value) => value.coin != widget.entity.coin); final List<String> ethWalletIds = [];
ethWalletIds.clear();
_hasEthWallets = walletsData.isNotEmpty;
// TODO: proper wallet data class instead of this Hive silliness // TODO: proper wallet data class instead of this Hive silliness
for (final walletId in walletsData.values.map((e) => e.walletId).toList()) { for (final walletId in ethWalletInfos.map((e) => e.walletId).toList()) {
final walletContracts = DB.instance.get<dynamic>( final walletContracts = DB.instance.get<dynamic>(
boxName: walletId, boxName: walletId,
key: DBKeys.ethTokenContracts, key: DBKeys.ethTokenContracts,
@ -98,28 +96,6 @@ class _SelectWalletForTokenViewState
ethWalletIds.add(walletId); ethWalletIds.add(walletId);
} }
} }
}
@override
void initState() {
ethWalletIds = [];
final walletsData =
ref.read(walletsServiceChangeNotifierProvider).fetchWalletsData();
_updateWalletsList(walletsData);
super.initState();
}
@override
Widget build(BuildContext context) {
// dumb hack
ref.watch(newEthWalletTriggerTempUntilHiveCompletelyDeleted);
final walletsData =
ref.read(walletsServiceChangeNotifierProvider).fetchWalletsData();
if (walletsData.length != _cachedWalletCount) {
_updateWalletsList(walletsData);
}
return WillPopScope( return WillPopScope(
onWillPop: () async { onWillPop: () async {

View file

@ -24,14 +24,16 @@ import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/v
import 'package:stackwallet/pages/home_view/home_view.dart'; import 'package:stackwallet/pages/home_view/home_view.dart';
import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart'; import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart'; import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
@ -42,13 +44,13 @@ final createSpecialEthWalletRoutingFlag = StateProvider((ref) => false);
class VerifyRecoveryPhraseView extends ConsumerStatefulWidget { class VerifyRecoveryPhraseView extends ConsumerStatefulWidget {
const VerifyRecoveryPhraseView({ const VerifyRecoveryPhraseView({
Key? key, Key? key,
required this.manager, required this.wallet,
required this.mnemonic, required this.mnemonic,
}) : super(key: key); }) : super(key: key);
static const routeName = "/verifyRecoveryPhrase"; static const routeName = "/verifyRecoveryPhrase";
final Manager manager; final Wallet wallet;
final List<String> mnemonic; final List<String> mnemonic;
@override @override
@ -60,13 +62,13 @@ class _VerifyRecoveryPhraseViewState
extends ConsumerState<VerifyRecoveryPhraseView> extends ConsumerState<VerifyRecoveryPhraseView>
// with WidgetsBindingObserver // with WidgetsBindingObserver
{ {
late Manager _manager; late Wallet _wallet;
late List<String> _mnemonic; late List<String> _mnemonic;
late final bool isDesktop; late final bool isDesktop;
@override @override
void initState() { void initState() {
_manager = widget.manager; _wallet = widget.wallet;
_mnemonic = widget.mnemonic; _mnemonic = widget.mnemonic;
isDesktop = Util.isDesktop; isDesktop = Util.isDesktop;
// WidgetsBinding.instance?.addObserver(this); // WidgetsBinding.instance?.addObserver(this);
@ -119,13 +121,11 @@ class _VerifyRecoveryPhraseViewState
} }
} }
await ref.read(walletsServiceChangeNotifierProvider).setMnemonicVerified( await ref.read(pWalletInfo(_wallet.walletId)).setMnemonicVerified(
walletId: _manager.walletId, isar: ref.read(mainDBProvider).isar,
); );
ref ref.read(pWallets).addWallet(_wallet);
.read(pWallets.notifier)
.addWallet(walletId: _manager.walletId, manager: _manager);
final isCreateSpecialEthWallet = final isCreateSpecialEthWallet =
ref.read(createSpecialEthWalletRoutingFlag); ref.read(createSpecialEthWalletRoutingFlag);
@ -153,11 +153,11 @@ class _VerifyRecoveryPhraseViewState
DesktopHomeView.routeName, DesktopHomeView.routeName,
), ),
); );
if (widget.manager.coin == Coin.ethereum) { if (widget.wallet.info.coin == Coin.ethereum) {
unawaited( unawaited(
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
EditWalletTokensView.routeName, EditWalletTokensView.routeName,
arguments: widget.manager.walletId, arguments: widget.wallet.walletId,
), ),
); );
} }
@ -176,11 +176,11 @@ class _VerifyRecoveryPhraseViewState
(route) => false, (route) => false,
), ),
); );
if (widget.manager.coin == Coin.ethereum) { if (widget.wallet.info.coin == Coin.ethereum) {
unawaited( unawaited(
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
EditWalletTokensView.routeName, EditWalletTokensView.routeName,
arguments: widget.manager.walletId, arguments: widget.wallet.walletId,
), ),
); );
} }
@ -260,10 +260,8 @@ class _VerifyRecoveryPhraseViewState
} }
Future<void> delete() async { Future<void> delete() async {
await ref await _wallet.exit();
.read(walletsServiceChangeNotifierProvider) await ref.read(pWallets).deleteWallet(_wallet.walletId);
.deleteWallet(_manager.walletName, false);
await _manager.exitCurrentWallet();
} }
@override @override

View file

@ -79,14 +79,14 @@ class _AddressBookViewState extends ConsumerState<AddressBookView> {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
List<ContactAddressEntry> addresses = []; List<ContactAddressEntry> addresses = [];
final managers = ref.read(pWallets).managers; final wallets = ref.read(pWallets).wallets;
for (final manager in managers) { for (final wallet in wallets) {
addresses.add( addresses.add(
ContactAddressEntry() ContactAddressEntry()
..coinName = manager.coin.name ..coinName = wallet.info.coin.name
..address = await manager.currentReceivingAddress ..address = (await wallet.getCurrentReceivingAddress())!.value
..label = "Current Receiving" ..label = "Current Receiving"
..other = manager.walletName, ..other = wallet.info.name,
); );
} }
final self = ContactEntry( final self = ContactEntry(

View file

@ -15,16 +15,14 @@ import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/address_book_views/subviews/add_new_contact_address_view.dart'; import 'package:stackwallet/pages/address_book_views/subviews/add_new_contact_address_view.dart';
import 'package:stackwallet/pages/address_book_views/subviews/edit_contact_address_view.dart'; import 'package:stackwallet/pages/address_book_views/subviews/edit_contact_address_view.dart';
import 'package:stackwallet/pages/address_book_views/subviews/edit_contact_name_emoji_view.dart'; import 'package:stackwallet/pages/address_book_views/subviews/edit_contact_name_emoji_view.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/address_book_service_provider.dart'; import 'package:stackwallet/providers/global/address_book_service_provider.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart'; import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
@ -63,29 +61,33 @@ class _ContactDetailsViewState extends ConsumerState<ContactDetailsView> {
List<Tuple2<String, Transaction>> _cachedTransactions = []; List<Tuple2<String, Transaction>> _cachedTransactions = [];
Future<List<Tuple2<String, Transaction>>> _filteredTransactionsByContact( Future<List<Tuple2<String, Transaction>>>
List<Manager> managers, _filteredTransactionsByContact() async {
) async {
final contact = final contact =
ref.read(addressBookServiceProvider).getContactById(_contactId); ref.read(addressBookServiceProvider).getContactById(_contactId);
// TODO: optimise // TODO: optimise
List<Tuple2<String, Transaction>> result = []; final transactions = await ref
for (final manager in managers) { .read(mainDBProvider)
final transactions = await MainDB.instance .isar
.getTransactions(manager.walletId) .transactions
.filter() .where()
.anyOf(contact.addresses.map((e) => e.address), .filter()
(q, String e) => q.address((q) => q.valueEqualTo(e))) .anyOf(contact.addresses.map((e) => e.address),
.sortByTimestampDesc() (q, String e) => q.address((q) => q.valueEqualTo(e)))
.findAll(); .sortByTimestampDesc()
.findAll();
for (final tx in transactions) { List<Tuple2<String, Transaction>> result = [];
result.add(Tuple2(manager.walletId, tx));
} for (final tx in transactions) {
result.add(Tuple2(tx.walletId, tx));
} }
// sort by date
result.sort((a, b) => b.item2.timestamp - a.item2.timestamp);
return result; return result;
} }
@ -461,8 +463,7 @@ class _ContactDetailsViewState extends ConsumerState<ContactDetailsView> {
height: 12, height: 12,
), ),
FutureBuilder( FutureBuilder(
future: _filteredTransactionsByContact( future: _filteredTransactionsByContact(),
ref.watch(pWallets).managers),
builder: (_, builder: (_,
AsyncSnapshot<List<Tuple2<String, Transaction>>> AsyncSnapshot<List<Tuple2<String, Transaction>>>
snapshot) { snapshot) {

View file

@ -19,6 +19,7 @@ import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/address_book_views/subviews/contact_details_view.dart'; import 'package:stackwallet/pages/address_book_views/subviews/contact_details_view.dart';
import 'package:stackwallet/pages/exchange_view/exchange_step_views/step_2_view.dart'; import 'package:stackwallet/pages/exchange_view/exchange_step_views/step_2_view.dart';
import 'package:stackwallet/pages/send_view/send_view.dart'; import 'package:stackwallet/pages/send_view/send_view.dart';
import 'package:stackwallet/providers/global/active_wallet_provider.dart';
import 'package:stackwallet/providers/global/address_book_service_provider.dart'; import 'package:stackwallet/providers/global/address_book_service_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
@ -28,6 +29,7 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/rounded_container.dart'; import 'package:stackwallet/widgets/rounded_container.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -51,21 +53,15 @@ class ContactPopUp extends ConsumerWidget {
final contact = ref.watch(addressBookServiceProvider final contact = ref.watch(addressBookServiceProvider
.select((value) => value.getContactById(contactId))); .select((value) => value.getContactById(contactId)));
final active = ref final active = ref.read(currentWalletIdProvider);
.read(pWallets)
.managers
.where((e) => e.isActiveWallet)
.toList(growable: false);
assert(active.isEmpty || active.length == 1); bool hasActiveWallet = active != null;
bool hasActiveWallet = active.length == 1;
bool isExchangeFlow = bool isExchangeFlow =
ref.watch(exchangeFlowIsActiveStateProvider.state).state; ref.watch(exchangeFlowIsActiveStateProvider.state).state;
final addresses = contact.addressesSorted.where((e) { final addresses = contact.addressesSorted.where((e) {
if (hasActiveWallet && !isExchangeFlow) { if (hasActiveWallet && !isExchangeFlow) {
return e.coin == active[0].coin; return e.coin == ref.watch(pWalletCoin(active));
} else { } else {
return true; return true;
} }
@ -201,7 +197,7 @@ class ContactPopUp extends ConsumerWidget {
child: RoundedWhiteContainer( child: RoundedWhiteContainer(
child: Center( child: Center(
child: Text( child: Text(
"No ${active[0].coin.prettyName} addresses found", "No ${ref.watch(pWalletCoin(active!)).prettyName} addresses found",
style: style:
STextStyles.itemSubtitle(context), STextStyles.itemSubtitle(context),
), ),
@ -372,8 +368,9 @@ class ContactPopUp extends ConsumerWidget {
.pushNamed( .pushNamed(
SendView.routeName, SendView.routeName,
arguments: Tuple3( arguments: Tuple3(
active[0].walletId, active,
active[0].coin, ref.read(
pWalletCoin(active)),
SendViewAutoFillData( SendViewAutoFillData(
address: address, address: address,
contactLabel: contactLabel:

View file

@ -1160,14 +1160,14 @@ class _BuyFormState extends ConsumerState<BuyForm> {
) )
.then((value) async { .then((value) async {
if (value is String) { if (value is String) {
final manager = final wallet = ref.read(pWallets).getWallet(value);
ref.read(pWallets).getManager(value);
// _toController.text = manager.walletName; // _toController.text = manager.walletName;
// model.recipientAddress = // model.recipientAddress =
// await manager.currentReceivingAddress; // await manager.currentReceivingAddress;
_receiveAddressController.text = _receiveAddressController.text =
await manager.currentReceivingAddress; (await wallet.getCurrentReceivingAddress())!
.value;
setState(() { setState(() {
_addressToggleFlag = _addressToggleFlag =

View file

@ -61,8 +61,8 @@ class _CashFusionViewState extends ConsumerState<CashFusionView> {
FusionOption _option = FusionOption.continuous; FusionOption _option = FusionOption.continuous;
Future<void> _startFusion() async { Future<void> _startFusion() async {
final fusionWallet = ref.read(pWallets).getManager(widget.walletId).wallet final fusionWallet =
as FusionWalletInterface; ref.read(pWallets).getWallet(widget.walletId) as FusionWalletInterface;
try { try {
fusionWallet.uiState = ref.read( fusionWallet.uiState = ref.read(

View file

@ -67,7 +67,7 @@ class _FusionProgressViewState extends ConsumerState<FusionProgressView> {
); );
if (shouldCancel == true && mounted) { if (shouldCancel == true && mounted) {
final fusionWallet = ref.read(pWallets).getManager(widget.walletId).wallet final fusionWallet = ref.read(pWallets).getWallet(widget.walletId)
as FusionWalletInterface; as FusionWalletInterface;
await showLoading( await showLoading(
@ -223,8 +223,8 @@ class _FusionProgressViewState extends ConsumerState<FusionProgressView> {
/// Fuse again. /// Fuse again.
void _fuseAgain() async { void _fuseAgain() async {
final fusionWallet = ref.read(pWallets).getManager(widget.walletId).wallet final fusionWallet =
as FusionWalletInterface; ref.read(pWallets).getWallet(widget.walletId) as FusionWalletInterface;
final fusionInfo = ref.read(prefsChangeNotifierProvider).fusionServerInfo; final fusionInfo = ref.read(prefsChangeNotifierProvider).fusionServerInfo;

View file

@ -27,6 +27,7 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart'; import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart';
import 'package:stackwallet/widgets/app_bar_field.dart'; import 'package:stackwallet/widgets/app_bar_field.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
@ -82,10 +83,8 @@ class _CoinControlViewState extends ConsumerState<CoinControlView> {
final Set<UTXO> _selectedBlocked = {}; final Set<UTXO> _selectedBlocked = {};
Future<void> _refreshBalance() async { Future<void> _refreshBalance() async {
final coinControlInterface = ref final coinControlInterface =
.read(pWallets) ref.read(pWallets).getWallet(widget.walletId) as CoinControlInterface;
.getManager(widget.walletId)
.wallet as CoinControlInterface;
await coinControlInterface.refreshBalance(notify: true); await coinControlInterface.refreshBalance(notify: true);
} }
@ -113,25 +112,8 @@ class _CoinControlViewState extends ConsumerState<CoinControlView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select( final currentHeight = ref.watch(pWalletChainHeight(widget.walletId));
(value) => value
.getManager(
widget.walletId,
)
.coin,
),
);
final currentChainHeight = ref.watch(
pWallets.select(
(value) => value
.getManager(
widget.walletId,
)
.currentHeight,
),
);
if (_sort == CCSortDescriptor.address && !_isSearching) { if (_sort == CCSortDescriptor.address && !_isSearching) {
_list = null; _list = null;
@ -357,7 +339,7 @@ class _CoinControlViewState extends ConsumerState<CoinControlView> {
(widget.type == CoinControlViewType.use && (widget.type == CoinControlViewType.use &&
!utxo.isBlocked && !utxo.isBlocked &&
utxo.isConfirmed( utxo.isConfirmed(
currentChainHeight, currentHeight,
coin.requiredConfirmations, coin.requiredConfirmations,
)), )),
initialSelectedState: isSelected, initialSelectedState: isSelected,
@ -420,7 +402,7 @@ class _CoinControlViewState extends ConsumerState<CoinControlView> {
CoinControlViewType.use && CoinControlViewType.use &&
!_showBlocked && !_showBlocked &&
utxo.isConfirmed( utxo.isConfirmed(
currentChainHeight, currentHeight,
coin.requiredConfirmations, coin.requiredConfirmations,
)), )),
initialSelectedState: isSelected, initialSelectedState: isSelected,
@ -562,7 +544,7 @@ class _CoinControlViewState extends ConsumerState<CoinControlView> {
.use && .use &&
!utxo.isBlocked && !utxo.isBlocked &&
utxo.isConfirmed( utxo.isConfirmed(
currentChainHeight, currentHeight,
coin.requiredConfirmations, coin.requiredConfirmations,
)), )),
initialSelectedState: isSelected, initialSelectedState: isSelected,

View file

@ -12,12 +12,13 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/db/isar/main_db.dart'; import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/icon_widgets/utxo_status_icon.dart'; import 'package:stackwallet/widgets/icon_widgets/utxo_status_icon.dart';
import 'package:stackwallet/widgets/rounded_container.dart'; import 'package:stackwallet/widgets/rounded_container.dart';
@ -63,11 +64,8 @@ class _UtxoCardState extends ConsumerState<UtxoCard> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select((value) => value.getManager(widget.walletId).coin)); final currentHeight = ref.watch(pWalletChainHeight(widget.walletId));
final currentChainHeight = ref.watch(pWallets
.select((value) => value.getManager(widget.walletId).currentHeight));
return ConditionalParent( return ConditionalParent(
condition: widget.onPressed != null, condition: widget.onPressed != null,
@ -112,7 +110,7 @@ class _UtxoCardState extends ConsumerState<UtxoCard> {
child: UTXOStatusIcon( child: UTXOStatusIcon(
blocked: utxo.isBlocked, blocked: utxo.isBlocked,
status: utxo.isConfirmed( status: utxo.isConfirmed(
currentChainHeight, currentHeight,
coin.requiredConfirmations, coin.requiredConfirmations,
) )
? UTXOStatusIconStatus.confirmed ? UTXOStatusIconStatus.confirmed

View file

@ -16,12 +16,13 @@ import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart'; import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -90,17 +91,8 @@ class _UtxoDetailsViewState extends ConsumerState<UtxoDetailsView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select( final currentHeight = ref.watch(pWalletChainHeight(widget.walletId));
(value) => value.getManager(widget.walletId).coin,
),
);
final currentHeight = ref.watch(
pWallets.select(
(value) => value.getManager(widget.walletId).currentHeight,
),
);
final confirmed = utxo!.isConfirmed( final confirmed = utxo!.isConfirmed(
currentHeight, currentHeight,

View file

@ -15,6 +15,7 @@ import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
@ -48,7 +49,11 @@ class _ChooseFromStackViewState extends ConsumerState<ChooseFromStackView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final walletIds = ref final walletIds = ref
.watch(pWallets.select((value) => value.getWalletIdsFor(coin: coin))); .watch(pWallets)
.wallets
.where((e) => e.info.coin == coin)
.map((e) => e.walletId)
.toList();
return Background( return Background(
child: Scaffold( child: Scaffold(
@ -78,8 +83,7 @@ class _ChooseFromStackViewState extends ConsumerState<ChooseFromStackView> {
: ListView.builder( : ListView.builder(
itemCount: walletIds.length, itemCount: walletIds.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final manager = ref.watch(pWallets final walletId = walletIds[index];
.select((value) => value.getManager(walletIds[index])));
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 5.0), padding: const EdgeInsets.symmetric(vertical: 5.0),
@ -98,7 +102,7 @@ class _ChooseFromStackViewState extends ConsumerState<ChooseFromStackView> {
elevation: 0, elevation: 0,
onPressed: () async { onPressed: () async {
if (mounted) { if (mounted) {
Navigator.of(context).pop(manager.walletId); Navigator.of(context).pop(walletId);
} }
}, },
child: RoundedWhiteContainer( child: RoundedWhiteContainer(
@ -115,7 +119,7 @@ class _ChooseFromStackViewState extends ConsumerState<ChooseFromStackView> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
manager.walletName, ref.watch(pWalletName(walletId)),
style: STextStyles.titleBold12(context), style: STextStyles.titleBold12(context),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),

View file

@ -20,14 +20,16 @@ import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_auth_send.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_auth_send.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
import 'package:stackwallet/utilities/constants.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/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -43,7 +45,7 @@ import 'package:uuid/uuid.dart';
class ConfirmChangeNowSendView extends ConsumerStatefulWidget { class ConfirmChangeNowSendView extends ConsumerStatefulWidget {
const ConfirmChangeNowSendView({ const ConfirmChangeNowSendView({
Key? key, Key? key,
required this.transactionInfo, required this.txData,
required this.walletId, required this.walletId,
this.routeOnSuccessName = WalletView.routeName, this.routeOnSuccessName = WalletView.routeName,
required this.trade, required this.trade,
@ -53,7 +55,7 @@ class ConfirmChangeNowSendView extends ConsumerStatefulWidget {
static const String routeName = "/confirmChangeNowSend"; static const String routeName = "/confirmChangeNowSend";
final Map<String, dynamic> transactionInfo; final TxData txData;
final String walletId; final String walletId;
final String routeOnSuccessName; final String routeOnSuccessName;
final Trade trade; final Trade trade;
@ -67,7 +69,6 @@ class ConfirmChangeNowSendView extends ConsumerStatefulWidget {
class _ConfirmChangeNowSendViewState class _ConfirmChangeNowSendViewState
extends ConsumerState<ConfirmChangeNowSendView> { extends ConsumerState<ConfirmChangeNowSendView> {
late final Map<String, dynamic> transactionInfo;
late final String walletId; late final String walletId;
late final String routeOnSuccessName; late final String routeOnSuccessName;
late final Trade trade; late final Trade trade;
@ -75,7 +76,8 @@ class _ConfirmChangeNowSendViewState
final isDesktop = Util.isDesktop; final isDesktop = Util.isDesktop;
Future<void> _attemptSend(BuildContext context) async { Future<void> _attemptSend(BuildContext context) async {
final manager = ref.read(pWallets).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
final coin = wallet.info.coin;
final sendProgressController = ProgressAndSuccessController(); final sendProgressController = ProgressAndSuccessController();
@ -86,7 +88,7 @@ class _ConfirmChangeNowSendViewState
barrierDismissible: false, barrierDismissible: false,
builder: (context) { builder: (context) {
return SendingTransactionDialog( return SendingTransactionDialog(
coin: manager.coin, coin: coin,
controller: sendProgressController, controller: sendProgressController,
); );
}, },
@ -100,19 +102,21 @@ class _ConfirmChangeNowSendViewState
); );
late String txid; late String txid;
Future<String> txidFuture; Future<TxData> txidFuture;
final String note = transactionInfo["note"] as String? ?? ""; final String note = widget.txData.note ?? "";
try { try {
if (widget.shouldSendPublicFiroFunds == true) { if (widget.shouldSendPublicFiroFunds == true) {
txidFuture = (manager.wallet as FiroWallet) // TODO: [prio=high] fixme
.confirmSendPublic(txData: transactionInfo); throw UnimplementedError("fixme");
// txidFuture = (wallet as FiroWallet)
// .confirmSendPublic(txData: widget.txData);
} else { } else {
txidFuture = manager.confirmSend(txData: transactionInfo); txidFuture = wallet.confirmSend(txData: widget.txData);
} }
unawaited(manager.refresh()); unawaited(wallet.refresh());
final results = await Future.wait([ final results = await Future.wait([
txidFuture, txidFuture,
@ -122,7 +126,7 @@ class _ConfirmChangeNowSendViewState
sendProgressController.triggerSuccess?.call(); sendProgressController.triggerSuccess?.call();
await Future<void>.delayed(const Duration(seconds: 5)); await Future<void>.delayed(const Duration(seconds: 5));
txid = results.first as String; txid = (results.first as TxData).txid!;
// save note // save note
await ref await ref
@ -197,7 +201,7 @@ class _ConfirmChangeNowSendViewState
Future<void> _confirmSend() async { Future<void> _confirmSend() async {
final dynamic unlocked; final dynamic unlocked;
final coin = ref.read(pWallets).getManager(walletId).coin; final coin = ref.read(pWalletCoin(walletId));
if (Util.isDesktop) { if (Util.isDesktop) {
unlocked = await showDialog<bool?>( unlocked = await showDialog<bool?>(
@ -254,7 +258,6 @@ class _ConfirmChangeNowSendViewState
@override @override
void initState() { void initState() {
transactionInfo = widget.transactionInfo;
walletId = widget.walletId; walletId = widget.walletId;
routeOnSuccessName = widget.routeOnSuccessName; routeOnSuccessName = widget.routeOnSuccessName;
trade = widget.trade; trade = widget.trade;
@ -263,9 +266,6 @@ class _ConfirmChangeNowSendViewState
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final managerProvider = ref
.watch(pWallets.select((value) => value.getManagerProvider(walletId)));
return ConditionalParent( return ConditionalParent(
condition: !isDesktop, condition: !isDesktop,
builder: (child) { builder: (child) {
@ -337,7 +337,7 @@ class _ConfirmChangeNowSendViewState
width: 12, width: 12,
), ),
Text( Text(
"Confirm ${ref.watch(managerProvider.select((value) => value.coin)).ticker} transaction", "Confirm ${ref.watch(pWalletCoin(walletId)).ticker} transaction",
style: STextStyles.desktopH3(context), style: STextStyles.desktopH3(context),
) )
], ],
@ -381,18 +381,9 @@ class _ConfirmChangeNowSendViewState
children: [ children: [
Text( Text(
ref ref
.watch(pAmountFormatter(ref.watch( .watch(pAmountFormatter(
managerProvider.select((value) => value.coin), ref.watch(pWalletCoin(walletId))))
))) .format(widget.txData.fee!),
.format(transactionInfo["fee"] is Amount
? transactionInfo["fee"] as Amount
: (transactionInfo["fee"] as int)
.toAmountAsRaw(
fractionDigits: ref.watch(
managerProvider.select(
(value) => value.coin.decimals),
),
)),
style: style:
STextStyles.desktopTextExtraExtraSmall(context) STextStyles.desktopTextExtraExtraSmall(context)
.copyWith( .copyWith(
@ -424,17 +415,9 @@ class _ConfirmChangeNowSendViewState
), ),
Builder( Builder(
builder: (context) { builder: (context) {
final coin = ref.watch( final coin = ref.read(pWalletCoin(walletId));
managerProvider.select((value) => value.coin), final fee = widget.txData.fee!;
); final amount = widget.txData.amount!;
final fee = transactionInfo["fee"] is Amount
? transactionInfo["fee"] as Amount
: (transactionInfo["fee"] as int)
.toAmountAsRaw(
fractionDigits: coin.decimals,
);
final amount =
transactionInfo["recipientAmt"] as Amount;
final total = amount + fee; final total = amount + fee;
return Text( return Text(
@ -506,7 +489,7 @@ class _ConfirmChangeNowSendViewState
), ),
), ),
child: Text( child: Text(
"Send ${ref.watch(managerProvider.select((value) => value.coin)).ticker}", "Send ${ref.watch(pWalletCoin(walletId)).ticker}",
style: isDesktop style: isDesktop
? STextStyles.desktopTextMedium(context) ? STextStyles.desktopTextMedium(context)
: STextStyles.pageTitleH1(context), : STextStyles.pageTitleH1(context),
@ -533,7 +516,7 @@ class _ConfirmChangeNowSendViewState
height: 4, height: 4,
), ),
Text( Text(
ref.watch(pWallets).getManager(walletId).walletName, ref.watch(pWalletName(walletId)),
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
], ],
@ -560,7 +543,7 @@ class _ConfirmChangeNowSendViewState
height: 4, height: 4,
), ),
Text( Text(
"${transactionInfo["address"] ?? "ERROR"}", widget.txData.recipients!.first.address,
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
], ],
@ -589,13 +572,11 @@ class _ConfirmChangeNowSendViewState
children: [ children: [
child, child,
Builder(builder: (context) { Builder(builder: (context) {
final coin = ref.watch(pWallets.select( final coin = ref.watch(pWalletCoin(walletId));
(value) => value.getManager(walletId).coin));
final price = ref.watch( final price = ref.watch(
priceAnd24hChangeNotifierProvider priceAnd24hChangeNotifierProvider
.select((value) => value.getPrice(coin))); .select((value) => value.getPrice(coin)));
final amount = final amount = widget.txData.amount!;
transactionInfo["recipientAmt"] as Amount;
final value = (price.item1 * amount.decimal) final value = (price.item1 * amount.decimal)
.toAmount(fractionDigits: 2); .toAmount(fractionDigits: 2);
final currency = ref.watch(prefsChangeNotifierProvider final currency = ref.watch(prefsChangeNotifierProvider
@ -621,9 +602,9 @@ class _ConfirmChangeNowSendViewState
), ),
child: Text( child: Text(
ref ref
.watch(pAmountFormatter(ref.watch(pWallets.select( .watch(pAmountFormatter(
(value) => value.getManager(walletId).coin)))) ref.watch(pWalletCoin(walletId))))
.format((transactionInfo["recipientAmt"] as Amount)), .format((widget.txData.amount!)),
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
textAlign: TextAlign.right, textAlign: TextAlign.right,
), ),
@ -650,18 +631,10 @@ class _ConfirmChangeNowSendViewState
), ),
Text( Text(
ref ref
.watch(pAmountFormatter(ref.watch( .watch(
managerProvider.select((value) => value.coin), pAmountFormatter(ref.read(pWalletCoin(walletId))))
)))
.format( .format(
(transactionInfo["fee"] is Amount widget.txData.fee!,
? transactionInfo["fee"] as Amount
: (transactionInfo["fee"] as int).toAmountAsRaw(
fractionDigits: ref.watch(
managerProvider.select(
(value) => value.coin.decimals,
),
))),
), ),
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
textAlign: TextAlign.right, textAlign: TextAlign.right,
@ -690,7 +663,7 @@ class _ConfirmChangeNowSendViewState
height: 4, height: 4,
), ),
Text( Text(
transactionInfo["note"] as String? ?? "", widget.txData.note ?? "",
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
], ],
@ -743,16 +716,9 @@ class _ConfirmChangeNowSendViewState
), ),
Builder( Builder(
builder: (context) { builder: (context) {
final coin = ref.watch( final coin = ref.watch(pWalletCoin(walletId));
managerProvider.select((value) => value.coin), final fee = widget.txData.fee!;
); final amount = widget.txData.amount!;
final fee = transactionInfo["fee"] is Amount
? transactionInfo["fee"] as Amount
: (transactionInfo["fee"] as int).toAmountAsRaw(
fractionDigits: coin.decimals,
);
final amount =
transactionInfo["recipientAmt"] as Amount;
final total = amount + fee; final total = amount + fee;
return Text( return Text(

View file

@ -97,10 +97,10 @@ class _Step2ViewState extends ConsumerState<Step2View> {
tuple.item2.ticker.toLowerCase()) { tuple.item2.ticker.toLowerCase()) {
ref ref
.read(pWallets) .read(pWallets)
.getManager(tuple.item1) .getWallet(tuple.item1)
.currentReceivingAddress .getCurrentReceivingAddress()
.then((value) { .then((value) {
_toController.text = value; _toController.text = value!.value;
model.recipientAddress = _toController.text; model.recipientAddress = _toController.text;
}); });
} else { } else {
@ -108,10 +108,10 @@ class _Step2ViewState extends ConsumerState<Step2View> {
tuple.item2.ticker.toUpperCase()) { tuple.item2.ticker.toUpperCase()) {
ref ref
.read(pWallets) .read(pWallets)
.getManager(tuple.item1) .getWallet(tuple.item1)
.currentReceivingAddress .getCurrentReceivingAddress()
.then((value) { .then((value) {
_refundController.text = value; _refundController.text = value!.value;
model.refundAddress = _refundController.text; model.refundAddress = _refundController.text;
}); });
} }
@ -218,14 +218,14 @@ class _Step2ViewState extends ConsumerState<Step2View> {
) )
.then((value) async { .then((value) async {
if (value is String) { if (value is String) {
final manager = ref final wallet = ref
.read(pWallets) .read(pWallets)
.getManager(value); .getWallet(value);
_toController.text = _toController.text = wallet.info.name;
manager.walletName; model.recipientAddress = (await wallet
model.recipientAddress = await manager .getCurrentReceivingAddress())!
.currentReceivingAddress; .value;
setState(() { setState(() {
enableNext = enableNext =
@ -489,14 +489,15 @@ class _Step2ViewState extends ConsumerState<Step2View> {
) )
.then((value) async { .then((value) async {
if (value is String) { if (value is String) {
final manager = ref final wallet = ref
.read(pWallets) .read(pWallets)
.getManager(value); .getWallet(value);
_refundController.text = _refundController.text =
manager.walletName; wallet.info.name;
model.refundAddress = await manager model.refundAddress = (await wallet
.currentReceivingAddress; .getCurrentReceivingAddress())!
.value;
} }
setState(() { setState(() {
enableNext = enableNext =

View file

@ -35,6 +35,7 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart'; import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/secondary_button.dart'; import 'package:stackwallet/widgets/desktop/secondary_button.dart';
@ -72,8 +73,8 @@ class _Step4ViewState extends ConsumerState<Step4View> {
final coin = coinFromTickerCaseInsensitive(ticker); final coin = coinFromTickerCaseInsensitive(ticker);
return ref return ref
.read(pWallets) .read(pWallets)
.managers .wallets
.where((element) => element.coin == coin) .where((e) => e.info.coin == coin)
.isNotEmpty; .isNotEmpty;
} catch (_) { } catch (_) {
return false; return false;
@ -134,8 +135,7 @@ class _Step4ViewState extends ConsumerState<Step4View> {
} }
Future<bool?> _showSendFromFiroBalanceSelectSheet(String walletId) async { Future<bool?> _showSendFromFiroBalanceSelectSheet(String walletId) async {
final firoWallet = final firoWallet = ref.read(pWallets).getWallet(walletId) as FiroWallet;
ref.read(pWallets).getManager(walletId).wallet as FiroWallet;
final locale = ref.read(localeServiceChangeNotifierProvider).locale; final locale = ref.read(localeServiceChangeNotifierProvider).locale;
return await showModalBottomSheet<bool?>( return await showModalBottomSheet<bool?>(
@ -204,10 +204,10 @@ class _Step4ViewState extends ConsumerState<Step4View> {
firoPublicSend = false; firoPublicSend = false;
} }
final manager = ref.read(pWallets).getManager(tuple.item1); final wallet = ref.read(pWallets).getWallet(tuple.item1);
final Amount amount = model.sendAmount.toAmount( final Amount amount = model.sendAmount.toAmount(
fractionDigits: manager.coin.decimals, fractionDigits: wallet.info.coin.decimals,
); );
final address = model.trade!.payInAddress; final address = model.trade!.payInAddress;
@ -222,7 +222,7 @@ class _Step4ViewState extends ConsumerState<Step4View> {
barrierDismissible: false, barrierDismissible: false,
builder: (context) { builder: (context) {
return BuildingTransactionDialog( return BuildingTransactionDialog(
coin: manager.coin, coin: wallet.info.coin,
onCancel: () { onCancel: () {
wasCancelled = true; wasCancelled = true;
}, },
@ -237,32 +237,36 @@ class _Step4ViewState extends ConsumerState<Step4View> {
), ),
); );
Future<Map<String, dynamic>> txDataFuture; Future<TxData> txDataFuture;
if (firoPublicSend) { if (firoPublicSend) {
txDataFuture = (manager.wallet as FiroWallet).prepareSendPublic( // TODO: [prio=high]
address: address, throw UnimplementedError();
amount: amount, // txDataFuture = (wallet as FiroWallet).prepareSendPublic(
args: { // address: address,
"feeRate": FeeRateType.average, // amount: amount,
// ref.read(feeRateTypeStateProvider) // args: {
}, // "feeRate": FeeRateType.average,
); // // ref.read(feeRateTypeStateProvider)
// },
// );
} else { } else {
final memo = final memo = wallet.info.coin == Coin.stellar ||
manager.coin == Coin.stellar || manager.coin == Coin.stellarTestnet wallet.info.coin == Coin.stellarTestnet
? model.trade!.payInExtraId.isNotEmpty ? model.trade!.payInExtraId.isNotEmpty
? model.trade!.payInExtraId ? model.trade!.payInExtraId
: null : null
: null; : null;
txDataFuture = manager.prepareSend( txDataFuture = wallet.prepareSend(
address: address, txData: TxData(
amount: amount, recipients: [
args: { (address: address, amount: amount),
"memo": memo, ],
"feeRate": FeeRateType.average, memo: memo,
// ref.read(feeRateTypeStateProvider) feeRateType: FeeRateType.average,
}, note: "${model.trade!.payInCurrency.toUpperCase()}/"
"${model.trade!.payOutCurrency.toUpperCase()} exchange",
),
); );
} }
@ -271,7 +275,7 @@ class _Step4ViewState extends ConsumerState<Step4View> {
time, time,
]); ]);
final txData = results.first as Map<String, dynamic>; final txData = results.first as TxData;
if (!wasCancelled) { if (!wasCancelled) {
// pop building dialog // pop building dialog
@ -280,17 +284,13 @@ class _Step4ViewState extends ConsumerState<Step4View> {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
txData["note"] =
"${model.trade!.payInCurrency.toUpperCase()}/${model.trade!.payOutCurrency.toUpperCase()} exchange";
txData["address"] = address;
if (mounted) { if (mounted) {
unawaited( unawaited(
Navigator.of(context).push( Navigator.of(context).push(
RouteGenerator.getRoute( RouteGenerator.getRoute(
shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute, shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute,
builder: (_) => ConfirmChangeNowSendView( builder: (_) => ConfirmChangeNowSendView(
transactionInfo: txData, txData: txData,
walletId: tuple.item1, walletId: tuple.item1,
routeOnSuccessName: HomeView.routeName, routeOnSuccessName: HomeView.routeName,
trade: model.trade!, trade: model.trade!,
@ -813,8 +813,9 @@ class _Step4ViewState extends ConsumerState<Step4View> {
tuple.item2.ticker.toLowerCase()) { tuple.item2.ticker.toLowerCase()) {
final walletName = ref final walletName = ref
.read(pWallets) .read(pWallets)
.getManager(tuple.item1) .getWallet(tuple.item1)
.walletName; .info
.name;
buttonTitle = "Send from $walletName"; buttonTitle = "Send from $walletName";
} }

View file

@ -195,9 +195,9 @@ class _ExchangeViewState extends ConsumerState<ExchangeView> {
if (txid != null && if (txid != null &&
walletIds != null && walletIds != null &&
walletIds.isNotEmpty) { walletIds.isNotEmpty) {
final manager = ref final wallet = ref
.read(pWallets) .read(pWallets)
.getManager(walletIds.first); .getWallet(walletIds.first);
//todo: check if print needed //todo: check if print needed
// debugPrint("name: ${manager.walletName}"); // debugPrint("name: ${manager.walletName}");
@ -212,7 +212,7 @@ class _ExchangeViewState extends ConsumerState<ExchangeView> {
unawaited(Navigator.of(context).pushNamed( unawaited(Navigator.of(context).pushNamed(
TradeDetailsView.routeName, TradeDetailsView.routeName,
arguments: Tuple4(tradeId, tx, arguments: Tuple4(tradeId, tx,
walletIds.first, manager.walletName), walletIds.first, wallet.info.name),
)); ));
} }
} else { } else {

View file

@ -22,7 +22,6 @@ import 'package:stackwallet/pages_desktop_specific/desktop_exchange/desktop_exch
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart'; import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
@ -33,6 +32,8 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart'; import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -86,7 +87,11 @@ class _SendFromViewState extends ConsumerState<SendFromView> {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final walletIds = ref final walletIds = ref
.watch(pWallets.select((value) => value.getWalletIdsFor(coin: coin))); .watch(pWallets)
.wallets
.where((e) => e.info.coin == coin)
.map((e) => e.walletId)
.toList();
final isDesktop = Util.isDesktop; final isDesktop = Util.isDesktop;
@ -224,7 +229,9 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
late final String address; late final String address;
late final Trade trade; late final Trade trade;
Future<void> _send(Manager manager, {bool? shouldSendPublicFiroFunds}) async { Future<void> _send({bool? shouldSendPublicFiroFunds}) async {
final coin = ref.read(pWalletCoin(walletId));
try { try {
bool wasCancelled = false; bool wasCancelled = false;
@ -245,7 +252,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
), ),
), ),
child: BuildingTransactionDialog( child: BuildingTransactionDialog(
coin: manager.coin, coin: coin,
onCancel: () { onCancel: () {
wasCancelled = true; wasCancelled = true;
@ -263,46 +270,54 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
), ),
); );
Map<String, dynamic> txData; TxData txData;
Future<Map<String, dynamic>> txDataFuture; Future<TxData> txDataFuture;
final wallet = ref.read(pWallets).getWallet(walletId);
// if not firo then do normal send // if not firo then do normal send
if (shouldSendPublicFiroFunds == null) { if (shouldSendPublicFiroFunds == null) {
final memo = final memo = coin == Coin.stellar || coin == Coin.stellarTestnet
manager.coin == Coin.stellar || manager.coin == Coin.stellarTestnet ? trade.payInExtraId.isNotEmpty
? trade.payInExtraId.isNotEmpty ? trade.payInExtraId
? trade.payInExtraId : null
: null : null;
: null; txDataFuture = wallet.prepareSend(
txDataFuture = manager.prepareSend( txData: TxData(
address: address, recipients: [
amount: amount, (
args: { address: address,
"memo": memo, amount: amount,
"feeRate": FeeRateType.average, ),
// ref.read(feeRateTypeStateProvider) ],
}, memo: memo,
feeRateType: FeeRateType.average,
),
); );
} else { } else {
final firoWallet = manager.wallet as FiroWallet; final firoWallet = wallet as FiroWallet;
// otherwise do firo send based on balance selected // otherwise do firo send based on balance selected
if (shouldSendPublicFiroFunds) { if (shouldSendPublicFiroFunds) {
txDataFuture = firoWallet.prepareSendPublic( throw UnimplementedError();
address: address, // txDataFuture = firoWallet.prepareSendPublic(
amount: amount, // address: address,
args: { // amount: amount,
"feeRate": FeeRateType.average, // args: {
// ref.read(feeRateTypeStateProvider) // "feeRate": FeeRateType.average,
}, // // ref.read(feeRateTypeStateProvider)
); // },
// );
} else { } else {
txDataFuture = firoWallet.prepareSend( txDataFuture = wallet.prepareSend(
address: address, txData: TxData(
amount: amount, recipients: [
args: { (
"feeRate": FeeRateType.average, address: address,
// ref.read(feeRateTypeStateProvider) amount: amount,
}, ),
],
feeRateType: FeeRateType.average,
),
); );
} }
} }
@ -312,7 +327,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
time, time,
]); ]);
txData = results.first as Map<String, dynamic>; txData = results.first as TxData;
if (!wasCancelled) { if (!wasCancelled) {
// pop building dialog // pop building dialog
@ -324,16 +339,17 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
).pop(); ).pop();
} }
txData["note"] = txData = txData.copyWith(
"${trade.payInCurrency.toUpperCase()}/${trade.payOutCurrency.toUpperCase()} exchange"; note: "${trade.payInCurrency.toUpperCase()}/"
txData["address"] = address; "${trade.payOutCurrency.toUpperCase()} exchange",
);
if (mounted) { if (mounted) {
await Navigator.of(context).push( await Navigator.of(context).push(
RouteGenerator.getRoute( RouteGenerator.getRoute(
shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute, shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute,
builder: (_) => ConfirmChangeNowSendView( builder: (_) => ConfirmChangeNowSendView(
transactionInfo: txData, txData: txData,
walletId: walletId, walletId: walletId,
routeOnSuccessName: Util.isDesktop routeOnSuccessName: Util.isDesktop
? DesktopExchangeView.routeName ? DesktopExchangeView.routeName
@ -396,13 +412,12 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = final wallet = ref.watch(pWallets).getWallet(walletId);
ref.watch(ref.watch(pWallets.notifier).getManagerProvider(walletId));
final locale = ref.watch( final locale = ref.watch(
localeServiceChangeNotifierProvider.select((value) => value.locale)); localeServiceChangeNotifierProvider.select((value) => value.locale));
final coin = manager.coin; final coin = ref.watch(pWalletCoin(walletId));
final isFiro = coin == Coin.firoTestNet || coin == Coin.firo; final isFiro = coin == Coin.firoTestNet || coin == Coin.firo;
@ -437,7 +452,6 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
if (mounted) { if (mounted) {
unawaited( unawaited(
_send( _send(
manager,
shouldSendPublicFiroFunds: false, shouldSendPublicFiroFunds: false,
), ),
); );
@ -464,10 +478,9 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
Text( Text(
ref.watch(pAmountFormatter(coin)).format( ref.watch(pAmountFormatter(coin)).format(ref
(manager.wallet as FiroWallet) .watch(pWalletBalance(walletId))
.availablePrivateBalance(), .spendable),
),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
], ],
@ -500,7 +513,6 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
if (mounted) { if (mounted) {
unawaited( unawaited(
_send( _send(
manager,
shouldSendPublicFiroFunds: true, shouldSendPublicFiroFunds: true,
), ),
); );
@ -528,8 +540,11 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
), ),
Text( Text(
ref.watch(pAmountFormatter(coin)).format( ref.watch(pAmountFormatter(coin)).format(
(manager.wallet as FiroWallet) ref
.availablePublicBalance()), .watch(
pWalletBalanceSecondary(walletId))
.spendable,
),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
], ],
@ -568,7 +583,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
onPressed: () async { onPressed: () async {
if (mounted) { if (mounted) {
unawaited( unawaited(
_send(manager), _send(),
); );
} }
}, },
@ -580,7 +595,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context) color: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
.colorForCoin(manager.coin) .colorForCoin(coin)
.withOpacity(0.5), .withOpacity(0.5),
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius, Constants.size.circularBorderRadius,
@ -608,7 +623,7 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
manager.walletName, ref.watch(pWalletName(walletId)),
style: STextStyles.titleBold12(context), style: STextStyles.titleBold12(context),
), ),
if (!isFiro) if (!isFiro)
@ -617,9 +632,8 @@ class _SendFromCardState extends ConsumerState<SendFromCard> {
), ),
if (!isFiro) if (!isFiro)
Text( Text(
ref ref.watch(pAmountFormatter(coin)).format(
.watch(pAmountFormatter(coin)) ref.watch(pWalletBalance(walletId)).spendable),
.format(manager.balance.spendable),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
], ],

View file

@ -10,11 +10,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/favourite_wallets_provider.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart'; import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
@ -61,8 +63,17 @@ class ManageFavoritesView extends StatelessWidget {
body: isDesktop body: isDesktop
? Consumer( ? Consumer(
builder: (_, ref, __) { builder: (_, ref, __) {
final favorites = ref.watch(favoritesProvider); final favorites = ref.watch(pFavouriteWalletInfos);
final nonFavorites = ref.watch(nonFavoritesProvider); print(
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
// todo [prio=??] do this differently
final nonFavorites = ref
.watch(pWallets)
.wallets
.map((e) => e.info)
.where((e) => !e.isFavourite)
.toList();
return Column( return Column(
children: [ children: [
@ -108,8 +119,7 @@ class ManageFavoritesView extends StatelessWidget {
key: key, key: key,
itemCount: favorites.length, itemCount: favorites.length,
itemBuilder: (builderContext, index) { itemBuilder: (builderContext, index) {
final walletId = final walletId = favorites[index].walletId;
ref.read(favorites[index]).walletId;
return Padding( return Padding(
key: Key( key: Key(
"manageFavoriteWalletsItem_$walletId", "manageFavoriteWalletsItem_$walletId",
@ -127,14 +137,43 @@ class ManageFavoritesView extends StatelessWidget {
); );
}, },
onReorder: (oldIndex, newIndex) { onReorder: (oldIndex, newIndex) {
ref final isar = ref.read(mainDBProvider).isar;
.read(walletsServiceChangeNotifierProvider)
.moveFavorite(
fromIndex: oldIndex, toIndex: newIndex);
ref final actualIndex =
.read(favoritesProvider) favorites[oldIndex].favouriteOrderIndex;
.reorder(oldIndex, newIndex, true); if (oldIndex > newIndex) {
for (int i = oldIndex - 1; i >= newIndex; i--) {
final next = favorites[i];
next.updateIsFavourite(
true,
isar: isar,
customIndexOverride:
next.favouriteOrderIndex + 1,
);
}
favorites[oldIndex].updateIsFavourite(
true,
isar: isar,
customIndexOverride:
actualIndex - (oldIndex - newIndex),
);
} else {
for (int i = oldIndex + 1; i <= newIndex; i++) {
final next = favorites[i];
next.updateIsFavourite(
true,
isar: isar,
customIndexOverride:
next.favouriteOrderIndex - 1,
);
}
favorites[oldIndex].updateIsFavourite(
true,
isar: isar,
customIndexOverride:
actualIndex + (newIndex - oldIndex),
);
}
}, },
proxyDecorator: (child, index, animation) { proxyDecorator: (child, index, animation) {
return Material( return Material(
@ -176,8 +215,7 @@ class ManageFavoritesView extends StatelessWidget {
itemBuilder: (buildContext, index) { itemBuilder: (buildContext, index) {
// final walletId = ref.watch( // final walletId = ref.watch(
// nonFavorites[index].select((value) => value.walletId)); // nonFavorites[index].select((value) => value.walletId));
final walletId = final walletId = nonFavorites[index].walletId;
ref.read(nonFavorites[index]).walletId;
return Padding( return Padding(
key: Key( key: Key(
"manageNonFavoriteWalletsItem_$walletId", "manageNonFavoriteWalletsItem_$walletId",
@ -236,13 +274,12 @@ class ManageFavoritesView extends StatelessWidget {
Expanded( Expanded(
child: Consumer( child: Consumer(
builder: (_, ref, __) { builder: (_, ref, __) {
final favorites = ref.watch(favoritesProvider); final favorites = ref.watch(pFavouriteWalletInfos);
return ReorderableListView.builder( return ReorderableListView.builder(
key: key, key: key,
itemCount: favorites.length, itemCount: favorites.length,
itemBuilder: (builderContext, index) { itemBuilder: (builderContext, index) {
final walletId = final walletId = favorites[index].walletId;
ref.read(favorites[index]).walletId;
return Padding( return Padding(
key: Key( key: Key(
"manageFavoriteWalletsItem_$walletId", "manageFavoriteWalletsItem_$walletId",
@ -254,14 +291,43 @@ class ManageFavoritesView extends StatelessWidget {
); );
}, },
onReorder: (oldIndex, newIndex) { onReorder: (oldIndex, newIndex) {
ref final isar = ref.read(mainDBProvider).isar;
.read(walletsServiceChangeNotifierProvider)
.moveFavorite(
fromIndex: oldIndex, toIndex: newIndex);
ref final actualIndex =
.read(favoritesProvider) favorites[oldIndex].favouriteOrderIndex;
.reorder(oldIndex, newIndex, true); if (oldIndex > newIndex) {
for (int i = oldIndex - 1; i >= newIndex; i--) {
final next = favorites[i];
next.updateIsFavourite(
true,
isar: isar,
customIndexOverride:
next.favouriteOrderIndex + 1,
);
}
favorites[oldIndex].updateIsFavourite(
true,
isar: isar,
customIndexOverride:
actualIndex - (oldIndex - newIndex),
);
} else {
for (int i = oldIndex + 1; i <= newIndex; i++) {
final next = favorites[i];
next.updateIsFavourite(
true,
isar: isar,
customIndexOverride:
next.favouriteOrderIndex - 1,
);
}
favorites[oldIndex].updateIsFavourite(
true,
isar: isar,
customIndexOverride:
actualIndex + (newIndex - oldIndex),
);
}
}, },
proxyDecorator: (child, index, animation) { proxyDecorator: (child, index, animation) {
return Material( return Material(
@ -301,15 +367,20 @@ class ManageFavoritesView extends StatelessWidget {
Expanded( Expanded(
child: Consumer( child: Consumer(
builder: (_, ref, __) { builder: (_, ref, __) {
final nonFavorites = ref.watch(nonFavoritesProvider); // todo [prio=??] do this differently
final nonFavorites = ref
.watch(pWallets)
.wallets
.map((e) => e.info)
.where((e) => !e.isFavourite)
.toList();
return ListView.builder( return ListView.builder(
itemCount: nonFavorites.length, itemCount: nonFavorites.length,
itemBuilder: (buildContext, index) { itemBuilder: (buildContext, index) {
// final walletId = ref.watch( // final walletId = ref.watch(
// nonFavorites[index].select((value) => value.walletId)); // nonFavorites[index].select((value) => value.walletId));
final walletId = final walletId = nonFavorites[index].walletId;
ref.read(nonFavorites[index]).walletId;
return Padding( return Padding(
key: Key( key: Key(
"manageNonFavoriteWalletsItem_$walletId", "manageNonFavoriteWalletsItem_$walletId",

View file

@ -146,7 +146,7 @@
// WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { // WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
// final address = await ref // final address = await ref
// .read(walletsChangeNotifierProvider) // .read(walletsChangeNotifierProvider)
// .getManager(walletId) // .getWallet(walletId)
// .currentReceivingAddress; // .currentReceivingAddress;
// setState(() { // setState(() {
// receivingAddress = address; // receivingAddress = address;
@ -164,8 +164,8 @@
// @override // @override
// Widget build(BuildContext context) { // Widget build(BuildContext context) {
// final Coin coin = ref.watch(managerProvider.select((value) => value.coin)); // final Coin coin = ref.watch(managerProvider.select((value) => value.coin));
// final manager = ref.watch(walletsChangeNotifierProvider // final wallet = ref.watch(walletsChangeNotifierProvider
// .select((value) => value.getManager(widget.walletId))); // .select((value) => value.getWallet(widget.walletId)));
// //
// List<int>? imageBytes; // List<int>? imageBytes;
// imageBytes = (manager.wallet as BananoWallet).getMonkeyImageBytes(); // imageBytes = (manager.wallet as BananoWallet).getMonkeyImageBytes();

View file

@ -13,10 +13,10 @@ import 'package:stackwallet/services/monkey_service.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/show_loading.dart'; import 'package:stackwallet/utilities/show_loading.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -48,8 +48,7 @@ class _MonkeyViewState extends ConsumerState<MonkeyView> {
List<int>? imageBytes; List<int>? imageBytes;
Future<void> _updateWalletMonKey(Uint8List monKeyBytes) async { Future<void> _updateWalletMonKey(Uint8List monKeyBytes) async {
final manager = ref.read(pWallets).getManager(walletId); await (ref.read(pWallets).getWallet(walletId) as BananoWallet)
await (manager.wallet as BananoWallet)
.updateMonkeyImageBytes(monKeyBytes.toList()); .updateMonkeyImageBytes(monKeyBytes.toList());
} }
@ -81,8 +80,10 @@ class _MonkeyViewState extends ConsumerState<MonkeyView> {
throw Exception("Failed to get documents directory to save monKey image"); throw Exception("Failed to get documents directory to save monKey image");
} }
final address = final address = await ref
await ref.read(pWallets).getManager(walletId).currentReceivingAddress; .read(pWallets)
.getWallet(walletId)
.getCurrentReceivingAddress();
final docPath = dir.path; final docPath = dir.path;
String filePath = "$docPath/monkey_$address"; String filePath = "$docPath/monkey_$address";
@ -107,13 +108,12 @@ class _MonkeyViewState extends ConsumerState<MonkeyView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = ref final wallet = ref.watch(pWallets).getWallet(widget.walletId);
.watch(pWallets.select((value) => value.getManager(widget.walletId))); final coin = ref.watch(pWalletCoin(widget.walletId));
final Coin coin = manager.coin;
final bool isDesktop = Util.isDesktop; final bool isDesktop = Util.isDesktop;
imageBytes ??= (manager.wallet as BananoWallet).getMonkeyImageBytes(); imageBytes ??= (wallet as BananoWallet).getMonkeyImageBytes();
return Background( return Background(
child: ConditionalParent( child: ConditionalParent(
@ -341,7 +341,7 @@ class _MonkeyViewState extends ConsumerState<MonkeyView> {
whileFuture: Future.wait([ whileFuture: Future.wait([
_saveMonKeyToFile( _saveMonKeyToFile(
bytes: Uint8List.fromList( bytes: Uint8List.fromList(
(manager.wallet as BananoWallet) (wallet as BananoWallet)
.getMonkeyImageBytes()!), .getMonkeyImageBytes()!),
), ),
Future<void>.delayed( Future<void>.delayed(
@ -383,21 +383,21 @@ class _MonkeyViewState extends ConsumerState<MonkeyView> {
bool didError = false; bool didError = false;
await showLoading( await showLoading(
whileFuture: Future.wait([ whileFuture: Future.wait([
manager.currentReceivingAddress.then( wallet.getCurrentReceivingAddress().then(
(address) async => await ref (address) async => await ref
.read(pMonKeyService) .read(pMonKeyService)
.fetchMonKey( .fetchMonKey(
address: address, address: address!.value,
png: true, png: true,
) )
.then( .then(
(monKeyBytes) async => (monKeyBytes) async =>
await _saveMonKeyToFile( await _saveMonKeyToFile(
bytes: monKeyBytes, bytes: monKeyBytes,
isPNG: true, isPNG: true,
), ),
), ),
), ),
Future<void>.delayed( Future<void>.delayed(
const Duration(seconds: 2)), const Duration(seconds: 2)),
]), ]),
@ -486,17 +486,17 @@ class _MonkeyViewState extends ConsumerState<MonkeyView> {
onPressed: () async { onPressed: () async {
await showLoading( await showLoading(
whileFuture: Future.wait([ whileFuture: Future.wait([
manager.currentReceivingAddress.then( wallet.getCurrentReceivingAddress().then(
(address) async => await ref (address) async => await ref
.read(pMonKeyService) .read(pMonKeyService)
.fetchMonKey(address: address) .fetchMonKey(address: address!.value)
.then( .then(
(monKeyBytes) async => (monKeyBytes) async =>
await _updateWalletMonKey( await _updateWalletMonKey(
monKeyBytes, monKeyBytes,
), ),
), ),
), ),
Future<void>.delayed(const Duration(seconds: 2)), Future<void>.delayed(const Duration(seconds: 2)),
]), ]),
context: context, context: context,
@ -517,8 +517,8 @@ class _MonkeyViewState extends ConsumerState<MonkeyView> {
}, },
); );
imageBytes = (manager.wallet as BananoWallet) imageBytes =
.getMonkeyImageBytes(); (wallet as BananoWallet).getMonkeyImageBytes();
if (imageBytes != null) { if (imageBytes != null) {
setState(() {}); setState(() {});

View file

@ -13,15 +13,16 @@ import 'package:stackwallet/networking/http.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart'; import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/prefs_provider.dart'; import 'package:stackwallet/providers/global/prefs_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/services/tor_service.dart'; import 'package:stackwallet/services/tor_service.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/show_loading.dart'; import 'package:stackwallet/utilities/show_loading.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/secondary_button.dart'; import 'package:stackwallet/widgets/desktop/secondary_button.dart';
@ -56,8 +57,7 @@ class _OrdinalDetailsViewState extends ConsumerState<OrdinalDetailsView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select((value) => value.getManager(widget.walletId).coin));
return Background( return Background(
child: SafeArea( child: SafeArea(

View file

@ -89,7 +89,7 @@ class _OrdinalsViewState extends ConsumerState<OrdinalsView> {
await showLoading( await showLoading(
whileFuture: Future.wait<void>([ whileFuture: Future.wait<void>([
Future.delayed(const Duration(seconds: 2)), Future.delayed(const Duration(seconds: 2)),
(ref.read(pWallets).getManager(widget.walletId).wallet (ref.read(pWallets).getWallet(widget.walletId)
as OrdinalsInterface) as OrdinalsInterface)
.refreshInscriptions() .refreshInscriptions()
]), ]),

View file

@ -28,9 +28,11 @@ import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart'; import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
import 'package:stackwallet/widgets/custom_buttons/paynym_follow_toggle_button.dart'; import 'package:stackwallet/widgets/custom_buttons/paynym_follow_toggle_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart'; import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
import 'package:stackwallet/widgets/desktop/primary_button.dart'; import 'package:stackwallet/widgets/desktop/primary_button.dart';
@ -58,12 +60,12 @@ class _PaynymDetailsPopupState extends ConsumerState<PaynymDetailsPopup> {
bool _showInsufficientFundsInfo = false; bool _showInsufficientFundsInfo = false;
Future<void> _onSend() async { Future<void> _onSend() async {
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet = ref.read(pWallets).getWallet(widget.walletId);
await Navigator.of(context).pushNamed( await Navigator.of(context).pushNamed(
SendView.routeName, SendView.routeName,
arguments: Tuple3( arguments: Tuple3(
manager.walletId, wallet.walletId,
manager.coin, wallet.info.coin,
widget.accountLite, widget.accountLite,
), ),
); );
@ -83,9 +85,9 @@ class _PaynymDetailsPopupState extends ConsumerState<PaynymDetailsPopup> {
), ),
); );
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet =
ref.read(pWallets).getWallet(widget.walletId) as PaynymWalletInterface;
final wallet = manager.wallet as PaynymWalletInterface; final coin = ref.read(pWalletCoin(widget.walletId));
if (await wallet.hasConnected(widget.accountLite.code)) { if (await wallet.hasConnected(widget.accountLite.code)) {
canPop = true; canPop = true;
@ -94,9 +96,9 @@ class _PaynymDetailsPopupState extends ConsumerState<PaynymDetailsPopup> {
return; return;
} }
final rates = await manager.fees; final rates = await ref.read(pWallets).getWallet(widget.walletId).fees;
Map<String, dynamic> preparedTx; TxData preparedTx;
try { try {
preparedTx = await wallet.prepareNotificationTx( preparedTx = await wallet.prepareNotificationTx(
@ -145,32 +147,19 @@ class _PaynymDetailsPopupState extends ConsumerState<PaynymDetailsPopup> {
nymName: widget.accountLite.nymName, nymName: widget.accountLite.nymName,
locale: ref.read(localeServiceChangeNotifierProvider).locale, locale: ref.read(localeServiceChangeNotifierProvider).locale,
onConfirmPressed: () { onConfirmPressed: () {
//
print("CONFIRM NOTIF TX: $preparedTx");
Navigator.of(context).push( Navigator.of(context).push(
RouteGenerator.getRoute( RouteGenerator.getRoute(
builder: (_) => ConfirmTransactionView( builder: (_) => ConfirmTransactionView(
walletId: manager.walletId, walletId: widget.walletId,
routeOnSuccessName: PaynymHomeView.routeName, routeOnSuccessName: PaynymHomeView.routeName,
isPaynymNotificationTransaction: true, isPaynymNotificationTransaction: true,
transactionInfo: { txData: preparedTx,
"hex": preparedTx["hex"],
"address": preparedTx["recipientPaynym"],
"recipientAmt": preparedTx["amount"],
"fee": preparedTx["fee"],
"vSize": preparedTx["vSize"],
"note": "PayNym connect"
},
), ),
), ),
); );
}, },
amount: (preparedTx["amount"] as Amount) + amount: preparedTx.amount! + preparedTx.fee!,
(preparedTx["fee"] as int).toAmountAsRaw( coin: coin,
fractionDigits: manager.coin.decimals,
),
coin: manager.coin,
), ),
); );
} }
@ -178,10 +167,8 @@ class _PaynymDetailsPopupState extends ConsumerState<PaynymDetailsPopup> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = ref final wallet =
.watch(pWallets.select((value) => value.getManager(widget.walletId))); ref.watch(pWallets).getWallet(widget.walletId) as PaynymWalletInterface;
final wallet = manager.wallet as PaynymWalletInterface;
return DesktopDialog( return DesktopDialog(
maxWidth: MediaQuery.of(context).size.width - 32, maxWidth: MediaQuery.of(context).size.width - 32,
@ -313,7 +300,7 @@ class _PaynymDetailsPopupState extends ConsumerState<PaynymDetailsPopup> {
"Adding a PayNym to your contacts requires a one-time " "Adding a PayNym to your contacts requires a one-time "
"transaction fee for creating the record on the " "transaction fee for creating the record on the "
"blockchain. Please deposit more " "blockchain. Please deposit more "
"${ref.read(pWallets).getManager(widget.walletId).wallet.coin.ticker} " "${ref.watch(pWalletCoin(widget.walletId)).ticker} "
"into your wallet and try again.", "into your wallet and try again.",
style: STextStyles.infoSmall(context).copyWith( style: STextStyles.infoSmall(context).copyWith(
color: Theme.of(context) color: Theme.of(context)

View file

@ -47,10 +47,8 @@ class PaynymClaimView extends ConsumerStatefulWidget {
class _PaynymClaimViewState extends ConsumerState<PaynymClaimView> { class _PaynymClaimViewState extends ConsumerState<PaynymClaimView> {
Future<bool> _addSegwitCode(PaynymAccount myAccount) async { Future<bool> _addSegwitCode(PaynymAccount myAccount) async {
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet =
ref.read(pWallets).getWallet(widget.walletId) as PaynymWalletInterface;
// get wallet to access paynym calls
final wallet = manager.wallet as PaynymWalletInterface;
final token = await ref final token = await ref
.read(paynymAPIProvider) .read(paynymAPIProvider)
@ -189,11 +187,8 @@ class _PaynymClaimViewState extends ConsumerState<PaynymClaimView> {
).then((value) => shouldCancel = value == true), ).then((value) => shouldCancel = value == true),
); );
final manager = final wallet = ref.read(pWallets).getWallet(widget.walletId)
ref.read(pWallets).getManager(widget.walletId); as PaynymWalletInterface;
// get wallet to access paynym calls
final wallet = manager.wallet as PaynymWalletInterface;
if (shouldCancel) return; if (shouldCancel) return;

View file

@ -26,9 +26,11 @@ import 'package:stackwallet/providers/global/locale_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart'; import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart'; import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart'; import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
import 'package:stackwallet/widgets/custom_buttons/paynym_follow_toggle_button.dart'; import 'package:stackwallet/widgets/custom_buttons/paynym_follow_toggle_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart'; import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
@ -69,9 +71,8 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
), ),
); );
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet =
ref.read(pWallets).getWallet(widget.walletId) as PaynymWalletInterface;
final wallet = manager.wallet as PaynymWalletInterface;
if (await wallet.hasConnected(widget.accountLite.code)) { if (await wallet.hasConnected(widget.accountLite.code)) {
canPop = true; canPop = true;
@ -80,9 +81,9 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
return; return;
} }
final rates = await manager.fees; final rates = await ref.read(pWallets).getWallet(widget.walletId).fees;
Map<String, dynamic> preparedTx; TxData preparedTx;
try { try {
preparedTx = await wallet.prepareNotificationTx( preparedTx = await wallet.prepareNotificationTx(
@ -122,16 +123,9 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
maxHeight: double.infinity, maxHeight: double.infinity,
maxWidth: 580, maxWidth: 580,
child: ConfirmTransactionView( child: ConfirmTransactionView(
walletId: manager.walletId, walletId: widget.walletId,
isPaynymNotificationTransaction: true, isPaynymNotificationTransaction: true,
transactionInfo: { txData: preparedTx,
"hex": preparedTx["hex"],
"address": preparedTx["recipientPaynym"],
"recipientAmt": preparedTx["amount"],
"fee": preparedTx["fee"],
"vSize": preparedTx["vSize"],
"note": "PayNym connect"
},
onSuccessInsteadOfRouteOnSuccess: () { onSuccessInsteadOfRouteOnSuccess: () {
Navigator.of(context, rootNavigator: true).pop(); Navigator.of(context, rootNavigator: true).pop();
Navigator.of(context, rootNavigator: true).pop(); Navigator.of(context, rootNavigator: true).pop();
@ -150,11 +144,8 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
), ),
); );
}, },
amount: (preparedTx["amount"] as Amount) + amount: preparedTx.amount! + preparedTx.fee!,
(preparedTx["fee"] as int).toAmountAsRaw( coin: ref.read(pWalletCoin(widget.walletId)),
fractionDigits: manager.coin.decimals,
),
coin: manager.coin,
), ),
); );
} }
@ -172,10 +163,9 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = ref final wallet = ref.watch(pWallets).getWallet(widget.walletId);
.watch(pWallets.select((value) => value.getManager(widget.walletId)));
final wallet = manager.wallet as PaynymWalletInterface; final paynymWallet = wallet as PaynymWalletInterface;
return RoundedWhiteContainer( return RoundedWhiteContainer(
padding: const EdgeInsets.all(0), padding: const EdgeInsets.all(0),
@ -203,7 +193,8 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
style: STextStyles.desktopTextSmall(context), style: STextStyles.desktopTextSmall(context),
), ),
FutureBuilder( FutureBuilder(
future: wallet.hasConnected(widget.accountLite.code), future: paynymWallet
.hasConnected(widget.accountLite.code),
builder: (context, AsyncSnapshot<bool> snapshot) { builder: (context, AsyncSnapshot<bool> snapshot) {
if (snapshot.connectionState == if (snapshot.connectionState ==
ConnectionState.done && ConnectionState.done &&
@ -241,7 +232,8 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
children: [ children: [
Expanded( Expanded(
child: FutureBuilder( child: FutureBuilder(
future: wallet.hasConnected(widget.accountLite.code), future:
paynymWallet.hasConnected(widget.accountLite.code),
builder: (context, AsyncSnapshot<bool> snapshot) { builder: (context, AsyncSnapshot<bool> snapshot) {
if (snapshot.connectionState == if (snapshot.connectionState ==
ConnectionState.done && ConnectionState.done &&
@ -313,7 +305,7 @@ class _PaynymDetailsPopupState extends ConsumerState<DesktopPaynymDetails> {
"Adding a PayNym to your contacts requires a one-time " "Adding a PayNym to your contacts requires a one-time "
"transaction fee for creating the record on the " "transaction fee for creating the record on the "
"blockchain. Please deposit more " "blockchain. Please deposit more "
"${ref.read(pWallets).getManager(widget.walletId).wallet.coin.ticker} " "${ref.watch(pWalletCoin(widget.walletId)).ticker} "
"into your wallet and try again.", "into your wallet and try again.",
style: STextStyles.desktopTextExtraExtraSmall(context) style: STextStyles.desktopTextExtraExtraSmall(context)
.copyWith( .copyWith(

View file

@ -75,10 +75,8 @@ class _PaynymFollowersListState extends ConsumerState<PaynymFollowersList> {
child: child, child: child,
onRefresh: () async { onRefresh: () async {
try { try {
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet = ref.read(pWallets).getWallet(widget.walletId)
as PaynymWalletInterface;
// get wallet to access paynym calls
final wallet = manager.wallet as PaynymWalletInterface;
// get payment code // get payment code
final pCode = await wallet.getPaymentCode( final pCode = await wallet.getPaymentCode(

View file

@ -75,10 +75,8 @@ class _PaynymFollowingListState extends ConsumerState<PaynymFollowingList> {
child: child, child: child,
onRefresh: () async { onRefresh: () async {
try { try {
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet = ref.read(pWallets).getWallet(widget.walletId)
as PaynymWalletInterface;
// get wallet to access paynym calls
final wallet = manager.wallet as PaynymWalletInterface;
// get payment code // get payment code
final pCode = await wallet.getPaymentCode( final pCode = await wallet.getPaymentCode(

View file

@ -32,7 +32,6 @@ 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_buttons/blue_text_button.dart';
import 'package:stackwallet/widgets/custom_pin_put/custom_pin_put.dart'; import 'package:stackwallet/widgets/custom_pin_put/custom_pin_put.dart';
import 'package:stackwallet/widgets/shake/shake.dart'; import 'package:stackwallet/widgets/shake/shake.dart';
import 'package:tuple/tuple.dart';
class LockscreenView extends ConsumerStatefulWidget { class LockscreenView extends ConsumerStatefulWidget {
const LockscreenView({ const LockscreenView({
@ -98,13 +97,13 @@ class _LockscreenViewState extends ConsumerState<LockscreenView> {
if (loadIntoWallet) { if (loadIntoWallet) {
final walletId = widget.routeOnSuccessArguments as String; final walletId = widget.routeOnSuccessArguments as String;
final manager = ref.read(pWallets).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
if (manager.coin == Coin.monero) { if (wallet.info.coin == Coin.monero) {
await showLoading( await showLoading(
opaqueBG: true, opaqueBG: true,
whileFuture: manager.initializeExisting(), whileFuture: wallet.init(),
context: context, context: context,
message: "Loading ${manager.coin.prettyName} wallet...", message: "Loading ${wallet.info.coin.prettyName} wallet...",
); );
} }
} }
@ -123,10 +122,7 @@ class _LockscreenViewState extends ConsumerState<LockscreenView> {
unawaited( unawaited(
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
WalletView.routeName, WalletView.routeName,
arguments: Tuple2( arguments: walletId,
walletId,
ref.read(pWallets).getManagerProvider(walletId),
),
), ),
); );
} }

View file

@ -22,12 +22,12 @@ import 'package:stackwallet/pages/wallet_view/sub_widgets/no_transactions_found.
import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart'; import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/address_utils.dart'; import 'package:stackwallet/utilities/address_utils.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -95,8 +95,7 @@ class _AddressDetailsViewState extends ConsumerState<AddressDetailsView> {
key: _qrKey, key: _qrKey,
child: QrImageView( child: QrImageView(
data: AddressUtils.buildUriString( data: AddressUtils.buildUriString(
ref.watch(pWallets.select((value) => ref.watch(pWalletCoin(widget.walletId)),
value.getManager(widget.walletId).coin)),
address.value, address.value,
{}, {},
), ),
@ -150,8 +149,7 @@ class _AddressDetailsViewState extends ConsumerState<AddressDetailsView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select((value) => value.getManager(widget.walletId).coin));
return ConditionalParent( return ConditionalParent(
condition: !isDesktop, condition: !isDesktop,
builder: (child) => Background( builder: (child) => Background(
@ -291,8 +289,7 @@ class _AddressDetailsViewState extends ConsumerState<AddressDetailsView> {
key: _qrKey, key: _qrKey,
child: QrImageView( child: QrImageView(
data: AddressUtils.buildUriString( data: AddressUtils.buildUriString(
ref.watch(pWallets.select((value) => coin,
value.getManager(widget.walletId).coin)),
address.value, address.value,
{}, {},
), ),

View file

@ -16,11 +16,11 @@ import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/pages/receive_view/addresses/address_card.dart'; import 'package:stackwallet/pages/receive_view/addresses/address_card.dart';
import 'package:stackwallet/pages/receive_view/addresses/address_details_view.dart'; import 'package:stackwallet/pages/receive_view/addresses/address_details_view.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -135,8 +135,8 @@ class _WalletAddressesViewState extends ConsumerState<WalletAddressesView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select((value) => value.getManager(widget.walletId).coin));
return ConditionalParent( return ConditionalParent(
condition: !isDesktop, condition: !isDesktop,
builder: (child) => Background( builder: (child) => Background(

View file

@ -28,6 +28,8 @@ import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/wallet/bip39_hd_wallet.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.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_buttons/blue_text_button.dart';
@ -58,54 +60,49 @@ class _ReceiveViewState extends ConsumerState<ReceiveView> {
late final ClipboardInterface clipboard; late final ClipboardInterface clipboard;
Future<void> generateNewAddress() async { Future<void> generateNewAddress() async {
bool shouldPop = false; // TODO: [prio=med] handle other wallet cases
unawaited( final wallet = ref.read(pWallets).getWallet(walletId);
showDialog(
context: context, if (wallet is Bip39HDWallet) {
builder: (_) { bool shouldPop = false;
return WillPopScope( unawaited(
onWillPop: () async => shouldPop, showDialog(
child: Container( context: context,
color: Theme.of(context) builder: (_) {
.extension<StackColors>()! return WillPopScope(
.overlay onWillPop: () async => shouldPop,
.withOpacity(0.5), child: Container(
child: const CustomLoadingOverlay( color: Theme.of(context)
message: "Generating address", .extension<StackColors>()!
eventBus: null, .overlay
.withOpacity(0.5),
child: const CustomLoadingOverlay(
message: "Generating address",
eventBus: null,
),
), ),
), );
); },
}, ),
), );
);
await ref.read(pWallets).getManager(walletId).generateNewAddress(); await wallet.generateNewReceivingAddress();
shouldPop = true; shouldPop = true;
if (mounted) { if (mounted) {
Navigator.of(context) Navigator.of(context)
.popUntil(ModalRoute.withName(ReceiveView.routeName)); .popUntil(ModalRoute.withName(ReceiveView.routeName));
}
} }
} }
String receivingAddress = "";
@override @override
void initState() { void initState() {
walletId = widget.walletId; walletId = widget.walletId;
coin = ref.read(pWallets).getManager(walletId).coin; coin = ref.read(pWalletCoin(walletId));
clipboard = widget.clipboard; clipboard = widget.clipboard;
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
final address =
await ref.read(pWallets).getManager(walletId).currentReceivingAddress;
setState(() {
receivingAddress = address;
});
});
super.initState(); super.initState();
} }
@ -113,16 +110,7 @@ class _ReceiveViewState extends ConsumerState<ReceiveView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
ref.listen( final receivingAddress = ref.watch(pWalletReceivingAddress(walletId));
ref
.read(pWallets)
.getManagerProvider(walletId)
.select((value) => value.currentReceivingAddress),
(previous, next) {
if (next is Future<String>) {
next.then((value) => setState(() => receivingAddress = value));
}
});
final ticker = widget.tokenContract?.symbol ?? coin.ticker; final ticker = widget.tokenContract?.symbol ?? coin.ticker;

View file

@ -16,7 +16,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_libepiccash/lib.dart'; import 'package:flutter_libepiccash/lib.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/models/paynym/paynym_account_lite.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/pinpad_views/lock_screen_view.dart'; import 'package:stackwallet/pages/pinpad_views/lock_screen_view.dart';
import 'package:stackwallet/pages/send_view/sub_widgets/sending_transaction_dialog.dart'; import 'package:stackwallet/pages/send_view/sub_widgets/sending_transaction_dialog.dart';
@ -27,8 +26,6 @@ import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/sub
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart'; import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_providers.dart'; import 'package:stackwallet/themes/theme_providers.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
@ -37,6 +34,8 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
// import 'package:stackwallet/wallets/example/libepiccash.dart'; // import 'package:stackwallet/wallets/example/libepiccash.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
@ -54,7 +53,7 @@ import 'package:stackwallet/widgets/textfield_icon_button.dart';
class ConfirmTransactionView extends ConsumerStatefulWidget { class ConfirmTransactionView extends ConsumerStatefulWidget {
const ConfirmTransactionView({ const ConfirmTransactionView({
Key? key, Key? key,
required this.transactionInfo, required this.txData,
required this.walletId, required this.walletId,
this.routeOnSuccessName = WalletView.routeName, this.routeOnSuccessName = WalletView.routeName,
this.isTradeTransaction = false, this.isTradeTransaction = false,
@ -66,7 +65,7 @@ class ConfirmTransactionView extends ConsumerStatefulWidget {
static const String routeName = "/confirmTransactionView"; static const String routeName = "/confirmTransactionView";
final Map<String, dynamic> transactionInfo; final TxData txData;
final String walletId; final String walletId;
final String routeOnSuccessName; final String routeOnSuccessName;
final bool isTradeTransaction; final bool isTradeTransaction;
@ -82,7 +81,6 @@ class ConfirmTransactionView extends ConsumerStatefulWidget {
class _ConfirmTransactionViewState class _ConfirmTransactionViewState
extends ConsumerState<ConfirmTransactionView> { extends ConsumerState<ConfirmTransactionView> {
late final Map<String, dynamic> transactionInfo;
late final String walletId; late final String walletId;
late final String routeOnSuccessName; late final String routeOnSuccessName;
late final bool isDesktop; late final bool isDesktop;
@ -94,7 +92,8 @@ class _ConfirmTransactionViewState
late final TextEditingController onChainNoteController; late final TextEditingController onChainNoteController;
Future<void> _attemptSend(BuildContext context) async { Future<void> _attemptSend(BuildContext context) async {
pWalletsf.read(walletsChangeNotifierProvider).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
final coin = wallet.info.coin;
final sendProgressController = ProgressAndSuccessController(); final sendProgressController = ProgressAndSuccessController();
@ -105,7 +104,7 @@ class _ConfirmTransactionViewState
barrierDismissible: false, barrierDismissible: false,
builder: (context) { builder: (context) {
return SendingTransactionDialog( return SendingTransactionDialog(
coin: manager.coin, coin: coin,
controller: sendProgressController, controller: sendProgressController,
); );
}, },
@ -119,32 +118,42 @@ class _ConfirmTransactionViewState
); );
late String txid; late String txid;
Future<String> txidFuture; Future<TxData> txidFuture;
final note = noteController.text; final note = noteController.text;
try { try {
if (widget.isTokenTx) { if (widget.isTokenTx) {
txidFuture = ref // TODO: [prio=high] fixme
.read(tokenServiceProvider)! throw UnimplementedError("fixme");
.confirmSend(txData: transactionInfo); // txidFuture = ref
// .read(tokenServiceProvider)!
// .confirmSend(txData: transactionInfo);
} else if (widget.isPaynymNotificationTransaction) { } else if (widget.isPaynymNotificationTransaction) {
txidFuture = (manager.wallet as PaynymWalletInterface) // TODO: [prio=high] fixme
.broadcastNotificationTx(preparedTx: transactionInfo); throw UnimplementedError("fixme");
// txidFuture = (wallet as PaynymWalletInterface)
// .broadcastNotificationTx(preparedTx: transactionInfo);
} else if (widget.isPaynymTransaction) { } else if (widget.isPaynymTransaction) {
txidFuture = manager.confirmSend(txData: transactionInfo); txidFuture = wallet.confirmSend(txData: widget.txData);
} else { } else {
final coin = manager.coin;
if ((coin == Coin.firo || coin == Coin.firoTestNet) && if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
ref.read(publicPrivateBalanceStateProvider.state).state != ref.read(publicPrivateBalanceStateProvider.state).state !=
"Private") { "Private") {
txidFuture = (manager.wallet as FiroWallet) // TODO: [prio=high] fixme
.confirmSendPublic(txData: transactionInfo); throw UnimplementedError("fixme");
// txidFuture = (wallet as FiroWallet)
// .confirmSendPublic(txData: transactionInfo);
} else { } else {
if (coin == Coin.epicCash) { if (coin == Coin.epicCash) {
transactionInfo["onChainNote"] = onChainNoteController.text; txidFuture = wallet.confirmSend(
txData: widget.txData.copyWith(
noteOnChain: onChainNoteController.text,
),
);
} else {
txidFuture = wallet.confirmSend(txData: widget.txData);
} }
txidFuture = manager.confirmSend(txData: transactionInfo);
} }
} }
@ -167,7 +176,7 @@ class _ConfirmTransactionViewState
if (widget.isTokenTx) { if (widget.isTokenTx) {
unawaited(ref.read(tokenServiceProvider)!.refresh()); unawaited(ref.read(tokenServiceProvider)!.refresh());
} else { } else {
unawaited(manager.refresh()); unawaited(wallet.refresh());
} }
// pop back to wallet // pop back to wallet
@ -272,17 +281,15 @@ class _ConfirmTransactionViewState
@override @override
void initState() { void initState() {
isDesktop = Util.isDesktop; isDesktop = Util.isDesktop;
transactionInfo = widget.transactionInfo;
walletId = widget.walletId; walletId = widget.walletId;
routeOnSuccessName = widget.routeOnSuccessName; routeOnSuccessName = widget.routeOnSuccessName;
_noteFocusNode = FocusNode(); _noteFocusNode = FocusNode();
noteController = TextEditingController(); noteController = TextEditingController();
noteController.text = transactionInfo["note"] as String? ?? ""; noteController.text = widget.txData.note ?? "";
_onChainNoteFocusNode = FocusNode(); _onChainNoteFocusNode = FocusNode();
onChainNoteController = TextEditingController(); onChainNoteController = TextEditingController();
onChainNoteController.text = onChainNoteController.text = widget.txData.noteOnChain ?? "";
transactionInfo["onChainNote"] as String? ?? "";
super.initState(); super.initState();
} }
@ -298,9 +305,8 @@ class _ConfirmTransactionViewState
} }
@override @override
Widget build(BuildContext contepWalletser = ref.watch(walletsChangeNotifierProvider Widget build(BuildContext context) {
.select((value) => value.getManagerProvidpWalletsin = ref.watch(walletsChangeNotifierProvider final coin = ref.watch(pWalletCoin(walletId));
.select((value) => value.getManager(walletId).coin));
final String unit; final String unit;
if (widget.isTokenTx) { if (widget.isTokenTx) {
@ -309,7 +315,6 @@ class _ConfirmTransactionViewState
} else { } else {
unit = coin.ticker; unit = coin.ticker;
} }
return ConditionalParent( return ConditionalParent(
condition: !isDesktop, condition: !isDesktop,
builder: (child) => Background( builder: (child) => Background(
@ -414,10 +419,8 @@ class _ConfirmTransactionViewState
), ),
Text( Text(
widget.isPaynymTransaction widget.isPaynymTransaction
? (transactionInfo["paynymAccountLite"] ? widget.txData.paynymAccountLite!.nymName
as PaynymAccountLite) : widget.txData.recipients!.first.address,
.nymName
: "${transactionInfo["address"] ?? "ERROR"}",
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
], ],
@ -436,7 +439,7 @@ class _ConfirmTransactionViewState
), ),
Text( Text(
ref.watch(pAmountFormatter(coin)).format( ref.watch(pAmountFormatter(coin)).format(
transactionInfo["recipientAmt"] as Amount, widget.txData.amount!,
ethContract: ref ethContract: ref
.watch(tokenServiceProvider) .watch(tokenServiceProvider)
?.tokenContract, ?.tokenContract,
@ -461,31 +464,20 @@ class _ConfirmTransactionViewState
style: STextStyles.smallMed12(context), style: STextStyles.smallMed12(context),
), ),
Text( Text(
ref.watch(pAmountFormatter(coin)).format( ref
(transactionInfo["fee"] is Amount .watch(pAmountFormatter(coin))
? transactionInfo["fee"] as Amount .format(widget.txData.fee!),
: (transactionInfo["fee"] as int)
.toAmountAsRaw(
fractionDigits: ref.watch(
managerProvider.select(
(value) => value.coin.decimals,
),
),
)),
),
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
textAlign: TextAlign.right, textAlign: TextAlign.right,
), ),
], ],
), ),
), ),
if (transactionInfo["fee"] is int && if (widget.txData.fee != null && widget.txData.vSize != null)
transactionInfo["vSize"] is int)
const SizedBox( const SizedBox(
height: 12, height: 12,
), ),
if (transactionInfo["fee"] is int && if (widget.txData.fee != null && widget.txData.vSize != null)
transactionInfo["vSize"] is int)
RoundedWhiteContainer( RoundedWhiteContainer(
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@ -498,19 +490,19 @@ class _ConfirmTransactionViewState
height: 4, height: 4,
), ),
Text( Text(
"~${(transactionInfo["fee"] / transactionInfo["vSize"]).toInt()}", "~${widget.txData.fee!.raw.toInt() ~/ widget.txData.vSize!}",
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
], ],
), ),
), ),
if (coin == Coin.epicCash && if (coin == Coin.epicCash &&
(transactionInfo["onChainNote"] as String).isNotEmpty) widget.txData.noteOnChain!.isNotEmpty)
const SizedBox( const SizedBox(
height: 12, height: 12,
), ),
if (coin == Coin.epicCash && if (coin == Coin.epicCash &&
(transactionInfo["onChainNote"] as String).isNotEmpty) widget.txData.noteOnChain!.isNotEmpty)
RoundedWhiteContainer( RoundedWhiteContainer(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
@ -523,17 +515,17 @@ class _ConfirmTransactionViewState
height: 4, height: 4,
), ),
Text( Text(
transactionInfo["onChainNote"] as String, widget.txData.noteOnChain!,
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
], ],
), ),
), ),
if ((transactionInfo["note"] as String).isNotEmpty) if (widget.txData.note!.isNotEmpty)
const SizedBox( const SizedBox(
height: 12, height: 12,
), ),
if ((transactionInfo["note"] as String).isNotEmpty) if (widget.txData.note!.isNotEmpty)
RoundedWhiteContainer( RoundedWhiteContainer(
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch, crossAxisAlignment: CrossAxisAlignment.stretch,
@ -546,7 +538,7 @@ class _ConfirmTransactionViewState
height: 4, height: 4,
), ),
Text( Text(
transactionInfo["note"] as String, widget.txData.note!,
style: STextStyles.itemSubtitle12(context), style: STextStyles.itemSubtitle12(context),
), ),
], ],
@ -629,13 +621,7 @@ class _ConfirmTransactionViewState
), ),
Builder( Builder(
builder: (context) { builder: (context) {
final coin = ref.watch( final amount = widget.txData.amount!;
managerProvider.select(
(value) => value.coin,
),
);
final amount =
transactionInfo["recipientAmt"] as Amount;
final externalCalls = ref.watch( final externalCalls = ref.watch(
prefsChangeNotifierProvider.select( prefsChangeNotifierProvider.select(
(value) => value.externalCalls)); (value) => value.externalCalls));
@ -734,10 +720,8 @@ class _ConfirmTransactionViewState
), ),
Text( Text(
widget.isPaynymTransaction widget.isPaynymTransaction
? (transactionInfo["paynymAccountLite"] ? widget.txData.paynymAccountLite!.nymName
as PaynymAccountLite) : widget.txData.recipients!.first.address,
.nymName
: "${transactionInfo["address"] ?? "ERROR"}",
style: STextStyles.desktopTextExtraExtraSmall( style: STextStyles.desktopTextExtraExtraSmall(
context) context)
.copyWith( .copyWith(
@ -773,18 +757,7 @@ class _ConfirmTransactionViewState
), ),
Builder( Builder(
builder: (context) { builder: (context) {
final coin = ref final fee = widget.txData.fee!;
pWallets .watch(walletsChangeNotifierProvider
.select((value) =>
value.getManager(walletId)))
.coin;
final fee = transactionInfo["fee"] is Amount
? transactionInfo["fee"] as Amount
: (transactionInfo["fee"] as int)
.toAmountAsRaw(
fractionDigits: coin.decimals,
);
return Text( return Text(
ref ref
@ -1004,17 +977,9 @@ class _ConfirmTransactionViewState
color: Theme.of(context) color: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
.textFieldDefaultBG, .textFieldDefaultBG,
pWallets builder: (context) { child: Builder(
final coin = ref builder: (context) {
.watch(walletsChangeNotifierProvider final fee = widget.txData.fee!;
.select((value) => value.getManager(walletId)))
.coin;
final fee = transactionInfo["fee"] is Amount
? transactionInfo["fee"] as Amount
: (transactionInfo["fee"] as int).toAmountAsRaw(
fractionDigits: coin.decimals,
);
return Text( return Text(
ref.watch(pAmountFormatter(coin)).format(fee), ref.watch(pAmountFormatter(coin)).format(fee),
@ -1026,8 +991,8 @@ class _ConfirmTransactionViewState
), ),
if (isDesktop && if (isDesktop &&
!widget.isPaynymTransaction && !widget.isPaynymTransaction &&
transactionInfo["fee"] is int && widget.txData.fee != null &&
transactionInfo["vSize"] is int) widget.txData.vSize != null)
Padding( Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
left: 32, left: 32,
@ -1039,8 +1004,8 @@ class _ConfirmTransactionViewState
), ),
if (isDesktop && if (isDesktop &&
!widget.isPaynymTransaction && !widget.isPaynymTransaction &&
transactionInfo["fee"] is int && widget.txData.fee != null &&
transactionInfo["vSize"] is int) widget.txData.vSize != null)
Padding( Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 10, top: 10,
@ -1056,7 +1021,7 @@ class _ConfirmTransactionViewState
.extension<StackColors>()! .extension<StackColors>()!
.textFieldDefaultBG, .textFieldDefaultBG,
child: Text( child: Text(
"~${(transactionInfo["fee"] / transactionInfo["vSize"]).toInt()}", "~${widget.txData.fee!.raw.toInt() ~/ widget.txData.vSize!}",
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
), ),
@ -1099,17 +1064,11 @@ class _ConfirmTransactionViewState
.extension<StackColors>()! .extension<StackColors>()!
.textConfirmTotalAmount, .textConfirmTotalAmount,
), ),
pWallets Builder(builder: (context) { ),
final coin = ref.watch( Builder(builder: (context) {
walletsChangeNotifierProvider.select( final fee = widget.txData.fee!;
(value) => value.getManager(walletId).coin));
final fee = transactionInfo["fee"] is Amount
? transactionInfo["fee"] as Amount
: (transactionInfo["fee"] as int)
.toAmountAsRaw(fractionDigits: coin.decimals);
final amount = final amount = widget.txData.amount!;
transactionInfo["recipientAmt"] as Amount;
return Text( return Text(
ref ref
.watch(pAmountFormatter(coin)) .watch(pAmountFormatter(coin))
@ -1145,14 +1104,9 @@ class _ConfirmTransactionViewState
child: PrimaryButton( child: PrimaryButton(
label: "Send", label: "Send",
buttonHeight: isDesktop ? ButtonHeight.l : null, buttonHeight: isDesktop ? ButtonHeight.l : null,
pWallets onPressed: () async {
final dynamic unlocked; final dynamic unlocked;
final coin = ref
.read(walletsChangeNotifierProvider)
.getManager(walletId)
.coin;
if (isDesktop) { if (isDesktop) {
unlocked = await showDialog<bool?>( unlocked = await showDialog<bool?>(
context: context, context: context,
@ -1162,9 +1116,9 @@ class _ConfirmTransactionViewState
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Row( const Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: const [ children: [
DesktopDialogCloseButton(), DesktopDialogCloseButton(),
], ],
), ),

View file

@ -32,8 +32,7 @@ import 'package:stackwallet/providers/ui/fee_rate_type_state_provider.dart';
import 'package:stackwallet/providers/ui/preview_tx_button_state_provider.dart'; import 'package:stackwallet/providers/ui/preview_tx_button_state_provider.dart';
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart'; import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart'; import 'package:stackwallet/services/mixins/coin_control_interface.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart'; import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
@ -52,6 +51,8 @@ import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/prefs.dart'; import 'package:stackwallet/utilities/prefs.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
import 'package:stackwallet/widgets/animated_text.dart'; import 'package:stackwallet/widgets/animated_text.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -120,16 +121,11 @@ class _SendViewState extends ConsumerState<SendView> {
Amount? _cachedAmountToSend; Amount? _cachedAmountToSend;
String? _address; String? _address;
String? _privateBalanceString;
String? _publicBalanceString;
bool _addressToggleFlag = false; bool _addressToggleFlag = false;
bool _cryptoAmountChangeLock = false; bool _cryptoAmountChangeLock = false;
late VoidCallback onCryptoAmountChanged; late VoidCallback onCryptoAmountChanged;
Amount? _cachedBalance;
Set<UTXO> selectedUTXOs = {}; Set<UTXO> selectedUTXOs = {};
void _cryptoAmountChanged() async { void _cryptoAmountChanged() async {
@ -225,11 +221,16 @@ class _SendViewState extends ConsumerState<SendView> {
} }
} }
String? _updateInvalidAddressText(String address, Manager manager) { String? _updateInvalidAddressText(String address) {
if (_data != null && _data!.contactLabel == address) { if (_data != null && _data!.contactLabel == address) {
return null; return null;
} }
if (address.isNotEmpty && !manager.validateAddress(address)) { if (address.isNotEmpty &&
!ref
.read(pWallets)
.getWallet(walletId)
.cryptoCurrency
.validateAddress(address)) {
return "Invalid address"; return "Invalid address";
} }
return null; return null;
@ -242,7 +243,8 @@ class _SendViewState extends ConsumerState<SendView> {
} else { } else {
final isValidAddress = ref final isValidAddress = ref
.read(pWallets) .read(pWallets)
.getManager(walletId) .getWallet(walletId)
.cryptoCurrency
.validateAddress(address ?? ""); .validateAddress(address ?? "");
ref.read(previewTxButtonStateProvider.state).state = ref.read(previewTxButtonStateProvider.state).state =
(isValidAddress && amount != null && amount > Amount.zero); (isValidAddress && amount != null && amount > Amount.zero);
@ -275,9 +277,8 @@ class _SendViewState extends ConsumerState<SendView> {
return cachedFees[amount]!; return cachedFees[amount]!;
} }
final manager = final wallet = ref.read(pWallets).getWallet(walletId);
ref.read(pWallets).getManager(walletId); final feeObject = await wallet.fees;
final feeObject = await manager.fees;
late final int feeRate; late final int feeRate;
@ -312,7 +313,7 @@ class _SendViewState extends ConsumerState<SendView> {
throw ArgumentError("custom fee not available for monero"); throw ArgumentError("custom fee not available for monero");
} }
fee = await manager.estimateFeeFor(amount, specialMoneroId.raw!); fee = await wallet.estimateFeeFor(amount, specialMoneroId.raw!);
cachedFees[amount] = ref.read(pAmountFormatter(coin)).format( cachedFees[amount] = ref.read(pAmountFormatter(coin)).format(
fee, fee,
withUnitName: true, withUnitName: true,
@ -323,7 +324,7 @@ class _SendViewState extends ConsumerState<SendView> {
} else if (coin == Coin.firo || coin == Coin.firoTestNet) { } else if (coin == Coin.firo || coin == Coin.firoTestNet) {
if (ref.read(publicPrivateBalanceStateProvider.state).state == if (ref.read(publicPrivateBalanceStateProvider.state).state ==
"Private") { "Private") {
fee = await manager.estimateFeeFor(amount, feeRate); fee = await wallet.estimateFeeFor(amount, feeRate);
cachedFiroPrivateFees[amount] = ref.read(pAmountFormatter(coin)).format( cachedFiroPrivateFees[amount] = ref.read(pAmountFormatter(coin)).format(
fee, fee,
@ -333,19 +334,21 @@ class _SendViewState extends ConsumerState<SendView> {
return cachedFiroPrivateFees[amount]!; return cachedFiroPrivateFees[amount]!;
} else { } else {
fee = await (manager.wallet as FiroWallet) // TODO: [prio=high] firo public send fees refactor or something...
.estimateFeeForPublic(amount, feeRate); throw UnimplementedError("Firo pub fees todo");
// fee = await (manager.wallet as FiroWallet)
cachedFiroPublicFees[amount] = ref.read(pAmountFormatter(coin)).format( // .estimateFeeForPublic(amount, feeRate);
fee, //
withUnitName: true, // cachedFiroPublicFees[amount] = ref.read(pAmountFormatter(coin)).format(
indicatePrecisionLoss: false, // fee,
); // withUnitName: true,
// indicatePrecisionLoss: false,
return cachedFiroPublicFees[amount]!; // );
//
// return cachedFiroPublicFees[amount]!;
} }
} else { } else {
fee = await manager.estimateFeeFor(amount, feeRate); fee = await wallet.estimateFeeFor(amount, feeRate);
cachedFees[amount] = ref.read(pAmountFormatter(coin)).format( cachedFees[amount] = ref.read(pAmountFormatter(coin)).format(
fee, fee,
withUnitName: true, withUnitName: true,
@ -356,57 +359,34 @@ class _SendViewState extends ConsumerState<SendView> {
} }
} }
Future<String?> _firoBalanceFuture(
ChangeNotifierProvider<Manager> provider, String locale) async {
final wallet = ref.read(provider).wallet as FiroWallet?;
if (wallet != null) {
Amount? balance;
if (ref.read(publicPrivateBalanceStateProvider.state).state ==
"Private") {
balance = wallet.availablePrivateBalance();
} else {
balance = wallet.availablePublicBalance();
}
return ref.read(pAmountFormatter(coin)).format(
balance,
);
}
return null;
}
Future<void> _previewTransaction() async { Future<void> _previewTransaction() async {
// wait for keyboard to disappear // wait for keyboard to disappear
FocusScope.of(context).unfocus(); FocusScope.of(context).unfocus();
await Future<void>.delayed( await Future<void>.delayed(
const Duration(milliseconds: 100), const Duration(milliseconds: 100),
); );
final manager = final wallet = ref.read(pWallets).getWallet(walletId);
ref.read(pWallets).getManager(walletId);
final Amount amount = _amountToSend!; final Amount amount = _amountToSend!;
final Amount availableBalance; final Amount availableBalance;
if ((coin == Coin.firo || coin == Coin.firoTestNet)) { if ((coin == Coin.firo || coin == Coin.firoTestNet)) {
if (ref.read(publicPrivateBalanceStateProvider.state).state == if (ref.read(publicPrivateBalanceStateProvider.state).state ==
"Private") { "Private") {
availableBalance = availableBalance = ref.read(pWalletBalance(walletId)).spendable;
(manager.wallet as FiroWallet).availablePrivateBalance();
} else { } else {
availableBalance = availableBalance =
(manager.wallet as FiroWallet).availablePublicBalance(); ref.read(pWalletBalanceSecondary(walletId)).spendable;
} }
} else { } else {
availableBalance = manager.balance.spendable; availableBalance = ref.read(pWalletBalance(walletId)).spendable;
} }
final coinControlEnabled = final coinControlEnabled =
ref.read(prefsChangeNotifierProvider).enableCoinControl; ref.read(prefsChangeNotifierProvider).enableCoinControl;
if (coin != Coin.ethereum && if (coin != Coin.ethereum &&
!(manager.hasCoinControlSupport && coinControlEnabled) || !(wallet is CoinControlInterface && coinControlEnabled) ||
(manager.hasCoinControlSupport && (wallet is CoinControlInterface &&
coinControlEnabled && coinControlEnabled &&
selectedUTXOs.isEmpty)) { selectedUTXOs.isEmpty)) {
// confirm send all // confirm send all
@ -472,7 +452,7 @@ class _SendViewState extends ConsumerState<SendView> {
barrierDismissible: false, barrierDismissible: false,
builder: (context) { builder: (context) {
return BuildingTransactionDialog( return BuildingTransactionDialog(
coin: manager.coin, coin: wallet.info.coin,
onCancel: () { onCancel: () {
wasCancelled = true; wasCancelled = true;
@ -490,59 +470,59 @@ class _SendViewState extends ConsumerState<SendView> {
), ),
); );
Map<String, dynamic> txData; Future<TxData> txDataFuture;
Future<Map<String, dynamic>> txDataFuture;
if (isPaynymSend) { if (isPaynymSend) {
final wallet = manager.wallet as PaynymWalletInterface;
final paymentCode = PaymentCode.fromPaymentCode( final paymentCode = PaymentCode.fromPaymentCode(
widget.accountLite!.code, widget.accountLite!.code,
networkType: wallet.networkType, networkType: (wallet as PaynymWalletInterface).networkType,
);
final feeRate = ref.read(feeRateTypeStateProvider);
txDataFuture = wallet.preparePaymentCodeSend(
paymentCode: paymentCode,
isSegwit: widget.accountLite!.segwit,
amount: amount,
args: {
"satsPerVByte": isCustomFee ? customFeeRate : null,
"feeRate": feeRate,
"UTXOs": (manager.hasCoinControlSupport &&
coinControlEnabled &&
selectedUTXOs.isNotEmpty)
? selectedUTXOs
: null,
},
); );
throw UnimplementedError("FIXME");
// TODO: [prio=high] paynym prepare send using TxData
// final feeRate = ref.read(feeRateTypeStateProvider);
// txDataFuture = (wallet as PaynymWalletInterface).preparePaymentCodeSend(
// paymentCode: paymentCode,
// isSegwit: widget.accountLite!.segwit,
// amount: amount,
// args: {
// "satsPerVByte": isCustomFee ? customFeeRate : null,
// "feeRate": feeRate,
// "UTXOs": (wallet is CoinControlInterface &&
// coinControlEnabled &&
// selectedUTXOs.isNotEmpty)
// ? selectedUTXOs
// : null,
// },
// );
} else if ((coin == Coin.firo || coin == Coin.firoTestNet) && } else if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
ref.read(publicPrivateBalanceStateProvider.state).state != ref.read(publicPrivateBalanceStateProvider.state).state !=
"Private") { "Private") {
txDataFuture = (manager.wallet as FiroWallet).prepareSendPublic( throw UnimplementedError("FIXME");
address: _address!, // TODO: [prio=high] firo prepare send using TxData
amount: amount, // txDataFuture = (manager.wallet as FiroWallet).prepareSendPublic(
args: { // address: _address!,
"feeRate": ref.read(feeRateTypeStateProvider), // amount: amount,
"satsPerVByte": isCustomFee ? customFeeRate : null, // args: {
}, // "feeRate": ref.read(feeRateTypeStateProvider),
); // "satsPerVByte": isCustomFee ? customFeeRate : null,
// },
// );
} else { } else {
final memo = final memo = coin == Coin.stellar || coin == Coin.stellarTestnet
manager.coin == Coin.stellar || manager.coin == Coin.stellarTestnet ? memoController.text
? memoController.text : null;
: null; txDataFuture = wallet.prepareSend(
txDataFuture = manager.prepareSend( txData: TxData(
address: _address!, recipients: [(address: _address!, amount: amount)],
amount: amount, memo: memo,
args: { feeRateType: ref.read(feeRateTypeStateProvider),
"memo": memo, satsPerVByte: isCustomFee ? customFeeRate : null,
"feeRate": ref.read(feeRateTypeStateProvider), utxos: (wallet is CoinControlInterface &&
"satsPerVByte": isCustomFee ? customFeeRate : null,
"UTXOs": (manager.hasCoinControlSupport &&
coinControlEnabled && coinControlEnabled &&
selectedUTXOs.isNotEmpty) selectedUTXOs.isNotEmpty)
? selectedUTXOs ? selectedUTXOs
: null, : null,
}, ),
); );
} }
@ -551,24 +531,22 @@ class _SendViewState extends ConsumerState<SendView> {
time, time,
]); ]);
txData = results.first as Map<String, dynamic>; TxData txData = results.first as TxData;
if (!wasCancelled && mounted) { if (!wasCancelled && mounted) {
// pop building dialog // pop building dialog
Navigator.of(context).pop(); Navigator.of(context).pop();
txData["note"] = noteController.text; txData = txData.copyWith(note: noteController.text);
txData["onChainNote"] = onChainNoteController.text; txData = txData.copyWith(noteOnChain: onChainNoteController.text);
if (isPaynymSend) { if (isPaynymSend) {
txData["paynymAccountLite"] = widget.accountLite!; txData = txData.copyWith(paynymAccountLite: widget.accountLite!);
} else {
txData["address"] = _address;
} }
unawaited(Navigator.of(context).push( unawaited(Navigator.of(context).push(
RouteGenerator.getRoute( RouteGenerator.getRoute(
shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute, shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute,
builder: (_) => ConfirmTransactionView( builder: (_) => ConfirmTransactionView(
transactionInfo: txData, txData: txData,
walletId: walletId, walletId: walletId,
isPaynymTransaction: isPaynymSend, isPaynymTransaction: isPaynymSend,
), ),
@ -729,16 +707,11 @@ class _SendViewState extends ConsumerState<SendView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final provider = ref.watch(pWallets final wallet = ref.watch(pWallets).getWallet(walletId);
.select((value) => value.getManagerProvider(walletId)));
final String locale = ref.watch( final String locale = ref.watch(
localeServiceChangeNotifierProvider.select((value) => value.locale)); localeServiceChangeNotifierProvider.select((value) => value.locale));
final showCoinControl = ref.watch( final showCoinControl = wallet is CoinControlInterface &&
pWallets.select(
(value) => value.getManager(walletId).hasCoinControlSupport,
),
) &&
ref.watch( ref.watch(
prefsChangeNotifierProvider.select( prefsChangeNotifierProvider.select(
(value) => value.enableCoinControl, (value) => value.enableCoinControl,
@ -848,8 +821,7 @@ class _SendViewState extends ConsumerState<SendView> {
CrossAxisAlignment.start, CrossAxisAlignment.start,
children: [ children: [
Text( Text(
ref.watch(provider.select( ref.watch(pWalletName(walletId)),
(value) => value.walletName)),
style: STextStyles.titleBold12(context) style: STextStyles.titleBold12(context)
.copyWith(fontSize: 14), .copyWith(fontSize: 14),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
@ -875,116 +847,75 @@ class _SendViewState extends ConsumerState<SendView> {
], ],
), ),
const Spacer(), const Spacer(),
FutureBuilder( Builder(builder: (context) {
// TODO redo this widget now that its not actually a future final Amount amount;
future: (coin != Coin.firo && if (coin != Coin.firo &&
coin != Coin.firoTestNet) coin != Coin.firoTestNet) {
? Future(() => ref.watch( if (ref
provider.select((value) => .watch(
value.balance.spendable))) publicPrivateBalanceStateProvider
: ref.watch(publicPrivateBalanceStateProvider.state).state == .state)
"Private" .state ==
? Future(() => (ref "Private") {
.watch(provider) amount = ref
.wallet as FiroWallet) .read(pWalletBalance(walletId))
.availablePrivateBalance()) .spendable;
: Future(() => (ref
.watch(provider)
.wallet as FiroWallet)
.availablePublicBalance()),
builder:
(_, AsyncSnapshot<Amount> snapshot) {
if (snapshot.connectionState ==
ConnectionState.done &&
snapshot.hasData) {
_cachedBalance = snapshot.data!;
}
if (_cachedBalance != null) {
return GestureDetector(
onTap: () {
cryptoAmountController.text = ref
.read(pAmountFormatter(coin))
.format(
_cachedBalance!,
withUnitName: false,
);
},
child: Container(
color: Colors.transparent,
child: Column(
crossAxisAlignment:
CrossAxisAlignment.end,
children: [
Text(
ref
.watch(pAmountFormatter(
coin))
.format(_cachedBalance!),
style:
STextStyles.titleBold12(
context)
.copyWith(
fontSize: 10,
),
textAlign: TextAlign.right,
),
Text(
"${(_cachedBalance!.decimal * ref.watch(priceAnd24hChangeNotifierProvider.select((value) => value.getPrice(coin).item1))).toAmount(
fractionDigits: 2,
).fiatString(
locale: locale,
)} ${ref.watch(prefsChangeNotifierProvider.select((value) => value.currency))}",
style: STextStyles.subtitle(
context)
.copyWith(
fontSize: 8,
),
textAlign: TextAlign.right,
)
],
),
),
);
} else { } else {
return Column( amount = ref
.read(pWalletBalanceSecondary(
walletId))
.spendable;
}
} else {
amount = ref
.read(pWalletBalance(walletId))
.spendable;
}
return GestureDetector(
onTap: () {
cryptoAmountController.text = ref
.read(pAmountFormatter(coin))
.format(
amount,
withUnitName: false,
);
},
child: Container(
color: Colors.transparent,
child: Column(
crossAxisAlignment: crossAxisAlignment:
CrossAxisAlignment.end, CrossAxisAlignment.end,
children: [ children: [
AnimatedText( Text(
stringsToLoopThrough: const [ ref
"Loading balance ", .watch(pAmountFormatter(coin))
"Loading balance. ", .format(amount),
"Loading balance.. ", style: STextStyles.titleBold12(
"Loading balance...",
],
style: STextStyles.itemSubtitle(
context) context)
.copyWith( .copyWith(
fontSize: 10, fontSize: 10,
), ),
textAlign: TextAlign.right,
), ),
const SizedBox( Text(
height: 2, "${(amount.decimal * ref.watch(priceAnd24hChangeNotifierProvider.select((value) => value.getPrice(coin).item1))).toAmount(
), fractionDigits: 2,
AnimatedText( ).fiatString(
stringsToLoopThrough: const [ locale: locale,
"Loading balance ", )} ${ref.watch(prefsChangeNotifierProvider.select((value) => value.currency))}",
"Loading balance. ", style:
"Loading balance.. ", STextStyles.subtitle(context)
"Loading balance...", .copyWith(
],
style: STextStyles.itemSubtitle(
context)
.copyWith(
fontSize: 8, fontSize: 8,
), ),
textAlign: TextAlign.right,
) )
], ],
); ),
} ),
}, );
), }),
], ],
), ),
), ),
@ -1269,9 +1200,9 @@ class _SendViewState extends ConsumerState<SendView> {
// now check for non standard encoded basic address // now check for non standard encoded basic address
} else if (ref } else if (ref
.read( .read(pWallets)
pWallets) .getWallet(walletId)
.getManager(walletId) .cryptoCurrency
.validateAddress(qrResult .validateAddress(qrResult
.rawContent)) { .rawContent)) {
_address = qrResult _address = qrResult
@ -1397,9 +1328,6 @@ class _SendViewState extends ConsumerState<SendView> {
builder: (_) { builder: (_) {
final error = _updateInvalidAddressText( final error = _updateInvalidAddressText(
_address ?? "", _address ?? "",
ref
.read(pWallets)
.getManager(walletId),
); );
if (error == null || error.isEmpty) { if (error == null || error.isEmpty) {
@ -1493,68 +1421,40 @@ class _SendViewState extends ConsumerState<SendView> {
const SizedBox( const SizedBox(
width: 10, width: 10,
), ),
FutureBuilder( if (ref
future: _firoBalanceFuture( .read(
provider, locale), publicPrivateBalanceStateProvider
builder: (context, .state)
AsyncSnapshot<String?> .state ==
snapshot) { "Private")
if (snapshot.connectionState == Text(
ConnectionState.done && ref
snapshot.hasData) { .watch(
if (ref pAmountFormatter(coin))
.read( .format(
publicPrivateBalanceStateProvider ref
.state) .watch(pWalletBalance(
.state == walletId))
"Private") { .spendable,
_privateBalanceString = ),
snapshot.data!; style: STextStyles.itemSubtitle(
} else { context),
_publicBalanceString = )
snapshot.data!; else
} Text(
} ref
if (ref .watch(
.read( pAmountFormatter(coin))
publicPrivateBalanceStateProvider .format(
.state) ref
.state == .watch(
"Private" && pWalletBalanceSecondary(
_privateBalanceString != walletId))
null) { .spendable,
return Text( ),
"$_privateBalanceString", style: STextStyles.itemSubtitle(
style: STextStyles context),
.itemSubtitle(context), ),
);
} else if (ref
.read(
publicPrivateBalanceStateProvider
.state)
.state ==
"Public" &&
_publicBalanceString !=
null) {
return Text(
"$_publicBalanceString",
style: STextStyles
.itemSubtitle(context),
);
} else {
return AnimatedText(
stringsToLoopThrough: const [
"Loading balance",
"Loading balance.",
"Loading balance..",
"Loading balance...",
],
style: STextStyles
.itemSubtitle(context),
);
}
},
),
], ],
), ),
SvgPicture.asset( SvgPicture.asset(
@ -1586,40 +1486,29 @@ class _SendViewState extends ConsumerState<SendView> {
CustomTextButton( CustomTextButton(
text: "Send all ${coin.ticker}", text: "Send all ${coin.ticker}",
onTap: () async { onTap: () async {
if (coin == Coin.firo || if ((coin == Coin.firo ||
coin == Coin.firoTestNet) { coin == Coin.firoTestNet) &&
final firoWallet = ref ref
.read(provider) .read(
.wallet as FiroWallet; publicPrivateBalanceStateProvider
if (ref .state)
.read( .state ==
publicPrivateBalanceStateProvider "Public") {
.state) cryptoAmountController.text = ref
.state == .read(pAmountFormatter(coin))
"Private") { .format(
cryptoAmountController.text = ref ref
.read(pAmountFormatter(coin)) .read(pWalletBalanceSecondary(
.format( walletId))
firoWallet .spendable,
.availablePrivateBalance(), withUnitName: false,
withUnitName: false, );
);
} else {
cryptoAmountController.text = ref
.read(pAmountFormatter(coin))
.format(
firoWallet
.availablePublicBalance(),
withUnitName: false,
);
}
} else { } else {
cryptoAmountController.text = ref cryptoAmountController.text = ref
.read(pAmountFormatter(coin)) .read(pAmountFormatter(coin))
.format( .format(
ref ref
.read(provider) .read(pWalletBalance(walletId))
.balance
.spendable, .spendable,
withUnitName: false, withUnitName: false,
); );
@ -1853,9 +1742,7 @@ class _SendViewState extends ConsumerState<SendView> {
if (mounted) { if (mounted) {
final spendable = ref final spendable = ref
.read(pWallets) .read(pWalletBalance(walletId))
.getManager(widget.walletId)
.balance
.spendable; .spendable;
Amount? amount; Amount? amount;

View file

@ -52,9 +52,11 @@ class _FiroBalanceSelectionSheetState
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final manager = final wallet =
ref.watch(pWallets.select((value) => value.getManager(walletId))); ref.watch(pWallets.select((value) => value.getWallet(walletId)));
final firoWallet = manager.wallet as FiroWallet; final firoWallet = wallet as FiroWallet;
final coin = wallet.info.coin;
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@ -162,9 +164,7 @@ class _FiroBalanceSelectionSheetState
width: 2, width: 2,
), ),
Text( Text(
ref ref.watch(pAmountFormatter(coin)).format(
.watch(pAmountFormatter(manager.coin))
.format(
firoWallet.availablePrivateBalance(), firoWallet.availablePrivateBalance(),
), ),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
@ -240,9 +240,7 @@ class _FiroBalanceSelectionSheetState
width: 2, width: 2,
), ),
Text( Text(
ref ref.watch(pAmountFormatter(coin)).format(
.watch(pAmountFormatter(manager.coin))
.format(
firoWallet.availablePublicBalance(), firoWallet.availablePublicBalance(),
), ),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),

View file

@ -25,6 +25,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart'; import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart';
import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/animated_text.dart'; import 'package:stackwallet/widgets/animated_text.dart';
final feeSheetSessionCacheProvider = final feeSheetSessionCacheProvider =
@ -83,21 +84,21 @@ class _TransactionFeeSelectionSheetState
case FeeRateType.fast: case FeeRateType.fast:
if (ref.read(feeSheetSessionCacheProvider).fast[amount] == null) { if (ref.read(feeSheetSessionCacheProvider).fast[amount] == null) {
if (widget.isToken == false) { if (widget.isToken == false) {
final manager = ref.read(pWallets).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
if (coin == Coin.monero || coin == Coin.wownero) { if (coin == Coin.monero || coin == Coin.wownero) {
final fee = await manager.estimateFeeFor( final fee = await wallet.estimateFeeFor(
amount, MoneroTransactionPriority.fast.raw!); amount, MoneroTransactionPriority.fast.raw!);
ref.read(feeSheetSessionCacheProvider).fast[amount] = fee; ref.read(feeSheetSessionCacheProvider).fast[amount] = fee;
} else if ((coin == Coin.firo || coin == Coin.firoTestNet) && } else if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
ref.read(publicPrivateBalanceStateProvider.state).state != ref.read(publicPrivateBalanceStateProvider.state).state !=
"Private") { "Private") {
ref.read(feeSheetSessionCacheProvider).fast[amount] = ref.read(feeSheetSessionCacheProvider).fast[amount] =
await (manager.wallet as FiroWallet) await (wallet as FiroWallet)
.estimateFeeForPublic(amount, feeRate); .estimateFeeForPublic(amount, feeRate);
} else { } else {
ref.read(feeSheetSessionCacheProvider).fast[amount] = ref.read(feeSheetSessionCacheProvider).fast[amount] =
await manager.estimateFeeFor(amount, feeRate); await wallet.estimateFeeFor(amount, feeRate);
} }
} else { } else {
final tokenWallet = ref.read(tokenServiceProvider)!; final tokenWallet = ref.read(tokenServiceProvider)!;
@ -110,20 +111,20 @@ class _TransactionFeeSelectionSheetState
case FeeRateType.average: case FeeRateType.average:
if (ref.read(feeSheetSessionCacheProvider).average[amount] == null) { if (ref.read(feeSheetSessionCacheProvider).average[amount] == null) {
if (widget.isToken == false) { if (widget.isToken == false) {
final manager = ref.read(pWallets).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
if (coin == Coin.monero || coin == Coin.wownero) { if (coin == Coin.monero || coin == Coin.wownero) {
final fee = await manager.estimateFeeFor( final fee = await wallet.estimateFeeFor(
amount, MoneroTransactionPriority.regular.raw!); amount, MoneroTransactionPriority.regular.raw!);
ref.read(feeSheetSessionCacheProvider).average[amount] = fee; ref.read(feeSheetSessionCacheProvider).average[amount] = fee;
} else if ((coin == Coin.firo || coin == Coin.firoTestNet) && } else if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
ref.read(publicPrivateBalanceStateProvider.state).state != ref.read(publicPrivateBalanceStateProvider.state).state !=
"Private") { "Private") {
ref.read(feeSheetSessionCacheProvider).average[amount] = ref.read(feeSheetSessionCacheProvider).average[amount] =
await (manager.wallet as FiroWallet) await (wallet as FiroWallet)
.estimateFeeForPublic(amount, feeRate); .estimateFeeForPublic(amount, feeRate);
} else { } else {
ref.read(feeSheetSessionCacheProvider).average[amount] = ref.read(feeSheetSessionCacheProvider).average[amount] =
await manager.estimateFeeFor(amount, feeRate); await wallet.estimateFeeFor(amount, feeRate);
} }
} else { } else {
final tokenWallet = ref.read(tokenServiceProvider)!; final tokenWallet = ref.read(tokenServiceProvider)!;
@ -136,20 +137,20 @@ class _TransactionFeeSelectionSheetState
case FeeRateType.slow: case FeeRateType.slow:
if (ref.read(feeSheetSessionCacheProvider).slow[amount] == null) { if (ref.read(feeSheetSessionCacheProvider).slow[amount] == null) {
if (widget.isToken == false) { if (widget.isToken == false) {
final manager = ref.read(pWallets).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
if (coin == Coin.monero || coin == Coin.wownero) { if (coin == Coin.monero || coin == Coin.wownero) {
final fee = await manager.estimateFeeFor( final fee = await wallet.estimateFeeFor(
amount, MoneroTransactionPriority.slow.raw!); amount, MoneroTransactionPriority.slow.raw!);
ref.read(feeSheetSessionCacheProvider).slow[amount] = fee; ref.read(feeSheetSessionCacheProvider).slow[amount] = fee;
} else if ((coin == Coin.firo || coin == Coin.firoTestNet) && } else if ((coin == Coin.firo || coin == Coin.firoTestNet) &&
ref.read(publicPrivateBalanceStateProvider.state).state != ref.read(publicPrivateBalanceStateProvider.state).state !=
"Private") { "Private") {
ref.read(feeSheetSessionCacheProvider).slow[amount] = ref.read(feeSheetSessionCacheProvider).slow[amount] =
await (manager.wallet as FiroWallet) await (wallet as FiroWallet)
.estimateFeeForPublic(amount, feeRate); .estimateFeeForPublic(amount, feeRate);
} else { } else {
ref.read(feeSheetSessionCacheProvider).slow[amount] = ref.read(feeSheetSessionCacheProvider).slow[amount] =
await manager.estimateFeeFor(amount, feeRate); await wallet.estimateFeeFor(amount, feeRate);
} }
} else { } else {
final tokenWallet = ref.read(tokenServiceProvider)!; final tokenWallet = ref.read(tokenServiceProvider)!;
@ -200,8 +201,9 @@ class _TransactionFeeSelectionSheetState
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final manager = final wallet = ref.watch(pWallets).getWallet(walletId);
ref.watch(pWallets.select((value) => value.getManager(walletId)));
final coin = ref.watch(pWalletCoin(walletId));
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@ -241,7 +243,7 @@ class _TransactionFeeSelectionSheetState
FutureBuilder( FutureBuilder(
future: widget.isToken future: widget.isToken
? ref.read(tokenServiceProvider)!.fees ? ref.read(tokenServiceProvider)!.fees
: manager.fees, : wallet.fees,
builder: (context, AsyncSnapshot<FeeObject> snapshot) { builder: (context, AsyncSnapshot<FeeObject> snapshot) {
if (snapshot.connectionState == ConnectionState.done && if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) { snapshot.hasData) {
@ -267,7 +269,8 @@ class _TransactionFeeSelectionSheetState
ref.read(feeRateTypeStateProvider.state).state = ref.read(feeRateTypeStateProvider.state).state =
FeeRateType.fast; FeeRateType.fast;
} }
String? fee = getAmount(FeeRateType.fast, manager.coin); String? fee =
getAmount(FeeRateType.fast, wallet.info.coin);
if (fee != null) { if (fee != null) {
widget.updateChosen(fee); widget.updateChosen(fee);
} }
@ -330,7 +333,7 @@ class _TransactionFeeSelectionSheetState
if (feeObject != null) if (feeObject != null)
FutureBuilder( FutureBuilder(
future: feeFor( future: feeFor(
coin: manager.coin, coin: coin,
feeRateType: FeeRateType.fast, feeRateType: FeeRateType.fast,
feeRate: feeObject!.fast, feeRate: feeObject!.fast,
amount: amount, amount: amount,
@ -343,7 +346,7 @@ class _TransactionFeeSelectionSheetState
return Text( return Text(
"(~${ref.watch( "(~${ref.watch(
pAmountFormatter( pAmountFormatter(
manager.coin, coin,
), ),
).format( ).format(
snapshot.data!, snapshot.data!,
@ -370,18 +373,18 @@ class _TransactionFeeSelectionSheetState
height: 2, height: 2,
), ),
if (feeObject == null && if (feeObject == null &&
manager.coin != Coin.ethereum) coin != Coin.ethereum)
AnimatedText( AnimatedText(
stringsToLoopThrough: stringsToLoopThrough:
stringsToLoopThrough, stringsToLoopThrough,
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
if (feeObject != null && if (feeObject != null &&
manager.coin != Coin.ethereum) coin != Coin.ethereum)
Text( Text(
estimatedTimeToBeIncludedInNextBlock( estimatedTimeToBeIncludedInNextBlock(
Constants.targetBlockTimeInSeconds( Constants.targetBlockTimeInSeconds(
manager.coin), coin),
feeObject!.numberOfBlocksFast, feeObject!.numberOfBlocksFast,
), ),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
@ -405,8 +408,7 @@ class _TransactionFeeSelectionSheetState
ref.read(feeRateTypeStateProvider.state).state = ref.read(feeRateTypeStateProvider.state).state =
FeeRateType.average; FeeRateType.average;
} }
String? fee = String? fee = getAmount(FeeRateType.average, coin);
getAmount(FeeRateType.average, manager.coin);
if (fee != null) { if (fee != null) {
widget.updateChosen(fee); widget.updateChosen(fee);
} }
@ -467,7 +469,7 @@ class _TransactionFeeSelectionSheetState
if (feeObject != null) if (feeObject != null)
FutureBuilder( FutureBuilder(
future: feeFor( future: feeFor(
coin: manager.coin, coin: coin,
feeRateType: FeeRateType.average, feeRateType: FeeRateType.average,
feeRate: feeObject!.medium, feeRate: feeObject!.medium,
amount: amount, amount: amount,
@ -480,7 +482,7 @@ class _TransactionFeeSelectionSheetState
return Text( return Text(
"(~${ref.watch( "(~${ref.watch(
pAmountFormatter( pAmountFormatter(
manager.coin, coin,
), ),
).format( ).format(
snapshot.data!, snapshot.data!,
@ -507,18 +509,18 @@ class _TransactionFeeSelectionSheetState
height: 2, height: 2,
), ),
if (feeObject == null && if (feeObject == null &&
manager.coin != Coin.ethereum) coin != Coin.ethereum)
AnimatedText( AnimatedText(
stringsToLoopThrough: stringsToLoopThrough:
stringsToLoopThrough, stringsToLoopThrough,
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
if (feeObject != null && if (feeObject != null &&
manager.coin != Coin.ethereum) coin != Coin.ethereum)
Text( Text(
estimatedTimeToBeIncludedInNextBlock( estimatedTimeToBeIncludedInNextBlock(
Constants.targetBlockTimeInSeconds( Constants.targetBlockTimeInSeconds(
manager.coin), coin),
feeObject!.numberOfBlocksAverage, feeObject!.numberOfBlocksAverage,
), ),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
@ -542,7 +544,7 @@ class _TransactionFeeSelectionSheetState
ref.read(feeRateTypeStateProvider.state).state = ref.read(feeRateTypeStateProvider.state).state =
FeeRateType.slow; FeeRateType.slow;
} }
String? fee = getAmount(FeeRateType.slow, manager.coin); String? fee = getAmount(FeeRateType.slow, coin);
if (fee != null) { if (fee != null) {
widget.updateChosen(fee); widget.updateChosen(fee);
} }
@ -603,7 +605,7 @@ class _TransactionFeeSelectionSheetState
if (feeObject != null) if (feeObject != null)
FutureBuilder( FutureBuilder(
future: feeFor( future: feeFor(
coin: manager.coin, coin: coin,
feeRateType: FeeRateType.slow, feeRateType: FeeRateType.slow,
feeRate: feeObject!.slow, feeRate: feeObject!.slow,
amount: amount, amount: amount,
@ -616,7 +618,7 @@ class _TransactionFeeSelectionSheetState
return Text( return Text(
"(~${ref.watch( "(~${ref.watch(
pAmountFormatter( pAmountFormatter(
manager.coin, coin,
), ),
).format( ).format(
snapshot.data!, snapshot.data!,
@ -643,18 +645,18 @@ class _TransactionFeeSelectionSheetState
height: 2, height: 2,
), ),
if (feeObject == null && if (feeObject == null &&
manager.coin != Coin.ethereum) coin != Coin.ethereum)
AnimatedText( AnimatedText(
stringsToLoopThrough: stringsToLoopThrough:
stringsToLoopThrough, stringsToLoopThrough,
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
), ),
if (feeObject != null && if (feeObject != null &&
manager.coin != Coin.ethereum) coin != Coin.ethereum)
Text( Text(
estimatedTimeToBeIncludedInNextBlock( estimatedTimeToBeIncludedInNextBlock(
Constants.targetBlockTimeInSeconds( Constants.targetBlockTimeInSeconds(
manager.coin), coin),
feeObject!.numberOfBlocksSlow, feeObject!.numberOfBlocksSlow,
), ),
style: STextStyles.itemSubtitle(context), style: STextStyles.itemSubtitle(context),
@ -670,7 +672,7 @@ class _TransactionFeeSelectionSheetState
const SizedBox( const SizedBox(
height: 24, height: 24,
), ),
if (manager.coin.isElectrumXCoin) if (coin.isElectrumXCoin)
GestureDetector( GestureDetector(
onTap: () { onTap: () {
final state = final state =
@ -739,7 +741,7 @@ class _TransactionFeeSelectionSheetState
), ),
), ),
), ),
if (manager.coin.isElectrumXCoin) if (coin.isElectrumXCoin)
const SizedBox( const SizedBox(
height: 24, height: 24,
), ),

View file

@ -26,7 +26,6 @@ import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/ui/fee_rate_type_state_provider.dart'; import 'package:stackwallet/providers/ui/fee_rate_type_state_provider.dart';
import 'package:stackwallet/providers/ui/preview_tx_button_state_provider.dart'; import 'package:stackwallet/providers/ui/preview_tx_button_state_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/address_utils.dart'; import 'package:stackwallet/utilities/address_utils.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
@ -42,6 +41,8 @@ import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/prefs.dart'; import 'package:stackwallet/utilities/prefs.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/models/tx_data.dart';
import 'package:stackwallet/widgets/animated_text.dart'; import 'package:stackwallet/widgets/animated_text.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -194,7 +195,8 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
// now check for non standard encoded basic address // now check for non standard encoded basic address
} else if (ref } else if (ref
.read(pWallets) .read(pWallets)
.getManager(walletId) .getWallet(walletId)
.cryptoCurrency
.validateAddress(qrResult.rawContent)) { .validateAddress(qrResult.rawContent)) {
_address = qrResult.rawContent.trim(); _address = qrResult.rawContent.trim();
sendToController.text = _address ?? ""; sendToController.text = _address ?? "";
@ -325,19 +327,27 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
}); });
} }
String? _updateInvalidAddressText(String address, Manager manager) { String? _updateInvalidAddressText(String address) {
if (_data != null && _data!.contactLabel == address) { if (_data != null && _data!.contactLabel == address) {
return null; return null;
} }
if (address.isNotEmpty && !manager.validateAddress(address)) { if (address.isNotEmpty &&
!ref
.read(pWallets)
.getWallet(walletId)
.cryptoCurrency
.validateAddress(address)) {
return "Invalid address"; return "Invalid address";
} }
return null; return null;
} }
void _updatePreviewButtonState(String? address, Amount? amount) { void _updatePreviewButtonState(String? address, Amount? amount) {
final isValidAddress = final isValidAddress = ref
ref.read(pWallets).getManager(walletId).validateAddress(address ?? ""); .read(pWallets)
.getWallet(walletId)
.cryptoCurrency
.validateAddress(address ?? "");
ref.read(previewTxButtonStateProvider.state).state = ref.read(previewTxButtonStateProvider.state).state =
(isValidAddress && amount != null && amount > Amount.zero); (isValidAddress && amount != null && amount > Amount.zero);
} }
@ -378,7 +388,7 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
await Future<void>.delayed( await Future<void>.delayed(
const Duration(milliseconds: 100), const Duration(milliseconds: 100),
); );
final manager = ref.read(pWallets).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
final tokenWallet = ref.read(tokenServiceProvider)!; final tokenWallet = ref.read(tokenServiceProvider)!;
final Amount amount = _amountToSend!; final Amount amount = _amountToSend!;
@ -445,7 +455,7 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
barrierDismissible: false, barrierDismissible: false,
builder: (context) { builder: (context) {
return BuildingTransactionDialog( return BuildingTransactionDialog(
coin: manager.coin, coin: wallet.info.coin,
onCancel: () { onCancel: () {
wasCancelled = true; wasCancelled = true;
@ -463,15 +473,20 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
), ),
); );
Map<String, dynamic> txData; TxData txData;
Future<Map<String, dynamic>> txDataFuture; Future<TxData> txDataFuture;
txDataFuture = tokenWallet.prepareSend( txDataFuture = tokenWallet.prepareSend(
address: _address!, txData: TxData(
amount: amount, recipients: [
args: { (
"feeRate": ref.read(feeRateTypeStateProvider), address: _address!,
}, amount: amount,
)
],
feeRateType: ref.read(feeRateTypeStateProvider),
note: noteController.text,
),
); );
final results = await Future.wait([ final results = await Future.wait([
@ -479,20 +494,17 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
time, time,
]); ]);
txData = results.first as Map<String, dynamic>; txData = results.first as TxData;
if (!wasCancelled && mounted) { if (!wasCancelled && mounted) {
// pop building dialog // pop building dialog
Navigator.of(context).pop(); Navigator.of(context).pop();
txData["note"] = noteController.text;
txData["address"] = _address;
unawaited(Navigator.of(context).push( unawaited(Navigator.of(context).push(
RouteGenerator.getRoute( RouteGenerator.getRoute(
shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute, shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute,
builder: (_) => ConfirmTransactionView( builder: (_) => ConfirmTransactionView(
transactionInfo: txData, txData: txData,
walletId: walletId, walletId: walletId,
isTokenTx: true, isTokenTx: true,
), ),
@ -595,8 +607,6 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final provider = ref
.watch(pWallets.select((value) => value.getManagerProvider(walletId)));
final String locale = ref.watch( final String locale = ref.watch(
localeServiceChangeNotifierProvider.select((value) => value.locale)); localeServiceChangeNotifierProvider.select((value) => value.locale));
@ -664,8 +674,7 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
CrossAxisAlignment.start, CrossAxisAlignment.start,
children: [ children: [
Text( Text(
ref.watch(provider.select( ref.watch(pWalletName(walletId)),
(value) => value.walletName)),
style: STextStyles.titleBold12(context) style: STextStyles.titleBold12(context)
.copyWith(fontSize: 14), .copyWith(fontSize: 14),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
@ -857,7 +866,6 @@ class _TokenSendViewState extends ConsumerState<TokenSendView> {
builder: (_) { builder: (_) {
final error = _updateInvalidAddressText( final error = _updateInvalidAddressText(
_address ?? "", _address ?? "",
ref.read(pWallets).getManager(walletId),
); );
if (error == null || error.isEmpty) { if (error == null || error.isEmpty) {

View file

@ -359,7 +359,7 @@ abstract class SWB {
StackRestoringUIState? uiState, StackRestoringUIState? uiState,
WalletsService walletsService, WalletsService walletsService,
) async { ) async {
final manager = tuple.item2; final wallet = tuple.item2;
final walletbackup = tuple.item1; final walletbackup = tuple.item1;
List<String> mnemonicList = (walletbackup['mnemonic'] as List<dynamic>) List<String> mnemonicList = (walletbackup['mnemonic'] as List<dynamic>)
@ -705,7 +705,7 @@ abstract class SWB {
failovers, failovers,
); );
final manager = Manager(wallet); final wallet = Manager(wallet);
managers.add(Tuple2(walletbackup, manager)); managers.add(Tuple2(walletbackup, manager));
// check if cancel was requested and restore previous state // check if cancel was requested and restore previous state

View file

@ -105,10 +105,10 @@ class _RestoringWalletCardState extends ConsumerState<RestoringWalletCard> {
), ),
onRightTapped: restoringStatus == StackRestoringStatus.failed onRightTapped: restoringStatus == StackRestoringStatus.failed
? () async { ? () async {
final manager = ref.read(provider).manager!; final wallet = ref.read(provider).manager!;
ref.read(stackRestoringUIStateProvider).update( ref.read(stackRestoringUIStateProvider).update(
walletId: manager.walletId, walletId: wallet.walletId,
restoringStatus: StackRestoringStatus.restoring); restoringStatus: StackRestoringStatus.restoring);
try { try {
@ -250,7 +250,7 @@ class _RestoringWalletCardState extends ConsumerState<RestoringWalletCard> {
), ),
onRightTapped: restoringStatus == StackRestoringStatus.failed onRightTapped: restoringStatus == StackRestoringStatus.failed
? () async { ? () async {
final manager = ref.read(provider).manager!; final wallet = ref.read(provider).manager!;
ref.read(stackRestoringUIStateProvider).update( ref.read(stackRestoringUIStateProvider).update(
walletId: manager.walletId, walletId: manager.walletId,

View file

@ -19,6 +19,7 @@ import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
@ -45,7 +46,7 @@ class _StartupPreferencesViewState
// check if wallet exists (hasn't been deleted or otherwise missing) // check if wallet exists (hasn't been deleted or otherwise missing)
if (possibleWalletId != null) { if (possibleWalletId != null) {
try { try {
ref.read(pWallets).getManager(possibleWalletId); ref.read(pWallets).getWallet(possibleWalletId);
} catch (_) { } catch (_) {
safe = false; safe = false;
WidgetsBinding.instance.addPostFrameCallback((timeStamp) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
@ -252,19 +253,14 @@ class _StartupPreferencesViewState
File( File(
ref.watch( ref.watch(
coinIconProvider( coinIconProvider(
ref ref.watch(
.watch( pWalletCoin(
pWallets ref.watch(
.select( prefsChangeNotifierProvider.select((value) =>
(value) => value.startupWalletId!),
value.getManager( ),
ref.watch( ),
prefsChangeNotifierProvider.select((value) => value.startupWalletId!), ),
),
),
),
)
.coin,
), ),
), ),
), ),
@ -273,21 +269,15 @@ class _StartupPreferencesViewState
width: 10, width: 10,
), ),
Text( Text(
ref ref.watch(
.watch( pWalletName(
pWallets ref.watch(
.select( prefsChangeNotifierProvider.select(
(value) => (value) =>
value value.startupWalletId!),
.getManager( ),
ref.watch( ),
prefsChangeNotifierProvider.select((value) => ),
value.startupWalletId!),
),
),
),
)
.walletName,
style: STextStyles style: STextStyles
.itemSubtitle( .itemSubtitle(
context), context),

View file

@ -18,6 +18,7 @@ import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/custom_buttons/draggable_switch_button.dart'; import 'package:stackwallet/widgets/custom_buttons/draggable_switch_button.dart';
@ -38,10 +39,10 @@ class _StartupWalletSelectionViewState
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final managers = ref.watch(pWallets.select((value) => value.managers)); final wallets = ref.watch(pWallets).wallets;
_controllers.clear(); _controllers.clear();
for (final manager in managers) { for (final manager in wallets) {
_controllers[manager.walletId] = DSBController(); _controllers[manager.walletId] = DSBController();
} }
@ -94,18 +95,21 @@ class _StartupWalletSelectionViewState
padding: const EdgeInsets.all(0), padding: const EdgeInsets.all(0),
child: Column( child: Column(
children: [ children: [
...managers.map( ...wallets.map(
(manager) => Padding( (wallet) => Padding(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Row( child: Row(
key: Key( key: Key(
"startupWalletSelectionGroupKey_${manager.walletId}"), "startupWalletSelectionGroupKey_${wallet.walletId}"),
children: [ children: [
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context) color: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
.colorForCoin(manager.coin) .colorForCoin(
ref.watch(pWalletCoin(
wallet.walletId)),
)
.withOpacity(0.5), .withOpacity(0.5),
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius, Constants.size.circularBorderRadius,
@ -116,7 +120,10 @@ class _StartupWalletSelectionViewState
child: SvgPicture.file( child: SvgPicture.file(
File( File(
ref.watch( ref.watch(
coinIconProvider(manager.coin), coinIconProvider(
ref.watch(pWalletCoin(
wallet.walletId)),
),
), ),
), ),
width: 20, width: 20,
@ -135,7 +142,8 @@ class _StartupWalletSelectionViewState
CrossAxisAlignment.start, CrossAxisAlignment.start,
children: [ children: [
Text( Text(
manager.walletName, ref.watch(
pWalletName(wallet.walletId)),
style: STextStyles.titleBold12( style: STextStyles.titleBold12(
context), context),
), ),
@ -183,7 +191,7 @@ class _StartupWalletSelectionViewState
activeColor: Theme.of(context) activeColor: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
.radioButtonIconEnabled, .radioButtonIconEnabled,
value: manager.walletId, value: wallet.walletId,
groupValue: ref.watch( groupValue: ref.watch(
prefsChangeNotifierProvider.select( prefsChangeNotifierProvider.select(
(value) => (value) =>

View file

@ -11,6 +11,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/pages/settings_views/global_settings_view/syncing_preferences_views/wallet_syncing_options_view.dart'; import 'package:stackwallet/pages/settings_views/global_settings_view/syncing_preferences_views/wallet_syncing_options_view.dart';
import 'package:stackwallet/providers/global/active_wallet_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
@ -95,8 +96,8 @@ class SyncingOptionsView extends ConsumerWidget {
SyncingType.currentWalletOnly; SyncingType.currentWalletOnly;
// disable auto sync on all wallets that aren't active/current // disable auto sync on all wallets that aren't active/current
ref.read(pWallets).managers.forEach((e) { ref.read(pWallets).wallets.forEach((e) {
if (!e.isActiveWallet) { if (e.walletId != ref.read(currentWalletIdProvider)) {
e.shouldAutoSync = false; e.shouldAutoSync = false;
} }
}); });
@ -176,7 +177,7 @@ class SyncingOptionsView extends ConsumerWidget {
// enable auto sync on all wallets // enable auto sync on all wallets
ref ref
.read(pWallets) .read(pWallets)
.managers .wallets
.forEach((e) => e.shouldAutoSync = true); .forEach((e) => e.shouldAutoSync = true);
} }
}, },
@ -256,7 +257,7 @@ class SyncingOptionsView extends ConsumerWidget {
.walletIdsSyncOnStartup; .walletIdsSyncOnStartup;
// enable auto sync on selected wallets only // enable auto sync on selected wallets only
ref.read(pWallets).managers.forEach( ref.read(pWallets).wallets.forEach(
(e) => e.shouldAutoSync = ids.contains(e.walletId)); (e) => e.shouldAutoSync = ids.contains(e.walletId));
} }
}, },

View file

@ -13,6 +13,7 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/providers/global/active_wallet_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
@ -21,6 +22,7 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/sync_type_enum.dart'; import 'package:stackwallet/utilities/enums/sync_type_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -34,7 +36,7 @@ class WalletSyncingOptionsView extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final managers = ref.watch(pWallets.select((value) => value.managers)); final walletInfos = ref.watch(pWallets).wallets.map((e) => e.info);
final isDesktop = Util.isDesktop; final isDesktop = Util.isDesktop;
return ConditionalParent( return ConditionalParent(
@ -73,7 +75,7 @@ class WalletSyncingOptionsView extends ConsumerWidget {
condition: isDesktop, condition: isDesktop,
builder: (child) { builder: (child) {
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: 32), padding: const EdgeInsets.symmetric(horizontal: 32),
child: child, child: child,
); );
}, },
@ -108,18 +110,18 @@ class WalletSyncingOptionsView extends ConsumerWidget {
.background, .background,
child: Column( child: Column(
children: [ children: [
...managers.map( ...walletInfos.map(
(manager) => Padding( (info) => Padding(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Row( child: Row(
key: Key( key: Key(
"syncingPrefsSelectedWalletIdGroupKey_${manager.walletId}"), "syncingPrefsSelectedWalletIdGroupKey_${info.walletId}"),
children: [ children: [
Container( Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context) color: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
.colorForCoin(manager.coin) .colorForCoin(info.coin)
.withOpacity(0.5), .withOpacity(0.5),
borderRadius: BorderRadius.circular( borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius, Constants.size.circularBorderRadius,
@ -130,7 +132,7 @@ class WalletSyncingOptionsView extends ConsumerWidget {
child: SvgPicture.file( child: SvgPicture.file(
File( File(
ref.watch( ref.watch(
coinIconProvider(manager.coin), coinIconProvider(info.coin),
), ),
), ),
width: 20, width: 20,
@ -148,7 +150,7 @@ class WalletSyncingOptionsView extends ConsumerWidget {
CrossAxisAlignment.start, CrossAxisAlignment.start,
children: [ children: [
Text( Text(
manager.walletName, info.name,
style: style:
STextStyles.titleBold12(context), STextStyles.titleBold12(context),
), ),
@ -157,9 +159,12 @@ class WalletSyncingOptionsView extends ConsumerWidget {
), ),
Text( Text(
ref ref
.watch(pAmountFormatter( .watch(
manager.coin)) pAmountFormatter(info.coin))
.format(manager.balance.total), .format(ref
.watch(pWalletBalance(
info.walletId))
.total),
style: style:
STextStyles.itemSubtitle(context), STextStyles.itemSubtitle(context),
) )
@ -174,7 +179,7 @@ class WalletSyncingOptionsView extends ConsumerWidget {
.watch(prefsChangeNotifierProvider .watch(prefsChangeNotifierProvider
.select((value) => value .select((value) => value
.walletIdsSyncOnStartup)) .walletIdsSyncOnStartup))
.contains(manager.walletId), .contains(info.walletId),
onValueChanged: (value) { onValueChanged: (value) {
final syncType = ref final syncType = ref
.read(prefsChangeNotifierProvider) .read(prefsChangeNotifierProvider)
@ -184,22 +189,28 @@ class WalletSyncingOptionsView extends ConsumerWidget {
.walletIdsSyncOnStartup .walletIdsSyncOnStartup
.toList(); .toList();
if (value) { if (value) {
ids.add(manager.walletId); ids.add(info.walletId);
} else { } else {
ids.remove(manager.walletId); ids.remove(info.walletId);
} }
final wallet = ref
.read(pWallets)
.getWallet(info.walletId);
switch (syncType) { switch (syncType) {
case SyncingType.currentWalletOnly: case SyncingType.currentWalletOnly:
if (manager.isActiveWallet) { if (info.walletId ==
manager.shouldAutoSync = value; ref.read(
currentWalletIdProvider)) {
wallet.shouldAutoSync = value;
} }
break; break;
case SyncingType case SyncingType
.selectedWalletsAtStartup: .selectedWalletsAtStartup:
case SyncingType case SyncingType
.allWalletsOnStartup: .allWalletsOnStartup:
manager.shouldAutoSync = value; wallet.shouldAutoSync = value;
break; break;
} }

View file

@ -17,13 +17,13 @@ import 'package:flutter_svg/svg.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/address_utils.dart'; import 'package:stackwallet/utilities/address_utils.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/stack_dialog.dart'; import 'package:stackwallet/widgets/stack_dialog.dart';
@ -98,10 +98,7 @@ class WalletBackupView extends ConsumerWidget {
height: 4, height: 4,
), ),
Text( Text(
ref ref.watch(pWalletName(walletId)),
.watch(
pWallets.select((value) => value.getManager(walletId)))
.walletName,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: STextStyles.label(context).copyWith( style: STextStyles.label(context).copyWith(
fontSize: 12, fontSize: 12,

View file

@ -38,6 +38,7 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/animated_text.dart'; import 'package:stackwallet/widgets/animated_text.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
@ -136,12 +137,10 @@ class _WalletNetworkSettingsViewState
); );
try { try {
if (ref.read(pWallets).getManager(widget.walletId).coin == Coin.firo) { final wallet = ref.read(pWallets).getWallet(widget.walletId);
maxUnusedAddressGap = 50;
} await wallet.recover(isRescan: true
await ref.read(pWallets).getManager(widget.walletId).fullRescan( ,
maxUnusedAddressGap,
maxNumberOfIndexesToCheck,
); );
if (mounted) { if (mounted) {
@ -250,7 +249,7 @@ class _WalletNetworkSettingsViewState
}, },
); );
final coin = ref.read(pWallets).getManager(widget.walletId).coin; final coin = ref.read(pWalletCoin(widget.walletId));
if (coin == Coin.monero || coin == Coin.wownero || coin == Coin.epicCash) { if (coin == Coin.monero || coin == Coin.wownero || coin == Coin.epicCash) {
_blocksRemainingSubscription = eventBus.on<BlocksRemainingEvent>().listen( _blocksRemainingSubscription = eventBus.on<BlocksRemainingEvent>().listen(
@ -309,36 +308,36 @@ class _WalletNetworkSettingsViewState
? 430.0 ? 430.0
: screenWidth - (_padding * 2) - (_boxPadding * 3) - _iconSize; : screenWidth - (_padding * 2) - (_boxPadding * 3) - _iconSize;
final coin = ref.read(pWallets).getManager(widget.walletId).coin; final coin = ref.watch(pWalletCoin(widget.walletId));
if (coin == Coin.monero) {
double highestPercent = (ref // TODO: [prio=high] sync percent for certain wallets
.read(pWallets) // if (coin == Coin.monero) {
.getManager(widget.walletId) // double highestPercent =
.wallet as MoneroWallet) // (ref.read(pWallets).getWallet(widget.walletId).wallet as MoneroWallet)
.highestPercentCached; // .highestPercentCached;
if (_percent < highestPercent) { // if (_percent < highestPercent) {
_percent = highestPercent.clamp(0.0, 1.0); // _percent = highestPercent.clamp(0.0, 1.0);
} // }
} else if (coin == Coin.wownero) { // } else if (coin == Coin.wownero) {
double highestPercent = (ref // double highestPercent = (ref
.read(pWallets) // .watch(pWallets)
.getManager(widget.walletId) // .getWallet(widget.walletId)
.wallet as WowneroWallet) // .wallet as WowneroWallet)
.highestPercentCached; // .highestPercentCached;
if (_percent < highestPercent) { // if (_percent < highestPercent) {
_percent = highestPercent.clamp(0.0, 1.0); // _percent = highestPercent.clamp(0.0, 1.0);
} // }
} else if (coin == Coin.epicCash) { // } else if (coin == Coin.epicCash) {
double highestPercent = (ref // double highestPercent = (ref
.read(pWallets) // .watch(pWallets)
.getManager(widget.walletId) // .getWallet(widget.walletId)
.wallet as EpicCashWallet) // .wallet as EpicCashWallet)
.highestPercent; // .highestPercent;
if (_percent < highestPercent) { // if (_percent < highestPercent) {
_percent = highestPercent.clamp(0.0, 1.0); // _percent = highestPercent.clamp(0.0, 1.0);
} // }
} // }
return ConditionalParent( return ConditionalParent(
condition: !isDesktop, condition: !isDesktop,
@ -358,7 +357,7 @@ class _WalletNetworkSettingsViewState
style: STextStyles.navBarTitle(context), style: STextStyles.navBarTitle(context),
), ),
actions: [ actions: [
if (ref.read(pWallets).getManager(widget.walletId).coin != if (ref.watch(pWalletCoin(widget.walletId)) !=
Coin.epicCash) Coin.epicCash)
Padding( Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
@ -483,7 +482,7 @@ class _WalletNetworkSettingsViewState
CustomTextButton( CustomTextButton(
text: "Resync", text: "Resync",
onTap: () { onTap: () {
ref.read(pWallets).getManager(widget.walletId).refresh(); ref.read(pWallets).getWallet(widget.walletId).refresh();
}, },
), ),
], ],
@ -886,7 +885,7 @@ class _WalletNetworkSettingsViewState
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
"${ref.watch(pWallets.select((value) => value.getManager(widget.walletId).coin)).prettyName} nodes", "${ref.watch(pWalletCoin(widget.walletId)).prettyName} nodes",
textAlign: TextAlign.left, textAlign: TextAlign.left,
style: isDesktop style: isDesktop
? STextStyles.desktopTextExtraExtraSmall(context) ? STextStyles.desktopTextExtraExtraSmall(context)
@ -899,7 +898,7 @@ class _WalletNetworkSettingsViewState
AddEditNodeView.routeName, AddEditNodeView.routeName,
arguments: Tuple4( arguments: Tuple4(
AddEditNodeViewType.add, AddEditNodeViewType.add,
ref.read(pWallets).getManager(widget.walletId).coin, ref.read(pWalletCoin(widget.walletId)),
null, null,
WalletNetworkSettingsView.routeName, WalletNetworkSettingsView.routeName,
), ),
@ -912,18 +911,17 @@ class _WalletNetworkSettingsViewState
height: isDesktop ? 12 : 8, height: isDesktop ? 12 : 8,
), ),
NodesList( NodesList(
coin: ref.watch(pWallets coin: ref.watch(pWalletCoin(widget.walletId)),
.select((value) => value.getManager(widget.walletId).coin)),
popBackToRoute: WalletNetworkSettingsView.routeName, popBackToRoute: WalletNetworkSettingsView.routeName,
), ),
if (isDesktop && if (isDesktop &&
ref.read(pWallets).getManager(widget.walletId).coin != ref.watch(pWalletCoin(widget.walletId)) !=
Coin.epicCash) Coin.epicCash)
const SizedBox( const SizedBox(
height: 32, height: 32,
), ),
if (isDesktop && if (isDesktop &&
ref.read(pWallets).getManager(widget.walletId).coin != ref.watch(pWalletCoin(widget.walletId)) !=
Coin.epicCash) Coin.epicCash)
Padding( Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
@ -941,7 +939,7 @@ class _WalletNetworkSettingsViewState
), ),
), ),
if (isDesktop && if (isDesktop &&
ref.read(pWallets).getManager(widget.walletId).coin != ref.watch(pWalletCoin(widget.walletId)) !=
Coin.epicCash) Coin.epicCash)
RoundedWhiteContainer( RoundedWhiteContainer(
borderColor: isDesktop borderColor: isDesktop

View file

@ -40,6 +40,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/show_loading.dart'; import 'package:stackwallet/utilities/show_loading.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/wallet/bip39_wallet.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/secondary_button.dart'; import 'package:stackwallet/widgets/desktop/secondary_button.dart';
@ -88,7 +89,9 @@ class _WalletSettingsViewState extends ConsumerState<WalletSettingsView> {
void initState() { void initState() {
walletId = widget.walletId; walletId = widget.walletId;
coin = widget.coin; coin = widget.coin;
xPubEnabled = ref.read(pWallets).getManager(walletId).hasXPub; // TODO: [prio=low] xpubs
// xPubEnabled = ref.read(pWallets).getWallet(walletId).hasXPub;
xPubEnabled = false;
xpub = ""; xpub = "";
_currentSyncStatus = widget.initialSyncStatus; _currentSyncStatus = widget.initialSyncStatus;
@ -229,36 +232,42 @@ class _WalletSettingsViewState extends ConsumerState<WalletSettingsView> {
iconSize: 16, iconSize: 16,
title: "Wallet backup", title: "Wallet backup",
onPressed: () async { onPressed: () async {
final mnemonic = await ref final wallet = ref
.read(pWallets) .read(pWallets)
.getManager(walletId) .getWallet(widget.walletId);
.mnemonic; // TODO: [prio=high] take wallets that don't have amnemonic into account
if (wallet is Bip39Wallet) {
final mnemonic =
await wallet.getMnemonicAsWords();
if (mounted) { if (mounted) {
await Navigator.push( await Navigator.push(
context, context,
RouteGenerator.getRoute( RouteGenerator.getRoute(
shouldUseMaterialRoute: shouldUseMaterialRoute:
RouteGenerator RouteGenerator
.useMaterialPageRoute, .useMaterialPageRoute,
builder: (_) => LockscreenView( builder: (_) => LockscreenView(
routeOnSuccessArguments: routeOnSuccessArguments:
Tuple2(walletId, mnemonic), Tuple2(
showBackButton: true, walletId, mnemonic),
routeOnSuccess: showBackButton: true,
WalletBackupView.routeName, routeOnSuccess:
biometricsCancelButtonString: WalletBackupView
"CANCEL", .routeName,
biometricsLocalizedReason: biometricsCancelButtonString:
"Authenticate to view recovery phrase", "CANCEL",
biometricsAuthenticationTitle: biometricsLocalizedReason:
"View recovery phrase", "Authenticate to view recovery phrase",
biometricsAuthenticationTitle:
"View recovery phrase",
),
settings: const RouteSettings(
name:
"/viewRecoverPhraseLockscreen"),
), ),
settings: const RouteSettings( );
name: }
"/viewRecoverPhraseLockscreen"),
),
);
} }
}, },
); );
@ -405,10 +414,11 @@ class _WalletSettingsViewState extends ConsumerState<WalletSettingsView> {
builder: (_, ref, __) { builder: (_, ref, __) {
return TextButton( return TextButton(
onPressed: () { onPressed: () {
ref // TODO: [prio=med] needs more thought if this is still required
.read(pWallets) // ref
.getManager(walletId) // .read(pWallets)
.isActiveWallet = false; // .getWallet(walletId)
// .isActiveWallet = false;
ref ref
.read(transactionFilterProvider.state) .read(transactionFilterProvider.state)
.state = null; .state = null;
@ -464,8 +474,7 @@ class _EpiBoxInfoFormState extends ConsumerState<EpicBoxInfoForm> {
@override @override
void initState() { void initState() {
wallet = wallet = ref.read(pWallets).getWallet(widget.walletId) as EpicCashWallet;
ref.read(pWallets).getManager(widget.walletId).wallet as EpicCashWallet;
wallet.getEpicBoxConfig().then((EpicBoxConfigModel epicBoxConfig) { wallet.getEpicBoxConfig().then((EpicBoxConfigModel epicBoxConfig) {
hostController.text = epicBoxConfig.host; hostController.text = epicBoxConfig.host;

View file

@ -64,22 +64,24 @@ class _XPubViewState extends ConsumerState<ChangeRepresentativeView> {
String? representative; String? representative;
Future<String> loadRepresentative() async { Future<String> loadRepresentative() async {
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet = ref.read(pWallets).getWallet(widget.walletId);
final coin = wallet.info.coin;
if (manager.coin == Coin.nano) { if (coin == Coin.nano) {
return (manager.wallet as NanoWallet).getCurrentRepresentative(); return (wallet as NanoWallet).getCurrentRepresentative();
} else if (manager.coin == Coin.banano) { } else if (coin == Coin.banano) {
return (manager.wallet as BananoWallet).getCurrentRepresentative(); return (wallet as BananoWallet).getCurrentRepresentative();
} }
throw Exception("Unsupported wallet attempted to show representative!"); throw Exception("Unsupported wallet attempted to show representative!");
} }
Future<void> _save() async { Future<void> _save() async {
final manager = ref.read(pWallets).getManager(widget.walletId); final wallet = ref.read(pWallets).getWallet(widget.walletId);
final coin = wallet.info.coin;
final changeFuture = manager.coin == Coin.nano final changeFuture = coin == Coin.nano
? (manager.wallet as NanoWallet).changeRepresentative ? (wallet as NanoWallet).changeRepresentative
: (manager.wallet as BananoWallet).changeRepresentative; : (wallet as BananoWallet).changeRepresentative;
final result = await showLoading( final result = await showLoading(
whileFuture: changeFuture(_textController.text), whileFuture: changeFuture(_textController.text),

View file

@ -8,20 +8,20 @@
* *
*/ */
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart'; import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart';
import 'package:stackwallet/pages/home_view/home_view.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/stack_dialog.dart'; import 'package:stackwallet/widgets/stack_dialog.dart';
@ -29,14 +29,14 @@ import 'package:stackwallet/widgets/stack_dialog.dart';
class DeleteWalletRecoveryPhraseView extends ConsumerStatefulWidget { class DeleteWalletRecoveryPhraseView extends ConsumerStatefulWidget {
const DeleteWalletRecoveryPhraseView({ const DeleteWalletRecoveryPhraseView({
Key? key, Key? key,
required this.manager, required this.walletId,
required this.mnemonic, required this.mnemonic,
this.clipboardInterface = const ClipboardWrapper(), this.clipboardInterface = const ClipboardWrapper(),
}) : super(key: key); }) : super(key: key);
static const routeName = "/deleteWalletRecoveryPhrase"; static const routeName = "/deleteWalletRecoveryPhrase";
final Manager manager; final String walletId;
final List<String> mnemonic; final List<String> mnemonic;
final ClipboardInterface clipboardInterface; final ClipboardInterface clipboardInterface;
@ -48,13 +48,11 @@ class DeleteWalletRecoveryPhraseView extends ConsumerStatefulWidget {
class _DeleteWalletRecoveryPhraseViewState class _DeleteWalletRecoveryPhraseViewState
extends ConsumerState<DeleteWalletRecoveryPhraseView> { extends ConsumerState<DeleteWalletRecoveryPhraseView> {
late Manager _manager;
late List<String> _mnemonic; late List<String> _mnemonic;
late ClipboardInterface _clipboardInterface; late ClipboardInterface _clipboardInterface;
@override @override
void initState() { void initState() {
_manager = widget.manager;
_mnemonic = widget.mnemonic; _mnemonic = widget.mnemonic;
_clipboardInterface = widget.clipboardInterface; _clipboardInterface = widget.clipboardInterface;
super.initState(); super.initState();
@ -90,15 +88,18 @@ class _DeleteWalletRecoveryPhraseViewState
.topNavIconPrimary, .topNavIconPrimary,
), ),
onPressed: () async { onPressed: () async {
final words = await _manager.mnemonic;
await _clipboardInterface await _clipboardInterface
.setData(ClipboardData(text: words.join(" "))); .setData(ClipboardData(text: _mnemonic.join(" ")));
showFloatingFlushBar( if (mounted) {
type: FlushBarType.info, unawaited(
message: "Copied to clipboard", showFloatingFlushBar(
iconAsset: Assets.svg.copy, type: FlushBarType.info,
context: context, message: "Copied to clipboard",
); iconAsset: Assets.svg.copy,
context: context,
),
);
}
}, },
), ),
), ),
@ -114,7 +115,7 @@ class _DeleteWalletRecoveryPhraseViewState
height: 4, height: 4,
), ),
Text( Text(
_manager.walletName, ref.watch(pWalletName(widget.walletId)),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: STextStyles.label(context).copyWith( style: STextStyles.label(context).copyWith(
fontSize: 12, fontSize: 12,
@ -192,22 +193,23 @@ class _DeleteWalletRecoveryPhraseViewState
.extension<StackColors>()! .extension<StackColors>()!
.getPrimaryEnabledButtonStyle(context), .getPrimaryEnabledButtonStyle(context),
onPressed: () async { onPressed: () async {
final walletId = _manager.walletId; // TODO: [prio=high] wallet deletion
final walletsInstance =
ref.read(pWallets);
await ref
.read(walletsServiceChangeNotifierProvider)
.deleteWallet(_manager.walletName, true);
if (mounted) { // final walletId = _manager.walletId;
Navigator.of(context).popUntil( // final walletsInstance = ref.read(pWallets);
ModalRoute.withName(HomeView.routeName)); // await ref
} // .read(walletsServiceChangeNotifierProvider)
// .deleteWallet(_manager.walletName, true);
// wait for widget tree to dispose of any widgets watching the manager //
await Future<void>.delayed( // if (mounted) {
const Duration(seconds: 1)); // Navigator.of(context).popUntil(
walletsInstance.removeWallet(walletId: walletId); // ModalRoute.withName(HomeView.routeName));
// }
//
// // wait for widget tree to dispose of any widgets watching the manager
// await Future<void>.delayed(
// const Duration(seconds: 1));
// walletsInstance.removeWallet(walletId: walletId);
}, },
child: Text( child: Text(
"Ok", "Ok",

View file

@ -14,10 +14,10 @@ import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_set
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/wallet/bip39_wallet.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/rounded_container.dart'; import 'package:stackwallet/widgets/rounded_container.dart';
import 'package:tuple/tuple.dart';
class DeleteWalletWarningView extends ConsumerWidget { class DeleteWalletWarningView extends ConsumerWidget {
const DeleteWalletWarningView({ const DeleteWalletWarningView({
@ -99,15 +99,18 @@ class DeleteWalletWarningView extends ConsumerWidget {
.extension<StackColors>()! .extension<StackColors>()!
.getPrimaryEnabledButtonStyle(context), .getPrimaryEnabledButtonStyle(context),
onPressed: () async { onPressed: () async {
final manager = ref.read(pWallets).getManager(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
final mnemonic = await manager.mnemonic; final mnemonic =
Navigator.of(context).pushNamed( await (wallet as Bip39Wallet).getMnemonicAsWords();
DeleteWalletRecoveryPhraseView.routeName, if (context.mounted) {
arguments: Tuple2( await Navigator.of(context).pushNamed(
manager, DeleteWalletRecoveryPhraseView.routeName,
mnemonic, arguments: (
), walletId: walletId,
); mnemonicWords: mnemonic,
),
);
}
}, },
child: Text( child: Text(
"View Backup Key", "View Backup Key",

View file

@ -8,14 +8,17 @@
* *
*/ */
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart'; import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
@ -47,7 +50,7 @@ class _RenameWalletViewState extends ConsumerState<RenameWalletView> {
void initState() { void initState() {
_controller = TextEditingController(); _controller = TextEditingController();
walletId = widget.walletId; walletId = widget.walletId;
originalName = ref.read(pWallets).getManager(walletId).walletName; originalName = ref.read(pWalletName(walletId));
_controller.text = originalName; _controller.text = originalName;
super.initState(); super.initState();
} }
@ -125,29 +128,42 @@ class _RenameWalletViewState extends ConsumerState<RenameWalletView> {
.getPrimaryEnabledButtonStyle(context), .getPrimaryEnabledButtonStyle(context),
onPressed: () async { onPressed: () async {
final newName = _controller.text; final newName = _controller.text;
final success = await ref
.read(walletsServiceChangeNotifierProvider)
.renameWallet(
from: originalName,
to: newName,
shouldNotifyListeners: true,
);
if (success) { String? errMessage;
ref.read(pWallets).getManager(walletId).walletName = try {
newName; await ref.read(pWalletInfo(walletId)).updateName(
Navigator.of(context).pop(); newName: newName,
showFloatingFlushBar( isar: ref.read(mainDBProvider).isar,
type: FlushBarType.success, );
message: "Wallet renamed", } catch (e) {
context: context, if (e
); .toString()
} else { .contains("Empty wallet name not allowed!")) {
showFloatingFlushBar( errMessage = "Empty wallet name not allowed.";
type: FlushBarType.warning, } else {
message: "Wallet named \"$newName\" already exists", errMessage = e.toString();
context: context, }
); }
if (mounted) {
if (errMessage == null) {
Navigator.of(context).pop();
unawaited(
showFloatingFlushBar(
type: FlushBarType.success,
message: "Wallet renamed",
context: context,
),
);
} else {
unawaited(
showFloatingFlushBar(
type: FlushBarType.warning,
message: "Wallet named \"$newName\" already exists",
context: context,
),
);
}
} }
}, },
child: Text( child: Text(

View file

@ -13,11 +13,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/pages/pinpad_views/lock_screen_view.dart'; import 'package:stackwallet/pages/pinpad_views/lock_screen_view.dart';
import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/delete_wallet_warning_view.dart'; import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/delete_wallet_warning_view.dart';
import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/rename_wallet_view.dart'; import 'package:stackwallet/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/rename_wallet_view.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
@ -111,7 +111,7 @@ class WalletSettingsWalletSettingsView extends ConsumerWidget {
context: context, context: context,
builder: (_) => StackDialog( builder: (_) => StackDialog(
title: title:
"Do you want to delete ${ref.read(pWallets).getManager(walletId).walletName}?", "Do you want to delete ${ref.read(pWalletName(walletId))}?",
leftButton: TextButton( leftButton: TextButton(
style: Theme.of(context) style: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!

View file

@ -17,12 +17,12 @@ import 'package:flutter_svg/svg.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart'; import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart'; import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -53,14 +53,14 @@ class _XPubViewState extends ConsumerState<XPubView> {
final bool isDesktop = Util.isDesktop; final bool isDesktop = Util.isDesktop;
late ClipboardInterface _clipboardInterface; late ClipboardInterface _clipboardInterface;
late final Manager manager; late final Wallet wallet;
String? xpub; String? xpub;
@override @override
void initState() { void initState() {
_clipboardInterface = widget.clipboardInterface; _clipboardInterface = widget.clipboardInterface;
manager = ref.read(pWallets).getManager(widget.walletId); wallet = ref.read(pWallets).getWallet(widget.walletId);
super.initState(); super.initState();
} }
@ -152,7 +152,7 @@ class _XPubViewState extends ConsumerState<XPubView> {
left: 32, left: 32,
), ),
child: Text( child: Text(
"${manager.walletName} xPub", "${wallet.info.name} xPub",
style: STextStyles.desktopH2(context), style: STextStyles.desktopH2(context),
), ),
), ),
@ -185,7 +185,8 @@ class _XPubViewState extends ConsumerState<XPubView> {
child: child, child: child,
), ),
child: FutureBuilder( child: FutureBuilder(
future: manager.xpub, future: Future(() => "fixme"),
// future: wallet.xpub,
builder: (context, AsyncSnapshot<String> snapshot) { builder: (context, AsyncSnapshot<String> snapshot) {
if (snapshot.connectionState == ConnectionState.done && if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) { snapshot.hasData) {

View file

@ -12,6 +12,8 @@ import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/wallets/wallet/bip39_wallet.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -131,12 +133,13 @@ class _FiroRescanRecoveryErrorViewState
.topNavIconPrimary, .topNavIconPrimary,
), ),
onPressed: () async { onPressed: () async {
final walletName =
ref.read(pWalletName(widget.walletId));
await showDialog<void>( await showDialog<void>(
barrierDismissible: true, barrierDismissible: true,
context: context, context: context,
builder: (_) => StackDialog( builder: (_) => StackDialog(
title: title: "Do you want to delete $walletName?",
"Do you want to delete ${ref.read(pWallets).getManager(widget.walletId).walletName}?",
leftButton: TextButton( leftButton: TextButton(
style: Theme.of(context) style: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
@ -253,32 +256,34 @@ class _FiroRescanRecoveryErrorViewState
), ),
); );
} else { } else {
final mnemonic = await ref final wallet =
.read(pWallets) ref.read(pWallets).getWallet(widget.walletId);
.getManager(widget.walletId) // TODO: [prio=high] take wallets that don't have amnemonic into account
.mnemonic; if (wallet is Bip39Wallet) {
final mnemonic = await wallet.getMnemonicAsWords();
if (mounted) { if (mounted) {
await Navigator.push( await Navigator.push(
context, context,
RouteGenerator.getRoute( RouteGenerator.getRoute(
shouldUseMaterialRoute: shouldUseMaterialRoute:
RouteGenerator.useMaterialPageRoute, RouteGenerator.useMaterialPageRoute,
builder: (_) => LockscreenView( builder: (_) => LockscreenView(
routeOnSuccessArguments: routeOnSuccessArguments:
Tuple2(widget.walletId, mnemonic), Tuple2(widget.walletId, mnemonic),
showBackButton: true, showBackButton: true,
routeOnSuccess: WalletBackupView.routeName, routeOnSuccess: WalletBackupView.routeName,
biometricsCancelButtonString: "CANCEL", biometricsCancelButtonString: "CANCEL",
biometricsLocalizedReason: biometricsLocalizedReason:
"Authenticate to view recovery phrase", "Authenticate to view recovery phrase",
biometricsAuthenticationTitle: biometricsAuthenticationTitle:
"View recovery phrase", "View recovery phrase",
),
settings: const RouteSettings(
name: "/viewRecoverPhraseLockscreen"),
), ),
settings: const RouteSettings( );
name: "/viewRecoverPhraseLockscreen"), }
),
);
} }
} }
}, },

View file

@ -22,6 +22,7 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -89,8 +90,7 @@ class _MyTokensViewState extends ConsumerState<MyTokensView> {
), ),
title: Text( title: Text(
"${ref.watch( "${ref.watch(
pWallets.select( pWalletName(widget.walletId),
(value) => value.getManager(widget.walletId).walletName),
)} Tokens", )} Tokens",
style: STextStyles.navBarTitle(context), style: STextStyles.navBarTitle(context),
), ),
@ -234,9 +234,8 @@ class _MyTokensViewState extends ConsumerState<MyTokensView> {
walletId: widget.walletId, walletId: widget.walletId,
searchTerm: _searchString, searchTerm: _searchString,
tokenContracts: ref tokenContracts: ref
.watch(pWallets.select((value) => value .watch(pWallets.select((value) =>
.getManager(widget.walletId) value.getWallet(widget.walletId) as EthereumWallet))
.wallet as EthereumWallet))
.getWalletTokenContractAddresses(), .getWalletTokenContractAddresses(),
), ),
), ),

View file

@ -26,6 +26,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/show_loading.dart'; import 'package:stackwallet/utilities/show_loading.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/primary_button.dart'; import 'package:stackwallet/widgets/desktop/primary_button.dart';
import 'package:stackwallet/widgets/dialogs/basic_dialog.dart'; import 'package:stackwallet/widgets/dialogs/basic_dialog.dart';
import 'package:stackwallet/widgets/icon_widgets/eth_token_icon.dart'; import 'package:stackwallet/widgets/icon_widgets/eth_token_icon.dart';
@ -84,10 +85,8 @@ class _MyTokenSelectItemState extends ConsumerState<MyTokenSelectItem> {
ref.read(tokenServiceStateProvider.state).state = EthTokenWallet( ref.read(tokenServiceStateProvider.state).state = EthTokenWallet(
token: widget.token, token: widget.token,
secureStore: ref.read(secureStoreProvider), secureStore: ref.read(secureStoreProvider),
ethWallet: ref ethWallet:
.read(pWallets) ref.read(pWallets).getWallet(widget.walletId) as EthereumWallet,
.getManager(widget.walletId)
.wallet as EthereumWallet,
tracker: TransactionNotificationTracker( tracker: TransactionNotificationTracker(
walletId: widget.walletId, walletId: widget.walletId,
), ),
@ -117,10 +116,7 @@ class _MyTokenSelectItemState extends ConsumerState<MyTokenSelectItem> {
cachedBalance = CachedEthTokenBalance(widget.walletId, widget.token); cachedBalance = CachedEthTokenBalance(widget.walletId, widget.token);
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
final address = await ref final address = ref.read(pWalletReceivingAddress(widget.walletId));
.read(pWallets)
.getManager(widget.walletId)
.currentReceivingAddress;
await cachedBalance.fetchAndUpdateCachedBalance(address); await cachedBalance.fetchAndUpdateCachedBalance(address);
if (mounted) { if (mounted) {
setState(() {}); setState(() {});

View file

@ -24,7 +24,6 @@ import 'package:stackwallet/pages/wallet_view/sub_widgets/wallet_refresh_button.
import 'package:stackwallet/providers/global/locale_provider.dart'; import 'package:stackwallet/providers/global/locale_provider.dart';
import 'package:stackwallet/providers/global/prefs_provider.dart'; import 'package:stackwallet/providers/global/prefs_provider.dart';
import 'package:stackwallet/providers/global/price_provider.dart'; import 'package:stackwallet/providers/global/price_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart'; import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_providers.dart'; import 'package:stackwallet/themes/theme_providers.dart';
@ -34,6 +33,7 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/rounded_container.dart'; import 'package:stackwallet/widgets/rounded_container.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -78,9 +78,7 @@ class TokenSummary extends ConsumerWidget {
), ),
Text( Text(
ref.watch( ref.watch(
pWallets.select( pWalletName(walletId),
(value) => value.getManager(walletId).walletName,
),
), ),
style: STextStyles.w500_12(context).copyWith( style: STextStyles.w500_12(context).copyWith(
color: Theme.of(context) color: Theme.of(context)
@ -366,9 +364,11 @@ class CoinTickerTag extends ConsumerWidget {
radiusMultiplier: 0.25, radiusMultiplier: 0.25,
color: Theme.of(context).extension<StackColors>()!.ethTagBG, color: Theme.of(context).extension<StackColors>()!.ethTagBG,
child: Text( child: Text(
ref.watch( ref
pWallets.select((value) => value.getManager(walletId).coin.ticker), .watch(
), pWalletCoin(walletId),
)
.ticker,
style: STextStyles.w600_12(context).copyWith( style: STextStyles.w600_12(context).copyWith(
color: Theme.of(context).extension<StackColors>()!.ethTagText, color: Theme.of(context).extension<StackColors>()!.ethTagText,
), ),

View file

@ -24,6 +24,7 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.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_dialog_close_button.dart';
import 'package:stackwallet/widgets/loading_indicator.dart'; import 'package:stackwallet/widgets/loading_indicator.dart';
@ -95,8 +96,7 @@ class _TransactionsListState extends ConsumerState<TokenTransactionsList> {
TransactionCard( TransactionCard(
// this may mess with combined firo transactions // this may mess with combined firo transactions
key: tx.isConfirmed( key: tx.isConfirmed(
ref.watch(pWallets.select((value) => ref.watch(pWalletChainHeight(widget.walletId)),
value.getManager(widget.walletId).currentHeight)),
coin.requiredConfirmations) coin.requiredConfirmations)
? Key(tx.txid + tx.type.name + tx.address.value.toString()) ? Key(tx.txid + tx.type.name + tx.address.value.toString())
: UniqueKey(), // : UniqueKey(), //
@ -111,8 +111,7 @@ class _TransactionsListState extends ConsumerState<TokenTransactionsList> {
trade.uuid), // trade.uuid), //
trade: trade, trade: trade,
onTap: () async { onTap: () async {
final walletName = final walletName = ref.read(pWalletName(widget.walletId));
ref.read(pWallets).getManager(widget.walletId).walletName;
if (Util.isDesktop) { if (Util.isDesktop) {
await showDialog<void>( await showDialog<void>(
context: context, context: context,
@ -195,9 +194,7 @@ class _TransactionsListState extends ConsumerState<TokenTransactionsList> {
), ),
child: TransactionCard( child: TransactionCard(
// this may mess with combined firo transactions // this may mess with combined firo transactions
key: tx.isConfirmed( key: tx.isConfirmed(ref.watch(pWalletChainHeight(widget.walletId)),
ref.watch(pWallets.select((value) =>
value.getManager(widget.walletId).currentHeight)),
coin.requiredConfirmations) coin.requiredConfirmations)
? Key(tx.txid + tx.type.name + tx.address.value.toString()) ? Key(tx.txid + tx.type.name + tx.address.value.toString())
: UniqueKey(), : UniqueKey(),
@ -210,8 +207,8 @@ class _TransactionsListState extends ConsumerState<TokenTransactionsList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = ref final wallet =
.watch(pWallets.select((value) => value.getManager(widget.walletId))); ref.watch(pWallets.select((value) => value.getWallet(widget.walletId)));
return FutureBuilder( return FutureBuilder(
future: ref future: ref
@ -262,7 +259,12 @@ class _TransactionsListState extends ConsumerState<TokenTransactionsList> {
radius = _borderRadiusFirst; radius = _borderRadiusFirst;
} }
final tx = _transactions2[index]; final tx = _transactions2[index];
return itemBuilder(context, tx, radius, manager.coin); return itemBuilder(
context,
tx,
radius,
wallet.info.coin,
);
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return Container( return Container(
@ -289,7 +291,12 @@ class _TransactionsListState extends ConsumerState<TokenTransactionsList> {
radius = _borderRadiusFirst; radius = _borderRadiusFirst;
} }
final tx = _transactions2[index]; final tx = _transactions2[index];
return itemBuilder(context, tx, radius, manager.coin); return itemBuilder(
context,
tx,
radius,
wallet.info.coin,
);
}, },
), ),
); );

View file

@ -12,19 +12,21 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/pages/exchange_view/trade_details_view.dart'; import 'package:stackwallet/pages/exchange_view/trade_details_view.dart';
import 'package:stackwallet/pages/wallet_view/sub_widgets/no_transactions_found.dart'; import 'package:stackwallet/pages/wallet_view/sub_widgets/no_transactions_found.dart';
import 'package:stackwallet/pages/wallet_view/wallet_view.dart'; import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/trades_service_provider.dart'; import 'package:stackwallet/providers/global/trades_service_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart'; import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.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_dialog_close_button.dart';
import 'package:stackwallet/widgets/loading_indicator.dart'; import 'package:stackwallet/widgets/loading_indicator.dart';
@ -36,11 +38,9 @@ class TransactionsList extends ConsumerStatefulWidget {
const TransactionsList({ const TransactionsList({
Key? key, Key? key,
required this.walletId, required this.walletId,
required this.managerProvider,
}) : super(key: key); }) : super(key: key);
final String walletId; final String walletId;
final ChangeNotifierProvider<Manager> managerProvider;
@override @override
ConsumerState<TransactionsList> createState() => _TransactionsListState(); ConsumerState<TransactionsList> createState() => _TransactionsListState();
@ -51,7 +51,8 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
bool _hasLoaded = false; bool _hasLoaded = false;
List<Transaction> _transactions2 = []; List<Transaction> _transactions2 = [];
late final ChangeNotifierProvider<Manager> managerProvider; late final StreamSubscription<List<Transaction>> _subscription;
late final QueryBuilder<Transaction, Transaction, QAfterSortBy> _query;
BorderRadius get _borderRadiusFirst { BorderRadius get _borderRadiusFirst {
return BorderRadius.only( return BorderRadius.only(
@ -80,17 +81,13 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
Transaction tx, Transaction tx,
BorderRadius? radius, BorderRadius? radius,
Coin coin, Coin coin,
int chainHeight,
) { ) {
final matchingTrades = ref final matchingTrades = ref
.read(tradesServiceProvider) .read(tradesServiceProvider)
.trades .trades
.where((e) => e.payInTxid == tx.txid || e.payOutTxid == tx.txid); .where((e) => e.payInTxid == tx.txid || e.payOutTxid == tx.txid);
final isConfirmed = tx.isConfirmed(
ref.watch(
widget.managerProvider.select((value) => value.currentHeight)),
coin.requiredConfirmations);
if (tx.type == TransactionType.outgoing && matchingTrades.isNotEmpty) { if (tx.type == TransactionType.outgoing && matchingTrades.isNotEmpty) {
final trade = matchingTrades.first; final trade = matchingTrades.first;
return Container( return Container(
@ -115,6 +112,8 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
trade.uuid), // trade.uuid), //
trade: trade, trade: trade,
onTap: () async { onTap: () async {
final walletName = ref.read(pWalletName(widget.walletId));
if (Util.isDesktop) { if (Util.isDesktop) {
await showDialog<void>( await showDialog<void>(
context: context, context: context,
@ -156,8 +155,7 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
child: TradeDetailsView( child: TradeDetailsView(
tradeId: trade.tradeId, tradeId: trade.tradeId,
transactionIfSentFromStack: tx, transactionIfSentFromStack: tx,
walletName: walletName: walletName,
ref.read(managerProvider).walletName,
walletId: widget.walletId, walletId: widget.walletId,
), ),
), ),
@ -180,7 +178,7 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
trade.tradeId, trade.tradeId,
tx, tx,
widget.walletId, widget.walletId,
ref.read(managerProvider).walletName, walletName,
), ),
), ),
); );
@ -208,17 +206,39 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
@override @override
void initState() { void initState() {
managerProvider = widget.managerProvider; _query = ref
.read(mainDBProvider)
.isar
.transactions
.where()
.walletIdEqualTo(widget.walletId)
.sortByTimestampDesc();
_subscription = _query.watch().listen((event) {
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
_transactions2 = event;
});
});
});
super.initState(); super.initState();
} }
@override
void dispose() {
_subscription.cancel();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = ref final walletInfo = ref.watch(pWallets).getWallet(widget.walletId).info;
.watch(pWallets.select((value) => value.getManager(widget.walletId))); final height = walletInfo.cachedChainHeight;
final coin = walletInfo.coin;
return FutureBuilder( return FutureBuilder(
future: manager.transactions, future: _query.findAll(),
builder: (fbContext, AsyncSnapshot<List<Transaction>> snapshot) { builder: (fbContext, AsyncSnapshot<List<Transaction>> snapshot) {
if (snapshot.connectionState == ConnectionState.done && if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) { snapshot.hasData) {
@ -226,8 +246,8 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
_hasLoaded = true; _hasLoaded = true;
} }
if (!_hasLoaded) { if (!_hasLoaded) {
return Column( return const Column(
children: const [ children: [
Spacer(), Spacer(),
Center( Center(
child: LoadingIndicator( child: LoadingIndicator(
@ -247,13 +267,7 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
_transactions2.sort((a, b) => b.timestamp - a.timestamp); _transactions2.sort((a, b) => b.timestamp - a.timestamp);
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async { onRefresh: () async {
//todo: check if print needed await ref.read(pWallets).getWallet(widget.walletId).refresh();
// debugPrint("pulled down to refresh on transaction list");
final managerProvider =
ref.read(pWallets).getManagerProvider(widget.walletId);
if (!ref.read(managerProvider).isRefreshing) {
unawaited(ref.read(managerProvider).refresh());
}
}, },
child: Util.isDesktop child: Util.isDesktop
? ListView.separated( ? ListView.separated(
@ -270,7 +284,7 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
radius = _borderRadiusFirst; radius = _borderRadiusFirst;
} }
final tx = _transactions2[index]; final tx = _transactions2[index];
return itemBuilder(context, tx, radius, manager.coin); return itemBuilder(context, tx, radius, coin, height);
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return Container( return Container(
@ -302,14 +316,14 @@ class _TransactionsListState extends ConsumerState<TransactionsList> {
if (shouldWrap) { if (shouldWrap) {
return Column( return Column(
children: [ children: [
itemBuilder(context, tx, radius, manager.coin), itemBuilder(context, tx, radius, coin, height),
const SizedBox( const SizedBox(
height: WalletView.navBarHeight + 14, height: WalletView.navBarHeight + 14,
), ),
], ],
); );
} else { } else {
return itemBuilder(context, tx, radius, manager.coin); return itemBuilder(context, tx, radius, coin, height);
} }
}, },
), ),

View file

@ -11,10 +11,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/models/balance.dart'; import 'package:stackwallet/models/balance.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart'; import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
import 'package:stackwallet/providers/wallet/wallet_balance_toggle_state_provider.dart'; import 'package:stackwallet/providers/wallet/wallet_balance_toggle_state_provider.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
@ -22,6 +20,7 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart'; import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
enum _BalanceType { enum _BalanceType {
available, available,
@ -42,11 +41,9 @@ class WalletBalanceToggleSheet extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final maxHeight = MediaQuery.of(context).size.height * 0.60; final maxHeight = MediaQuery.of(context).size.height * 0.60;
final coin = final coin = ref.watch(pWalletCoin(walletId));
ref.watch(pWallets.select((value) => value.getManager(walletId).coin));
final balance = ref Balance balance = ref.watch(pWalletBalance(walletId));
.watch(pWallets.select((value) => value.getManager(walletId).balance));
_BalanceType _bal = _BalanceType _bal =
ref.watch(walletBalanceToggleStateProvider.state).state == ref.watch(walletBalanceToggleStateProvider.state).state ==
@ -56,13 +53,11 @@ class WalletBalanceToggleSheet extends ConsumerWidget {
Balance? balanceSecondary; Balance? balanceSecondary;
if (coin == Coin.firo || coin == Coin.firoTestNet) { if (coin == Coin.firo || coin == Coin.firoTestNet) {
balanceSecondary = ref balanceSecondary = ref.watch(pWalletBalanceSecondary(walletId));
.watch(
pWallets.select( final temp = balance;
(value) => value.getManager(walletId).wallet as FiroWallet?, balance = balanceSecondary!;
), balanceSecondary = temp;
)
?.balancePrivate;
if (ref.watch(publicPrivateBalanceStateProvider.state).state == if (ref.watch(publicPrivateBalanceStateProvider.state).state ==
"Private") { "Private") {

View file

@ -133,15 +133,11 @@ class _RefreshButtonState extends ConsumerState<WalletRefreshButton> {
splashColor: Theme.of(context).extension<StackColors>()!.highlight, splashColor: Theme.of(context).extension<StackColors>()!.highlight,
onPressed: () { onPressed: () {
if (widget.tokenContractAddress == null) { if (widget.tokenContractAddress == null) {
final managerProvider = final wallet = ref.read(pWallets).getWallet(widget.walletId);
ref.read(pWallets).getManagerProvider(widget.walletId); final isRefreshing = wallet.refreshMutex.isLocked;
final isRefreshing = ref.read(managerProvider).isRefreshing;
if (!isRefreshing) { if (!isRefreshing) {
_spinController.repeat?.call(); _spinController.repeat?.call();
ref wallet.refresh().then((_) => _spinController.stop?.call());
.read(managerProvider)
.refresh()
.then((_) => _spinController.stop?.call());
} }
} else { } else {
if (!ref.read(tokenServiceProvider)!.isRefreshing) { if (!ref.read(tokenServiceProvider)!.isRefreshing) {

View file

@ -8,7 +8,6 @@
* *
*/ */
import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
@ -20,11 +19,7 @@ import 'package:stackwallet/pages/wallet_view/sub_widgets/wallet_refresh_button.
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart'; import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
import 'package:stackwallet/providers/wallet/wallet_balance_toggle_state_provider.dart'; import 'package:stackwallet/providers/wallet/wallet_balance_toggle_state_provider.dart';
import 'package:stackwallet/services/coins/banano/banano_wallet.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/services/event_bus/events/global/balance_refreshed_event.dart';
import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart'; import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart';
import 'package:stackwallet/services/event_bus/global_event_bus.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
@ -33,9 +28,10 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart'; import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
class WalletSummaryInfo extends ConsumerStatefulWidget { class WalletSummaryInfo extends ConsumerWidget {
const WalletSummaryInfo({ const WalletSummaryInfo({
Key? key, Key? key,
required this.walletId, required this.walletId,
@ -45,16 +41,7 @@ class WalletSummaryInfo extends ConsumerStatefulWidget {
final String walletId; final String walletId;
final WalletSyncStatus initialSyncStatus; final WalletSyncStatus initialSyncStatus;
@override void showSheet(BuildContext context) {
ConsumerState<WalletSummaryInfo> createState() => _WalletSummaryInfoState();
}
class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
late StreamSubscription<BalanceRefreshedEvent> _balanceUpdated;
String receivingAddress = "";
void showSheet() {
showModalBottomSheet<dynamic>( showModalBottomSheet<dynamic>(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
context: context, context: context,
@ -63,54 +50,22 @@ class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
top: Radius.circular(20), top: Radius.circular(20),
), ),
), ),
builder: (_) => WalletBalanceToggleSheet(walletId: widget.walletId), builder: (_) => WalletBalanceToggleSheet(walletId: walletId),
); );
} }
@override @override
void initState() { Widget build(BuildContext context, WidgetRef ref) {
_balanceUpdated =
GlobalEventBus.instance.on<BalanceRefreshedEvent>().listen(
(event) async {
if (event.walletId == widget.walletId) {
setState(() {});
}
},
);
// managerProvider = widget.managerProvider;
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
final address = await ref
.read(pWallets)
.getManager(widget.walletId)
.currentReceivingAddress;
setState(() {
receivingAddress = address;
});
});
super.initState();
}
@override
void dispose() {
_balanceUpdated.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
bool isMonkey = true; bool isMonkey = true;
final manager = ref final receivingAddress = ref.watch(pWalletReceivingAddress(walletId));
.watch(pWallets.select((value) => value.getManager(widget.walletId)));
final externalCalls = ref.watch( final externalCalls = ref.watch(
prefsChangeNotifierProvider.select((value) => value.externalCalls)); prefsChangeNotifierProvider.select((value) => value.externalCalls));
final coin = manager.coin; final coin = ref.watch(pWalletCoin(walletId));
final balance = ref.watch( final balance = ref.watch(pWalletBalance(walletId));
pWallets.select((value) => value.getManager(widget.walletId).balance));
final locale = ref.watch( final locale = ref.watch(
localeServiceChangeNotifierProvider.select((value) => value.locale)); localeServiceChangeNotifierProvider.select((value) => value.locale));
@ -132,10 +87,9 @@ class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
final _showPrivate = final _showPrivate =
ref.watch(publicPrivateBalanceStateProvider.state).state == "Private"; ref.watch(publicPrivateBalanceStateProvider.state).state == "Private";
final firoWallet = ref.watch(pWallets.select( final secondaryBal = ref.watch(pWalletBalanceSecondary(walletId));
(value) => value.getManager(widget.walletId).wallet)) as FiroWallet;
final bal = _showPrivate ? firoWallet.balancePrivate : firoWallet.balance; final bal = _showPrivate ? balance : secondaryBal;
balanceToShow = _showAvailable ? bal.spendable : bal.total; balanceToShow = _showAvailable ? bal.spendable : bal.total;
title = _showAvailable ? "Available" : "Full"; title = _showAvailable ? "Available" : "Full";
@ -148,7 +102,8 @@ class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
List<int>? imageBytes; List<int>? imageBytes;
if (coin == Coin.banano) { if (coin == Coin.banano) {
imageBytes = (manager.wallet as BananoWallet).getMonkeyImageBytes(); // TODO: [prio=high] fix this and uncomment:
// imageBytes = (manager.wallet as BananoWallet).getMonkeyImageBytes();
} }
return ConditionalParent( return ConditionalParent(
@ -171,7 +126,9 @@ class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
GestureDetector( GestureDetector(
onTap: showSheet, onTap: () {
showSheet(context);
},
child: Row( child: Row(
children: [ children: [
Text( Text(
@ -236,8 +193,8 @@ class _WalletSummaryInfoState extends ConsumerState<WalletSummaryInfo> {
), ),
const Spacer(), const Spacer(),
WalletRefreshButton( WalletRefreshButton(
walletId: widget.walletId, walletId: walletId,
initialSyncStatus: widget.initialSyncStatus, initialSyncStatus: initialSyncStatus,
), ),
], ],
) )

View file

@ -13,6 +13,7 @@ import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:isar/isar.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
import 'package:stackwallet/models/isar/models/contact_entry.dart'; import 'package:stackwallet/models/isar/models/contact_entry.dart';
import 'package:stackwallet/models/transaction_filter.dart'; import 'package:stackwallet/models/transaction_filter.dart';
@ -21,6 +22,7 @@ import 'package:stackwallet/pages/token_view/token_view.dart';
import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart'; import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_details_view.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_search_filter_view.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/transaction_search_filter_view.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/address_book_service_provider.dart'; import 'package:stackwallet/providers/global/address_book_service_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/ui/transaction_filter_provider.dart'; import 'package:stackwallet/providers/ui/transaction_filter_provider.dart';
@ -33,6 +35,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/format.dart'; import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
@ -307,7 +310,7 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
TransactionSearchFilterView.routeName, TransactionSearchFilterView.routeName,
arguments: arguments:
ref.read(pWallets).getManager(walletId).coin, ref.read(pWallets).getWallet(walletId).info.coin,
); );
}, },
), ),
@ -422,7 +425,7 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
), ),
onPressed: () { onPressed: () {
final coin = final coin =
ref.read(pWallets).getManager(walletId).coin; ref.read(pWallets).getWallet(walletId).info.coin;
if (isDesktop) { if (isDesktop) {
showDialog<void>( showDialog<void>(
context: context, context: context,
@ -465,21 +468,44 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
Expanded( Expanded(
child: Consumer( child: Consumer(
builder: (_, ref, __) { builder: (_, ref, __) {
final managerProvider = ref.watch(pWallets
.select((value) => value.getManagerProvider(walletId)));
final criteria = final criteria =
ref.watch(transactionFilterProvider.state).state; ref.watch(transactionFilterProvider.state).state;
//todo: check if print needed //todo: check if print needed
// debugPrint("Consumer build called"); // debugPrint("Consumer build called");
final WhereClause ww;
return FutureBuilder( return FutureBuilder(
future: widget.isTokens future: widget.isTokens
? ref.watch(tokenServiceProvider ? ref
.select((value) => value!.transactions)) .watch(mainDBProvider)
: ref.watch(managerProvider .getTransactions(walletId)
.select((value) => value.transactions)), .filter()
.otherDataEqualTo(ref
.watch(tokenServiceProvider)!
.tokenContract
.address)
.sortByTimestampDesc()
.findAll()
: ref.watch(mainDBProvider).isar.transactions.buildQuery<
Transaction>(
whereClauses: [
IndexWhereClause.equalTo(
indexName: 'walletId',
value: [widget.walletId],
)
],
// TODO: [prio=high] add filters to wallet or cryptocurrency class
// filter: [
// // todo
// ],
sortBy: [
const SortProperty(
property: "timestamp",
sort: Sort.desc,
),
]).findAll(),
builder: (_, AsyncSnapshot<List<Transaction>> snapshot) { builder: (_, AsyncSnapshot<List<Transaction>> snapshot) {
if (snapshot.connectionState == ConnectionState.done && if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) { snapshot.hasData) {
@ -851,13 +877,11 @@ class _DesktopTransactionCardRowState
Widget build(BuildContext context) { Widget build(BuildContext context) {
final locale = ref.watch( final locale = ref.watch(
localeServiceChangeNotifierProvider.select((value) => value.locale)); localeServiceChangeNotifierProvider.select((value) => value.locale));
final manager =
ref.watch(pWallets.select((value) => value.getManager(walletId)));
final baseCurrency = ref final baseCurrency = ref
.watch(prefsChangeNotifierProvider.select((value) => value.currency)); .watch(prefsChangeNotifierProvider.select((value) => value.currency));
final coin = manager.coin; final coin = ref.watch(pWalletCoin(walletId));
final price = ref final price = ref
.watch(priceAnd24hChangeNotifierProvider .watch(priceAnd24hChangeNotifierProvider
@ -877,8 +901,7 @@ class _DesktopTransactionCardRowState
prefix = ""; prefix = "";
} }
final currentHeight = ref.watch( final currentHeight = ref.watch(pWalletChainHeight(walletId));
pWallets.select((value) => value.getManager(walletId).currentHeight));
return Material( return Material(
color: Theme.of(context).extension<StackColors>()!.popupBG, color: Theme.of(context).extension<StackColors>()!.popupBG,

View file

@ -39,6 +39,7 @@ import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -355,8 +356,7 @@ class _TransactionDetailsViewState
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final currentHeight = ref.watch( final currentHeight = ref.watch(pWalletChainHeight(walletId));
pWallets.select((value) => value.getManager(walletId).currentHeight));
return ConditionalParent( return ConditionalParent(
condition: !isDesktop, condition: !isDesktop,
@ -1597,10 +1597,10 @@ class _TransactionDetailsViewState
), ),
), ),
onPressed: () async { onPressed: () async {
final Manager manager = final wallet =
ref.read(pWallets).getManager(walletId); ref.read(pWallets).getWallet(walletId);
if (manager.wallet is EpicCashWallet) { if (wallet is EpicCashWallet) {
final String? id = _transaction.slateId; final String? id = _transaction.slateId;
if (id == null) { if (id == null) {
unawaited(showFloatingFlushBar( unawaited(showFloatingFlushBar(
@ -1618,7 +1618,7 @@ class _TransactionDetailsViewState
const CancellingTransactionProgressDialog(), const CancellingTransactionProgressDialog(),
)); ));
final result = await (manager.wallet as EpicCashWallet) final result = await (wallet as EpicCashWallet)
.cancelPendingTransactionAndPost(id); .cancelPendingTransactionAndPost(id);
if (mounted) { if (mounted) {
// pop progress dialog // pop progress dialog
@ -1630,7 +1630,7 @@ class _TransactionDetailsViewState
builder: (_) => StackOkDialog( builder: (_) => StackOkDialog(
title: "Transaction cancelled", title: "Transaction cancelled",
onOkPressed: (_) { onOkPressed: (_) {
manager.refresh(); wallet.refresh();
Navigator.of(context).popUntil( Navigator.of(context).popUntil(
ModalRoute.withName( ModalRoute.withName(
WalletView.routeName)); WalletView.routeName));

View file

@ -35,6 +35,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/format.dart'; import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart'; import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
@ -308,8 +309,7 @@ class _AllTransactionsV2ViewState extends ConsumerState<AllTransactionsV2View> {
onPressed: () { onPressed: () {
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
TransactionSearchFilterView.routeName, TransactionSearchFilterView.routeName,
arguments: arguments: ref.read(pWalletCoin(walletId)),
ref.read(pWallets).getManager(walletId).coin,
); );
}, },
), ),
@ -423,21 +423,19 @@ class _AllTransactionsV2ViewState extends ConsumerState<AllTransactionsV2View> {
height: 20, height: 20,
), ),
onPressed: () { onPressed: () {
final coin =
ref.read(pWallets).getManager(walletId).coin;
if (isDesktop) { if (isDesktop) {
showDialog<void>( showDialog<void>(
context: context, context: context,
builder: (context) { builder: (context) {
return TransactionSearchFilterView( return TransactionSearchFilterView(
coin: coin, coin: ref.read(pWalletCoin(walletId)),
); );
}, },
); );
} else { } else {
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
TransactionSearchFilterView.routeName, TransactionSearchFilterView.routeName,
arguments: coin, arguments: ref.read(pWalletCoin(walletId)),
); );
} }
}, },
@ -467,9 +465,6 @@ class _AllTransactionsV2ViewState extends ConsumerState<AllTransactionsV2View> {
Expanded( Expanded(
child: Consumer( child: Consumer(
builder: (_, ref, __) { builder: (_, ref, __) {
final managerProvider = ref.watch(pWallets
.select((value) => value.getManagerProvider(walletId)));
final criteria = final criteria =
ref.watch(transactionFilterProvider.state).state; ref.watch(transactionFilterProvider.state).state;
@ -481,10 +476,23 @@ class _AllTransactionsV2ViewState extends ConsumerState<AllTransactionsV2View> {
.watch(mainDBProvider) .watch(mainDBProvider)
.isar .isar
.transactionV2s .transactionV2s
.where() .buildQuery<TransactionV2>(
.walletIdEqualTo(walletId) whereClauses: [
.sortByTimestampDesc() IndexWhereClause.equalTo(
.findAll(), indexName: 'walletId',
value: [widget.walletId],
)
],
// TODO: [prio=high] add filters to wallet or cryptocurrency class
// filter: [
// // todo
// ],
sortBy: [
const SortProperty(
property: "timestamp",
sort: Sort.desc,
),
]).findAll(),
builder: (_, AsyncSnapshot<List<TransactionV2>> snapshot) { builder: (_, AsyncSnapshot<List<TransactionV2>> snapshot) {
if (snapshot.connectionState == ConnectionState.done && if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) { snapshot.hasData) {
@ -852,13 +860,11 @@ class _DesktopTransactionCardRowState
Widget build(BuildContext context) { Widget build(BuildContext context) {
final locale = ref.watch( final locale = ref.watch(
localeServiceChangeNotifierProvider.select((value) => value.locale)); localeServiceChangeNotifierProvider.select((value) => value.locale));
final manager =
ref.watch(pWallets.select((value) => value.getManager(walletId)));
final baseCurrency = ref final baseCurrency = ref
.watch(prefsChangeNotifierProvider.select((value) => value.currency)); .watch(prefsChangeNotifierProvider.select((value) => value.currency));
final coin = manager.coin; final coin = ref.watch(pWalletCoin(walletId));
final price = ref final price = ref
.watch(priceAnd24hChangeNotifierProvider .watch(priceAnd24hChangeNotifierProvider
@ -878,8 +884,7 @@ class _DesktopTransactionCardRowState
prefix = ""; prefix = "";
} }
final currentHeight = ref.watch( final currentHeight = ref.watch(pWalletChainHeight(walletId));
pWallets.select((value) => value.getManager(walletId).currentHeight));
final Amount amount; final Amount amount;

View file

@ -5,12 +5,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart'; import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_group_details_view.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_group_details_view.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/format.dart'; import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart'; import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
class FusionTxGroup { class FusionTxGroup {
@ -27,11 +27,9 @@ class FusionTxGroupCard extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final walletId = group.transactions.first.walletId; final walletId = group.transactions.first.walletId;
final coin = final coin = ref.watch(pWalletCoin(walletId));
ref.watch(pWallets.select((value) => value.getManager(walletId).coin));
final currentHeight = ref.watch( final currentHeight = ref.watch(pWalletChainHeight(walletId));
pWallets.select((value) => value.getManager(walletId).currentHeight));
return Material( return Material(
color: Theme.of(context).extension<StackColors>()!.popupBG, color: Theme.of(context).extension<StackColors>()!.popupBG,

View file

@ -9,7 +9,6 @@ import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transactio
import 'package:stackwallet/providers/global/locale_provider.dart'; import 'package:stackwallet/providers/global/locale_provider.dart';
import 'package:stackwallet/providers/global/prefs_provider.dart'; import 'package:stackwallet/providers/global/prefs_provider.dart';
import 'package:stackwallet/providers/global/price_provider.dart'; import 'package:stackwallet/providers/global/price_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
@ -18,6 +17,7 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/format.dart'; import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.dart'; import 'package:stackwallet/widgets/desktop/desktop_dialog.dart';
class TransactionCardV2 extends ConsumerStatefulWidget { class TransactionCardV2 extends ConsumerStatefulWidget {
@ -96,7 +96,7 @@ class _TransactionCardStateV2 extends ConsumerState<TransactionCardV2> {
} else { } else {
prefix = ""; prefix = "";
} }
coin = ref.read(pWallets).getManager(walletId).coin; coin = ref.read(pWalletCoin(walletId));
unit = coin.ticker; unit = coin.ticker;
super.initState(); super.initState();
@ -115,8 +115,7 @@ class _TransactionCardStateV2 extends ConsumerState<TransactionCardV2> {
.select((value) => value.getPrice(coin))) .select((value) => value.getPrice(coin)))
.item1; .item1;
final currentHeight = ref.watch( final currentHeight = ref.watch(pWalletChainHeight(walletId));
pWallets.select((value) => value.getManager(walletId).currentHeight));
final Amount amount; final Amount amount;

View file

@ -33,6 +33,7 @@ import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -397,8 +398,7 @@ class _TransactionV2DetailsViewState
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final currentHeight = ref.watch( final currentHeight = ref.watch(pWalletChainHeight(walletId));
pWallets.select((value) => value.getManager(walletId).currentHeight));
final String outputLabel; final String outputLabel;

View file

@ -8,8 +8,6 @@
* *
*/ */
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
@ -66,8 +64,7 @@ class _TransactionsV2ListState extends ConsumerState<TransactionsV2List> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = ref final coin = ref.watch(pWallets).getWallet(widget.walletId).info.coin;
.watch(pWallets.select((value) => value.getManager(widget.walletId)));
return FutureBuilder( return FutureBuilder(
future: ref future: ref
@ -145,11 +142,7 @@ class _TransactionsV2ListState extends ConsumerState<TransactionsV2List> {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () async { onRefresh: () async {
final managerProvider = await ref.read(pWallets).getWallet(widget.walletId).refresh();
ref.read(pWallets).getManagerProvider(widget.walletId);
if (!ref.read(managerProvider).isRefreshing) {
unawaited(ref.read(managerProvider).refresh());
}
}, },
child: Util.isDesktop child: Util.isDesktop
? ListView.separated( ? ListView.separated(
@ -168,7 +161,7 @@ class _TransactionsV2ListState extends ConsumerState<TransactionsV2List> {
final tx = _txns[index]; final tx = _txns[index];
return TxListItem( return TxListItem(
tx: tx, tx: tx,
coin: manager.coin, coin: coin,
radius: radius, radius: radius,
); );
}, },
@ -204,7 +197,7 @@ class _TransactionsV2ListState extends ConsumerState<TransactionsV2List> {
children: [ children: [
TxListItem( TxListItem(
tx: tx, tx: tx,
coin: manager.coin, coin: coin,
radius: radius, radius: radius,
), ),
const SizedBox( const SizedBox(
@ -215,7 +208,7 @@ class _TransactionsV2ListState extends ConsumerState<TransactionsV2List> {
} else { } else {
return TxListItem( return TxListItem(
tx: tx, tx: tx,
coin: manager.coin, coin: coin,
radius: radius, radius: radius,
); );
} }

View file

@ -8,12 +8,12 @@ import 'package:stackwallet/pages/exchange_view/trade_details_view.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_tx_group_card.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/fusion_tx_group_card.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_card.dart';
import 'package:stackwallet/providers/global/trades_service_provider.dart'; import 'package:stackwallet/providers/global/trades_service_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.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_dialog_close_button.dart';
import 'package:stackwallet/widgets/trade_card.dart'; import 'package:stackwallet/widgets/trade_card.dart';
@ -103,16 +103,11 @@ class TxListItem extends ConsumerWidget {
Flexible( Flexible(
child: TradeDetailsView( child: TradeDetailsView(
tradeId: trade.tradeId, tradeId: trade.tradeId,
// TODO // TODO: [prio:med]
// transactionIfSentFromStack: tx, // transactionIfSentFromStack: tx,
transactionIfSentFromStack: null, transactionIfSentFromStack: null,
walletName: ref.watch( walletName: ref
pWallets.select( .watch(pWalletName(_tx.walletId)),
(value) => value
.getManager(_tx.walletId)
.walletName,
),
),
walletId: _tx.walletId, walletId: _tx.walletId,
), ),
), ),
@ -135,10 +130,7 @@ class TxListItem extends ConsumerWidget {
trade.tradeId, trade.tradeId,
_tx, _tx,
_tx.walletId, _tx.walletId,
ref ref.read(pWalletName(_tx.walletId)),
.read(pWallets)
.getManager(_tx.walletId)
.walletName,
), ),
), ),
); );

View file

@ -39,6 +39,7 @@ import 'package:stackwallet/pages/wallet_view/sub_widgets/wallet_summary.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/all_transactions_view.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/all_transactions_view.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/all_transactions_v2_view.dart';
import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart'; import 'package:stackwallet/pages/wallet_view/transaction_views/tx_v2/transaction_v2_list.dart';
import 'package:stackwallet/providers/global/active_wallet_provider.dart';
import 'package:stackwallet/providers/global/auto_swb_service_provider.dart'; import 'package:stackwallet/providers/global/auto_swb_service_provider.dart';
import 'package:stackwallet/providers/global/paynym_api_provider.dart'; import 'package:stackwallet/providers/global/paynym_api_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
@ -48,11 +49,13 @@ import 'package:stackwallet/providers/wallet/my_paynym_account_state_provider.da
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart'; import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
import 'package:stackwallet/providers/wallet/wallet_balance_toggle_state_provider.dart'; import 'package:stackwallet/providers/wallet/wallet_balance_toggle_state_provider.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart'; import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/services/event_bus/events/global/node_connection_status_changed_event.dart'; import 'package:stackwallet/services/event_bus/events/global/node_connection_status_changed_event.dart';
import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart'; import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart';
import 'package:stackwallet/services/event_bus/global_event_bus.dart'; import 'package:stackwallet/services/event_bus/global_event_bus.dart';
import 'package:stackwallet/services/exchange/exchange_data_loading_service.dart'; import 'package:stackwallet/services/exchange/exchange_data_loading_service.dart';
import 'package:stackwallet/services/mixins/coin_control_interface.dart';
import 'package:stackwallet/services/mixins/fusion_wallet_interface.dart';
import 'package:stackwallet/services/mixins/ordinals_interface.dart';
import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart'; import 'package:stackwallet/services/mixins/paynym_wallet_interface.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
@ -67,6 +70,7 @@ import 'package:stackwallet/utilities/enums/wallet_balance_toggle_state.dart';
import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/show_loading.dart'; import 'package:stackwallet/utilities/show_loading.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -94,7 +98,6 @@ class WalletView extends ConsumerStatefulWidget {
const WalletView({ const WalletView({
Key? key, Key? key,
required this.walletId, required this.walletId,
required this.managerProvider,
this.eventBus, this.eventBus,
this.clipboardInterface = const ClipboardWrapper(), this.clipboardInterface = const ClipboardWrapper(),
}) : super(key: key); }) : super(key: key);
@ -103,7 +106,6 @@ class WalletView extends ConsumerStatefulWidget {
static const double navBarHeight = 65.0; static const double navBarHeight = 65.0;
final String walletId; final String walletId;
final ChangeNotifierProvider<Manager> managerProvider;
final EventBus? eventBus; final EventBus? eventBus;
final ClipboardInterface clipboardInterface; final ClipboardInterface clipboardInterface;
@ -115,7 +117,7 @@ class WalletView extends ConsumerStatefulWidget {
class _WalletViewState extends ConsumerState<WalletView> { class _WalletViewState extends ConsumerState<WalletView> {
late final EventBus eventBus; late final EventBus eventBus;
late final String walletId; late final String walletId;
late final ChangeNotifierProvider<Manager> managerProvider; late final Coin coin;
late final bool _shouldDisableAutoSyncOnLogOut; late final bool _shouldDisableAutoSyncOnLogOut;
@ -129,7 +131,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
bool _lelantusRescanRecovery = false; bool _lelantusRescanRecovery = false;
Future<void> _firoRescanRecovery() async { Future<void> _firoRescanRecovery() async {
final success = await (ref.read(managerProvider).wallet as FiroWallet) final success = await (ref.read(pWallets).getWallet(walletId) as FiroWallet)
.firoRescanRecovery(); .firoRescanRecovery();
if (success) { if (success) {
@ -160,43 +162,45 @@ class _WalletViewState extends ConsumerState<WalletView> {
@override @override
void initState() { void initState() {
walletId = widget.walletId; walletId = widget.walletId;
managerProvider = widget.managerProvider; final wallet = ref.read(pWallets).getWallet(walletId);
coin = wallet.info.coin;
ref.read(managerProvider).isActiveWallet = true; ref.read(currentWalletIdProvider.notifier).state = wallet.walletId;
if (!ref.read(managerProvider).shouldAutoSync) {
if (!wallet.shouldAutoSync) {
// enable auto sync if it wasn't enabled when loading wallet // enable auto sync if it wasn't enabled when loading wallet
ref.read(managerProvider).shouldAutoSync = true; wallet.shouldAutoSync = true;
_shouldDisableAutoSyncOnLogOut = true; _shouldDisableAutoSyncOnLogOut = true;
} else { } else {
_shouldDisableAutoSyncOnLogOut = false; _shouldDisableAutoSyncOnLogOut = false;
} }
if (ref.read(managerProvider).coin == Coin.firo && if (coin == Coin.firo &&
(ref.read(managerProvider).wallet as FiroWallet) (wallet as FiroWallet).lelantusCoinIsarRescanRequired) {
.lelantusCoinIsarRescanRequired) {
_rescanningOnOpen = true; _rescanningOnOpen = true;
_lelantusRescanRecovery = true; _lelantusRescanRecovery = true;
_firoRescanRecovery(); _firoRescanRecovery();
} else if (ref.read(managerProvider).rescanOnOpenVersion == // } else if (ref.read(managerProvider).rescanOnOpenVersion ==
Constants.rescanV1) { // TODO: [prio=high]
_rescanningOnOpen = true; // Constants.rescanV1) {
ref.read(managerProvider).fullRescan(20, 1000).then( // _rescanningOnOpen = true;
(_) => ref.read(managerProvider).resetRescanOnOpen().then( // ref.read(managerProvider).fullRescan(20, 1000).then(
(_) => WidgetsBinding.instance.addPostFrameCallback( // (_) => ref.read(managerProvider).resetRescanOnOpen().then(
(_) => setState(() => _rescanningOnOpen = false), // (_) => WidgetsBinding.instance.addPostFrameCallback(
), // (_) => setState(() => _rescanningOnOpen = false),
), // ),
); // ),
// );
} else { } else {
ref.read(managerProvider).refresh(); wallet.refresh();
} }
if (ref.read(managerProvider).isRefreshing) { if (wallet.refreshMutex.isLocked) {
_currentSyncStatus = WalletSyncStatus.syncing; _currentSyncStatus = WalletSyncStatus.syncing;
_currentNodeStatus = NodeConnectionStatus.connected; _currentNodeStatus = NodeConnectionStatus.connected;
} else { } else {
_currentSyncStatus = WalletSyncStatus.synced; _currentSyncStatus = WalletSyncStatus.synced;
if (ref.read(managerProvider).isConnected) { if (wallet.isConnected) {
_currentNodeStatus = NodeConnectionStatus.connected; _currentNodeStatus = NodeConnectionStatus.connected;
} else { } else {
_currentNodeStatus = NodeConnectionStatus.disconnected; _currentNodeStatus = NodeConnectionStatus.disconnected;
@ -290,9 +294,10 @@ class _WalletViewState extends ConsumerState<WalletView> {
void _logout() async { void _logout() async {
if (_shouldDisableAutoSyncOnLogOut) { if (_shouldDisableAutoSyncOnLogOut) {
// disable auto sync if it was enabled only when loading wallet // disable auto sync if it was enabled only when loading wallet
ref.read(managerProvider).shouldAutoSync = false; ref.read(pWallets).getWallet(walletId).shouldAutoSync = false;
} }
ref.read(managerProvider.notifier).isActiveWallet = false;
ref.read(currentWalletIdProvider.notifier).state = null;
ref.read(transactionFilterProvider.state).state = null; ref.read(transactionFilterProvider.state).state = null;
if (ref.read(prefsChangeNotifierProvider).isAutoBackupEnabled && if (ref.read(prefsChangeNotifierProvider).isAutoBackupEnabled &&
ref.read(prefsChangeNotifierProvider).backupFrequencyType == ref.read(prefsChangeNotifierProvider).backupFrequencyType ==
@ -328,7 +333,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
} }
void _onExchangePressed(BuildContext context) async { void _onExchangePressed(BuildContext context) async {
final Coin coin = ref.read(managerProvider).coin; final Coin coin = ref.read(pWalletCoin(walletId));
if (coin.isTestNet) { if (coin.isTestNet) {
await showDialog<void>( await showDialog<void>(
@ -373,7 +378,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
} }
void _onBuyPressed(BuildContext context) async { void _onBuyPressed(BuildContext context) async {
final coin = ref.read(managerProvider).coin; final Coin coin = ref.read(pWalletCoin(walletId));
if (coin.isTestNet) { if (coin.isTestNet) {
await showDialog<void>( await showDialog<void>(
@ -408,7 +413,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
), ),
), ),
); );
final firoWallet = ref.read(managerProvider).wallet as FiroWallet; final firoWallet = ref.read(pWallets).getWallet(walletId) as FiroWallet;
final Amount publicBalance = firoWallet.availablePublicBalance(); final Amount publicBalance = firoWallet.availablePublicBalance();
if (publicBalance <= Amount.zero) { if (publicBalance <= Amount.zero) {
@ -464,7 +469,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final Coin coin = ref.watch(managerProvider.select((value) => value.coin)); final coin = ref.watch(pWalletCoin(walletId));
return ConditionalParent( return ConditionalParent(
condition: _rescanningOnOpen, condition: _rescanningOnOpen,
@ -549,8 +554,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
), ),
Expanded( Expanded(
child: Text( child: Text(
ref.watch(managerProvider ref.watch(pWalletName(walletId)),
.select((value) => value.walletName)),
style: STextStyles.navBarTitle(context), style: STextStyles.navBarTitle(context),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
@ -721,7 +725,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
WalletSettingsView.routeName, WalletSettingsView.routeName,
arguments: Tuple4( arguments: Tuple4(
walletId, walletId,
ref.read(managerProvider).coin, coin,
_currentSyncStatus, _currentSyncStatus,
_currentNodeStatus, _currentNodeStatus,
), ),
@ -747,8 +751,11 @@ class _WalletViewState extends ConsumerState<WalletView> {
child: WalletSummary( child: WalletSummary(
walletId: walletId, walletId: walletId,
aspectRatio: 1.75, aspectRatio: 1.75,
initialSyncStatus: ref.watch(managerProvider initialSyncStatus: ref
.select((value) => value.isRefreshing)) .watch(pWallets)
.getWallet(walletId)
.refreshMutex
.isLocked
? WalletSyncStatus.syncing ? WalletSyncStatus.syncing
: WalletSyncStatus.synced, : WalletSyncStatus.synced,
), ),
@ -907,8 +914,6 @@ class _WalletViewState extends ConsumerState<WalletView> {
walletId: widget.walletId, walletId: widget.walletId,
) )
: TransactionsList( : TransactionsList(
managerProvider:
managerProvider,
walletId: walletId, walletId: walletId,
), ),
), ),
@ -944,8 +949,6 @@ class _WalletViewState extends ConsumerState<WalletView> {
label: "Send", label: "Send",
icon: const SendNavIcon(), icon: const SendNavIcon(),
onTap: () { onTap: () {
final walletId = ref.read(managerProvider).walletId;
final coin = ref.read(managerProvider).coin;
switch (ref switch (ref
.read(walletBalanceToggleStateProvider.state) .read(walletBalanceToggleStateProvider.state)
.state) { .state) {
@ -985,8 +988,10 @@ class _WalletViewState extends ConsumerState<WalletView> {
moreItems: [ moreItems: [
if (ref.watch( if (ref.watch(
pWallets.select( pWallets.select(
(value) => (value) => value
value.getManager(widget.walletId).hasTokenSupport, .getWallet(widget.walletId)
.cryptoCurrency
.hasTokenSupport,
), ),
)) ))
WalletNavigationBarItemData( WalletNavigationBarItemData(
@ -1018,9 +1023,8 @@ class _WalletViewState extends ConsumerState<WalletView> {
}), }),
if (ref.watch( if (ref.watch(
pWallets.select( pWallets.select(
(value) => value (value) => value.getWallet(widget.walletId)
.getManager(widget.walletId) is CoinControlInterface,
.hasCoinControlSupport,
), ),
) && ) &&
ref.watch( ref.watch(
@ -1041,8 +1045,8 @@ class _WalletViewState extends ConsumerState<WalletView> {
); );
}, },
), ),
if (ref.watch(pWallets.select((value) => if (ref.watch(pWallets.select((value) => value
value.getManager(widget.walletId).hasPaynymSupport))) .getWallet(widget.walletId) is PaynymWalletInterface)))
WalletNavigationBarItemData( WalletNavigationBarItemData(
label: "PayNym", label: "PayNym",
icon: const PaynymNavIcon(), icon: const PaynymNavIcon(),
@ -1056,12 +1060,10 @@ class _WalletViewState extends ConsumerState<WalletView> {
), ),
); );
final manager = ref final wallet =
.read(pWallets) ref.read(pWallets).getWallet(widget.walletId);
.getManager(widget.walletId);
final paynymInterface = final paynymInterface = wallet as PaynymWalletInterface;
manager.wallet as PaynymWalletInterface;
final code = await paynymInterface.getPaymentCode( final code = await paynymInterface.getPaymentCode(
isSegwit: false, isSegwit: false,
@ -1102,7 +1104,7 @@ class _WalletViewState extends ConsumerState<WalletView> {
if (ref.watch( if (ref.watch(
pWallets.select( pWallets.select(
(value) => (value) =>
value.getManager(widget.walletId).hasOrdinalsSupport, value.getWallet(widget.walletId) is OrdinalsInterface,
), ),
)) ))
WalletNavigationBarItemData( WalletNavigationBarItemData(
@ -1117,8 +1119,8 @@ class _WalletViewState extends ConsumerState<WalletView> {
), ),
if (ref.watch( if (ref.watch(
pWallets.select( pWallets.select(
(value) => (value) => value.getWallet(widget.walletId)
value.getManager(widget.walletId).hasFusionSupport, is FusionWalletInterface,
), ),
)) ))
WalletNavigationBarItemData( WalletNavigationBarItemData(

View file

@ -48,14 +48,13 @@ class AllWallets extends StatelessWidget {
Expanded( Expanded(
child: Consumer( child: Consumer(
builder: (_, ref, __) { builder: (_, ref, __) {
final providersByCoin = ref.watch(pWallets final walletsByCoin = ref.watch(pWallets).walletsByCoin;
.select((value) => value.getManagerProvidersByCoin()));
return ListView.builder( return ListView.builder(
itemCount: providersByCoin.length, itemCount: walletsByCoin.length,
itemBuilder: (builderContext, index) { itemBuilder: (builderContext, index) {
final coin = providersByCoin[index].item1; final coin = walletsByCoin[index].coin;
final int walletCount = providersByCoin[index].item2.length; final int walletCount = walletsByCoin[index].wallets.length;
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
child: WalletListItem( child: WalletListItem(

View file

@ -16,7 +16,6 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:stackwallet/pages/wallet_view/wallet_view.dart'; import 'package:stackwallet/pages/wallet_view/wallet_view.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
@ -25,9 +24,9 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/coin_card.dart'; import 'package:stackwallet/widgets/coin_card.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:tuple/tuple.dart';
class FavoriteCard extends ConsumerStatefulWidget { class FavoriteCard extends ConsumerStatefulWidget {
const FavoriteCard({ const FavoriteCard({
@ -59,9 +58,7 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final coin = ref.watch( final coin = ref.watch(pWalletCoin(walletId));
pWallets.select((value) => value.getManager(walletId).coin),
);
final externalCalls = ref.watch( final externalCalls = ref.watch(
prefsChangeNotifierProvider.select((value) => value.externalCalls), prefsChangeNotifierProvider.select((value) => value.externalCalls),
); );
@ -116,7 +113,7 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
child: GestureDetector( child: GestureDetector(
onTap: () async { onTap: () async {
if (coin == Coin.monero || coin == Coin.wownero) { if (coin == Coin.monero || coin == Coin.wownero) {
await ref.read(pWallets).getManager(walletId).initializeExisting(); await ref.read(pWallets).getWallet(walletId).init();
} }
if (mounted) { if (mounted) {
if (Util.isDesktop) { if (Util.isDesktop) {
@ -127,10 +124,7 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
} else { } else {
await Navigator.of(context).pushNamed( await Navigator.of(context).pushNamed(
WalletView.routeName, WalletView.routeName,
arguments: Tuple2( arguments: walletId,
walletId,
ref.read(pWallets).getManagerProvider(walletId),
),
); );
} }
} }
@ -157,12 +151,7 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
children: [ children: [
Expanded( Expanded(
child: Text( child: Text(
ref.watch( ref.watch(pWalletName(walletId)),
pWallets.select(
(value) =>
value.getManager(walletId).walletName,
),
),
style: STextStyles.itemSubtitle12(context).copyWith( style: STextStyles.itemSubtitle12(context).copyWith(
color: Theme.of(context) color: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
@ -184,22 +173,16 @@ class _FavoriteCardState extends ConsumerState<FavoriteCard> {
Builder( Builder(
builder: (context) { builder: (context) {
final balance = ref.watch( final balance = ref.watch(
pWallets.select( pWalletBalance(walletId),
(value) => value.getManager(walletId).balance,
),
); );
Amount total = balance.total; Amount total = balance.total;
if (coin == Coin.firo || coin == Coin.firoTestNet) { if (coin == Coin.firo || coin == Coin.firoTestNet) {
final balancePrivate = ref.watch( total += ref
pWallets.select( .watch(
(value) => (value.getManager(walletId).wallet pWalletBalanceSecondary(walletId),
as FiroWallet) )
.balancePrivate, .total;
),
);
total += balancePrivate.total;
} }
Amount fiatTotal = Amount.zero; Amount fiatTotal = Amount.zero;

View file

@ -15,12 +15,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/pages/manage_favorites_view/manage_favorites_view.dart'; import 'package:stackwallet/pages/manage_favorites_view/manage_favorites_view.dart';
import 'package:stackwallet/pages/wallets_view/sub_widgets/favorite_card.dart'; import 'package:stackwallet/pages/wallets_view/sub_widgets/favorite_card.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/favourite_wallets_provider.dart';
import 'package:stackwallet/widgets/custom_page_view/custom_page_view.dart' import 'package:stackwallet/widgets/custom_page_view/custom_page_view.dart'
as cpv; as cpv;
@ -74,10 +73,10 @@ class _FavoriteWalletsState extends ConsumerState<FavoriteWallets> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final favorites = ref.watch(favoritesProvider); final favorites = ref.watch(pFavouriteWalletInfos);
_favLength = favorites.length; _favLength = favorites.length;
bool hasFavorites = favorites.length > 0; bool hasFavorites = favorites.isNotEmpty;
final remaining = ((screenWidth - cardWidth) / cardWidth).ceil(); final remaining = ((screenWidth - cardWidth) / cardWidth).ceil();
@ -192,12 +191,9 @@ class _FavoriteWalletsState extends ConsumerState<FavoriteWallets> {
}), }),
itemBuilder: (_, index) { itemBuilder: (_, index) {
String? walletId; String? walletId;
ChangeNotifierProvider<Manager>? managerProvider;
if (index < favorites.length) { if (index < favorites.length) {
walletId = ref.read(favorites[index]).walletId; walletId = favorites[index].walletId;
managerProvider =
ref.read(pWallets).getManagerProvider(walletId);
} }
const double scaleDown = 0.95; const double scaleDown = 0.95;

View file

@ -24,7 +24,6 @@ import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:tuple/tuple.dart';
class WalletListItem extends ConsumerWidget { class WalletListItem extends ConsumerWidget {
const WalletListItem({ const WalletListItem({
@ -57,25 +56,18 @@ class WalletListItem extends ConsumerWidget {
), ),
onPressed: () async { onPressed: () async {
if (walletCount == 1 && coin != Coin.ethereum) { if (walletCount == 1 && coin != Coin.ethereum) {
final providersByCoin = ref final wallet = ref
.watch(pWallets .read(pWallets)
.select((value) => value.getManagerProvidersByCoin())) .wallets
.where((e) => e.item1 == coin) .firstWhere((e) => e.info.coin == coin);
.map((e) => e.item2)
.expand((e) => e)
.toList();
final manager = ref.read(providersByCoin.first);
if (coin == Coin.monero || coin == Coin.wownero) { if (coin == Coin.monero || coin == Coin.wownero) {
await manager.initializeExisting(); await wallet.init();
} }
if (context.mounted) { if (context.mounted) {
unawaited( unawaited(
Navigator.of(context).pushNamed( Navigator.of(context).pushNamed(
WalletView.routeName, WalletView.routeName,
arguments: Tuple2( arguments: wallet.walletId,
manager.walletId,
providersByCoin.first,
),
), ),
); );
} }

View file

@ -11,6 +11,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:isar/isar.dart';
import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/coin_entity.dart'; import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/coin_entity.dart';
import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart'; import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart';
import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart'; import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart';
@ -18,13 +19,14 @@ import 'package:stackwallet/pages_desktop_specific/my_stack_view/dialogs/desktop
import 'package:stackwallet/providers/db/main_db_provider.dart'; import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/ethereum/ethereum_wallet.dart'; import 'package:stackwallet/services/coins/ethereum/ethereum_wallet.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/models/wallet_info.dart';
import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -60,22 +62,22 @@ class _EthWalletsOverviewState extends ConsumerState<WalletsOverview> {
String _searchString = ""; String _searchString = "";
final List<Tuple2<Manager, List<EthContract>>> wallets = []; final List<Tuple2<Wallet, List<EthContract>>> wallets = [];
List<Tuple2<Manager, List<EthContract>>> _filter(String searchTerm) { List<Tuple2<Wallet, List<EthContract>>> _filter(String searchTerm) {
if (searchTerm.isEmpty) { if (searchTerm.isEmpty) {
return wallets; return wallets;
} }
final List<Tuple2<Manager, List<EthContract>>> results = []; final List<Tuple2<Wallet, List<EthContract>>> results = [];
final term = searchTerm.toLowerCase(); final term = searchTerm.toLowerCase();
for (final tuple in wallets) { for (final tuple in wallets) {
bool includeManager = false; bool includeManager = false;
// search wallet name and total balance // search wallet name and total balance
includeManager |= _elementContains(tuple.item1.walletName, term); includeManager |= _elementContains(tuple.item1.info.name, term);
includeManager |= _elementContains( includeManager |= _elementContains(
tuple.item1.balance.total.decimal.toString(), tuple.item1.info.cachedBalance.total.decimal.toString(),
term, term,
); );
@ -111,15 +113,15 @@ class _EthWalletsOverviewState extends ConsumerState<WalletsOverview> {
searchFieldFocusNode = FocusNode(); searchFieldFocusNode = FocusNode();
final walletsData = final walletsData =
ref.read(walletsServiceChangeNotifierProvider).fetchWalletsData(); ref.read(mainDBProvider).isar.walletInfo.where().findAllSync();
walletsData.removeWhere((key, value) => value.coin != widget.coin); walletsData.removeWhere((e) => e.coin != widget.coin);
if (widget.coin == Coin.ethereum) { if (widget.coin == Coin.ethereum) {
for (final data in walletsData.values) { for (final data in walletsData) {
final List<EthContract> contracts = []; final List<EthContract> contracts = [];
final manager = ref.read(pWallets).getManager(data.walletId); final wallet = ref.read(pWallets).getWallet(data.walletId);
final contractAddresses = (manager.wallet as EthereumWallet) final contractAddresses =
.getWalletTokenContractAddresses(); (wallet as EthereumWallet).getWalletTokenContractAddresses();
// fetch each contract // fetch each contract
for (final contractAddress in contractAddresses) { for (final contractAddress in contractAddresses) {
@ -140,7 +142,7 @@ class _EthWalletsOverviewState extends ConsumerState<WalletsOverview> {
// add tuple to list // add tuple to list
wallets.add( wallets.add(
Tuple2( Tuple2(
ref.read(pWallets).getManager( ref.read(pWallets).getWallet(
data.walletId, data.walletId,
), ),
contracts, contracts,
@ -149,10 +151,10 @@ class _EthWalletsOverviewState extends ConsumerState<WalletsOverview> {
} }
} else { } else {
// add non token wallet tuple to list // add non token wallet tuple to list
for (final data in walletsData.values) { for (final data in walletsData) {
wallets.add( wallets.add(
Tuple2( Tuple2(
ref.read(pWallets).getManager( ref.read(pWallets).getWallet(
data.walletId, data.walletId,
), ),
[], [],
@ -290,11 +292,11 @@ class _EthWalletsOverviewState extends ConsumerState<WalletsOverview> {
itemBuilder: (_, index) { itemBuilder: (_, index) {
final element = data[index]; final element = data[index];
if (element.item1.hasTokenSupport) { if (element.item1.cryptoCurrency.hasTokenSupport) {
if (isDesktop) { if (isDesktop) {
return DesktopExpandingWalletCard( return DesktopExpandingWalletCard(
key: Key( key: Key(
"${element.item1.walletName}_${element.item2.map((e) => e.address).join()}"), "${element.item1.info.name}_${element.item2.map((e) => e.address).join()}"),
data: element, data: element,
navigatorState: widget.navigatorState!, navigatorState: widget.navigatorState!,
); );

View file

@ -111,14 +111,14 @@ class _DesktopAddressBook extends ConsumerState<DesktopAddressBook> {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
List<ContactAddressEntry> addresses = []; List<ContactAddressEntry> addresses = [];
final managers = ref.read(pWallets).managers; final wallets = ref.read(pWallets).wallets;
for (final manager in managers) { for (final wallet in wallets) {
addresses.add( addresses.add(
ContactAddressEntry() ContactAddressEntry()
..coinName = manager.coin.name ..coinName = wallet.info.coin.name
..address = await manager.currentReceivingAddress ..address = wallet.info.cachedReceivingAddress
..label = "Current Receiving" ..label = "Current Receiving"
..other = manager.walletName, ..other = wallet.info.name,
); );
} }
final self = ContactEntry( final self = ContactEntry(

View file

@ -14,16 +14,14 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/contact_entry.dart'; import 'package:stackwallet/models/isar/models/contact_entry.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/pages/address_book_views/subviews/add_new_contact_address_view.dart'; import 'package:stackwallet/pages/address_book_views/subviews/add_new_contact_address_view.dart';
import 'package:stackwallet/pages_desktop_specific/address_book_view/subwidgets/desktop_address_card.dart'; import 'package:stackwallet/pages_desktop_specific/address_book_view/subwidgets/desktop_address_card.dart';
import 'package:stackwallet/pages_desktop_specific/address_book_view/subwidgets/desktop_contact_options_menu_popup.dart'; import 'package:stackwallet/pages_desktop_specific/address_book_view/subwidgets/desktop_contact_options_menu_popup.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/address_book_service_provider.dart'; import 'package:stackwallet/providers/global/address_book_service_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart'; import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_providers.dart'; import 'package:stackwallet/themes/theme_providers.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
@ -53,28 +51,30 @@ class DesktopContactDetails extends ConsumerStatefulWidget {
class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> { class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> {
List<Tuple2<String, Transaction>> _cachedTransactions = []; List<Tuple2<String, Transaction>> _cachedTransactions = [];
Future<List<Tuple2<String, Transaction>>> _filteredTransactionsByContact( Future<List<Tuple2<String, Transaction>>>
List<Manager> managers, _filteredTransactionsByContact() async {
) async {
final contact = final contact =
ref.read(addressBookServiceProvider).getContactById(widget.contactId); ref.read(addressBookServiceProvider).getContactById(widget.contactId);
// TODO: optimise // TODO: optimise
List<Tuple2<String, Transaction>> result = []; final transactions = await ref
for (final manager in managers) { .read(mainDBProvider)
final transactions = await MainDB.instance .isar
.getTransactions(manager.walletId) .transactions
.filter() .where()
.anyOf(contact.addresses.map((e) => e.address), .filter()
(q, String e) => q.address((q) => q.valueEqualTo(e))) .anyOf(contact.addresses.map((e) => e.address),
.sortByTimestampDesc() (q, String e) => q.address((q) => q.valueEqualTo(e)))
.findAll(); .sortByTimestampDesc()
.findAll();
for (final tx in transactions) { List<Tuple2<String, Transaction>> result = [];
result.add(Tuple2(manager.walletId, tx));
} for (final tx in transactions) {
result.add(Tuple2(tx.walletId, tx));
} }
// sort by date // sort by date
result.sort((a, b) => b.item2.timestamp - a.item2.timestamp); result.sort((a, b) => b.item2.timestamp - a.item2.timestamp);
@ -287,8 +287,7 @@ class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> {
), ),
), ),
FutureBuilder( FutureBuilder(
future: _filteredTransactionsByContact( future: _filteredTransactionsByContact(),
ref.watch(pWallets).managers),
builder: (_, builder: (_,
AsyncSnapshot<List<Tuple2<String, Transaction>>> AsyncSnapshot<List<Tuple2<String, Transaction>>>
snapshot) { snapshot) {

View file

@ -16,12 +16,12 @@ import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/pages/receive_view/addresses/address_card.dart'; import 'package:stackwallet/pages/receive_view/addresses/address_card.dart';
import 'package:stackwallet/pages_desktop_specific/addresses/desktop_wallet_addresses_view.dart'; import 'package:stackwallet/pages_desktop_specific/addresses/desktop_wallet_addresses_view.dart';
import 'package:stackwallet/providers/db/main_db_provider.dart'; import 'package:stackwallet/providers/db/main_db_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart'; import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:stackwallet/widgets/stack_text_field.dart'; import 'package:stackwallet/widgets/stack_text_field.dart';
@ -132,8 +132,7 @@ class _DesktopAddressListState extends ConsumerState<DesktopAddressList> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select((value) => value.getManager(widget.walletId).coin));
final ids = _search(_searchString); final ids = _search(_searchString);

View file

@ -65,8 +65,8 @@ class _DesktopCashFusion extends ConsumerState<DesktopCashFusionView> {
FusionOption _roundType = FusionOption.continuous; FusionOption _roundType = FusionOption.continuous;
Future<void> _startFusion() async { Future<void> _startFusion() async {
final fusionWallet = ref.read(pWallets).getManager(widget.walletId).wallet final fusionWallet =
as FusionWalletInterface; ref.read(pWallets).getWallet(widget.walletId) as FusionWalletInterface;
try { try {
fusionWallet.uiState = ref.read( fusionWallet.uiState = ref.read(

View file

@ -119,10 +119,8 @@ class _FusionDialogViewState extends ConsumerState<FusionDialogView> {
); );
if (shouldCancel == true && mounted) { if (shouldCancel == true && mounted) {
final fusionWallet = ref final fusionWallet = ref.read(pWallets).getWallet(widget.walletId)
.read(pWallets) as FusionWalletInterface;
.getManager(widget.walletId)
.wallet as FusionWalletInterface;
await showLoading( await showLoading(
whileFuture: Future.wait([ whileFuture: Future.wait([
@ -283,8 +281,8 @@ class _FusionDialogViewState extends ConsumerState<FusionDialogView> {
/// Fuse again. /// Fuse again.
void _fuseAgain() async { void _fuseAgain() async {
final fusionWallet = ref.read(pWallets).getManager(widget.walletId).wallet final fusionWallet =
as FusionWalletInterface; ref.read(pWallets).getWallet(widget.walletId) as FusionWalletInterface;
final fusionInfo = ref.read(prefsChangeNotifierProvider).fusionServerInfo; final fusionInfo = ref.read(prefsChangeNotifierProvider).fusionServerInfo;

View file

@ -17,7 +17,6 @@ import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart'; import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart';
import 'package:stackwallet/pages_desktop_specific/coin_control/utxo_row.dart'; import 'package:stackwallet/pages_desktop_specific/coin_control/utxo_row.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
@ -25,6 +24,7 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart'; import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
@ -81,7 +81,7 @@ class _DesktopCoinControlUseDialogState
@override @override
void initState() { void initState() {
_searchController = TextEditingController(); _searchController = TextEditingController();
coin = ref.read(pWallets).getManager(widget.walletId).coin; coin = ref.read(pWalletCoin(widget.walletId));
for (final utxo in ref.read(desktopUseUTXOs)) { for (final utxo in ref.read(desktopUseUTXOs)) {
final data = UtxoRowData(utxo.id, true); final data = UtxoRowData(utxo.id, true);

View file

@ -18,13 +18,13 @@ import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/utxo.dart';
import 'package:stackwallet/pages_desktop_specific/coin_control/freeze_button.dart'; import 'package:stackwallet/pages_desktop_specific/coin_control/freeze_button.dart';
import 'package:stackwallet/pages_desktop_specific/coin_control/utxo_row.dart'; import 'package:stackwallet/pages_desktop_specific/coin_control/utxo_row.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart'; import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/custom_buttons/dropdown_button.dart'; import 'package:stackwallet/widgets/custom_buttons/dropdown_button.dart';
@ -71,7 +71,7 @@ class _DesktopCoinControlViewState
@override @override
void initState() { void initState() {
_searchController = TextEditingController(); _searchController = TextEditingController();
coin = ref.read(pWallets).getManager(widget.walletId).coin; coin = ref.read(pWalletCoin(widget.walletId));
super.initState(); super.initState();
} }

View file

@ -14,11 +14,12 @@ import 'package:isar/isar.dart';
import 'package:stackwallet/db/isar/main_db.dart'; import 'package:stackwallet/db/isar/main_db.dart';
import 'package:stackwallet/models/isar/models/isar_models.dart'; import 'package:stackwallet/models/isar/models/isar_models.dart';
import 'package:stackwallet/pages/coin_control/utxo_details_view.dart'; import 'package:stackwallet/pages/coin_control/utxo_details_view.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart'; import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
import 'package:stackwallet/widgets/desktop/secondary_button.dart'; import 'package:stackwallet/widgets/desktop/secondary_button.dart';
@ -96,11 +97,7 @@ class _UtxoRowState extends ConsumerState<UtxoRow> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final coin = ref.watch( final coin = ref.watch(pWalletCoin(widget.walletId));
pWallets.select((value) => value.getManager(widget.walletId).coin));
final currentChainHeight = ref.watch(pWallets
.select((value) => value.getManager(widget.walletId).currentHeight));
return StreamBuilder<UTXO?>( return StreamBuilder<UTXO?>(
stream: stream, stream: stream,
@ -138,7 +135,7 @@ class _UtxoRowState extends ConsumerState<UtxoRow> {
UTXOStatusIcon( UTXOStatusIcon(
blocked: utxo.isBlocked, blocked: utxo.isBlocked,
status: utxo.isConfirmed( status: utxo.isConfirmed(
currentChainHeight, ref.watch(pWalletChainHeight(widget.walletId)),
coin.requiredConfirmations, coin.requiredConfirmations,
) )
? UTXOStatusIconStatus.confirmed ? UTXOStatusIconStatus.confirmed

View file

@ -24,7 +24,6 @@ import 'package:stackwallet/models/isar/stack_theme.dart';
import 'package:stackwallet/pages/exchange_view/trade_details_view.dart'; import 'package:stackwallet/pages/exchange_view/trade_details_view.dart';
import 'package:stackwallet/providers/exchange/trade_sent_from_stack_lookup_provider.dart'; import 'package:stackwallet/providers/exchange/trade_sent_from_stack_lookup_provider.dart';
import 'package:stackwallet/providers/global/trades_service_provider.dart'; import 'package:stackwallet/providers/global/trades_service_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/themes/theme_providers.dart'; import 'package:stackwallet/themes/theme_providers.dart';
@ -32,6 +31,7 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/format.dart'; import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/desktop/desktop_app_bar.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.dart';
@ -367,8 +367,6 @@ class _DesktopTradeRowCardState extends ConsumerState<DesktopTradeRowCard> {
), ),
onPressed: () async { onPressed: () async {
if (txid != null && walletIds != null && walletIds.isNotEmpty) { if (txid != null && walletIds != null && walletIds.isNotEmpty) {
final manager = ref.read(pWallets).getManager(walletIds.first);
//todo: check if print needed //todo: check if print needed
// debugPrint("name: ${manager.walletName}"); // debugPrint("name: ${manager.walletName}");
@ -378,19 +376,21 @@ class _DesktopTradeRowCardState extends ConsumerState<DesktopTradeRowCard> {
.txidEqualTo(txid) .txidEqualTo(txid)
.findFirst(); .findFirst();
await showDialog<void>( if (mounted) {
context: context, await showDialog<void>(
builder: (context) => DesktopDialog( context: context,
maxHeight: MediaQuery.of(context).size.height - 64, builder: (context) => DesktopDialog(
maxWidth: 580, maxHeight: MediaQuery.of(context).size.height - 64,
child: TradeDetailsView( maxWidth: 580,
tradeId: tradeId, child: TradeDetailsView(
transactionIfSentFromStack: tx, tradeId: tradeId,
walletName: manager.walletName, transactionIfSentFromStack: tx,
walletId: walletIds.first, walletName: ref.read(pWalletName(walletIds.first)),
walletId: walletIds.first,
),
), ),
), );
); }
if (mounted) { if (mounted) {
unawaited( unawaited(
@ -436,7 +436,8 @@ class _DesktopTradeRowCardState extends ConsumerState<DesktopTradeRowCard> {
child: TradeDetailsView( child: TradeDetailsView(
tradeId: tradeId, tradeId: tradeId,
transactionIfSentFromStack: tx, transactionIfSentFromStack: tx,
walletName: manager.walletName, walletName: ref
.read(pWalletName(walletIds.first)),
walletId: walletIds.first, walletId: walletIds.first,
), ),
), ),

View file

@ -238,27 +238,24 @@ class _DesktopStep2State extends ConsumerState<DesktopStep2> {
if (tuple != null) { if (tuple != null) {
if (ref.read(desktopExchangeModelProvider)!.receiveTicker.toLowerCase() == if (ref.read(desktopExchangeModelProvider)!.receiveTicker.toLowerCase() ==
tuple.item2.ticker.toLowerCase()) { tuple.item2.ticker.toLowerCase()) {
ref _toController.text = ref
.read(pWallets) .read(pWallets)
.getManager(tuple.item1) .getWallet(tuple.item1)
.currentReceivingAddress .info
.then((value) { .cachedReceivingAddress;
_toController.text = value;
ref.read(desktopExchangeModelProvider)!.recipientAddress = ref.read(desktopExchangeModelProvider)!.recipientAddress =
_toController.text; _toController.text;
});
} else { } else {
if (ref.read(desktopExchangeModelProvider)!.sendTicker.toUpperCase() == if (ref.read(desktopExchangeModelProvider)!.sendTicker.toUpperCase() ==
tuple.item2.ticker.toUpperCase()) { tuple.item2.ticker.toUpperCase()) {
ref _refundController.text = ref
.read(pWallets) .read(pWallets)
.getManager(tuple.item1) .getWallet(tuple.item1)
.currentReceivingAddress .info
.then((value) { .cachedReceivingAddress;
_refundController.text = value; ref.read(desktopExchangeModelProvider)!.refundAddress =
ref.read(desktopExchangeModelProvider)!.refundAddress = _refundController.text;
_refundController.text;
});
} }
} }
} }

View file

@ -40,8 +40,8 @@ class _DesktopStep4State extends ConsumerState<DesktopStep4> {
final coin = coinFromTickerCaseInsensitive(ticker); final coin = coinFromTickerCaseInsensitive(ticker);
return ref return ref
.read(pWallets) .read(pWallets)
.managers .wallets
.where((element) => element.coin == coin) .where((e) => e.info.coin == coin)
.isNotEmpty; .isNotEmpty;
} catch (_) { } catch (_) {
return false; return false;

View file

@ -12,7 +12,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/providers/providers.dart'; import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
@ -20,6 +19,7 @@ import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart'; import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
import 'package:stackwallet/widgets/desktop/secondary_button.dart'; import 'package:stackwallet/widgets/desktop/secondary_button.dart';
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart'; import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
@ -56,9 +56,9 @@ class _DesktopChooseFromStackState
final List<String> result = []; final List<String> result = [];
for (final walletId in walletIds) { for (final walletId in walletIds) {
final manager = ref.read(pWallets).getManager(walletId); final name = ref.read(pWalletName(walletId));
if (manager.walletName.toLowerCase().contains(searchTerm.toLowerCase())) { if (name.toLowerCase().contains(searchTerm.toLowerCase())) {
result.add(walletId); result.add(walletId);
} }
} }
@ -158,13 +158,13 @@ class _DesktopChooseFromStackState
Flexible( Flexible(
child: Builder( child: Builder(
builder: (context) { builder: (context) {
List<String> walletIds = ref.watch( final wallets = ref
pWallets.select( .watch(pWallets)
(value) => value.getWalletIdsFor(coin: widget.coin), .walletsByCoin
), .where((e) => e.coin == widget.coin)
); .map((e) => e.wallets);
if (walletIds.isEmpty) { if (wallets.isEmpty) {
return Column( return Column(
children: [ children: [
RoundedWhiteContainer( RoundedWhiteContainer(
@ -183,6 +183,9 @@ class _DesktopChooseFromStackState
); );
} }
List<String> walletIds =
wallets.first.map((e) => e.walletId).toList();
walletIds = filter(walletIds, _searchTerm); walletIds = filter(walletIds, _searchTerm);
return ListView.separated( return ListView.separated(
@ -192,8 +195,8 @@ class _DesktopChooseFromStackState
height: 5, height: 5,
), ),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final manager = ref.watch(pWallets final wallet = ref.watch(pWallets
.select((value) => value.getManager(walletIds[index]))); .select((value) => value.getWallet(walletIds[index])));
return RoundedWhiteContainer( return RoundedWhiteContainer(
borderColor: borderColor:
@ -212,7 +215,7 @@ class _DesktopChooseFromStackState
width: 12, width: 12,
), ),
Text( Text(
manager.walletName, wallet.info.name,
style: STextStyles.desktopTextExtraExtraSmall( style: STextStyles.desktopTextExtraExtraSmall(
context) context)
.copyWith( .copyWith(
@ -233,13 +236,12 @@ class _DesktopChooseFromStackState
CustomTextButton( CustomTextButton(
text: "Select wallet", text: "Select wallet",
onTap: () async { onTap: () async {
final address = final address = wallet.info.cachedReceivingAddress;
await manager.currentReceivingAddress;
if (mounted) { if (mounted) {
Navigator.of(context).pop( Navigator.of(context).pop(
Tuple2( Tuple2(
manager.walletName, wallet.info.name,
address, address,
), ),
); );
@ -287,17 +289,14 @@ class _BalanceDisplay extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final manager = final coin = ref.watch(pWalletCoin(walletId));
ref.watch(pWallets.select((value) => value.getManager(walletId))); Amount total = ref.watch(pWalletBalance(walletId)).total;
if (coin == Coin.firo || coin == Coin.firoTestNet) {
Amount total = manager.balance.total; total += ref.watch(pWalletBalanceSecondary(walletId)).total;
if (manager.coin == Coin.firo || manager.coin == Coin.firoTestNet) {
final firoWallet = manager.wallet as FiroWallet;
total += firoWallet.balancePrivate.total;
} }
return Text( return Text(
ref.watch(pAmountFormatter(manager.coin)).format(total), ref.watch(pAmountFormatter(coin)).format(total),
style: STextStyles.desktopTextExtraSmall(context).copyWith( style: STextStyles.desktopTextExtraSmall(context).copyWith(
color: Theme.of(context).extension<StackColors>()!.textSubtitle1, color: Theme.of(context).extension<StackColors>()!.textSubtitle1,
), ),

View file

@ -17,11 +17,11 @@ import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart'
import 'package:stackwallet/pages/exchange_view/trade_details_view.dart'; import 'package:stackwallet/pages/exchange_view/trade_details_view.dart';
import 'package:stackwallet/providers/exchange/trade_sent_from_stack_lookup_provider.dart'; import 'package:stackwallet/providers/exchange/trade_sent_from_stack_lookup_provider.dart';
import 'package:stackwallet/providers/global/trades_service_provider.dart'; import 'package:stackwallet/providers/global/trades_service_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/route_generator.dart'; import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.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_dialog_close_button.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
@ -117,9 +117,6 @@ class _DesktopTradeHistoryState extends ConsumerState<DesktopTradeHistory> {
if (txid != null && if (txid != null &&
walletIds != null && walletIds != null &&
walletIds.isNotEmpty) { walletIds.isNotEmpty) {
final manager =
ref.read(pWallets).getManager(walletIds.first);
//todo: check if print needed //todo: check if print needed
// debugPrint("name: ${manager.walletName}"); // debugPrint("name: ${manager.walletName}");
@ -175,7 +172,9 @@ class _DesktopTradeHistoryState extends ConsumerState<DesktopTradeHistory> {
child: TradeDetailsView( child: TradeDetailsView(
tradeId: tradeId, tradeId: tradeId,
transactionIfSentFromStack: tx, transactionIfSentFromStack: tx,
walletName: manager.walletName, walletName: ref.read(
pWalletName(
walletIds.first)),
walletId: walletIds.first, walletId: walletIds.first,
), ),
), ),

View file

@ -20,6 +20,7 @@ import 'package:stackwallet/pages_desktop_specific/settings/desktop_settings_vie
import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/desktop_about_view.dart'; import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/desktop_about_view.dart';
import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/desktop_support_view.dart'; import 'package:stackwallet/pages_desktop_specific/settings/settings_menu/desktop_support_view.dart';
import 'package:stackwallet/providers/desktop/current_desktop_menu_item.dart'; import 'package:stackwallet/providers/desktop/current_desktop_menu_item.dart';
import 'package:stackwallet/providers/global/active_wallet_provider.dart';
import 'package:stackwallet/providers/global/auto_swb_service_provider.dart'; import 'package:stackwallet/providers/global/auto_swb_service_provider.dart';
import 'package:stackwallet/providers/global/notifications_provider.dart'; import 'package:stackwallet/providers/global/notifications_provider.dart';
import 'package:stackwallet/providers/global/prefs_provider.dart'; import 'package:stackwallet/providers/global/prefs_provider.dart';
@ -32,8 +33,6 @@ import 'package:stackwallet/utilities/enums/backup_frequency_type.dart';
import 'package:stackwallet/widgets/background.dart'; import 'package:stackwallet/widgets/background.dart';
import 'package:stackwallet/widgets/onetime_popups/tor_has_been_add_dialog.dart'; import 'package:stackwallet/widgets/onetime_popups/tor_has_been_add_dialog.dart';
final currentWalletIdProvider = StateProvider<String?>((_) => null);
class DesktopHomeView extends ConsumerStatefulWidget { class DesktopHomeView extends ConsumerStatefulWidget {
const DesktopHomeView({Key? key}) : super(key: key); const DesktopHomeView({Key? key}) : super(key: key);
@ -113,11 +112,11 @@ class _DesktopHomeViewState extends ConsumerState<DesktopHomeView> {
Navigator.of(myStackViewNavKey.currentContext!) Navigator.of(myStackViewNavKey.currentContext!)
.popUntil(ModalRoute.withName(MyStackView.routeName)); .popUntil(ModalRoute.withName(MyStackView.routeName));
if (ref.read(currentWalletIdProvider.state).state != null) { if (ref.read(currentWalletIdProvider.state).state != null) {
final managerProvider = ref final wallet =
.read(pWallets) ref.read(pWallets).getWallet(ref.read(currentWalletIdProvider)!);
.getManagerProvider(ref.read(currentWalletIdProvider.state).state!);
if (ref.read(managerProvider).shouldAutoSync) { if (wallet.shouldAutoSync) {
ref.read(managerProvider).shouldAutoSync = false; wallet.shouldAutoSync = false;
} }
ref.read(transactionFilterProvider.state).state = null; ref.read(transactionFilterProvider.state).state = null;
if (ref.read(prefsChangeNotifierProvider).isAutoBackupEnabled && if (ref.read(prefsChangeNotifierProvider).isAutoBackupEnabled &&
@ -125,7 +124,10 @@ class _DesktopHomeViewState extends ConsumerState<DesktopHomeView> {
BackupFrequencyType.afterClosingAWallet) { BackupFrequencyType.afterClosingAWallet) {
ref.read(autoSWBServiceProvider).doBackup(); ref.read(autoSWBServiceProvider).doBackup();
} }
ref.read(managerProvider.notifier).isActiveWallet = false;
// ref.read(managerProvider.notifier).isActiveWallet = false;
// TODO: call exit here?
// wallet.exit(); ??
} }
} }
ref.read(prevDesktopMenuItemProvider.state).state = newKey; ref.read(prevDesktopMenuItemProvider.state).state = newKey;

View file

@ -10,8 +10,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/pages_desktop_specific/desktop_home_view.dart';
import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart'; import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart';
import 'package:stackwallet/providers/global/active_wallet_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart'; import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
@ -30,7 +30,11 @@ class CoinWalletsTable extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final walletIds = ref final walletIds = ref
.watch(pWallets.select((value) => value.getWalletIdsFor(coin: coin))); .watch(pWallets)
.wallets
.where((e) => e.info.coin == coin)
.map((e) => e.walletId)
.toList();
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@ -71,11 +75,12 @@ class CoinWalletsTable extends ConsumerWidget {
ref.read(currentWalletIdProvider.state).state = ref.read(currentWalletIdProvider.state).state =
walletIds[i]; walletIds[i];
final manager = final wallet =
ref.read(pWallets).getManager(walletIds[i]); ref.read(pWallets).getWallet(walletIds[i]);
if (manager.coin == Coin.monero || if (wallet.info.coin == Coin.monero ||
manager.coin == Coin.wownero) { wallet.info.coin == Coin.wownero) {
await manager.initializeExisting(); // TODO: this can cause ui lag
await wallet.init();
} }
await Navigator.of(context).pushNamed( await Navigator.of(context).pushNamed(

View file

@ -13,12 +13,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/pages/manage_favorites_view/manage_favorites_view.dart'; import 'package:stackwallet/pages/manage_favorites_view/manage_favorites_view.dart';
import 'package:stackwallet/pages/wallets_view/sub_widgets/favorite_card.dart'; import 'package:stackwallet/pages/wallets_view/sub_widgets/favorite_card.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart'; import 'package:stackwallet/widgets/custom_buttons/blue_text_button.dart';
import 'package:stackwallet/widgets/db_watchers/favourite_wallets_watcher.dart';
class DesktopFavoriteWallets extends ConsumerWidget { class DesktopFavoriteWallets extends ConsumerWidget {
const DesktopFavoriteWallets({Key? key}) : super(key: key); const DesktopFavoriteWallets({Key? key}) : super(key: key);
@ -31,117 +31,116 @@ class DesktopFavoriteWallets extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final favorites = ref.watch(favoritesProvider); return FavouriteWalletsWatcher(
bool hasFavorites = favorites.length > 0; builder: (context, favourites) {
bool hasFavorites = favourites.isNotEmpty;
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Row(
"Favorite wallets", mainAxisAlignment: MainAxisAlignment.spaceBetween,
style: STextStyles.desktopTextExtraSmall(context).copyWith( children: [
color: Theme.of(context) Text(
.extension<StackColors>()! "Favorite wallets",
.textFieldActiveSearchIconRight, style: STextStyles.desktopTextExtraSmall(context).copyWith(
),
),
CustomTextButton(
text: "Edit",
onTap: () {
Navigator.of(context).pushNamed(ManageFavoritesView.routeName);
},
),
],
),
const SizedBox(
height: 20,
),
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: (cardHeight * 2) + standardPadding,
minHeight: cardHeight,
),
child: hasFavorites
? SingleChildScrollView(
primary: false,
child: Wrap(
spacing: 16,
runSpacing: 16,
children: [
...favorites.map((p0) {
final walletId = ref.read(p0).walletId;
final walletName = ref.read(p0).walletName;
final managerProvider =
ref.read(pWallets).getManagerProvider(walletId);
return FavoriteCard(
walletId: walletId,
key: Key(walletName),
width: cardWidth,
height: cardHeight,
);
})
],
),
)
: Container(
height: cardHeight,
width: cardWidth,
decoration: BoxDecoration(
color: Theme.of(context) color: Theme.of(context)
.extension<StackColors>()! .extension<StackColors>()!
.textFieldDefaultBG, .textFieldActiveSearchIconRight,
borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius,
),
),
child: MaterialButton(
splashColor:
Theme.of(context).extension<StackColors>()!.highlight,
key: const Key("favoriteWalletsAddFavoriteButtonKey"),
padding: const EdgeInsets.all(12),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius),
),
onPressed: () {
Navigator.of(context)
.pushNamed(ManageFavoritesView.routeName);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.svg.plus,
width: 14,
height: 14,
color: Theme.of(context)
.extension<StackColors>()!
.textSubtitle1,
),
const SizedBox(
width: 4,
),
Text(
"Add a favorite",
style: STextStyles.itemSubtitle(context).copyWith(
fontSize: 18,
),
),
],
),
), ),
), ),
), CustomTextButton(
const SizedBox( text: "Edit",
height: 40, onTap: () {
), Navigator.of(context)
], .pushNamed(ManageFavoritesView.routeName);
},
),
],
),
const SizedBox(
height: 20,
),
ConstrainedBox(
constraints: const BoxConstraints(
maxHeight: (cardHeight * 2) + standardPadding,
minHeight: cardHeight,
),
child: hasFavorites
? SingleChildScrollView(
primary: false,
child: Wrap(
spacing: 16,
runSpacing: 16,
children: [
...favourites.map((e) {
return FavoriteCard(
walletId: e.walletId,
key: Key(e.name),
width: cardWidth,
height: cardHeight,
);
})
],
),
)
: Container(
height: cardHeight,
width: cardWidth,
decoration: BoxDecoration(
color: Theme.of(context)
.extension<StackColors>()!
.textFieldDefaultBG,
borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius,
),
),
child: MaterialButton(
splashColor: Theme.of(context)
.extension<StackColors>()!
.highlight,
key: const Key("favoriteWalletsAddFavoriteButtonKey"),
padding: const EdgeInsets.all(12),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius),
),
onPressed: () {
Navigator.of(context)
.pushNamed(ManageFavoritesView.routeName);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
Assets.svg.plus,
width: 14,
height: 14,
color: Theme.of(context)
.extension<StackColors>()!
.textSubtitle1,
),
const SizedBox(
width: 4,
),
Text(
"Add a favorite",
style: STextStyles.itemSubtitle(context).copyWith(
fontSize: 18,
),
),
],
),
),
),
),
const SizedBox(
height: 40,
),
],
);
},
); );
} }
} }

View file

@ -12,11 +12,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart'; import 'package:stackwallet/models/isar/models/ethereum/eth_contract.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/constants.dart'; import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart'; import 'package:stackwallet/widgets/animated_widgets/rotate_icon.dart';
import 'package:stackwallet/widgets/expandable.dart'; import 'package:stackwallet/widgets/expandable.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
@ -32,7 +32,7 @@ class DesktopExpandingWalletCard extends StatefulWidget {
required this.navigatorState, required this.navigatorState,
}) : super(key: key); }) : super(key: key);
final Tuple2<Manager, List<EthContract>> data; final Tuple2<Wallet, List<EthContract>> data;
final NavigatorState navigatorState; final NavigatorState navigatorState;
@override @override
@ -48,7 +48,7 @@ class _DesktopExpandingWalletCardState
@override @override
void initState() { void initState() {
if (widget.data.item1.hasTokenSupport) { if (widget.data.item1.cryptoCurrency.hasTokenSupport) {
tokenContractAddresses.addAll( tokenContractAddresses.addAll(
widget.data.item2.map((e) => e.address), widget.data.item2.map((e) => e.address),
); );
@ -63,7 +63,7 @@ class _DesktopExpandingWalletCardState
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
borderColor: Theme.of(context).extension<StackColors>()!.backgroundAppBar, borderColor: Theme.of(context).extension<StackColors>()!.backgroundAppBar,
child: Expandable( child: Expandable(
initialState: widget.data.item1.hasTokenSupport initialState: widget.data.item1.cryptoCurrency.hasTokenSupport
? ExpandableState.expanded ? ExpandableState.expanded
: ExpandableState.collapsed, : ExpandableState.collapsed,
controller: expandableController, controller: expandableController,
@ -89,13 +89,13 @@ class _DesktopExpandingWalletCardState
child: Row( child: Row(
children: [ children: [
WalletInfoCoinIcon( WalletInfoCoinIcon(
coin: widget.data.item1.coin, coin: widget.data.item1.info.coin,
), ),
const SizedBox( const SizedBox(
width: 12, width: 12,
), ),
Text( Text(
widget.data.item1.walletName, widget.data.item1.info.name,
style: STextStyles.desktopTextExtraSmall(context) style: STextStyles.desktopTextExtraSmall(context)
.copyWith( .copyWith(
color: Theme.of(context) color: Theme.of(context)

View file

@ -21,14 +21,15 @@ import 'package:stackwallet/providers/global/prefs_provider.dart';
import 'package:stackwallet/providers/global/price_provider.dart'; import 'package:stackwallet/providers/global/price_provider.dart';
import 'package:stackwallet/providers/global/wallets_provider.dart'; import 'package:stackwallet/providers/global/wallets_provider.dart';
import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart'; import 'package:stackwallet/providers/wallet/public_private_balance_state_provider.dart';
import 'package:stackwallet/services/coins/firo/firo_wallet.dart';
import 'package:stackwallet/themes/coin_icon_provider.dart'; import 'package:stackwallet/themes/coin_icon_provider.dart';
import 'package:stackwallet/themes/stack_colors.dart'; import 'package:stackwallet/themes/stack_colors.dart';
import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/amount/amount_formatter.dart'; import 'package:stackwallet/utilities/amount/amount_formatter.dart';
import 'package:stackwallet/utilities/barcode_scanner_interface.dart'; import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart'; import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/text_styles.dart';
import 'package:stackwallet/wallets/isar/providers/wallet_info_provider.dart';
import 'package:stackwallet/widgets/desktop/desktop_dialog.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_dialog_close_button.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
@ -58,12 +59,12 @@ class _DesktopPaynymSendDialogState
extends ConsumerState<DesktopPaynymSendDialog> { extends ConsumerState<DesktopPaynymSendDialog> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final manager = ref final wallet =
.watch(pWallets.select((value) => value.getManager(widget.walletId))); ref.watch(pWallets.select((value) => value.getWallet(widget.walletId)));
final String locale = ref.watch( final String locale = ref.watch(
localeServiceChangeNotifierProvider.select((value) => value.locale)); localeServiceChangeNotifierProvider.select((value) => value.locale));
final coin = manager.coin; final coin = ref.watch(pWalletCoin(widget.walletId));
final isFiro = coin == Coin.firo || coin == Coin.firoTestNet; final isFiro = coin == Coin.firo || coin == Coin.firoTestNet;
@ -78,7 +79,7 @@ class _DesktopPaynymSendDialogState
Padding( Padding(
padding: const EdgeInsets.only(left: 32), padding: const EdgeInsets.only(left: 32),
child: Text( child: Text(
"Send ${manager.coin.ticker.toUpperCase()}", "Send ${coin.ticker.toUpperCase()}",
style: STextStyles.desktopH3(context), style: STextStyles.desktopH3(context),
), ),
), ),
@ -107,7 +108,7 @@ class _DesktopPaynymSendDialogState
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
manager.walletName, ref.watch(pWalletName(widget.walletId)),
style: STextStyles.titleBold12(context), style: STextStyles.titleBold12(context),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
maxLines: 1, maxLines: 1,
@ -135,9 +136,9 @@ class _DesktopPaynymSendDialogState
children: [ children: [
Text( Text(
!isFiro !isFiro
? ref ? ref.watch(pAmountFormatter(coin)).format(ref
.watch(pAmountFormatter(coin)) .watch(pWalletBalance(widget.walletId))
.format(manager.balance.spendable) .spendable)
: ref : ref
.watch( .watch(
publicPrivateBalanceStateProvider publicPrivateBalanceStateProvider
@ -146,12 +147,24 @@ class _DesktopPaynymSendDialogState
.state == .state ==
"Private" "Private"
? ref.watch(pAmountFormatter(coin)).format( ? ref.watch(pAmountFormatter(coin)).format(
(manager.wallet as FiroWallet) ref
.availablePrivateBalance()) .watch(
pWalletBalance(widget.walletId))
.spendable,
)
: ref.watch(pAmountFormatter(coin)).format( : ref.watch(pAmountFormatter(coin)).format(
(manager.wallet as FiroWallet) ref
.availablePublicBalance(), .watch(pWalletBalanceSecondary(
widget.walletId))
.spendable,
), ),
// ? ref.watch(pAmountFormatter(coin)).format(
// (manager.wallet as FiroWallet)
// .availablePrivateBalance())
// : ref.watch(pAmountFormatter(coin)).format(
// (manager.wallet as FiroWallet)
// .availablePublicBalance(),
// ),
style: STextStyles.titleBold12(context), style: STextStyles.titleBold12(context),
textAlign: TextAlign.right, textAlign: TextAlign.right,
), ),
@ -159,7 +172,7 @@ class _DesktopPaynymSendDialogState
height: 2, height: 2,
), ),
Text( Text(
"${((!isFiro ? manager.balance.spendable.decimal : ref.watch(publicPrivateBalanceStateProvider.state).state == "Private" ? (manager.wallet as FiroWallet).availablePrivateBalance().decimal : (manager.wallet as FiroWallet).availablePublicBalance().decimal) * ref.watch( "${((!isFiro ? ref.watch(pWalletBalance(widget.walletId)).spendable.decimal : ref.watch(publicPrivateBalanceStateProvider.state).state == "Private" ? ref.watch(pWalletBalance(widget.walletId)).spendable.decimal : ref.watch(pWalletBalanceSecondary(widget.walletId)).spendable.decimal) * ref.watch(
priceAnd24hChangeNotifierProvider.select( priceAnd24hChangeNotifierProvider.select(
(value) => value.getPrice(coin).item1, (value) => value.getPrice(coin).item1,
), ),
@ -192,7 +205,7 @@ class _DesktopPaynymSendDialogState
bottom: 32, bottom: 32,
), ),
child: DesktopSend( child: DesktopSend(
walletId: manager.walletId, walletId: widget.walletId,
accountLite: widget.accountLite, accountLite: widget.accountLite,
), ),
), ),

View file

@ -36,19 +36,14 @@ class _WalletTableState extends ConsumerState<WalletSummaryTable> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType"); debugPrint("BUILD: $runtimeType");
final providersByCoin = ref.watch( final walletsByCoin = ref.watch(pWallets).walletsByCoin;
pWallets.select(
(value) => value.getManagerProvidersByCoin(),
),
);
return ListView.separated( return ListView.separated(
itemBuilder: (_, index) { itemBuilder: (_, index) {
final providers = providersByCoin[index].item2; final coin = walletsByCoin[index].coin;
final coin = providersByCoin[index].item1;
return ConditionalParent( return ConditionalParent(
condition: index + 1 == providersByCoin.length, condition: index + 1 == walletsByCoin.length,
builder: (child) => Padding( builder: (child) => Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
bottom: 16, bottom: 16,
@ -58,14 +53,14 @@ class _WalletTableState extends ConsumerState<WalletSummaryTable> {
child: DesktopWalletSummaryRow( child: DesktopWalletSummaryRow(
key: Key("DesktopWalletSummaryRow_key_${coin.name}"), key: Key("DesktopWalletSummaryRow_key_${coin.name}"),
coin: coin, coin: coin,
walletCount: providers.length, walletCount: walletsByCoin[index].wallets.length,
), ),
); );
}, },
separatorBuilder: (_, __) => const SizedBox( separatorBuilder: (_, __) => const SizedBox(
height: 10, height: 10,
), ),
itemCount: providersByCoin.length, itemCount: walletsByCoin.length,
); );
} }
} }

Some files were not shown because too many files have changed in this diff Show more