diff --git a/CHANGELOG.md b/CHANGELOG.md index 46cf63c..5a7af64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# 5.0.1+4 +* Optimize the logic for retrieving the group member list when monitoring group members entering and leaving. + # 5.0.1+3 * Optimize UI refresh timing when joining a call midway. diff --git a/lib/business_logic/listener_model/tui_group_listener_model.dart b/lib/business_logic/listener_model/tui_group_listener_model.dart index e9cd8ca..3bf390e 100644 --- a/lib/business_logic/listener_model/tui_group_listener_model.dart +++ b/lib/business_logic/listener_model/tui_group_listener_model.dart @@ -25,12 +25,12 @@ import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; -enum UpdateType { groupInfo, memberList, joinApplicationList, groupDismissed, kickedFromGroup } +enum UpdateType { groupInfo, memberEnter, memberLeave, joinApplicationList, groupDismissed, kickedFromGroup } class NeedUpdate { final String groupID; final UpdateType updateType; - final String extraData; + final dynamic extraData; int? groupInfoSubType; String? ownerID; @@ -55,7 +55,7 @@ class TUIGroupListenerModel extends ChangeNotifier { TUIGroupListenerModel() { _groupListener = V2TimGroupListener(onMemberInvited: (groupID, opUser, memberList) { - _needUpdate = NeedUpdate(groupID, UpdateType.memberList, ""); + _needUpdate = NeedUpdate(groupID, UpdateType.memberEnter, memberList); notifyListeners(); }, onMemberKicked: (groupID, opUser, memberList) async { if (_isLoginUserKickedFromGroup(groupID, memberList)) { @@ -66,10 +66,10 @@ class TUIGroupListenerModel extends ChangeNotifier { notifyListeners(); } }, onMemberEnter: (String groupID, List memberList) { - _needUpdate = NeedUpdate(groupID, UpdateType.memberList, ""); + _needUpdate = NeedUpdate(groupID, UpdateType.memberEnter, memberList); notifyListeners(); }, onMemberLeave: (String groupID, V2TimGroupMemberInfo member) { - _needUpdate = NeedUpdate(groupID, UpdateType.memberList, ""); + _needUpdate = NeedUpdate(groupID, UpdateType.memberLeave, [member]); notifyListeners(); }, onGroupInfoChanged: (groupID, changeInfos) { _needUpdate = NeedUpdate(groupID, UpdateType.groupInfo, ""); diff --git a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart index 511c3b7..f8ad394 100644 --- a/lib/business_logic/separate_models/tui_chat_separate_view_model.dart +++ b/lib/business_logic/separate_models/tui_chat_separate_view_model.dart @@ -24,6 +24,8 @@ import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart' if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart' if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_full_info.dart'; +import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart' + if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart' if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_message_read_member_list.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart' @@ -585,6 +587,34 @@ class TUIChatSeparateViewModel extends ChangeNotifier { } } + void processGroupMemberListEnter({required String groupID, required List memberList}) async { + final List fullInfoList = memberList + .where((member) => member.userID != null) + .map((member) { + return V2TimGroupMemberFullInfo( + userID: member.userID!, + nickName: member.nickName, + nameCard: member.nameCard, + friendRemark: member.friendRemark, + faceUrl: member.faceUrl, + onlineDevices: member.onlineDevices, + ); + }).toList(); + + for (final fullInfo in fullInfoList) { + final exists = groupMemberList?.any((e) => e?.userID == fullInfo.userID) ?? false; + if (!exists) { + groupMemberList = [...?groupMemberList, fullInfo]; + } + } + } + + void processGroupMemberListLeave({required String groupID, required List memberList}) async { + final Set userIDsToRemove = memberList.map((member) => member.userID).toSet(); + + groupMemberList?.removeWhere((member) => userIDsToRemove.contains(member?.userID)); + } + void _notify() { try { notifyListeners(); diff --git a/lib/business_logic/separate_models/tui_group_profile_model.dart b/lib/business_logic/separate_models/tui_group_profile_model.dart index 4f58576..9d7b3df 100644 --- a/lib/business_logic/separate_models/tui_group_profile_model.dart +++ b/lib/business_logic/separate_models/tui_group_profile_model.dart @@ -16,6 +16,8 @@ import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart' if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart' if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_full_info.dart'; +import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart' + if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_operation_result.dart' if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_operation_result.dart'; import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart' @@ -134,6 +136,34 @@ class TUIGroupProfileModel extends ChangeNotifier { return groupMemberListRes?.nextSeq; } + Future processGroupMemberListEnter({required String groupID, required List memberList}) async { + final List fullInfoList = memberList + .where((member) => member.userID != null) + .map((member) { + return V2TimGroupMemberFullInfo( + userID: member.userID!, + nickName: member.nickName, + nameCard: member.nameCard, + friendRemark: member.friendRemark, + faceUrl: member.faceUrl, + onlineDevices: member.onlineDevices, + ); + }).toList(); + + for (final fullInfo in fullInfoList) { + final exists = _groupMemberList?.any((e) => e?.userID == fullInfo.userID) ?? false; + if (!exists) { + _groupMemberList = [...?_groupMemberList, fullInfo]; + } + } + } + + Future processGroupMemberListLeave({required String groupID, required List memberList}) async { + final Set userIDsToRemove = memberList.map((member) => member.userID).toSet(); + + _groupMemberList?.removeWhere((member) => userIDsToRemove.contains(member?.userID)); + } + _loadConversation() async { conversation = await _conversationService.getConversation(conversationID: "group_$_groupID"); } diff --git a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart index b5a9bbf..646069e 100644 --- a/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart +++ b/lib/ui/views/TIMUIKitChat/tim_uikit_chat.dart @@ -449,11 +449,11 @@ class _TUIChatState extends TIMUIKitState { case UpdateType.groupInfo: model.loadGroupInfo(_getConvID()); break; - case UpdateType.memberList: - if (widget.groupMemberList == null) { - model.loadGroupMemberList(groupID: _getConvID()); - } - model.loadGroupInfo(_getConvID()); + case UpdateType.memberEnter: + model.processGroupMemberListEnter(groupID: _getConvID(), memberList: needUpdate.extraData); + break; + case UpdateType.memberLeave: + model.processGroupMemberListLeave(groupID: _getConvID(), memberList: needUpdate.extraData); break; default: break; diff --git a/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart b/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart index 636de5e..fccad10 100644 --- a/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart +++ b/lib/ui/views/TIMUIKitGroup/tim_uikit_group.dart @@ -149,7 +149,8 @@ class _TIMUIKitGroupState extends TIMUIKitState { case UpdateType.groupInfo: Provider.of(context).loadGroupListData(); break; - case UpdateType.memberList: + case UpdateType.memberEnter: + case UpdateType.memberLeave: Provider.of(context).loadGroupListData(); break; default: diff --git a/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart b/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart index f9a7a4d..63ac39e 100644 --- a/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart +++ b/lib/ui/views/TIMUIKitGroupProfile/tim_uikit_group_profile.dart @@ -166,8 +166,12 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState { model.loadGroupInfo(widget.groupID); break; - case UpdateType.memberList: - model.loadGroupMemberList(groupID: widget.groupID); + case UpdateType.memberEnter: + model.processGroupMemberListEnter(groupID: widget.groupID, memberList: needUpdate.extraData); + model.loadGroupInfo(widget.groupID); + break; + case UpdateType.memberLeave: + model.processGroupMemberListLeave(groupID: widget.groupID, memberList: needUpdate.extraData); model.loadGroupInfo(widget.groupID); break; default: diff --git a/pubspec.yaml b/pubspec.yaml index fc9f12a..9c4e6c3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: tencent_cloud_chat_uikit description: A powerful chat UI component library and business logic for Tencent Cloud Chat, creating seamless in-app chat modules for delightful user experiences. -version: 5.0.1+3 +version: 5.0.1+4 homepage: https://trtc.io/products/chat?utm_source=gfs&utm_medium=link&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=k6WgfCKn repository: https://github.com/TencentCloud/chat-uikit-flutter documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html