From bd87ea5ab81942b33f7906c7541b607601915941 Mon Sep 17 00:00:00 2001 From: poka <poka@p2p.legal> Date: Tue, 30 Nov 2021 01:25:48 +0100 Subject: [PATCH] Optimize profile view --- assets/walletOptions/trash.png | Bin 14276 -> 14516 bytes lib/main.dart | 4 +- lib/models/g1_wallets_list.dart | 6 +- lib/models/g1_wallets_list.g.dart | 13 +- lib/models/home.dart | 2 +- lib/models/search.dart | 7 +- .../{history.dart => wallets_profiles.dart} | 50 ++-- lib/screens/avatar_fullscreen.dart | 11 +- lib/screens/home.dart | 5 +- .../myWallets/cesium_wallet_options.dart | 17 +- lib/screens/myWallets/unlocking_wallet.dart | 5 +- lib/screens/myWallets/wallet_options.dart | 33 ++- .../{history.dart => old_history_pay.dart} | 36 ++- lib/screens/search_result.dart | 204 +++++++------ lib/screens/wallet_view.dart | 278 ++++++++++++------ pubspec.yaml | 2 +- 16 files changed, 420 insertions(+), 253 deletions(-) rename lib/models/{history.dart => wallets_profiles.dart} (92%) rename lib/screens/{history.dart => old_history_pay.dart} (93%) diff --git a/assets/walletOptions/trash.png b/assets/walletOptions/trash.png index 2d008a034bf97e0244c6f4210ed4bab49c1c70ff..e2c1cbc3b48ac396404355b9a97e587c58b7637e 100644 GIT binary patch literal 14516 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 N`r0O1wHhw*{{ym&(lh`7 literal 14276 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 diff --git a/lib/main.dart b/lib/main.dart index 585f1cd3..053d46ac 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -25,7 +25,7 @@ import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_provider.dart'; import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/generate_wallets.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:gecko/models/home.dart'; import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/search.dart'; @@ -139,7 +139,7 @@ class Gecko extends StatelessWidget { providers: [ // Provider(create: (context) => HistoryProvider()), ChangeNotifierProvider(create: (_) => HomeProvider()), - ChangeNotifierProvider(create: (_) => HistoryProvider('')), + ChangeNotifierProvider(create: (_) => WalletsProfilesProvider('')), ChangeNotifierProvider(create: (_) => MyWalletsProvider()), ChangeNotifierProvider(create: (_) => ChestProvider()), ChangeNotifierProvider(create: (_) => GenerateWalletsProvider()), diff --git a/lib/models/g1_wallets_list.dart b/lib/models/g1_wallets_list.dart index 286e98e4..2457f9f9 100644 --- a/lib/models/g1_wallets_list.dart +++ b/lib/models/g1_wallets_list.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:hive_flutter/hive_flutter.dart'; part 'g1_wallets_list.g.dart'; @@ -13,7 +14,10 @@ class G1WalletsList { @HiveField(3) Id id; - G1WalletsList({this.pubkey, this.balance, this.id}); + @HiveField(4) + Image avatar; + + G1WalletsList({this.pubkey, this.balance, this.id, this.avatar}); G1WalletsList.fromJson(Map<String, dynamic> json) { pubkey = json['pubkey']; diff --git a/lib/models/g1_wallets_list.g.dart b/lib/models/g1_wallets_list.g.dart index 31b83c65..b729a6de 100644 --- a/lib/models/g1_wallets_list.g.dart +++ b/lib/models/g1_wallets_list.g.dart @@ -1,5 +1,7 @@ // GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: unused_local_variable + part of 'g1_wallets_list.dart'; // ************************************************************************** @@ -20,19 +22,22 @@ class G1WalletsListAdapter extends TypeAdapter<G1WalletsList> { pubkey: fields[0] as String, balance: fields[1] as double, id: fields[3] as Id, + avatar: fields[4] as Image, ); } @override void write(BinaryWriter writer, G1WalletsList obj) { writer - ..writeByte(3) + ..writeByte(4) ..writeByte(0) ..write(obj.pubkey) ..writeByte(1) ..write(obj.balance) ..writeByte(3) - ..write(obj.id); + ..write(obj.id) + ..writeByte(4) + ..write(obj.avatar); } @override @@ -52,6 +57,10 @@ class IdAdapter extends TypeAdapter<Id> { @override Id read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = <int, dynamic>{ + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; return Id(); } diff --git a/lib/models/home.dart b/lib/models/home.dart index 1d8aacb4..f8b99eb6 100644 --- a/lib/models/home.dart +++ b/lib/models/home.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'dart:async'; import 'package:gecko/globals.dart'; -import 'package:gecko/screens/history.dart'; +import 'package:gecko/screens/old_history_pay.dart'; import 'package:gecko/screens/myWallets/wallets_home.dart'; import 'package:package_info/package_info.dart'; diff --git a/lib/models/search.dart b/lib/models/search.dart index 67429663..7fa86731 100644 --- a/lib/models/search.dart +++ b/lib/models/search.dart @@ -19,14 +19,17 @@ class SearchProvider with ChangeNotifier { searchResult.clear(); int searchTime = DateTime.now().millisecondsSinceEpoch; - if (cacheTime + cacheDuring <= searchTime) { + if (cacheTime + 0 <= searchTime) { g1WalletsBox.clear(); final url = Uri.parse('https://g1-stats.axiom-team.fr/data/forbes.json'); final response = await http.get(url); List<G1WalletsList> _listWallets = _parseG1Wallets(response.body); + Map<String, G1WalletsList> _mapWallets = { + for (var e in _listWallets) e.pubkey: e + }; - await g1WalletsBox.addAll(_listWallets); + await g1WalletsBox.putAll(_mapWallets); cacheTime = DateTime.now().millisecondsSinceEpoch; } diff --git a/lib/models/history.dart b/lib/models/wallets_profiles.dart similarity index 92% rename from lib/models/history.dart rename to lib/models/wallets_profiles.dart index b72d22b3..62a0dfc2 100644 --- a/lib/models/history.dart +++ b/lib/models/wallets_profiles.dart @@ -15,10 +15,11 @@ import 'package:truncate/truncate.dart'; import 'package:crypto/crypto.dart'; import 'package:fast_base58/fast_base58.dart'; -class HistoryProvider with ChangeNotifier { +class WalletsProfilesProvider with ChangeNotifier { + WalletsProfilesProvider(this.pubkey); + String pubkey = ''; String pubkeyShort = ''; - HistoryProvider(this.pubkey); final TextEditingController outputPubkey = TextEditingController(); List transBC; String fetchMoreCursor; @@ -38,9 +39,14 @@ class HistoryProvider with ChangeNotifier { log.e(e); return 'false'; } - if (barcode != null) { + if (barcode != null && isPubkey(context, barcode)) { outputPubkey.text = barcode; - isPubkey(context, barcode); + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const WalletViewScreen(); + }), + ); } else { return 'false'; } @@ -71,7 +77,7 @@ class HistoryProvider with ChangeNotifier { } } - String isPubkey(context, pubkey, {bool goHistory}) { + bool isPubkey(context, pubkey) { final RegExp regExp = RegExp( r'^[a-zA-Z0-9]+$', caseSensitive: false, @@ -84,32 +90,22 @@ class HistoryProvider with ChangeNotifier { log.d("C'est une pubkey !"); this.pubkey = pubkey; - getShortPubkey(pubkey); - - outputPubkey.text = pubkey; + // getShortPubkey(pubkey); - goHistory ??= false; + // outputPubkey.text = pubkey; - if (goHistory) { - isHistoryScreen = true; - historySwitchButtun = "Payer"; - } else { - isHistoryScreen = false; - historySwitchButtun = "Voir l'historique"; - } + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) { + // return const WalletViewScreen(); + // }), + // ); + // notifyListeners(); - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return WalletViewScreen(); - }), - ); - notifyListeners(); - - return pubkey; + return true; + } else { + return false; } - - return ''; } String getShortPubkey(String pubkey) { diff --git a/lib/screens/avatar_fullscreen.dart b/lib/screens/avatar_fullscreen.dart index d7f5cede..3389e957 100644 --- a/lib/screens/avatar_fullscreen.dart +++ b/lib/screens/avatar_fullscreen.dart @@ -8,8 +8,11 @@ import 'package:flutter/material.dart'; class AvatarFullscreen extends StatelessWidget { TextEditingController tplController = TextEditingController(); - AvatarFullscreen(this.avatar, {Key key}) : super(key: key); + AvatarFullscreen(this.avatar, {this.title, this.color, Key key}) + : super(key: key); final Image avatar; + final String title; + final Color color; @override Widget build(BuildContext context) { @@ -18,7 +21,7 @@ class AvatarFullscreen extends StatelessWidget { return Scaffold( appBar: AppBar( elevation: 0, - backgroundColor: Colors.black, + backgroundColor: color ?? Colors.black, toolbarHeight: 60 * ratio, leading: IconButton( icon: Icon(Icons.arrow_back, color: orangeC), @@ -28,14 +31,14 @@ class AvatarFullscreen extends StatelessWidget { title: SizedBox( height: 22, child: Text( - 'Photo de profil', + title ?? 'Photo de profil', style: TextStyle(color: orangeC), ), )), body: SafeArea( child: SizedBox.expand( child: Container( - color: Colors.black, + color: color ?? Colors.black, // alignment: Alignment.center, // height: MediaQuery.of(context).size.height, // width: MediaQuery.of(context).size.width, diff --git a/lib/screens/home.dart b/lib/screens/home.dart index eff093ff..da1f1eb7 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -2,7 +2,7 @@ import 'package:bubble/bubble.dart'; import 'package:dubp/dubp.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_provider.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/home.dart'; import 'package:gecko/models/my_wallets.dart'; @@ -123,7 +123,8 @@ Widget geckHome(context) { MyWalletsProvider _myWalletProvider = Provider.of<MyWalletsProvider>(context); Provider.of<ChestProvider>(context); - HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); + WalletsProfilesProvider _historyProvider = + Provider.of<WalletsProfilesProvider>(context); final double statusBarHeight = MediaQuery.of(context).padding.top; return Container( decoration: const BoxDecoration( diff --git a/lib/screens/myWallets/cesium_wallet_options.dart b/lib/screens/myWallets/cesium_wallet_options.dart index 115c318f..42a14aa5 100644 --- a/lib/screens/myWallets/cesium_wallet_options.dart +++ b/lib/screens/myWallets/cesium_wallet_options.dart @@ -5,11 +5,12 @@ import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_provider.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/queries.dart'; import 'package:gecko/models/wallet_options.dart'; import 'package:gecko/screens/myWallets/change_pin.dart'; +import 'package:gecko/screens/wallet_view.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; import 'package:flutter/services.dart'; @@ -24,7 +25,8 @@ Widget cesiumWalletOptions(BuildContext context, ChestData cesiumWallet, Provider.of<WalletOptionsProvider>(context); ChestProvider _chestProvider = Provider.of<ChestProvider>(context, listen: false); - HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); + WalletsProfilesProvider _historyProvider = + Provider.of<WalletsProfilesProvider>(context); final String shortPubkey = _walletOptions.getShortPubkey(_walletOptions.pubkey.text); @@ -283,8 +285,15 @@ Widget cesiumWalletOptions(BuildContext context, ChestData cesiumWallet, InkWell( key: const Key('displayHistory'), onTap: () { - _historyProvider.isPubkey(ctx, _walletOptions.pubkey.text, - goHistory: true); + if (_historyProvider.isPubkey( + context, _walletOptions.pubkey.text)) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const WalletViewScreen(); + }), + ); + } }, child: SizedBox( height: 50, diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 0be8fa1d..56b97523 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:dubp/dubp.dart'; import 'package:flutter/services.dart'; import 'package:gecko/models/chest_data.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_options.dart'; @@ -124,7 +124,8 @@ class UnlockingWallet extends StatelessWidget { Provider.of<WalletOptionsProvider>(context); MyWalletsProvider _myWalletProvider = Provider.of<MyWalletsProvider>(context); - HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); + WalletsProfilesProvider _historyProvider = + Provider.of<WalletsProfilesProvider>(context); FocusNode pinFocus = FocusNode(); diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 8f049f2a..27c69b66 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -3,11 +3,12 @@ import 'dart:ui'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/queries.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_options.dart'; +import 'package:gecko/screens/wallet_view.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; import 'package:flutter/services.dart'; @@ -27,7 +28,8 @@ class WalletOptions extends StatelessWidget { Provider.of<WalletOptionsProvider>(context); MyWalletsProvider _myWalletProvider = Provider.of<MyWalletsProvider>(context); - HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); + WalletsProfilesProvider _historyProvider = + Provider.of<WalletsProfilesProvider>(context); final int _currentChest = _myWalletProvider.getCurrentChest(); final String shortPubkey = @@ -263,14 +265,14 @@ class WalletOptions extends StatelessWidget { ])), SizedBox(height: 4 * ratio), FutureBuilder( - future: - _walletOptions.generateQRcode(_walletOptions.pubkey.text), - builder: (context, snapshot) { - return snapshot.data != null - ? Image.memory(snapshot.data, - height: isTall ? 300 : 270) - : const Text('-', style: TextStyle(fontSize: 20)); - }), + future: + _walletOptions.generateQRcode(_walletOptions.pubkey.text), + builder: (context, snapshot) { + return snapshot.data != null + ? Image.memory(snapshot.data, height: isTall ? 300 : 270) + : const Text('-', style: TextStyle(fontSize: 20)); + }, + ), SizedBox(height: 15 * ratio), GestureDetector( key: const Key('copyPubkey'), @@ -337,8 +339,15 @@ class WalletOptions extends StatelessWidget { InkWell( key: const Key('displayHistory'), onTap: () { - _historyProvider.isPubkey(ctx, _walletOptions.pubkey.text, - goHistory: true); + if (_historyProvider.isPubkey( + context, _walletOptions.pubkey.text)) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const WalletViewScreen(); + }), + ); + } }, child: SizedBox( height: 50, diff --git a/lib/screens/history.dart b/lib/screens/old_history_pay.dart similarity index 93% rename from lib/screens/history.dart rename to lib/screens/old_history_pay.dart index 21fe283e..581251ed 100644 --- a/lib/screens/history.dart +++ b/lib/screens/old_history_pay.dart @@ -4,11 +4,12 @@ import 'package:gecko/models/cesium_plus.dart'; import 'package:gecko/models/home.dart'; import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/queries.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:flutter/material.dart'; import 'package:flutter/foundation.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; +import 'package:gecko/screens/wallet_view.dart'; import 'dart:ui'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; @@ -33,7 +34,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); + WalletsProfilesProvider _historyProvider = + Provider.of<WalletsProfilesProvider>(context); HomeProvider _homeProvider = Provider.of<HomeProvider>(context); _outputPubkey.text = _historyProvider.pubkey; log.i('Build pubkey : ' + _historyProvider.pubkey); @@ -61,10 +63,14 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { controller: _homeProvider.searchQuery, onChanged: (text) { log.d("Clé tappé: $text"); - final String searchResult = - _historyProvider.isPubkey(context, text); - if (searchResult != '') { + if (_historyProvider.isPubkey(context, text)) { _homeProvider.currentIndex = 0; + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const WalletViewScreen(); + }), + ); } }, style: TextStyle( @@ -111,7 +117,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { ])); } - Widget historyQuery(context, HistoryProvider _historyProvider) { + Widget historyQuery(context, WalletsProfilesProvider _historyProvider) { _pubkeyFocus.unfocus(); // HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); CesiumPlusProvider _cesiumPlusProvider = @@ -327,7 +333,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { )); } - Widget payView(context, HistoryProvider _historyProvider) { + Widget payView(context, WalletsProfilesProvider _historyProvider) { MyWalletsProvider _myWalletProvider = MyWalletsProvider(); WalletData defaultWallet = _myWalletProvider.getDefaultWallet(configBox.get('currentChest')); @@ -407,7 +413,10 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { } Widget historyView(context, result) { - HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); + WalletsProfilesProvider _historyProvider = + Provider.of<WalletsProfilesProvider>(context); + HomeProvider _homeProvider = + Provider.of<HomeProvider>(context, listen: false); int keyID = 0; return _historyProvider.transBC == null @@ -438,8 +447,15 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { dense: true, isThreeLine: false, onTap: () { - // this._outputPubkey.text = repository[2]; - _historyProvider.isPubkey(context, repository[2]); + if (_historyProvider.isPubkey(context, repository[2])) { + _homeProvider.currentIndex = 0; + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const WalletViewScreen(); + }), + ); + } Navigator.pop(context); }), ), diff --git a/lib/screens/search_result.dart b/lib/screens/search_result.dart index 1f09f52d..0fc216eb 100644 --- a/lib/screens/search_result.dart +++ b/lib/screens/search_result.dart @@ -3,8 +3,9 @@ import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/cesium_plus.dart'; import 'package:gecko/models/g1_wallets_list.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:gecko/models/search.dart'; +import 'package:gecko/screens/wallet_view.dart'; import 'package:provider/provider.dart'; class SearchResultScreen extends StatelessWidget { @@ -16,8 +17,8 @@ class SearchResultScreen extends StatelessWidget { SearchProvider _searchProvider = Provider.of<SearchProvider>(context); CesiumPlusProvider _cesiumPlusProvider = Provider.of<CesiumPlusProvider>(context); - HistoryProvider _historyClass = - Provider.of<HistoryProvider>(context, listen: false); + WalletsProfilesProvider _walletsProfilesClass = + Provider.of<WalletsProfilesProvider>(context, listen: false); int keyID = 0; double _avatarSize = 55; @@ -33,48 +34,55 @@ class SearchResultScreen extends StatelessWidget { body: SafeArea( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: <Widget>[ - const SizedBox(height: 30), - RichText( - text: TextSpan( - style: TextStyle( - fontSize: 18, - color: Colors.grey[700], - ), - children: <TextSpan>[ - const TextSpan( - text: "Résultats pour ", - ), - TextSpan( - text: '"${_searchProvider.searchController.text}"', - style: const TextStyle(fontStyle: FontStyle.italic), - ), - ], - ), - ), - const SizedBox(height: 40), - const Text( - 'Dans la blockchain Ğ1', - style: TextStyle(fontSize: 20), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: < + Widget>[ + const SizedBox(height: 30), + RichText( + text: TextSpan( + style: TextStyle( + fontSize: 18, + color: Colors.grey[700], ), - const SizedBox(height: 20), - FutureBuilder( - future: _searchProvider.searchBlockchain(), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - return Expanded( - child: ListView(children: <Widget>[ - for (G1WalletsList g1Wallet in snapshot.data) - Padding( - padding: - const EdgeInsets.symmetric(horizontal: 5), - child: ListTile( - key: Key('searchResult${keyID++}'), - horizontalTitleGap: 40, - contentPadding: const EdgeInsets.all(5), - leading: FutureBuilder( + children: <TextSpan>[ + const TextSpan( + text: "Résultats pour ", + ), + TextSpan( + text: '"${_searchProvider.searchController.text}"', + style: const TextStyle(fontStyle: FontStyle.italic), + ), + ], + ), + ), + const SizedBox(height: 40), + const Text( + 'Dans la blockchain Ğ1', + style: TextStyle(fontSize: 20), + ), + const SizedBox(height: 20), + FutureBuilder( + future: _searchProvider.searchBlockchain(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + return Expanded( + child: ListView(children: <Widget>[ + for (G1WalletsList g1Wallet in snapshot.data) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 5), + child: ListTile( + key: Key('searchResult${keyID++}'), + horizontalTitleGap: 40, + contentPadding: const EdgeInsets.all(5), + leading: g1WalletsBox + .get(g1Wallet.pubkey) + .avatar != + null + ? ClipOval( + child: g1WalletsBox + .get(g1Wallet.pubkey) + .avatar) + : FutureBuilder( future: _cesiumPlusProvider.getAvatar( g1Wallet.pubkey, _avatarSize), builder: (BuildContext context, @@ -98,52 +106,76 @@ class SearchResultScreen extends StatelessWidget { ]); } if (_avatar.hasData) { + g1WalletsBox + .get(g1Wallet.pubkey) + .avatar = _avatar.data; return ClipOval(child: _avatar.data); + } else { + g1WalletsBox + .get(g1Wallet.pubkey) + .avatar = + _cesiumPlusProvider + .defaultAvatar(_avatarSize); + return _cesiumPlusProvider + .defaultAvatar(_avatarSize); } - return _cesiumPlusProvider - .defaultAvatar(_avatarSize); }), - title: Row(children: <Widget>[ - Text( - _historyClass - .getShortPubkey(g1Wallet.pubkey), - style: const TextStyle( - fontSize: 18, - fontFamily: 'Monospace', - fontWeight: FontWeight.w500), - textAlign: TextAlign.center), - ]), - subtitle: Row(children: <Widget>[ - Text(g1Wallet?.id?.username ?? '', - style: const TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500), - textAlign: TextAlign.center), - ]), - dense: false, - isThreeLine: false, - onTap: () { - _historyClass.isPubkey( - context, g1Wallet.pubkey); + title: Row(children: <Widget>[ + Text( + _walletsProfilesClass + .getShortPubkey(g1Wallet.pubkey), + style: const TextStyle( + fontSize: 18, + fontFamily: 'Monospace', + fontWeight: FontWeight.w500), + textAlign: TextAlign.center), + ]), + subtitle: Row(children: <Widget>[ + Text(g1Wallet?.id?.username ?? '', + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500), + textAlign: TextAlign.center), + ]), + dense: false, + isThreeLine: false, + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + _walletsProfilesClass.pubkey = + g1Wallet.pubkey; + return WalletViewScreen( + pubkey: g1Wallet.pubkey, + username: g1WalletsBox + .get(g1Wallet.pubkey) + .id + ?.username, + avatar: g1WalletsBox + .get(g1Wallet.pubkey) + ?.avatar, + ); }), - ), - ]), - ); - } - return Center( - heightFactor: 5, - child: CircularProgressIndicator( - strokeWidth: 3, - backgroundColor: yellowC, - color: orangeC, - ), - ); - }, - ), - // Text( - // _searchProvider.searchResult.toString(), - // ) - ]), + ); + }), + ), + ]), + ); + } + return Center( + heightFactor: 5, + child: CircularProgressIndicator( + strokeWidth: 3, + backgroundColor: yellowC, + color: orangeC, + ), + ); + }, + ), + // Text( + // _searchProvider.searchResult.toString(), + // ) + ]), ), ), ); diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 3aeefe57..a625d0e9 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -1,39 +1,68 @@ import 'dart:ui'; - import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/cesium_plus.dart'; -import 'package:gecko/models/history.dart'; +import 'package:gecko/models/wallets_profiles.dart'; import 'package:gecko/models/queries.dart'; +// import 'package:gecko/models/wallet_options.dart'; import 'package:gecko/screens/avatar_fullscreen.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; -// import 'package:gecko/models/home.dart'; -// import 'package:provider/provider.dart'; -// ignore: must_be_immutable class WalletViewScreen extends StatelessWidget { - TextEditingController tplController = TextEditingController(); - - WalletViewScreen({Key key}) : super(key: key); + const WalletViewScreen({this.pubkey, this.username, this.avatar, Key key}) + : super(key: key); + final String pubkey; + final String username; + final Image avatar; @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context); + WalletsProfilesProvider _historyProvider = + Provider.of<WalletsProfilesProvider>(context); CesiumPlusProvider _cesiumPlusProvider = Provider.of<CesiumPlusProvider>(context); + // WalletOptionsProvider _walletOptions = WalletOptionsProvider(); double _avatarSize = 150; return Scaffold( appBar: AppBar( - elevation: 0, - toolbarHeight: 60 * ratio, - title: const SizedBox( - height: 22, - child: Text('Voir un portefeuille'), - )), + elevation: 0, + toolbarHeight: 60 * ratio, + title: const SizedBox( + height: 22, + child: Text('Voir un portefeuille'), + ), + // actions: [ + // FutureBuilder( + // future: _walletOptions.generateQRcode(_historyProvider.pubkey), + // builder: (context, snapshot) { + // return snapshot.data != null + // ? GestureDetector( + // key: const Key('openAvatar'), + // onTap: () { + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) { + // return AvatarFullscreen( + // Image.memory(snapshot.data), + // title: 'QrCode du profil', + // ); + // }), + // ); + // // isAvatarView = !isAvatarView; + // // _historyProvider.resetdHistory(); + // }, + // child: Image.memory(snapshot.data, height: 40 * ratio), + // ) + // : const Text('-', style: TextStyle(fontSize: 20)); + // }, + // ), + // const SizedBox(width: 75) + // ], + ), body: SafeArea( child: Column(children: <Widget>[ Container( @@ -56,51 +85,62 @@ class WalletViewScreen extends StatelessWidget { Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ - GestureDetector( - key: const Key('copyPubkey'), - onTap: () { - Clipboard.setData( - ClipboardData(text: _historyProvider.pubkey)); - _historyProvider.snackCopyKey(context); - }, - child: Text( - _historyProvider - .getShortPubkey(_historyProvider.pubkey), - style: const TextStyle( - fontSize: 30, - fontWeight: FontWeight.w800, + Row(children: [ + GestureDetector( + key: const Key('copyPubkey'), + onTap: () { + Clipboard.setData(ClipboardData( + text: pubkey ?? _historyProvider.pubkey)); + _historyProvider.snackCopyKey(context); + }, + child: Text( + _historyProvider.getShortPubkey( + pubkey ?? _historyProvider.pubkey), + style: const TextStyle( + fontSize: 30, + fontWeight: FontWeight.w800, + ), ), ), - ), + ]), const SizedBox(height: 10), - Query( - options: QueryOptions( - document: gql(getId), - variables: { - 'pubkey': _historyProvider.pubkey, + if (username == null) + Query( + options: QueryOptions( + document: gql(getId), + variables: { + 'pubkey': _historyProvider.pubkey, + }, + ), + builder: (QueryResult result, + {VoidCallback refetch, FetchMore fetchMore}) { + if (result.isLoading || result.hasException) { + return const Text('...'); + } else if (result.data['idty'] == null || + result.data['idty']['username'] == null) { + return const Text(''); + } else { + return SizedBox( + width: 230, + child: Text( + result?.data['idty']['username'] ?? '', + style: const TextStyle( + fontSize: 27, + color: Color(0xff814C00), + ), + ), + ); + } }, ), - builder: (QueryResult result, - {VoidCallback refetch, FetchMore fetchMore}) { - if (result.isLoading || result.hasException) { - return const Text('...'); - } else if (result.data['idty'] == null || - result.data['idty']['username'] == null) { - return const Text(''); - } else { - return SizedBox( - width: 230, - child: Text( - result?.data['idty']['username'] ?? '', - style: const TextStyle( - fontSize: 27, - color: Color(0xff814C00), - ), - ), - ); - } - }, - ), + if (username != null) + Text( + username, + style: const TextStyle( + fontSize: 27, + color: Color(0xff814C00), + ), + ), const SizedBox(height: 25), FutureBuilder( future: _cesiumPlusProvider @@ -120,51 +160,72 @@ class WalletViewScreen extends StatelessWidget { ]), const Spacer(), Column(children: <Widget>[ - FutureBuilder( - future: _cesiumPlusProvider.getAvatar( - _historyProvider.pubkey, _avatarSize), - builder: (BuildContext context, - AsyncSnapshot<Image> _avatar) { - if (_avatar.connectionState != ConnectionState.done || - _avatar.hasError) { - return Stack(children: [ - ClipOval( - child: _cesiumPlusProvider - .defaultAvatar(_avatarSize), - ), - Positioned( - top: 16.5, - right: 47.5, - width: 55, - height: 55, - child: CircularProgressIndicator( - strokeWidth: 6, - color: orangeC, + if (avatar == null) + FutureBuilder( + future: _cesiumPlusProvider.getAvatar( + _historyProvider.pubkey, _avatarSize), + builder: (BuildContext context, + AsyncSnapshot<Image> _avatar) { + if (_avatar.connectionState != + ConnectionState.done || + _avatar.hasError) { + return Stack(children: [ + ClipOval( + child: _cesiumPlusProvider + .defaultAvatar(_avatarSize), ), - ), - ]); - } - if (_avatar.hasData) { - return GestureDetector( - key: const Key('openAvatar'), - onTap: () { - Navigator.push( - context, - MaterialPageRoute(builder: (context) { - return AvatarFullscreen(_avatar.data); - }), - ); - }, - child: ClipOval( - child: _avatar.data, - ), + Positioned( + top: 16.5, + right: 47.5, + width: 55, + height: 55, + child: CircularProgressIndicator( + strokeWidth: 6, + color: orangeC, + ), + ), + ]); + } + if (_avatar.hasData) { + return GestureDetector( + key: const Key('openAvatar'), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AvatarFullscreen(_avatar.data); + }), + ); + }, + child: ClipOval( + child: _avatar.data, + ), + ); + } + return ClipOval( + child: _cesiumPlusProvider + .defaultAvatar(_avatarSize), ); - } - return ClipOval( - child: - _cesiumPlusProvider.defaultAvatar(_avatarSize), + }), + if (avatar != null) + GestureDetector( + key: const Key('openAvatar'), + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return AvatarFullscreen(avatar); + }), ); - }), + }, + child: ClipOval( + child: Image( + image: avatar.image, + height: _avatarSize, + fit: BoxFit.cover, + ), + ), + ), const SizedBox(height: 25), ]), ]), @@ -230,6 +291,29 @@ class WalletViewScreen extends StatelessWidget { ), ]), ]), + // FutureBuilder( + // future: _walletOptions.generateQRcode(_historyProvider.pubkey), + // builder: (context, snapshot) { + // return snapshot.data != null + // ? GestureDetector( + // key: const Key('openQrcode'), + // onTap: () { + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) { + // return AvatarFullscreen( + // Image.memory(snapshot.data), + // title: 'QrCode du profil', + // color: Colors.white, + // ); + // }), + // ); + // }, + // child: Image.memory(snapshot.data, height: 60 * ratio), + // ) + // : const Text('-', style: TextStyle(fontSize: 20)); + // }, + // ), const Spacer(), Container( height: 120, diff --git a/pubspec.yaml b/pubspec.yaml index 45228623..249c17f3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: Pay with G1. # pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.3+8 +version: 0.0.3+9 environment: sdk: ">=2.7.0 <3.0.0" -- GitLab