diff --git a/assets/translations/en.json b/assets/translations/en.json index 16b16f004fa6ae13bcc868bfa7b925c6675b9fa3..e00f8aa4708b3edd25349cef15e068ae36f7b204 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -253,5 +253,6 @@ "comment": "Comment", "optionalComment": "Optional comment", "searchContacts": "Search contacts", - "advancedFeature": "Advanced feature reserved for experienced users" + "advancedFeature": "Advanced feature reserved for experienced users", + "editWalletName": "Edit wallet name" } diff --git a/assets/translations/es.json b/assets/translations/es.json index 87043e5d97a4beb5e2d513ff1bddb5f82eb996c2..f4b0c39af1ea803b3f6b7d7914d800272839a44e 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -254,5 +254,6 @@ "comment": "Comentario", "optionalComment": "Comentario opcional", "searchContacts": "Buscar contactos", - "advancedFeature": "Función avanzada reservada para usuarios experimentados" + "advancedFeature": "Función avanzada reservada para usuarios experimentados", + "editWalletName": "Editar nombre de la cartera" } diff --git a/assets/translations/fr.json b/assets/translations/fr.json index ae1fdcb2cd953b7b63e08c4f0138c737291132e7..22e3610af0b4c7282a1dd659eb8383fdcfd6fc59 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -253,5 +253,6 @@ "comment": "Commentaire", "optionalComment": "Commentaire optionnel", "searchContacts": "Rechercher des contacts", - "advancedFeature": "Fonctionnalité avancée réservée aux utilisateurs expérimentés" + "advancedFeature": "Fonctionnalité avancée réservée aux utilisateurs expérimentés", + "editWalletName": "Modifier le nom du portefeuille" } diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index af8c1122f42f51e3c5fb53f094b4164cf4205e36..2c526be9453822601f79d710af52488c1631cb2e 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -25,6 +25,8 @@ class MyWalletsProvider with ChangeNotifier { bool isPinValid = false; bool isPinLoading = true; + bool isOwner(String address) => listWallets.any((wallet) => wallet.address == address); + int getCurrentChest() { if (configBox.get('currentChest') == null) { configBox.put('currentChest', 0); @@ -88,10 +90,11 @@ class MyWalletsProvider with ChangeNotifier { return targetedWallet; } - Future<bool> askPinCode() async { + Future<bool> askPinCode({bool force = false}) async { final defaultWallet = getDefaultWallet(); - if (pinCode.isEmpty) { + if (pinCode.isEmpty || force) { + pinCode = ''; await Navigator.push( homeContext, MaterialPageRoute( diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index a352b12840decd1a8e230256f9a8dca4e9b0ee0e..a9497496338e948a9a212cbc61badc10027a23cf 100644 --- a/lib/screens/myWallets/chest_options.dart +++ b/lib/screens/myWallets/chest_options.dart @@ -63,7 +63,7 @@ class ChestOptionsContent extends StatelessWidget { InkWell( key: keyShowSeed, onTap: () async { - if (!await myWalletProvider.askPinCode()) return; + if (!await myWalletProvider.askPinCode(force: true)) return; Navigator.push( context, MaterialPageRoute( @@ -99,7 +99,8 @@ class ChestOptionsContent extends StatelessWidget { builder: (context, sub, _) { return InkWell( key: keyChangePin, - onTap: () { + onTap: () async { + if (!await myWalletProvider.askPinCode(force: true)) return; Navigator.push( context, MaterialPageRoute( @@ -174,6 +175,8 @@ class ChestOptionsContent extends StatelessWidget { InkWell( key: keyDeleteChest, onTap: () async { + if (!await myWalletProvider.askPinCode(force: true)) return; + await chestProvider.deleteChest(context, currentChest); }, child: Container( diff --git a/lib/screens/myWallets/import_g1_v1.dart b/lib/screens/myWallets/import_g1_v1.dart index 482ac5670023420f8c25a7bbd06e3b087ca4d3df..fe036aee250215c7c6bbdef86e627f5c4b85e2fc 100644 --- a/lib/screens/myWallets/import_g1_v1.dart +++ b/lib/screens/myWallets/import_g1_v1.dart @@ -177,7 +177,7 @@ class ImportG1v1 extends StatelessWidget { '${statusData.fromBalance['transferableBalance']} $unit', style: scaledTextStyle(fontSize: 15), ), - IdentityStatus(address: sub.g1V1NewAddress, isOwner: false, color: Colors.black), + IdentityStatus(address: sub.g1V1NewAddress, color: Colors.black), ScaledSizedBox(width: 10), Certifications(address: sub.g1V1NewAddress, size: 14) ], diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 579f2e83505868ecf224cfb8649629e2d59fbe1d..8a0a355396cc0ae7740ed4e7eb61f724212a20c5 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -53,11 +53,13 @@ class _UnlockingWalletState extends State<UnlockingWallet> { myWalletProvider.isPinLoading = true; }, child: Scaffold( - backgroundColor: backgroundColor, - body: SafeArea( - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ + backgroundColor: backgroundColor, + body: SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: <Widget>[ Padding( - padding: const EdgeInsets.all(16.0), + padding: EdgeInsets.only(left: 8, top: isTall ? 14 : 0), child: IconButton( key: keyPopButton, icon: Icon( @@ -72,117 +74,112 @@ class _UnlockingWalletState extends State<UnlockingWallet> { }, ), ), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - children: <Widget>[ - ScaledSizedBox(height: isTall ? 40 : 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: <Widget>[ - currentChest.imageFile == null - ? Image.asset( - 'assets/chests/${currentChest.imageName}', - width: scaleSize(95), - ) - : Image.file( - currentChest.imageFile!, - width: scaleSize(127), - ), - ScaledSizedBox(width: 18), - Flexible( - child: Text( - currentChest.name!, - textAlign: TextAlign.center, - style: scaledTextStyle( - fontSize: 24, - color: Colors.black, - fontWeight: FontWeight.w700, - ), - ), + ScaledSizedBox(height: isTall ? 12 : 4), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: <Widget>[ + currentChest.imageFile == null + ? Image.asset( + 'assets/chests/${currentChest.imageName}', + width: scaleSize(isTall ? 95 : 75), + ) + : Image.file( + currentChest.imageFile!, + width: scaleSize(isTall ? 127 : 95), ), - ], + ScaledSizedBox(width: 18), + Flexible( + child: Text( + currentChest.name!, + textAlign: TextAlign.center, + style: scaledTextStyle( + fontSize: isTall ? 24 : 20, + color: Colors.black, + fontWeight: FontWeight.w700, + ), ), - ScaledSizedBox(height: isTall ? 40 : 25), - Container( - margin: const EdgeInsets.symmetric(horizontal: 24), - padding: const EdgeInsets.all(24), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(24), - boxShadow: [ - BoxShadow( - color: Colors.black.withValues(alpha: 0.05), - blurRadius: 10, - offset: const Offset(0, 5), - ), - ], + ), + ], + ), + ScaledSizedBox(height: isTall ? 30 : 15), + Container( + margin: const EdgeInsets.symmetric(horizontal: 16), + padding: EdgeInsets.all(isTall ? 24 : 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(24), + boxShadow: [ + BoxShadow( + color: Colors.black.withValues(alpha: 0.05), + blurRadius: 10, + offset: const Offset(0, 5), + ), + ], + ), + child: Column( + children: [ + Text( + 'toUnlockEnterPassword'.tr(), + textAlign: TextAlign.center, + style: scaledTextStyle( + fontSize: isTall ? 16 : 14, + color: Colors.black87, + fontWeight: FontWeight.w500, ), - child: Column( - children: [ - Text( - 'toUnlockEnterPassword'.tr(), - textAlign: TextAlign.center, - style: scaledTextStyle( - fontSize: 16, - color: Colors.black87, - fontWeight: FontWeight.w500, - ), + ), + ScaledSizedBox(height: isTall ? 24 : 12), + if (!myWalletProvider.isPinValid && !myWalletProvider.isPinLoading) + Padding( + padding: const EdgeInsets.only(bottom: 16), + child: Text( + "thisIsNotAGoodCode".tr(), + style: scaledTextStyle( + color: Colors.red[700], + fontWeight: FontWeight.w500, + fontSize: 15, ), - ScaledSizedBox(height: isTall ? 24 : 16), - if (!myWalletProvider.isPinValid && !myWalletProvider.isPinLoading) - Padding( - padding: const EdgeInsets.only(bottom: 16), - child: Text( - "thisIsNotAGoodCode".tr(), - style: scaledTextStyle( - color: Colors.red[700], - fontWeight: FontWeight.w500, - fontSize: 15, - ), + ), + ), + pinForm(context, pinLenght), + ScaledSizedBox(height: isTall ? 16 : 8), + if (canUnlock) + Consumer<WalletOptionsProvider>(builder: (context, sub, _) { + return InkWell( + key: keyCachePassword, + onTap: () { + walletOptions.changePinCacheChoice(); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + configBox.get('isCacheChecked') ? Icons.check_box : Icons.check_box_outline_blank, + color: orangeC, + size: scaleSize(20), ), - ), - pinForm(context, pinLenght), - ScaledSizedBox(height: 16), - if (canUnlock) - Consumer<WalletOptionsProvider>(builder: (context, sub, _) { - return InkWell( - key: keyCachePassword, - onTap: () { - walletOptions.changePinCacheChoice(); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - Icon( - configBox.get('isCacheChecked') ? Icons.check_box : Icons.check_box_outline_blank, - color: orangeC, - size: scaleSize(20), - ), - ScaledSizedBox(width: 8), - Flexible( - child: Text( - 'rememberPassword'.tr(), - style: scaledTextStyle( - fontSize: 12, - color: Colors.grey[700], - fontWeight: FontWeight.w500, - ), - ), - ), - ], + ScaledSizedBox(width: 8), + Flexible( + child: Text( + 'rememberPassword'.tr(), + style: scaledTextStyle( + fontSize: 12, + color: Colors.grey[700], + fontWeight: FontWeight.w500, + ), ), - ); - }), - ], - ), - ), + ), + ], + ), + ); + }), ], ), ), - ]), - )), + ], + ), + ), + ), ); } diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index af723f5d50fb468af56a6cb6f2cf39aba1a2ad37..bb6687f83c3b06b36b4870d4f21b6811015b458b 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -45,6 +45,9 @@ class WalletOptions extends StatelessWidget { final isAlone = myWalletProvider.listWallets.length == 1; + final defaultWallet = myWalletProvider.getDefaultWallet(); + walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id[1]); + return PopScope( onPopInvokedWithResult: (_, __) { walletOptions.isEditing = false; @@ -73,17 +76,47 @@ class WalletOptions extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - ScaledSizedBox(height: 24), + // ScaledSizedBox(height: 16), Consumer<WalletOptionsProvider>( builder: (context, walletProvider, _) { return Column( crossAxisAlignment: CrossAxisAlignment.stretch, + spacing: 8, children: [ buildConfirmIdentitySection(walletProvider), if (wallet.hasIdentity) buildRenewMembershipSection(walletProvider), buildOptionsSection(context, walletProvider, historyProvider), if (!isAlone) buildDefaultWalletSection(context, walletProvider, myWalletProvider, walletOptions, currentChest), - buildDangerZone(context, walletProvider, currentChest), + if (!wallet.hasIdentity) + InkWell( + key: keyRenameWallet, + onTap: () async { + await walletProvider.editWalletName(context, [wallet.id[0], wallet.id[1]]); + }, + child: Container( + height: scaleSize(48), + padding: EdgeInsets.symmetric(horizontal: scaleSize(17)), + child: Row( + children: [ + Image.asset( + 'assets/walletOptions/edit.png', + height: scaleSize(22), + color: const Color(0xFF4A90E2).withValues(alpha: 0.8), + ), + ScaledSizedBox(width: 18), + Text( + "editWalletName".tr(), + style: scaledTextStyle( + fontSize: 16, + color: Colors.black87, + ), + ), + ], + ), + ), + ), + if (!walletProvider.isDefaultWallet && !wallet.hasIdentity) deleteWallet(context, walletProvider, currentChest), + if (wallet.hasIdentity) const ManageMembershipButton(), if (isAlone) aloneWalletOptions(), ], ); @@ -319,25 +352,19 @@ class WalletOptions extends StatelessWidget { } Widget buildOptionsSection(BuildContext context, WalletOptionsProvider walletProvider, WalletsProfilesProvider historyProvider) { - return Column( - children: [ - activityWidget(context, historyProvider, walletProvider), - ScaledSizedBox(height: 4), - ], - ); + return activityWidget(context, historyProvider, walletProvider); } Widget buildDefaultWalletSection( BuildContext context, WalletOptionsProvider walletProvider, MyWalletsProvider myWalletProvider, WalletOptionsProvider walletOptions, int currentChest) { return Consumer<MyWalletsProvider>( builder: (context, myWalletProvider, _) { - WalletData defaultWallet = myWalletProvider.getDefaultWallet(); - walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id[1]); return InkWell( key: keySetDefaultWallet, onTap: !walletProvider.isDefaultWallet ? () async { await setDefaultWallet(context, currentChest); + walletProvider.isDefaultWallet = true; } : null, child: Container( @@ -366,29 +393,15 @@ class WalletOptions extends StatelessWidget { ); } - Widget buildDangerZone(BuildContext context, WalletOptionsProvider walletProvider, int currentChest) { - return Container( - margin: EdgeInsets.symmetric(vertical: scaleSize(8)), - child: Column( - children: [ - if (!walletProvider.isDefaultWallet && !wallet.hasIdentity) deleteWallet(context, walletProvider, currentChest), - if (wallet.hasIdentity) const ManageMembershipButton(), - ], - ), - ); - } - Widget buildConfirmIdentitySection(WalletOptionsProvider walletProvider) { return Consumer<SubstrateSdk>(builder: (context, sub, _) { return FutureBuilder( future: sub.idtyStatusMulti([walletProvider.address.text]), initialData: const [IdtyStatus.unknown], builder: (BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) { - if (!snapshot.hasData || snapshot.hasError) { - return const SizedBox.shrink(); - } - if (snapshot.data!.first == IdtyStatus.unconfirmed) { - return Column(children: [ + return Visibility( + visible: snapshot.hasData && !snapshot.hasError && snapshot.data!.first == IdtyStatus.unconfirmed, + child: Column(children: [ SizedBox( width: double.infinity, height: scaleSize(50), @@ -418,9 +431,8 @@ class WalletOptions extends StatelessWidget { ), ), ScaledSizedBox(height: 24), - ]); - } - return const SizedBox.shrink(); + ]), + ); }, ); }); diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index a3f21378369a6628d1c11a461ad53a8ea1b97ab9..208c4facb33ed145c3cc49eb1166c6f2e9e3a307 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -30,6 +30,114 @@ class OnboardingStepFive extends StatefulWidget { // ignore: unused_element class _ChooseChestState extends State<OnboardingStepFive> { + List<String>? mnemonicList; + bool isLoading = false; + + @override + void initState() { + super.initState(); + _generateMnemonicList(); + } + + Future<void> _generateMnemonicList() async { + final generateWalletProvider = Provider.of<GenerateWalletsProvider>(context, listen: false); + final list = await generateWalletProvider.generateWordList(context); + if (mounted) { + setState(() { + mnemonicList = list.cast<String>(); + isLoading = false; + }); + } + } + + Future<void> _regenerateMnemonic() async { + setState(() { + isLoading = true; + }); + await _generateMnemonicList(); + } + + Widget sentanceArray() { + if (mnemonicList == null) { + return const Center( + child: CircularProgressIndicator( + color: orangeC, + strokeWidth: 2, + ), + ); + } + + return Container( + constraints: BoxConstraints(maxWidth: scaleSize(360)), + decoration: BoxDecoration( + border: Border.all(color: Colors.black), + color: const Color(0xffeeeedd), + borderRadius: const BorderRadius.all( + Radius.circular(10), + ), + ), + padding: EdgeInsets.all(scaleSize(14)), + child: Stack( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + children: <Widget>[ + Row(children: <Widget>[ + arrayCell(mnemonicList![0]), + arrayCell(mnemonicList![1]), + arrayCell(mnemonicList![2]), + arrayCell(mnemonicList![3]), + ]), + ScaledSizedBox(height: 15), + Row(children: <Widget>[ + arrayCell(mnemonicList![4]), + arrayCell(mnemonicList![5]), + arrayCell(mnemonicList![6]), + arrayCell(mnemonicList![7]), + ]), + ScaledSizedBox(height: 15), + Row(children: <Widget>[ + arrayCell(mnemonicList![8]), + arrayCell(mnemonicList![9]), + arrayCell(mnemonicList![10]), + arrayCell(mnemonicList![11]), + ]), + ], + ), + if (isLoading) + Container( + color: const Color(0xffeeeedd).withValues(alpha: 0.7), + child: const Center( + child: CircularProgressIndicator( + color: orangeC, + strokeWidth: 2, + ), + ), + ), + ], + ), + ); + } + + Widget arrayCell(String dataWord) { + return ScaledSizedBox( + width: 82, + child: Column(children: <Widget>[ + Text( + dataWord.split(':')[0], + style: scaledTextStyle(fontSize: 10, color: const Color(0xff6b6b52)), + ), + Text( + dataWord.split(':')[1], + key: keyMnemonicWord(dataWord.split(':')[0]), + style: scaledTextStyle(fontSize: 15, color: Colors.black), + ), + ]), + ); + } + @override Widget build(BuildContext context) { final generateWalletProvider = Provider.of<GenerateWalletsProvider>(context, listen: false); @@ -45,7 +153,7 @@ class _ChooseChestState extends State<OnboardingStepFive> { ScaledSizedBox(height: isTall ? 25 : 5), BuildText(text: 'geckoGeneratedYourMnemonicKeepItSecret'.tr()), ScaledSizedBox(height: isTall ? 15 : 5), - sentanceArray(context), + sentanceArray(), ScaledSizedBox(height: isTall ? 17 : 5), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -117,7 +225,7 @@ class _ChooseChestState extends State<OnboardingStepFive> { shadowColor: const Color(0xffFFD58D).withValues(alpha: 0.3), ), onPressed: () { - setState(() {}); + _regenerateMnemonic(); }, child: FittedBox( fit: BoxFit.scaleDown, @@ -145,73 +253,6 @@ class _ChooseChestState extends State<OnboardingStepFive> { } } -Widget sentanceArray(BuildContext context) { - final generateWalletProvider = Provider.of<GenerateWalletsProvider>(context, listen: false); - - return Container( - constraints: BoxConstraints(maxWidth: scaleSize(isTall ? 355 : 340)), - decoration: BoxDecoration( - border: Border.all(color: Colors.black), - color: const Color(0xffeeeedd), - borderRadius: const BorderRadius.all( - Radius.circular(10), - )), - padding: EdgeInsets.all(scaleSize(11)), - child: FutureBuilder( - future: generateWalletProvider.generateWordList(context), - builder: (BuildContext context, AsyncSnapshot<List> mnemoListData) { - if (!mnemoListData.hasData) { - return const Text(''); - } else { - final mnemoList = mnemoListData.data!; - return Column( - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - crossAxisAlignment: CrossAxisAlignment.center, - children: <Widget>[ - Row(children: <Widget>[ - arrayCell(mnemoList[0]), - arrayCell(mnemoList[1]), - arrayCell(mnemoList[2]), - arrayCell(mnemoList[3]), - ]), - ScaledSizedBox(height: 12), - Row(children: <Widget>[ - arrayCell(mnemoList[4]), - arrayCell(mnemoList[5]), - arrayCell(mnemoList[6]), - arrayCell(mnemoList[7]), - ]), - ScaledSizedBox(height: 12), - Row(children: <Widget>[ - arrayCell(mnemoList[8]), - arrayCell(mnemoList[9]), - arrayCell(mnemoList[10]), - arrayCell(mnemoList[11]), - ]), - ]); - } - }), - ); -} - -Widget arrayCell(dataWord) { - return ScaledSizedBox( - width: scaleSize(isTall ? 78 : 91), - child: Column(children: <Widget>[ - Text( - dataWord.split(':')[0], - style: scaledTextStyle(fontSize: 11, color: const Color(0xff6b6b52)), - ), - Text( - dataWord.split(':')[1], - key: keyMnemonicWord(dataWord.split(':')[0]), - style: scaledTextStyle(fontSize: 15, color: Colors.black), - ), - ]), - ); -} - Widget nextButton(BuildContext context, String text, bool isFast, bool skipIntro) { final generateWalletProvider = Provider.of<GenerateWalletsProvider>(context, listen: false); final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); diff --git a/lib/widgets/idty_status.dart b/lib/widgets/idty_status.dart index 73b93dc2f8b42839acdafc3c4afd814dc4f08ebe..a9fda4baa9c94623b3d3676c74a708f96ad3b751 100644 --- a/lib/widgets/idty_status.dart +++ b/lib/widgets/idty_status.dart @@ -9,9 +9,8 @@ import 'package:gecko/widgets/name_by_address.dart'; import 'package:provider/provider.dart'; class IdentityStatus extends StatelessWidget { - const IdentityStatus({super.key, required this.address, this.isOwner = false, this.color = Colors.black}); + const IdentityStatus({super.key, required this.address, this.color = Colors.black}); final String address; - final bool isOwner; final Color color; @override diff --git a/lib/widgets/wallet_header.dart b/lib/widgets/wallet_header.dart index 5e301cea243ce5f1f17250447a186334ebbf3188..83d35a0cb7c17a3458ea25c987230ec5a9d35a5c 100644 --- a/lib/widgets/wallet_header.dart +++ b/lib/widgets/wallet_header.dart @@ -6,6 +6,7 @@ import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/duniter_indexer.dart'; +import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/screens/certifications.dart'; @@ -16,6 +17,7 @@ import 'package:gecko/widgets/datapod_avatar.dart'; import 'package:gecko/widgets/idty_status.dart'; import 'package:gecko/widgets/page_route_no_transition.dart'; import 'package:provider/provider.dart'; +import 'package:gecko/providers/wallet_options.dart'; class WalletHeader extends StatelessWidget { const WalletHeader({ @@ -34,12 +36,18 @@ class WalletHeader extends StatelessWidget { const double avatarSize = 90; final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); final sub = Provider.of<SubstrateSdk>(context, listen: false); + final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false); + + final isOwner = myWalletProvider.isOwner(address); + bool isPickerOpen = false; + String newCustomImagePath = ''; return Container( color: headerColor, - padding: EdgeInsets.symmetric( - horizontal: scaleSize(16), - vertical: scaleSize(16), + padding: EdgeInsets.only( + left: scaleSize(16), + right: scaleSize(16), + bottom: scaleSize(16), ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, @@ -59,21 +67,80 @@ class WalletHeader extends StatelessWidget { ), ], ), - child: ClipOval( - child: customImagePath == null || customImagePath == '' - ? (defaultImagePath != null - ? Image.asset( - 'assets/avatars/$defaultImagePath', - fit: BoxFit.cover, - ) - : DatapodAvatar( - address: address, - size: avatarSize, - )) - : Image.file( - File(customImagePath!), - fit: BoxFit.cover, + child: Consumer<WalletOptionsProvider>( + builder: (context, walletOptionsProvider, child) { + if (newCustomImagePath.isEmpty) { + newCustomImagePath = customImagePath ?? ''; + } + return Stack( + children: [ + Material( + color: Colors.transparent, + child: InkWell( + onTap: isOwner && !isPickerOpen + ? () async { + isPickerOpen = true; + walletOptionsProvider.reload(); + newCustomImagePath = await walletOptionsProvider.changeAvatar(); + isPickerOpen = false; + walletOptionsProvider.reload(); + } + : null, + customBorder: const CircleBorder(), + child: ClipOval( + child: newCustomImagePath.isEmpty + ? (defaultImagePath != null + ? Image.asset( + 'assets/avatars/$defaultImagePath', + fit: BoxFit.cover, + ) + : DatapodAvatar( + address: address, + size: avatarSize, + )) + : Image.file( + File(newCustomImagePath), + fit: BoxFit.cover, + ), + ), + ), ), + if (isOwner) + Positioned( + right: 0, + bottom: 0, + child: Container( + width: avatarSize * 0.35, + height: avatarSize * 0.35, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black.withValues(alpha: 0.4), + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: !isPickerOpen + ? () async { + isPickerOpen = true; + walletOptionsProvider.reload(); + newCustomImagePath = await walletOptionsProvider.changeAvatar(); + isPickerOpen = false; + walletOptionsProvider.reload(); + } + : null, + customBorder: const CircleBorder(), + child: Icon( + Icons.camera_alt, + color: Colors.white, + size: avatarSize * 0.2, + ), + ), + ), + ), + ), + ], + ); + }, ), ), SizedBox(width: scaleSize(20)), @@ -150,7 +217,6 @@ class WalletHeader extends StatelessWidget { children: [ IdentityStatus( address: address, - isOwner: false, color: orangeC, ), SizedBox(width: scaleSize(8)), diff --git a/lib/widgets/wallet_tile.dart b/lib/widgets/wallet_tile.dart index c6fab84f5a4677e4ac447c1cc7b7f319fddf2aab..4340ce249c5aa4f82ce656447ffcb0988e2370e6 100644 --- a/lib/widgets/wallet_tile.dart +++ b/lib/widgets/wallet_tile.dart @@ -87,7 +87,7 @@ class WalletTile extends StatelessWidget { decoration: BoxDecoration( shape: BoxShape.circle, image: DecorationImage( - fit: BoxFit.cover, + fit: BoxFit.fitHeight, image: FileImage( File(repository.imageCustomPath!), ), diff --git a/lib/widgets/wallet_tile_membre.dart b/lib/widgets/wallet_tile_membre.dart index 5ebbda9582b3f78b17bbe6526186b3b28d14f353..7e9f7e1affd69567265ee4203a88a2f56caf6987 100644 --- a/lib/widgets/wallet_tile_membre.dart +++ b/lib/widgets/wallet_tile_membre.dart @@ -88,7 +88,7 @@ class WalletTileMembre extends StatelessWidget { decoration: BoxDecoration( shape: BoxShape.circle, image: DecorationImage( - fit: BoxFit.cover, + fit: BoxFit.fitHeight, image: FileImage( File(wallet.imageCustomPath!), ), diff --git a/pubspec.yaml b/pubspec.yaml index 4b039d05b17c2885c981c600c4f5bc0d71c0e612..902fa6e6fb6cba00dc6dc91cf23c853b9206efd7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: gecko description: Pay with G1. publish_to: "none" -version: 0.1.20+92 +version: 0.1.21+93 environment: sdk: ^3.5.3