diff --git a/packages/secure_store/lib/src/password_store.dart b/packages/secure_store/lib/src/password_store.dart index ac74dd0b..7985f2e2 100644 --- a/packages/secure_store/lib/src/password_store.dart +++ b/packages/secure_store/lib/src/password_store.dart @@ -71,19 +71,13 @@ class PasswordStore implements SecureStore { if (password == null) { throw Exception('Password must be provided'); } - try { - return bytesToString( - decrypt( - password: stringToBytes(password!), - encryptedSecret: base64Decode(cipherText as String), - ), - ); - } catch (e) { - if (kDebugMode) { - print(e); - } - throw Exception('Wrong password'); - } + + return bytesToString( + decrypt( + password: stringToBytes(password!), + encryptedSecret: base64Decode(cipherText as String), + ), + ); } } diff --git a/packages/wallet_kit/lib/errors/index.dart b/packages/wallet_kit/lib/errors/index.dart new file mode 100644 index 00000000..49349a68 --- /dev/null +++ b/packages/wallet_kit/lib/errors/index.dart @@ -0,0 +1 @@ +export 'wallet_kit_error.dart'; diff --git a/packages/wallet_kit/lib/errors/wallet_kit_error.dart b/packages/wallet_kit/lib/errors/wallet_kit_error.dart new file mode 100644 index 00000000..702b5450 --- /dev/null +++ b/packages/wallet_kit/lib/errors/wallet_kit_error.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +class WalletKitErrorHandler { + static final WalletKitErrorHandler _instance = + WalletKitErrorHandler._internal(); + + WalletKitErrorHandler._internal(); + + factory WalletKitErrorHandler() => _instance; + + void handleError( + BuildContext context, + WalletKitError error, + String? message, + ) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('${message ?? "error"}: $error')), + ); + Navigator.of(context).pop(); + } +} + +class WalletKitError implements Exception { + final String message; + final int? code; + + WalletKitError(this.message, {this.code}); + + @override + String toString() => + 'WalletKitError: $message${code != null ? ' (Code: $code)' : ''}'; +} diff --git a/packages/wallet_kit/lib/wallet_state/wallet_provider.dart b/packages/wallet_kit/lib/wallet_state/wallet_provider.dart index 60e1eb90..ea50a570 100644 --- a/packages/wallet_kit/lib/wallet_state/wallet_provider.dart +++ b/packages/wallet_kit/lib/wallet_state/wallet_provider.dart @@ -3,7 +3,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:secure_store/secure_store.dart'; import 'package:starknet/starknet.dart' as s; import 'package:starknet_provider/starknet_provider.dart' as sp; - +import '../errors/wallet_kit_error.dart'; import '../utils/persisted_notifier_state.dart'; import '../wallet_kit.dart'; @@ -46,25 +46,30 @@ class Wallets extends _$Wallets with PersistedState { updateWallet(wallet: walletWithAccount, accountId: account.id); } - addAccount({ + Future addAccount({ required String walletId, required Future Function() getPassword, SecureStore? secureStore, }) async { final wallet = state.wallets[walletId]; if (wallet == null) { - throw Exception("Wallet not found"); + throw WalletKitError("Wallet not found"); } secureStore = secureStore ?? await getSecureStore( getPassword: getPassword, type: wallet.secureStoreType, ); - final seedPhrase = await secureStore.getSecret( - key: seedPhraseKey(walletId), - ); + late final String? seedPhrase; + try { + seedPhrase = await secureStore.getSecret( + key: seedPhraseKey(walletId), + ); + } catch (e) { + throw WalletKitError("Wrong password"); + } if (seedPhrase == null) { - throw Exception("Seed phrase not found"); + throw WalletKitError("Secret not found"); } final (walletWithAccount, account) = await WalletService.addAccount( secureStore: secureStore, diff --git a/packages/wallet_kit/lib/widgets/wallet_list.dart b/packages/wallet_kit/lib/widgets/wallet_list.dart index c8f1a017..91d658cf 100644 --- a/packages/wallet_kit/lib/widgets/wallet_list.dart +++ b/packages/wallet_kit/lib/widgets/wallet_list.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import '../errors/wallet_kit_error.dart'; import '../services/index.dart'; import '../ui/index.dart'; import '../utils/index.dart'; @@ -205,11 +206,20 @@ class WalletCell extends HookConsumerWidget { child: TextButton.icon( label: const Text('Add account'), onPressed: () async { - ref.read(walletsProvider.notifier).addAccount( - walletId: wallet.id, - getPassword: () => showPasswordModal(context), - ); - Navigator.of(context).pop(); + try { + await ref.read(walletsProvider.notifier).addAccount( + walletId: wallet.id, + getPassword: () => showPasswordModal(context), + ); + if (context.mounted) { + Navigator.of(context).pop(); + } + } on WalletKitError catch (error) { + if (context.mounted) { + WalletKitErrorHandler().handleError( + context, error, "Failed to add account"); + } + } }, icon: Icon( Icons.add_circle_outline_rounded,