From ebdb3f3001d9f9d831e08d7b0b4fa6182dc33153 Mon Sep 17 00:00:00 2001 From: Sun Date: Mon, 31 May 2021 09:24:36 +0800 Subject: [PATCH] add group chat block someone --- lib/apps/group_chat/detail.dart | 22 +++++++++++++++++++++- lib/apps/group_chat/provider.dart | 23 ++++++++++++++++------- src/apps/group_chat/models.rs | 5 +++++ src/apps/group_chat/rpc.rs | 12 ++++++++++++ 4 files changed, 54 insertions(+), 8 deletions(-) diff --git a/lib/apps/group_chat/detail.dart b/lib/apps/group_chat/detail.dart index 788e14d..53f8d3b 100644 --- a/lib/apps/group_chat/detail.dart +++ b/lib/apps/group_chat/detail.dart @@ -597,7 +597,10 @@ class _MemberDrawerWidget extends StatelessWidget { child: ListTile( leading: member.showAvatar(colorSurface: false), title: Text(member.name, textAlign: TextAlign.left, style: TextStyle(fontSize: 16.0)), - trailing: Text(isOwner ? 'Owner' : (member.isManager ? 'Manager' : ''), + trailing: Text(member.isBlock + ? 'Blocked' : (isOwner + ? 'Owner' : (member.isManager + ? 'Manager' : '')), style: TextStyle(color: color)), onTap: () { Navigator.pop(context); @@ -753,6 +756,23 @@ class _MemberDetailState extends State { style: TextStyle(fontSize: 14.0, color: Colors.red))), ) ), + InkWell( + onTap: () { + Navigator.pop(context); + context.read().memberUpdate( + widget.member.id, !widget.member.isBlock); + }, + hoverColor: Colors.transparent, + child: Container( + width: 300.0, + padding: const EdgeInsets.symmetric(vertical: 10.0), + decoration: BoxDecoration( + border: Border.all(color: Colors.red), + borderRadius: BorderRadius.circular(10.0)), + child: Center(child: Text(widget.member.isBlock ? 'Blocked' : 'Block', + style: TextStyle(fontSize: 14.0, color: Colors.red))), + ) + ), ] ); } diff --git a/lib/apps/group_chat/provider.dart b/lib/apps/group_chat/provider.dart index 483394f..33bdcb3 100644 --- a/lib/apps/group_chat/provider.dart +++ b/lib/apps/group_chat/provider.dart @@ -37,18 +37,23 @@ class GroupChatProvider extends ChangeNotifier { List allKeys = []; List managers = []; List commons = []; + List blocks = []; this.activedMembers.forEach((i, m) { - if (m.isManager) { - if (m.mid == this.activedGroup.owner) { - allKeys.add(i); + if (m.isBlock) { + blocks.add(i); + } else { + if (m.isManager) { + if (m.mid == this.activedGroup.owner) { + allKeys.add(i); + } else { + managers.add(i); + } } else { - managers.add(i); + commons.add(i); } - } else { - commons.add(i); } }); - return allKeys + managers + commons; + return allKeys + managers + commons + blocks; } GroupChatProvider() { @@ -145,6 +150,10 @@ class GroupChatProvider extends ChangeNotifier { // rpc.send('group-chat-readd', [id]); } + memberUpdate(int id, bool isBlock) { + rpc.send('group-chat-member-update', [id, isBlock]); + } + _list(List params) { this.clear(); params.forEach((params) { diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index f492142..2f19dc3 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -674,6 +674,11 @@ impl Member { ); db.update(&sql) } + + pub fn block(db: &DStorage, id: &i64, block: bool) -> Result { + let sql = format!("UPDATE members SET is_block={} WHERE id = {}", block, id,); + db.update(&sql) + } } /// Group Chat Message Model. diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index f126175..d75f51f 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -279,6 +279,18 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { }, ); + handler.add_method( + "group-chat-member-update", + |gid: GroupId, params: Vec, state: Arc| async move { + let id = params[0].as_i64()?; + let is_block = params[1].as_bool()?; + + let db = group_chat_db(state.layer.read().await.base(), &gid)?; + Member::block(&db, &id, is_block)?; + Ok(HandleResult::new()) + }, + ); + handler.add_method( "group-chat-message-create", |gid: GroupId, params: Vec, state: Arc| async move {