Browse Source

Wallet: support set main account function

pull/18/head
Sun 4 years ago
parent
commit
290deb5979
  1. 4
      lib/apps/wallet/models.dart
  2. 26
      lib/apps/wallet/page.dart
  3. 2
      lib/l10n/localizations.dart
  4. 4
      lib/l10n/localizations_en.dart
  5. 4
      lib/l10n/localizations_zh.dart
  6. 25
      src/apps/wallet/models.rs
  7. 10
      src/apps/wallet/rpc.rs
  8. 1
      src/migrate/wallet.rs

4
lib/apps/wallet/models.dart

@ -176,6 +176,7 @@ class Address { @@ -176,6 +176,7 @@ class Address {
String name = '';
String address = '';
bool isGen = true;
bool isMain = false;
Map<Network, String> balances = {};
String icon() {
@ -265,7 +266,8 @@ class Address { @@ -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]);
}
}

26
lib/apps/wallet/page.dart

@ -131,8 +131,11 @@ class _WalletDetailState extends State<WalletDetail> with SingleTickerProviderSt @@ -131,8 +131,11 @@ class _WalletDetailState extends State<WalletDetail> 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<WalletDetail> with SingleTickerProviderSt @@ -166,6 +169,15 @@ class _WalletDetailState extends State<WalletDetail> with SingleTickerProviderSt
]);
}
_setMain() {
rpc.send('wallet-main', [this._selectedAddress!.id]);
for (int i=0;i<this._addresses.length;i++) {
this._addresses[i].isMain = false;
}
this._selectedAddress!.isMain = !this._selectedAddress!.isMain;
setState(() {});
}
@override
Widget build(BuildContext context) {
final color = Theme.of(context).colorScheme;
@ -210,7 +222,7 @@ class _WalletDetailState extends State<WalletDetail> with SingleTickerProviderSt @@ -210,7 +222,7 @@ class _WalletDetailState extends State<WalletDetail> with SingleTickerProviderSt
List<PopupMenuEntry<int>> 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<WalletDetail> with SingleTickerProviderSt @@ -247,6 +259,10 @@ class _WalletDetailState extends State<WalletDetail> 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<int>(
@ -555,13 +571,15 @@ class _WalletDetailState extends State<WalletDetail> with SingleTickerProviderSt @@ -555,13 +571,15 @@ class _WalletDetailState extends State<WalletDetail> with SingleTickerProviderSt
);
}
PopupMenuEntry<int> _menuItem(int value, Address address, ColorScheme color, bool selected) {
PopupMenuEntry<int> _menuItem(int value, Address address, ColorScheme color, bool selected, lang) {
return PopupMenuItem<int>(
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)),
),
);
}

2
lib/l10n/localizations.dart

@ -268,6 +268,8 @@ abstract class AppLocalizations { @@ -268,6 +268,8 @@ abstract class AppLocalizations {
String get walletIntro;
String get secretKey;
String get contract;
String get main;
String get setMain;
}
class _AppLocalizationsDelegate

4
lib/l10n/localizations_en.dart

@ -439,4 +439,8 @@ class AppLocalizationsEn extends AppLocalizations { @@ -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';
}

4
lib/l10n/localizations_zh.dart

@ -439,4 +439,8 @@ class AppLocalizationsZh extends AppLocalizations { @@ -439,4 +439,8 @@ class AppLocalizationsZh extends AppLocalizations {
String get secretKey => '私钥';
@override
String get contract => '合约地址';
@override
String get main => '';
@override
String get setMain => '设为主账户';
}

25
src/apps/wallet/models.rs

@ -117,6 +117,7 @@ pub(crate) struct Address { @@ -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 { @@ -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 { @@ -191,6 +193,7 @@ impl Address {
address,
secret,
index: 0,
main: false,
balance: "".to_owned(),
id: 0,
}
@ -204,6 +207,7 @@ impl Address { @@ -204,6 +207,7 @@ impl Address {
self.name,
self.address,
self.is_gen(),
self.main,
self.balance,
])
}
@ -214,6 +218,7 @@ impl Address { @@ -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 { @@ -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 { @@ -245,8 +251,8 @@ impl Address {
}
pub fn list(db: &DStorage) -> Result<Vec<Self>> {
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 { @@ -256,7 +262,7 @@ impl Address {
pub fn get(db: &DStorage, id: &i64) -> Result<Self> {
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 { @@ -268,7 +274,7 @@ impl Address {
pub fn get_by_address(db: &DStorage, address: &str) -> Result<Self> {
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 { @@ -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)?;

10
src/apps/wallet/rpc.rs

@ -588,4 +588,14 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -588,4 +588,14 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
}
},
);
handler.add_method(
"wallet-main",
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| 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())
},
);
}

1
src/migrate/wallet.rs

@ -4,6 +4,7 @@ pub(super) const WALLET_VERSIONS: [&str; 5] = [ @@ -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,

Loading…
Cancel
Save