From 290deb5979d4662bd4f5531645d12c5d8ebb8275 Mon Sep 17 00:00:00 2001 From: Sun Date: Wed, 15 Dec 2021 16:24:39 +0800 Subject: [PATCH] Wallet: support set main account function --- lib/apps/wallet/models.dart | 4 +++- lib/apps/wallet/page.dart | 26 ++++++++++++++++++++++---- lib/l10n/localizations.dart | 2 ++ lib/l10n/localizations_en.dart | 4 ++++ lib/l10n/localizations_zh.dart | 4 ++++ src/apps/wallet/models.rs | 25 ++++++++++++++++++++----- src/apps/wallet/rpc.rs | 10 ++++++++++ src/migrate/wallet.rs | 1 + 8 files changed, 66 insertions(+), 10 deletions(-) diff --git a/lib/apps/wallet/models.dart b/lib/apps/wallet/models.dart index f16071d..5f4577f 100644 --- a/lib/apps/wallet/models.dart +++ b/lib/apps/wallet/models.dart @@ -176,6 +176,7 @@ class Address { String name = ''; String address = ''; bool isGen = true; + bool isMain = false; Map balances = {}; String icon() { @@ -265,7 +266,8 @@ class Address { this.name = params[3]; this.address = params[4]; this.isGen = params[5]; - this.split_balance(params[6]); + this.isMain = params[6]; + this.split_balance(params[7]); } } diff --git a/lib/apps/wallet/page.dart b/lib/apps/wallet/page.dart index f07690a..8be4dd5 100644 --- a/lib/apps/wallet/page.dart +++ b/lib/apps/wallet/page.dart @@ -131,8 +131,11 @@ class _WalletDetailState extends State with SingleTickerProviderSt if (res.isOk) { this._addresses.clear(); res.params.forEach((param) { - print(param); - this._addresses.add(Address.fromList(param)); + final address = Address.fromList(param); + this._addresses.add(address); + if (address.isMain) { + _changeAddress(address); + } }); if (this._addresses.length == 0) { this._needGenerate = true; @@ -166,6 +169,15 @@ class _WalletDetailState extends State with SingleTickerProviderSt ]); } + _setMain() { + rpc.send('wallet-main', [this._selectedAddress!.id]); + for (int i=0;i with SingleTickerProviderSt List> addressWidges = []; this._addresses.asMap().forEach((index, value) { - addressWidges.add(_menuItem(index + 3, value, color, value == this._selectedAddress)); + addressWidges.add(_menuItem(index + 3, value, color, value == this._selectedAddress, lang)); }); return Scaffold( @@ -247,6 +259,10 @@ class _WalletDetailState extends State with SingleTickerProviderSt }).toList(), ), actions: [ + TextButton( + onPressed: this._selectedAddress!.isMain ? null : _setMain, + child: Text(this._selectedAddress!.isMain ? lang.main : lang.setMain) + ), Padding( padding: const EdgeInsets.symmetric(horizontal: 20.0), child: PopupMenuButton( @@ -555,13 +571,15 @@ class _WalletDetailState extends State with SingleTickerProviderSt ); } - PopupMenuEntry _menuItem(int value, Address address, ColorScheme color, bool selected) { + PopupMenuEntry _menuItem(int value, Address address, ColorScheme color, bool selected, lang) { return PopupMenuItem( value: value, child: ListTile( leading: Icon(Icons.check, color: selected ? color.onSurface : Colors.transparent), title: Text(address.name), subtitle: Text(address.balance(this._selectedNetwork!) + ' ' + address.chain.symbol), + trailing: Text(address.isMain ? lang.main : '', + style: TextStyle(fontStyle: FontStyle.italic)), ), ); } diff --git a/lib/l10n/localizations.dart b/lib/l10n/localizations.dart index 3ab78c3..eea8851 100644 --- a/lib/l10n/localizations.dart +++ b/lib/l10n/localizations.dart @@ -268,6 +268,8 @@ abstract class AppLocalizations { String get walletIntro; String get secretKey; String get contract; + String get main; + String get setMain; } class _AppLocalizationsDelegate diff --git a/lib/l10n/localizations_en.dart b/lib/l10n/localizations_en.dart index d56ef20..9ef2b36 100644 --- a/lib/l10n/localizations_en.dart +++ b/lib/l10n/localizations_en.dart @@ -439,4 +439,8 @@ class AppLocalizationsEn extends AppLocalizations { String get secretKey => 'Secret Key'; @override String get contract => 'Contract Address'; + @override + String get main => 'Main'; + @override + String get setMain => 'Set to main'; } diff --git a/lib/l10n/localizations_zh.dart b/lib/l10n/localizations_zh.dart index f6819db..c3665eb 100644 --- a/lib/l10n/localizations_zh.dart +++ b/lib/l10n/localizations_zh.dart @@ -439,4 +439,8 @@ class AppLocalizationsZh extends AppLocalizations { String get secretKey => '私钥'; @override String get contract => '合约地址'; + @override + String get main => '主'; + @override + String get setMain => '设为主账户'; } diff --git a/src/apps/wallet/models.rs b/src/apps/wallet/models.rs index 1e0dc34..cc32f0e 100644 --- a/src/apps/wallet/models.rs +++ b/src/apps/wallet/models.rs @@ -117,6 +117,7 @@ pub(crate) struct Address { pub id: i64, pub chain: ChainToken, pub index: i64, + pub main: bool, pub name: String, pub address: String, /// Encrypted secret key. @@ -177,6 +178,7 @@ impl Address { chain, index, address, + main: false, name: format!("Account {}", index), secret: vec![], balance: "".to_owned(), @@ -191,6 +193,7 @@ impl Address { address, secret, index: 0, + main: false, balance: "".to_owned(), id: 0, } @@ -204,6 +207,7 @@ impl Address { self.name, self.address, self.is_gen(), + self.main, self.balance, ]) } @@ -214,6 +218,7 @@ impl Address { secret: base64::decode(v.pop().unwrap().as_str()).unwrap_or(vec![]), address: v.pop().unwrap().as_string(), name: v.pop().unwrap().as_string(), + main: v.pop().unwrap().as_bool(), index: v.pop().unwrap().as_i64(), chain: ChainToken::from_i64(v.pop().unwrap().as_i64()), id: v.pop().unwrap().as_i64(), @@ -231,9 +236,10 @@ impl Address { } let sql = format!( - "INSERT INTO addresses (chain, indx, name, address, secret, balance) VALUES ({}, {}, '{}', '{}', '{}', '{}')", + "INSERT INTO addresses (chain, indx, main, name, address, secret, balance) VALUES ({}, {}, {}, '{}', '{}', '{}', '{}')", self.chain.to_i64(), self.index, + self.main, self.name, self.address, base64::encode(&self.secret), @@ -245,8 +251,8 @@ impl Address { } pub fn list(db: &DStorage) -> Result> { - let matrix = - db.query("SELECT id, chain, indx, name, address, secret, balance FROM addresses")?; + let matrix = db + .query("SELECT id, chain, indx, main, name, address, secret, balance FROM addresses")?; let mut addresses = vec![]; for values in matrix { addresses.push(Self::from_values(values)); @@ -256,7 +262,7 @@ impl Address { pub fn get(db: &DStorage, id: &i64) -> Result { let mut matrix = db.query(&format!( - "SELECT id, chain, indx, name, address, secret, balance FROM addresses WHERE id = {}", + "SELECT id, chain, indx, main, name, address, secret, balance FROM addresses WHERE id = {}", id ))?; if matrix.len() > 0 { @@ -268,7 +274,7 @@ impl Address { pub fn get_by_address(db: &DStorage, address: &str) -> Result { let mut matrix = db.query(&format!( - "SELECT id, chain, indx, name, address, secret, balance FROM addresses WHERE address = '{}'", + "SELECT id, chain, indx, main, name, address, secret, balance FROM addresses WHERE address = '{}'", address ))?; if matrix.len() > 0 { @@ -317,6 +323,15 @@ impl Address { Ok(()) } + pub fn main(db: &DStorage, id: &i64) -> Result<()> { + db.update("UPDATE addresses SET main = false")?; + db.update(&format!( + "UPDATE addresses SET main = true WHERE id = {}", + id + ))?; + Ok(()) + } + pub fn _delete(db: &DStorage, id: &i64) -> Result<()> { let sql = format!("DELETE FROM addresses WHERE id = {}", id); db.delete(&sql)?; diff --git a/src/apps/wallet/rpc.rs b/src/apps/wallet/rpc.rs index 0486474..5de2c5c 100644 --- a/src/apps/wallet/rpc.rs +++ b/src/apps/wallet/rpc.rs @@ -588,4 +588,14 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { } }, ); + + handler.add_method( + "wallet-main", + |gid: GroupId, params: Vec, state: Arc| async move { + let id = params[0].as_i64().ok_or(RpcError::ParseError)?; + let db = wallet_db(state.layer.read().await.base(), &gid)?; + Address::main(&db, &id)?; + Ok(HandleResult::new()) + }, + ); } diff --git a/src/migrate/wallet.rs b/src/migrate/wallet.rs index 69d1afe..77e56b5 100644 --- a/src/migrate/wallet.rs +++ b/src/migrate/wallet.rs @@ -4,6 +4,7 @@ pub(super) const WALLET_VERSIONS: [&str; 5] = [ id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, chain INTEGER NOT NULL, indx INTEGER NOT NULL, + main INTEGER NOT NULL, name TEXT NOT NULL, address TEXT NOT NULL, secret TEXT NOT NULL,