From 91bf7a653ecf1439703babc65303493313590f4c Mon Sep 17 00:00:00 2001
From: poka <poka@p2p.legal>
Date: Tue, 2 Feb 2021 20:33:09 +0100
Subject: [PATCH] Add Cs+ data

---
 assets/icon_user.png                          | Bin 0 -> 1724 bytes
 lib/main.dart                                 |   5 +-
 lib/models/cesiumPlus.dart                    | 124 ++++++++++++++++++
 lib/models/history.dart                       |  12 +-
 lib/models/home.dart                          |  11 ++
 lib/screens/history.dart                      |  69 +++++++++-
 .../myWallets/confirmWalletStorage.dart       |   2 +-
 lib/screens/myWallets/generateWallets.dart    |   1 +
 pubspec.lock                                  |   7 +
 pubspec.yaml                                  |   4 +-
 10 files changed, 221 insertions(+), 14 deletions(-)
 create mode 100644 assets/icon_user.png
 create mode 100644 lib/models/cesiumPlus.dart

diff --git a/assets/icon_user.png b/assets/icon_user.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbf8244fdb40c2fd5a03582a830c2652d31a79ec
GIT binary patch
literal 1724
zcmV;t21EIYP)<h;3K|Lk000e1NJLTq007|t007|#0{{R332h=s0001uP)t-s|Ns9Z
zA0Pk#03I3}KRrDk8XFrH7x?)22><{b7#S835)%v#!ok5tLqsSfB|SPj^78VZo}SOn
z&I|wr?d|O|FEHEM+T-KnV_{;%!@~~;2~SK-N=Qg^adED#t+%$ehJ=NDdV89gnU9T*
zFDoopRaMi|(`;&Mr>3Tqla#ZvvQ<-4fq#E*ZEj>@W2X0sI{*L$>PbXFRCt{2om-o#
zIt+%T$XOHxJfMy`%IF;b|Igd9SZ>F0P$;1ZuDo~L^?Q;wO=#0jhhZ3oVHk#C7=~dO
zhG7_nVHoCLW851q(|OnT7t_siZ;U-0U?#)45F&9+$1rrqbd%#(I-Fn+3yR6GD?(HI
ziJ1uh^$|qA?8DHwl9!_=$$o@Az?zKTZMQ&Pjw{|@um@R#Xeq9}^U7PrGQu9HEN_~3
zS6_x_JYf%23TrR)QUZ_jQS2@3;Z|oHmowmBGwxa!AZLkFL7=8N_6&Q-)mWAG&=a~?
zVGp_rD^XEjMw=w|WCR{1_OJ(Dma$#cMRRn~lI14YRa<1vIJ<TPjjt+U;u3F)J@_&l
z<R)Q`IA9O|J`;HhX1Mh8sp;)p;;usSembk;qZxvF!nlxKM^89DwuIYA#`+5*(%zt^
z_cPvmm?^f1Ta4?Q@MuKJJDYXAP?6)Uv1Qz#FSjARMAxuo6f=TwQqloq3*n@s-83#L
z{Z_+>v4s>7!8qyBO#^Hx1prM$!a@HK0x7hqR){zC(uy<g23tx209&>kvKu!aBHm{>
z3v4L`44@Pm18gb3W5rMk^_XVOEdUDmbQM0n4XuZthaDfvOAV^Ens=yp=)7Y~Dc}=q
zPqW09QowTpq%e8LmQnyfDKUp^ZZQE<NcMmY&^*)~Y$1g#VI-1Go+J+_TtoPOeqe(r
z3~BD!{;-E|Q?k)8qxRp!46?Bz!|K-Gd=vkHc&I-U$rjpjtbX16Lhln^XEJJ?HOUaP
zP1vdZ@4}&){GO><+9&*H?SD3Pawz))d-x@=2J)%C*(JWr<c#GbhE4g9!Z+Szr(%0f
z3BO975vE$a_=UC9Iqx<0u&W>;QEagXU5#y3iER_u={(t0PAQu98}@*!^AeX2{mGz}
zSM;o9$%`|FShgb2|H4cwaq~jA`;?RVdpv95ZH-2#4Y3DVkKlE8;~uFg;%BPopUPvs
zrNaJAq-l$E)z%64gXoZY!gfvLPj;*uy6M`smmbLeo{+(MdD^7iSTjtmAN%R%t(D>7
zK0!2@L{a-^9>XvU!!QiPFbu=|;{?$$$A8Quf7}~xrt@yx*9_Cp`f+zY-3%Y4|7EmV
z4?J6huIcDTULDr|^uG*+?G4r|`n^nU5sbD2A-v+Mx9$lMuV*dwT5GoK-%|HY<?gfB
zzRK`qyAy8du7a-Et=r|UqxUk_`(eqn1;?TOvRagA>UoVR{C1o+>CJ_7H#4!Idx-tS
zL|$KR#|7;u8GK0j=cOG#2nUbe4&rWCvZFd3t)&3!{2@L`hR0DKrguw**C!Y`hCl|)
z(FL{h3)Uyp&Ab!DJT>y6u8*Ecd_uqZ#~#!j=kJ(wP7IGc$SHV6_lT@FqtZD<b%`X-
zgN;BJ(Mt>p*Dqcg6sS?SVKO$Ga?u>!L|$$p>AufpF?Xmzqt5-9(h^bcdhOu@{Wabf
zp1>jWR_%B2_NZVz_U=kVT2QTBqjBOJ22wZrJzPF`4{whl5Uf{A888}21Rx!C%cA$y
zm#02d1d20>^6RrTE{e*bJXr+mb6FPE{V<g-GdYSE8?g3z<<Yw;1p+k_s)kY{E>zFL
z3{zp>R**(J)lt}*XNqA$O>>o{QDB|tsv=bV>))!~&YVe9-S<|PQ~bnJBM@nw$xyV`
z0QC-(K}{<+OH;p}IiYJRl6^!cRph21ujR<1<oS{Xo|CHSxIa;y`d(r;AM{buiZcot
zEul`s<3wzJTQhI^XVY!WdD8+dToWFHe$x>VEw4Dycz%Jr&?u;7fW3GmOW5>lv&c)S
zf?bXBO7Kq_uMC5|B_m7Y@0Vbk@My$_6=E-?$HlZ+fffOU&4&DdfWl_~m4ZFuSVLj6
zXQUoq;p5N44q~A#r}5W<KhSq=O&?hRd3n1I&A-~c!A&m0=3m*deAIfWub}81E%54z
zVxi{1@K)Hat{&G`*DpGF`trM~@%K-JuU;|?!!QiPFbu;m48t%C!!QiP+~+^|uVu3(
SDJ8G~0000<MNUMnLSTZR)I<gV

literal 0
HcmV?d00001

diff --git a/lib/main.dart b/lib/main.dart
index 39ea86e6..84eda74c 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,5 +1,6 @@
 import 'package:dubp/dubp.dart';
 import 'package:gecko/globals.dart';
+import 'package:gecko/models/cesiumPlus.dart';
 import 'package:gecko/models/generateWallets.dart';
 import 'package:gecko/models/history.dart';
 import 'package:gecko/models/home.dart';
@@ -24,6 +25,7 @@ Future<void> main() async {
   WidgetsFlutterBinding.ensureInitialized();
   HomeProvider _homeProvider = HomeProvider();
   await _homeProvider.getAppPath();
+  await _homeProvider.createDefaultAvatar();
   appVersion = await _homeProvider.getAppVersion();
   prefs = await SharedPreferences.getInstance();
 
@@ -88,7 +90,8 @@ class Gecko extends StatelessWidget {
           ChangeNotifierProvider(create: (_) => HistoryProvider('')),
           ChangeNotifierProvider(create: (_) => MyWalletsProvider()),
           ChangeNotifierProvider(create: (_) => GenerateWalletsProvider()),
-          ChangeNotifierProvider(create: (_) => WalletOptionsProvider())
+          ChangeNotifierProvider(create: (_) => WalletOptionsProvider()),
+          ChangeNotifierProvider(create: (_) => CesiumPlusProvider())
         ],
         child: GraphQLProvider(
             client: _client,
diff --git a/lib/models/cesiumPlus.dart b/lib/models/cesiumPlus.dart
new file mode 100644
index 00000000..4c4bb7a3
--- /dev/null
+++ b/lib/models/cesiumPlus.dart
@@ -0,0 +1,124 @@
+import 'dart:convert';
+import 'dart:io';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:gecko/globals.dart';
+import 'package:http/http.dart' as http;
+import 'package:path_provider/path_provider.dart';
+
+class CesiumPlusProvider with ChangeNotifier {
+  // String pubkey = '';
+  // CesiumPlusProvider(this.pubkey);
+  var decodedBytes;
+  var avatar64;
+  TextEditingController cesiumName = TextEditingController();
+  int iAvatar = 0;
+  bool isComplete = false;
+
+  Future<List> _buildQuery(_pubkey) async {
+    var queryGetAvatar = json.encode({
+      "query": {
+        "bool": {
+          "should": [
+            {
+              "match": {
+                '_id': {"query": _pubkey, "boost": 2}
+              }
+            },
+            {
+              "prefix": {'_id': _pubkey}
+            }
+          ]
+        }
+      },
+      "highlight": {
+        "fields": {"title": {}, "tags": {}}
+      },
+      "from": 0,
+      "size": 100,
+      "_source": [
+        "title",
+        "avatar",
+        "avatar._content_type",
+        "description",
+        "city",
+        "address",
+        "socials.url",
+        "creationTime",
+        "membersCount",
+        "type"
+      ],
+      "indices_boost": {"user": 100, "page": 1, "group": 0.01}
+    });
+
+    String cesiumPod = "https://g1.data.le-sou.org";
+    String requestUrl = "/user,page,group/profile,record/_search";
+    String podRequest = cesiumPod + requestUrl;
+
+    Map<String, String> headers = {
+      'Content-type': 'application/json',
+      'Accept': 'application/json',
+    };
+
+    return [podRequest, queryGetAvatar, headers];
+  }
+
+  Future<String> getName(String _pubkey) async {
+    String _name;
+
+    List queryOptions = await _buildQuery(_pubkey);
+    final response = await http.post(queryOptions[0],
+        body: queryOptions[1], headers: queryOptions[2]);
+    // print('RESULT CESIUM QUERY: ${response.body}'); //For debug
+    final responseJson = json.decode(response.body);
+    if (responseJson['hits']['hits'].toString() == '[]') {
+      return '';
+    }
+    final bool avatarExist =
+        responseJson['hits']['hits'][0]['_source'].containsKey("title");
+    if (!avatarExist) {
+      return '';
+    }
+    _name = responseJson['hits']['hits'][0]['_source']['title'];
+    print(_name);
+
+    return _name;
+  }
+
+  Future<List> getAvatar(String _pubkey) async {
+    List queryOptions = await _buildQuery(_pubkey);
+    final response = await http.post(queryOptions[0],
+        body: queryOptions[1], headers: queryOptions[2]);
+    // print('RESULT CESIUM QUERY: ${response.body}'); //For debug
+    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')];
+    }
+    final _avatar =
+        responseJson['hits']['hits'][0]['_source']['avatar']['_content'];
+
+    var avatarFile =
+        File('${(await getTemporaryDirectory()).path}/avatar$iAvatar.png');
+    // final bool _isAvatarExist = await avatarFile.exists();
+    // if (_isAvatarExist) {
+    //   await avatarFile.delete();
+    // }
+    await avatarFile.writeAsBytes(base64.decode(_avatar));
+    iAvatar++;
+    isComplete = true;
+
+    return [avatarFile];
+  }
+
+  // isNameComplete() {
+  //   while (isComplete == false) {
+  //     print(isComplete);
+  //     Duration(milliseconds: 50);
+  //   }
+  // }
+}
diff --git a/lib/models/history.dart b/lib/models/history.dart
index 8f1293c1..59cb1268 100644
--- a/lib/models/history.dart
+++ b/lib/models/history.dart
@@ -12,7 +12,7 @@ class HistoryProvider with ChangeNotifier {
   // String pubkey = 'D2meevcAHFTS2gQMvmRW5Hzi25jDdikk4nC4u1FkwRaU'; // For debug
   String pubkey = '';
   HistoryProvider(this.pubkey);
-  final TextEditingController _outputPubkey = new TextEditingController();
+  final TextEditingController outputPubkey = new TextEditingController();
   bool isTheEnd = false;
   List transBC;
   bool isFirstBuild = true;
@@ -33,7 +33,7 @@ class HistoryProvider with ChangeNotifier {
       return 'false';
     }
     if (barcode != null) {
-      this._outputPubkey.text = barcode;
+      this.outputPubkey.text = barcode;
       isPubkey(barcode);
     } else {
       return 'false';
@@ -54,7 +54,7 @@ class HistoryProvider with ChangeNotifier {
       print("C'est une pubkey !!!");
 
       this.pubkey = pubkey;
-      this._outputPubkey.text = pubkey;
+      this.outputPubkey.text = pubkey;
       notifyListeners();
 
       return pubkey;
@@ -149,8 +149,6 @@ class HistoryProvider with ChangeNotifier {
   snackNode(context) {
     if (isFirstBuild) {
       String _message;
-      print('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA');
-      print(endPointGVA);
       if (endPointGVA == 'HS') {
         _message =
             "Aucun noeud Duniter disponible, veuillez réessayer ultérieurement";
@@ -165,12 +163,12 @@ class HistoryProvider with ChangeNotifier {
   }
 
   void resetdHistory() {
-    this._outputPubkey.text = '';
+    this.outputPubkey.text = '';
     notifyListeners();
   }
 
   num removeDecimalZero(double n) {
-    String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 1);
+    String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 2);
     return num.parse(result);
   }
 
diff --git a/lib/models/home.dart b/lib/models/home.dart
index 73ee6945..3fc78b6a 100644
--- a/lib/models/home.dart
+++ b/lib/models/home.dart
@@ -2,6 +2,7 @@ import 'dart:io';
 import 'dart:math';
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
 import 'dart:async';
 import 'package:gecko/globals.dart';
 import 'package:package_info/package_info.dart';
@@ -63,6 +64,16 @@ class HomeProvider with ChangeNotifier {
     }
   }
 
+  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<T>(List<T> list) {
     final random = new Random();
     var i = random.nextInt(list.length);
diff --git a/lib/screens/history.dart b/lib/screens/history.dart
index 9bea1569..aca33f3f 100644
--- a/lib/screens/history.dart
+++ b/lib/screens/history.dart
@@ -1,4 +1,8 @@
+import 'dart:io';
+
 import 'package:flutter/services.dart';
+import 'package:gecko/globals.dart';
+import 'package:gecko/models/cesiumPlus.dart';
 import 'package:gecko/models/queries.dart';
 import 'package:gecko/models/history.dart';
 import 'package:flutter/material.dart';
@@ -16,6 +20,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
   // HistoryProvider _historyProvider;
   final _formKey = GlobalKey<FormState>();
   FocusNode _pubkeyFocus = FocusNode();
+  List cesiumData;
 
   FetchMore fetchMore;
   FetchMoreOptions opts;
@@ -49,7 +54,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
           ),
         ),
         body: Column(children: <Widget>[
-          SizedBox(height: 8),
+          SizedBox(height: 20),
           TextField(
               autofocus: false,
               focusNode: _pubkeyFocus,
@@ -80,6 +85,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
   historyQuery(context) {
     _pubkeyFocus.unfocus();
     HistoryProvider _historyProvider = Provider.of<HistoryProvider>(context);
+    CesiumPlusProvider _cesiumPlusProvider =
+        Provider.of<CesiumPlusProvider>(context);
     return Expanded(
         child: Column(
       mainAxisAlignment: MainAxisAlignment.start,
@@ -122,6 +129,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
             opts = _historyProvider.checkQueryResult(result, opts);
 
             // Build history list
+            // _cesiumPlusProvider.cesiumName.text = "NAMEE";
             return NotificationListener(
                 child: Expanded(
                     child: ListView(
@@ -131,13 +139,51 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                     if (_historyProvider.pubkey != '')
                       Row(
                           mainAxisAlignment: MainAxisAlignment.spaceBetween,
+                          mainAxisSize: MainAxisSize.min,
+                          crossAxisAlignment: CrossAxisAlignment.center,
                           children: [
-                            Container(width: 70.0, height: 0.0),
+                            Container(
+                                padding: const EdgeInsets.only(left: 30),
+                                child: FutureBuilder(
+                                    future: _cesiumPlusProvider
+                                        .getAvatar(_historyProvider.pubkey),
+                                    initialData: [
+                                      File(appPath.path + '/default_avatar.png')
+                                    ],
+                                    builder: (BuildContext context,
+                                        AsyncSnapshot<List> _avatar) {
+                                      cesiumData = _avatar.data;
+                                      // _cesiumPlusProvider.isComplete = true;
+                                      if (_avatar.connectionState !=
+                                          ConnectionState.done) {
+                                        return Image.file(
+                                            File(appPath.path +
+                                                '/default_avatar.png'),
+                                            height: 65);
+                                      }
+                                      if (_avatar.hasError) {
+                                        return Image.file(
+                                            File(appPath.path +
+                                                '/default_avatar.png'),
+                                            height: 65);
+                                      }
+                                      if (_avatar.hasData) {
+                                        return SingleChildScrollView(
+                                            padding: EdgeInsets.all(0.0),
+                                            child: Image.file(_avatar.data[0],
+                                                height: 65));
+                                      }
+                                      return Image.file(
+                                          File(appPath.path +
+                                              '/default_avatar.png'),
+                                          height: 65);
+                                    })),
                             Text(balance.toString() + ' Äž1',
                                 textAlign: TextAlign.center,
                                 style: TextStyle(fontSize: 30.0)),
                             Container(
-                                padding: const EdgeInsets.only(right: 15),
+                                padding: const EdgeInsets.fromLTRB(
+                                    30, 0, 15, 0), // .only(right: 15),
                                 child: IconButton(
                                     icon: Icon(Icons.payments),
                                     onPressed: () {
@@ -150,7 +196,22 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
                                     iconSize: 30,
                                     color: Color(0xFFB16E16)))
                           ]),
-                    SizedBox(height: 15),
+                    SizedBox(height: 10),
+                    Row(
+                        mainAxisAlignment: MainAxisAlignment.spaceAround,
+                        crossAxisAlignment: CrossAxisAlignment.center,
+                        children: [
+                          Container(
+                              // padding: const EdgeInsets.,
+                              child: FutureBuilder(
+                                  future: _cesiumPlusProvider
+                                      .getName(_historyProvider.pubkey),
+                                  initialData: '',
+                                  builder: (context, snapshot) {
+                                    return Text(snapshot.data);
+                                  }))
+                        ]),
+                    SizedBox(height: 20),
                     const Divider(
                       color: Colors.grey,
                       height: 5,
diff --git a/lib/screens/myWallets/confirmWalletStorage.dart b/lib/screens/myWallets/confirmWalletStorage.dart
index e64188c5..b4b81bd2 100644
--- a/lib/screens/myWallets/confirmWalletStorage.dart
+++ b/lib/screens/myWallets/confirmWalletStorage.dart
@@ -49,7 +49,7 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
                   }),
               title: SizedBox(
                 height: 22,
-                child: Text('Confirmez ce portefeuille'),
+                child: Text('Enregistrer ce portefeuille'),
               )),
           body: Center(
             child: Column(children: <Widget>[
diff --git a/lib/screens/myWallets/generateWallets.dart b/lib/screens/myWallets/generateWallets.dart
index c0850971..e48ce21e 100644
--- a/lib/screens/myWallets/generateWallets.dart
+++ b/lib/screens/myWallets/generateWallets.dart
@@ -157,6 +157,7 @@ class GenerateWalletsScreen extends StatelessWidget {
             child: Row(
                 mainAxisAlignment: MainAxisAlignment.center,
                 children: <Widget>[
+                  SizedBox(width: 20),
                   Column(children: <Widget>[
                     SizedBox(
                         width: 30,
diff --git a/pubspec.lock b/pubspec.lock
index 68051eff..299602e9 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -574,6 +574,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "0.9.6"
+  sync_http:
+    dependency: "direct main"
+    description:
+      name: sync_http
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.2.0"
   term_glyph:
     dependency: transitive
     description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 76c4b843..bb3adfca 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -5,7 +5,7 @@ description: A new Flutter project.
 # 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.1+0
+version: 0.0.1+2
 
 environment:
   sdk: ">=2.7.0 <3.0.0"
@@ -31,6 +31,7 @@ dependencies:
   package_info: ^0.4.3+2
   printing: ^4.0.0
   shared_preferences: ^0.5.12+4
+  sync_http: ^0.2.0
 
 
 flutter_icons:
@@ -53,3 +54,4 @@ flutter:
     - assets/icon/gecko_final.png
     - assets/
     - assets/OpenSans-Regular.ttf
+    - assets/icon_user.png
-- 
GitLab