From 3217be291ee8183e00342f11f87885de061d5e4d Mon Sep 17 00:00:00 2001 From: poka Date: Tue, 16 Feb 2021 17:40:25 +0100 Subject: [PATCH] Search works fine for pubkey; Add checksum to short pubkey format --- lib/models/history.dart | 25 ++++++++- lib/screens/history.dart | 43 ++++---------- lib/screens/home.dart | 32 ++++++++--- lib/screens/search.dart | 117 ++++++++++++++++++++------------------- pubspec.lock | 9 ++- pubspec.yaml | 2 + 6 files changed, 129 insertions(+), 99 deletions(-) diff --git a/lib/models/history.dart b/lib/models/history.dart index aeed895..ca5823c 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; @@ -8,6 +10,8 @@ import 'package:qrscan/qrscan.dart' as scanner; import 'dart:math'; import 'package:intl/intl.dart'; import 'package:truncate/truncate.dart'; +import 'package:crypto/crypto.dart'; +import 'package:fast_base58/fast_base58.dart'; class HistoryProvider with ChangeNotifier { String pubkey = ''; @@ -56,11 +60,20 @@ class HistoryProvider with ChangeNotifier { print("C'est une pubkey !!!"); this.pubkey = pubkey; + + List pubkeyByte = Base58Decode(pubkey); + Digest pubkeyS256 = sha256.convert(sha256.convert(pubkeyByte).bytes); + String pubkeyCheksum = Base58Encode(pubkeyS256.bytes); + String pubkeyChecksumShort = truncate(pubkeyCheksum, 3, + omission: "", position: TruncatePosition.end); + pubkeyShort = truncate(pubkey, 5, - omission: ":", position: TruncatePosition.end) + + omission: String.fromCharCode(0x2026), + position: TruncatePosition.end) + truncate(pubkey, 4, omission: "", position: TruncatePosition.start) + - ':aaa'; + ':$pubkeyChecksumShort'; this.outputPubkey.text = pubkey; + print(pubkeyShort); notifyListeners(); return pubkey; @@ -196,6 +209,14 @@ class HistoryProvider with ChangeNotifier { return num.parse(result); } + snackCopyKey(context) { + final snackBar = SnackBar( + content: + Text("Cette clé publique a été copié dans votre presse-papier."), + duration: Duration(seconds: 2)); + Scaffold.of(context).showSnackBar(snackBar); + } + // num getBalance(_pubkey) { // getBalance(_pubkey); // } diff --git a/lib/screens/history.dart b/lib/screens/history.dart index 7ebd6d8..20677cc 100644 --- a/lib/screens/history.dart +++ b/lib/screens/history.dart @@ -56,32 +56,6 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { ), body: Column(children: [ SizedBox(height: 20), - TextField( - autofocus: false, - focusNode: _pubkeyFocus, - // Entrée de la pubkey - onChanged: (text) { - print("Clé tappxé: $text"); - _historyProvider.isPubkey(text); - }, - controller: this._outputPubkey, - maxLines: 1, - textAlign: TextAlign.center, - decoration: InputDecoration( - hintText: 'Tappez/Collez une clé publique, ou scannez', - hintStyle: TextStyle(fontSize: 14), - contentPadding: - EdgeInsets.symmetric(horizontal: 7, vertical: 15), - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - errorBorder: InputBorder.none, - disabledBorder: InputBorder.none, - ), - style: TextStyle( - fontSize: 14.0, - fontWeight: FontWeight.bold, - fontFamily: 'Monospace')), if (_historyProvider.pubkey != '') historyQuery(context, _historyProvider), ])); @@ -193,11 +167,18 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier { '/default_avatar.png'), height: 65); })), - Text(_historyProvider.pubkeyShort, - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.w800, - fontFamily: 'Monospace')), + GestureDetector( + onTap: () { + Clipboard.setData(ClipboardData( + text: _historyProvider.pubkey)); + _historyProvider.snackCopyKey(context); + }, + child: Text(_historyProvider.pubkeyShort, + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.w800, + fontFamily: 'Monospace')), + ), Container( padding: const EdgeInsets.fromLTRB( 30, 0, 15, 0), // .only(right: 15), diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 4517e54..56417c7 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,4 +1,5 @@ import 'package:gecko/globals.dart'; +import 'package:gecko/models/history.dart'; import 'package:gecko/models/home.dart'; import 'package:gecko/screens/history.dart'; import 'package:flutter/material.dart'; @@ -14,6 +15,7 @@ class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { HomeProvider _homeProvider = Provider.of(context); + HistoryProvider _historyProvider = Provider.of(context); return Scaffold( drawer: Drawer( child: Column( @@ -73,21 +75,37 @@ class HomeScreen extends StatelessWidget { icon: _homeProvider.searchIcon, color: Colors.grey[850], onPressed: () { + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) { + // return SearchList(); + // }), + // ); + if (_homeProvider.searchIcon.icon == Icons.search) { _homeProvider.searchIcon = Icon( Icons.close, color: Colors.grey[850], ); - TextField( + _homeProvider.appBarTitle = TextField( + autofocus: true, controller: _homeProvider.searchQuery, - style: new TextStyle( - color: Colors.white, + onChanged: (text) { + print("Clé tappé: $text"); + final String searchResult = + _historyProvider.isPubkey(text); + if (searchResult != '') { + _homeProvider.currentIndex = 0; + } + }, + style: TextStyle( + color: Colors.grey[850], ), - decoration: new InputDecoration( + decoration: InputDecoration( prefixIcon: - new Icon(Icons.search, color: Colors.white), - hintText: "Search...", - hintStyle: new TextStyle(color: Colors.white)), + Icon(Icons.search, color: Colors.grey[850]), + hintText: "Rechercher ...", + hintStyle: TextStyle(color: Colors.grey[850])), ); _homeProvider.handleSearchStart(); } else { diff --git a/lib/screens/search.dart b/lib/screens/search.dart index 2f7811a..1683092 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -1,33 +1,36 @@ import 'package:flutter/material.dart'; class SearchList extends StatefulWidget { - SearchList({ Key key }) : super(key: key); + SearchList({Key key}) : super(key: key); @override _SearchListState createState() => new _SearchListState(); - } -class _SearchListState extends State -{ - Widget appBarTitle = new Text("Search Sample", style: new TextStyle(color: Colors.white),); - Icon actionIcon = new Icon(Icons.search, color: Colors.white,); +class _SearchListState extends State { + Widget appBarTitle = new Text( + "Search Sample", + style: new TextStyle(color: Colors.white), + ); + Icon actionIcon = new Icon( + Icons.search, + color: Colors.white, + ); final key = new GlobalKey(); final TextEditingController _searchQuery = new TextEditingController(); List _list; - bool _IsSearching; + bool _isSearching; String _searchText = ""; _SearchListState() { _searchQuery.addListener(() { if (_searchQuery.text.isEmpty) { setState(() { - _IsSearching = false; + _isSearching = false; _searchText = ""; }); - } - else { + } else { setState(() { - _IsSearching = true; + _isSearching = true; _searchText = _searchQuery.text; }); } @@ -37,9 +40,8 @@ class _SearchListState extends State @override void initState() { super.initState(); - _IsSearching = false; + _isSearching = false; init(); - } void init() { @@ -64,7 +66,7 @@ class _SearchListState extends State appBar: buildBar(context), body: new ListView( padding: new EdgeInsets.symmetric(vertical: 8.0), - children: _IsSearching ? _buildSearchList() : _buildList(), + children: _isSearching ? _buildSearchList() : _buildList(), ), ); } @@ -75,70 +77,70 @@ class _SearchListState extends State List _buildSearchList() { if (_searchText.isEmpty) { - return _list.map((contact) => new ChildItem(contact)) - .toList(); - } - else { + return _list.map((contact) => new ChildItem(contact)).toList(); + } else { List _searchList = List(); for (int i = 0; i < _list.length; i++) { - String name = _list.elementAt(i); + String name = _list.elementAt(i); if (name.toLowerCase().contains(_searchText.toLowerCase())) { _searchList.add(name); } } - return _searchList.map((contact) => new ChildItem(contact)) - .toList(); + return _searchList.map((contact) => new ChildItem(contact)).toList(); } } Widget buildBar(BuildContext context) { - return new AppBar( - centerTitle: true, - title: appBarTitle, - actions: [ - new IconButton(icon: actionIcon, onPressed: () { - setState(() { - if (this.actionIcon.icon == Icons.search) { - this.actionIcon = new Icon(Icons.close, color: Colors.white,); - this.appBarTitle = new TextField( - controller: _searchQuery, - style: new TextStyle( - color: Colors.white, - - ), - decoration: new InputDecoration( - prefixIcon: new Icon(Icons.search, color: Colors.white), - hintText: "Search...", - hintStyle: new TextStyle(color: Colors.white) - ), - ); - _handleSearchStart(); - } - else { - _handleSearchEnd(); - } - }); - },), - ] - ); + return new AppBar(centerTitle: true, title: appBarTitle, actions: [ + new IconButton( + icon: actionIcon, + onPressed: () { + setState(() { + if (this.actionIcon.icon == Icons.search) { + this.actionIcon = new Icon( + Icons.close, + color: Colors.white, + ); + this.appBarTitle = new TextField( + controller: _searchQuery, + style: new TextStyle( + color: Colors.white, + ), + decoration: new InputDecoration( + prefixIcon: new Icon(Icons.search, color: Colors.white), + hintText: "Search...", + hintStyle: new TextStyle(color: Colors.white)), + ); + _handleSearchStart(); + } else { + _handleSearchEnd(); + } + }); + }, + ), + ]); } void _handleSearchStart() { setState(() { - _IsSearching = true; + _isSearching = true; }); } void _handleSearchEnd() { setState(() { - this.actionIcon = new Icon(Icons.search, color: Colors.white,); - this.appBarTitle = - new Text("Search Sample", style: new TextStyle(color: Colors.white),); - _IsSearching = false; + this.actionIcon = new Icon( + Icons.search, + color: Colors.white, + ); + this.appBarTitle = new Text( + "Search Sample", + style: new TextStyle(color: Colors.white), + ); + _isSearching = false; _searchQuery.clear(); }); } - } class ChildItem extends StatelessWidget { @@ -148,5 +150,4 @@ class ChildItem extends StatelessWidget { Widget build(BuildContext context) { return new ListTile(title: new Text(this.name)); } - -} \ No newline at end of file +} diff --git a/pubspec.lock b/pubspec.lock index a34da15..efabd63 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -100,7 +100,7 @@ packages: source: hosted version: "2.1.1" crypto: - dependency: transitive + dependency: "direct main" description: name: crypto url: "https://pub.dartlang.org" @@ -120,6 +120,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0-nullsafety.1" + fast_base58: + dependency: "direct main" + description: + name: fast_base58 + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.9" ffi: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 8b28242..62c0aa6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,8 @@ dependencies: printing: ^4.0.0 shared_preferences: ^0.5.12+4 sync_http: ^0.2.0 + crypto: ^2.1.5 + fast_base58: flutter_icons: