diff --git a/lib/apps/group_chat/add.dart b/lib/apps/group_chat/add.dart index fd54ad4..d7bca7e 100644 --- a/lib/apps/group_chat/add.dart +++ b/lib/apps/group_chat/add.dart @@ -18,6 +18,7 @@ import 'package:esse/provider.dart'; import 'package:esse/apps/chat/models.dart'; import 'package:esse/apps/chat/provider.dart'; +import 'package:esse/apps/group_chat/provider.dart'; class GroupAddPage extends StatefulWidget { final String id; @@ -51,6 +52,8 @@ class _GroupAddPageState extends State { bool _groupNeedAgree = false; bool _groupHasKey = true; bool _groupHasNeedAgree = true; + bool _addrOnline = false; + bool _addrChecked = false; // 0 => encrypted, 1 => common, 2 => open. Widget _groupTypeWidget(String text, int value, ColorScheme color) { @@ -85,6 +88,14 @@ class _GroupAddPageState extends State { // } + _checkGroupAddr() { + String addr = _createAddrController.text; + if (addr.substring(0, 2) == '0x') { + addr = addr.substring(2); + } + context.read().check(addr); + } + _scanCallback(bool isOk, String app, List params) { Navigator.of(context).pop(); if (isOk && app == 'add-group' && params.length == 3) { @@ -307,13 +318,13 @@ class _GroupAddPageState extends State { onChanged: (v) { if (v.length > 0) { setState(() { - //this._addrChecked = true; + _addrChecked = true; }); } }), ), ), - //if (this._addrOnline) + if (_addrOnline) Container( padding: const EdgeInsets.only(left: 8.0), child: Icon(Icons.cloud_done_rounded, @@ -323,7 +334,7 @@ class _GroupAddPageState extends State { Container( width: 100.0, child: InkWell( - //onTap: this._addrChecked ? _checkAddrOnline : null, + onTap: _addrChecked ? _checkGroupAddr : null, child: Container( height: 45.0, decoration: BoxDecoration( diff --git a/lib/apps/group_chat/provider.dart b/lib/apps/group_chat/provider.dart index e69de29..86da659 100644 --- a/lib/apps/group_chat/provider.dart +++ b/lib/apps/group_chat/provider.dart @@ -0,0 +1,65 @@ +import 'package:flutter/material.dart'; + +import 'package:esse/rpc.dart'; +import 'package:esse/apps/group_chat/models.dart'; + +class GroupChatProvider extends ChangeNotifier { + Map groups = {}; + + GroupChatProvider() { + // rpc. + rpc.addListener('group-chat-list', _list, false); + // rpc.addListener('group-chat-online', _online, false); + // rpc.addListener('group-chat-offline', _online, false); + rpc.addListener('group-chat-check', _check, false); + rpc.addListener('group-chat-create', _create, false); + // rpc.addListener('group-chat-update', _update, false); + // rpc.addListener('group-chat-join', _join, true); + // rpc.addListener('group-chat-agree', _agree, true); + // rpc.addListener('group-chat-reject', _reject, false); + // rpc.addListener('group-chat-member-join', _memberJoin, false); + // rpc.addListener('group-chat-member-info', _memberInfo, false); + // rpc.addListener('group-chat-member-leave', _memberLeave, false); + // rpc.addListener('group-chat-member-online', _memberOnline, false); + // rpc.addListener('group-chat-member-offline', _memberOffline, false); + // rpc.addListener('group-chat-message-create', _messageCreate, true); + // rpc.addListener('group-chat-message-delete', _messageDelete, false); + // rpc.addListener('group-chat-message-delivery', _messageDelivery, false); + } + + clear() { + } + + updateActived() { + this.clear(); + + // load groups. + rpc.send('group-chat-list', []); + } + + check(String addr) { + rpc.send('group-chat-check', [addr]); + } + + create() { + rpc.send('group-chat-create', []); + } + + _list(List params) { + this.clear(); + params.forEach((params) { + // if (params.length == 6) { + // this.devices[params[0]] = Device.fromList(params); + // } + }); + notifyListeners(); + } + + _check(List params) { + // + } + + _create(List params) { + // + } +} diff --git a/lib/main.dart b/lib/main.dart index 929239e..a2596fe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ import 'package:esse/provider.dart'; import 'package:esse/apps/device/provider.dart'; import 'package:esse/apps/chat/provider.dart'; import 'package:esse/apps/assistant/provider.dart'; +import 'package:esse/apps/group_chat/provider.dart'; void coreServer() async { final path = await homeDir(); @@ -42,6 +43,7 @@ void main() { ChangeNotifierProvider(create: (_) => DeviceProvider()), ChangeNotifierProvider(create: (_) => ChatProvider()), ChangeNotifierProvider(create: (_) => AssistantProvider()), + ChangeNotifierProvider(create: (_) => GroupChatProvider()), ], child: MyApp(), )); diff --git a/src/apps.rs b/src/apps.rs index 6c7a30f..fe7bbed 100644 --- a/src/apps.rs +++ b/src/apps.rs @@ -11,6 +11,7 @@ pub(crate) mod chat; pub(crate) mod device; pub(crate) mod domain; pub(crate) mod file; +pub(crate) mod group_chat; pub(crate) fn app_rpc_inject(handler: &mut RpcHandler) { device::new_rpc_handler(handler); @@ -18,6 +19,7 @@ pub(crate) fn app_rpc_inject(handler: &mut RpcHandler) { assistant::new_rpc_handler(handler); domain::new_rpc_handler(handler); file::new_rpc_handler(handler); + group_chat::new_rpc_handler(handler); } pub(crate) fn _app_layer_handle( diff --git a/src/apps/group_chat/mod.rs b/src/apps/group_chat/mod.rs index e69de29..bcd2463 100644 --- a/src/apps/group_chat/mod.rs +++ b/src/apps/group_chat/mod.rs @@ -0,0 +1,4 @@ +mod models; + +pub(crate) mod rpc; +pub(crate) use rpc::new_rpc_handler; diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index e69de29..1d2a204 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -0,0 +1,33 @@ +use group_chat_types::{Event, GroupConnect, GroupEvent, GroupInfo, GroupResult, GroupType}; +use std::sync::Arc; +use tdn::types::{ + group::GroupId, + message::SendType, + primitive::{new_io_error, HandleResult, PeerAddr}, + rpc::{json, rpc_response, RpcHandler, RpcParam}, +}; + +//use crate::group::GroupEvent; +use crate::rpc::RpcState; + +pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { + handler.add_method("group-chat-echo", |_, params, _| async move { + Ok(HandleResult::rpc(json!(params))) + }); + + handler.add_method( + "group-chat-check", + |gid: GroupId, params: Vec, _state: Arc| async move { + let addr = PeerAddr::from_hex(params[0].as_str()?) + .map_err(|_e| new_io_error("PeerAddr invalid!"))?; + println!("addr: {}", addr.to_hex()); + + let data = postcard::to_allocvec(&GroupConnect::Check).unwrap_or(vec![]); + Ok(HandleResult::layer( + gid, + gid, + SendType::Connect(0, addr, None, None, data), + )) + }, + ); +}