From d81da9debfa7a1020f49f5d5d5d0a55e7c69edb2 Mon Sep 17 00:00:00 2001
From: Benoit Lavenier <benoit.lavenier@e-is.pro>
Date: Sat, 28 May 2016 19:54:27 +0200
Subject: [PATCH] Fix local storage + add remember me option

---
 package.json                               |  2 +-
 www/i18n/locale-en.json                    |  1 +
 www/i18n/locale-fr-FR.json                 |  1 +
 www/js/config.js                           |  4 +-
 www/js/controllers/app-controllers.js      | 10 +----
 www/js/controllers/settings-controllers.js | 43 ++++++++--------------
 www/js/services/wallet-services.js         | 38 ++++++++-----------
 www/templates/settings/settings.html       | 11 ++++++
 8 files changed, 49 insertions(+), 61 deletions(-)

diff --git a/package.json b/package.json
index e15ca95b0..fa5eca2a9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cesium",
-  "version": "0.1.3",
+  "version": "0.1.4",
   "description": "A webapp client for Duniter network",
   "dependencies": {
     "gulp": "^3.9.1",
diff --git a/www/i18n/locale-en.json b/www/i18n/locale-en.json
index f5a3e4346..02e9c1eb3 100644
--- a/www/i18n/locale-en.json
+++ b/www/i18n/locale-en.json
@@ -58,6 +58,7 @@
     "NODE": "Duniter Node",
     "NODE_HELP": "server.domain.com:port",
     "USE_LOCAL_STORAGE": "Enable local storage",
+    "REMEMBER_ME": "Remember me",
     "POPUP_NODE": {
       "TITLE" : "Duniter Node",
       "HELP" : "Set the address of the node to use:"
diff --git a/www/i18n/locale-fr-FR.json b/www/i18n/locale-fr-FR.json
index 42cc28279..3ac8c44ac 100644
--- a/www/i18n/locale-fr-FR.json
+++ b/www/i18n/locale-fr-FR.json
@@ -58,6 +58,7 @@
     "NODE": "Noeud Duniter",
     "NODE_HELP": "server.domain.com:port",
     "USE_LOCAL_STORAGE": "Activer le stockage local",
+    "REMEMBER_ME": "Se rappeller de moi",
     "POPUP_NODE": {
       "TITLE" : "Noeud Duniter",
       "HELP" : "Saisissez l'adresse du noeud que vous voulez utiliser :"
diff --git a/www/js/config.js b/www/js/config.js
index ee8122747..54af8481c 100644
--- a/www/js/config.js
+++ b/www/js/config.js
@@ -14,8 +14,8 @@ angular.module("cesium.config", [])
 	"TIMEOUT": 4000,
 	"DEBUG": false,
 	"NATIVE_TRANSITION": false,
-	"VERSION": "0.1.3",
-	"BUILD_DATE": "2016-05-26T23:07:50.994Z"
+	"VERSION": "0.1.4",
+	"BUILD_DATE": "2016-05-28T17:53:04.922Z"
 })
 
 ;
\ No newline at end of file
diff --git a/www/js/controllers/app-controllers.js b/www/js/controllers/app-controllers.js
index a19698bea..b44c534d4 100644
--- a/www/js/controllers/app-controllers.js
+++ b/www/js/controllers/app-controllers.js
@@ -68,8 +68,7 @@ function LoginModalController($scope, $rootScope, $ionicModal, Wallet, CryptoUti
   };
 
   // Login and load wallet
-  $scope.loadWallet = function(allowCancel) {
-    if (!allowCancel) {allowCancel = false;}
+  $scope.loadWallet = function() {
     return $q(function(resolve, reject){
 
       if (!Wallet.isLogin()) {
@@ -95,12 +94,7 @@ function LoginModalController($scope, $rootScope, $ionicModal, Wallet, CryptoUti
                     .catch(UIUtils.onError('ERROR.LOAD_WALLET_DATA_ERROR', reject));
                 },
                 function() { // user cancel callback
-                  if (allowCancel) {
-                    resolve();
-                  }
-                  else {
-                    reject();
-                  }
+                  reject('CANCELLED');
                 });
             }
           })
diff --git a/www/js/controllers/settings-controllers.js b/www/js/controllers/settings-controllers.js
index 0aff62acf..7fcf6f7cf 100644
--- a/www/js/controllers/settings-controllers.js
+++ b/www/js/controllers/settings-controllers.js
@@ -25,30 +25,23 @@ function SettingsController($scope, $state, UIUtils, Wallet, $translate, BMA, $q
       {id:'fr-FR', label:'Français'},
       {id:'en', label:'English'}
     ];
-  $scope.formData = { // Init with default settings
-    useRelative: Wallet.defaultSettings.useRelative,
-    node: Wallet.defaultSettings.node,
-    useLocalStorage: Wallet.defaultSettings.useLocalStorage
-  }
-  $scope.formData.locale = _.findWhere($scope.locales, {id: $translate.use()});
+  $scope.formData = angular.copy(Wallet.defaultSettings);
   $scope.loading = true;
 
   $scope.$on('$ionicView.enter', function(e, $state) {
     $scope.loading = true; // to avoid the call of Wallet.store()
-    $scope.loadWallet(true/*allowCancel*/)
-      .then(function(walletData) {
-        if (walletData) {
-          $scope.formData.useRelative = walletData.settings.useRelative;
-          $scope.formData.node = walletData.settings.node;
-          $scope.formData.useLocalStorage = walletData.settings.useLocalStorage;
-          if (walletData.settings.locale && walletData.settings.locale.id) {
-            $scope.formData.locale = _.findWhere($scope.locales, {id: walletData.settings.locale.id});
-          }
-        }
-        UIUtils.loading.hide();
-        $scope.loading = false;
-      })
-      .catch(UIUtils.onError());
+    $scope.formData.locale = _.findWhere($scope.locales, {id: $translate.use()}); 
+    Wallet.restore()
+    .then(function() {
+      angular.merge($scope.formData, Wallet.data.settings);
+      $scope.formData.locale = _.findWhere($scope.locales, {id: Wallet.data.settings.locale.id});
+      UIUtils.loading.hide();
+      $scope.loading = false;
+    })
+    .catch(function(err) {
+      $scope.loading = false;
+      UIUtils.loading.hide();
+    });
   });
 
   $scope.setSettingsForm = function(settingsForm) {
@@ -132,17 +125,11 @@ function SettingsController($scope, $state, UIUtils, Wallet, $translate, BMA, $q
 
   $scope.onSettingsChanged = function() {
     if (!$scope.loading) {
-      Wallet.data.settings.useRelative = $scope.formData.useRelative;
-      Wallet.data.settings.node = $scope.formData.node;
-      Wallet.data.settings.locale.id = $scope.formData.locale.id;
-      Wallet.data.settings.useLocalStorage = $scope.formData.useLocalStorage;
+      angular.merge(Wallet.data.settings, $scope.formData);
       Wallet.store();
     }
   };
-  $scope.$watch('formData.useRelative', $scope.onSettingsChanged, true);
-  $scope.$watch('formData.node', $scope.onSettingsChanged, true);
-  $scope.$watch('formData.locale', $scope.onSettingsChanged, true);
-  $scope.$watch('formData.useLocalStorage', $scope.onSettingsChanged, true);
+  $scope.$watch('formData', $scope.onSettingsChanged, true);
 
   // Set Ink
   $timeout(function() {
diff --git a/www/js/services/wallet-services.js b/www/js/services/wallet-services.js
index f31249453..5eb79b4c4 100644
--- a/www/js/services/wallet-services.js
+++ b/www/js/services/wallet-services.js
@@ -12,8 +12,8 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
       useRelative: true,
       timeWarningExpire: 129600 /*TODO: =1.5j est-ce suffisant ?*/,
       useLocalStorage: false,
-      node: BMA.node.url,
-      locale: {id: $translate.use()}
+      rememberMe: false,
+      node: BMA.node.url
     },
 
     data = {
@@ -32,7 +32,7 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
         medianTime: null,
         history: {},
         requirements: {},
-        isMember: false,
+        isMember: false,  
         loaded: false,
         blockUid: null,
         members: [],
@@ -40,13 +40,14 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
         settings: {
           useRelative: defaultSettings.useRelative,
           timeWarningExpire: defaultSettings.timeWarningExpire,
-          locale: defaultSettings.locale,
+          locale: {id: $translate.use()},
           useLocalStorage: defaultSettings.useLocalStorage,
+          rememberMe: defaultSettings.rememberMe,
           node: defaultSettings.node
         }
     },
 
-    resetData = function(resetSettings) {
+    resetData = function() {
       data.pubkey= null;
       data.keypair ={
                 signSk: null,
@@ -66,11 +67,13 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
       data.blockUid = null;
       data.members = [];
       data.avatar = null;
-      if (!!resetSettings) {
+      if (!data.settings.useLocalStorage) {
         data.settings = {
           useRelative: defaultSettings.useRelative,
           timeWarningExpire: defaultSettings.timeWarningExpire,
+          locale: {id: $translate.use()},
           useLocalStorage: defaultSettings.useLocalStorage,
+          rememberMe: defaultSettings.rememberMe,
           node: BMA.node.url // If changed, use the updated url
         };
       }
@@ -148,6 +151,9 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
                     // Copy result to properties
                     data.pubkey = CryptoUtils.util.encode_base58(keypair.signPk);
                     data.keypair = keypair;
+                    if (data.settings.useLocalStorage) {
+                      store();
+                    }
                     resolve(data);
                 }
             );
@@ -157,11 +163,8 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
     logout = function(username, password) {
       return $q(function(resolve, reject) {
 
-        var resetSettings = !data.settings.useLocalStorage;
-        resetData(resetSettings);
-        if (data.settings.useLocalStorage) {
-          store();
-        }
+        resetData(); // will reset keypair
+        store(); // store (if local storage enable)
         resolve();
       });
     },
@@ -174,7 +177,7 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
       if (data.settings.useLocalStorage) {
         localStorage.setObject('CESIUM_SETTINGS', data.settings);
 
-        if (isLogin()) {
+        if (isLogin() && data.settings.rememberMe) {
           var dataToStore = {
             keypair: data.keypair,
             pubkey: data.pubkey
@@ -191,7 +194,7 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
       }
     },
 
-    restore = function(enableLoadData) {
+    restore = function() {
       return $q(function(resolve, reject){
         var settings = localStorage.getObject('CESIUM_SETTINGS');
         var dataStr = localStorage.get('CESIUM_DATA');
@@ -214,15 +217,6 @@ angular.module('cesium.wallet.services', ['ngResource', 'cesium.bma.services', '
               data.keypair = storedData.keypair;
               data.pubkey = storedData.pubkey;
               data.loaded = false;
-              if (enableLoadData) {
-                loadData()
-                .then(function() {
-                  resolve();
-                })
-                .catch(function(err) {
-                  reject(err);
-                });
-              }
             }
             resolve();
           })
diff --git a/www/templates/settings/settings.html b/www/templates/settings/settings.html
index e4fce26d1..734829233 100644
--- a/www/templates/settings/settings.html
+++ b/www/templates/settings/settings.html
@@ -23,6 +23,16 @@
         </select>
       </label>
 
+      <div class="item item-toggle dark">
+        {{'SETTINGS.REMEMBER_ME' | translate}}
+        <label class="toggle toggle-royal">
+          <input type="checkbox" ng-model="formData.rememberMe" >
+          <div class="track">
+            <div class="handle"></div>
+          </div>
+        </label>
+      </div>
+
       <span class="item item-divider">
         {{'SETTINGS.TECHNICAL_SETTINGS' | translate}}
       </span>
@@ -42,5 +52,6 @@
         </label>
       </div>
 
+
     </ion-content>
 </ion-view>
-- 
GitLab