Browse Source

upgrade jarvis

pull/18/head
Sun 3 years ago
parent
commit
8e3999a570
  1. 30
      lib/pages/account_generate.dart
  2. 11
      lib/pages/account_quick.dart
  3. 120
      lib/pages/account_restore.dart
  4. 8
      lib/pages/home.dart
  5. 6
      lib/security.dart
  6. 4
      src/apps.rs
  7. 2
      src/apps/jarvis/models.rs
  8. 43
      src/apps/jarvis/rpc.rs

30
lib/pages/account_generate.dart

@ -31,6 +31,7 @@ class _AccountGeneratePageState extends State<AccountGeneratePage> { @@ -31,6 +31,7 @@ class _AccountGeneratePageState extends State<AccountGeneratePage> {
bool _mnemonicChecked = false;
bool _registerChecked = false;
bool _isAccount = false;
bool _loading = false;
TextEditingController _nameController = new TextEditingController();
FocusNode _nameFocus = new FocusNode();
@ -91,22 +92,32 @@ class _AccountGeneratePageState extends State<AccountGeneratePage> { @@ -91,22 +92,32 @@ class _AccountGeneratePageState extends State<AccountGeneratePage> {
SetPinWords(
callback: (lock) async {
Navigator.of(context).pop();
setState(() { this._loading = true; });
// send to core node service by rpc.
final res = await httpPost('account-create', [
_selectedLang.toInt(), mnemonic, "", name, lock, avatar
]);
if (res.isOk) {
// save this User
final account = Account(res.params[0], name, avatar);
final pid = res.params[0];
final login = await httpPost('account-login', [pid, lock]);
if (login.isOk) {
// save this User
final account = Account(pid, name, avatar);
Provider.of<AccountProvider>(context, listen: false).addAccount(account, lock);
Provider.of<DeviceProvider>(context, listen: false).updateActived();
Provider.of<AccountProvider>(context, listen: false).addAccount(account, lock);
Provider.of<DeviceProvider>(context, listen: false).updateActived();
Navigator.push(context, MaterialPageRoute(builder: (_) => AccountDomainScreen(
name: name,
)));
Navigator.push(context, MaterialPageRoute(builder: (_) => AccountDomainScreen(
name: name,
)));
} else {
setState(() { this._loading = false; });
}
} else {
setState(() { this._loading = false; });
// TODO tostor error
print(res.error);
}
@ -272,8 +283,9 @@ class _AccountGeneratePageState extends State<AccountGeneratePage> { @@ -272,8 +283,9 @@ class _AccountGeneratePageState extends State<AccountGeneratePage> {
}),
),
const SizedBox(height: 32.0),
ButtonText(text: lang.ok, action: () => registerNewAction(lang.setPin),
enable: this._registerChecked),
ButtonText(text: this._loading ? lang.waiting : lang.ok,
action: () => registerNewAction(lang.setPin),
enable: this._registerChecked && !this._loading),
_footer(lang.hasAccount, () => Navigator.of(context).pop()),
])
]);

11
lib/pages/account_quick.dart

@ -28,6 +28,7 @@ class AccountQuickPage extends StatefulWidget { @@ -28,6 +28,7 @@ class AccountQuickPage extends StatefulWidget {
class _AccountQuickPageState extends State<AccountQuickPage> {
bool _registerChecked = false;
bool _loading = false;
TextEditingController _nameController = new TextEditingController();
FocusNode _nameFocus = new FocusNode();
@ -97,8 +98,9 @@ class _AccountQuickPageState extends State<AccountQuickPage> { @@ -97,8 +98,9 @@ class _AccountQuickPageState extends State<AccountQuickPage> {
}),
),
const SizedBox(height: 32.0),
ButtonText(text: lang.ok, action: () => registerNewAction(locale),
enable: this._registerChecked),
ButtonText(text: this._loading ? lang.waiting : lang.ok,
action: () => registerNewAction(locale),
enable: this._registerChecked && !this._loading),
_footer(lang.hasAccount, () => Navigator.of(context).pop()),
])
])
@ -134,6 +136,8 @@ class _AccountQuickPageState extends State<AccountQuickPage> { @@ -134,6 +136,8 @@ class _AccountQuickPageState extends State<AccountQuickPage> {
return;
}
setState(() { this._loading = true; });
// send to core node service by rpc.
final res = await httpPost('account-create', [
language.toInt(), mnemonic, "", name, lock, avatar
@ -153,8 +157,11 @@ class _AccountQuickPageState extends State<AccountQuickPage> { @@ -153,8 +157,11 @@ class _AccountQuickPageState extends State<AccountQuickPage> {
Navigator.push(context, MaterialPageRoute(builder: (_) => AccountDomainScreen(
name: name,
)));
} else {
setState(() { this._loading = false; });
}
} else {
setState(() { this._loading = false; });
// TODO tostor error
print(res.error);
}

120
lib/pages/account_restore.dart

@ -25,23 +25,16 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -25,23 +25,16 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
bool _statusChecked = false;
String _name = '';
TextEditingController _addrController = new TextEditingController();
FocusNode _addrFocus = new FocusNode();
bool _addrOnline = false;
bool _addrChecked = false;
Language _selectedLang = Language.English;
TextEditingController _wordController = new TextEditingController();
FocusNode _wordFocus = new FocusNode();
List<String> _mnemoicWords = [];
bool _wordChecked = false;
bool _loading = false;
@override
initState() {
super.initState();
_addrFocus.addListener(() {
setState(() {});
});
_wordFocus.addListener(() {
setState(() {});
});
@ -66,6 +59,11 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -66,6 +59,11 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
deleteIconColor: Color(0xFFADB0BB)));
});
double maxHeight = (MediaQuery.of(context).size.height - 600) / 2;
if (maxHeight < 20.0) {
maxHeight = 20.0;
}
return Scaffold(
body: SafeArea(
child: Container(
@ -104,84 +102,10 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -104,84 +102,10 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
onPressed: _scanQr,
child: Icon(Icons.qr_code_scanner_rounded)),
])),
const SizedBox(height: 32.0),
Text(
'Online Network Address',
style:
TextStyle(fontSize: 18.0, fontWeight: FontWeight.bold),
),
const SizedBox(height: 16.0),
SizedBox(height: maxHeight),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
height: 50.0,
width: 600.0,
child: Row(children: [
Expanded(
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 20.0),
decoration: BoxDecoration(
color: color.surface,
border: Border.all(
color: this._addrFocus.hasFocus
? color.primary
: color.surface),
borderRadius: BorderRadius.circular(10.0),
),
child: TextField(
style: TextStyle(fontSize: 16.0),
decoration: InputDecoration(
border: InputBorder.none,
hintText: lang.address),
controller: this._addrController,
focusNode: this._addrFocus,
onSubmitted: (_v) => _checkAddrOnline(),
onChanged: (v) {
if (v.length > 0 &&
!this._addrChecked) {
setState(() {
this._addrChecked = true;
});
}
}),
),
),
if (this._addrOnline)
Container(
padding: const EdgeInsets.only(left: 8.0),
child: Icon(Icons.cloud_done_rounded,
color: Colors.green),
),
const SizedBox(width: 8.0),
Container(
width: 100.0,
child: InkWell(
onTap: this._addrChecked
? _checkAddrOnline
: null,
child: Container(
height: 45.0,
decoration: BoxDecoration(
color: this._addrChecked
? Color(0xFF6174FF)
: Color(0xFFADB0BB),
borderRadius:
BorderRadius.circular(10.0)),
child: Center(
child: Text(lang.search,
style: TextStyle(
fontSize: 16.0,
color: Colors.white))),
))),
])),
const SizedBox(height: 32.0),
Text(
'Mnemoic Words',
style: TextStyle(
fontSize: 18.0, fontWeight: FontWeight.bold),
),
Container(
width: 600.0,
height: 45.0,
@ -305,8 +229,8 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -305,8 +229,8 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
])),
const SizedBox(height: 32.0),
ButtonText(
text: lang.next,
enable: _statusChecked,
text: this._loading ? lang.waiting : lang.next,
enable: _statusChecked && !this._loading,
action: () => _mnemonicRegister(lang.unknown, lang.setPin),
),
_footer(
@ -322,33 +246,20 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -322,33 +246,20 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
MaterialPageRoute(
builder: (context) => QRScan(callback: (isOk, app, params) {
Navigator.of(context).pop();
if (app == 'distribute' && params.length == 4) {
if (app == 'distribute' && params.length == 2) {
final name = params[0];
//final id = pidParse(params[1]);
final addr = addrParse(params[2]);
final mnemonicWords = params[3];
final mnemonicWords = params[1];
setState(() {
this._addrOnline = true;
this._addrChecked = false;
this._wordController.text = '';
this._wordChecked = false;
this._statusChecked = true;
this._name = name;
this._addrController.text = addrText(addr);
this._mnemoicWords = mnemonicWords.split(" ");
});
}
})));
}
_checkAddrOnline() {
FocusScope.of(context).unfocus();
setState(() {
this._addrOnline = true;
this._addrChecked = false;
});
}
_addWord() {
final word = this._wordController.text.trim();
if (word.length == 0) {
@ -386,10 +297,6 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -386,10 +297,6 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
if (this._name == '') {
this._name = defaultName;
}
final addr = addrParse(this._addrController.text.trim());
if (addr.length < 2) {
return;
}
showShadowDialog(
context,
@ -398,9 +305,11 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -398,9 +305,11 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
SetPinWords(
callback: (lock) async {
Navigator.of(context).pop();
setState(() { this._loading = false; });
// send to core node service by rpc.
final res = await httpPost('account-restore', [
_selectedLang.toInt(), mnemonic, "", this._name, lock, addr
_selectedLang.toInt(), mnemonic, "", this._name, lock
]);
if (res.isOk) {
@ -412,6 +321,7 @@ class _AccountRestorePageState extends State<AccountRestorePage> { @@ -412,6 +321,7 @@ class _AccountRestorePageState extends State<AccountRestorePage> {
Navigator.of(context).pushNamedAndRemoveUntil("/", (Route<dynamic> route) => false);
} else {
setState(() { this._loading = true; });
// TODO tostor error
print(res.error);
}

8
lib/pages/home.dart

@ -108,12 +108,10 @@ class _HomeListState extends State<HomeList> { @@ -108,12 +108,10 @@ class _HomeListState extends State<HomeList> {
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => widget));
}
} else if (app == 'distribute' && params.length == 4) {
} else if (app == 'distribute' && params.length == 2) {
//final _name = params[0].trim();
//final id = pidParse(params[1]);
final addr = addrParse(params[2]);
//final _mnemonicWords = params[3];
Provider.of<DeviceProvider>(context, listen: false).connect(addr);
//final _mnemonicWords = params[1];
//Provider.of<DeviceProvider>(context, listen: false).connect(addr);
}
})));
}

6
lib/security.dart

@ -31,6 +31,7 @@ class _SecurityPageState extends State<SecurityPage> { @@ -31,6 +31,7 @@ class _SecurityPageState extends State<SecurityPage> {
Map<String, Account> _accounts = {};
bool _loaded = false;
bool _accountsLoaded = false;
bool _loading = false;
String _selectedUserId = '';
@ -106,7 +107,8 @@ class _SecurityPageState extends State<SecurityPage> { @@ -106,7 +107,8 @@ class _SecurityPageState extends State<SecurityPage> {
const SizedBox(height: 40.0),
loginForm(color, lang),
const SizedBox(height: 20.0),
ButtonText(text: lang.ok, enable: _accountsLoaded,
ButtonText(text: this._loading ? lang.waiting : lang.ok,
enable: _accountsLoaded && !this._loading,
action: () => loginAction(lang.verifyPin, color, lang)),
const SizedBox(height: 20.0),
InkWell(
@ -228,10 +230,12 @@ class _SecurityPageState extends State<SecurityPage> { @@ -228,10 +230,12 @@ class _SecurityPageState extends State<SecurityPage> {
}
void _verifyAfter(String lock) async {
setState(() { this._loading = true; });
final res = await httpPost('account-login', [this._selectedUserId, lock]);
if (res.isOk) {
_handleLogined(this._selectedUserId, lock, this._accounts);
} else {
setState(() { this._loading = false; });
toast(context, res.error);
}
}

4
src/apps.rs

@ -20,14 +20,14 @@ pub(crate) mod device; @@ -20,14 +20,14 @@ pub(crate) mod device;
//pub(crate) mod domain;
//pub(crate) mod file;
//pub(crate) mod group;
//pub(crate) mod jarvis;
pub(crate) mod jarvis;
//pub(crate) mod dao;
//pub(crate) mod wallet;
pub(crate) fn app_rpc_inject(handler: &mut RpcHandler<Global>) {
//device::new_rpc_handler(handler);
chat::new_rpc_handler(handler);
//jarvis::new_rpc_handler(handler);
jarvis::new_rpc_handler(handler);
//domain::new_rpc_handler(handler);
//file::new_rpc_handler(handler);
//group::new_rpc_handler(handler);

2
src/apps/jarvis/models.rs

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
use std::time::{SystemTime, UNIX_EPOCH};
use tdn::types::{
primitive::Result,
primitives::Result,
rpc::{json, RpcParam},
};
use tdn_storage::local::{DStorage, DsValue};

43
src/apps/jarvis/rpc.rs

@ -1,9 +1,8 @@ @@ -1,9 +1,8 @@
use rand::Rng;
use std::sync::Arc;
use tdn::types::{
group::GroupId,
message::SendMessage,
primitive::{HandleResult, Result},
message::RpcSendMessage,
primitives::{HandleResult, Result},
rpc::{json, rpc_response, RpcError, RpcHandler, RpcParam},
};
use tdn_did::Language;
@ -14,15 +13,15 @@ use chat_types::MessageType; @@ -14,15 +13,15 @@ use chat_types::MessageType;
use crate::account::lang_from_i64;
use crate::apps::chat::raw_to_network_message;
use crate::rpc::RpcState;
use crate::global::Global;
use crate::storage::jarvis_db;
use crate::utils::answer::load_answer;
use super::models::Message;
async fn reply(
sender: Sender<SendMessage>,
sender: Sender<RpcSendMessage>,
db: DStorage,
gid: GroupId,
lang: Language,
msg: Message,
) -> Result<()> {
@ -43,16 +42,18 @@ async fn reply( @@ -43,16 +42,18 @@ async fn reply(
let mut reply = Message::new(msg.m_type, content, false);
reply.insert(&db)?;
let res = rpc_response(0, "jarvis-create", reply.to_rpc(), gid);
sender.send(SendMessage::Rpc(0, res, true)).await?;
let res = rpc_response(0, "jarvis-create", reply.to_rpc());
sender.send(RpcSendMessage(0, res, true)).await?;
Ok(())
}
pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<Global>) {
handler.add_method(
"jarvis-list",
|gid: GroupId, _params: Vec<RpcParam>, state: Arc<RpcState>| async move {
let db = state.group.read().await.jarvis_db(&gid)?;
|_params: Vec<RpcParam>, state: Arc<Global>| async move {
let pid = state.pid().await;
let db_key = state.group.read().await.db_key(&pid)?;
let db = jarvis_db(&state.base, &pid, &db_key)?;
let devices = Message::list(&db)?;
db.close()?;
let mut results = vec![];
@ -65,24 +66,22 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -65,24 +66,22 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
handler.add_method(
"jarvis-create",
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| async move {
|params: Vec<RpcParam>, state: Arc<Global>| async move {
let lang = lang_from_i64(params[0].as_i64().ok_or(RpcError::ParseError)?);
let m_type = MessageType::from_int(params[1].as_i64().ok_or(RpcError::ParseError)?);
let content = params[2].as_str().ok_or(RpcError::ParseError)?;
let group_lock = state.group.read().await;
let base = group_lock.base().clone();
let sender = group_lock.sender();
let db = group_lock.jarvis_db(&gid)?;
drop(group_lock);
let pid = state.pid().await;
let db_key = state.group.read().await.db_key(&pid)?;
let db = jarvis_db(&state.base, &pid, &db_key)?;
let (_, raw) =
raw_to_network_message(&state.group, &base, &gid, &m_type, content).await?;
raw_to_network_message(&pid, &state.base, &db_key, &m_type, content).await?;
let mut msg = Message::new(m_type, raw, true);
msg.insert(&db)?;
let results = HandleResult::rpc(msg.to_rpc());
tokio::spawn(reply(sender, db, gid, lang, msg));
tokio::spawn(reply(state.rpc_send.clone(), db, lang, msg));
Ok(results)
},
@ -90,9 +89,11 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) { @@ -90,9 +89,11 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler<RpcState>) {
handler.add_method(
"jarvis-delete",
|gid: GroupId, params: Vec<RpcParam>, state: Arc<RpcState>| async move {
|params: Vec<RpcParam>, state: Arc<Global>| async move {
let id = params[0].as_i64().ok_or(RpcError::ParseError)?;
let db = state.group.read().await.jarvis_db(&gid)?;
let pid = state.pid().await;
let db_key = state.group.read().await.db_key(&pid)?;
let db = jarvis_db(&state.base, &pid, &db_key)?;
Message::delete(&db, id)?;
db.close()?;
Ok(HandleResult::new())

Loading…
Cancel
Save