diff --git a/assets/chests/secret_code.png b/assets/chests/secret_code.png old mode 100755 new mode 100644 index 10ef999..495717e Binary files a/assets/chests/secret_code.png and b/assets/chests/secret_code.png differ diff --git a/assets/chests/vector.png b/assets/chests/vector.png old mode 100755 new mode 100644 index 3fb42db..9eb11a7 Binary files a/assets/chests/vector.png and b/assets/chests/vector.png differ diff --git a/assets/copy_key.png b/assets/copy_key.png new file mode 100644 index 0000000..8957f50 Binary files /dev/null and b/assets/copy_key.png differ diff --git a/assets/printer.png b/assets/printer.png old mode 100755 new mode 100644 index ced5f5d..aab7940 Binary files a/assets/printer.png and b/assets/printer.png differ diff --git a/assets/vector_white.png b/assets/vector_white.png new file mode 100644 index 0000000..347caaa Binary files /dev/null and b/assets/vector_white.png differ diff --git a/assets/walletOptions/android-checkmark.png b/assets/walletOptions/android-checkmark.png old mode 100755 new mode 100644 index 578859d..ef913f5 Binary files a/assets/walletOptions/android-checkmark.png and b/assets/walletOptions/android-checkmark.png differ diff --git a/assets/walletOptions/camera.png b/assets/walletOptions/camera.png old mode 100755 new mode 100644 index ce9ad0f..49fe6ba Binary files a/assets/walletOptions/camera.png and b/assets/walletOptions/camera.png differ diff --git a/assets/walletOptions/clock.png b/assets/walletOptions/clock.png old mode 100755 new mode 100644 index cf9a802..a4a684f Binary files a/assets/walletOptions/clock.png and b/assets/walletOptions/clock.png differ diff --git a/assets/walletOptions/copy-white.png b/assets/walletOptions/copy-white.png old mode 100755 new mode 100644 index 819e852..d085408 Binary files a/assets/walletOptions/copy-white.png and b/assets/walletOptions/copy-white.png differ diff --git a/assets/walletOptions/edit.png b/assets/walletOptions/edit.png old mode 100755 new mode 100644 index a45788d..3963753 Binary files a/assets/walletOptions/edit.png and b/assets/walletOptions/edit.png differ diff --git a/assets/walletOptions/icon_oeuil.png b/assets/walletOptions/icon_oeuil.png old mode 100755 new mode 100644 index f707647..75c12ec Binary files a/assets/walletOptions/icon_oeuil.png and b/assets/walletOptions/icon_oeuil.png differ diff --git a/assets/walletOptions/icon_oeuil_close.png b/assets/walletOptions/icon_oeuil_close.png index 4a13e67..db1dc51 100644 Binary files a/assets/walletOptions/icon_oeuil_close.png and b/assets/walletOptions/icon_oeuil_close.png differ diff --git a/assets/walletOptions/key.png b/assets/walletOptions/key.png old mode 100755 new mode 100644 index 45c0e85..bfabc3d Binary files a/assets/walletOptions/key.png and b/assets/walletOptions/key.png differ diff --git a/assets/walletOptions/trash.png b/assets/walletOptions/trash.png old mode 100755 new mode 100644 index 6dc972b..2d008a0 Binary files a/assets/walletOptions/trash.png and b/assets/walletOptions/trash.png differ diff --git a/lib/main.dart b/lib/main.dart index 39ed3d7..585f1cd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -51,7 +51,6 @@ Future main() async { HomeProvider _homeProvider = HomeProvider(); appPath = await getApplicationDocumentsDirectory(); - await _homeProvider.createDefaultAvatar(); appVersion = await _homeProvider.getAppVersion(); prefs = await SharedPreferences.getInstance(); diff --git a/lib/models/cesium_plus.dart b/lib/models/cesium_plus.dart index 4d2835d..8f872ed 100644 --- a/lib/models/cesium_plus.dart +++ b/lib/models/cesium_plus.dart @@ -8,7 +8,8 @@ import 'package:path_provider/path_provider.dart'; class CesiumPlusProvider with ChangeNotifier { TextEditingController cesiumName = TextEditingController(); - bool isComplete = false; + Image defaultAvatar(double size) => + Image.asset(('assets/icon_user.png'), height: size); Future _buildQuery(_pubkey) async { var queryGetAvatar = json.encode({ @@ -77,27 +78,34 @@ class CesiumPlusProvider with ChangeNotifier { return _name; } - Future getAvatar(String _pubkey) async { + Future getAvatar(String _pubkey, double size) async { List queryOptions = await _buildQuery(_pubkey); - final response = await http.post((Uri.parse(queryOptions[0])), - body: queryOptions[1], headers: queryOptions[2]); + + http.Response response; + try { + response = await http.post((Uri.parse(queryOptions[0])), + body: queryOptions[1], headers: queryOptions[2]); + } catch (e) { + log.e(e); + } final responseJson = json.decode(response.body); - if (responseJson['hits']['hits'].toString() == '[]') { - return [File(appPath.path + '/default_avatar.png')]; - } - final bool avatarExist = - responseJson['hits']['hits'][0]['_source'].containsKey("avatar"); - if (!avatarExist) { - return [File(appPath.path + '/default_avatar.png')]; + + if (responseJson['hits']['hits'].toString() == '[]' || + !responseJson['hits']['hits'][0]['_source'].containsKey("avatar")) { + return defaultAvatar(size); } + final _avatar = responseJson['hits']['hits'][0]['_source']['avatar']['_content']; var avatarFile = File('${(await getTemporaryDirectory()).path}/avatar_$_pubkey.png'); await avatarFile.writeAsBytes(base64.decode(_avatar)); - isComplete = true; - return [avatarFile]; + return Image.file( + avatarFile, + height: size, + fit: BoxFit.cover, + ); } } diff --git a/lib/models/history.dart b/lib/models/history.dart index 0d6294d..b72d22b 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; -import 'package:gecko/screens/history.dart'; +import 'package:gecko/screens/wallet_view.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:jdenticon_dart/jdenticon_dart.dart'; import 'package:permission_handler/permission_handler.dart'; @@ -81,7 +81,7 @@ class HistoryProvider with ChangeNotifier { if (regExp.hasMatch(pubkey) == true && pubkey.length > 42 && pubkey.length < 45) { - log.d("C'est une pubkey !!!"); + log.d("C'est une pubkey !"); this.pubkey = pubkey; getShortPubkey(pubkey); @@ -101,7 +101,7 @@ class HistoryProvider with ChangeNotifier { Navigator.push( context, MaterialPageRoute(builder: (context) { - return HistoryScreen(); + return WalletViewScreen(); }), ); notifyListeners(); @@ -238,6 +238,7 @@ class HistoryProvider with ChangeNotifier { snackCopyKey(context) { const snackBar = SnackBar( + padding: EdgeInsets.all(20), content: Text("Cette clé publique a été copié dans votre presse-papier."), duration: Duration(seconds: 2)); diff --git a/lib/models/home.dart b/lib/models/home.dart index 66a098c..1d8aacb 100644 --- a/lib/models/home.dart +++ b/lib/models/home.dart @@ -100,16 +100,6 @@ class HomeProvider with ChangeNotifier { return _endpoint; } - Future createDefaultAvatar() async { - File defaultAvatar = File(appPath.path + '/default_avatar.png'); - final bool isAvatarExist = await defaultAvatar.exists(); - if (!isAvatarExist) { - final byteData = await rootBundle.load('assets/icon_user.png'); - await defaultAvatar.writeAsBytes(byteData.buffer - .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes)); - } - } - T getRandomElement(List list) { final random = Random(); var i = random.nextInt(list.length); diff --git a/lib/screens/history.dart b/lib/screens/history.dart index 57d275f..21fe283 100644 --- a/lib/screens/history.dart +++ b/lib/screens/history.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/cesium_plus.dart'; @@ -191,40 +190,36 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { child: FutureBuilder( future: _cesiumPlusProvider.getAvatar( - _historyProvider.pubkey), - initialData: [ - File(appPath.path + - '/default_avatar.png') - ], + _historyProvider.pubkey, + 55), builder: (BuildContext context, - AsyncSnapshot _avatar) { - // _cesiumPlusProvider.isComplete = true; + AsyncSnapshot _avatar) { if (_avatar.connectionState != - ConnectionState.done) { - return Image.file( - File(appPath.path + - '/default_avatar.png'), - height: avatarsSize); - } - if (_avatar.hasError) { - return Image.file( - File(appPath.path + - '/default_avatar.png'), - height: avatarsSize); + ConnectionState.done || + _avatar.hasError) { + return Stack(children: [ + _cesiumPlusProvider + .defaultAvatar(55), + Positioned( + top: 8, + right: 0, + width: 12, + height: 12, + child: + CircularProgressIndicator( + strokeWidth: 1, + color: orangeC, + ), + ), + ]); } if (_avatar.hasData) { - return SingleChildScrollView( - padding: - const EdgeInsets.all( - 0.0), - child: Image.file( - _avatar.data[0], - height: avatarsSize)); + return ClipOval( + child: _avatar.data, + ); } - return Image.file( - File(appPath.path + - '/default_avatar.png'), - height: avatarsSize); + return _cesiumPlusProvider + .defaultAvatar(55); }), ), GestureDetector( @@ -448,7 +443,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { Navigator.pop(context); }), ), - if (result.isLoading) + if (result.isLoading && + _historyProvider.pageInfo['hasPreviousPage']) Row( mainAxisAlignment: MainAxisAlignment.center, children: const [ diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 1e0ca91..b3e450e 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -57,357 +57,362 @@ class WalletOptions extends StatelessWidget { log.d("Wallet options: $currentChest:${wallet.number}"); return WillPopScope( - onWillPop: () { - _walletOptions.isEditing = false; - _walletOptions.isBalanceBlur = true; - Navigator.popUntil( - context, - ModalRoute.withName('/mywallets'), - ); - return Future.value(true); - }, - child: Scaffold( - resizeToAvoidBottomInset: false, - appBar: AppBar( - toolbarHeight: 60 * ratio, - leading: IconButton( - icon: const Icon(Icons.arrow_back, color: Colors.black), - onPressed: () { - _walletOptions.isEditing = false; - _walletOptions.isBalanceBlur = true; - Navigator.popUntil( - context, - ModalRoute.withName('/mywallets'), - ); - }), - title: SizedBox( - height: 22, - child: Text(_walletOptions.nameController.text), - )), - body: Builder( - builder: (ctx) => SafeArea( - child: Column(children: [ - Container( - height: isTall ? 15 : 0, - color: yellowC, - ), - Container( - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - colors: [ - yellowC, - const Color(0xfffafafa), - ], - )), - child: Row(children: [ - const SizedBox(width: 25), - InkWell( - onTap: () async { - File newAvatar = - await _walletOptions.changeAvatar(); - if (newAvatar != null) { - wallet.imageFile = newAvatar; - } - _walletOptions.reloadBuild(); - }, - child: wallet.imageFile == null - ? Image.asset( - 'assets/avatars/${wallet.imageName}', - width: 110, - ) - : Image.file( - wallet.imageFile, - width: 110, - )), - InkWell( - onTap: () async { - File newAvatar = - await _walletOptions.changeAvatar(); - if (newAvatar != null) { - wallet.imageFile = newAvatar; - } - _walletOptions.reloadBuild(); - }, - child: Column(children: [ - Image.asset( - 'assets/walletOptions/camera.png', + onWillPop: () { + _walletOptions.isEditing = false; + _walletOptions.isBalanceBlur = true; + Navigator.popUntil( + context, + ModalRoute.withName('/mywallets'), + ); + return Future.value(true); + }, + child: Scaffold( + resizeToAvoidBottomInset: false, + appBar: AppBar( + toolbarHeight: 60 * ratio, + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.black), + onPressed: () { + _walletOptions.isEditing = false; + _walletOptions.isBalanceBlur = true; + Navigator.popUntil( + context, + ModalRoute.withName('/mywallets'), + ); + }), + title: SizedBox( + height: 22, + child: Text(_walletOptions.nameController.text), + )), + body: Builder( + builder: (ctx) => SafeArea( + child: Column(children: [ + Container( + height: isTall ? 15 : 0, + color: yellowC, + ), + Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + yellowC, + const Color(0xfffafafa), + ], + )), + child: Row(children: [ + const SizedBox(width: 25), + InkWell( + onTap: () async { + File newAvatar = await _walletOptions.changeAvatar(); + if (newAvatar != null) { + wallet.imageFile = newAvatar; + } + _walletOptions.reloadBuild(); + }, + child: wallet.imageFile == null + ? Image.asset( + 'assets/avatars/${wallet.imageName}', + width: 110, + ) + : Image.file( + wallet.imageFile, + width: 110, + )), + InkWell( + onTap: () async { + File newAvatar = await _walletOptions.changeAvatar(); + if (newAvatar != null) { + wallet.imageFile = newAvatar; + } + _walletOptions.reloadBuild(); + }, + child: Column(children: [ + Image.asset( + 'assets/walletOptions/camera.png', + ), + const SizedBox(height: 100) + ])), + Column(children: [ + Row(children: [ + Column(children: [ + SizedBox( + width: 260, + child: TextField( + key: const Key('walletName'), + autofocus: false, + focusNode: _walletOptions.walletNameFocus, + enabled: _walletOptions.isEditing, + controller: _walletOptions.nameController, + maxLines: _nbrLinesName, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + disabledBorder: InputBorder.none, + contentPadding: EdgeInsets.all(15.0), + ), + style: TextStyle( + fontSize: isTall ? 27 : 23, + color: Colors.black, + fontWeight: FontWeight.w400, + fontFamily: 'Monospace')), + ), + SizedBox(height: isTall ? 5 : 0), + Query( + options: QueryOptions( + document: gql(getBalance), + variables: { + 'pubkey': _walletOptions.pubkey.text, + }, + // pollInterval: Duration(seconds: 1), ), - const SizedBox(height: 100) - ])), - Column(children: [ - Row(children: [ - Column(children: [ - SizedBox( - width: 260, - child: TextField( - key: const Key('walletName'), - autofocus: false, - focusNode: _walletOptions.walletNameFocus, - enabled: _walletOptions.isEditing, - controller: _walletOptions.nameController, - maxLines: _nbrLinesName, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - disabledBorder: InputBorder.none, - contentPadding: EdgeInsets.all(15.0), - ), - style: TextStyle( - fontSize: isTall ? 27 : 23, - color: Colors.black, - fontWeight: FontWeight.w400, - fontFamily: 'Monospace')), - ), - SizedBox(height: isTall ? 5 : 0), - Query( - options: QueryOptions( - document: gql(getBalance), - variables: { - 'pubkey': _walletOptions.pubkey.text, - }, - // pollInterval: Duration(seconds: 1), - ), - builder: (QueryResult result, - {VoidCallback refetch, FetchMore fetchMore}) { - if (result.hasException) { - return Text(result.exception.toString()); - } + builder: (QueryResult result, + {VoidCallback refetch, FetchMore fetchMore}) { + if (result.hasException) { + return Text(result.exception.toString()); + } - if (result.isLoading) { - return const Text('Loading'); - } + if (result.isLoading) { + return const Text('Loading'); + } - // List repositories = result.data['viewer']['repositories']['nodes']; - String wBalanceUD; - if (result.data['balance'] == null) { - wBalanceUD = '0.0'; - } else { - int wBalanceG1 = - result.data['balance']['amount']; - int currentUD = - result.data['currentUd']['amount']; - double wBalanceUDBrut = - wBalanceG1 / currentUD; // .toString(); - wBalanceUD = double.parse( - (wBalanceUDBrut).toStringAsFixed(2)) - .toString(); - } - return Row(children: [ - ImageFiltered( - imageFilter: ImageFilter.blur( - sigmaX: _walletOptions.isBalanceBlur - ? 6 - : 0, - sigmaY: _walletOptions.isBalanceBlur - ? 5 - : 0), - child: Text(wBalanceUD, - style: TextStyle( - fontSize: isTall ? 20 : 18, - color: Colors.black)), - ), - Text(' DU', + // List repositories = result.data['viewer']['repositories']['nodes']; + String wBalanceUD; + if (result.data['balance'] == null) { + wBalanceUD = '0.0'; + } else { + int wBalanceG1 = + result.data['balance']['amount']; + int currentUD = + result.data['currentUd']['amount']; + double wBalanceUDBrut = + wBalanceG1 / currentUD; // .toString(); + wBalanceUD = double.parse( + (wBalanceUDBrut).toStringAsFixed(2)) + .toString(); + } + return Row(children: [ + ImageFiltered( + imageFilter: ImageFilter.blur( + sigmaX: + _walletOptions.isBalanceBlur ? 6 : 0, + sigmaY: + _walletOptions.isBalanceBlur ? 5 : 0), + child: Text(wBalanceUD, style: TextStyle( fontSize: isTall ? 20 : 18, - color: Colors.black)) - ]); + color: Colors.black)), + ), + Text(' DU', + style: TextStyle( + fontSize: isTall ? 20 : 18, + color: Colors.black)) + ]); - // Text( - // '$wBalanceUD DU', - // style: TextStyle( - // fontSize: 20, color: Colors.black), - // ); + // Text( + // '$wBalanceUD DU', + // style: TextStyle( + // fontSize: 20, color: Colors.black), + // ); + }, + ), + const SizedBox(height: 5), + InkWell( + key: const Key('displayBalance'), + onTap: () { + _walletOptions.bluringBalance(); }, - ), - const SizedBox(height: 5), - InkWell( - key: const Key('displayBalance'), - onTap: () { - _walletOptions.bluringBalance(); - }, - child: Image.asset( - _walletOptions.isBalanceBlur - ? 'assets/walletOptions/icon_oeuil.png' - : 'assets/walletOptions/icon_oeuil_close.png', - )), - ]), - const SizedBox(width: 0), - Column(children: [ - InkWell( - key: const Key('renameWallet'), - onTap: () async { - _isNewNameValid = - _walletOptions.editWalletName(wallet.id(), - isCesium: false); - await Future.delayed( - const Duration(milliseconds: 30)); - _walletOptions.walletNameFocus.requestFocus(); - }, - child: ClipRRect( - child: Image.asset( - _walletOptions.isEditing - ? 'assets/walletOptions/android-checkmark.png' - : 'assets/walletOptions/edit.png', - width: 20, - height: 20), - )), - const SizedBox( - height: 60, - ) - ]) - ]), - ]), - ])), - 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)); - }), - SizedBox(height: 15 * ratio), - GestureDetector( - key: const Key('copyPubkey'), - onTap: () { - Clipboard.setData( - ClipboardData(text: _walletOptions.pubkey.text)); - _walletOptions.snackCopyKey(ctx); - }, - child: SizedBox( - height: 50, - child: Row(children: [ - const SizedBox(width: 30), - Image.asset( - 'assets/walletOptions/key.png', - ), - const SizedBox(width: 20), - Text("${shortPubkey.split(':')[0]}:", - style: const TextStyle( - fontSize: 22, - fontWeight: FontWeight.w800, - fontFamily: 'Monospace', - color: Colors.black)), - Text(shortPubkey.split(':')[1], - style: const TextStyle( - fontSize: 22, - fontWeight: FontWeight.w800, - fontFamily: 'Monospace')), - const SizedBox(width: 15), - SizedBox( - height: 40, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - ), - elevation: 1, - primary: orangeC, // background - onPrimary: Colors.black, // foreground - ), - onPressed: () { - Clipboard.setData(ClipboardData( - text: _walletOptions.pubkey.text)); - _walletOptions.snackCopyKey(ctx); - }, - child: Row(children: [ - Image.asset( - 'assets/walletOptions/copy-white.png', - ), - const SizedBox(width: 7), - Text('Copier', - style: TextStyle( - fontSize: 15, - color: Colors.grey[50])) - ]))), - ]))), - SizedBox(height: 10 * ratio), - InkWell( - key: const Key('displayHistory'), - onTap: () { - _historyProvider.isPubkey(ctx, _walletOptions.pubkey.text, - goHistory: true); - }, - child: SizedBox( - height: 50, - child: Row(children: [ - const SizedBox(width: 30), - Image.asset( - 'assets/walletOptions/clock.png', - ), - const SizedBox(width: 22), - const Text('Historique des transactions', - style: - TextStyle(fontSize: 20, color: Colors.black)), - ]))), - SizedBox(height: 12 * ratio), - InkWell( - key: const Key('setDefaultWallet'), - onTap: !_walletOptions.isDefaultWallet - ? () { - defaultWallet = wallet; - chestBox.get(currentChest).defaultWallet = - wallet.number; - _myWalletProvider.readAllWallets(_currentChest); - _myWalletProvider.rebuildWidget(); - } - : null, - child: SizedBox( - height: 50, - child: Row(children: [ - const SizedBox(width: 31), - CircleAvatar( - backgroundColor: Colors.grey[ - _walletOptions.isDefaultWallet ? 300 : 500], child: Image.asset( - 'assets/walletOptions/android-checkmark.png', + _walletOptions.isBalanceBlur + ? 'assets/walletOptions/icon_oeuil.png' + : 'assets/walletOptions/icon_oeuil_close.png', )), - const SizedBox(width: 22), - Text( - _walletOptions.isDefaultWallet - ? 'Ce portefeuille est celui par defaut' - : 'Définir comme portefeuille par défaut', - style: TextStyle( - fontSize: 20, - color: _walletOptions.isDefaultWallet - ? Colors.grey[500] - : Colors.black)), - ]))), - SizedBox(height: 17 * ratio), - if (!_walletOptions.isDefaultWallet) - InkWell( - key: const Key('deleteWallet'), - onTap: !_walletOptions.isDefaultWallet - ? () async { - await _walletOptions.deleteWallet( - context, wallet); - WidgetsBinding.instance.addPostFrameCallback((_) { - _myWalletProvider.listWallets = - _myWalletProvider - .readAllWallets(_currentChest); - _myWalletProvider.rebuildWidget(); - }); - } - : null, - child: Row(children: [ - const SizedBox(width: 33), - Image.asset( - 'assets/walletOptions/trash.png', + ]), + const SizedBox(width: 0), + Column(children: [ + InkWell( + key: const Key('renameWallet'), + onTap: () async { + _isNewNameValid = _walletOptions.editWalletName( + wallet.id(), + isCesium: false); + await Future.delayed( + const Duration(milliseconds: 30)); + _walletOptions.walletNameFocus.requestFocus(); + }, + child: ClipRRect( + child: Image.asset( + _walletOptions.isEditing + ? 'assets/walletOptions/android-checkmark.png' + : 'assets/walletOptions/edit.png', + width: 20, + height: 20), + )), + const SizedBox( + height: 60, + ) + ]) + ]), + ]), + ])), + 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)); + }), + SizedBox(height: 15 * ratio), + GestureDetector( + key: const Key('copyPubkey'), + onTap: () { + Clipboard.setData( + ClipboardData(text: _walletOptions.pubkey.text)); + _walletOptions.snackCopyKey(ctx); + }, + child: SizedBox( + height: 50, + child: Row(children: [ + const SizedBox(width: 30), + Image.asset( + 'assets/walletOptions/key.png', + ), + const SizedBox(width: 20), + Text("${shortPubkey.split(':')[0]}:", + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w800, + fontFamily: 'Monospace', + color: Colors.black)), + Text(shortPubkey.split(':')[1], + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.w800, + fontFamily: 'Monospace')), + const SizedBox(width: 15), + SizedBox( + height: 40, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + elevation: 1, + primary: orangeC, // background + onPrimary: Colors.black, // foreground ), - const SizedBox(width: 24), - const Text('Supprimer ce portefeuille', - style: TextStyle( - fontSize: 20, color: Color(0xffD80000))), - ])), - ]), - ), + onPressed: () { + Clipboard.setData( + ClipboardData(text: _walletOptions.pubkey.text)); + _walletOptions.snackCopyKey(ctx); + }, + child: Row(children: [ + Image.asset( + 'assets/walletOptions/copy-white.png', + ), + const SizedBox(width: 7), + Text( + 'Copier', + style: + TextStyle(fontSize: 15, color: Colors.grey[50]), + ) + ]), + ), + ), + ]), + ), + ), + SizedBox(height: 10 * ratio), + InkWell( + key: const Key('displayHistory'), + onTap: () { + _historyProvider.isPubkey(ctx, _walletOptions.pubkey.text, + goHistory: true); + }, + child: SizedBox( + height: 50, + child: Row(children: [ + const SizedBox(width: 30), + Image.asset( + 'assets/walletOptions/clock.png', + ), + const SizedBox(width: 22), + const Text('Historique des transactions', + style: TextStyle(fontSize: 20, color: Colors.black)), + ]), + ), + ), + SizedBox(height: 12 * ratio), + InkWell( + key: const Key('setDefaultWallet'), + onTap: !_walletOptions.isDefaultWallet + ? () { + defaultWallet = wallet; + chestBox.get(currentChest).defaultWallet = + wallet.number; + _myWalletProvider.readAllWallets(_currentChest); + _myWalletProvider.rebuildWidget(); + } + : null, + child: SizedBox( + height: 50, + child: Row(children: [ + const SizedBox(width: 31), + CircleAvatar( + backgroundColor: Colors + .grey[_walletOptions.isDefaultWallet ? 300 : 500], + child: Image.asset( + 'assets/walletOptions/android-checkmark.png', + ), + ), + const SizedBox(width: 22), + Text( + _walletOptions.isDefaultWallet + ? 'Ce portefeuille est celui par defaut' + : 'Définir comme portefeuille par défaut', + style: TextStyle( + fontSize: 20, + color: _walletOptions.isDefaultWallet + ? Colors.grey[500] + : Colors.black)), + ]), + ), + ), + SizedBox(height: 17 * ratio), + if (!_walletOptions.isDefaultWallet) + InkWell( + key: const Key('deleteWallet'), + onTap: !_walletOptions.isDefaultWallet + ? () async { + await _walletOptions.deleteWallet(context, wallet); + WidgetsBinding.instance.addPostFrameCallback((_) { + _myWalletProvider.listWallets = + _myWalletProvider.readAllWallets(_currentChest); + _myWalletProvider.rebuildWidget(); + }); + } + : null, + child: Row(children: [ + const SizedBox(width: 33), + Image.asset( + 'assets/walletOptions/trash.png', + ), + const SizedBox(width: 24), + const Text('Supprimer ce portefeuille', + style: + TextStyle(fontSize: 20, color: Color(0xffD80000))), + ]), + ), + ]), ), - )); + ), + ), + ); } } diff --git a/lib/screens/search_result.dart b/lib/screens/search_result.dart index 0be63ad..1f09f52 100644 --- a/lib/screens/search_result.dart +++ b/lib/screens/search_result.dart @@ -1,4 +1,3 @@ -import 'dart:io'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; @@ -20,11 +19,8 @@ class SearchResultScreen extends StatelessWidget { HistoryProvider _historyClass = Provider.of(context, listen: false); - // int nbrResult = 0; int keyID = 0; - const double avatarsSize = 50; - - // _searchProvider.searchPubkey(); + double _avatarSize = 55; return Scaffold( appBar: AppBar( @@ -37,113 +33,117 @@ 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], + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 30), + RichText( + text: TextSpan( + style: TextStyle( + fontSize: 18, + color: Colors.grey[700], + ), + children: [ + const TextSpan( + text: "Résultats pour ", + ), + TextSpan( + text: '"${_searchProvider.searchController.text}"', + style: const TextStyle(fontStyle: FontStyle.italic), + ), + ], + ), ), - children: [ - 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(), - // initialData: const [], - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - return Expanded( - child: ListView(children: [ - for (G1WalletsList g1Wallet in snapshot.data) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 5), - child: ListTile( - key: Key('searchResult${keyID++}'), - contentPadding: const EdgeInsets.all(5), - leading: FutureBuilder( - future: _cesiumPlusProvider - .getAvatar(g1Wallet.pubkey), - initialData: [ - File(appPath.path + '/default_avatar.png') - ], - builder: (BuildContext context, - AsyncSnapshot _avatar) { - if (_avatar.connectionState != - ConnectionState.done) { - return Image.file( - File(appPath.path + - '/default_avatar.png'), - height: avatarsSize); - } - if (_avatar.hasError) { - return Image.file( - File(appPath.path + - '/default_avatar.png'), - height: avatarsSize); - } - if (_avatar.hasData) { - return SingleChildScrollView( - padding: const EdgeInsets.all(0.0), - child: Image.file(_avatar.data.single, - height: avatarsSize)); - } - return Image.file( - File(appPath.path + - '/default_avatar.png'), - height: avatarsSize); + 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: [ + 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( + future: _cesiumPlusProvider.getAvatar( + g1Wallet.pubkey, _avatarSize), + builder: (BuildContext context, + AsyncSnapshot _avatar) { + if (_avatar.connectionState != + ConnectionState.done || + _avatar.hasError) { + return Stack(children: [ + _cesiumPlusProvider + .defaultAvatar(_avatarSize), + Positioned( + top: 8, + right: 0, + width: 12, + height: 12, + child: CircularProgressIndicator( + strokeWidth: 1, + color: orangeC, + ), + ), + ]); + } + if (_avatar.hasData) { + return ClipOval(child: _avatar.data); + } + return _cesiumPlusProvider + .defaultAvatar(_avatarSize); + }), + title: Row(children: [ + Text( + _historyClass + .getShortPubkey(g1Wallet.pubkey), + style: const TextStyle( + fontSize: 18, + fontFamily: 'Monospace', + fontWeight: FontWeight.w500), + textAlign: TextAlign.center), + ]), + subtitle: Row(children: [ + 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: Text( - _historyClass.getShortPubkey(g1Wallet.pubkey), - style: const TextStyle( - fontSize: 15.0, fontFamily: 'Monospace'), - textAlign: TextAlign.center), - subtitle: Text(g1Wallet?.id?.username ?? '', - style: const TextStyle(fontSize: 12.0), - textAlign: TextAlign.center), - trailing: Text("${g1Wallet.balance} Ğ1", - style: const TextStyle(fontSize: 14.0), - textAlign: TextAlign.justify), - dense: false, - isThreeLine: false, - onTap: () { - _historyClass.isPubkey( - context, g1Wallet.pubkey); - }), - ), - ]), - ); - } - 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 new file mode 100644 index 0000000..8d3961e --- /dev/null +++ b/lib/screens/wallet_view.dart @@ -0,0 +1,228 @@ +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: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); + + @override + Widget build(BuildContext context) { + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + HistoryProvider _historyProvider = Provider.of(context); + CesiumPlusProvider _cesiumPlusProvider = + Provider.of(context); + double _avatarSize = 150; + + return Scaffold( + appBar: AppBar( + elevation: 0, + toolbarHeight: 60 * ratio, + title: const SizedBox( + height: 22, + child: Text('Voir un portefeuille'), + )), + body: SafeArea( + child: Column(children: [ + Container( + height: isTall ? 30 : 10, + color: yellowC, + ), + Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + yellowC, + const Color(0xFFE7811A), + ], + )), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 30), + child: Row(children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 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, + ), + ), + ), + const SizedBox(height: 15), + FutureBuilder( + future: _cesiumPlusProvider + .getName(_historyProvider.pubkey), + initialData: '...', + builder: (context, snapshot) { + return SizedBox( + width: 230, + child: Text( + snapshot.data ?? '-', + style: const TextStyle( + fontSize: 20, color: Color(0xff814C00)), + ), + ); + }), + const SizedBox(height: 30), + ]), + const Spacer(), + Column(children: [ + FutureBuilder( + future: _cesiumPlusProvider.getAvatar( + _historyProvider.pubkey, _avatarSize), + builder: (BuildContext context, + AsyncSnapshot _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.hasData) { + return ClipOval( + child: _avatar.data, + ); + } + return ClipOval( + child: + _cesiumPlusProvider.defaultAvatar(_avatarSize), + ); + }), + const SizedBox(height: 30), + ]), + ]), + ), + ), + SizedBox(height: isTall ? 60 : 30), + Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ + Column(children: [ + SizedBox( + height: 120, + child: ClipOval( + child: Material( + color: const Color(0xffFFD58D), // button color + child: InkWell( + key: const Key('viewHistory'), + splashColor: orangeC, // inkwell color + child: const Padding( + padding: EdgeInsets.all(15), + child: Image( + image: AssetImage( + 'assets/walletOptions/clock.png'), + height: 90)), + onTap: () { + null; + }), + ), + ), + ), + const SizedBox(height: 9), + const Text( + "Voir\nl'historique", + textAlign: TextAlign.center, + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + ]), + Column(children: [ + SizedBox( + height: 120, + child: ClipOval( + child: Material( + color: const Color(0xffFFD58D), // button color + child: InkWell( + key: const Key('copyKey'), + splashColor: orangeC, // inkwell color + child: const Padding( + padding: EdgeInsets.all(20), + child: Image( + image: AssetImage('assets/copy_key.png'), + height: 90)), + onTap: () { + Clipboard.setData( + ClipboardData(text: _historyProvider.pubkey)); + _historyProvider.snackCopyKey(context); + }), + ), + ), + ), + const SizedBox(height: 9), + const Text( + "Copier\nla clef", + textAlign: TextAlign.center, + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + ]), + ]), + const Spacer(), + Container( + height: 120, + decoration: BoxDecoration( + color: const Color(0xff7c94b6), + borderRadius: const BorderRadius.all(Radius.circular(100)), + border: Border.all( + color: const Color(0xFF6c4204), + width: 4, + ), + ), + child: ClipOval( + child: Material( + color: orangeC, // button color + child: InkWell( + key: const Key('pay'), + splashColor: yellowC, // inkwell color + child: const Padding( + padding: EdgeInsets.all(16), + child: Image( + image: AssetImage('assets/vector_white.png'), + )), + onTap: () { + null; + }), + ), + ), + ), + const SizedBox(height: 9), + const Text( + "Faire un\nvirement", + textAlign: TextAlign.center, + style: TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + SizedBox(height: isTall ? 100 : 50) + ]), + )); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index b8c4692..4522862 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,13 +5,16 @@ 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+7 +version: 0.0.3+8 environment: sdk: ">=2.7.0 <3.0.0" dependencies: + assorted_layout_widgets: ^5.2.1 bubble: ^1.2.1 + carousel_slider: ^4.0.0 + confirm_dialog: ^1.0.0 crypto: ^3.0.1 dubp: path: packages/dubp_rs @@ -21,6 +24,7 @@ dependencies: flutter_driver: sdk: flutter flutter_launcher_icons: ^0.9.2 + flutter_lints: ^1.0.4 flutter_logs: ^2.1.4 flutter_svg: ^0.22.0 graphql_flutter: ^5.0.0 @@ -29,6 +33,7 @@ dependencies: http: ^0.13.4 image_gallery_saver: ^1.6.9 image_picker: ^0.8.4 + infinite_scroll_pagination: ^3.1.0 intl: ^0.17.0 jdenticon_dart: ^2.0.0 logger: ^1.1.0 @@ -38,7 +43,7 @@ dependencies: permission_handler: 8.1.6 pin_code_fields: ^7.3.0 printing: ^5.6.0 - provider: ^6.0.0 + provider: ^6.0.1 qrscan: ^0.3.2 responsive_builder: ^0.4.1 responsive_framework: ^0.1.4 @@ -48,16 +53,9 @@ dependencies: super_tooltip: ^1.0.1 sync_http: ^0.3.0 test: ^1.17.10 - # test_api: ^0.4.7 - # test: ^1.19.3 truncate: ^3.0.1 unorm_dart: ^0.2.0 xml: ^5.3.0 - assorted_layout_widgets: ^5.2.1 - carousel_slider: ^4.0.0 - flutter_lints: ^1.0.4 - confirm_dialog: ^1.0.0 - infinite_scroll_pagination: ^3.1.0 flutter_icons: android: "ic_launcher" @@ -66,12 +64,12 @@ flutter_icons: cupertino_icons: ^1.0.0 dev_dependencies: + build_runner: ^2.1.2 flutter_test: sdk: flutter + hive_generator: ^1.1.1 integration_test: sdk: flutter - hive_generator: ^1.1.1 - build_runner: ^2.1.2 # The following section is specific to Flutter. flutter: diff --git a/scripts/build-apk.sh b/scripts/build-apk.sh index 86a0ac3..368a81e 100755 --- a/scripts/build-apk.sh +++ b/scripts/build-apk.sh @@ -20,8 +20,8 @@ if [[ $1 == "bundle" ]]; then flutter build appbundle --release --target-platform android-arm,android-arm64 --build-name $VERSION --build-number $BUILD else # flutter build apk --release --split-per-abi --target-platform android-arm,android-arm64 --build-name $VERSION --build-number $BUILD -# flutter build apk --release --split-per-abi --build-name $VERSION --build-number $BUILD - flutter build apk --release --build-name $VERSION --build-number $BUILD + flutter build apk --release --split-per-abi --build-name $VERSION --build-number $BUILD +# flutter build apk --release --build-name $VERSION --build-number $BUILD fi if [[ -d $HOME/Téléchargements ]]; then