import "package:cake_wallet/core/amount_parsing_proxy.dart"; import "package:cake_wallet/di.dart"; import "package:cake_wallet/entities/preferences_key.dart"; import "package:cake_wallet/reactions/wallet_connect.dart"; import "package:cake_wallet/src/screens/wallet_connect/services/walletkit_service.dart"; import "package:cake_wallet/store/authentication_store.dart"; import "package:cake_wallet/store/settings_store.dart"; import "package:cake_wallet/store/wallet_list_store.dart"; import "package:cake_wallet/themes/core/theme_store.dart"; import "package:cake_wallet/utils/exception_handler.dart"; import "package:cw_core/balance.dart"; import "package:cw_core/transaction_history.dart"; import "package:cw_core/transaction_info.dart"; import "package:cw_core/utils/print_verbose.dart"; import "package:cw_core/wallet_base.dart"; import "package:cw_core/wallet_type.dart"; import "package:mobx/mobx.dart"; import "package:shared_preferences/shared_preferences.dart"; part "app_store.g.dart"; class AppStore = AppStoreBase with _$AppStore; abstract class AppStoreBase with Store { AppStoreBase({ required this.authenticationStore, required this.walletList, required this.settingsStore, required this.themeStore, }) : _amountParsingProxy = AmountParsingProxy(settingsStore.displayAmountsInSatoshi) { reaction( (_) => settingsStore.displayAmountsInSatoshi, (value) => _amountParsingProxy = AmountParsingProxy(value), ); } AuthenticationStore authenticationStore; @observable WalletBase, TransactionInfo>? wallet; @observable String? currentRouteName; WalletListStore walletList; SettingsStore settingsStore; ThemeStore themeStore; @observable AmountParsingProxy _amountParsingProxy; @computed AmountParsingProxy get amountParsingProxy => _amountParsingProxy; @action Future changeCurrentWallet( WalletBase, TransactionInfo> wallet) async { final changingToSameWalletType = this.wallet?.type == wallet.type; final previousWalletType = this.wallet?.type; await this.wallet?.close(shouldCleanup: !changingToSameWalletType); this.wallet = wallet; this.wallet!.setExceptionHandler(ExceptionHandler.onError); if (isWalletConnectCompatibleChain(wallet.type)) { getIt.get().resetConnectionsState(); _queueWalletConnectAction(_setupWalletConnect); } else if (previousWalletType != null && isWalletConnectCompatibleChain(previousWalletType)) { _queueWalletConnectAction(_disposeWalletConnect); } await getIt.get().setString(PreferencesKey.currentWalletName, wallet.name); await getIt .get() .setInt(PreferencesKey.currentWalletType, serializeToInt(wallet.type)); } Future _lastWalletConnectAction = Future.value(); void _queueWalletConnectAction(Future Function() action) { _lastWalletConnectAction = _lastWalletConnectAction.then((_) => action()); } Future _setupWalletConnect() async { try { final wcService = getIt.get(); await wcService.onDispose(); wcService.create(); await wcService.init(); } catch (e, s) { printV("WalletConnect setup failed: $e\n$s"); } } Future _disposeWalletConnect() async { try { await getIt.get().onDispose(); } catch (e) { printV("WalletConnect teardown failed: $e"); } } }