diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 4b80cb201..c05095cf1 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -2270,6 +2270,8 @@ abstract class ElectrumWalletBase extends WalletBase< Timer(Duration(seconds: 5), () { if (this.syncStatus is NotConnectedSyncStatus || this.syncStatus is LostConnectionSyncStatus) { + if (node == null) return; + this.electrumClient.connectToUri( node!.uri, useSSL: node!.useSSL ?? false, diff --git a/cw_haven/lib/haven_wallet_addresses.dart b/cw_haven/lib/haven_wallet_addresses.dart index 06de44dff..c3d1ef46c 100644 --- a/cw_haven/lib/haven_wallet_addresses.dart +++ b/cw_haven/lib/haven_wallet_addresses.dart @@ -23,6 +23,8 @@ abstract class HavenWalletAddressesBase extends WalletAddressesWithAccount address; + // @override @observable Account? account; diff --git a/lib/core/wallet_connect/web3wallet_service.dart b/lib/core/wallet_connect/web3wallet_service.dart index adb516817..ba4785643 100644 --- a/lib/core/wallet_connect/web3wallet_service.dart +++ b/lib/core/wallet_connect/web3wallet_service.dart @@ -267,6 +267,8 @@ abstract class Web3WalletServiceBase with Store { final keyForWallet = getKeyForStoringTopicsForWallet(); + if (keyForWallet.isEmpty) return; + final currentTopicsForWallet = getPairingTopicsForWallet(keyForWallet); final filteredPairings = @@ -360,6 +362,10 @@ abstract class Web3WalletServiceBase with Store { String getKeyForStoringTopicsForWallet() { List chainKeys = walletKeyService.getKeysForChain(appStore.wallet!); + if (chainKeys.isEmpty) { + return ''; + } + final keyForPairingTopic = PreferencesKey.walletConnectPairingTopicsListForWallet(chainKeys.first.publicKey); @@ -386,6 +392,8 @@ abstract class Web3WalletServiceBase with Store { // Get key specific to the current wallet final key = getKeyForStoringTopicsForWallet(); + if (key.isEmpty) return; + // Get all pairing topics attached to this key final pairingTopicsForWallet = getPairingTopicsForWallet(key); diff --git a/lib/entities/fiat_currency.dart b/lib/entities/fiat_currency.dart index a8e2829d8..1a031ee82 100644 --- a/lib/entities/fiat_currency.dart +++ b/lib/entities/fiat_currency.dart @@ -114,7 +114,7 @@ class FiatCurrency extends EnumerableItem with Serializable impl FiatCurrency.tur.raw: FiatCurrency.tur, }; - static FiatCurrency deserialize({required String raw}) => _all[raw]!; + static FiatCurrency deserialize({required String raw}) => _all[raw] ?? FiatCurrency.usd; @override bool operator ==(Object other) => other is FiatCurrency && other.raw == raw; diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart index f8cbe9120..0fb629685 100644 --- a/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart +++ b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart @@ -10,7 +10,6 @@ import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/dropdown_item_ import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/store/settings_store.dart'; -import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/themes/extensions/menu_theme.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; @@ -100,6 +99,11 @@ class _DesktopWalletSelectionDropDownState extends State element.isSelected, + orElse: () => dropDownItems.first, + ); + return DropdownButton( items: dropDownItems .map( @@ -115,7 +119,7 @@ class _DesktopWalletSelectionDropDownState extends State()!.backgroundColor, style: TextStyle(color: themeData.extension()!.titleColor), selectedItemBuilder: (context) => dropDownItems.map((item) => item.child).toList(), - value: dropDownItems.firstWhere((element) => element.isSelected), + value: selectedItem, underline: const SizedBox(), focusColor: Colors.transparent, borderRadius: BorderRadius.circular(15.0), diff --git a/lib/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart b/lib/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart index 30b6af7e0..42bef5135 100644 --- a/lib/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart +++ b/lib/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart @@ -52,7 +52,9 @@ class BottomSheetListenerState extends State { ); }, ); - item.completer.complete(value); + if (!item.completer.isCompleted) { + item.completer.complete(value); + } widget.bottomSheetService.resetCurrentSheet(); } } diff --git a/lib/src/widgets/cake_image_widget.dart b/lib/src/widgets/cake_image_widget.dart index ad02c48dd..2038030c0 100644 --- a/lib/src/widgets/cake_image_widget.dart +++ b/lib/src/widgets/cake_image_widget.dart @@ -25,6 +25,7 @@ class CakeImageWidget extends StatelessWidget { imageUrl!, height: height, width: width, + errorBuilder: (_, __, ___) => Icon(Icons.error), ); } @@ -33,6 +34,7 @@ class CakeImageWidget extends StatelessWidget { imageUrl!, height: height, width: width, + placeholderBuilder: (_) => Icon(Icons.error), ); } diff --git a/lib/src/widgets/services_updates_widget.dart b/lib/src/widgets/services_updates_widget.dart index 1babd23d0..1787b7118 100644 --- a/lib/src/widgets/services_updates_widget.dart +++ b/lib/src/widgets/services_updates_widget.dart @@ -46,6 +46,7 @@ class _ServicesUpdatesWidgetState extends State { "assets/images/notification_icon.svg", color: Theme.of(context).extension()!.pageTitleTextColor, width: 30, + placeholderBuilder: (_) => Icon(Icons.error), ), ); } @@ -136,6 +137,7 @@ class _ServicesUpdatesWidgetState extends State { "assets/images/notification_icon.svg", color: Theme.of(context).extension()!.pageTitleTextColor, width: 30, + placeholderBuilder: (_) => Icon(Icons.error), ), if (state.hasData && state.data!.hasUpdates && !wasOpened) Container( diff --git a/lib/utils/exception_handler.dart b/lib/utils/exception_handler.dart index 91797c45e..41ae91d41 100644 --- a/lib/utils/exception_handler.dart +++ b/lib/utils/exception_handler.dart @@ -62,6 +62,14 @@ class ExceptionHandler { await _addDeviceInfo(_file!); + // Check if a mail client is available + final bool canSend = await FlutterMailer.canSendMail(); + + if (Platform.isIOS && !canSend) { + debugPrint('Mail app is not available'); + return; + } + final MailOptions mailOptions = MailOptions( subject: 'Mobile App Issue', recipients: ['support@cakewallet.com'], diff --git a/lib/utils/image_utill.dart b/lib/utils/image_utill.dart index a138df23a..ef3775e4c 100644 --- a/lib/utils/image_utill.dart +++ b/lib/utils/image_utill.dart @@ -53,8 +53,18 @@ class ImageUtil { ); } else { return isSvg - ? SvgPicture.asset(imagePath, height: _height, width: _width) - : Image.asset(imagePath, height: _height, width: _width); + ? SvgPicture.asset( + imagePath, + height: _height, + width: _width, + placeholderBuilder: (_) => Icon(Icons.error), + ) + : Image.asset( + imagePath, + height: _height, + width: _width, + errorBuilder: (_, __, ___) => Icon(Icons.error), + ); } } }