diff --git a/lib/apps/chat/provider.dart b/lib/apps/chat/provider.dart index 9c4141d..3e53215 100644 --- a/lib/apps/chat/provider.dart +++ b/lib/apps/chat/provider.dart @@ -41,7 +41,7 @@ class ChatProvider extends ChangeNotifier { rpc.addListener('chat-friend-update', _friendUpdate, false); rpc.addListener('chat-friend-close', _friendClose, false); rpc.addListener('chat-request-list', _requestList, false); - rpc.addListener('chat-request-create', _requestCreate, true); + rpc.addListener('chat-request-create', _requestCreate, true, true); rpc.addListener('chat-request-delivery', _requestDelivery, false); rpc.addListener('chat-request-agree', _requestAgree, false); rpc.addListener('chat-request-reject', _requestReject, false); diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 4c53482..31876e5 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -103,7 +103,7 @@ class _HomeListState extends State with SingleTickerProviderStateMixin @override void initState() { controller = AnimationController( - vsync: this, duration: const Duration(seconds: 5) + vsync: this, duration: const Duration(seconds: 8) )..addListener(() { if (controller.value == 1.0) { isProcess = false; @@ -132,7 +132,7 @@ class _HomeListState extends State with SingleTickerProviderStateMixin final name = params[2]; final widget = ChatAddPage(id: id, addr: addr, name: name); Provider.of(context, listen: false) - .systemAppGroupAddNew = false; + .systemAppFriendAddNew = false; if (isDesktop) { Provider.of(context, listen: false) .updateActivedApp(widget); @@ -209,15 +209,6 @@ class _HomeListState extends State with SingleTickerProviderStateMixin Navigator.push(context, MaterialPageRoute(builder: (_) => widget)); } } else if (value == 2) { - final widget = GroupAddPage(); - if (isDesktop) { - provider.updateActivedApp(widget); - } else { - provider.systemAppFriendAddNew = false; - setState(() {}); - Navigator.push(context, MaterialPageRoute(builder: (_) => widget)); - } - } else if (value == 3) { showShadowDialog( context, Icons.info, @@ -234,15 +225,13 @@ class _HomeListState extends State with SingleTickerProviderStateMixin _menuItem(0, Icons.qr_code_scanner_rounded, lang.scan), _menuItem(1, Icons.person_add_rounded, lang.addFriend, provider.systemAppFriendAddNew), - _menuItem(2, Icons.add_business_rounded, lang.addGroup, - provider.systemAppGroupAddNew), - _menuItem(3, Icons.qr_code_rounded, lang.myQrcode), + _menuItem(2, Icons.qr_code_rounded, lang.myQrcode), ]; }, ) : GestureDetector(onTap: () => provider.updateToHome(), child: Icon(Icons.home_outlined, color: color.primary))), - if (provider.systemAppFriendAddNew || provider.systemAppGroupAddNew) + if (provider.systemAppFriendAddNew) Positioned( top: 0, right: 0, diff --git a/lib/provider.dart b/lib/provider.dart index a783ae1..e349b12 100644 --- a/lib/provider.dart +++ b/lib/provider.dart @@ -29,13 +29,12 @@ class AccountProvider extends ChangeNotifier { Widget currentListShow = null; Widget coreShowWidget = DefaultCoreShow(); bool systemAppFriendAddNew = false; - bool systemAppGroupAddNew = false; Widget get homeShowWidget => this.currentListShow ?? this.defaultListShow; AccountProvider() { // rpc notice when account not actived. - rpc.addNotice(_accountNotice); + rpc.addNotice(_accountNotice, _newRequestNotice); // rpc rpc.addListener('account-system-info', _systemInfo, false); @@ -199,6 +198,13 @@ class AccountProvider extends ChangeNotifier { } } + _newRequestNotice(String gid) { + if (this.activedAccountId == gid) { + this.systemAppFriendAddNew = true; + notifyListeners(); + } + } + _accountUpdate(List params) { final gid = params[0]; this.accounts[gid].name = params[1]; diff --git a/lib/rpc.dart b/lib/rpc.dart index 7615372..4207c9f 100644 --- a/lib/rpc.dart +++ b/lib/rpc.dart @@ -61,6 +61,7 @@ class WebSocketsNotifications { Map _listeners = new Map(); Function _notice; + Function _requestNotice; bool isLinked() { return !_closed; @@ -122,12 +123,13 @@ class WebSocketsNotifications { } } - addNotice(Function callback) { - _notice = callback; + addNotice(Function noticeCallback, Function requestCallback) { + _notice = noticeCallback; + _requestNotice = requestCallback; } - addListener(String method, Function callback, bool notice) { - _listeners[method] = [callback, notice]; + addListener(String method, Function callback, bool notice, [bool request]) { + _listeners[method] = [callback, notice, request]; } removeListener(String method) { @@ -147,9 +149,14 @@ class WebSocketsNotifications { List params = response["result"]; String gid = response["gid"]; if (_listeners[method] != null) { + final callbacks = _listeners[method]; + if (callbacks[2] != null && callbacks[2]) { + _requestNotice(gid); + } + if (gid == Global.gid || method.startsWith('account')) { - _listeners[method][0](params); - } else { + callbacks[0](params); + } else if (callbacks[1] != null && callbacks[1]) { _notice(gid); } } else { diff --git a/src/apps/chat/rpc.rs b/src/apps/chat/rpc.rs index 1c0e72f..d95381a 100644 --- a/src/apps/chat/rpc.rs +++ b/src/apps/chat/rpc.rs @@ -279,7 +279,6 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { false, ); - let mut results = HandleResult::rpc(Default::default()); let me = state.group.read().await.clone_user(&gid)?; let mut layer_lock = state.layer.write().await; @@ -287,16 +286,18 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { if Friend::is_friend(&db, &request.gid)? { debug!("had friend."); drop(layer_lock); - return Ok(results); + return Ok(HandleResult::new()); } if let Some(req) = Request::get(&db, &request.gid)? { - println!("Had this request."); + debug!("Had this request."); req.delete(&db)?; } request.insert(&db)?; drop(db); + let mut results = HandleResult::rpc(json!(request.to_rpc())); + state.group.write().await.broadcast( &gid, InnerEvent::SessionRequestCreate(