tencent_cloud_chat_uikit source code update to version 4.0.8

This commit is contained in:
vinsonswang 2025-05-23 12:55:06 +08:00
parent 744204bb3a
commit 8ada938397
113 changed files with 3081 additions and 3998 deletions

View File

@ -1,3 +1,10 @@
# 4.0.8
* Use the OfflinePushInfo constructor, not the fromJson function.
# 4.0.7
* Fixed the issue that modifying your own adding friend permissions does not take effect.
* Fixed the setGroupInfo exception problem.
# 4.0.6
* Solve the updateSelfInfo exception problem.
* The success of calling the initSDK interface is determined by the code of the return value. Avoid inaccurate judgment when calling the interface multiple times.

View File

@ -1,5 +1,3 @@
import 'package:flutter/cupertino.dart';
enum TIMCallbackType { API_ERROR, FLUTTER_ERROR, INFO }
class TIMCallback {

View File

@ -35,10 +35,8 @@ abstract class TIMState<T extends StatefulWidget> extends State<T> {
@override
Widget build(BuildContext context) {
final onFlutterError = FlutterError.onError;
FlutterError.onError = (FlutterErrorDetails details) {
FlutterError.presentError(details);
// onFlutterError?.call(details);
onTIMCallback(TIMCallback(
type: TIMCallbackType.FLUTTER_ERROR,
stackTrace: details.stack,

View File

@ -27,9 +27,7 @@ abstract class TIMStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final onFlutterError = FlutterError.onError;
FlutterError.onError = (FlutterErrorDetails details) {
// onFlutterError?.call(details);
FlutterError.presentError(details);
onTIMCallback(TIMCallback(
type: TIMCallbackType.FLUTTER_ERROR,

View File

@ -1,9 +1,13 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
@ -63,7 +67,8 @@ abstract class DefaultLifeCycle {
static defaultNullCallbackSolution(dynamic) {}
static Future<bool> defaultAddFriend(String userID, String? remark, String? friendGroup, String? addWording, [BuildContext? context]) async {
static Future<bool> defaultAddFriend(String userID, String? remark, String? friendGroup, String? addWording,
[BuildContext? context]) async {
return true;
}
@ -77,7 +82,8 @@ abstract class DefaultLifeCycle {
static Future<void> defaultPopBackRemind() async {
// You have to implement the exact life cycle hook in this case.
TIMUIKitClass.onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。"), infoCode: 6661402));
TIMUIKitClass.onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO, infoRecommendText: TIM_t("请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。"), infoCode: 6661402));
return;
}
}

View File

@ -1,4 +1,5 @@
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/base_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';

View File

@ -7,12 +7,18 @@ import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_change_info_type.dart';
import 'package:tencent_cloud_chat_sdk/manager/v2_tim_manager.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_topic_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_change_info.dart';
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_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info_result.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_topic_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_topic_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart';
@ -48,51 +54,42 @@ class TUIGroupListenerModel extends ChangeNotifier {
}
TUIGroupListenerModel() {
_groupListener = V2TimGroupListener(
onMemberInvited: (groupID, opUser, memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
notifyListeners();
},
onMemberKicked: (groupID, opUser, memberList) async {
if (_isLoginUserKickedFromGroup(groupID, memberList)) {
_deleteGroupConversation(groupID);
final groupName = await _getGroupName(groupID);
_needUpdate = NeedUpdate(groupID, UpdateType.kickedFromGroup, groupName);
notifyListeners();
}
},
onMemberEnter: (String groupID, List<V2TimGroupMemberInfo> memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
notifyListeners();
},
onMemberLeave: (String groupID, V2TimGroupMemberInfo member) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
notifyListeners();
},
onGroupInfoChanged: (groupID, changeInfos) {
_needUpdate = NeedUpdate(groupID, UpdateType.groupInfo, "");
for (V2TimGroupChangeInfo info in changeInfos) {
if (info.type == GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER) {
_needUpdate!.groupInfoSubType = GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER;
_needUpdate!.ownerID = info.value;
}
}
notifyListeners();
},
onReceiveJoinApplication:
(String groupID, V2TimGroupMemberInfo member, String opReason) async {
_onReceiveJoinApplication(groupID, member, opReason);
chatViewModel.refreshGroupApplicationList();
notifyListeners();
},
onGroupDismissed: (String groupID, V2TimGroupMemberInfo opUser) async {
_groupListener = V2TimGroupListener(onMemberInvited: (groupID, opUser, memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
notifyListeners();
}, onMemberKicked: (groupID, opUser, memberList) async {
if (_isLoginUserKickedFromGroup(groupID, memberList)) {
_deleteGroupConversation(groupID);
final groupName = await _getGroupName(groupID);
_needUpdate = NeedUpdate(groupID, UpdateType.groupDismissed, groupName);
_needUpdate = NeedUpdate(groupID, UpdateType.kickedFromGroup, groupName);
notifyListeners();
}
);
}, onMemberEnter: (String groupID, List<V2TimGroupMemberInfo> memberList) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
notifyListeners();
}, onMemberLeave: (String groupID, V2TimGroupMemberInfo member) {
_needUpdate = NeedUpdate(groupID, UpdateType.memberList, "");
notifyListeners();
}, onGroupInfoChanged: (groupID, changeInfos) {
_needUpdate = NeedUpdate(groupID, UpdateType.groupInfo, "");
for (V2TimGroupChangeInfo info in changeInfos) {
if (info.type == GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER) {
_needUpdate!.groupInfoSubType = GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER;
_needUpdate!.ownerID = info.value;
}
}
notifyListeners();
}, onReceiveJoinApplication: (String groupID, V2TimGroupMemberInfo member, String opReason) async {
_onReceiveJoinApplication(groupID, member, opReason);
chatViewModel.refreshGroupApplicationList();
notifyListeners();
}, onGroupDismissed: (String groupID, V2TimGroupMemberInfo opUser) async {
_deleteGroupConversation(groupID);
final groupName = await _getGroupName(groupID);
_needUpdate = NeedUpdate(groupID, UpdateType.groupDismissed, groupName);
notifyListeners();
});
}
setGroupListener() {
@ -104,8 +101,7 @@ class TUIGroupListenerModel extends ChangeNotifier {
}
getCommunityCategoryList(String groupID) async {
final Map<String, String>? customInfo =
await getCommunityCustomInfo(groupID);
final Map<String, String>? customInfo = await getCommunityCustomInfo(groupID);
if (customInfo != null) {
final String? categoryListString = customInfo["categoryList"];
if (categoryListString != null && categoryListString.isNotEmpty) {
@ -116,9 +112,7 @@ class TUIGroupListenerModel extends ChangeNotifier {
Future<Map<String, String>?> getCommunityCustomInfo(String groupID) async {
V2TimValueCallback<List<V2TimGroupInfoResult>> res =
await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupsInfo(groupIDList: [groupID]);
await TencentImSDKPlugin.v2TIMManager.getGroupManager().getGroupsInfo(groupIDList: [groupID]);
if (res.code != 0) {
final V2TimGroupInfoResult? groupInfo = res.data?[0];
if (groupInfo != null) {
@ -129,10 +123,8 @@ class TUIGroupListenerModel extends ChangeNotifier {
return null;
}
setCommunityCategoryList(
String groupID, String groupType, List<String> newCategoryList) async {
final Map<String, String>? customInfo =
await getCommunityCustomInfo(groupID);
setCommunityCategoryList(String groupID, String groupType, List<String> newCategoryList) async {
final Map<String, String>? customInfo = await getCommunityCustomInfo(groupID);
customInfo?["categoryList"] = jsonEncode(newCategoryList);
TencentImSDKPlugin.v2TIMManager.getGroupManager().setGroupInfo(
info: V2TimGroupInfo(
@ -149,10 +141,8 @@ class TUIGroupListenerModel extends ChangeNotifier {
);
}
_onReceiveJoinApplication(
String groupID, V2TimGroupMemberInfo member, String opReason) {
Future.delayed(const Duration(milliseconds: 500),
() => chatViewModel.refreshGroupApplicationList());
_onReceiveJoinApplication(String groupID, V2TimGroupMemberInfo member, String opReason) {
Future.delayed(const Duration(milliseconds: 500), () => chatViewModel.refreshGroupApplicationList());
}
Future<String> _getGroupName(String groupID) async {
@ -177,6 +167,3 @@ class TUIGroupListenerModel extends ChangeNotifier {
return false;
}
}

View File

@ -1,5 +1,7 @@
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
class UserProfile {

View File

@ -4,7 +4,8 @@ import 'dart:io';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
@ -14,15 +15,13 @@ class TUIChatModelTools {
final TUIChatGlobalModel globalModel = serviceLocator<TUIChatGlobalModel>();
final CoreServicesImpl _coreServices = serviceLocator<CoreServicesImpl>();
OfflinePushInfo buildMessagePushInfo(
V2TimMessage message, String convID, ConvType convType) {
OfflinePushInfo buildMessagePushInfo(V2TimMessage message, String convID, ConvType convType) {
String createJSON(String convID) {
return "{\"conversationID\": \"$convID\"}";
}
if (globalModel.chatConfig.offlinePushInfo != null) {
final customData =
globalModel.chatConfig.offlinePushInfo!(message, convID, convType);
final customData = globalModel.chatConfig.offlinePushInfo!(message, convID, convType);
if (customData != null) {
return customData;
}
@ -33,12 +32,8 @@ class TUIChatModelTools {
// If user provides null, use default ext.
String ext = globalModel.chatConfig.notificationExt != null
? globalModel.chatConfig.notificationExt!(message, convID, convType) ??
(convType == ConvType.c2c
? createJSON("c2c_${message.sender}")
: createJSON("group_$convID"))
: (convType == ConvType.c2c
? createJSON("c2c_${message.sender}")
: createJSON("group_$convID"));
(convType == ConvType.c2c ? createJSON("c2c_${message.sender}") : createJSON("group_$convID"))
: (convType == ConvType.c2c ? createJSON("c2c_${message.sender}") : createJSON("group_$convID"));
String desc = message.userID ?? message.groupID ?? "";
String messageSummary = "";
@ -76,23 +71,22 @@ class TUIChatModelTools {
}
if (globalModel.chatConfig.notificationBody != null) {
desc =
globalModel.chatConfig.notificationBody!(message, convID, convType) ??
messageSummary;
desc = globalModel.chatConfig.notificationBody!(message, convID, convType) ?? messageSummary;
} else {
desc = messageSummary;
}
return OfflinePushInfo.fromJson({
"title": title,
"desc": desc,
"disablePush": false,
"ext": ext,
"iOSSound": globalModel.chatConfig.notificationIOSSound,
"androidSound": globalModel.chatConfig.notificationAndroidSound,
"ignoreIOSBadge": false,
"androidOPPOChannelID": globalModel.chatConfig.notificationOPPOChannelID,
});
return OfflinePushInfo(
title: title,
desc: desc,
disablePush: false,
ext: ext,
iOSSound: globalModel.chatConfig.notificationIOSSound,
androidSound: globalModel.chatConfig.notificationAndroidSound,
ignoreIOSBadge: false,
androidOPPOChannelID: globalModel.chatConfig.notificationOPPOChannelID,
androidVIVOClassification: 1,
);
}
V2TimMessage setUserInfoForMessage(V2TimMessage messageInfo, String? id) {
@ -102,18 +96,15 @@ class TUIChatModelTools {
messageInfo.nickName = loginUserInfo.nickName;
messageInfo.sender = loginUserInfo.userID;
}
messageInfo.timestamp =
(DateTime.now().millisecondsSinceEpoch / 1000).ceil();
messageInfo.timestamp = (DateTime.now().millisecondsSinceEpoch / 1000).ceil();
messageInfo.isSelf = true;
messageInfo.id = id;
return messageInfo;
}
String getMessageSummary(V2TimMessage message,
String? Function(V2TimMessage message)? abstractMessageBuilder) {
final String? customAbstractMessage =
abstractMessageBuilder != null ? abstractMessageBuilder(message) : null;
String getMessageSummary(V2TimMessage message, String? Function(V2TimMessage message)? abstractMessageBuilder) {
final String? customAbstractMessage = abstractMessageBuilder != null ? abstractMessageBuilder(message) : null;
if (customAbstractMessage != null) {
return customAbstractMessage;
}
@ -147,8 +138,7 @@ class TUIChatModelTools {
}
}
String getMessageAbstract(V2TimMessage message,
String? Function(V2TimMessage message)? abstractMessageBuilder) {
String getMessageAbstract(V2TimMessage message, String? Function(V2TimMessage message)? abstractMessageBuilder) {
final messageAbstract = RepliedMessageAbstract(
summary: TIM_t(getMessageSummary(message, abstractMessageBuilder)),
elemType: message.elemType,
@ -159,18 +149,13 @@ class TUIChatModelTools {
}
Future<V2TimMessage?> getExistingMessageByID(
{required String msgID,
required String conversationID,
required ConvType conversationType}) async {
final currentHistoryMsgList =
globalModel.messageListMap[conversationID] ?? [];
{required String msgID, required String conversationID, required ConvType conversationType}) async {
final currentHistoryMsgList = globalModel.messageListMap[conversationID] ?? [];
final int? targetIndex = currentHistoryMsgList.indexWhere((item) {
return item.msgID == msgID;
});
if (targetIndex != null &&
targetIndex > -1 &&
currentHistoryMsgList.isNotEmpty) {
if (targetIndex != null && targetIndex > -1 && currentHistoryMsgList.isNotEmpty) {
return currentHistoryMsgList[targetIndex];
} else {
return null;

View File

@ -6,15 +6,24 @@ import 'package:tencent_cloud_chat_sdk/enum/group_member_role.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
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_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'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/group_profile_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
@ -108,12 +117,17 @@ class TUIGroupProfileModel extends ChangeNotifier {
if (seq == null || seq == "" || seq == "0") {
_groupMemberList?.clear();
}
final res = await _groupServices.getGroupMemberList(groupID: groupID, filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ALL, count: count, nextSeq: seq ?? _groupMemberListSeq);
final res = await _groupServices.getGroupMemberList(
groupID: groupID,
filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ALL,
count: count,
nextSeq: seq ?? _groupMemberListSeq);
final groupMemberListRes = res.data;
if (res.code == 0 && groupMemberListRes != null) {
final groupMemberListTemp = groupMemberListRes.memberInfoList ?? [];
// TODO
outputLogger.i("loadGroupMemberListfinish,groupMemberListTemp, ${groupMemberListRes.nextSeq}, ${groupMemberListTemp.length}");
outputLogger.i(
"loadGroupMemberListfinish,groupMemberListTemp, ${groupMemberListRes.nextSeq}, ${groupMemberListTemp.length}");
_groupMemberList = [...?_groupMemberList, ...groupMemberListTemp];
_groupMemberListSeq = groupMemberListRes.nextSeq ?? "0";
}
@ -136,14 +150,18 @@ class TUIGroupProfileModel extends ChangeNotifier {
}
setMessageDisturb(bool value) async {
final res = await _messageService.setGroupReceiveMessageOpt(groupID: _groupID, opt: value ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE);
final res = await _messageService.setGroupReceiveMessageOpt(
groupID: _groupID,
opt: value ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE);
if (res.code == 0) {
conversation?.recvOpt = (value ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE).index;
conversation?.recvOpt =
(value ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE).index;
}
notifyListeners();
}
Future<V2TimValueCallback<V2GroupMemberInfoSearchResult>> searchGroupMember(V2TimGroupMemberSearchParam searchParam) async {
Future<V2TimValueCallback<V2GroupMemberInfoSearchResult>> searchGroupMember(
V2TimGroupMemberSearchParam searchParam) async {
final res = await _groupServices.searchGroupMembers(searchParam: searchParam);
if (res.code == 0) {}
@ -154,7 +172,9 @@ class TUIGroupProfileModel extends ChangeNotifier {
if (_groupInfo != null) {
String? originalGroupName = _groupInfo?.groupName;
_groupInfo?.groupName = groupName;
final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupID, "groupType": _groupInfo!.groupType, "groupName": groupName}));
V2TimGroupInfo v2timGroupInfo = V2TimGroupInfo(groupID: _groupID, groupType: _groupInfo!.groupType);
v2timGroupInfo.groupName = groupName;
final response = await _groupServices.setGroupInfo(info: v2timGroupInfo);
if (response.code != 0) {
_groupInfo?.groupName = originalGroupName;
}
@ -166,7 +186,9 @@ class TUIGroupProfileModel extends ChangeNotifier {
setGroupNotification(String notification) async {
if (_groupInfo != null) {
final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupID, "groupType": _groupInfo!.groupType, "notification": notification}));
V2TimGroupInfo v2timGroupInfo = V2TimGroupInfo(groupID: _groupID, groupType: _groupInfo!.groupType);
v2timGroupInfo.notification = notification;
final response = await _groupServices.setGroupInfo(info: v2timGroupInfo);
if (response.code == 0) {
notifyListeners();
_groupInfo?.notification = notification;
@ -208,7 +230,9 @@ class TUIGroupProfileModel extends ChangeNotifier {
if (_groupInfo != null) {
int? originalAddopt = _groupInfo?.groupAddOpt;
_groupInfo?.groupAddOpt = addOpt;
final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupID, "groupType": _groupInfo!.groupType, "groupAddOpt": addOpt}));
V2TimGroupInfo v2timGroupInfo = V2TimGroupInfo(groupID: _groupID, groupType: _groupInfo!.groupType);
v2timGroupInfo.groupAddOpt = addOpt;
final response = await _groupServices.setGroupInfo(info: v2timGroupInfo);
if (response.code != 0) {
_groupInfo?.groupAddOpt = originalAddopt;
}
@ -219,7 +243,8 @@ class TUIGroupProfileModel extends ChangeNotifier {
}
Future<V2TimCallback> setMemberToNormal(String userID) async {
final res = await _groupServices.setGroupMemberRole(groupID: _groupID, userID: userID, role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_MEMBER);
final res = await _groupServices.setGroupMemberRole(
groupID: _groupID, userID: userID, role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_MEMBER);
if (res.code == 0) {
final targetIndex = _groupMemberList!.indexWhere((e) => e!.userID == userID);
if (targetIndex != -1) {
@ -233,7 +258,8 @@ class TUIGroupProfileModel extends ChangeNotifier {
}
Future<V2TimCallback> setMemberToAdmin(String userID) async {
final res = await _groupServices.setGroupMemberRole(groupID: _groupID, userID: userID, role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_ADMIN);
final res = await _groupServices.setGroupMemberRole(
groupID: _groupID, userID: userID, role: GroupMemberRoleTypeEnum.V2TIM_GROUP_MEMBER_ROLE_ADMIN);
if (res.code == 0) {
final targetIndex = _groupMemberList!.indexWhere((e) => e!.userID == userID);
if (targetIndex != -1) {
@ -252,7 +278,8 @@ class TUIGroupProfileModel extends ChangeNotifier {
}
//
final preOwnerIndex = _groupMemberList!.indexWhere((e) => e!.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER);
final preOwnerIndex =
_groupMemberList!.indexWhere((e) => e!.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER);
if (preOwnerIndex != -1) {
final preOwnerElem = _groupMemberList![preOwnerIndex];
preOwnerElem?.role = GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER;
@ -297,7 +324,9 @@ class TUIGroupProfileModel extends ChangeNotifier {
Future<V2TimCallback?> setMuteAll(bool muteAll) async {
if (_groupInfo != null) {
_groupInfo?.isAllMuted = muteAll;
final response = await _groupServices.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupID": _groupInfo!.groupID, "groupType": _groupInfo!.groupType, "isAllMuted": muteAll}));
V2TimGroupInfo v2timGroupInfo = V2TimGroupInfo(groupID: _groupID, groupType: _groupInfo!.groupType);
v2timGroupInfo.isAllMuted = muteAll;
final response = await _groupServices.setGroupInfo(info: v2timGroupInfo);
if (response.code != 0) {
_groupInfo?.isAllMuted = muteAll;
}

View File

@ -3,11 +3,16 @@
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/profile_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/model/profile_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart';
@ -18,12 +23,9 @@ import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
class TUIProfileViewModel extends ChangeNotifier {
final ConversationService _conversationService =
serviceLocator<ConversationService>();
final FriendshipServices _friendshipServices =
serviceLocator<FriendshipServices>();
final TUIFriendShipViewModel _friendShipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final ConversationService _conversationService = serviceLocator<ConversationService>();
final FriendshipServices _friendshipServices = serviceLocator<FriendshipServices>();
final TUIFriendShipViewModel _friendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final CoreServicesImpl _coreServices = serviceLocator<CoreServicesImpl>();
final MessageService _messageService = serviceLocator<MessageService>();
@ -59,16 +61,14 @@ class TUIProfileViewModel extends ChangeNotifier {
}
loadData({required String userID, bool isNeedConversation = true}) async {
if(userID.isEmpty){
if (userID.isEmpty) {
return;
}
V2TimFriendInfo? friendUserInfo;
V2TimConversation? conversation;
final userInfoList =
await _friendshipServices.getFriendsInfo(userIDList: [userID]);
final checkFriend = await _friendshipServices.checkFriend(
userIDList: [userID],
checkType: FriendTypeEnum.V2TIM_FRIEND_TYPE_SINGLE);
final userInfoList = await _friendshipServices.getFriendsInfo(userIDList: [userID]);
final checkFriend =
await _friendshipServices.checkFriend(userIDList: [userID], checkType: FriendTypeEnum.V2TIM_FRIEND_TYPE_SINGLE);
if (checkFriend != null) {
final res = checkFriend.first;
@ -82,42 +82,33 @@ class TUIProfileViewModel extends ChangeNotifier {
}
if (isNeedConversation) {
conversation = await _conversationService.getConversation(
conversationID: "c2c_$userID");
conversation = await _conversationService.getConversation(conversationID: "c2c_$userID");
_isDisturb = conversation?.recvOpt == 2;
}
final friendInfo =
await _lifeCycle?.didGetFriendInfo(friendUserInfo) ?? friendUserInfo;
final friendInfo = await _lifeCycle?.didGetFriendInfo(friendUserInfo) ?? friendUserInfo;
_isDisturb = conversation?.recvOpt == 2;
_userProfile =
UserProfile(friendInfo: friendInfo, conversation: conversation);
_userProfile = UserProfile(friendInfo: friendInfo, conversation: conversation);
_shouldAddToBlackList = _friendShipViewModel.blockList
.indexWhere((element) => element.userID == userID) >
-1;
_shouldAddToBlackList = _friendShipViewModel.blockList.indexWhere((element) => element.userID == userID) > -1;
notifyListeners();
}
Future<V2TimCallback> pinedConversation(bool isPined, String convID) async {
final res = await _conversationService.pinConversation(
conversationID: convID, isPinned: isPined);
final res = await _conversationService.pinConversation(conversationID: convID, isPinned: isPined);
_userProfile?.conversation!.isPinned = isPined;
notifyListeners();
return res;
}
Future<List<V2TimFriendOperationResult>?> addToBlackList(
bool shouldAdd, String userID) async {
if (_lifeCycle?.shouldAddToBlockList != null &&
await _lifeCycle!.shouldAddToBlockList(userID) == false) {
Future<List<V2TimFriendOperationResult>?> addToBlackList(bool shouldAdd, String userID) async {
if (_lifeCycle?.shouldAddToBlockList != null && await _lifeCycle!.shouldAddToBlockList(userID) == false) {
return null;
}
if (shouldAdd) {
final res =
await _friendshipServices.addToBlackList(userIDList: [userID]);
final res = await _friendshipServices.addToBlackList(userIDList: [userID]);
if (res != null && res.isNotEmpty) {
final result = res.first;
if (result.resultCode == 0) {
@ -128,15 +119,13 @@ class TUIProfileViewModel extends ChangeNotifier {
notifyListeners();
return res;
} else {
final res =
await _friendshipServices.deleteFromBlackList(userIDList: [userID]);
final res = await _friendshipServices.deleteFromBlackList(userIDList: [userID]);
if (res != null && res.isNotEmpty) {
final result = res.first;
if (result.resultCode == 0) {
_shouldAddToBlackList = false;
final checkFriend = await _friendshipServices.checkFriend(
userIDList: [userID],
checkType: FriendTypeEnum.V2TIM_FRIEND_TYPE_SINGLE);
final checkFriend = await _friendshipServices
.checkFriend(userIDList: [userID], checkType: FriendTypeEnum.V2TIM_FRIEND_TYPE_SINGLE);
if (checkFriend != null) {
final res = checkFriend.first;
_friendType = res.resultType;
@ -150,13 +139,11 @@ class TUIProfileViewModel extends ChangeNotifier {
}
Future<V2TimFriendOperationResult?> deleteFriend(String userID, {bool needUpdateData = true}) async {
if (_lifeCycle?.shouldDeleteFriend != null &&
await _lifeCycle!.shouldDeleteFriend(userID) == false) {
if (_lifeCycle?.shouldDeleteFriend != null && await _lifeCycle!.shouldDeleteFriend(userID) == false) {
return null;
}
final res = await _friendshipServices.deleteFromFriendList(
userIDList: [userID],
deleteType: FriendTypeEnum.V2TIM_FRIEND_TYPE_BOTH);
final res = await _friendshipServices
.deleteFromFriendList(userIDList: [userID], deleteType: FriendTypeEnum.V2TIM_FRIEND_TYPE_BOTH);
if (res != null) {
_conversationService.deleteConversation(conversationID: "c2c_$userID");
if (needUpdateData) {
@ -169,11 +156,9 @@ class TUIProfileViewModel extends ChangeNotifier {
}
Future<V2TimCallback> changeFriendVerificationMethod(int allowType) async {
final res = await _coreServices.setSelfInfo(
userFullInfo: V2TimUserFullInfo.fromJson(
{"allowType": allowType},
),
);
V2TimUserFullInfo userFullInfo = V2TimUserFullInfo();
userFullInfo.allowType = allowType;
final res = await _coreServices.setSelfInfo(userFullInfo: userFullInfo);
if (res.code == 0) {
_userProfile?.friendInfo!.userProfile!.allowType = allowType;
notifyListeners();
@ -182,12 +167,10 @@ class TUIProfileViewModel extends ChangeNotifier {
}
Future<V2TimFriendOperationResult?> addFriend(String userID) async {
if (_lifeCycle?.shouldAddFriend != null &&
await _lifeCycle!.shouldAddFriend(userID) == false) {
if (_lifeCycle?.shouldAddFriend != null && await _lifeCycle!.shouldAddFriend(userID) == false) {
return null;
}
final res = await _friendshipServices.addFriend(
userID: userID, addType: FriendTypeEnum.V2TIM_FRIEND_TYPE_BOTH);
final res = await _friendshipServices.addFriend(userID: userID, addType: FriendTypeEnum.V2TIM_FRIEND_TYPE_BOTH);
if (res.code == 0) {
loadData(userID: userID);
return res.data;
@ -197,8 +180,7 @@ class TUIProfileViewModel extends ChangeNotifier {
}
Future<V2TimCallback> updateRemarks(String userID, String remark) async {
final res = await _friendshipServices.setFriendInfo(
userID: userID, friendRemark: remark);
final res = await _friendshipServices.setFriendInfo(userID: userID, friendRemark: remark);
if (res.code == 0) {
_userProfile?.friendInfo!.friendRemark = remark;
@ -210,9 +192,7 @@ class TUIProfileViewModel extends ChangeNotifier {
Future<V2TimCallback> setMessageDisturb(String userID, bool isDisturb) async {
final res = await _messageService.setC2CReceiveMessageOpt(
userIDList: [userID],
opt: isDisturb
? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE
: ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE);
opt: isDisturb ? ReceiveMsgOptEnum.V2TIM_RECEIVE_NOT_NOTIFY_MESSAGE : ReceiveMsgOptEnum.V2TIM_RECEIVE_MESSAGE);
if (res.code == 0) {
_isDisturb = isDisturb;
}
@ -221,7 +201,7 @@ class TUIProfileViewModel extends ChangeNotifier {
}
updateUserInfo(V2TimUserFullInfo userFullInfo) {
if (userFullInfo.nickName != null) {
if (userFullInfo.nickName != null) {
_userProfile?.friendInfo!.userProfile?.nickName = userFullInfo.nickName;
}
if (userFullInfo.faceUrl != null) {

View File

@ -12,15 +12,24 @@ import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_status.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_custom_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_image.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_download_progress.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_custom_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_custom_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_image.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_image.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_download_progress.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_download_progress.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/chat_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_model_tools.dart';
@ -58,7 +67,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
ChatLifeCycle? _lifeCycle;
bool _isDownloading = false;
final List<Map<String, String>> _waitingDownloadList = List.empty(growable: true); // example {"savePath":"","url":"",msgId:""}
final List<Map<String, String>> _waitingDownloadList =
List.empty(growable: true); // example {"savePath":"","url":"",msgId:""}
int _totalUnreadCount = 0;
String localKeyPrefix = "TUIKit_conversation_stored_";
String localMsgIDListKey = "TUIKit_conversation_list";
@ -210,9 +220,13 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
Map<String, V2TimMessageReceipt> get messageReadReceiptMap => _messageReadReceiptMap;
String get currentSelectedConv => _currentConversationList.isNotEmpty ? _currentConversationList[_currentConversationList.length - 1].conversationID : "";
String get currentSelectedConv => _currentConversationList.isNotEmpty
? _currentConversationList[_currentConversationList.length - 1].conversationID
: "";
ConvType? get currentSelectedConvType => _currentConversationList.isNotEmpty ? _currentConversationList[_currentConversationList.length - 1].conversationType : null;
ConvType? get currentSelectedConvType => _currentConversationList.isNotEmpty
? _currentConversationList[_currentConversationList.length - 1].conversationType
: null;
setCurrentConversation(CurrentConversation value) {
_currentConversationList.add(value);
@ -221,7 +235,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
clearCurrentConversation() {
// Only keep the last 20 messages when existing a chat.
_messageListMap[currentSelectedConv] = (_messageListMap[currentSelectedConv] ?? []).sublist(0, max(0, min(10, ((_messageListMap[currentSelectedConv] ?? []).length - 1))));
_messageListMap[currentSelectedConv] = (_messageListMap[currentSelectedConv] ?? [])
.sublist(0, max(0, min(10, ((_messageListMap[currentSelectedConv] ?? []).length - 1))));
if (_currentConversationList.isNotEmpty) {
_currentConversationList.removeLast();
}
@ -290,11 +305,14 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
if (conversationItem == null || conversationItem.type == null) {
return;
}
final conversationID = TencentUtils.checkString(conversationItem.userID) ?? TencentUtils.checkString(conversationItem.groupID) ?? conversationItem.conversationID;
final conversationID = TencentUtils.checkString(conversationItem.userID) ??
TencentUtils.checkString(conversationItem.groupID) ??
conversationItem.conversationID;
if (messageListMap[conversationID] == null || messageListMap[conversationID]!.isEmpty) {
index++;
Future.delayed(Duration(milliseconds: 500 * index), () {
preloadMessageForConversation(conversationID: conversationID, conversationType: ConvType.values[conversationItem.type!]);
preloadMessageForConversation(
conversationID: conversationID, conversationType: ConvType.values[conversationItem.type!]);
});
}
}
@ -305,7 +323,10 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
required String conversationID,
}) async {
final response = await _messageService.getHistoryMessageList(
count: 10, getType: HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, userID: conversationType == ConvType.c2c ? conversationID : null, groupID: conversationType == ConvType.group ? conversationID : null);
count: 10,
getType: HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
userID: conversationType == ConvType.c2c ? conversationID : null,
groupID: conversationType == ConvType.group ? conversationID : null);
if (_messageListMap[conversationID] == null || _messageListMap[conversationID]!.isEmpty) {
_messageListMap[conversationID] = response;
}
@ -324,9 +345,11 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
prefs.remove(localMsgIDListKey);
}
Future<void> updateMessageFromController({required String msgID, required String conversationID, required ConvType conversationType}) async {
Future<void> updateMessageFromController(
{required String msgID, required String conversationID, required ConvType conversationType}) async {
final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>();
V2TimMessage? newMessage = await tools.getExistingMessageByID(msgID: msgID, conversationID: conversationID, conversationType: conversationType);
V2TimMessage? newMessage = await tools.getExistingMessageByID(
msgID: msgID, conversationID: conversationID, conversationType: conversationType);
if (newMessage != null) {
onMessageModified(newMessage, currentSelectedConv);
}
@ -352,7 +375,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
List<V2TimMessage> needPreViewList = msgList.sublist(0, max(0, min(5, msgList.length - 1)));
for (var msgItem in needPreViewList) {
V2TimImage? getImageFromList(V2TimImageTypesEnum imgType) {
V2TimImage? img = MessageUtils.getImageFromImgList(msgItem.imageElem?.imageList, HistoryMessageDartConstant.imgPriorMap[imgType] ?? HistoryMessageDartConstant.oriImgPrior);
V2TimImage? img = MessageUtils.getImageFromImgList(msgItem.imageElem?.imageList,
HistoryMessageDartConstant.imgPriorMap[imgType] ?? HistoryMessageDartConstant.oriImgPrior);
return img;
}
@ -487,7 +511,13 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
return;
}
V2TimMsgCreateInfoResult? res = await _messageService.createCustomMessage(
data: json.encode({"businessID": "user_typing_status", "typingStatus": isEditing == true ? 1 : 0, "userAction": 14, "version": 0, "actionParam": isEditing == true ? "EIMAMSG_InputStatus_Ing" : "EIMAMSG_InputStatus_End"}));
data: json.encode({
"businessID": "user_typing_status",
"typingStatus": isEditing == true ? 1 : 0,
"userAction": 14,
"version": 0,
"actionParam": isEditing == true ? "EIMAMSG_InputStatus_Ing" : "EIMAMSG_InputStatus_End"
}));
if (res != null) {
_sendMessage(
id: res.id!,
@ -524,11 +554,12 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
_onReceiveNewMsg(V2TimMessage msgComing) async {
final convID = TencentUtils.checkString(msgComing.userID) ?? msgComing.groupID;
if(convID != currentSelectedConv){
if (convID != currentSelectedConv) {
return;
}
final V2TimMessage? newMsg = _lifeCycle?.newMessageWillMount != null ? await _lifeCycle?.newMessageWillMount(msgComing) : msgComing;
final V2TimMessage? newMsg =
_lifeCycle?.newMessageWillMount != null ? await _lifeCycle?.newMessageWillMount(msgComing) : msgComing;
if (newMsg == null) {
return;
}
@ -583,27 +614,24 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
onMessageRevoked(String msgID, [String? convID]) {
final activeMessageList = _messageListMap[convID ?? currentSelectedConv];
if (activeMessageList != null) {
final findeIndex = activeMessageList.indexWhere((element) => element.msgID == msgID);
if (findeIndex != -1) {
final findeIndex = activeMessageList.indexWhere((element) => element.msgID == msgID);
if (findeIndex != -1) {
final targetItem = activeMessageList[findeIndex];
targetItem.status = MessageStatus.V2TIM_MSG_STATUS_LOCAL_REVOKED;
targetItem.id = DateTime.now().millisecondsSinceEpoch.toString();
activeMessageList[findeIndex] = targetItem;
final findIndex = activeMessageList.indexWhere((element) => element.msgID == msgID);
if (findIndex != -1) {
final targetItem = activeMessageList[findIndex];
targetItem.status = MessageStatus.V2TIM_MSG_STATUS_LOCAL_REVOKED;
targetItem.id = DateTime.now().millisecondsSinceEpoch.toString();
activeMessageList[findIndex] = targetItem;
bool isUnreadMessage = _receivedUnreadMessageList.any((element) => element.msgID == msgID);
if (!(targetItem.isSelf ?? true) && isUnreadMessage) {
bool isUnreadMessage = _receivedUnreadMessageList.any((element) => element.msgID == msgID);
if (!(targetItem.isSelf ?? true) && isUnreadMessage) {
if (_unreadCountForTongue > 0) {
if (_unreadCountForTongue > 0) {
if (_unreadCountForTongue > 0) {
_unreadCountForTongue--;
}
if (_receivedNewMessageCount > 0) {
_receivedNewMessageCount--;
}
_receivedUnreadMessageList.removeWhere((element) => element.msgID == targetItem.msgID);
_unreadCountForTongue--;
}
if (_receivedNewMessageCount > 0) {
_receivedNewMessageCount--;
}
_receivedUnreadMessageList.removeWhere((element) => element.msgID == targetItem.msgID);
}
}
}
@ -615,7 +643,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
onMessageModified(V2TimMessage modifiedMessage, [String? convID]) async {
modifiedMessage.id = DateTime.now().millisecondsSinceEpoch.toString();
final String? exactId = TencentUtils.checkString(modifiedMessage.userID) ?? TencentUtils.checkString(modifiedMessage.groupID);
final String? exactId =
TencentUtils.checkString(modifiedMessage.userID) ?? TencentUtils.checkString(modifiedMessage.groupID);
final activeMessageList = _messageListMap[convID ?? exactId];
if (activeMessageList == null || activeMessageList.isEmpty) {
return;
@ -668,7 +697,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
Future<void> onMessageDownloadProgressCallback(V2TimMessageDownloadProgress messageProgress) async {
final currentProgress = getMessageProgress(messageProgress.msgID);
print("onMessageDownloadProgressCallback, ${messageProgress.type} - ${messageProgress.isFinish} - ${messageProgress.currentSize} - $currentProgress - ");
print(
"onMessageDownloadProgressCallback, ${messageProgress.type} - ${messageProgress.isFinish} - ${messageProgress.currentSize} - $currentProgress - ");
if (messageProgress.isError || messageProgress.errorCode != 0) {
V2TimMessage? message = await _findAndRetrieveMessage(messageProgress.msgID);
@ -697,7 +727,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
const originalImageType = 0;
if (!isImageType && !isVideoType) {
_updateMessageLocationAndDownloadFile(messageProgress);
} else if ((isImageType && messageProgress.type == originalImageType) || (isVideoType && !messageProgress.isSnapshot)) {
} else if ((isImageType && messageProgress.type == originalImageType) ||
(isVideoType && !messageProgress.isSnapshot)) {
Future.delayed(const Duration(seconds: 1), () => _updateMessageAndDownloadFile(message, messageProgress));
} else {
return;
@ -713,7 +744,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
}
void _updateMessageAndDownloadFile(V2TimMessage message, V2TimMessageDownloadProgress messageProgress) {
updateAsyncMessage(message, TencentUtils.checkString(message.userID) ?? TencentUtils.checkString(message.groupID) ?? "");
updateAsyncMessage(
message, TencentUtils.checkString(message.userID) ?? TencentUtils.checkString(message.groupID) ?? "");
_updateMessageLocationAndDownloadFile(messageProgress);
}
@ -771,7 +803,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>();
List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? [];
if (messageInfo != null) {
final messageInfoWithSender = messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id!) : messageInfo;
final messageInfoWithSender =
messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id!) : messageInfo;
messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING;
currentHistoryMsgList = [messageInfoWithSender, ...currentHistoryMsgList];
setMessageList(convID, currentHistoryMsgList);
@ -792,7 +825,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
setInputField: setInputField,
id: messageInfo.id as String,
convType: ConvType.values[convType.index],
offlinePushInfo: offlinePushInfo ?? tools.buildMessagePushInfo(messageInfo, convID, ConvType.values[convType.index]),
offlinePushInfo:
offlinePushInfo ?? tools.buildMessagePushInfo(messageInfo, convID, ConvType.values[convType.index]),
);
}
return null;
@ -819,13 +853,20 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
V2TimMsgCreateInfoResult? textMessageInfo = await _messageService.createTextMessage(text: text);
textMessageInfo = await _messageService.createTextAtMessage(
text: text + "\n@${TencentUtils.checkString(messageBeenReplied.nickName) ?? TencentUtils.checkString(messageBeenReplied.sender) ?? TencentUtils.checkString(messageBeenReplied.userID)}",
atUserList: [TencentUtils.checkString(messageBeenReplied.sender) ?? TencentUtils.checkString(messageBeenReplied.userID) ?? ""]);
text: text +
"\n@${TencentUtils.checkString(messageBeenReplied.nickName) ?? TencentUtils.checkString(messageBeenReplied.sender) ?? TencentUtils.checkString(messageBeenReplied.userID)}",
atUserList: [
TencentUtils.checkString(messageBeenReplied.sender) ??
TencentUtils.checkString(messageBeenReplied.userID) ??
""
]);
final V2TimMessage? messageInfo = textMessageInfo!.messageInfo;
if (messageInfo != null) {
final messageInfoWithSender = messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id ?? textMessageInfo.id ?? "") : messageInfo;
final messageInfoWithSender = messageInfo.sender == null
? tools.setUserInfoForMessage(messageInfo, messageInfo.id ?? textMessageInfo.id ?? "")
: messageInfo;
messageInfoWithSender.status = MessageStatus.V2TIM_MSG_STATUS_SENDING;
final hasNickName = messageBeenReplied.nickName != null && messageBeenReplied.nickName != "";
final cloudCustomData = {
@ -845,7 +886,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
return _sendMessage(
cloudCustomData: json.encode(cloudCustomData),
id: textMessageInfo.id as String,
offlinePushInfo: offlinePushInfo ?? tools.buildMessagePushInfo(messageInfo, convID, ConvType.values[convType.index]),
offlinePushInfo:
offlinePushInfo ?? tools.buildMessagePushInfo(messageInfo, convID, ConvType.values[convType.index]),
priority: priority,
onlineUserOnly: onlineUserOnly,
isExcludedFromUnreadCount: isExcludedFromUnreadCount,
@ -939,7 +981,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
return sendMsgRes;
}
void setMessageList(String conversationID, List<V2TimMessage> messageList, {bool needResetNewMessageCount = true, bool isDeleteMsg = false}) {
void setMessageList(String conversationID, List<V2TimMessage> messageList,
{bool needResetNewMessageCount = true, bool isDeleteMsg = false}) {
_messageListMap[conversationID] = messageList;
if (needResetNewMessageCount) {
_receivedNewMessageCount = 0;
@ -955,11 +998,14 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
notifyListeners();
}
updateMessage(V2TimValueCallback<V2TimMessage> sendMsgRes, String convID, String id, ConvType convType, GroupReceiptAllowType? groupType, ValueChanged<String>? setInputField) {
updateMessage(V2TimValueCallback<V2TimMessage> sendMsgRes, String convID, String id, ConvType convType,
GroupReceiptAllowType? groupType, ValueChanged<String>? setInputField) {
List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? [];
final V2TimMessage sendMsgResData = sendMsgRes.data as V2TimMessage;
final findIdIndex = currentHistoryMsgList.indexWhere((element) => element.id == id);
final targetIndex = findIdIndex == -1 ? currentHistoryMsgList.indexWhere((element) => element.msgID == sendMsgResData.msgID) : findIdIndex;
final targetIndex = findIdIndex == -1
? currentHistoryMsgList.indexWhere((element) => element.msgID == sendMsgResData.msgID)
: findIdIndex;
if (targetIndex != -1) {
currentHistoryMsgList[targetIndex] = sendMsgResData;
} else {
@ -998,13 +1044,18 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
}
List<V2TimMessage>? getMessageList(String conversationID) {
final list = (messageListMap[conversationID]?.reversed.toList() ?? []).where((element) => _lifeCycle?.messageShouldMount(element) ?? true).toList();
final list = (messageListMap[conversationID]?.reversed.toList() ?? [])
.where((element) => _lifeCycle?.messageShouldMount(element) ?? true)
.toList();
final finalList = _lifeCycle?.messageListShouldMount(list) ?? list;
final List<V2TimMessage> listWithTimestamp = [];
final interval = chatConfig.timeDividerConfig?.timeInterval ?? 300;
for (var item in finalList) {
{
if (listWithTimestamp.isEmpty || (listWithTimestamp[listWithTimestamp.length - 1].timestamp != null && item.timestamp != null && (item.timestamp! - listWithTimestamp[listWithTimestamp.length - 1].timestamp! > interval))) {
if (listWithTimestamp.isEmpty ||
(listWithTimestamp[listWithTimestamp.length - 1].timestamp != null &&
item.timestamp != null &&
(item.timestamp! - listWithTimestamp[listWithTimestamp.length - 1].timestamp! > interval))) {
listWithTimestamp.add(V2TimMessage(
userID: '',
isSelf: false,
@ -1013,7 +1064,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
timestamp: item.timestamp,
));
}
listWithTimestamp.add(V2TimMessage.fromJson(item.toJson()));
listWithTimestamp.add(item);
}
}
return listWithTimestamp.reversed.toList();

View File

@ -3,9 +3,12 @@
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/conversation_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
@ -135,7 +138,7 @@ class TUIConversationViewModel extends ChangeNotifier {
if (!PlatformUtils().isWeb) {
loadInitConversation();
}
}, onConversationDeleted:(List<String> conversationIDList) {
}, onConversationDeleted: (List<String> conversationIDList) {
_onConversationDeleted(conversationIDList);
for (var conversationID in conversationIDList) {
String resultID = "";
@ -181,8 +184,10 @@ class TUIConversationViewModel extends ChangeNotifier {
} else {
combinedConversationList = [..._conversationList, ...conversationList];
}
final List<V2TimConversation?> finalConversationList = await _lifeCycle?.conversationListWillMount(combinedConversationList) ?? combinedConversationList;
_conversationList = removeDuplicates<V2TimConversation?>(finalConversationList, (item1, item2) => item1?.conversationID == item2?.conversationID);
final List<V2TimConversation?> finalConversationList =
await _lifeCycle?.conversationListWillMount(combinedConversationList) ?? combinedConversationList;
_conversationList = removeDuplicates<V2TimConversation?>(
finalConversationList, (item1, item2) => item1?.conversationID == item2?.conversationID);
notifyListeners();
}
_totalUnReadCount = await _conversationService.getTotalUnreadCount();
@ -203,7 +208,8 @@ class TUIConversationViewModel extends ChangeNotifier {
}
Future<V2TimCallback?> clearHistoryMessage({required String convID, required int convType}) async {
if (_lifeCycle?.shouldClearHistoricalMessageForConversation != null && await _lifeCycle!.shouldClearHistoricalMessageForConversation(convID) == false) {
if (_lifeCycle?.shouldClearHistoricalMessageForConversation != null &&
await _lifeCycle!.shouldClearHistoricalMessageForConversation(convID) == false) {
return null;
}
@ -222,7 +228,8 @@ class TUIConversationViewModel extends ChangeNotifier {
}
Future<V2TimCallback?> deleteConversation({required String conversationID}) async {
if (_lifeCycle?.shouldDeleteConversation != null && await _lifeCycle!.shouldDeleteConversation(conversationID) == false) {
if (_lifeCycle?.shouldDeleteConversation != null &&
await _lifeCycle!.shouldDeleteConversation(conversationID) == false) {
return null;
}
final res = await _conversationService.deleteConversation(conversationID: conversationID);
@ -251,7 +258,8 @@ class TUIConversationViewModel extends ChangeNotifier {
int index = _conversationList.indexWhere((item) => item!.conversationID == list[i]);
if (index > -1) {
_conversationList.removeAt(index);
_conversationList = removeDuplicates<V2TimConversation?>(_conversationList, (item1, item2) => item1?.conversationID == item2?.conversationID);
_conversationList = removeDuplicates<V2TimConversation?>(
_conversationList, (item1, item2) => item1?.conversationID == item2?.conversationID);
}
}
notifyListeners();
@ -259,7 +267,8 @@ class TUIConversationViewModel extends ChangeNotifier {
_addNewConversation(List<V2TimConversation> list) {
_conversationList.addAll(list);
_conversationList = removeDuplicates<V2TimConversation?>(_conversationList, (item1, item2) => item1?.conversationID == item2?.conversationID);
_conversationList = removeDuplicates<V2TimConversation?>(
_conversationList, (item1, item2) => item1?.conversationID == item2?.conversationID);
notifyListeners();
}
@ -278,13 +287,16 @@ class TUIConversationViewModel extends ChangeNotifier {
String? groupID,
bool isAllowWeb = true,
}) async {
assert(!isTopic || (groupID != null && groupID.isNotEmpty), "When 'isTopic' is true, 'groupID' must not be null or empty.");
assert(!isTopic || (groupID != null && groupID.isNotEmpty),
"When 'isTopic' is true, 'groupID' must not be null or empty.");
if (PlatformUtils().isWeb && isAllowWeb) {
webDraftMap[conversationID] = draftText ?? "";
return V2TimCallback(code: 0, desc: "");
} else {
if (isTopic) {
final topicInfoList = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getTopicInfoList(groupID: groupID!, topicIDList: [conversationID]);
final topicInfoList = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getTopicInfoList(groupID: groupID!, topicIDList: [conversationID]);
final topicInfo = topicInfoList.data?.first.topicInfo;
topicInfo?.draftText = draftText;
final res = await TencentImSDKPlugin.v2TIMManager.getGroupManager().setTopicInfo(topicInfo: topicInfo!);

View File

@ -4,12 +4,18 @@ import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimFriendshipListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_response_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_operation_result.dart';
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_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/block_list_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/friend_list_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/new_contact_life_cycle.dart';
@ -19,11 +25,9 @@ import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
class TUIFriendShipViewModel extends ChangeNotifier {
final FriendshipServices _friendshipServices =
serviceLocator<FriendshipServices>();
final FriendshipServices _friendshipServices = serviceLocator<FriendshipServices>();
final GroupServices _groupServices = serviceLocator<GroupServices>();
final TUISelfInfoViewModel selfInfoViewModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
late V2TimFriendshipListener friendShipListener;
List<V2TimFriendApplication?>? _friendApplicationList;
List<V2TimFriendInfo>? _friendList;
@ -68,8 +72,7 @@ class TUIFriendShipViewModel extends ChangeNotifier {
int get friendApplicationAmount => _friendApplicationAmount;
List<V2TimFriendApplication?>? get friendApplicationList =>
_friendApplicationList;
List<V2TimFriendApplication?>? get friendApplicationList => _friendApplicationList;
TUIFriendShipViewModel() {
friendShipListener = V2TimFriendshipListener(
@ -125,21 +128,17 @@ class TUIFriendShipViewModel extends ChangeNotifier {
}
loadUserStatus() async {
if (selfInfoViewModel.globalConfig?.isShowOnlineStatus == false ||
friendList == null ||
friendList!.isEmpty) {
if (selfInfoViewModel.globalConfig?.isShowOnlineStatus == false || friendList == null || friendList!.isEmpty) {
return;
}
final List<List<String>> userIDSet = [];
final int needHowManyRequest = ((friendList!.length) / 500).ceil();
final int amountEachRequest =
((friendList!.length) / needHowManyRequest).ceil();
final int amountEachRequest = ((friendList!.length) / needHowManyRequest).ceil();
for (int i = 0; i < needHowManyRequest; i++) {
userIDSet.add(friendList!
.getRange(i * amountEachRequest,
min(friendList!.length, (i + 1) * amountEachRequest))
.getRange(i * amountEachRequest, min(friendList!.length, (i + 1) * amountEachRequest))
.map((e) => e.userID)
.toList());
}
@ -161,19 +160,15 @@ class TUIFriendShipViewModel extends ChangeNotifier {
final newContactRes = await _friendshipServices.getFriendApplicationList();
// Only Received Application
_friendApplicationList = newContactRes?.friendApplicationList
?.where((item) =>
item!.type ==
FriendApplicationTypeEnum.V2TIM_FRIEND_APPLICATION_COME_IN.index)
?.where((item) => item!.type == FriendApplicationTypeEnum.V2TIM_FRIEND_APPLICATION_COME_IN.index)
.toList();
_friendApplicationAmount = _friendApplicationList?.length ?? 0;
notifyListeners();
}
Future<void> loadContactListData() async {
final List<V2TimFriendInfo> res =
await _friendshipServices.getFriendList() ?? [];
final memberList =
await _contactListLifeCycle?.friendListWillMount(res) ?? res;
final List<V2TimFriendInfo> res = await _friendshipServices.getFriendList() ?? [];
final memberList = await _contactListLifeCycle?.friendListWillMount(res) ?? res;
_friendList = memberList;
notifyListeners();
return;
@ -206,15 +201,12 @@ class TUIFriendShipViewModel extends ChangeNotifier {
return;
}
Future<List<V2TimFriendOperationResult>?> deleteFromBlockList(
List<String> userIDList) async {
Future<List<V2TimFriendOperationResult>?> deleteFromBlockList(List<String> userIDList) async {
if (_blockListLifeCycle?.shouldDeleteFromBlockList != null &&
await _blockListLifeCycle!.shouldDeleteFromBlockList(userIDList) ==
false) {
await _blockListLifeCycle!.shouldDeleteFromBlockList(userIDList) == false) {
return null;
}
final res =
await _friendshipServices.deleteFromBlackList(userIDList: userIDList);
final res = await _friendshipServices.deleteFromBlackList(userIDList: userIDList);
if (res != null) {
return res;
}
@ -226,8 +218,7 @@ class TUIFriendShipViewModel extends ChangeNotifier {
int type,
) async {
if (_newContactLifeCycle?.shouldAcceptContactApplication != null &&
await _newContactLifeCycle!.shouldAcceptContactApplication(userID) ==
false) {
await _newContactLifeCycle!.shouldAcceptContactApplication(userID) == false) {
return null;
}
final res = await _friendshipServices.acceptFriendApplication(
@ -246,8 +237,7 @@ class TUIFriendShipViewModel extends ChangeNotifier {
int type,
) async {
if (_newContactLifeCycle?.shouldRefuseContactApplication != null &&
await _newContactLifeCycle!.shouldRefuseContactApplication(userID) ==
false) {
await _newContactLifeCycle!.shouldRefuseContactApplication(userID) == false) {
return null;
}
final res = await _friendshipServices.refuseFriendApplication(
@ -262,8 +252,7 @@ class TUIFriendShipViewModel extends ChangeNotifier {
Future<List<V2TimGroupMemberFullInfo?>> getGroupMembersInfo(
{required String groupID, required List<String> memberList}) async {
final res = await _groupServices.getGroupMembersInfo(
groupID: groupID, memberList: memberList);
final res = await _groupServices.getGroupMembersInfo(groupID: groupID, memberList: memberList);
return res.data ?? [];
}

View File

@ -2,31 +2,34 @@
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result_item.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_search_param.dart';
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_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result_item.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result_item.dart';
import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart';
enum KeywordListMatchType {
V2TIM_KEYWORD_LIST_MATCH_TYPE_OR,
V2TIM_KEYWORD_LIST_MATCH_TYPE_AND
}
enum KeywordListMatchType { V2TIM_KEYWORD_LIST_MATCH_TYPE_OR, V2TIM_KEYWORD_LIST_MATCH_TYPE_AND }
class TUISearchViewModel extends ChangeNotifier {
final FriendshipServices _friendshipServices =
serviceLocator<FriendshipServices>();
final FriendshipServices _friendshipServices = serviceLocator<FriendshipServices>();
final MessageService _messageService = serviceLocator<MessageService>();
final ConversationService _conversationService =
serviceLocator<ConversationService>();
final ConversationService _conversationService = serviceLocator<ConversationService>();
final GroupServices _groupServices = serviceLocator<GroupServices>();
List<V2TimFriendInfoResult>? friendList = [];
@ -43,8 +46,7 @@ class TUISearchViewModel extends ChangeNotifier {
List<V2TimConversation?> conversationList = [];
Future<List<V2TimConversation?>?> initConversationMsg() async {
final conversationResult = await _conversationService.getConversationList(
nextSeq: "0", count: 500);
final conversationResult = await _conversationService.getConversationList(nextSeq: "0", count: 500);
final conversationListData = conversationResult?.conversationList;
conversationList = conversationListData ?? [];
notifyListeners();
@ -60,21 +62,20 @@ class TUISearchViewModel extends ChangeNotifier {
}
void searchFriendByKey(String searchKey) async {
final searchResult = await _friendshipServices.searchFriends(
searchParam: V2TimFriendSearchParam(keywordList: [searchKey]));
final searchResult =
await _friendshipServices.searchFriends(searchParam: V2TimFriendSearchParam(keywordList: [searchKey]));
friendList = searchResult;
notifyListeners();
}
void searchGroupByKey(String searchKey) async {
final searchResult = await _groupServices.searchGroups(
searchParam: V2TimGroupSearchParam(keywordList: [searchKey]));
final searchResult =
await _groupServices.searchGroups(searchParam: V2TimGroupSearchParam(keywordList: [searchKey]));
groupList = searchResult.data ?? [];
notifyListeners();
}
void getMsgForConversation(
String keyword, String conversationId, int page) async {
void getMsgForConversation(String keyword, String conversationId, int page) async {
void clearData() {
currentMsgListForConversation = [];
totalMsgInConversationCount = 0;
@ -98,8 +99,7 @@ class TUISearchViewModel extends ChangeNotifier {
type: KeywordListMatchType.V2TIM_KEYWORD_LIST_MATCH_TYPE_OR.index,
));
if (searchResult.code == 0 && searchResult.data != null) {
final messageSearchResultItems = searchResult
.data!.messageSearchResultItems!
final messageSearchResultItems = searchResult.data!.messageSearchResultItems!
.firstWhereOrNull((element) => element.conversationID == conversationId);
totalMsgInConversationCount = messageSearchResultItems?.messageCount ?? 0;
currentMsgListForConversation = [

View File

@ -1,5 +1,6 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_config.dart';
class TUISelfInfoViewModel extends ChangeNotifier {

View File

@ -1,7 +1,10 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation_result.dart';
abstract class ConversationService {
Future<V2TimConversationResult?> getConversationList({
@ -26,14 +29,11 @@ abstract class ConversationService {
required V2TimConversationListener listener,
});
Future<V2TimCallback> setConversationDraft(
{required String conversationID, String? draftText});
Future<V2TimCallback> setConversationDraft({required String conversationID, String? draftText});
Future<void> removeConversationListener(
{V2TimConversationListener? listener});
Future<void> removeConversationListener({V2TimConversationListener? listener});
Future<int> getTotalUnreadCount();
Future<V2TimConversation?> getConversationListByConversationId(
{required String convID});
Future<V2TimConversation?> getConversationListByConversationId({required String convID});
}

View File

@ -1,7 +1,10 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation_result.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart';
@ -22,10 +25,8 @@ class ConversationServicesImpl extends ConversationService {
if (result.code == 0) {
return result.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
return null;
}
}
@ -39,10 +40,8 @@ class ConversationServicesImpl extends ConversationService {
.getConversationManager()
.pinConversation(conversationID: conversationID, isPinned: isPinned);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -55,10 +54,8 @@ class ConversationServicesImpl extends ConversationService {
.getConversationManager()
.deleteConversation(conversationID: conversationID);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -67,82 +64,60 @@ class ConversationServicesImpl extends ConversationService {
Future<void> addConversationListener({
required V2TimConversationListener listener,
}) {
return TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.addConversationListener(listener: listener);
return TencentImSDKPlugin.v2TIMManager.getConversationManager().addConversationListener(listener: listener);
}
@override
Future<V2TimConversation?> getConversation({
required String conversationID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getConversation(conversationID: conversationID);
final res =
await TencentImSDKPlugin.v2TIMManager.getConversationManager().getConversation(conversationID: conversationID);
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return null;
}
@override
Future<V2TimCallback> setConversationDraft(
{required String conversationID, String? draftText}) async {
Future<V2TimCallback> setConversationDraft({required String conversationID, String? draftText}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.setConversationDraft(
conversationID: conversationID, draftText: draftText);
.setConversationDraft(conversationID: conversationID, draftText: draftText);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<void> removeConversationListener(
{V2TimConversationListener? listener}) {
return TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.removeConversationListener(listener: listener);
Future<void> removeConversationListener({V2TimConversationListener? listener}) {
return TencentImSDKPlugin.v2TIMManager.getConversationManager().removeConversationListener(listener: listener);
}
@override
Future<V2TimConversation?> getConversationListByConversationId(
{required String convID}) async {
Future<V2TimConversation?> getConversationListByConversationId({required String convID}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getConversationListByConversationIds(conversationIDList: [convID]);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return (result.data != null && result.data!.isNotEmpty)
? result.data![0]
: null;
return (result.data != null && result.data!.isNotEmpty) ? result.data![0] : null;
}
@override
Future<int> getTotalUnreadCount() async {
final res = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getTotalUnreadMessageCount();
final res = await TencentImSDKPlugin.v2TIMManager.getConversationManager().getTotalUnreadMessageCount();
if (res.code == 0) {
return res.data ?? 0;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return 0;
}
}

View File

@ -1,15 +1,17 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/log_level_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_config.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
enum AppStatus { foreground, background }
enum LanguageEnum {

View File

@ -5,10 +5,14 @@ import 'package:flutter/cupertino.dart';
import 'package:tencent_chat_i18n_tool/tools/i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/log_level_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_setting_model.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/common_utils.dart';
@ -38,8 +42,7 @@ class LoginInfo {
final int sdkAppID;
final V2TimUserFullInfo? loginUser;
LoginInfo(
{this.sdkAppID = 0, this.userSig = "", this.userID = "", this.loginUser});
LoginInfo({this.sdkAppID = 0, this.userSig = "", this.userID = "", this.loginUser});
}
class CoreServicesImpl implements CoreServices {
@ -56,11 +59,7 @@ class CoreServicesImpl implements CoreServices {
}
LoginInfo get loginInfo {
return LoginInfo(
sdkAppID: _sdkAppID,
userID: _userID,
userSig: _userSig,
loginUser: _loginInfo);
return LoginInfo(sdkAppID: _sdkAppID, userID: _userID, userSig: _userSig, loginUser: _loginInfo);
}
EmptyAvatarBuilder? _emptyAvatarBuilder;
@ -74,8 +73,7 @@ class CoreServicesImpl implements CoreServices {
}
setGlobalConfig(TIMUIKitConfig? config) {
final TUISelfInfoViewModel selfInfoViewModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
final TUISettingModel settingModel = serviceLocator<TUISettingModel>();
selfInfoViewModel.globalConfig = config;
settingModel.init();
@ -185,14 +183,10 @@ class CoreServicesImpl implements CoreServices {
}
void addInitListener() {
final TUIFriendShipViewModel tuiFriendShipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel =
serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel =
serviceLocator<TUIChatGlobalModel>();
final TUIGroupListenerModel tuiGroupListenerModel =
serviceLocator<TUIGroupListenerModel>();
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel = serviceLocator<TUIChatGlobalModel>();
final TUIGroupListenerModel tuiGroupListenerModel = serviceLocator<TUIGroupListenerModel>();
tuiFriendShipViewModel.addFriendListener();
tuiConversationViewModel.setConversationListener();
@ -201,14 +195,10 @@ class CoreServicesImpl implements CoreServices {
}
void removeListener() {
final TUIFriendShipViewModel tuiFriendShipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel =
serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel =
serviceLocator<TUIChatGlobalModel>();
final TUIGroupListenerModel tuiGroupListenerModel =
serviceLocator<TUIGroupListenerModel>();
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel = serviceLocator<TUIChatGlobalModel>();
final TUIGroupListenerModel tuiGroupListenerModel = serviceLocator<TUIGroupListenerModel>();
tuiFriendShipViewModel.removeFriendshipListener();
tuiConversationViewModel.removeConversationListener();
@ -222,28 +212,22 @@ class CoreServicesImpl implements CoreServices {
onCallback!(callbackValue);
});
} else {
outputLogger.i(
"TUIKit Callback: ${callbackValue.type} - ${callbackValue.stackTrace}");
outputLogger.i("TUIKit Callback: ${callbackValue.type} - ${callbackValue.stackTrace}");
}
}
initDataModel() {
final TUIFriendShipViewModel tuiFriendShipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel =
serviceLocator<TUIConversationViewModel>();
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
tuiFriendShipViewModel.initFriendShipModel();
tuiConversationViewModel.initConversation();
}
clearData() {
final TUIFriendShipViewModel tuiFriendShipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel =
serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel =
serviceLocator<TUIChatGlobalModel>();
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel = serviceLocator<TUIChatGlobalModel>();
tuiFriendShipViewModel.clearData();
tuiConversationViewModel.clearData();
@ -252,19 +236,17 @@ class CoreServicesImpl implements CoreServices {
updateUserStatusList(List<V2TimUserStatus> newUserStatusList) {
try {
final TUISelfInfoViewModel selfInfoViewModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
if (selfInfoViewModel.globalConfig?.isShowOnlineStatus == false) {
return;
}
final TUIFriendShipViewModel tuiFriendShipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final currentUserStatusList = tuiFriendShipViewModel.userStatusList;
for (int i = 0; i < newUserStatusList.length; i++) {
final int indexInCurrentUserList = currentUserStatusList.indexWhere(
(element) => element.userID == newUserStatusList[i].userID);
final int indexInCurrentUserList =
currentUserStatusList.indexWhere((element) => element.userID == newUserStatusList[i].userID);
if (indexInCurrentUserList == -1) {
currentUserStatusList.add(newUserStatusList[i]);
} else {
@ -284,16 +266,12 @@ class CoreServicesImpl implements CoreServices {
}) async {
_userID = userID;
_userSig = userSig;
V2TimCallback result = await TencentImSDKPlugin.v2TIMManager
.login(userID: userID, userSig: userSig);
V2TimCallback result = await TencentImSDKPlugin.v2TIMManager.login(userID: userID, userSig: userSig);
if (!PlatformUtils().isWeb) {
didLoginSuccess();
}
if (result.code != 0) {
callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorCode: result.code,
errorMsg: result.desc));
callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorCode: result.code, errorMsg: result.desc));
}
return result;
}
@ -307,8 +285,7 @@ class CoreServicesImpl implements CoreServices {
initDataModel();
if (TencentUtils.checkString(_userID) == null) {
V2TimValueCallback<String> getLoginUserRes =
await TencentImSDKPlugin.v2TIMManager.getLoginUser();
V2TimValueCallback<String> getLoginUserRes = await TencentImSDKPlugin.v2TIMManager.getLoginUser();
if (getLoginUserRes.code == 0) {
_userID = getLoginUserRes.data ?? "";
}
@ -326,18 +303,15 @@ class CoreServicesImpl implements CoreServices {
if (res.code == 0 &&
res.data != null &&
res.data!.isNotEmpty &&
res.data!.firstWhereOrNull((element) => element.userID == _userID) !=
null) {
res.data!.firstWhereOrNull((element) => element.userID == _userID) != null) {
success = true;
} else {
await Future.delayed(const Duration(seconds: 2));
}
}
_loginInfo =
res?.data!.firstWhereOrNull((element) => element.userID == _userID);
final TUISelfInfoViewModel selfInfoViewModel =
serviceLocator<TUISelfInfoViewModel>();
_loginInfo = res?.data!.firstWhereOrNull((element) => element.userID == _userID);
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
if (_loginInfo != null) {
selfInfoViewModel.setLoginInfo(_loginInfo);
}
@ -389,9 +363,7 @@ class CoreServicesImpl implements CoreServices {
bool isTPNSToken = false,
int? businessID,
}) {
return TencentImSDKPlugin.v2TIMManager
.getOfflinePushManager()
.setOfflinePushConfig(
return TencentImSDKPlugin.v2TIMManager.getOfflinePushManager().setOfflinePushConfig(
businessID: businessID?.toDouble() ?? 0,
token: token,
isTPNSToken: isTPNSToken,
@ -402,8 +374,7 @@ class CoreServicesImpl implements CoreServices {
Future<V2TimCallback> setSelfInfo({
required V2TimUserFullInfo userFullInfo,
}) {
return TencentImSDKPlugin.v2TIMManager
.setSelfInfo(userFullInfo: userFullInfo);
return TencentImSDKPlugin.v2TIMManager.setSelfInfo(userFullInfo: userFullInfo);
}
@override
@ -434,16 +405,11 @@ class CoreServicesImpl implements CoreServices {
}
@override
Future<V2TimCallback> setOfflinePushStatus(
{required AppStatus status, int? totalCount}) {
Future<V2TimCallback> setOfflinePushStatus({required AppStatus status, int? totalCount}) {
if (status == AppStatus.foreground) {
return TencentImSDKPlugin.v2TIMManager
.getOfflinePushManager()
.doForeground();
return TencentImSDKPlugin.v2TIMManager.getOfflinePushManager().doForeground();
} else {
return TencentImSDKPlugin.v2TIMManager
.getOfflinePushManager()
.doBackground(unreadCount: totalCount ?? 0);
return TencentImSDKPlugin.v2TIMManager.getOfflinePushManager().doBackground(unreadCount: totalCount ?? 0);
}
}

View File

@ -2,16 +2,26 @@ import 'package:tencent_cloud_chat_sdk/enum/V2TimFriendshipListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_response_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_check_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_check_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_check_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
abstract class FriendshipServices {
Future<List<V2TimFriendInfoResult>?> getFriendsInfo({
@ -67,9 +77,7 @@ abstract class FriendshipServices {
Future<V2TimFriendApplicationResult?> getFriendApplicationList();
Future<V2TimFriendOperationResult?> acceptFriendApplication(
{required FriendResponseTypeEnum responseType,
required FriendApplicationTypeEnum type,
required String userID});
{required FriendResponseTypeEnum responseType, required FriendApplicationTypeEnum type, required String userID});
Future<V2TimFriendOperationResult?> refuseFriendApplication(
{required FriendApplicationTypeEnum type, required String userID});

View File

@ -3,16 +3,26 @@ import 'package:tencent_cloud_chat_sdk/enum/V2TimFriendshipListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_response_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_check_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_check_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_check_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
@ -27,16 +37,12 @@ class FriendshipServicesImpl implements FriendshipServices {
Future<List<V2TimFriendInfoResult>?> getFriendsInfo({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.getFriendsInfo(userIDList: userIDList);
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getFriendsInfo(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -45,15 +51,12 @@ class FriendshipServicesImpl implements FriendshipServices {
Future<List<V2TimUserFullInfo>?> getUsersInfo({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getUsersInfo(userIDList: userIDList);
final res = await TencentImSDKPlugin.v2TIMManager.getUsersInfo(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -62,16 +65,12 @@ class FriendshipServicesImpl implements FriendshipServices {
Future<List<V2TimFriendOperationResult>?> addToBlackList({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.addToBlackList(userIDList: userIDList);
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().addToBlackList(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -85,15 +84,14 @@ class FriendshipServicesImpl implements FriendshipServices {
String? addSource,
String? addWording,
}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().addFriend(
userID: userID,
addType: addType,
remark: remark,
addWording: addWording,
friendGroup: friendGroup,
addSource: addSource,
);
final result = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().addFriend(
userID: userID,
addType: addType,
remark: remark,
addWording: addWording,
friendGroup: friendGroup,
addSource: addSource,
);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
@ -115,10 +113,10 @@ class FriendshipServicesImpl implements FriendshipServices {
));
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code,
infoRecommendText: TIM_t("好友添加成功"),
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code,
infoRecommendText: TIM_t("好友添加成功"),
));
}
@ -129,16 +127,13 @@ class FriendshipServicesImpl implements FriendshipServices {
Future<List<V2TimFriendOperationResult>?> deleteFromBlackList({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.deleteFromBlackList(userIDList: userIDList);
final res =
await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().deleteFromBlackList(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -170,32 +165,24 @@ class FriendshipServicesImpl implements FriendshipServices {
@override
Future<List<V2TimFriendInfo>?> getFriendList() async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.getFriendList();
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getFriendList();
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimFriendInfo>?> getBlackList() async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.getBlackList();
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getBlackList();
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -211,10 +198,8 @@ class FriendshipServicesImpl implements FriendshipServices {
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -223,32 +208,24 @@ class FriendshipServicesImpl implements FriendshipServices {
Future<void> addFriendListener({
required V2TimFriendshipListener listener,
}) {
return TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.addFriendListener(listener: listener);
return TencentImSDKPlugin.v2TIMManager.getFriendshipManager().addFriendListener(listener: listener);
}
@override
Future<void> removeFriendListener({
V2TimFriendshipListener? listener,
}) {
return TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.removeFriendListener(listener: listener);
return TencentImSDKPlugin.v2TIMManager.getFriendshipManager().removeFriendListener(listener: listener);
}
@override
Future<V2TimFriendApplicationResult?> getFriendApplicationList() async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.getFriendApplicationList();
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getFriendApplicationList();
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -259,9 +236,7 @@ class FriendshipServicesImpl implements FriendshipServices {
required FriendApplicationTypeEnum type,
required String userID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.acceptFriendApplication(
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().acceptFriendApplication(
responseType: responseType,
type: type,
userID: userID,
@ -269,10 +244,8 @@ class FriendshipServicesImpl implements FriendshipServices {
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -286,10 +259,8 @@ class FriendshipServicesImpl implements FriendshipServices {
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -302,15 +273,10 @@ class FriendshipServicesImpl implements FriendshipServices {
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.setFriendInfo(
friendRemark: friendRemark,
friendCustomInfo: friendCustomInfo,
userID: userID);
.setFriendInfo(friendRemark: friendRemark, friendCustomInfo: friendCustomInfo, userID: userID);
if (res.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return res;
}
@ -319,16 +285,12 @@ class FriendshipServicesImpl implements FriendshipServices {
Future<List<V2TimFriendInfoResult>?> searchFriends({
required V2TimFriendSearchParam searchParam,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.searchFriends(searchParam: searchParam);
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().searchFriends(searchParam: searchParam);
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -337,15 +299,12 @@ class FriendshipServicesImpl implements FriendshipServices {
Future<List<V2TimUserStatus>> getUserStatus({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getUserStatus(userIDList: userIDList);
final res = await TencentImSDKPlugin.v2TIMManager.getUserStatus(userIDList: userIDList);
if (res.code == 0) {
return res.data ?? [];
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return [];
}
}

View File

@ -2,17 +2,28 @@ import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_filter_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application_result.dart';
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_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info_result.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_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info_result.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'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
abstract class GroupServices {
Future<List<V2TimGroupInfo>?> getJoinedGroupList();
@ -29,9 +40,8 @@ abstract class GroupServices {
int offset = 0,
});
Future<V2TimValueCallback<List<V2TimGroupMemberFullInfo>>>
getGroupMembersInfo(
{required String groupID, required List<String> memberList});
Future<V2TimValueCallback<List<V2TimGroupMemberFullInfo>>> getGroupMembersInfo(
{required String groupID, required List<String> memberList});
Future<V2TimCallback> setGroupInfo({
required V2TimGroupInfo info,
@ -43,10 +53,7 @@ abstract class GroupServices {
required GroupMemberRoleTypeEnum role,
});
getGroupMembersInfoThrottle(
{required String groupID,
required List<String> memberList,
Function? callBack});
getGroupMembersInfoThrottle({required String groupID, required List<String> memberList, Function? callBack});
Future<V2TimCallback> muteGroupMember({
required String groupID,
@ -67,8 +74,7 @@ abstract class GroupServices {
String? reason,
});
Future<V2TimValueCallback<List<V2TimGroupMemberOperationResult>>>
inviteUserToGroup({
Future<V2TimValueCallback<List<V2TimGroupMemberOperationResult>>> inviteUserToGroup({
required String groupID,
required List<String> userList,
});
@ -94,8 +100,7 @@ abstract class GroupServices {
V2TimGroupListener? listener,
});
Future<V2TimValueCallback<V2TimGroupApplicationResult>>
getGroupApplicationList();
Future<V2TimValueCallback<V2TimGroupApplicationResult>> getGroupApplicationList();
Future<V2TimCallback> acceptGroupApplication({
required String groupID,

View File

@ -2,17 +2,28 @@ import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_filter_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application_result.dart';
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_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info_result.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_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info_result.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'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
@ -46,16 +57,12 @@ class GroupServicesImpl extends GroupServices {
@override
Future<List<V2TimGroupInfo>?> getJoinedGroupList() async {
final res = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getJoinedGroupList();
final res = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getJoinedGroupList();
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@ -64,25 +71,19 @@ class GroupServicesImpl extends GroupServices {
Future<List<V2TimGroupInfoResult>?> getGroupsInfo({
required List<String> groupIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupsInfo(groupIDList: groupIDList);
final res = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getGroupsInfo(groupIDList: groupIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
void getGroupMembersInfoThrottle(
{required String groupID,
required List<String> memberList,
Function? callBack}) async {
{required String groupID, required List<String> memberList, Function? callBack}) async {
if (callBack != null) {
groupInfoCallBackList.add(callBack);
throttleGetGroupInfo({"groupID": groupID, "memberList": memberList});
@ -90,17 +91,14 @@ class GroupServicesImpl extends GroupServices {
}
@override
Future<V2TimValueCallback<List<V2TimGroupMemberFullInfo>>>
getGroupMembersInfo(
{required String groupID, required List<String> memberList}) async {
Future<V2TimValueCallback<List<V2TimGroupMemberFullInfo>>> getGroupMembersInfo(
{required String groupID, required List<String> memberList}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupMembersInfo(groupID: groupID, memberList: memberList);
if (res.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return res;
}
@ -115,17 +113,10 @@ class GroupServicesImpl extends GroupServices {
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupMemberList(
groupID: groupID,
filter: filter,
nextSeq: nextSeq,
count: count,
offset: offset);
.getGroupMemberList(groupID: groupID, filter: filter, nextSeq: nextSeq, count: count, offset: offset);
if (res.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return res;
}
@ -134,14 +125,10 @@ class GroupServicesImpl extends GroupServices {
Future<V2TimCallback> setGroupInfo({
required V2TimGroupInfo info,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.setGroupInfo(info: info);
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().setGroupInfo(info: info);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -156,10 +143,8 @@ class GroupServicesImpl extends GroupServices {
.getGroupManager()
.setGroupMemberRole(groupID: groupID, userID: userID, role: role);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -174,10 +159,8 @@ class GroupServicesImpl extends GroupServices {
.getGroupManager()
.muteGroupMember(groupID: groupID, userID: userID, seconds: seconds);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -191,16 +174,10 @@ class GroupServicesImpl extends GroupServices {
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.setGroupMemberInfo(
groupID: groupID,
userID: userID,
nameCard: nameCard,
customInfo: customInfo);
.setGroupMemberInfo(groupID: groupID, userID: userID, nameCard: nameCard, customInfo: customInfo);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -213,31 +190,24 @@ class GroupServicesImpl extends GroupServices {
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.kickGroupMember(
groupID: groupID, memberList: memberList, reason: reason);
.kickGroupMember(groupID: groupID, memberList: memberList, reason: reason);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<List<V2TimGroupMemberOperationResult>>>
inviteUserToGroup({
Future<V2TimValueCallback<List<V2TimGroupMemberOperationResult>>> inviteUserToGroup({
required String groupID,
required List<String> userList,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.inviteUserToGroup(groupID: groupID, userList: userList);
final result =
await TencentImSDKPlugin.v2TIMManager.getGroupManager().inviteUserToGroup(groupID: groupID, userList: userList);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -246,14 +216,10 @@ class GroupServicesImpl extends GroupServices {
Future<V2TimValueCallback<List<V2TimGroupInfo>>> searchGroups({
required V2TimGroupSearchParam searchParam,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.searchGroups(searchParam: searchParam);
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().searchGroups(searchParam: searchParam);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -263,8 +229,7 @@ class GroupServicesImpl extends GroupServices {
required String groupID,
required String message,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.joinGroup(groupID: groupID, message: message);
final result = await TencentImSDKPlugin.v2TIMManager.joinGroup(groupID: groupID, message: message);
if (result.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(result.code);
_coreService.callOnCallback(TIMCallback(
@ -280,14 +245,10 @@ class GroupServicesImpl extends GroupServices {
Future<V2TimValueCallback<V2GroupMemberInfoSearchResult>> searchGroupMembers({
required V2TimGroupMemberSearchParam searchParam,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.searchGroupMembers(param: searchParam);
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().searchGroupMembers(param: searchParam);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -296,8 +257,7 @@ class GroupServicesImpl extends GroupServices {
Future<void> addGroupListener({
required V2TimGroupListener listener,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.addGroupListener(listener: listener);
final result = await TencentImSDKPlugin.v2TIMManager.addGroupListener(listener: listener);
return result;
}
@ -305,22 +265,16 @@ class GroupServicesImpl extends GroupServices {
Future<void> removeGroupListener({
V2TimGroupListener? listener,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.removeGroupListener(listener: listener);
final result = await TencentImSDKPlugin.v2TIMManager.removeGroupListener(listener: listener);
return result;
}
@override
Future<V2TimValueCallback<V2TimGroupApplicationResult>>
getGroupApplicationList() async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupApplicationList();
Future<V2TimValueCallback<V2TimGroupApplicationResult>> getGroupApplicationList() async {
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getGroupApplicationList();
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -333,9 +287,7 @@ class GroupServicesImpl extends GroupServices {
required int type,
required int addTime,
String? reason}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.acceptGroupApplication(
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().acceptGroupApplication(
groupID: groupID,
fromUser: fromUser,
toUser: toUser,
@ -344,10 +296,8 @@ class GroupServicesImpl extends GroupServices {
reason: reason ?? "",
);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -360,20 +310,11 @@ class GroupServicesImpl extends GroupServices {
required String fromUser,
required String toUser,
required GroupApplicationTypeEnum type}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.refuseGroupApplication(
groupID: groupID,
fromUser: fromUser,
toUser: toUser,
type: type,
addTime: addTime,
reason: reason);
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().refuseGroupApplication(
groupID: groupID, fromUser: fromUser, toUser: toUser, type: type, addTime: addTime, reason: reason);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}

View File

@ -10,17 +10,28 @@ import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.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'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart';
@ -37,8 +48,7 @@ class MessageServiceImpl extends MessageService {
@override
Future<MessageListResponse> getHistoryMessageListV2({
HistoryMsgGetTypeEnum getType =
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = -1,
@ -47,16 +57,14 @@ class MessageServiceImpl extends MessageService {
List<int>? messageTypeList,
}) async {
bool haveMoreData = true;
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final List<V2TimMessage> responseMessageList = res.data ?? [];
final conversationID = userID ?? groupID;
final cachedMessageList = messageListMap[conversationID];
@ -66,41 +74,33 @@ class MessageServiceImpl extends MessageService {
combinedMessageList = [...cachedMessageList, ...responseMessageList];
//
} else {
final bool existSendingMessage = sendingMessage[conversationID] != null &&
sendingMessage[conversationID]!.isNotEmpty;
final bool existSendingMessage =
sendingMessage[conversationID] != null && sendingMessage[conversationID]!.isNotEmpty;
//
if (existSendingMessage) {
combinedMessageList = [
...sendingMessage[conversationID]!,
...responseMessageList
];
combinedMessageList = [...sendingMessage[conversationID]!, ...responseMessageList];
} else {
sendingMessage.remove(conversationID);
combinedMessageList = responseMessageList;
}
}
if (res.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
if (responseMessageList.isEmpty ||
(!PlatformUtils().isWeb && responseMessageList.length < count) ||
(PlatformUtils().isWeb &&
responseMessageList.length < min(count, 20))) {
(PlatformUtils().isWeb && responseMessageList.length < min(count, 20))) {
haveMoreData = false;
} else {
haveMoreData = true;
}
return MessageListResponse(
haveMoreData: haveMoreData, data: combinedMessageList);
return MessageListResponse(haveMoreData: haveMoreData, data: combinedMessageList);
}
@override
Future<List<V2TimMessage>> getHistoryMessageList({
HistoryMsgGetTypeEnum getType =
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = -1,
@ -108,30 +108,25 @@ class MessageServiceImpl extends MessageService {
String? lastMsgID,
List<int>? messageTypeList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final reponseMessageList = res.data ?? [];
if (res.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return reponseMessageList;
}
@override
Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({
HistoryMsgGetTypeEnum getType =
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = 0,
@ -139,22 +134,18 @@ class MessageServiceImpl extends MessageService {
String? lastMsgID,
List<int>? messageTypeList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getHistoryMessageListV2(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageListV2(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final responseMessageList = res.data;
if (res.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return responseMessageList;
}
@ -163,28 +154,23 @@ class MessageServiceImpl extends MessageService {
Future addSimpleMsgListener({
required V2TimSimpleMsgListener listener,
}) async {
return TencentImSDKPlugin.v2TIMManager
.addSimpleMsgListener(listener: listener);
return TencentImSDKPlugin.v2TIMManager.addSimpleMsgListener(listener: listener);
}
@override
Future<void> removeSimpleMsgListener({V2TimSimpleMsgListener? listener}) {
return TencentImSDKPlugin.v2TIMManager
.removeSimpleMsgListener(listener: listener);
return TencentImSDKPlugin.v2TIMManager.removeSimpleMsgListener(listener: listener);
}
@override
Future<void> addAdvancedMsgListener({
required V2TimAdvancedMsgListener listener,
}) {
return TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.addAdvancedMsgListener(listener: listener);
return TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
}
@override
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>>
getGroupMessageReadMemberList({
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> getGroupMessageReadMemberList({
required String messageID,
required GetGroupMessageReadMemberListFilter filter,
int nextSeq = 0,
@ -192,16 +178,10 @@ class MessageServiceImpl extends MessageService {
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getGroupMessageReadMemberList(
messageID: messageID,
filter: filter,
nextSeq: nextSeq,
count: count);
.getGroupMessageReadMemberList(messageID: messageID, filter: filter, nextSeq: nextSeq, count: count);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -210,14 +190,11 @@ class MessageServiceImpl extends MessageService {
Future<V2TimValueCallback<List<V2TimMessageReceipt>>> getMessageReadReceipts({
required List<String> messageIDList,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getMessageReadReceipts(messageIDList: messageIDList);
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageReadReceipts(messageIDList: messageIDList);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -226,78 +203,53 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> sendMessageReadReceipts({
required List<String> messageIDList,
}) async {
return _retryMarkMessageAsRead(action: (){
return TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendMessageReadReceipts(messageIDList: messageIDList);
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessageReadReceipts(messageIDList: messageIDList);
});
}
@override
Future<V2TimMsgCreateInfoResult?> createTextMessage(
{required String text}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createTextMessage(text: text);
Future<V2TimMsgCreateInfoResult?> createTextMessage({required String text}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createTextMessage(text: text);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createCustomMessage(
{required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createCustomMessage(data: data);
Future<V2TimMsgCreateInfoResult?> createCustomMessage({required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createCustomMessage(data: data);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createFaceMessage(
{required int index, required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createFaceMessage(index: index, data: data);
Future<V2TimMsgCreateInfoResult?> createFaceMessage({required int index, required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createFaceMessage(index: index, data: data);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessage>> reSendMessage(
{required String msgID,
bool? onlineUserOnly}) async {
Future<V2TimValueCallback<V2TimMessage>> reSendMessage({required String msgID, bool? onlineUserOnly}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.reSendMessage(msgID: msgID, onlineUserOnly: onlineUserOnly ?? false);
if (res.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(res.code);
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code,
infoRecommendText: recommendText));
type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code, infoRecommendText: recommendText));
}
return res;
}
@ -312,10 +264,7 @@ class MessageServiceImpl extends MessageService {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@ -324,17 +273,11 @@ class MessageServiceImpl extends MessageService {
{String? imageName, String? imagePath, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createImageMessage(
imageName: imageName,
imagePath: imagePath ?? "",
inputElement: inputElement);
.createImageMessage(imageName: imageName, imagePath: imagePath ?? "", inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@ -349,10 +292,7 @@ class MessageServiceImpl extends MessageService {
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@ -370,19 +310,18 @@ class MessageServiceImpl extends MessageService {
String? localCustomData,
bool isExcludedFromContentModeration = false,
}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage(
id: id,
receiver: receiver,
groupID: groupID,
priority: priority,
onlineUserOnly: onlineUserOnly,
offlinePushInfo: offlinePushInfo,
needReadReceipt: needReadReceipt,
localCustomData: localCustomData,
cloudCustomData: cloudCustomData,
isExcludedFromContentModeration: isExcludedFromContentModeration,
);
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage(
id: id,
receiver: receiver,
groupID: groupID,
priority: priority,
onlineUserOnly: onlineUserOnly,
offlinePushInfo: offlinePushInfo,
needReadReceipt: needReadReceipt,
localCustomData: localCustomData,
cloudCustomData: cloudCustomData,
isExcludedFromContentModeration: isExcludedFromContentModeration,
);
if (result.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(result.code);
_coreService.callOnCallback(TIMCallback(
@ -403,34 +342,26 @@ class MessageServiceImpl extends MessageService {
if (kIsWeb) {
result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(
msgIDs: [], webMessageInstanceList: [webMessageInstance]);
.deleteMessages(msgIDs: [], webMessageInstanceList: [webMessageInstance]);
} else {
result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessageFromLocalStorage(msgID: msgID);
result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().deleteMessageFromLocalStorage(msgID: msgID);
}
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> revokeMessage(
{required String msgID, Object? webMessageInstance}) async {
Future<V2TimCallback> revokeMessage({required String msgID, Object? webMessageInstance}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.revokeMessage(msgID: msgID, webMessageInstatnce: webMessageInstance);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -439,14 +370,10 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> clearC2CHistoryMessage({
required String userID,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.clearC2CHistoryMessage(userID: userID);
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearC2CHistoryMessage(userID: userID);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -455,14 +382,10 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> clearGroupHistoryMessage({
required String groupID,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.clearGroupHistoryMessage(groupID: groupID);
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearGroupHistoryMessage(groupID: groupID);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -482,10 +405,8 @@ class MessageServiceImpl extends MessageService {
await Future.delayed(const Duration(milliseconds: 500));
} while (attempts < retries);
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
return result;
}
@ -495,13 +416,11 @@ class MessageServiceImpl extends MessageService {
required String userID,
}) {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationC2CPrefix}$userID",
cleanTimestamp: 0,
cleanSequence: 0,
);
return TencentImSDKPlugin.v2TIMManager.getConversationManager().cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationC2CPrefix}$userID",
cleanTimestamp: 0,
cleanSequence: 0,
);
});
}
@ -510,22 +429,18 @@ class MessageServiceImpl extends MessageService {
required String groupID,
}) {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationGroupPrefix}$groupID",
cleanTimestamp: 0,
cleanSequence: 0,
);
return TencentImSDKPlugin.v2TIMManager.getConversationManager().cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationGroupPrefix}$groupID",
cleanTimestamp: 0,
cleanSequence: 0,
);
});
}
@override
Future<void> removeAdvancedMsgListener(
{V2TimAdvancedMsgListener? listener}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.removeAdvancedMsgListener(listener: listener);
Future<void> removeAdvancedMsgListener({V2TimAdvancedMsgListener? listener}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().removeAdvancedMsgListener(listener: listener);
return result;
}
@ -533,16 +448,11 @@ class MessageServiceImpl extends MessageService {
Future<List<V2TimMessage>?> downloadMergerMessage({
required String msgID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.downloadMergerMessage(msgID: msgID);
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMergerMessage(msgID: msgID);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@ -550,16 +460,11 @@ class MessageServiceImpl extends MessageService {
Future<V2TimMsgCreateInfoResult?> createForwardMessage({
required String msgID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createForwardMessage(msgID: msgID);
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createForwardMessage(msgID: msgID);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@ -570,62 +475,40 @@ class MessageServiceImpl extends MessageService {
required List<String> abstractList,
required String compatibleText,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createMergerMessage(
msgIDList: msgIDList,
title: title,
abstractList: abstractList,
compatibleText: compatibleText);
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createMergerMessage(
msgIDList: msgIDList, title: title, abstractList: abstractList, compatibleText: compatibleText);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimCallback> deleteMessages(
{required List<String> msgIDs,
List<dynamic>? webMessageInstanceList}) async {
Future<V2TimCallback> deleteMessages({required List<String> msgIDs, List<dynamic>? webMessageInstanceList}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(
msgIDs: msgIDs, webMessageInstanceList: webMessageInstanceList);
.deleteMessages(msgIDs: msgIDs, webMessageInstanceList: webMessageInstanceList);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimMsgCreateInfoResult?> createVideoMessage(
{String? videoPath,
String? type,
int? duration,
String? snapshotPath,
dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createVideoMessage(
videoFilePath: videoPath ?? "",
type: type ?? "",
duration: duration ?? 1,
snapshotPath: snapshotPath ?? "",
inputElement: inputElement);
{String? videoPath, String? type, int? duration, String? snapshotPath, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createVideoMessage(
videoFilePath: videoPath ?? "",
type: type ?? "",
duration: duration ?? 1,
snapshotPath: snapshotPath ?? "",
inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@ -638,75 +521,54 @@ class MessageServiceImpl extends MessageService {
bool needReadReceipt = false,
required V2TimMessage replyMessage, //
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.sendReplyMessage(
id: id,
receiver: receiver,
offlinePushInfo: offlinePushInfo,
groupID: groupID,
needReadReceipt: needReadReceipt,
replyMessage: replyMessage);
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendReplyMessage(
id: id,
receiver: receiver,
offlinePushInfo: offlinePushInfo,
groupID: groupID,
needReadReceipt: needReadReceipt,
replyMessage: replyMessage);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimMsgCreateInfoResult?> createFileMessage(
{String? filePath,
required String fileName,
dynamic inputElement}) async {
{String? filePath, required String fileName, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createFileMessage(
filePath: filePath ?? "",
fileName: fileName,
inputElement: inputElement);
.createFileMessage(filePath: filePath ?? "", fileName: fileName, inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createLocationMessage(
{required String desc,
required double longitude,
required double latitude}) async {
{required String desc, required double longitude, required double latitude}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createLocationMessage(
desc: desc, longitude: longitude, latitude: latitude);
.createLocationMessage(desc: desc, longitude: longitude, latitude: latitude);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessageSearchResult>> searchLocalMessages(
{required V2TimMessageSearchParam searchParam}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.searchLocalMessages(searchParam: searchParam);
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().searchLocalMessages(searchParam: searchParam);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -715,30 +577,22 @@ class MessageServiceImpl extends MessageService {
Future<List<V2TimMessage>?> findMessages({
required List<String> messageIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.findMessages(messageIDList: messageIDList);
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().findMessages(messageIDList: messageIDList);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimCallback> setLocalCustomInt(
{required String msgID, required int localCustomInt}) async {
Future<V2TimCallback> setLocalCustomInt({required String msgID, required int localCustomInt}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomInt(msgID: msgID, localCustomInt: localCustomInt);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -752,10 +606,8 @@ class MessageServiceImpl extends MessageService {
.getMessageManager()
.setC2CReceiveMessageOpt(userIDList: userIDList, opt: opt);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@ -765,96 +617,68 @@ class MessageServiceImpl extends MessageService {
required String groupID,
required ReceiveMsgOptEnum opt,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setGroupReceiveMessageOpt(groupID: groupID, opt: opt);
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().setGroupReceiveMessageOpt(groupID: groupID, opt: opt);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage(
{required V2TimMessage message}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.modifyMessage(message: message);
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage({required V2TimMessage message}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().modifyMessage(message: message);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setLocalCustomData(
{required String msgID, required String localCustomData}) async {
Future<V2TimCallback> setLocalCustomData({required String msgID, required String localCustomData}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomData(msgID: msgID, localCustomData: localCustomData);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl(
{required String msgID}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getMessageOnlineUrl(msgID: msgID);
Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl({required String msgID}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: msgID);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> downloadMessage(
{required String msgID,
required int messageType,
required int imageType,
required bool isSnapshot}) async {
{required String msgID, required int messageType, required int imageType, required bool isSnapshot}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.downloadMessage(
msgID: msgID,
messageType: messageType,
imageType: imageType,
isSnapshot: isSnapshot);
.downloadMessage(msgID: msgID, messageType: messageType, imageType: imageType, isSnapshot: isSnapshot);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<String> translateText(String text, String target) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.translateText(texts: [text], targetLanguage: target);
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().translateText(texts: [text], targetLanguage: target);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result.data?[text] ?? "";
}

View File

@ -5,17 +5,28 @@ import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.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'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
class MessageListResponse {
final bool haveMoreData;
@ -26,8 +37,7 @@ class MessageListResponse {
abstract class MessageService {
Future<List<V2TimMessage>> getHistoryMessageList({
HistoryMsgGetTypeEnum getType =
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
@ -37,8 +47,7 @@ abstract class MessageService {
});
Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({
HistoryMsgGetTypeEnum getType =
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
@ -48,8 +57,7 @@ abstract class MessageService {
});
Future<MessageListResponse> getHistoryMessageListV2({
HistoryMsgGetTypeEnum getType =
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
@ -70,13 +78,11 @@ abstract class MessageService {
Future<V2TimMsgCreateInfoResult?> createTextMessage({required String text});
Future<V2TimMsgCreateInfoResult?> createFaceMessage(
{required int index, required String data});
Future<V2TimMsgCreateInfoResult?> createFaceMessage({required int index, required String data});
Future<V2TimMsgCreateInfoResult?> createCustomMessage({required String data});
Future<V2TimMsgCreateInfoResult?> createTextAtMessage(
{required String text, required List<String> atUserList});
Future<V2TimMsgCreateInfoResult?> createTextAtMessage({required String text, required List<String> atUserList});
Future<V2TimValueCallback<V2TimMessage>> sendMessage(
{required String id, // ID
@ -100,30 +106,20 @@ abstract class MessageService {
required V2TimMessage replyMessage, //
});
Future<V2TimValueCallback<V2TimMessage>> reSendMessage(
{required String msgID,
bool onlineUserOnly});
Future<V2TimValueCallback<V2TimMessage>> reSendMessage({required String msgID, bool onlineUserOnly});
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage(
{required V2TimMessage message});
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage({required V2TimMessage message});
Future<V2TimMsgCreateInfoResult?> createImageMessage(
{String? imageName, String? imagePath, dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createImageMessage({String? imageName, String? imagePath, dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createVideoMessage(
{String? videoPath = "",
String? type = "",
int? duration = 0,
String? snapshotPath = "",
dynamic inputElement});
{String? videoPath = "", String? type = "", int? duration = 0, String? snapshotPath = "", dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createFileMessage(
{String? filePath, required String fileName, dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createLocationMessage(
{required String desc,
required double longitude,
required double latitude});
{required String desc, required double longitude, required double latitude});
Future<V2TimMsgCreateInfoResult?> createSoundMessage({
required String soundPath,
@ -146,8 +142,7 @@ abstract class MessageService {
Object? webMessageInstance,
});
Future<V2TimCallback> revokeMessage(
{required String msgID, Object? webMessageInstance});
Future<V2TimCallback> revokeMessage({required String msgID, Object? webMessageInstance});
Future<V2TimCallback> clearC2CHistoryMessage({
required String userID,
@ -171,8 +166,7 @@ abstract class MessageService {
required String msgID,
});
Future<V2TimCallback> deleteMessages(
{required List<String> msgIDs, List<dynamic>? webMessageInstanceList});
Future<V2TimCallback> deleteMessages({required List<String> msgIDs, List<dynamic>? webMessageInstanceList});
Future<List<V2TimMessage>?> findMessages({
required List<String> messageIDList,
@ -182,11 +176,9 @@ abstract class MessageService {
required V2TimMessageSearchParam searchParam,
});
Future<V2TimCallback> setLocalCustomInt(
{required String msgID, required int localCustomInt});
Future<V2TimCallback> setLocalCustomInt({required String msgID, required int localCustomInt});
Future<V2TimCallback> setLocalCustomData(
{required String msgID, required String localCustomData});
Future<V2TimCallback> setLocalCustomData({required String msgID, required String localCustomData});
Future<V2TimCallback> setC2CReceiveMessageOpt({
required List<String> userIDList,
@ -198,8 +190,7 @@ abstract class MessageService {
required ReceiveMsgOptEnum opt,
});
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>>
getGroupMessageReadMemberList({
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> getGroupMessageReadMemberList({
required String messageID,
required GetGroupMessageReadMemberListFilter filter,
int nextSeq = 0,

View File

@ -5,10 +5,14 @@ import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
@ -18,8 +22,7 @@ class TIMUIKitChatController {
late TUIChatSeparateViewModel? model;
late TIMUIKitInputTextFieldController? textFieldController;
late AutoScrollController? scrollController;
final TUIChatGlobalModel globalChatModel =
serviceLocator<TUIChatGlobalModel>();
final TUIChatGlobalModel globalChatModel = serviceLocator<TUIChatGlobalModel>();
TIMUIKitChatController({TUIChatSeparateViewModel? viewModel}) {
if (viewModel != null) {
@ -28,8 +31,7 @@ class TIMUIKitChatController {
}
Future<bool> loadHistoryMessageList(
{HistoryMsgGetTypeEnum getType =
HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG,
{HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_CLOUD_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = -1,
@ -59,16 +61,15 @@ class TIMUIKitChatController {
}
/// Refresh the history message list manually;
Future<bool> refreshCurrentHistoryList(
[String? convID, ConvType? convType]) async {
if(model != null){
try{
Future<bool> refreshCurrentHistoryList([String? convID, ConvType? convType]) async {
if (model != null) {
try {
scrollController?.animateTo(
scrollController!.position.minScrollExtent,
duration: const Duration(milliseconds: 200),
curve: Curves.ease,
);
}catch(e){}
} catch (e) {}
return model!.loadDataFromController();
} else {
return false;
@ -150,13 +151,13 @@ class TIMUIKitChatController {
assert(groupID != null || convType != ConvType.group);
assert(userID != null || convType != ConvType.c2c);
if (isNavigateToMessageListBottom && scrollController != null) {
try{
try {
scrollController?.animateTo(
scrollController!.position.minScrollExtent,
duration: const Duration(milliseconds: 200),
curve: Curves.ease,
);
}catch(e){}
} catch (e) {}
}
return globalChatModel.sendMessageFromController(
priority: priority,
@ -173,13 +174,13 @@ class TIMUIKitChatController {
} else if (model != null) {
/// Sends a message to the current conversation specified on `TIMUIKitChat`. `TIMUIKitChat`
if (isNavigateToMessageListBottom && scrollController != null) {
try{
try {
scrollController?.animateTo(
scrollController!.position.minScrollExtent,
duration: const Duration(milliseconds: 200),
curve: Curves.ease,
);
}catch(e){}
} catch (e) {}
}
return model!.sendMessageFromController(
priority: priority,
@ -245,13 +246,13 @@ class TIMUIKitChatController {
assert(groupID != null || convType != ConvType.group);
assert(userID != null || convType != ConvType.c2c);
if (isNavigateToMessageListBottom && scrollController != null) {
try{
try {
scrollController?.animateTo(
scrollController!.position.minScrollExtent,
duration: const Duration(milliseconds: 200),
curve: Curves.ease,
);
}catch(e){}
} catch (e) {}
}
return globalChatModel.sendReplyMessageFromController(
text: messageText,
@ -307,34 +308,27 @@ class TIMUIKitChatController {
required BuildContext context,
}) async {
return model?.sendMergerMessage(
conversationList: conversationList,
title: title,
abstractList: abstractList,
context: context);
conversationList: conversationList, title: title, abstractList: abstractList, context: context);
}
/// Set local custom data; returns the bool shows if succeed.
/// Please provide `convID`, if you use `TIMUIKitChatController` without specifying to a `TIMUIKitChat`.
Future<bool> setLocalCustomData(String msgID, String localCustomData,
[String? convID]) async {
Future<bool> setLocalCustomData(String msgID, String localCustomData, [String? convID]) async {
final String? conversationID = convID ?? model?.conversationID;
if (conversationID == null) {
return false;
}
return globalChatModel.setLocalCustomData(
msgID, localCustomData, conversationID);
return globalChatModel.setLocalCustomData(msgID, localCustomData, conversationID);
}
/// Set local custom int; returns the bool shows if succeed.
/// Please provide `convID`, if you use `TIMUIKitChatController` without specifying to a `TIMUIKitChat`.
Future<bool> setLocalCustomInt(String msgID, int localCustomInt,
[String? convID]) async {
Future<bool> setLocalCustomInt(String msgID, int localCustomInt, [String? convID]) async {
final String? conversationID = convID ?? model?.conversationID;
if (conversationID == null) {
return false;
}
return globalChatModel.setLocalCustomInt(
msgID, localCustomInt, conversationID);
return globalChatModel.setLocalCustomInt(msgID, localCustomInt, conversationID);
}
/// Get current conversation, returns UserID or GroupID if in the chat page, returns "" if not.
@ -350,8 +344,7 @@ class TIMUIKitChatController {
/// Mention or @ other members in a group manually.
/// This function solely works when `TIMUIKitChatController` is specified for use within a `TIMUIKitChat`.
void mentionOtherMemberInGroup(
{required String showNameInMessage, required String userID}) {
void mentionOtherMemberInGroup({required String showNameInMessage, required String userID}) {
textFieldController?.longPressToAt(showNameInMessage, userID);
}
@ -371,9 +364,7 @@ class TIMUIKitChatController {
/// This function solely works when `TIMUIKitChatController` is specified for use within a `TIMUIKitChat`.
List<V2TimGroupMemberFullInfo> getGroupMemberList({String? keyword}) {
final List<V2TimGroupMemberFullInfo> memberList =
(model?.groupMemberList ?? [])
.whereType<V2TimGroupMemberFullInfo>()
.toList();
(model?.groupMemberList ?? []).whereType<V2TimGroupMemberFullInfo>().toList();
return TencentUtils.checkString(keyword) == null
? memberList
@ -381,9 +372,7 @@ class TIMUIKitChatController {
final userID = e.userID;
final nickName = e.nickName ?? "";
final friendRemark = e.friendRemark ?? "";
return userID.contains(keyword!) ||
nickName.contains(keyword) ||
friendRemark.contains(keyword);
return userID.contains(keyword!) || nickName.contains(keyword) || friendRemark.contains(keyword);
}).toList();
}
}

View File

@ -1,5 +1,7 @@
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart';
class TIMUIKitConversationController {
@ -36,22 +38,17 @@ class TIMUIKitConversationController {
}
/// Pin one conversation to the top
Future<V2TimCallback> pinConversation(
{required String conversationID, required bool isPinned}) {
return model.pinConversation(
conversationID: conversationID, isPinned: isPinned);
Future<V2TimCallback> pinConversation({required String conversationID, required bool isPinned}) {
return model.pinConversation(conversationID: conversationID, isPinned: isPinned);
}
/// Set the draft for a conversation
Future<V2TimCallback> setConversationDraft(
{required String conversationID, String? draftText}) {
return model.setConversationDraft(
conversationID: conversationID, draftText: draftText);
Future<V2TimCallback> setConversationDraft({required String conversationID, String? draftText}) {
return model.setConversationDraft(conversationID: conversationID, draftText: draftText);
}
/// Clear the historical message in a specific conversation
Future<V2TimCallback?>? clearHistoryMessage(
{required V2TimConversation conversation}) {
Future<V2TimCallback?>? clearHistoryMessage({required V2TimConversation conversation}) {
final convType = conversation.type;
final convID = convType == 1 ? conversation.userID : conversation.groupID;
if (convType != null && convID != null) {
@ -72,7 +69,7 @@ class TIMUIKitConversationController {
/// Scroll to a specific conversation, this conversation must be existed in conversation list.
/// If not exist, invoking `loadData` recursively, until find the target conversation.
scrollToConversation(String conversationID){
scrollToConversation(String conversationID) {
model.scrollToConversation = conversationID;
}
}

View File

@ -1,7 +1,10 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_profile_view_model.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/text_input_bottom_sheet.dart';
@ -27,8 +30,7 @@ class TIMUIKitProfileController {
}
/// add a user to block list
Future<List<V2TimFriendOperationResult>?> addUserToBlackList(
bool shouldAdd, String userID) {
Future<List<V2TimFriendOperationResult>?> addUserToBlackList(bool shouldAdd, String userID) {
return model.addToBlackList(shouldAdd, userID);
}

View File

@ -6,14 +6,22 @@ import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_change_info_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_tips_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_tips_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_image.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_change_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_tips_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_tips_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_image.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_image.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart';
import 'package:tencent_cloud_chat_uikit/ui/constants/time.dart';
@ -41,8 +49,7 @@ class MessageUtils {
// TRTC信息
static isGroupCallingMessage(V2TimMessage message) {
final isGroup = message.groupID != null;
final isCustomMessage =
message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM;
final isCustomMessage = message.elemType == MessageElemType.V2TIM_ELEM_TYPE_CUSTOM;
if (isCustomMessage) {
final customElemData = message.customElem?.data ?? "";
return isCallingData(customElemData) && isGroup;
@ -70,8 +77,8 @@ class MessageUtils {
}
}
static Future<String> _getGroupChangeType(V2TimGroupChangeInfo info,
List<V2TimGroupMemberFullInfo?> groupMemberList) async {
static Future<String> _getGroupChangeType(
V2TimGroupChangeInfo info, List<V2TimGroupMemberFullInfo?> groupMemberList) async {
int? type = info.type;
var value = info.value;
String s = TIM_t('群资料信息');
@ -93,22 +100,20 @@ class MessageUtils {
break;
case GroupChangeInfoType.V2TIM_GROUP_INFO_CHANGE_TYPE_OWNER:
s = TIM_t("群主");
final V2TimGroupMemberFullInfo? groupMemberInfo = groupMemberList
.firstWhereOrNull((element) => element?.userID == value);
final V2TimGroupMemberFullInfo? groupMemberInfo =
groupMemberList.firstWhereOrNull((element) => element?.userID == value);
if (groupMemberInfo != null) {
value = TencentUtils.checkString(groupMemberInfo.friendRemark) ??
TencentUtils.checkString(groupMemberInfo.nameCard) ??
TencentUtils.checkString(groupMemberInfo.nickName) ??
TencentUtils.checkString(groupMemberInfo.userID);
} else {
final res = await TencentImSDKPlugin.v2TIMManager
.getUsersInfo(userIDList: [value ?? ""]);
final res = await TencentImSDKPlugin.v2TIMManager.getUsersInfo(userIDList: [value ?? ""]);
if (res.code == 0) {
final List<V2TimUserFullInfo> data = res.data ?? [];
if (data.isNotEmpty) {
final firstPerson = data[0];
value = TencentUtils.checkString(firstPerson.nickName) ??
TencentUtils.checkString(firstPerson.userID);
value = TencentUtils.checkString(firstPerson.nickName) ?? TencentUtils.checkString(firstPerson.userID);
}
}
}
@ -126,15 +131,14 @@ class MessageUtils {
final String option8 = s;
if (value != null && value.isNotEmpty) {
return TIM_t_para("{{option8}}为 ", "$option8为 ")(option8: option8) +
value;
return TIM_t_para("{{option8}}为 ", "$option8为 ")(option8: option8) + value;
} else {
return option8;
}
}
static String? _getOpUserNick(V2TimGroupMemberInfo? opUser) {
if(opUser == null){
if (opUser == null) {
return "";
}
return TencentUtils.checkString(opUser.friendRemark) ??
@ -160,8 +164,7 @@ class MessageUtils {
}
static Future<String> groupTipsMessageAbstract(
V2TimGroupTipsElem groupTipsElem,
List<V2TimGroupMemberFullInfo?> groupMemberList) async {
V2TimGroupTipsElem groupTipsElem, List<V2TimGroupMemberFullInfo?> groupMemberList) async {
String displayMessage;
final operationType = groupTipsElem.type;
final operationMember = groupTipsElem.opMember;
@ -175,8 +178,7 @@ class MessageUtils {
bool changedValue = false;
for (V2TimGroupChangeInfo? element in groupChangeInfoList) {
final newText = await _getGroupChangeType(element!, groupMemberList);
changedInfoString +=
(changedInfoString.isEmpty ? "" : " / ") + newText;
changedInfoString += (changedInfoString.isEmpty ? "" : " / ") + newText;
changedValue = element!.boolValue ?? false;
}
if (changedInfoString.isEmpty) {
@ -184,73 +186,56 @@ class MessageUtils {
}
if (changedInfoString == TIM_t("全员禁言状态")) {
changedInfoString = TIM_t("全员禁言");
displayMessage = changedValue == false ? TIM_t_para("{{option7}} 取消", "$option7 取消")(option7: option7) +
changedInfoString : TIM_t_para("{{option7}} 开启", "$option7 开启")(option7: option7) +
changedInfoString;
displayMessage = changedValue == false
? TIM_t_para("{{option7}} 取消", "$option7 取消")(option7: option7) + changedInfoString
: TIM_t_para("{{option7}} 开启", "$option7 开启")(option7: option7) + changedInfoString;
} else {
displayMessage =
TIM_t_para("{{option7}}修改", "$option7修改")(option7: option7) +
changedInfoString;
displayMessage = TIM_t_para("{{option7}}修改", "$option7修改")(option7: option7) + changedInfoString;
}
break;
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_QUIT:
final String? option6 = opUserNickName ?? "";
displayMessage =
TIM_t_para("{{option6}}退出群聊", "$option6退出群聊")(option6: option6);
displayMessage = TIM_t_para("{{option6}}退出群聊", "$option6退出群聊")(option6: option6);
break;
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_INVITE:
final option5 =
memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final option5 = memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final inviteUser = _getOpUserNick(operationMember);
displayMessage = '$inviteUser' +
TIM_t_para("邀请{{option5}}加入群组", "邀请$option5加入群组")(option5: option5);
displayMessage = '$inviteUser' + TIM_t_para("邀请{{option5}}加入群组", "邀请$option5加入群组")(option5: option5);
break;
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_KICKED:
final option4 =
memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final option4 = memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final kickUser = _getOpUserNick(operationMember);
displayMessage = '$kickUser' +
TIM_t_para("将{{option4}}踢出群组", "$option4踢出群组")(option4: option4);
displayMessage = '$kickUser' + TIM_t_para("将{{option4}}踢出群组", "$option4踢出群组")(option4: option4);
break;
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_JOIN:
final option3 =
memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
displayMessage = TIM_t_para("用户{{option3}}加入了群聊", "用户$option3加入了群聊")(
option3: option3);
final option3 = memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
displayMessage = TIM_t_para("用户{{option3}}加入了群聊", "用户$option3加入了群聊")(option3: option3);
break;
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_MEMBER_INFO_CHANGE:
displayMessage = groupTipsElem.memberList!.map((e) {
final changedMember = groupTipsElem.memberChangeInfoList!
.firstWhere((element) => element!.userID == e!.userID);
final changedMember =
groupTipsElem.memberChangeInfoList!.firstWhere((element) => element!.userID == e!.userID);
final isMute = changedMember!.muteTime != 0;
final option2 = _getMemberNickName(e!);
final displayMessage = isMute ? TIM_t("禁言") : TIM_t("解除禁言");
return TIM_t_para("{{option2}} 被", "$option2")(option2: option2) +
displayMessage;
return TIM_t_para("{{option2}} 被", "$option2")(option2: option2) + displayMessage;
}).join("");
break;
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_SET_ADMIN:
final adminMember =
memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final adminMember = memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final opMember = _getOpUserNick(operationMember);
final option1 = adminMember;
displayMessage = '$opMember' +
TIM_t_para("将 {{option1}} 设置为管理员", "$option1 设置为管理员")(
option1: option1);
displayMessage = '$opMember' + TIM_t_para("将 {{option1}} 设置为管理员", "$option1 设置为管理员")(option1: option1);
break;
case GroupTipsElemType.V2TIM_GROUP_TIPS_TYPE_CANCEL_ADMIN:
final adminMember =
memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final adminMember = memberList!.map((e) => _getMemberNickName(e!).toString()).join("");
final opMember = _getOpUserNick(operationMember);
final option1 = adminMember;
displayMessage = '$opMember' +
TIM_t_para("将 {{option1}} 取消管理员", "$option1 取消管理员")(
option1: option1);
displayMessage = '$opMember' + TIM_t_para("将 {{option1}} 取消管理员", "$option1 取消管理员")(option1: option1);
break;
default:
final String option2 = operationType.toString();
displayMessage =
TIM_t_para("系统消息 {{option2}}", "系统消息 $option2")(option2: option2);
displayMessage = TIM_t_para("系统消息 {{option2}}", "系统消息 $option2")(option2: option2);
break;
}
return displayMessage;
@ -286,12 +271,10 @@ class MessageUtils {
}
static Widget wrapMessageTips(Widget child, TUITheme? theme) {
return Container(
margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 30), child: child);
return Container(margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 30), child: child);
}
static String getAbstractMessageAsync(V2TimMessage message,
List<V2TimGroupMemberFullInfo?> groupMemberList) {
static String getAbstractMessageAsync(V2TimMessage message, List<V2TimGroupMemberFullInfo?> groupMemberList) {
final msgType = message.elemType;
switch (msgType) {
case MessageElemType.V2TIM_ELEM_TYPE_CUSTOM:
@ -304,8 +287,7 @@ class MessageUtils {
return TIM_t("[表情]");
case MessageElemType.V2TIM_ELEM_TYPE_FILE:
final String? option2 = message.fileElem!.fileName ?? "";
return TIM_t_para("[文件] {{option2}}", "[文件] $option2")(
option2: option2);
return TIM_t_para("[文件] {{option2}}", "[文件] $option2")(option2: option2);
case MessageElemType.V2TIM_ELEM_TYPE_GROUP_TIPS:
return TIM_t("群提示");
case MessageElemType.V2TIM_ELEM_TYPE_IMAGE:
@ -321,15 +303,12 @@ class MessageUtils {
}
}
static V2TimImage? getImageFromImgList(
List<V2TimImage?>? list, List<String> order) {
static V2TimImage? getImageFromImgList(List<V2TimImage?>? list, List<String> order) {
V2TimImage? img;
try {
for (String type in order) {
img = list?.firstWhere(
(e) =>
e?.type == HistoryMessageDartConstant.V2_TIM_IMAGE_TYPES[type],
orElse: () => null);
img =
list?.firstWhere((e) => e?.type == HistoryMessageDartConstant.V2_TIM_IMAGE_TYPES[type], orElse: () => null);
}
} catch (e) {
outputLogger.i('getImageFromImgList error ${e.toString()}');
@ -345,16 +324,15 @@ class MessageUtils {
final displayName = friendRemark.isNotEmpty
? friendRemark
: nameCard.isNotEmpty
? nameCard
: nickName.isNotEmpty
? nickName
: sender;
? nameCard
: nickName.isNotEmpty
? nickName
: sender;
return displayName.toString();
}
static Future<V2TimValueCallback<V2TimMessage>?> handleMessageError(
Future<V2TimValueCallback<V2TimMessage>?> fun,
BuildContext context) async {
Future<V2TimValueCallback<V2TimMessage>?> fun, BuildContext context) async {
final res = await fun;
return handleMessageErrorCode(res, context);
}

View File

@ -2,7 +2,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_wide_modal_operation_key.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/wide_popup.dart';
@ -44,32 +45,24 @@ class TIMUIKitAddFriend extends StatefulWidget {
class _TIMUIKitAddFriendState extends TIMUIKitState<TIMUIKitAddFriend> {
final TextEditingController _controller = TextEditingController();
final CoreServicesImpl _coreServicesImpl = serviceLocator<CoreServicesImpl>();
final FriendshipServices _friendshipServices =
serviceLocator<FriendshipServices>();
final TUISelfInfoViewModel _selfInfoViewModel =
serviceLocator<TUISelfInfoViewModel>();
final FriendshipServices _friendshipServices = serviceLocator<FriendshipServices>();
final TUISelfInfoViewModel _selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
final FocusNode _focusNode = FocusNode();
bool isFocused = false;
bool showResult = false;
List<V2TimUserFullInfo>? searchResult;
Widget _searchResultItemBuilder(
V2TimUserFullInfo friendInfo, TUITheme theme) {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
Widget _searchResultItemBuilder(V2TimUserFullInfo friendInfo, TUITheme theme) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final faceUrl = friendInfo.faceUrl ?? "";
final userID = friendInfo.userID ?? "";
final String showName =
((friendInfo.nickName != null && friendInfo.nickName!.isNotEmpty)
? friendInfo.nickName
: userID) ??
"";
((friendInfo.nickName != null && friendInfo.nickName!.isNotEmpty) ? friendInfo.nickName : userID) ?? "";
return InkWell(
onTap: () async {
final checkFriend = await _friendshipServices.checkFriend(
userIDList: [userID],
checkType: FriendTypeEnum.V2TIM_FRIEND_TYPE_SINGLE);
final checkFriend = await _friendshipServices
.checkFriend(userIDList: [userID], checkType: FriendTypeEnum.V2TIM_FRIEND_TYPE_SINGLE);
if (checkFriend != null) {
final res = checkFriend.first;
if (res.resultCode == 0 && res.resultType != 0) {
@ -126,9 +119,7 @@ class _TIMUIKitAddFriendState extends TIMUIKitState<TIMUIKitAddFriend> {
children: [
Text(
showName,
style: TextStyle(
color: theme.darkTextColor,
fontSize: isDesktopScreen ? 16 : 18),
style: TextStyle(color: theme.darkTextColor, fontSize: isDesktopScreen ? 16 : 18),
),
const SizedBox(
height: 4,
@ -145,16 +136,14 @@ class _TIMUIKitAddFriendState extends TIMUIKitState<TIMUIKitAddFriend> {
);
}
List<Widget> _searchResultBuilder(
List<V2TimUserFullInfo>? searchResult, TUITheme theme) {
List<Widget> _searchResultBuilder(List<V2TimUserFullInfo>? searchResult, TUITheme theme) {
final noResult = searchResult == null || searchResult.isEmpty;
if (noResult) {
return [
Container(
margin: const EdgeInsets.only(top: 20),
child: Center(
child: Text(TIM_t("该用户不存在"),
style: TextStyle(color: theme.weakTextColor, fontSize: 14)),
child: Text(TIM_t("该用户不存在"), style: TextStyle(color: theme.weakTextColor, fontSize: 14)),
),
)
];

View File

@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -20,11 +21,7 @@ class SendApplication extends StatefulWidget {
final AddFriendLifeCycle? lifeCycle;
const SendApplication(
{Key? key,
this.lifeCycle,
required this.friendInfo,
required this.model,
this.isShowDefaultGroup = false})
{Key? key, this.lifeCycle, required this.friendInfo, required this.model, this.isShowDefaultGroup = false})
: super(key: key);
@override
@ -38,21 +35,18 @@ class _SendApplicationState extends TIMUIKitState<SendApplication> {
@override
void initState() {
super.initState();
final showName =
widget.model.loginInfo?.nickName ?? widget.model.loginInfo?.userID;
final showName = widget.model.loginInfo?.nickName ?? widget.model.loginInfo?.userID;
_verficationController.text = "我是: $showName";
}
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final TUITheme theme = value.theme;
final FriendshipServices _friendshipServices =
serviceLocator<FriendshipServices>();
final FriendshipServices _friendshipServices = serviceLocator<FriendshipServices>();
final faceUrl = widget.friendInfo.faceUrl ?? "";
final userID = widget.friendInfo.userID ?? "";
final String showName = ((widget.friendInfo.nickName != null &&
widget.friendInfo.nickName!.isNotEmpty)
final String showName = ((widget.friendInfo.nickName != null && widget.friendInfo.nickName!.isNotEmpty)
? widget.friendInfo.nickName
: userID) ??
"";
@ -81,26 +75,22 @@ class _SendApplicationState extends TIMUIKitState<SendApplication> {
children: [
Text(
showName,
style:
TextStyle(color: theme.darkTextColor, fontSize: 18),
style: TextStyle(color: theme.darkTextColor, fontSize: 18),
),
const SizedBox(
height: 4,
),
Text(
"ID: $userID",
style:
TextStyle(fontSize: 13, color: theme.weakTextColor),
style: TextStyle(fontSize: 13, color: theme.weakTextColor),
),
const SizedBox(
height: 4,
),
if (TencentUtils.checkString(option2) != null)
Text(
TIM_t_para("个性签名: {{option2}}", "个性签名: $option2")(
option2: option2),
style: TextStyle(
fontSize: 13, color: theme.weakTextColor),
TIM_t_para("个性签名: {{option2}}", "个性签名: $option2")(option2: option2),
style: TextStyle(fontSize: 13, color: theme.weakTextColor),
),
],
)
@ -171,20 +161,17 @@ class _SendApplicationState extends TIMUIKitState<SendApplication> {
if (widget.isShowDefaultGroup == true)
Container(
color: theme.white,
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
TIM_t("分组"),
style:
TextStyle(color: theme.darkTextColor, fontSize: 16),
style: TextStyle(color: theme.darkTextColor, fontSize: 16),
),
Text(
TIM_t("我的好友"),
style:
TextStyle(color: theme.darkTextColor, fontSize: 16),
style: TextStyle(color: theme.darkTextColor, fontSize: 16),
)
],
),
@ -200,8 +187,7 @@ class _SendApplicationState extends TIMUIKitState<SendApplication> {
final friendGroup = TIM_t("我的好友");
if (widget.lifeCycle?.shouldAddFriend != null &&
await widget.lifeCycle!.shouldAddFriend(userID, remark,
friendGroup, addWording, context) ==
await widget.lifeCycle!.shouldAddFriend(userID, remark, friendGroup, addWording, context) ==
false) {
return;
}

View File

@ -1,8 +1,10 @@
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
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_uikit/data_services/core/tim_uikit_wide_modal_operation_key.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/wide_popup.dart';
@ -23,14 +25,11 @@ class TIMUIKitAddGroup extends StatefulWidget {
final AddGroupLifeCycle? lifeCycle;
/// Navigate to group chat, if user is already a member of the current group.
final Function(String groupID, V2TimConversation conversation)
onTapExistGroup;
final Function(String groupID, V2TimConversation conversation) onTapExistGroup;
final VoidCallback? closeFunc;
const TIMUIKitAddGroup(
{Key? key, this.lifeCycle, required this.onTapExistGroup, this.closeFunc})
: super(key: key);
const TIMUIKitAddGroup({Key? key, this.lifeCycle, required this.onTapExistGroup, this.closeFunc}) : super(key: key);
@override
State<StatefulWidget> createState() => _TIMUIKitAddGroupState();
@ -39,10 +38,8 @@ class TIMUIKitAddGroup extends StatefulWidget {
class _TIMUIKitAddGroupState extends TIMUIKitState<TIMUIKitAddGroup> {
final TextEditingController _controller = TextEditingController();
final GroupServices _groupServices = serviceLocator<GroupServices>();
final ConversationService _conversationService =
serviceLocator<ConversationService>();
final TUIFriendShipViewModel friendShipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final ConversationService _conversationService = serviceLocator<ConversationService>();
final TUIFriendShipViewModel friendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
List<V2TimGroupInfo>? _addedGroupList;
List<V2TimGroupInfo>? groupResult = [];
final FocusNode _focusNode = FocusNode();
@ -79,24 +76,19 @@ class _TIMUIKitAddGroupState extends TIMUIKitState<TIMUIKitAddGroup> {
final groupID = groupInfo.groupID;
final showName = groupInfo.groupName ?? groupID;
final groupType = _getGroupType(groupInfo.groupType);
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return InkWell(
onTap: () async {
final V2TimConversation? groupConversation =
await getGroupConversation(groupID);
final V2TimConversation? groupConversation = await getGroupConversation(groupID);
if (groupConversation != null) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("您已是群成员"),
infoCode: 6660202));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("您已是群成员"), infoCode: 6660202));
if (widget.closeFunc != null) {
widget.closeFunc!();
}
return;
}
if(isDesktopScreen){
if (isDesktopScreen) {
if (widget.closeFunc != null) {
widget.closeFunc!();
}
@ -107,20 +99,19 @@ class _TIMUIKitAddGroupState extends TIMUIKitState<TIMUIKitAddGroup> {
height: MediaQuery.of(context).size.width * 0.4,
title: TIM_t("添加群聊"),
child: (closeFuncSendApplication) => SendJoinGroupApplication(
lifeCycle: widget.lifeCycle,
groupInfo: groupInfo,
lifeCycle: widget.lifeCycle,
groupInfo: groupInfo,
),
);
}else{
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => SendJoinGroupApplication(
lifeCycle: widget.lifeCycle,
groupInfo: groupInfo,
)));
lifeCycle: widget.lifeCycle,
groupInfo: groupInfo,
)));
}
},
child: Container(
padding: const EdgeInsets.symmetric(vertical: 12),
@ -156,24 +147,19 @@ class _TIMUIKitAddGroupState extends TIMUIKitState<TIMUIKitAddGroup> {
);
}
List<Widget> _searchResultBuilder(
List<V2TimGroupInfo>? searchResult, TUITheme theme) {
List<Widget> _searchResultBuilder(List<V2TimGroupInfo>? searchResult, TUITheme theme) {
final noResult = searchResult != null && searchResult.isEmpty;
if (noResult) {
return [
Container(
margin: const EdgeInsets.only(top: 20),
child: Center(
child: Text(TIM_t("该群聊不存在"),
style: TextStyle(color: theme.weakTextColor, fontSize: 14)),
child: Text(TIM_t("该群聊不存在"), style: TextStyle(color: theme.weakTextColor, fontSize: 14)),
),
)
];
}
return searchResult
?.map((e) => _searchResultItemBuilder(e, theme))
.toList() ??
[];
return searchResult?.map((e) => _searchResultItemBuilder(e, theme)).toList() ?? [];
}
Future<V2TimConversation?> getGroupConversation(String groupID) async {
@ -186,15 +172,12 @@ class _TIMUIKitAddGroupState extends TIMUIKitState<TIMUIKitAddGroup> {
})) !=
null) {
V2TimConversation? conversation;
conversation = await _conversationService
.getConversationListByConversationId(convID: "group_$groupID");
conversation = await _conversationService.getConversationListByConversationId(convID: "group_$groupID");
if (conversation == null) {
await friendShipViewModel.loadGroupListData();
if (friendShipViewModel.groupList
.indexWhere((element) => element.groupID == groupID) >
-1) {
final V2TimGroupInfo groupInfo = friendShipViewModel.groupList
.firstWhere((element) => element.groupID == groupID);
if (friendShipViewModel.groupList.indexWhere((element) => element.groupID == groupID) > -1) {
final V2TimGroupInfo groupInfo =
friendShipViewModel.groupList.firstWhere((element) => element.groupID == groupID);
conversation = V2TimConversation(
conversationID: "group_$groupID",
type: 2,
@ -237,10 +220,7 @@ class _TIMUIKitAddGroupState extends TIMUIKitState<TIMUIKitAddGroup> {
final res = await _groupServices.getGroupsInfo(groupIDList: [params]);
if (res != null) {
setState(() {
groupResult = res
.where((e) => e.resultCode == 0)
.map((e) => e.groupInfo!)
.toList();
groupResult = res.where((e) => e.resultCode == 0).map((e) => e.groupInfo!).toList();
});
} else {
setState(() {

View File

@ -1,8 +1,10 @@
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
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_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/add_group_life_cycle.dart';
@ -18,16 +20,13 @@ class SendJoinGroupApplication extends StatefulWidget {
final V2TimGroupInfo groupInfo;
final AddGroupLifeCycle? lifeCycle;
const SendJoinGroupApplication(
{Key? key, required this.groupInfo, this.lifeCycle})
: super(key: key);
const SendJoinGroupApplication({Key? key, required this.groupInfo, this.lifeCycle}) : super(key: key);
@override
State<StatefulWidget> createState() => _SendJoinGroupApplicationState();
}
class _SendJoinGroupApplicationState
extends TIMUIKitState<SendJoinGroupApplication> {
class _SendJoinGroupApplicationState extends TIMUIKitState<SendJoinGroupApplication> {
final TextEditingController _verficationController = TextEditingController();
final GroupServices _groupServices = serviceLocator<GroupServices>();
final CoreServicesImpl _coreServicesImpl = serviceLocator<CoreServicesImpl>();
@ -37,14 +36,12 @@ class _SendJoinGroupApplicationState
super.initState();
final loginUserInfo = _coreServicesImpl.loginUserInfo;
final option1 = loginUserInfo?.nickName ?? loginUserInfo?.userID;
_verficationController.text =
TIM_t_para("我是: {{option1}}", "我是: $option1")(option1: option1);
_verficationController.text = TIM_t_para("我是: {{option1}}", "我是: $option1")(option1: option1);
}
Future<V2TimCallback?> addGroup(String groupID, String message) async {
if (widget.lifeCycle?.shouldAddGroup != null &&
await widget.lifeCycle!.shouldAddGroup(groupID, message, context) ==
false) {
await widget.lifeCycle!.shouldAddGroup(groupID, message, context) == false) {
return null;
}
return _groupServices.joinGroup(groupID: groupID, message: message);
@ -107,25 +104,21 @@ class _SendJoinGroupApplicationState
children: [
Text(
showName,
style:
TextStyle(color: theme.darkTextColor, fontSize: 18),
style: TextStyle(color: theme.darkTextColor, fontSize: 18),
),
const SizedBox(
height: 4,
),
Text(
"ID: $groupID",
style:
TextStyle(fontSize: 13, color: theme.weakTextColor),
style: TextStyle(fontSize: 13, color: theme.weakTextColor),
),
const SizedBox(
height: 4,
),
Text(
TIM_t_para("群类型: {{option1}}", "群类型: $option1")(
option1: option1),
style:
TextStyle(fontSize: 12, color: theme.weakTextColor),
TIM_t_para("群类型: {{option1}}", "群类型: $option1")(option1: option1),
style: TextStyle(fontSize: 12, color: theme.weakTextColor),
),
],
)
@ -164,9 +157,7 @@ class _SendJoinGroupApplicationState
final res = await addGroup(groupID, addWording);
if (res?.code == 0) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("群申请已发送"),
infoCode: 6660201));
type: TIMCallbackType.INFO, infoRecommendText: TIM_t("群申请已发送"), infoCode: 6660201));
}
},
child: Text(TIM_t("发送"))),

View File

@ -2,7 +2,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_slidable_plus_plus/flutter_slidable_plus_plus.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/block_list_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart';
@ -13,8 +14,7 @@ import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme_view_model.dart';
typedef BlackListItemBuilder = Widget Function(
BuildContext context, V2TimFriendInfo friendInfo);
typedef BlackListItemBuilder = Widget Function(BuildContext context, V2TimFriendInfo friendInfo);
class TIMUIKitBlackList extends StatefulWidget {
final void Function(V2TimFriendInfo friendInfo)? onTapItem;
@ -24,12 +24,7 @@ class TIMUIKitBlackList extends StatefulWidget {
/// The life cycle hooks for block list business logic
final BlockListLifeCycle? lifeCycle;
const TIMUIKitBlackList(
{Key? key,
this.onTapItem,
this.emptyBuilder,
this.itemBuilder,
this.lifeCycle})
const TIMUIKitBlackList({Key? key, this.onTapItem, this.emptyBuilder, this.itemBuilder, this.lifeCycle})
: super(key: key);
@override
@ -37,8 +32,7 @@ class TIMUIKitBlackList extends StatefulWidget {
}
class _TIMUIKitBlackListState extends TIMUIKitState<TIMUIKitBlackList> {
final TUIFriendShipViewModel _friendshipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final TUIFriendShipViewModel _friendshipViewModel = serviceLocator<TUIFriendShipViewModel>();
_getShowName(V2TimFriendInfo item) {
final friendRemark = item.friendRemark ?? "";
@ -52,8 +46,7 @@ class _TIMUIKitBlackListState extends TIMUIKitState<TIMUIKitBlackList> {
final theme = Provider.of<TUIThemeViewModel>(context).theme;
final showName = _getShowName(friendInfo);
final faceUrl = friendInfo.userProfile?.faceUrl ?? "";
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
Widget itemWidget() {
return Material(
@ -67,10 +60,7 @@ class _TIMUIKitBlackListState extends TIMUIKitState<TIMUIKitBlackList> {
child: Container(
padding: const EdgeInsets.only(top: 10, left: 16, right: 16),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: theme.weakDividerColor ??
CommonColor.weakDividerColor))),
border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(
children: [
Container(
@ -88,15 +78,13 @@ class _TIMUIKitBlackListState extends TIMUIKitState<TIMUIKitBlackList> {
padding: const EdgeInsets.only(top: 10, bottom: 20),
child: Text(
showName,
style: TextStyle(
color: theme.black, fontSize: isDesktopScreen ? 14 : 18),
style: TextStyle(color: theme.black, fontSize: isDesktopScreen ? 14 : 18),
),
)),
if (isDesktopScreen)
OutlinedButton(
onPressed: () {
_friendshipViewModel
.deleteFromBlockList([friendInfo.userID]);
_friendshipViewModel.deleteFromBlockList([friendInfo.userID]);
},
child: Text(
TIM_t("移出黑名单"),
@ -116,8 +104,7 @@ class _TIMUIKitBlackListState extends TIMUIKitState<TIMUIKitBlackList> {
endActionPane: ActionPane(motion: const DrawerMotion(), children: [
SlidableAction(
onPressed: (context) async {
await _friendshipViewModel
.deleteFromBlockList([friendInfo.userID]);
await _friendshipViewModel.deleteFromBlockList([friendInfo.userID]);
},
backgroundColor: theme.cautionColor ?? CommonColor.cautionColor,
foregroundColor: theme.white,
@ -133,7 +120,6 @@ class _TIMUIKitBlackListState extends TIMUIKitState<TIMUIKitBlackList> {
return widget.itemBuilder ?? _itemBuilder;
}
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
return MultiProvider(

View File

@ -1,8 +1,10 @@
import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -60,11 +62,18 @@ class _TIMUIKitHistoryMessageListTongueContainerState extends TIMUIKitState<TIMU
if (offset <= 0.0 && conversationUnreadCount != 0) {
widget.model.showLatestUnread();
}
if (widget.scrollController.offset <= widget.scrollController.position.minScrollExtent && !widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) {
if (widget.scrollController.offset <= widget.scrollController.position.minScrollExtent &&
!widget.scrollController.position.outOfRange &&
!widget.model.haveMoreLatestData) {
changePositionState(HistoryMessagePosition.bottom);
} else if (widget.scrollController.offset <= screenHeight * 1.6 && widget.scrollController.offset > 0 && !widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) {
} else if (widget.scrollController.offset <= screenHeight * 1.6 &&
widget.scrollController.offset > 0 &&
!widget.scrollController.position.outOfRange &&
!widget.model.haveMoreLatestData) {
changePositionState(HistoryMessagePosition.inTwoScreen);
} else if (widget.scrollController.offset > screenHeight * 1.6 && !widget.scrollController.position.outOfRange && !widget.model.haveMoreLatestData) {
} else if (widget.scrollController.offset > screenHeight * 1.6 &&
!widget.scrollController.position.outOfRange &&
!widget.model.haveMoreLatestData) {
changePositionState(HistoryMessagePosition.awayTwoScreen);
}
}
@ -134,7 +143,8 @@ class _TIMUIKitHistoryMessageListTongueContainerState extends TIMUIKitState<TIMU
try {
isClickShowPrevious = true;
final String? lastSeqString = widget.conversation.lastMessage?.seq;
final int? lastSeq = TencentUtils.checkString(lastSeqString) != null ? int.parse(lastSeqString!) : null;
final int? lastSeq =
TencentUtils.checkString(lastSeqString) != null ? int.parse(lastSeqString!) : null;
final int? previousCount = widget.conversation.unreadCount;
if (lastSeq != null && previousCount != null) {
final targetSeq = lastSeq - previousCount;

View File

@ -7,9 +7,12 @@ import 'package:provider/provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
@ -186,7 +189,9 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
int targetIndex = 1;
for (int i = msgList.length - 1; i >= 0; i--) {
final currentMsg = msgList[i];
if (currentMsg?.timestamp == targetTimeStamp && currentMsg?.elemType != 11 && currentMsg!.msgID == targetMsg.msgID) {
if (currentMsg?.timestamp == targetTimeStamp &&
currentMsg?.elemType != 11 &&
currentMsg!.msgID == targetMsg.msgID) {
// find the target index by timestamp and msgID
isFound = true;
targetIndex = -i;
@ -268,7 +273,8 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
if (maybeHaveMoreMessageForFind) {
findingSeq = targetSeq;
int requestCount = int.parse(lastSeq) - int.parse(targetSeq);
maybeHaveMoreMessageForFind = await widget.onLoadMore(_getMessageId(widget.messageList.length - 1), LoadDirection.previous, requestCount, int.parse(lastSeq));
maybeHaveMoreMessageForFind = await widget.onLoadMore(
_getMessageId(widget.messageList.length - 1), LoadDirection.previous, requestCount, int.parse(lastSeq));
} else {
showCantFindMsg();
}
@ -285,7 +291,9 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
int targetIndex = 1;
for (int i = msgList.length - 1; i >= 0; i--) {
final currentMsg = msgList[i];
if (currentMsg?.timestamp == targetTimeStamp && currentMsg?.elemType != 11 && currentMsg!.msgID == targetMsg.msgID) {
if (currentMsg?.timestamp == targetTimeStamp &&
currentMsg?.elemType != 11 &&
currentMsg!.msgID == targetMsg.msgID) {
isFound = true;
targetIndex = -i;
break;
@ -354,14 +362,17 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
center: shouldShowUnreadMessage ? centerKey : null,
key: widget.mainHistoryListConfig?.key,
primary: widget.mainHistoryListConfig?.primary,
physics: (widget.isAllowScroll == false) ? const NeverScrollableScrollPhysics() : widget.mainHistoryListConfig?.physics,
physics: (widget.isAllowScroll == false)
? const NeverScrollableScrollPhysics()
: widget.mainHistoryListConfig?.physics,
// padding: widget.mainHistoryListConfig?.padding ?? EdgeInsets.zero,
// itemExtent: widget.mainHistoryListConfig?.itemExtent,
// prototypeItem: widget.mainHistoryListConfig?.prototypeItem,
cacheExtent: widget.mainHistoryListConfig?.cacheExtent ?? 1500,
semanticChildCount: widget.mainHistoryListConfig?.semanticChildCount,
dragStartBehavior: widget.mainHistoryListConfig?.dragStartBehavior ?? DragStartBehavior.start,
keyboardDismissBehavior: widget.mainHistoryListConfig?.keyboardDismissBehavior ?? ScrollViewKeyboardDismissBehavior.manual,
keyboardDismissBehavior:
widget.mainHistoryListConfig?.keyboardDismissBehavior ?? ScrollViewKeyboardDismissBehavior.manual,
restorationId: widget.mainHistoryListConfig?.restorationId,
clipBehavior: widget.mainHistoryListConfig?.clipBehavior ?? Clip.hardEdge,
reverse: true,
@ -377,20 +388,24 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
if (index == unreadMessageList.length - 1 && widget.model.haveMoreLatestData == true) {
throttleFunctionWithMsgID(messageItem?.msgID ?? "", LoadDirection.latest);
}
outputLogger.i("Rendering a unread message: ${getMessageIdentifier(messageItem, 0)}, message Type: ${messageItem?.elemType}");
outputLogger.i(
"Rendering a unread message: ${getMessageIdentifier(messageItem, 0)}, message Type: ${messageItem?.elemType}");
return AutoScrollTag(
controller: _autoScrollController,
index: -index,
key: ValueKey(getMessageIdentifier(messageItem, index)),
highlightColor: Colors.black.withOpacity(0.1),
child: KeepAliveWrapper(keepAlive: messageItem?.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND, child: Container(child: _getMessageItemBuilder(messageItem))),
child: KeepAliveWrapper(
keepAlive: messageItem?.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND,
child: Container(child: _getMessageItemBuilder(messageItem))),
);
},
childCount: unreadMessageList.length,
findChildIndexCallback: (Key key) {
final ValueKey<String> valueKey = key as ValueKey<String>;
final String data = valueKey.value;
final int index = unreadMessageList.indexWhere((element) => getMessageIdentifier(element, 0) == data);
final int index =
unreadMessageList.indexWhere((element) => getMessageIdentifier(element, 0) == data);
return index != -1 ? index : null;
})),
),
@ -414,7 +429,11 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
final messageItem = readMessageList[index];
if (index == readMessageList.length - 1) {
if (haveMoreData) {
final lastMessage = globalModel.messageListMap[TencentUtils.checkString(widget.conversation.groupID) ?? widget.conversation.userID ?? widget.conversation.conversationID]?.last;
final lastMessage = globalModel
.messageListMap[TencentUtils.checkString(widget.conversation.groupID) ??
widget.conversation.userID ??
widget.conversation.conversationID]
?.last;
if (lastMessage != null) {
throttleFunctionWithMsgID(lastMessage.msgID ?? "", LoadDirection.previous);
} else {
@ -431,29 +450,37 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
index: -index,
key: ValueKey(getMessageIdentifier(messageItem, index)),
highlightColor: Colors.black.withOpacity(0.1),
child: KeepAliveWrapper(keepAlive: messageItem?.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND, child: Container(child: _getMessageItemBuilder(messageItem))),
child: KeepAliveWrapper(
keepAlive: messageItem?.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND,
child: Container(child: _getMessageItemBuilder(messageItem))),
),
],
);
}
}
if (index == 0 && widget.model.haveMoreLatestData == true && globalModel.receivedNewMessageCount < 10) {
if (index == 0 &&
widget.model.haveMoreLatestData == true &&
globalModel.receivedNewMessageCount < 10) {
throttleFunction(index, LoadDirection.latest);
}
outputLogger.i("Rendering a read message: ${getMessageIdentifier(messageItem, 0)}, message Type: ${messageItem?.elemType}");
outputLogger.i(
"Rendering a read message: ${getMessageIdentifier(messageItem, 0)}, message Type: ${messageItem?.elemType}");
return AutoScrollTag(
controller: _autoScrollController,
index: -index,
key: ValueKey(getMessageIdentifier(messageItem, index)),
highlightColor: Colors.black.withOpacity(0.1),
child: KeepAliveWrapper(keepAlive: messageItem?.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND, child: Container(child: _getMessageItemBuilder(messageItem))),
child: KeepAliveWrapper(
keepAlive: messageItem?.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND,
child: Container(child: _getMessageItemBuilder(messageItem))),
);
},
childCount: readMessageList.length,
findChildIndexCallback: (Key key) {
final ValueKey<String> valueKey = key as ValueKey<String>;
final String data = valueKey.value;
final int index = readMessageList.indexWhere((element) => getMessageIdentifier(element, 0) == data);
final int index =
readMessageList.indexWhere((element) => getMessageIdentifier(element, 0) == data);
return index > -1 ? index : null;
}));
},

View File

@ -9,10 +9,14 @@ import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
@ -68,7 +72,8 @@ typedef MessageRowBuilder = Widget? Function(
Function onScrollToIndexBegin,
);
typedef MessageNickNameBuilder = Widget Function(BuildContext context, V2TimMessage message, TUIChatSeparateViewModel model);
typedef MessageNickNameBuilder = Widget Function(
BuildContext context, V2TimMessage message, TUIChatSeparateViewModel model);
typedef MessageItemContent = Widget? Function(
V2TimMessage message,
@ -175,7 +180,8 @@ class ToolTipsConfig {
bool showTranslation;
/// A builder for additional custom items. We recommend using `additionalMessageToolTips` instead of this field since version 2.0, as you only need to provide the data rather than the whole widget. This makes usage easier and you don't need to worry about the UI display.
final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])? additionalItemBuilder;
final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])?
additionalItemBuilder;
/// A list of additional message tooltip menu items, provided with the data only. We recommend using this field instead of the previous `additionalItemBuilder`.
List<MessageToolTipItem> Function(V2TimMessage message, Function() closeTooltip)? additionalMessageToolTips;
@ -189,7 +195,8 @@ class ToolTipsConfig {
this.showCopyMessage = true,
this.showForwardMessage = true,
this.additionalMessageToolTips,
@Deprecated("Please use `additionalMessageToolTips` instead. You are now only expected to specify the data, rather than providing a whole widget. This makes usage easier, as you no longer need to worry about the UI display.")
@Deprecated(
"Please use `additionalMessageToolTips` instead. You are now only expected to specify the data, rather than providing a whole widget. This makes usage easier, as you no longer need to worry about the UI display.")
this.additionalItemBuilder});
}
@ -230,7 +237,8 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget {
/// Auto mention user when send reply message
final bool allowAtUserWhenReply;
@Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
@Deprecated(
"Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
/// allow show user nick name
final bool showNickName;
@ -278,7 +286,9 @@ class TIMUIKitHistoryMessageListItem extends StatefulWidget {
const TIMUIKitHistoryMessageListItem(
{Key? key,
required this.message,
@Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") this.showNickName = false,
@Deprecated(
"Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
this.showNickName = false,
this.onScrollToIndex,
this.onScrollToIndexBegin,
this.onTapForOthersPortrait,
@ -342,7 +352,8 @@ class TipsActionItem extends TIMUIKitStatelessWidget {
}
}
class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistoryMessageListItem> with SingleTickerProviderStateMixin {
class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistoryMessageListItem>
with SingleTickerProviderStateMixin {
SuperTooltip? tooltip;
late AnimationController _animationController;
@ -370,7 +381,8 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
final hasCustomData = message.cloudCustomData != null && message.cloudCustomData != "";
if (hasCustomData) {
try {
final CloudCustomData messageCloudCustomData = CloudCustomData.fromJson(json.decode(TencentUtils.checkString(message.cloudCustomData) != null ? message.cloudCustomData! : "{}"));
final CloudCustomData messageCloudCustomData = CloudCustomData.fromJson(
json.decode(TencentUtils.checkString(message.cloudCustomData) != null ? message.cloudCustomData! : "{}"));
if (messageCloudCustomData.messageReply != null) {
MessageRepliedData.fromJson(messageCloudCustomData.messageReply!);
return true;
@ -612,7 +624,10 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
Widget _groupTipsMessageBuilder(TUIChatSeparateViewModel model) {
final messageItem = widget.message;
return Container(padding: const EdgeInsets.only(bottom: 20), child: TIMUIKitGroupTipsElem(groupTipsElem: messageItem.groupTipsElem!, groupMemberList: model.groupMemberList ?? []));
return Container(
padding: const EdgeInsets.only(bottom: 20),
child: TIMUIKitGroupTipsElem(
groupTipsElem: messageItem.groupTipsElem!, groupMemberList: model.groupMemberList ?? []));
}
Widget _selfRevokeEditMessageBuilder(theme, TUIChatSeparateViewModel model) {
@ -650,7 +665,9 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
alignment: Alignment.center,
margin: const EdgeInsets.symmetric(vertical: 20),
child: Text(
model.chatConfig.timeDividerConfig?.timestampParser != null ? (model.chatConfig.timeDividerConfig?.timestampParser!(timeStamp))! : TimeAgo().getTimeForMessage(timeStamp),
model.chatConfig.timeDividerConfig?.timestampParser != null
? (model.chatConfig.timeDividerConfig?.timestampParser!(timeStamp))!
: TimeAgo().getTimeForMessage(timeStamp),
style: widget.themeData?.timelineTextStyle ??
TextStyle(
fontSize: 12,
@ -674,7 +691,8 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
width: 100,
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(colors: [const Color(0x00C0E1FF), theme.primaryColor ?? CommonColor.lightPrimaryColor]),
gradient: LinearGradient(
colors: [const Color(0x00C0E1FF), theme.primaryColor ?? CommonColor.lightPrimaryColor]),
)),
),
),
@ -733,15 +751,25 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
final isSelf = message.isSelf ?? true;
final targetWidth = min(MediaQuery.of(context).size.width * 0.84, 350).toDouble();
final double dx = !isSelf ? min(tapDetails?.globalPosition.dx ?? targetWidth, screenWidth - targetWidth) : max(tapDetails?.globalPosition.dx ?? targetWidth, targetWidth).toDouble();
final double dy = min(tapDetails?.globalPosition.dy ?? MediaQuery.of(context).size.height, MediaQuery.of(context).size.height - 320).toDouble();
final double dx = !isSelf
? min(tapDetails?.globalPosition.dx ?? targetWidth, screenWidth - targetWidth)
: max(tapDetails?.globalPosition.dx ?? targetWidth, targetWidth).toDouble();
final double dy = min(tapDetails?.globalPosition.dy ?? MediaQuery.of(context).size.height,
MediaQuery.of(context).size.height - 320)
.toDouble();
final finalTapDetail = tapDetails != null
? TapDownDetails(
globalPosition: Offset(dx, dy),
)
: null;
initTools(context: c, model: model, isShowMoreSticker: isShowMoreSticker, details: finalTapDetail, theme: theme, isFromWideToolTip: isFromWideTooltip);
initTools(
context: c,
model: model,
isShowMoreSticker: isShowMoreSticker,
details: finalTapDetail,
theme: theme,
isFromWideToolTip: isFromWideTooltip);
tooltip!.show(c, targetCenter: finalTapDetail?.globalPosition);
}
@ -760,7 +788,14 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
});
}
initTools({BuildContext? context, bool isLongMessage = false, required TUIChatSeparateViewModel model, TUITheme? theme, bool? isShowMoreSticker, TapDownDetails? details, bool? isFromWideToolTip}) {
initTools(
{BuildContext? context,
bool isLongMessage = false,
required TUIChatSeparateViewModel model,
TUITheme? theme,
bool? isShowMoreSticker,
TapDownDetails? details,
bool? isFromWideToolTip}) {
final isUseMessageReaction = widget.message.elemType == 2 ? false : model.chatConfig.isUseMessageReaction;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isSelf = widget.message.isSelf ?? true;
@ -846,7 +881,8 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
showCloseButton: ShowCloseButton.none,
touchThroughAreaShape: ClipAreaShape.rectangle,
content: TIMUIKitMessageTooltip(
iSUseDefaultHoverBar: model.chatConfig.isUseMessageHoverBarOnDesktop && widget.customMessageHoverBarOnDesktop == null,
iSUseDefaultHoverBar:
model.chatConfig.isUseMessageHoverBarOnDesktop && widget.customMessageHoverBarOnDesktop == null,
model: model,
groupMemberInfo: widget.groupMemberInfo,
isShowMoreSticker: isShowMoreSticker ?? false,
@ -933,10 +969,12 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
model.repliedMessage = widget.message;
final isSelf = widget.message.isSelf ?? true;
final isGroup = TencentUtils.checkString(widget.message.groupID) != null;
final isAtWhenReply = !isSelf && isGroup && widget.allowAtUserWhenReply && widget.onLongPressForOthersHeadPortrait != null;
final isAtWhenReply =
!isSelf && isGroup && widget.allowAtUserWhenReply && widget.onLongPressForOthersHeadPortrait != null;
/// If replying to a self message, do not add a at tag, only requestFocus.
widget.onLongPressForOthersHeadPortrait!(!isAtWhenReply ? null : widget.message.sender, !isAtWhenReply ? null : widget.message.nickName);
widget.onLongPressForOthersHeadPortrait!(
!isAtWhenReply ? null : widget.message.sender, !isAtWhenReply ? null : widget.message.nickName);
},
),
if ((widget.toolTipsConfig?.showForwardMessage ?? true) && !model.isVoteMessage(widget.message))
@ -989,13 +1027,18 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
_onMsgSendFailIconTap(V2TimMessage message, TUIChatSeparateViewModel model) {
final convID = model.conversationID;
final convType = model.conversationType;
MessageUtils.handleMessageError(model.reSendFailMessage(message: message, convType: convType ?? ConvType.c2c, convID: convID), context);
MessageUtils.handleMessageError(
model.reSendFailMessage(message: message, convType: convType ?? ConvType.c2c, convID: convID), context);
}
Widget renderHoverTipAndReadStatus(TUIChatSeparateViewModel model, bool isSelf, V2TimMessage message, bool isPeerRead, TUITheme theme, bool isDownloadWaiting) {
Widget renderHoverTipAndReadStatus(TUIChatSeparateViewModel model, bool isSelf, V2TimMessage message, bool isPeerRead,
TUITheme theme, bool isDownloadWaiting) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final customHoverBar = widget.customMessageHoverBarOnDesktop != null ? widget.customMessageHoverBarOnDesktop!(message) : null;
final wideHoverTipList = (model.chatConfig.isUseMessageHoverBarOnDesktop && customHoverBar == null) ? getWideMessageHoverControlBar(model, theme) : [];
final customHoverBar =
widget.customMessageHoverBarOnDesktop != null ? widget.customMessageHoverBarOnDesktop!(message) : null;
final wideHoverTipList = (model.chatConfig.isUseMessageHoverBarOnDesktop && customHoverBar == null)
? getWideMessageHoverControlBar(model, theme)
: [];
final lastItemName = wideHoverTipList.isNotEmpty ? wideHoverTipList.last.name : "";
// 1
@ -1011,9 +1054,13 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
if (isDesktopScreen && isShowWideToolTip && customHoverBar == null && !((widget.message.elemType == 6 && isDownloadWaiting)))
if (isDesktopScreen &&
isShowWideToolTip &&
customHoverBar == null &&
!((widget.message.elemType == 6 && isDownloadWaiting)))
Container(
decoration: BoxDecoration(borderRadius: BorderRadius.circular(4), border: Border.all(color: hexToColor("d9dde0"), width: 1)),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4), border: Border.all(color: hexToColor("d9dde0"), width: 1)),
margin: const EdgeInsets.symmetric(horizontal: 4),
child: Row(
children: wideHoverTipList
@ -1046,7 +1093,8 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
),
),
if (isDesktopScreen && isShowWideToolTip && customHoverBar != null) customHoverBar,
if (!isDesktopScreen || (model.chatConfig.isUseMessageHoverBarOnDesktop && customHoverBar == null && !isShowWideToolTip))
if (!isDesktopScreen ||
(model.chatConfig.isUseMessageHoverBarOnDesktop && customHoverBar == null && !isShowWideToolTip))
const SizedBox(
height: 20,
),
@ -1081,7 +1129,8 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
},
),
if (model.chatConfig.isShowReadingStatus &&
isSelf && message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC &&
isSelf &&
message.status == MessageStatus.V2TIM_MSG_STATUS_SEND_SUCC &&
(message.needReadReceipt ?? false) &&
!model.isVoteMessage(widget.message))
TIMUIKitMessageReadReceipt(
@ -1095,7 +1144,8 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final TUIChatSeparateViewModel model = Provider.of<TUIChatSeparateViewModel>(context);
final isDownloadWaiting = context.select<TUIChatGlobalModel, bool>((value) => value.isWaiting(widget.message.msgID ?? ""));
final isDownloadWaiting =
context.select<TUIChatGlobalModel, bool>((value) => value.isWaiting(widget.message.msgID ?? ""));
final TUITheme theme = value.theme;
final message = widget.message;
final msgType = message.elemType;
@ -1139,8 +1189,16 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
}
if (isRevokedMsg) {
final displayName = isAdminRevoke ? TIM_t("管理员") : (isSelf ? TIM_t("") : TencentUtils.checkString(message.nickName) ?? TencentUtils.checkString(message.sender) ?? message.userID);
return isSelf && isRevokeEditable && isRevocable(message.timestamp!) ? _selfRevokeEditMessageBuilder(theme, model) : _revokedMessageBuilder(theme, displayName ?? "");
final displayName = isAdminRevoke
? TIM_t("管理员")
: (isSelf
? TIM_t("")
: TencentUtils.checkString(message.nickName) ??
TencentUtils.checkString(message.sender) ??
message.userID);
return isSelf && isRevokeEditable && isRevocable(message.timestamp!)
? _selfRevokeEditMessageBuilder(theme, model)
: _revokedMessageBuilder(theme, displayName ?? "");
}
// 使
@ -1159,226 +1217,243 @@ class _TIMUIKItHistoryMessageListItemState extends TIMUIKitState<TIMUIKitHistory
}
return VisibilityDetector(
key: Key(message.id ?? message.msgID!),
//
onVisibilityChanged: (visibilityInfo) {
var visiblePercentage = visibilityInfo.visibleFraction * 100;
if (visiblePercentage > 50) {
model.addToMessageReadReceiptList(message);
}
},
child: LayoutBuilder(
builder: (context, constraints) => Container(
padding: EdgeInsets.only(left: isSelf ? 0 : 16, right: isSelf ? 16 : 0),
margin: widget.padding ?? const EdgeInsets.only(bottom: 20),
child: Row(
key: _key,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (model.isMultiSelect)
Container(
margin: EdgeInsets.only(right: 12, top: 10, left: isSelf ? 16 : 0),
child: CheckBoxButton(
isChecked: model.getSelectedMessageList().contains(message),
onChanged: (value) {
model.setMessageItemChecked(message, value);
},
),
key: Key(message.id ?? message.msgID!),
//
onVisibilityChanged: (visibilityInfo) {
var visiblePercentage = visibilityInfo.visibleFraction * 100;
if (visiblePercentage > 50) {
model.addToMessageReadReceiptList(message);
}
},
child: LayoutBuilder(
builder: (context, constraints) => Container(
padding: EdgeInsets.only(left: isSelf ? 0 : 16, right: isSelf ? 16 : 0),
margin: widget.padding ?? const EdgeInsets.only(bottom: 20),
child: Row(
key: _key,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (model.isMultiSelect)
Container(
margin: EdgeInsets.only(right: 12, top: 10, left: isSelf ? 16 : 0),
child: CheckBoxButton(
isChecked: model.getSelectedMessageList().contains(message),
onChanged: (value) {
model.setMessageItemChecked(message, value);
},
),
Expanded(
child: MouseRegion(
onEnter: (_) {
if (isDesktopScreen && model.chatConfig.isUseMessageHoverBarOnDesktop) {
),
Expanded(
child: MouseRegion(
onEnter: (_) {
if (isDesktopScreen && model.chatConfig.isUseMessageHoverBarOnDesktop) {
setState(() {
isShowWideToolTip = true;
});
}
},
onExit: (_) {
if (isDesktopScreen && model.chatConfig.isUseMessageHoverBarOnDesktop) {
Tooltip.dismissAllToolTips();
Future.delayed(const Duration(milliseconds: 100), () {
setState(() {
isShowWideToolTip = true;
isShowWideToolTip = false;
});
});
}
},
child: GestureDetector(
behavior: model.isMultiSelect ? HitTestBehavior.translucent : null,
onTap: () {
if (model.isMultiSelect) {
final checked = model.getSelectedMessageList().contains(message);
model.setMessageItemChecked(message, !checked);
} else {
return;
}
},
onExit: (_) {
if (isDesktopScreen && model.chatConfig.isUseMessageHoverBarOnDesktop) {
Tooltip.dismissAllToolTips();
Future.delayed(const Duration(milliseconds: 100), () {
setState(() {
isShowWideToolTip = false;
});
});
}
},
child: GestureDetector(
behavior: model.isMultiSelect ? HitTestBehavior.translucent : null,
onTap: () {
if (model.isMultiSelect) {
final checked = model.getSelectedMessageList().contains(message);
model.setMessageItemChecked(message, !checked);
} else {
return;
}
},
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: isSelf ? MainAxisAlignment.end : MainAxisAlignment.start,
children: [
if (!isSelf && widget.showAvatar)
GestureDetector(
onLongPress: () {
if (widget.onLongPressForOthersHeadPortrait != null) {}
if (model.chatConfig.isAllowLongPressAvatarToAt) {
widget.onLongPressForOthersHeadPortrait!(message.sender, message.nickName);
}
},
onTapDown: isDesktopScreen
? (details) {
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: isSelf ? MainAxisAlignment.end : MainAxisAlignment.start,
children: [
if (!isSelf && widget.showAvatar)
GestureDetector(
onLongPress: () {
if (widget.onLongPressForOthersHeadPortrait != null) {}
if (model.chatConfig.isAllowLongPressAvatarToAt) {
widget.onLongPressForOthersHeadPortrait!(message.sender, message.nickName);
}
},
onTapDown: isDesktopScreen
? (details) {
if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onTapForOthersPortrait!(message.sender ?? "", details);
}
}
: null,
onTap: isDesktopScreen
? null
: () {
if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onTapForOthersPortrait!(message.sender ?? "", TapDownDetails());
}
},
onSecondaryTap: isDesktopScreen
? null
: () {
if (widget.onSecondaryTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onSecondaryTapForOthersPortrait!(message.sender ?? "", TapDownDetails());
}
},
onSecondaryTapDown: isDesktopScreen
? (details) {
if (widget.onSecondaryTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onSecondaryTapForOthersPortrait!(message.sender ?? "", details);
}
}
: null,
child: widget.userAvatarBuilder != null
? widget.userAvatarBuilder!(context, message)
: Container(
margin: (isSelf && isShowNickNameForSelf) || (!isSelf && isShowNickNameForOthers)
? const EdgeInsets.only(top: 2)
: null,
child: SizedBox(
width: 40,
height: 40,
child: Avatar(
faceUrl: message.faceUrl ?? "",
showName: MessageUtils.getDisplayName(message),
),
),
),
),
if (isSelf && widget.message.elemType == 6 && isDownloadWaiting)
Container(
margin: const EdgeInsets.only(top: 46, right: 10),
child: LoadingAnimationWidget.threeArchedCircle(
color: theme.weakTextColor ?? Colors.grey,
size: 20,
),
),
Container(
margin: widget.showAvatar
? (isSelf ? const EdgeInsets.only(right: 13) : const EdgeInsets.only(left: 13))
: null,
child: Column(
crossAxisAlignment: isSelf ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: [
if ((isSelf && isShowNickNameForSelf) || (!isSelf && isShowNickNameForOthers))
widget.topRowBuilder != null
? widget.topRowBuilder!(context, message)
: Container(
// margin: const EdgeInsets.only(bottom: 4),
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width / 1.7),
child: Text(
MessageUtils.getDisplayName(message),
overflow: TextOverflow.ellipsis,
style: widget.themeData?.nickNameTextStyle ??
TextStyle(fontSize: 12, color: theme.weakTextColor),
),
)),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
if (isSelf)
renderHoverTipAndReadStatus(
model, isSelf, message, isPeerRead, theme, isDownloadWaiting),
Container(
constraints: BoxConstraints(
maxWidth: constraints.maxWidth * 0.77,
),
child: Builder(builder: (context) {
return GestureDetector(
child: IgnorePointer(
ignoring: model.isMultiSelect,
child: _getMessageItemBuilder(message, message.status, model)),
onSecondaryTapDown: (details) {
if (widget.onLongPress != null) {
widget.onLongPress!(context, message);
return;
}
if (!PlatformUtils().isMobile) {
if (widget.allowLongPress) {
_onOpenToolTip(context, message, model, theme, details, false, false);
}
}
},
onLongPress: () {
if (widget.onLongPress != null) {
widget.onLongPress!(context, message);
return;
}
if (widget.allowLongPress && !isDesktopScreen) {
_onOpenToolTip(context, message, model, theme, null, false, false);
}
},
onTapDown: (details) {
_tapDetails = details;
},
);
}),
),
if (!isSelf &&
message.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND &&
message.localCustomInt != null &&
message.localCustomInt != HistoryMessageDartConstant.read)
Padding(
padding: const EdgeInsets.only(left: 5, bottom: 12),
child: Icon(Icons.circle, color: theme.cautionColor, size: 10)),
if (!isSelf)
renderHoverTipAndReadStatus(
model, isSelf, message, isPeerRead, theme, isDownloadWaiting),
],
),
TIMUIKitTextTranslationElem(
message: message,
customEmojiStickerList: widget.customEmojiStickerList,
isFromSelf: message.isSelf ?? true,
isShowJump: false,
clearJump: () {},
chatModel: model),
if (widget.bottomRowBuilder != null) widget.bottomRowBuilder!(context, message)
],
),
),
if (!isSelf && widget.message.elemType == 6 && isDownloadWaiting)
Container(
margin: const EdgeInsets.only(top: 46, left: 10),
child: LoadingAnimationWidget.threeArchedCircle(
color: theme.weakTextColor ?? Colors.grey,
size: 20,
),
),
if (isSelf && widget.showAvatar)
widget.userAvatarBuilder != null
? widget.userAvatarBuilder!(context, message)
: SizedBox(
width: 40,
height: 40,
child: InkWell(
onTapDown: (details) {
if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onTapForOthersPortrait!(message.sender ?? "", details);
}
}
: null,
onTap: isDesktopScreen
? null
: () {
if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onTapForOthersPortrait!(message.sender ?? "", TapDownDetails());
}
},
onSecondaryTap: isDesktopScreen
? null
: () {
if (widget.onSecondaryTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onSecondaryTapForOthersPortrait!(message.sender ?? "", TapDownDetails());
}
},
onSecondaryTapDown: isDesktopScreen
? (details) {
if (widget.onSecondaryTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onSecondaryTapForOthersPortrait!(message.sender ?? "", details);
}
}
: null,
child: widget.userAvatarBuilder != null
? widget.userAvatarBuilder!(context, message)
: Container(
margin: (isSelf && isShowNickNameForSelf) || (!isSelf && isShowNickNameForOthers) ? const EdgeInsets.only(top: 2) : null,
child: SizedBox(
width: 40,
height: 40,
child: Avatar(
faceUrl: message.faceUrl ?? "",
showName: MessageUtils.getDisplayName(message),
),
),
),
),
if (isSelf && widget.message.elemType == 6 && isDownloadWaiting)
Container(
margin: const EdgeInsets.only(top: 46, right: 10),
child: LoadingAnimationWidget.threeArchedCircle(
color: theme.weakTextColor ?? Colors.grey,
size: 20,
),
),
Container(
margin: widget.showAvatar ? (isSelf ? const EdgeInsets.only(right: 13) : const EdgeInsets.only(left: 13)) : null,
child: Column(
crossAxisAlignment: isSelf ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: [
if ((isSelf && isShowNickNameForSelf) || (!isSelf && isShowNickNameForOthers))
widget.topRowBuilder != null
? widget.topRowBuilder!(context, message)
: Container(
// margin: const EdgeInsets.only(bottom: 4),
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width / 1.7),
child: Text(
MessageUtils.getDisplayName(message),
overflow: TextOverflow.ellipsis,
style: widget.themeData?.nickNameTextStyle ?? TextStyle(fontSize: 12, color: theme.weakTextColor),
),
)),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
if (isSelf) renderHoverTipAndReadStatus(model, isSelf, message, isPeerRead, theme, isDownloadWaiting),
Container(
constraints: BoxConstraints(
maxWidth: constraints.maxWidth * 0.77,
),
child: Builder(builder: (context) {
return GestureDetector(
child: IgnorePointer(ignoring: model.isMultiSelect, child: _getMessageItemBuilder(message, message.status, model)),
onSecondaryTapDown: (details) {
if (widget.onLongPress != null) {
widget.onLongPress!(context, message);
return;
}
if (!PlatformUtils().isMobile) {
if (widget.allowLongPress) {
_onOpenToolTip(context, message, model, theme, details, false, false);
}
}
},
onLongPress: () {
if (widget.onLongPress != null) {
widget.onLongPress!(context, message);
return;
}
if (widget.allowLongPress && !isDesktopScreen) {
_onOpenToolTip(context, message, model, theme, null, false, false);
}
},
onTapDown: (details) {
_tapDetails = details;
},
);
}),
),
if (!isSelf && message.elemType == MessageElemType.V2TIM_ELEM_TYPE_SOUND && message.localCustomInt != null && message.localCustomInt != HistoryMessageDartConstant.read)
Padding(padding: const EdgeInsets.only(left: 5, bottom: 12), child: Icon(Icons.circle, color: theme.cautionColor, size: 10)),
if (!isSelf) renderHoverTipAndReadStatus(model, isSelf, message, isPeerRead, theme, isDownloadWaiting),
],
),
TIMUIKitTextTranslationElem(
message: message,
customEmojiStickerList: widget.customEmojiStickerList,
isFromSelf: message.isSelf ?? true,
isShowJump: false,
clearJump: () {},
chatModel: model),
if (widget.bottomRowBuilder != null) widget.bottomRowBuilder!(context, message)
],
),
),
if (!isSelf && widget.message.elemType == 6 && isDownloadWaiting)
Container(
margin: const EdgeInsets.only(top: 46, left: 10),
child: LoadingAnimationWidget.threeArchedCircle(
color: theme.weakTextColor ?? Colors.grey,
size: 20,
),
),
if (isSelf && widget.showAvatar)
widget.userAvatarBuilder != null
? widget.userAvatarBuilder!(context, message)
: SizedBox(
width: 40,
height: 40,
child: InkWell(
onTapDown: (details) {
if (widget.onTapForOthersPortrait != null && widget.allowAvatarTap) {
widget.onTapForOthersPortrait!(message.sender ?? "", details);
}
},
child: Avatar(faceUrl: message.faceUrl ?? "", showName: MessageUtils.getDisplayName(message)),
),
child: Avatar(
faceUrl: message.faceUrl ?? "", showName: MessageUtils.getDisplayName(message)),
),
],
),
),
],
),
),
),
],
),
),
],
),
),
),
);
}

View File

@ -11,8 +11,10 @@ import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
@ -45,8 +47,7 @@ class TIMUIKitMessageTooltip extends StatefulWidget {
final bool allowAtUserWhenReply;
/// the callback for long press event, except myself avatar
final Function(String? userId, String? nickName)?
onLongPressForOthersHeadPortrait;
final Function(String? userId, String? nickName)? onLongPressForOthersHeadPortrait;
final bool isUseMessageReaction;
@ -87,11 +88,9 @@ class TIMUIKitMessageTooltip extends StatefulWidget {
State<StatefulWidget> createState() => TIMUIKitMessageTooltipState();
}
class TIMUIKitMessageTooltipState
extends TIMUIKitState<TIMUIKitMessageTooltip> {
class TIMUIKitMessageTooltipState extends TIMUIKitState<TIMUIKitMessageTooltip> {
final TUIChatGlobalModel globalModal = serviceLocator<TUIChatGlobalModel>();
final TUISelfInfoViewModel selfInfoViewModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
bool isShowMoreSticker = false;
bool fileBeenDownloaded = false;
String filePath = "";
@ -105,9 +104,7 @@ class TIMUIKitMessageTooltipState
hasFile() {
if (PlatformUtils().isMobile ||
(widget.message.fileElem == null &&
widget.message.imageElem == null &&
widget.message.videoElem == null)) {
(widget.message.fileElem == null && widget.message.imageElem == null && widget.message.videoElem == null)) {
fileBeenDownloaded = false;
return;
}
@ -117,8 +114,7 @@ class TIMUIKitMessageTooltipState
}
if (PlatformUtils().isDesktop) {
if (widget.message.fileElem != null) {
String savePath = TencentUtils.checkString(
globalModal.getFileMessageLocation(widget.message.msgID)) ??
String savePath = TencentUtils.checkString(globalModal.getFileMessageLocation(widget.message.msgID)) ??
TencentUtils.checkString(widget.message.fileElem!.localUrl) ??
widget.message.fileElem?.path ??
"";
@ -129,17 +125,13 @@ class TIMUIKitMessageTooltipState
return;
}
} else if (widget.message.imageElem != null) {
if (TencentUtils.checkString(
widget.message.imageElem!.imageList![0]!.localUrl) !=
null &&
File(widget.message.imageElem!.imageList![0]!.localUrl!)
.existsSync()) {
if (TencentUtils.checkString(widget.message.imageElem!.imageList![0]!.localUrl) != null &&
File(widget.message.imageElem!.imageList![0]!.localUrl!).existsSync()) {
fileBeenDownloaded = true;
return;
}
} else if (widget.message.videoElem != null) {
if (TencentUtils.checkString(widget.message.videoElem!.localVideoUrl) !=
null &&
if (TencentUtils.checkString(widget.message.videoElem!.localVideoUrl) != null &&
File(widget.message.videoElem!.localVideoUrl!).existsSync()) {
fileBeenDownloaded = true;
return;
@ -150,8 +142,7 @@ class TIMUIKitMessageTooltipState
}
bool isRevocable(int timestamp, int upperTimeLimit) =>
((DateTime.now().millisecondsSinceEpoch / 1000).ceil() - timestamp <
upperTimeLimit) &&
((DateTime.now().millisecondsSinceEpoch / 1000).ceil() - timestamp < upperTimeLimit) &&
(widget.message.isSelf ?? true);
Widget ItemInkWell({
@ -173,8 +164,7 @@ class TIMUIKitMessageTooltipState
bool isAdminCanRecall() {
if (widget.model.chatConfig.isGroupAdminRecallEnabled) {
final selfMemberInfo =
widget.groupMemberInfo ?? widget.model.selfMemberInfo;
final selfMemberInfo = widget.groupMemberInfo ?? widget.model.selfMemberInfo;
final selfRole = selfMemberInfo?.role;
return selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN ||
selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER;
@ -183,36 +173,28 @@ class TIMUIKitMessageTooltipState
}
}
_buildLongPressTipItem(
TUITheme theme, TUIChatSeparateViewModel model, V2TimMessage message) {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isCanRevokeSelf = isRevocable(
widget.message.timestamp!, model.chatConfig.upperRecallTime);
final shouldShowRevokeAction = (isCanRevokeSelf || isAdminCanRecall()) &&
widget.message.status != MessageStatus.V2TIM_MSG_STATUS_SEND_FAIL;
final shouldShowReplyAction = !(widget.message.customElem?.data != null &&
MessageUtils.isCallingData(widget.message.customElem!.data!));
final shouldShowForwardAction = !(widget.message.customElem?.data != null &&
MessageUtils.isCallingData(widget.message.customElem!.data!));
_buildLongPressTipItem(TUITheme theme, TUIChatSeparateViewModel model, V2TimMessage message) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isCanRevokeSelf = isRevocable(widget.message.timestamp!, model.chatConfig.upperRecallTime);
final shouldShowRevokeAction =
(isCanRevokeSelf || isAdminCanRecall()) && widget.message.status != MessageStatus.V2TIM_MSG_STATUS_SEND_FAIL;
final shouldShowReplyAction =
!(widget.message.customElem?.data != null && MessageUtils.isCallingData(widget.message.customElem!.data!));
final shouldShowForwardAction =
!(widget.message.customElem?.data != null && MessageUtils.isCallingData(widget.message.customElem!.data!));
final tooltipsConfig = widget.toolTipsConfig;
final messageCanCopy = widget.message.elemType ==
MessageElemType.V2TIM_ELEM_TYPE_TEXT ||
(isDesktopScreen &&
widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE &&
fileBeenDownloaded);
final messageCanCopy = widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT ||
(isDesktopScreen && widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE && fileBeenDownloaded);
bool showTranslation = true;
if (widget.message.localCustomData != null) {
final LocalCustomDataModel localCustomData = LocalCustomDataModel.fromMap(
json.decode(TencentUtils.checkString(widget.message.localCustomData) ?? "{}"));
final LocalCustomDataModel localCustomData =
LocalCustomDataModel.fromMap(json.decode(TencentUtils.checkString(widget.message.localCustomData) ?? "{}"));
if (localCustomData.translatedText != null && localCustomData.translatedText != "") {
showTranslation = false;
}
}
final dynamicQuote =
model.chatConfig.isAtWhenReplyDynamic?.call(widget.message);
final dynamicQuote = model.chatConfig.isAtWhenReplyDynamic?.call(widget.message);
final List<MessageToolTipItem> defaultTipsList = [
if (fileBeenDownloaded)
@ -241,8 +223,7 @@ class TIMUIKitMessageTooltipState
onClick: () => _onTap("forwardMessage", model)),
if (shouldShowReplyAction)
MessageToolTipItem(
label: TIM_t(
(dynamicQuote ?? model.chatConfig.isAtWhenReply) ? "回复" : "引用"),
label: TIM_t((dynamicQuote ?? model.chatConfig.isAtWhenReply) ? "回复" : "引用"),
id: "replyMessage",
iconImageAsset: "images/reply_message.png",
onClick: () => _onTap("replyMessage", model)),
@ -278,12 +259,10 @@ class TIMUIKitMessageTooltipState
return tooltipsConfig.showCopyMessage;
}
if (type == "forwardMessage") {
return tooltipsConfig.showForwardMessage &&
!(isDesktopScreen && widget.iSUseDefaultHoverBar);
return tooltipsConfig.showForwardMessage && !(isDesktopScreen && widget.iSUseDefaultHoverBar);
}
if (type == "replyMessage") {
return tooltipsConfig.showReplyMessage &&
!(isDesktopScreen && widget.iSUseDefaultHoverBar);
return tooltipsConfig.showReplyMessage && !(isDesktopScreen && widget.iSUseDefaultHoverBar);
}
if (type == "delete") {
return (!PlatformUtils().isWeb) && tooltipsConfig.showDeleteMessage;
@ -296,18 +275,15 @@ class TIMUIKitMessageTooltipState
return tooltipsConfig.showRecallMessage;
}
if (type == "translate") {
return tooltipsConfig.showTranslation &&
widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT;
return tooltipsConfig.showTranslation && widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT;
}
return true;
}).toList();
}
final List<MessageToolTipItem>? customList =
widget.toolTipsConfig?.additionalMessageToolTips != null
? (widget.toolTipsConfig?.additionalMessageToolTips!(
message, widget.onCloseTooltip))
: [];
final List<MessageToolTipItem>? customList = widget.toolTipsConfig?.additionalMessageToolTips != null
? (widget.toolTipsConfig?.additionalMessageToolTips!(message, widget.onCloseTooltip))
: [];
List<MessageToolTipItem> formattedTipsList = [
...defaultFormattedTipsList,
@ -331,9 +307,7 @@ class TIMUIKitMessageTooltipState
children: [
Image.asset(
item.iconImageAsset,
package: defaultTipsIds.contains(item.id)
? 'tencent_cloud_chat_uikit'
: null,
package: defaultTipsIds.contains(item.id) ? 'tencent_cloud_chat_uikit' : null,
width: 20,
height: 20,
),
@ -370,9 +344,7 @@ class TIMUIKitMessageTooltipState
children: [
Image.asset(
item.iconImageAsset,
package: defaultTipsIds.contains(item.id)
? 'tencent_cloud_chat_uikit'
: null,
package: defaultTipsIds.contains(item.id) ? 'tencent_cloud_chat_uikit' : null,
width: 20,
height: 20,
),
@ -419,19 +391,16 @@ class TIMUIKitMessageTooltipState
switch (operation) {
case "open":
if (widget.message.fileElem != null) {
_onOpenDesktop(TencentUtils.checkString(
globalModal.getFileMessageLocation(widget.message.msgID)) ??
_onOpenDesktop(TencentUtils.checkString(globalModal.getFileMessageLocation(widget.message.msgID)) ??
TencentUtils.checkString(widget.message.fileElem!.localUrl) ??
widget.message.fileElem?.path ??
"");
} else if (widget.message.imageElem != null) {
_onOpenDesktop(TencentUtils.checkString(
widget.message.imageElem!.imageList?[0]?.localUrl) ??
_onOpenDesktop(TencentUtils.checkString(widget.message.imageElem!.imageList?[0]?.localUrl) ??
TencentUtils.checkString(widget.message.imageElem?.path) ??
"");
} else if (widget.message.videoElem != null) {
_onOpenDesktop(TencentUtils.checkString(
widget.message.videoElem!.localVideoUrl) ??
_onOpenDesktop(TencentUtils.checkString(widget.message.videoElem!.localVideoUrl) ??
TencentUtils.checkString(widget.message.videoElem?.videoPath) ??
"");
}
@ -439,19 +408,16 @@ class TIMUIKitMessageTooltipState
case "finder":
String savePath = "";
if (widget.message.fileElem != null) {
savePath = (TencentUtils.checkString(
globalModal.getFileMessageLocation(widget.message.msgID)) ??
savePath = (TencentUtils.checkString(globalModal.getFileMessageLocation(widget.message.msgID)) ??
TencentUtils.checkString(widget.message.fileElem!.localUrl) ??
widget.message.fileElem?.path ??
"");
} else if (widget.message.imageElem != null) {
savePath = (TencentUtils.checkString(
widget.message.imageElem!.imageList?[0]?.localUrl) ??
savePath = (TencentUtils.checkString(widget.message.imageElem!.imageList?[0]?.localUrl) ??
TencentUtils.checkString(widget.message.imageElem?.path) ??
"");
} else if (widget.message.videoElem != null) {
savePath = (TencentUtils.checkString(
widget.message.videoElem!.localVideoUrl) ??
savePath = (TencentUtils.checkString(widget.message.videoElem!.localVideoUrl) ??
TencentUtils.checkString(widget.message.videoElem?.videoPath) ??
"");
}
@ -462,10 +428,7 @@ class TIMUIKitMessageTooltipState
model.deleteMsg(msgID, webMessageInstance: messageItem.messageFromWeb);
break;
case "revoke":
model.revokeMsg(
msgID,
!isRevocable(
widget.message.timestamp!, model.chatConfig.upperRecallTime),
model.revokeMsg(msgID, !isRevocable(widget.message.timestamp!, model.chatConfig.upperRecallTime),
messageItem.messageFromWeb);
break;
case 'translate':
@ -488,23 +451,17 @@ class TIMUIKitMessageTooltipState
case "copyMessage":
if (widget.message.elemType == MessageElemType.V2TIM_ELEM_TYPE_TEXT) {
try {
await Clipboard.setData(
ClipboardData(text: widget.message.textElem?.text ?? ""));
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("已复制"),
infoCode: 6660408));
await Clipboard.setData(ClipboardData(text: widget.message.textElem?.text ?? ""));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("已复制"), infoCode: 6660408));
// ignore: empty_catches
} catch (e) {}
}
break;
case "replyMessage":
model.repliedMessage = widget.message;
final dynamicQuote =
model.chatConfig.isAtWhenReplyDynamic?.call(widget.message);
final dynamicQuote = model.chatConfig.isAtWhenReplyDynamic?.call(widget.message);
final isSelf = widget.message.isSelf ?? true;
final isGroup =
TencentUtils.checkString(widget.message.groupID) != null;
final isGroup = TencentUtils.checkString(widget.message.groupID) != null;
final isAtWhenReply = !isSelf &&
isGroup &&
(dynamicQuote ?? widget.allowAtUserWhenReply) &&
@ -512,14 +469,10 @@ class TIMUIKitMessageTooltipState
/// If replying to a self message, do not add a at tag, only requestFocus.
widget.onLongPressForOthersHeadPortrait!(
!isAtWhenReply ? null : widget.message.sender,
!isAtWhenReply ? null : widget.message.nickName);
!isAtWhenReply ? null : widget.message.sender, !isAtWhenReply ? null : widget.message.nickName);
break;
default:
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("暂未实现"),
infoCode: 6660409));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("暂未实现"), infoCode: 6660409));
}
widget.onCloseTooltip();
}
@ -527,20 +480,17 @@ class TIMUIKitMessageTooltipState
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final TUITheme theme = value.theme;
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: widget.model),
],
builder: (BuildContext context, Widget? w) {
final TUIChatSeparateViewModel model =
Provider.of<TUIChatSeparateViewModel>(context);
final bool haveExtraTipsConfig = widget.toolTipsConfig != null &&
widget.toolTipsConfig?.additionalItemBuilder != null;
final TUIChatSeparateViewModel model = Provider.of<TUIChatSeparateViewModel>(context);
final bool haveExtraTipsConfig =
widget.toolTipsConfig != null && widget.toolTipsConfig?.additionalItemBuilder != null;
Widget? extraTipsActionItem = haveExtraTipsConfig
? widget.toolTipsConfig!.additionalItemBuilder!(
widget.message, widget.onCloseTooltip, null, context)
? widget.toolTipsConfig!.additionalItemBuilder!(widget.message, widget.onCloseTooltip, null, context)
: null;
final message = widget.message;
return Container(
@ -563,8 +513,7 @@ class TIMUIKitMessageTooltipState
)
: null,
color: isDesktopScreen ? null : Colors.white,
padding: EdgeInsets.symmetric(
horizontal: 8, vertical: isDesktopScreen ? 8 : 4),
padding: EdgeInsets.symmetric(horizontal: 8, vertical: isDesktopScreen ? 8 : 4),
child: ConstrainedBox(
constraints: BoxConstraints(
maxWidth: min(MediaQuery.of(context).size.width * 0.75, 350),
@ -574,8 +523,7 @@ class TIMUIKitMessageTooltipState
children: [
if ((!isDesktopScreen || widget.isShowMoreSticker) &&
widget.isUseMessageReaction &&
widget.selectEmojiPanelPosition ==
SelectEmojiPanelPosition.up)
widget.selectEmojiPanelPosition == SelectEmojiPanelPosition.up)
TIMUIKitMessageReactionEmojiSelectPanel(
isShowMoreSticker: isShowMoreSticker,
onSelect: (int value) => widget.onSelectSticker(value),
@ -587,8 +535,7 @@ class TIMUIKitMessageTooltipState
),
if (!isDesktopScreen &&
widget.isUseMessageReaction &&
widget.selectEmojiPanelPosition ==
SelectEmojiPanelPosition.up &&
widget.selectEmojiPanelPosition == SelectEmojiPanelPosition.up &&
isShowMoreSticker == false)
Container(
margin: const EdgeInsets.symmetric(vertical: 6),
@ -605,40 +552,31 @@ class TIMUIKitMessageTooltipState
Expanded(
child: Wrap(
direction: Axis.horizontal,
alignment:
TUIKitScreenUtils.getFormFactor(context) ==
DeviceType.Mobile
? WrapAlignment.start
: WrapAlignment.start,
alignment: TUIKitScreenUtils.getFormFactor(context) == DeviceType.Mobile
? WrapAlignment.start
: WrapAlignment.start,
spacing: 12,
runSpacing: 8,
children: [
..._buildLongPressTipItem(theme, model, message),
if (extraTipsActionItem != null)
extraTipsActionItem
if (extraTipsActionItem != null) extraTipsActionItem
],
)),
if (!isDesktopScreen && !widget.isUseMessageReaction)
ConstrainedBox(
constraints: BoxConstraints(
maxWidth: min(
MediaQuery.of(context).size.width * 0.75,
350),
maxWidth: min(MediaQuery.of(context).size.width * 0.75, 350),
),
child: Wrap(
direction: Axis.horizontal,
alignment:
TUIKitScreenUtils.getFormFactor(context) ==
DeviceType.Mobile
? WrapAlignment.spaceBetween
: WrapAlignment.start,
alignment: TUIKitScreenUtils.getFormFactor(context) == DeviceType.Mobile
? WrapAlignment.spaceBetween
: WrapAlignment.start,
spacing: 4,
runSpacing: 8,
children: [
..._buildLongPressTipItem(
theme, model, message),
if (extraTipsActionItem != null)
extraTipsActionItem
..._buildLongPressTipItem(theme, model, message),
if (extraTipsActionItem != null) extraTipsActionItem
],
),
),
@ -646,15 +584,13 @@ class TIMUIKitMessageTooltipState
Table(columnWidths: const <int, TableColumnWidth>{
0: IntrinsicColumnWidth(),
}, children: <TableRow>[
..._buildLongPressTipItem(theme, model, message)
.map((e) => TableRow(children: <Widget>[e]))
..._buildLongPressTipItem(theme, model, message).map((e) => TableRow(children: <Widget>[e]))
])
],
),
if (!isDesktopScreen &&
widget.isUseMessageReaction &&
widget.selectEmojiPanelPosition ==
SelectEmojiPanelPosition.down &&
widget.selectEmojiPanelPosition == SelectEmojiPanelPosition.down &&
isShowMoreSticker == false)
Container(
margin: const EdgeInsets.symmetric(vertical: 6),
@ -665,8 +601,7 @@ class TIMUIKitMessageTooltipState
color: Colors.black12)),
if ((!isDesktopScreen || widget.isShowMoreSticker) &&
widget.isUseMessageReaction &&
widget.selectEmojiPanelPosition ==
SelectEmojiPanelPosition.down)
widget.selectEmojiPanelPosition == SelectEmojiPanelPosition.down)
TIMUIKitMessageReactionEmojiSelectPanel(
isShowMoreSticker: isShowMoreSticker,
onSelect: (int value) => widget.onSelectSticker(value),

View File

@ -4,10 +4,14 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_at_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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_text_field_controller.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -31,8 +35,7 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget {
final Widget Function(BuildContext, V2TimMessage?)? itemBuilder;
final AutoScrollController? scrollController;
final String conversationID;
final Function(String? userId, String? nickName)?
onLongPressForOthersHeadPortrait;
final Function(String? userId, String? nickName)? onLongPressForOthersHeadPortrait;
final List<V2TimGroupAtInfo?>? groupAtInfoList;
final V2TimMessage? initFindingMsg;
@ -43,14 +46,13 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget {
final TIMUIKitInputTextFieldController? textFieldController;
/// the builder for avatar
final Widget Function(BuildContext context, V2TimMessage message)?
userAvatarBuilder;
final Widget Function(BuildContext context, V2TimMessage message)? userAvatarBuilder;
/// the builder for tongue
final TongueItemBuilder? tongueItemBuilder;
final Widget? Function(V2TimMessage message, Function() closeTooltip,
[Key? key, BuildContext? context])? extraTipsActionItemBuilder;
final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])?
extraTipsActionItemBuilder;
/// conversation type
final ConvType conversationType;
@ -59,8 +61,7 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget {
final void Function(String userID, TapDownDetails tapDetails)? onTapAvatar;
/// Avatar and name in message reaction secondary tap callback.
final void Function(String userID, TapDownDetails tapDetails)?
onSecondaryTapAvatar;
final void Function(String userID, TapDownDetails tapDetails)? onSecondaryTapAvatar;
@Deprecated(
"Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
@ -114,37 +115,32 @@ class TIMUIKitHistoryMessageListContainer extends StatefulWidget {
}) : super(key: key);
@override
State<StatefulWidget> createState() =>
_TIMUIKitHistoryMessageListContainerState();
State<StatefulWidget> createState() => _TIMUIKitHistoryMessageListContainerState();
}
class _TIMUIKitHistoryMessageListContainerState
extends TIMUIKitState<TIMUIKitHistoryMessageListContainer> {
class _TIMUIKitHistoryMessageListContainerState extends TIMUIKitState<TIMUIKitHistoryMessageListContainer> {
late TIMUIKitHistoryMessageListController _historyMessageListController;
List<V2TimMessage?> historyMessageList = [];
Future<bool> requestForData(String? lastMsgID, LoadDirection direction,
TUIChatSeparateViewModel model,
Future<bool> requestForData(String? lastMsgID, LoadDirection direction, TUIChatSeparateViewModel model,
[int? count, int? lastSeq]) async {
if ((direction == LoadDirection.previous) ||
(direction == LoadDirection.latest && model.haveMoreLatestData)) {
if ((direction == LoadDirection.previous) || (direction == LoadDirection.latest && model.haveMoreLatestData)) {
return await model.loadChatRecord(
direction: direction,
count: count ?? (kIsWeb ? 15 : HistoryMessageDartConstant.getCount),
lastMsgID: lastMsgID,
lastMsgSeq: lastSeq ?? -1,);
direction: direction,
count: count ?? (kIsWeb ? 15 : HistoryMessageDartConstant.getCount),
lastMsgID: lastMsgID,
lastMsgSeq: lastSeq ?? -1,
);
} else {
return false;
}
}
Widget Function(BuildContext, V2TimMessage)? _getTopRowBuilder(
TUIChatSeparateViewModel model) {
Widget Function(BuildContext, V2TimMessage)? _getTopRowBuilder(TUIChatSeparateViewModel model) {
if (widget.messageItemBuilder?.messageNickNameBuilder != null) {
return (BuildContext context, V2TimMessage message) {
return widget.messageItemBuilder!.messageNickNameBuilder!(
context, message, model);
return widget.messageItemBuilder!.messageNickNameBuilder!(context, message, model);
};
}
return null;
@ -153,15 +149,13 @@ class _TIMUIKitHistoryMessageListContainerState
@override
void initState() {
super.initState();
_historyMessageListController = TIMUIKitHistoryMessageListController(
scrollController: widget.scrollController);
_historyMessageListController = TIMUIKitHistoryMessageListController(scrollController: widget.scrollController);
}
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final chatConfig = Provider.of<TIMUIKitChatConfig>(context);
final TUIChatSeparateViewModel model =
Provider.of<TUIChatSeparateViewModel>(context, listen: false);
final TUIChatSeparateViewModel model = Provider.of<TUIChatSeparateViewModel>(context, listen: false);
return TIMUIKitHistoryMessageListSelector(
conversationID: model.conversationID,
@ -175,27 +169,22 @@ class _TIMUIKitHistoryMessageListContainerState
mainHistoryListConfig: widget.mainHistoryListConfig,
itemBuilder: (context, message) {
return TIMUIKitHistoryMessageListItem(
customMessageHoverBarOnDesktop:
widget.customMessageHoverBarOnDesktop,
customMessageHoverBarOnDesktop: widget.customMessageHoverBarOnDesktop,
groupMemberInfo: widget.groupMemberInfo,
textFieldController: widget.textFieldController,
userAvatarBuilder: widget.userAvatarBuilder,
customEmojiStickerList: widget.customEmojiStickerList,
topRowBuilder: _getTopRowBuilder(model),
onScrollToIndex: _historyMessageListController.scrollToIndex,
onScrollToIndexBegin:
_historyMessageListController.scrollToIndexBegin,
toolTipsConfig: widget.toolTipsConfig ??
ToolTipsConfig(
additionalItemBuilder:
widget.extraTipsActionItemBuilder),
onScrollToIndexBegin: _historyMessageListController.scrollToIndexBegin,
toolTipsConfig:
widget.toolTipsConfig ?? ToolTipsConfig(additionalItemBuilder: widget.extraTipsActionItemBuilder),
message: message!,
showAvatar: chatConfig.isShowAvatar,
onSecondaryTapForOthersPortrait: widget.onSecondaryTapAvatar,
onTapForOthersPortrait: widget.onTapAvatar,
messageItemBuilder: widget.messageItemBuilder,
onLongPressForOthersHeadPortrait:
widget.onLongPressForOthersHeadPortrait,
onLongPressForOthersHeadPortrait: widget.onLongPressForOthersHeadPortrait,
allowAtUserWhenReply: chatConfig.isAtWhenReply,
allowAvatarTap: chatConfig.isAllowClickAvatar,
allowLongPress: chatConfig.isAllowLongPressMessage,

View File

@ -1,8 +1,10 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
@ -17,9 +19,7 @@ class TIMUIKitMessageReadReceipt extends TIMUIKitStatelessWidget {
final V2TimMessage messageItem;
final void Function(String, TapDownDetails tapDetails)? onTapAvatar;
TIMUIKitMessageReadReceipt(
{Key? key, this.onTapAvatar, required this.messageItem})
: super(key: key);
TIMUIKitMessageReadReceipt({Key? key, this.onTapAvatar, required this.messageItem}) : super(key: key);
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
@ -47,7 +47,7 @@ class TIMUIKitMessageReadReceipt extends TIMUIKitStatelessWidget {
behavior: HitTestBehavior.opaque,
onTap: () {
if ((value?.readCount ?? 0) > 0) {
if(isDesktopScreen){
if (isDesktopScreen) {
TUIKitWidePopup.showPopupWindow(
operationKey: TUIKitWideModalOperationKey.messageReadDetails,
context: context,
@ -59,8 +59,7 @@ class TIMUIKitMessageReadReceipt extends TIMUIKitStatelessWidget {
onTapAvatar: onTapAvatar,
messageItem: messageItem,
unreadCount: value?.unreadCount ?? 0,
readCount: value?.readCount ?? 0)
);
readCount: value?.readCount ?? 0));
} else {
if (value?.unreadCount == 0) {
return;
@ -78,8 +77,7 @@ class TIMUIKitMessageReadReceipt extends TIMUIKitStatelessWidget {
}
},
child: Container(
padding: EdgeInsets.only(
bottom: 3, right: 6, left: 6, top: isDesktopScreen ? 2 : 6),
padding: EdgeInsets.only(bottom: 3, right: 6, left: 6, top: isDesktopScreen ? 2 : 6),
child: ((value?.unreadCount ?? 0) == 0 && (value?.readCount ?? 0) > 0)
? Icon(
Icons.check_circle_outline,
@ -94,15 +92,12 @@ class TIMUIKitMessageReadReceipt extends TIMUIKitStatelessWidget {
shape: BoxShape.circle,
border: Border.all(
width: 1.3,
color: (value?.readCount ?? 0) > 0
? theme.primaryColor!
: theme.weakTextColor!)),
color: (value?.readCount ?? 0) > 0 ? theme.primaryColor! : theme.weakTextColor!)),
child: (value?.readCount ?? 0) > 0
? Text(
'${value?.readCount ?? 0}',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 8, color: theme.primaryColor),
style: TextStyle(fontSize: 8, color: theme.primaryColor),
)
: null,
),

View File

@ -1,8 +1,8 @@
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
class TIMUIKitChatUtils {
static String? getMessageIDWithinIndex(
List<V2TimMessage?> messageList, int index) {
static String? getMessageIDWithinIndex(List<V2TimMessage?> messageList, int index) {
if (messageList[index]!.elemType == 11) {
if (index > 0) {
return getMessageIDWithinIndex(messageList, index - 1);

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_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_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart';
@ -36,28 +37,21 @@ class TIMUIKitMessageReactionDetail extends StatefulWidget {
State<StatefulWidget> createState() => TIMUIKitMessageReactionDetailState();
}
class TIMUIKitMessageReactionDetailState
extends TIMUIKitState<TIMUIKitMessageReactionDetail>
class TIMUIKitMessageReactionDetailState extends TIMUIKitState<TIMUIKitMessageReactionDetail>
with TickerProviderStateMixin {
final TUISelfInfoViewModel selfInfoModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel selfInfoModel = serviceLocator<TUISelfInfoViewModel>();
Widget getUserItem(
String userID, TUITheme theme, Function(String userID, TapDownDetails tapDetails)? onTapAvatar) {
Widget getUserItem(String userID, TUITheme theme, Function(String userID, TapDownDetails tapDetails)? onTapAvatar) {
V2TimGroupMemberFullInfo? memberInfo;
String showName = userID;
try {
memberInfo =
widget.memberList?.firstWhere((element) => element?.userID == userID);
memberInfo = widget.memberList?.firstWhere((element) => element?.userID == userID);
if (memberInfo != null) {
if (memberInfo.friendRemark != null &&
memberInfo.friendRemark!.isNotEmpty) {
if (memberInfo.friendRemark != null && memberInfo.friendRemark!.isNotEmpty) {
showName = memberInfo.friendRemark!;
} else if (memberInfo.nameCard != null &&
memberInfo.nameCard!.isNotEmpty) {
} else if (memberInfo.nameCard != null && memberInfo.nameCard!.isNotEmpty) {
showName = memberInfo.nameCard!;
} else if (memberInfo.nickName != null &&
memberInfo.nickName!.isNotEmpty) {
} else if (memberInfo.nickName != null && memberInfo.nickName!.isNotEmpty) {
showName = memberInfo.nickName!;
} else {
showName = memberInfo.userID;
@ -77,10 +71,7 @@ class TIMUIKitMessageReactionDetailState
},
child: Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: theme.weakDividerColor ??
CommonColor.weakDividerColor))),
border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(
children: [
Container(
@ -168,14 +159,12 @@ class TIMUIKitMessageReactionDetailState
labelColor: theme.primaryColor,
labelStyle: const TextStyle(fontWeight: FontWeight.bold),
unselectedLabelColor: hexToColor("62626b"),
unselectedLabelStyle:
const TextStyle(fontWeight: FontWeight.normal),
unselectedLabelStyle: const TextStyle(fontWeight: FontWeight.normal),
indicatorSize: TabBarIndicatorSize.label,
indicatorColor: theme.primaryColor ?? hexToColor("62626b"),
tabs: [
...widget.stickerList.map((element) {
return stickerItem(element,
widget.messageReaction[element.toString()].length);
return stickerItem(element, widget.messageReaction[element.toString()].length);
})
],
),
@ -183,8 +172,7 @@ class TIMUIKitMessageReactionDetailState
Expanded(
child: TabBarView(
children: widget.stickerList
.map((int sticker) => getStickerNameList(
sticker, theme, widget.onTapAvatar))
.map((int sticker) => getStickerNameList(sticker, theme, widget.onTapAvatar))
.toList()))
],
),

View File

@ -4,10 +4,14 @@ import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
@ -45,8 +49,7 @@ class TIMUIKitMessageReactionShowItem extends TIMUIKitStatelessWidget {
Key? key})
: super(key: key);
final TUISelfInfoViewModel selfInfoModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel selfInfoModel = serviceLocator<TUISelfInfoViewModel>();
final MessageService _messageService = serviceLocator<MessageService>();
clickOnCurrentSticker() async {
@ -68,22 +71,21 @@ class TIMUIKitMessageReactionShowItem extends TIMUIKitStatelessWidget {
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme;
final option1 = nameList.length;
final TUIChatSeparateViewModel model =
Provider.of<TUIChatSeparateViewModel>(context);
final TUIChatSeparateViewModel model = Provider.of<TUIChatSeparateViewModel>(context);
final List<String> userIDs = [];
for (final user in nameList) {
final V2TimGroupMemberFullInfo? memberInfo = memberList
.firstWhereOrNull((element) => element?.userID == user && TencentUtils.checkString(user) != null);
if((memberInfo == null || TencentUtils.checkString(memberInfo.userID) == null) && TencentUtils.checkString(user.toString()) != null){
final V2TimGroupMemberFullInfo? memberInfo =
memberList.firstWhereOrNull((element) => element?.userID == user && TencentUtils.checkString(user) != null);
if ((memberInfo == null || TencentUtils.checkString(memberInfo.userID) == null) &&
TencentUtils.checkString(user.toString()) != null) {
userIDs.add(user.toString());
}
}
if(userIDs.isNotEmpty){
if (userIDs.isNotEmpty) {
model.getUserShowName(userIDs);
}
return LayoutBuilder(builder: (context, constraints) {
return Container(
padding: const EdgeInsets.only(
@ -101,14 +103,11 @@ class TIMUIKitMessageReactionShowItem extends TIMUIKitStatelessWidget {
InkWell(
onTap: clickOnCurrentSticker,
child: Container(
margin: EdgeInsets.only(
bottom: (!PlatformUtils().isIOS) ? 4 : 2,
top: (!PlatformUtils().isIOS) ? 4 : 0),
margin:
EdgeInsets.only(bottom: (!PlatformUtils().isIOS) ? 4 : 2, top: (!PlatformUtils().isIOS) ? 4 : 0),
child: Text(
String.fromCharCode(sticker),
style: TextStyle(
fontSize: (!PlatformUtils().isIOS) ? 12 : 16,
color: hexToColor("f9453d")),
style: TextStyle(fontSize: (!PlatformUtils().isIOS) ? 12 : 16, color: hexToColor("f9453d")),
),
),
),
@ -135,8 +134,7 @@ class TIMUIKitMessageReactionShowItem extends TIMUIKitStatelessWidget {
onShowDetail(sticker);
},
child: Text(
TIM_t_para("...共{{option1}}人", "...共$option1人")(
option1: option1),
TIM_t_para("...共{{option1}}人", "...共$option1人")(option1: option1),
style: TextStyle(fontSize: 12, color: hexToColor("616669")),
),
),
@ -145,36 +143,33 @@ class TIMUIKitMessageReactionShowItem extends TIMUIKitStatelessWidget {
String showName = e;
if (memberList.isNotEmpty) {
try {
final V2TimGroupMemberFullInfo? memberInfo = memberList
.firstWhere((element) => element?.userID == e);
final V2TimGroupMemberFullInfo? memberInfo =
memberList.firstWhere((element) => element?.userID == e);
if (memberInfo != null) {
if (memberInfo.friendRemark != null &&
memberInfo.friendRemark!.isNotEmpty) {
if (memberInfo.friendRemark != null && memberInfo.friendRemark!.isNotEmpty) {
showName = memberInfo.friendRemark!;
} else if (memberInfo.nameCard != null &&
memberInfo.nameCard!.isNotEmpty) {
} else if (memberInfo.nameCard != null && memberInfo.nameCard!.isNotEmpty) {
showName = memberInfo.nameCard!;
} else if (memberInfo.nickName != null &&
memberInfo.nickName!.isNotEmpty) {
} else if (memberInfo.nickName != null && memberInfo.nickName!.isNotEmpty) {
showName = memberInfo.nickName!;
} else {
showName = memberInfo.userID;
}
}else{
} else {
final String? data = model.groupUserShowName[e];
if(TencentUtils.checkString(data) != null){
if (TencentUtils.checkString(data) != null) {
showName = data ?? e;
}
}
} catch (error) {
final String? data = model.groupUserShowName[e];
if(TencentUtils.checkString(data) != null){
if (TencentUtils.checkString(data) != null) {
showName = data ?? e;
}
}
}else{
} else {
final String? data = model.groupUserShowName[e];
if(TencentUtils.checkString(data) != null){
if (TencentUtils.checkString(data) != null) {
showName = data ?? e;
}
}
@ -188,8 +183,7 @@ class TIMUIKitMessageReactionShowItem extends TIMUIKitStatelessWidget {
},
child: Text(
showName,
style: TextStyle(
fontSize: 12, color: hexToColor("616669")),
style: TextStyle(fontSize: 12, color: hexToColor("616669")),
),
);
})

View File

@ -1,8 +1,10 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -20,21 +22,13 @@ class TIMUIKitMessageReactionShowPanel extends TIMUIKitStatelessWidget {
/// current message
final V2TimMessage message;
TIMUIKitMessageReactionShowPanel({required this.message, Key? key})
: super(key: key);
TIMUIKitMessageReactionShowPanel({required this.message, Key? key}) : super(key: key);
final TUISelfInfoViewModel selfInfoModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel selfInfoModel = serviceLocator<TUISelfInfoViewModel>();
void showMore(
BuildContext context,
List<V2TimGroupMemberFullInfo?>? memberList,
Map<String, dynamic> messageReaction,
int currentSticker,
List<int> stickerList,
TUIChatSeparateViewModel model) async {
_showCustomModalBottomSheet(context, memberList, messageReaction,
currentSticker, stickerList, model);
void showMore(BuildContext context, List<V2TimGroupMemberFullInfo?>? memberList, Map<String, dynamic> messageReaction,
int currentSticker, List<int> stickerList, TUIChatSeparateViewModel model) async {
_showCustomModalBottomSheet(context, memberList, messageReaction, currentSticker, stickerList, model);
}
Future<Future<int?>> _showCustomModalBottomSheet(
@ -71,8 +65,7 @@ class TIMUIKitMessageReactionShowPanel extends TIMUIKitStatelessWidget {
Center(
child: Text(
TIM_t("回应详情"),
style: const TextStyle(
fontWeight: FontWeight.bold, fontSize: 16.0),
style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16.0),
),
),
IconButton(
@ -88,8 +81,7 @@ class TIMUIKitMessageReactionShowPanel extends TIMUIKitStatelessWidget {
child: TIMUIKitMessageReactionDetail(
onTapAvatar: model.onTapAvatar,
stickerList: stickerList,
currentStickerIndex: stickerList
.indexWhere((element) => element == currentSticker),
currentStickerIndex: stickerList.indexWhere((element) => element == currentSticker),
memberList: memberList,
messageReaction: messageReaction,
)),
@ -102,12 +94,9 @@ class TIMUIKitMessageReactionShowPanel extends TIMUIKitStatelessWidget {
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
Map<String, dynamic> messageReaction = {};
CloudCustomData messageCloudCustomData =
MessageReactionUtils.getCloudCustomData(message);
final TUIChatSeparateViewModel model =
Provider.of<TUIChatSeparateViewModel>(context);
if (messageCloudCustomData.messageReaction != null &&
messageCloudCustomData.messageReaction!.isNotEmpty) {
CloudCustomData messageCloudCustomData = MessageReactionUtils.getCloudCustomData(message);
final TUIChatSeparateViewModel model = Provider.of<TUIChatSeparateViewModel>(context);
if (messageCloudCustomData.messageReaction != null && messageCloudCustomData.messageReaction!.isNotEmpty) {
messageReaction = messageCloudCustomData.messageReaction!;
} else {
return const SizedBox(width: 0, height: 0);
@ -119,8 +108,7 @@ class TIMUIKitMessageReactionShowPanel extends TIMUIKitStatelessWidget {
messageReactionStickerList.add(int.parse(key));
});
final filteredMessageReactionStickerList =
messageReactionStickerList.where((sticker) {
final filteredMessageReactionStickerList = messageReactionStickerList.where((sticker) {
if (messageReaction[sticker.toString()] == null ||
messageReaction[sticker.toString()] is! List ||
messageReaction[sticker.toString()].length == 0) {
@ -160,8 +148,8 @@ class TIMUIKitMessageReactionShowPanel extends TIMUIKitStatelessWidget {
nameList: messageReaction[sticker.toString()],
sticker: sticker,
onShowDetail: (int sticker) {
showMore(context, memberList, messageReaction, sticker,
filteredMessageReactionStickerList, model);
showMore(
context, memberList, messageReaction, sticker, filteredMessageReactionStickerList, model);
});
}).toList(),
],

View File

@ -1,8 +1,11 @@
import 'dart:convert';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart';
@ -11,18 +14,14 @@ import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/tim_uikit_cloud_custom_data.dart';
class MessageReactionUtils {
static final TUISelfInfoViewModel selfInfoModel =
serviceLocator<TUISelfInfoViewModel>();
static final MessageService _messageService =
serviceLocator<MessageService>();
static final TUISelfInfoViewModel selfInfoModel = serviceLocator<TUISelfInfoViewModel>();
static final MessageService _messageService = serviceLocator<MessageService>();
static CloudCustomData getCloudCustomData(V2TimMessage message) {
CloudCustomData messageCloudCustomData;
try {
messageCloudCustomData = CloudCustomData.fromJson(json.decode(
TencentUtils.checkString(message.cloudCustomData) != null
? message.cloudCustomData!
: "{}"));
messageCloudCustomData = CloudCustomData.fromJson(
json.decode(TencentUtils.checkString(message.cloudCustomData) != null ? message.cloudCustomData! : "{}"));
} catch (e) {
messageCloudCustomData = CloudCustomData();
}
@ -34,11 +33,9 @@ class MessageReactionUtils {
return getCloudCustomData(message).messageReaction ?? {};
}
static Future<V2TimValueCallback<V2TimMessageChangeInfo>> clickOnSticker(
V2TimMessage message, int sticker) async {
static Future<V2TimValueCallback<V2TimMessageChangeInfo>> clickOnSticker(V2TimMessage message, int sticker) async {
final CloudCustomData messageCloudCustomData = getCloudCustomData(message);
final Map<String, dynamic> messageReaction =
messageCloudCustomData.messageReaction ?? {};
final Map<String, dynamic> messageReaction = messageCloudCustomData.messageReaction ?? {};
List targetList = messageReaction["$sticker"] ?? [];
if (targetList.contains(selfInfoModel.loginInfo!.userID!)) {
targetList.remove(selfInfoModel.loginInfo!.userID!);
@ -49,8 +46,7 @@ class MessageReactionUtils {
if (PlatformUtils().isWeb) {
final decodedMessage = jsonDecode(message.messageFromWeb!);
decodedMessage["cloudCustomData"] =
jsonEncode(messageCloudCustomData.toMap());
decodedMessage["cloudCustomData"] = jsonEncode(messageCloudCustomData.toMap());
message.messageFromWeb = jsonEncode(decodedMessage);
} else {
message.cloudCustomData = json.encode(messageCloudCustomData.toMap());

View File

@ -2,7 +2,8 @@ import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/common_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -27,7 +28,7 @@ class TIMUIKitMessageReactionWrapper extends StatefulWidget {
this.clearJump,
required this.isFromSelf,
this.backgroundColor,
required this.chatModel,
required this.chatModel,
required this.message,
this.borderRadius,
required this.child,
@ -38,15 +39,13 @@ class TIMUIKitMessageReactionWrapper extends StatefulWidget {
State<StatefulWidget> createState() => _TIMUIKitMessageReactionWrapperState();
}
class _TIMUIKitMessageReactionWrapperState
extends TIMUIKitState<TIMUIKitMessageReactionWrapper> {
class _TIMUIKitMessageReactionWrapperState extends TIMUIKitState<TIMUIKitMessageReactionWrapper> {
bool isShowJumpState = false;
bool isShining = false;
bool isShowBorder = false;
_showJumpColor() {
if ((widget.chatModel.jumpMsgID != widget.message.msgID) &&
(widget.message.msgID?.isNotEmpty ?? true)) {
if ((widget.chatModel.jumpMsgID != widget.message.msgID) && (widget.message.msgID?.isNotEmpty ?? true)) {
return;
}
isShining = true;
@ -78,15 +77,12 @@ class _TIMUIKitMessageReactionWrapperState
CloudCustomData messageCloudCustomData;
try {
messageCloudCustomData = CloudCustomData.fromJson(json.decode(
TencentUtils.checkString(widget.message.cloudCustomData) != null
? widget.message.cloudCustomData!
: "{}"));
TencentUtils.checkString(widget.message.cloudCustomData) != null ? widget.message.cloudCustomData! : "{}"));
} catch (e) {
messageCloudCustomData = CloudCustomData();
}
if (messageCloudCustomData.messageReaction != null &&
messageCloudCustomData.messageReaction!.isNotEmpty) {
if (messageCloudCustomData.messageReaction != null && messageCloudCustomData.messageReaction!.isNotEmpty) {
messageReaction = messageCloudCustomData.messageReaction!;
} else {
return false;
@ -98,8 +94,7 @@ class _TIMUIKitMessageReactionWrapperState
messageReactionStickerList.add(int.parse(key));
});
final filteredMessageReactionStickerList =
messageReactionStickerList.where((sticker) {
final filteredMessageReactionStickerList = messageReactionStickerList.where((sticker) {
if (messageReaction[sticker.toString()] == null ||
messageReaction[sticker.toString()] is! List ||
messageReaction[sticker.toString()].length == 0) {
@ -135,29 +130,23 @@ class _TIMUIKitMessageReactionWrapperState
_showJumpColor();
});
} else {
if ((widget.chatModel.jumpMsgID == widget.message.msgID) &&
(widget.message.msgID?.isNotEmpty ?? false)) {
if(widget.clearJump != null){
if ((widget.chatModel.jumpMsgID == widget.message.msgID) && (widget.message.msgID?.isNotEmpty ?? false)) {
if (widget.clearJump != null) {
widget.clearJump!();
}
}
}
}
final defaultStyle = widget.isFromSelf
? theme.lightPrimaryMaterialColor.shade50
: theme.weakBackgroundColor;
final backgroundColor = isShowJumpState
? const Color.fromRGBO(245, 166, 35, 1)
: (widget.backgroundColor ?? defaultStyle);
final defaultStyle = widget.isFromSelf ? theme.lightPrimaryMaterialColor.shade50 : theme.weakBackgroundColor;
final backgroundColor =
isShowJumpState ? const Color.fromRGBO(245, 166, 35, 1) : (widget.backgroundColor ?? defaultStyle);
if (!widget.isShowMessageReaction || !isHaveMessageReaction()) {
return Container(
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(5)),
border: Border.all(
color: Color.fromRGBO(245, 166, 35, (isShowBorder ? 1 : 0)),
width: 2)),
border: Border.all(color: Color.fromRGBO(245, 166, 35, (isShowBorder ? 1 : 0)), width: 2)),
child: widget.child,
);
}
@ -168,21 +157,17 @@ class _TIMUIKitMessageReactionWrapperState
color: backgroundColor,
borderRadius: widget.borderRadius ?? borderRadius,
),
constraints:
BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.7),
constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width * 0.7),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(5)),
border: Border.all(
color: Color.fromRGBO(245, 166, 35, (isShowBorder ? 1 : 0)),
width: 2)),
border: Border.all(color: Color.fromRGBO(245, 166, 35, (isShowBorder ? 1 : 0)), width: 2)),
child: widget.child,
),
if (widget.isShowMessageReaction)
TIMUIKitMessageReactionShowPanel(message: widget.message)
if (widget.isShowMessageReaction) TIMUIKitMessageReactionShowPanel(message: widget.message)
],
),
);

View File

@ -2,8 +2,10 @@
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_custom_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_custom_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_custom_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
@ -43,9 +45,7 @@ class TIMUIKitCustomElem extends TIMUIKitStatelessWidget {
topRight: Radius.circular(10),
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10));
final backgroundColor = isFromSelf
? theme.lightPrimaryMaterialColor.shade50
: theme.weakBackgroundColor;
final backgroundColor = isFromSelf ? theme.lightPrimaryMaterialColor.shade50 : theme.weakBackgroundColor;
return Container(
padding: textPadding ?? const EdgeInsets.all(10),
decoration: BoxDecoration(
@ -54,9 +54,7 @@ class TIMUIKitCustomElem extends TIMUIKitStatelessWidget {
),
constraints: const BoxConstraints(maxWidth: 240),
child: Column(
children: [
Text(TIM_t("自定义消息"))
],
children: [Text(TIM_t("自定义消息"))],
));
}
}

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -29,7 +30,6 @@ class TIMUIKitFaceElem extends StatefulWidget {
}
class _TIMUIKitTextElemState extends TIMUIKitState<TIMUIKitFaceElem> {
bool isFromNetwork() {
return widget.path.startsWith('http');
}
@ -50,7 +50,7 @@ class _TIMUIKitTextElemState extends TIMUIKitState<TIMUIKitFaceElem> {
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return TIMUIKitMessageReactionWrapper(
chatModel: widget.model,
chatModel: widget.model,
isShowJump: widget.isShowJump,
isFromSelf: widget.message.isSelf ?? true,
clearJump: widget.clearJump,
@ -58,11 +58,8 @@ class _TIMUIKitTextElemState extends TIMUIKitState<TIMUIKitFaceElem> {
isShowMessageReaction: widget.isShowMessageReaction ?? true,
child: Container(
padding: const EdgeInsets.all(10),
constraints:
BoxConstraints(maxWidth: MediaQuery.of(context).size.width * (isDesktopScreen ? 0.1 : 0.3)),
child: isFromNetwork()
? Image.network(widget.path)
: Image.asset(createPathFromNative(widget.path)),
constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width * (isDesktopScreen ? 0.1 : 0.3)),
child: isFromNetwork() ? Image.network(widget.path) : Image.asset(createPathFromNative(widget.path)),
));
}
}

View File

@ -10,9 +10,12 @@ import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:open_file/open_file.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_file_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_download_progress.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_file_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_file_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_download_progress.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_download_progress.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
@ -70,9 +73,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
@override
void dispose() {
if (advancedMsgListener != null) {
TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.removeAdvancedMsgListener(listener: advancedMsgListener);
TencentImSDKPlugin.v2TIMManager.getMessageManager().removeAdvancedMsgListener(listener: advancedMsgListener);
advancedMsgListener = null;
}
super.dispose();
@ -89,12 +90,11 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
}
Future<bool> addAdvancedMsgListenerForDownload() async {
if(advancedMsgListener != null){
if (advancedMsgListener != null) {
return false;
}
advancedMsgListener = V2TimAdvancedMsgListener(
onMessageDownloadProgressCallback:
(V2TimMessageDownloadProgress messageProgress) async {
onMessageDownloadProgressCallback: (V2TimMessageDownloadProgress messageProgress) async {
if (messageProgress.msgID == widget.message.msgID) {
if (messageProgress.isError || messageProgress.errorCode != 0) {
setState(() {
@ -117,9 +117,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
}
}
} else {
final currentProgress =
(messageProgress.currentSize / messageProgress.totalSize * 100)
.floor();
final currentProgress = (messageProgress.currentSize / messageProgress.totalSize * 100).floor();
if (mounted && currentProgress > downloadProgress) {
setState(() {
downloadProgress = currentProgress;
@ -129,17 +127,14 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
}
},
);
await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.addAdvancedMsgListener(listener: advancedMsgListener!);
await TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: advancedMsgListener!);
return true;
}
Future<String> getSavePath() async {
String savePathWithAppPath =
'/storage/emulated/0/Android/data/com.tencent.flutter.tuikit/cache/' +
(widget.message.msgID ?? "") +
widget.fileElem!.fileName!;
String savePathWithAppPath = '/storage/emulated/0/Android/data/com.tencent.flutter.tuikit/cache/' +
(widget.message.msgID ?? "") +
widget.fileElem!.fileName!;
return savePathWithAppPath;
}
@ -147,8 +142,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
if (PlatformUtils().isWeb) {
return true;
}
String savePath = TencentUtils.checkString(
model.getFileMessageLocation(widget.messageID)) ??
String savePath = TencentUtils.checkString(model.getFileMessageLocation(widget.messageID)) ??
TencentUtils.checkString(widget.message.fileElem!.localUrl) ??
widget.message.fileElem?.path ??
'';
@ -166,9 +160,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
model.setMessageProgress(widget.messageID!, 100);
}
if (advancedMsgListener != null) {
TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.removeAdvancedMsgListener(listener: advancedMsgListener);
TencentImSDKPlugin.v2TIMManager.getMessageManager().removeAdvancedMsgListener(listener: advancedMsgListener);
advancedMsgListener = null;
}
return true;
@ -216,8 +208,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
downloadFile(TUITheme theme) async {
if (PlatformUtils().isMobile) {
if (PlatformUtils().isIOS) {
if (!await Permissions.checkPermission(
context, Permission.photosAddOnly.value, theme, false)) {
if (!await Permissions.checkPermission(context, Permission.photosAddOnly.value, theme, false)) {
return;
}
} else {
@ -249,18 +240,13 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
}
tryOpenFile(context, theme) async {
if (!PlatformUtils().isWeb &&
(await hasZeroSize(filePath) || widget.message.status == 3)) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: "不支持 0KB 文件的传输",
infoCode: 6660417));
if (!PlatformUtils().isWeb && (await hasZeroSize(filePath) || widget.message.status == 3)) {
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: "不支持 0KB 文件的传输", infoCode: 6660417));
return;
}
if (PlatformUtils().isMobile) {
if (PlatformUtils().isIOS) {
if (!await Permissions.checkPermission(
context, Permission.photosAddOnly.value, theme!, false)) {
if (!await Permissions.checkPermission(context, Permission.photosAddOnly.value, theme!, false)) {
return;
}
} else {
@ -304,8 +290,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
);
final html.AnchorElement downloadAnchor =
html.document.createElement('a') as html.AnchorElement;
final html.AnchorElement downloadAnchor = html.document.createElement('a') as html.AnchorElement;
final html.Blob blob = html.Blob([response.bodyBytes]);
@ -317,8 +302,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
html.AnchorElement(
href: widget.fileElem?.path ?? "",
)
..setAttribute(
"download", widget.message.fileElem?.fileName ?? fileName)
..setAttribute("download", widget.message.fileElem?.fileName ?? fileName)
..setAttribute("target", '_blank')
..style.display = "none"
..click();
@ -348,13 +332,11 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10));
String? fileFormat;
if (widget.fileElem?.fileName != null &&
widget.fileElem!.fileName!.isNotEmpty) {
if (widget.fileElem?.fileName != null && widget.fileElem!.fileName!.isNotEmpty) {
final String fileName = widget.fileElem!.fileName!;
fileFormat = fileName.split(".")[max(fileName.split(".").length - 1, 0)];
}
final RenderBox? containerRenderBox =
containerKey.currentContext?.findRenderObject() as RenderBox?;
final RenderBox? containerRenderBox = containerKey.currentContext?.findRenderObject() as RenderBox?;
if (containerRenderBox != null) {
containerHeight = containerRenderBox.size.height;
}
@ -406,19 +388,15 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
if (checkIsWaiting()) {
onTIMCallback(
TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("已加入待下载队列,其他文件下载中"),
infoCode: 6660413),
type: TIMCallbackType.INFO, infoRecommendText: TIM_t("已加入待下载队列,其他文件下载中"), infoCode: 6660413),
);
return;
} else {
await addUrlToWaitingPath(theme);
}
} catch (e) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: "文件处理异常",
infoCode: 6660416));
onTIMCallback(
TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: "文件处理异常", infoCode: 6660416));
}
},
child: ConstrainedBox(
@ -427,8 +405,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
width: 170,
decoration: BoxDecoration(
border: Border.all(
color: theme.weakDividerColor ??
CommonColor.weakDividerColor,
color: theme.weakDividerColor ?? CommonColor.weakDividerColor,
),
borderRadius: borderRadius),
child: Stack(children: [
@ -437,28 +414,21 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
child: LinearProgressIndicator(
minHeight: ((containerHeight) ?? 72) - 6,
value: (received == 100 ? 0 : received) / 100,
backgroundColor: received == 100
? theme.weakBackgroundColor
: Colors.white,
valueColor: AlwaysStoppedAnimation(
theme.lightPrimaryMaterialColor.shade50),
backgroundColor: received == 100 ? theme.weakBackgroundColor : Colors.white,
valueColor: AlwaysStoppedAnimation(theme.lightPrimaryMaterialColor.shade50),
),
),
Padding(
padding: const EdgeInsets.symmetric(
vertical: 8, horizontal: 12),
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12),
child: Row(
mainAxisAlignment: widget.isSelf
? MainAxisAlignment.end
: MainAxisAlignment.start,
mainAxisAlignment: widget.isSelf ? MainAxisAlignment.end : MainAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
constraints:
const BoxConstraints(maxWidth: 160),
constraints: const BoxConstraints(maxWidth: 160),
child: LayoutBuilder(
builder: (buildContext, boxConstraints) {
return CustomText(
@ -476,9 +446,7 @@ class _TIMUIKitFileElemState extends TIMUIKitState<TIMUIKitFileElem> {
if (fileSize != null)
Text(
showFileSize(fileSize),
style: TextStyle(
fontSize: 14,
color: theme.weakTextColor),
style: TextStyle(fontSize: 14, color: theme.weakTextColor),
)
],
)),

View File

@ -1,6 +1,8 @@
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_tips_elem.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_tips_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_tips_elem.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
@ -11,15 +13,13 @@ class TIMUIKitGroupTipsElem extends StatefulWidget {
final V2TimGroupTipsElem groupTipsElem;
final List<V2TimGroupMemberFullInfo?> groupMemberList;
const TIMUIKitGroupTipsElem({Key? key, required this.groupMemberList, required this.groupTipsElem})
: super(key: key);
const TIMUIKitGroupTipsElem({Key? key, required this.groupMemberList, required this.groupTipsElem}) : super(key: key);
@override
State<TIMUIKitGroupTipsElem> createState() => _TIMUIKitGroupTipsElemState();
}
class _TIMUIKitGroupTipsElemState extends TIMUIKitState<TIMUIKitGroupTipsElem> {
String groupTipsAbstractText = "";
@override
@ -45,10 +45,7 @@ class _TIMUIKitGroupTipsElemState extends TIMUIKitState<TIMUIKitGroupTipsElem> {
maxLines: 1,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w400,
color: hexToColor("888888")),
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w400, color: hexToColor("888888")),
),
theme);
}

View File

@ -18,8 +18,10 @@ import 'package:open_file/open_file.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_image.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_image.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_image.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -77,9 +79,8 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
String getOriginImgURL() {
//
V2TimImage? img = MessageUtils.getImageFromImgList(
widget.message.imageElem!.imageList,
HistoryMessageDartConstant.oriImgPrior);
V2TimImage? img =
MessageUtils.getImageFromImgList(widget.message.imageElem!.imageList, HistoryMessageDartConstant.oriImgPrior);
return img == null ? widget.message.imageElem!.path! : img.url!;
}
@ -128,8 +129,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
final http.Response r = await http.get(Uri.parse(imageUrl));
final data = r.bodyBytes;
final base64data = base64Encode(data);
final a =
html.AnchorElement(href: 'data:image/jpeg;base64,$base64data');
final a = html.AnchorElement(href: 'data:image/jpeg;base64,$base64data');
a.download = md5.convert(utf8.encode(imageUrl)).toString();
a.click();
a.remove();
@ -140,8 +140,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
}
if (PlatformUtils().isIOS) {
if (!await Permissions.checkPermission(
context, Permission.photosAddOnly.value, theme!, false)) {
if (!await Permissions.checkPermission(context, Permission.photosAddOnly.value, theme!, false)) {
return;
}
} else {
@ -177,7 +176,8 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
if (model.getMessageProgress(widget.message.msgID) == 100) {
String savePath;
if (widget.message.imageElem!.path != null &&
widget.message.imageElem!.path != '' && File(widget.message.imageElem!.path!).existsSync()) {
widget.message.imageElem!.path != '' &&
File(widget.message.imageElem!.path!).existsSync()) {
savePath = widget.message.imageElem!.path!;
} else {
savePath = model.getFileMessageLocation(widget.message.msgID);
@ -188,36 +188,26 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
if (PlatformUtils().isIOS) {
if (result['isSuccess']) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存成功"),
infoCode: 6660406));
onTIMCallback(
TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406));
} else {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存失败"),
infoCode: 6660407));
onTIMCallback(
TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407));
}
} else {
if (result != null) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存成功"),
infoCode: 6660406));
onTIMCallback(
TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406));
} else {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存失败"),
infoCode: 6660407));
onTIMCallback(
TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407));
}
}
return;
}
} else {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("the message is downloading"),
infoCode: -1));
type: TIMCallbackType.INFO, infoRecommendText: TIM_t("the message is downloading"), infoCode: -1));
}
return;
}
@ -226,27 +216,15 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
if (PlatformUtils().isIOS) {
if (result['isSuccess']) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存成功"),
infoCode: 6660406));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406));
} else {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存失败"),
infoCode: 6660407));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407));
}
} else {
if (result != null) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存成功"),
infoCode: 6660406));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存成功"), infoCode: 6660406));
} else {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("图片保存失败"),
infoCode: 6660407));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("图片保存失败"), infoCode: 6660407));
}
}
return;
@ -267,8 +245,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
if (!isWeb && filePath != null && File(filePath).existsSync()) {
imageUrl = filePath;
isAssetBool = true;
} else if (localUrl != null &&
(!isWeb && File(localUrl).existsSync())) {
} else if (localUrl != null && (!isWeb && File(localUrl).existsSync())) {
imageUrl = localUrl;
isAssetBool = true;
} else {
@ -286,19 +263,14 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
);
}
} catch (e) {
onTIMCallback(TIMCallback(
infoCode: 6660414,
infoRecommendText: TIM_t("正在下载中"),
type: TIMCallbackType.INFO));
onTIMCallback(TIMCallback(infoCode: 6660414, infoRecommendText: TIM_t("正在下载中"), type: TIMCallbackType.INFO));
return;
}
}
V2TimImage? getImageFromList(V2TimImageTypesEnum imgType) {
V2TimImage? img = MessageUtils.getImageFromImgList(
widget.message.imageElem!.imageList,
HistoryMessageDartConstant.imgPriorMap[imgType] ??
HistoryMessageDartConstant.oriImgPrior);
V2TimImage? img = MessageUtils.getImageFromImgList(widget.message.imageElem!.imageList,
HistoryMessageDartConstant.imgPriorMap[imgType] ?? HistoryMessageDartConstant.oriImgPrior);
return img;
}
@ -322,26 +294,21 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
));
bool checkIfDownloadSuccess() {
final localUrl = TencentUtils.checkString(
model.getFileMessageLocation(widget.message.msgID)) ??
final localUrl = TencentUtils.checkString(model.getFileMessageLocation(widget.message.msgID)) ??
widget.message.imageElem!.imageList![0]!.localUrl;
return TencentUtils.checkString(localUrl) != null &&
File(localUrl!).existsSync();
return TencentUtils.checkString(localUrl) != null && File(localUrl!).existsSync();
}
_onClickOpenImageInNewWindow() {
final localUrl = TencentUtils.checkString(
model.getFileMessageLocation(widget.message.msgID)) ??
final localUrl = TencentUtils.checkString(model.getFileMessageLocation(widget.message.msgID)) ??
widget.message.imageElem!.imageList![0]!.localUrl;
Future.delayed(const Duration(milliseconds: 0), () async {
final isDownloaded = checkIfDownloadSuccess();
if (isDownloaded) {
launchDesktopFile(localUrl ?? "");
} else {
onTIMCallback(TIMCallback(
infoCode: 6660414,
infoRecommendText: TIM_t("正在下载原始资源,请稍候..."),
type: TIMCallbackType.INFO));
onTIMCallback(
TIMCallback(infoCode: 6660414, infoRecommendText: TIM_t("正在下载原始资源,请稍候..."), type: TIMCallbackType.INFO));
}
});
}
@ -350,8 +317,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
double? positionRadio,
String? originImgUrl,
}) {
final localUrl = TencentUtils.checkString(
model.getFileMessageLocation(widget.message.msgID)) ??
final localUrl = TencentUtils.checkString(model.getFileMessageLocation(widget.message.msgID)) ??
widget.message.imageElem!.imageList![0]!.localUrl;
if (checkIfDownloadSuccess()) {
TUIKitWidePopup.showMedia(
@ -367,10 +333,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
mediaURL: originImgUrl,
onClickOrigin: () => _onClickOpenImageInNewWindow());
} else {
onTIMCallback(TIMCallback(
infoCode: 6660414,
infoRecommendText: TIM_t("正在下载中"),
type: TIMCallbackType.INFO));
onTIMCallback(TIMCallback(infoCode: 6660414, infoRecommendText: TIM_t("正在下载中"), type: TIMCallbackType.INFO));
}
}
}
@ -438,9 +401,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
} else {
if (PlatformUtils().isDesktop) {
TUIKitWidePopup.showMedia(
mediaLocalPath: imgPath,
context: context,
onClickOrigin: () => launchDesktopFile(imgPath ?? ""));
mediaLocalPath: imgPath, context: context, onClickOrigin: () => launchDesktopFile(imgPath ?? ""));
} else {
Navigator.of(context).push(
PageRouteBuilder(
@ -473,26 +434,19 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
return Hero(
tag: heroTag,
child: PlatformUtils().isWeb
? Image.network(webPath ?? smallImg?.url ?? originalImg!.url!,
fit: BoxFit.contain)
? Image.network(webPath ?? smallImg?.url ?? originalImg!.url!, fit: BoxFit.contain)
: CachedNetworkImage(
alignment: Alignment.topCenter,
imageUrl: webPath ?? smallImg?.url ?? originalImg!.url!,
errorWidget: (context, error, stackTrace) =>
errorPage(theme),
errorWidget: (context, error, stackTrace) => errorPage(theme),
fit: BoxFit.contain,
cacheKey: smallImg?.uuid ?? originalImg!.uuid,
placeholder: (context, url) =>
Image(image: MemoryImage(kTransparentImage)),
placeholder: (context, url) => Image(image: MemoryImage(kTransparentImage)),
fadeInDuration: const Duration(milliseconds: 0),
));
} else {
final imgPath = (TencentUtils.checkString(smallLocalPath) != null
? smallLocalPath
: originLocalPath)!;
return Hero(
tag: heroTag,
child: Image.file(File(imgPath), fit: BoxFit.contain));
final imgPath = (TencentUtils.checkString(smallLocalPath) != null ? smallLocalPath : originLocalPath)!;
return Hero(tag: heroTag, child: Image.file(File(imgPath), fit: BoxFit.contain));
}
}
@ -522,10 +476,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
heroTag: heroTag,
isNetworkImage: isNetworkImage,
imgUrl: webPath ?? smallImg?.url ?? originalImg?.url ?? "",
imgPath: (TencentUtils.checkString(originLocalPath) != null
? originLocalPath
: smallLocalPath) ??
""),
imgPath: (TencentUtils.checkString(originLocalPath) != null ? originLocalPath : smallLocalPath) ?? ""),
child: Stack(
children: [
if (positionRadio != null)
@ -542,50 +493,29 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
}
void initImages() async {
final zeroImageLocal = TencentUtils.checkString(widget
.message.imageElem?.imageList
?.firstWhereOrNull((element) => element?.type == 0)
?.localUrl);
final oneImageLocal = TencentUtils.checkString(widget
.message.imageElem?.imageList
?.firstWhereOrNull((element) => element?.type == 1)
?.localUrl);
final twoImageLocal = TencentUtils.checkString(widget
.message.imageElem?.imageList
?.firstWhereOrNull((element) => element?.type == 2)
?.localUrl);
final zeroImageLocal = TencentUtils.checkString(
widget.message.imageElem?.imageList?.firstWhereOrNull((element) => element?.type == 0)?.localUrl);
final oneImageLocal = TencentUtils.checkString(
widget.message.imageElem?.imageList?.firstWhereOrNull((element) => element?.type == 1)?.localUrl);
final twoImageLocal = TencentUtils.checkString(
widget.message.imageElem?.imageList?.firstWhereOrNull((element) => element?.type == 2)?.localUrl);
if (!PlatformUtils().isWeb &&
TencentUtils.checkString(widget.message.msgID) != null) {
if ((widget.message.imageElem?.imageList) == null ||
widget.message.imageElem!.imageList!.isEmpty) {
final response = await _messageService.getMessageOnlineUrl(
msgID: widget.message.msgID!);
if (!PlatformUtils().isWeb && TencentUtils.checkString(widget.message.msgID) != null) {
if ((widget.message.imageElem?.imageList) == null || widget.message.imageElem!.imageList!.isEmpty) {
final response = await _messageService.getMessageOnlineUrl(msgID: widget.message.msgID!);
final elem = response.data;
if (elem != null && elem.imageElem != null) {
widget.message.imageElem = elem.imageElem;
}
}
if (oneImageLocal == null || !File(oneImageLocal).existsSync()) {
_messageService.downloadMessage(
msgID: widget.message.msgID!,
messageType: 3,
imageType: 1,
isSnapshot: false);
_messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 3, imageType: 1, isSnapshot: false);
}
if (twoImageLocal == null || !File(twoImageLocal).existsSync()) {
_messageService.downloadMessage(
msgID: widget.message.msgID!,
messageType: 3,
imageType: 2,
isSnapshot: false);
_messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 3, imageType: 2, isSnapshot: false);
}
if (zeroImageLocal == null || !File(zeroImageLocal).existsSync()) {
_messageService.downloadMessage(
msgID: widget.message.msgID!,
messageType: 3,
imageType: 0,
isSnapshot: false);
_messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 3, imageType: 0, isSnapshot: false);
}
}
}
@ -596,14 +526,9 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
initImages();
}
Widget? _renderImage(dynamic heroTag, TUITheme theme,
{V2TimImage? originalImg, V2TimImage? smallImg}) {
Widget? _renderImage(dynamic heroTag, TUITheme theme, {V2TimImage? originalImg, V2TimImage? smallImg}) {
double positionRadio = 1.0;
if (smallImg?.width != null &&
smallImg?.height != null &&
smallImg?.width != 0 &&
smallImg?.height != 0) {
if (smallImg?.width != null && smallImg?.height != null && smallImg?.width != 0 && smallImg?.height != 0) {
positionRadio = (smallImg!.width! / smallImg.height!);
}
@ -637,10 +562,8 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
}
try {
if ((TencentUtils.checkString(smallImg?.localUrl) != null &&
File((smallImg?.localUrl!)!).existsSync()) ||
(TencentUtils.checkString(originalImg?.localUrl) != null &&
File((originalImg?.localUrl!)!).existsSync())) {
if ((TencentUtils.checkString(smallImg?.localUrl) != null && File((smallImg?.localUrl!)!).existsSync()) ||
(TencentUtils.checkString(originalImg?.localUrl) != null && File((originalImg?.localUrl!)!).existsSync())) {
return _renderAllImage(
smallLocalPath: smallImg?.localUrl ?? "",
heroTag: heroTag,
@ -660,8 +583,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
originalImg: originalImg);
}
if ((smallImg?.url ?? originalImg?.url) != null &&
(smallImg?.url ?? originalImg?.url)!.isNotEmpty) {
if ((smallImg?.url ?? originalImg?.url) != null && (smallImg?.url ?? originalImg?.url)!.isNotEmpty) {
return _renderAllImage(
heroTag: heroTag,
theme: theme,
@ -677,8 +599,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme;
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final heroTag =
"${widget.message.msgID ?? widget.message.id ?? widget.message.timestamp ?? DateTime.now().millisecondsSinceEpoch}${widget.isFrom}";
@ -691,16 +612,14 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
isFromSelf: widget.message.isSelf ?? true,
isShowMessageReaction: widget.isShowMessageReaction ?? true,
message: widget.message,
child: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {
return ConstrainedBox(
constraints: BoxConstraints(
maxWidth: constraints.maxWidth * (isDesktopScreen ? 0.4 : 0.5),
minWidth: 64,
maxHeight: 256,
),
child: _renderImage(heroTag, theme,
originalImg: originalImg, smallImg: smallImg),
child: _renderImage(heroTag, theme, originalImg: originalImg, smallImg: smallImg),
);
}));
}
@ -709,9 +628,7 @@ class _TIMUIKitImageElem extends TIMUIKitState<TIMUIKitImageElem> {
class ImageClipper extends CustomClipper<RRect> {
@override
RRect getClip(Size size) {
return RRect.fromRectAndRadius(
Rect.fromLTWH(0, 0, size.width, min(size.height, 256)),
const Radius.circular(5));
return RRect.fromRectAndRadius(Rect.fromLTWH(0, 0, size.width, min(size.height, 256)), const Radius.circular(5));
}
@override

View File

@ -6,7 +6,8 @@ import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_model_tools.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/common_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';

View File

@ -3,8 +3,10 @@ import 'dart:math';
import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_sound_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_sound_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_sound_elem.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -95,7 +97,8 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
}
if (!PlatformUtils().isWeb) {
if (widget.message.soundElem!.localUrl == null || widget.message.soundElem!.localUrl == '') {
_messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 4, imageType: 0, isSnapshot: false);
_messageService.downloadMessage(
msgID: widget.message.msgID!, messageType: 4, imageType: 0, isSnapshot: false);
}
}
}
@ -172,11 +175,21 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme;
final backgroundColor = widget.isFromSelf ? (theme.chatMessageItemFromSelfBgColor ?? theme.lightPrimaryMaterialColor.shade50) : (theme.chatMessageItemFromOthersBgColor);
final backgroundColor = widget.isFromSelf
? (theme.chatMessageItemFromSelfBgColor ?? theme.lightPrimaryMaterialColor.shade50)
: (theme.chatMessageItemFromOthersBgColor);
final borderRadius = widget.isFromSelf
? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(2), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10))
: const BorderRadius.only(topLeft: Radius.circular(2), topRight: Radius.circular(10), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10));
? const BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(2),
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10))
: const BorderRadius.only(
topLeft: Radius.circular(2),
topRight: Radius.circular(10),
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10));
if (widget.isShowJump) {
if (!isShining) {
Future.delayed(Duration.zero, () {

View File

@ -1,7 +1,8 @@
import 'dart:async';
import 'dart:convert';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:extended_text/extended_text.dart';
import 'package:flutter/material.dart';

View File

@ -2,7 +2,8 @@ import 'dart:async';
import 'dart:convert';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:extended_text/extended_text.dart';
import 'package:flutter/material.dart';

View File

@ -6,8 +6,10 @@ import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:open_file/open_file.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_video_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_video_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_video_elem.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
@ -80,21 +82,18 @@ class _TIMUIKitVideoElemState extends TIMUIKitState<TIMUIKitVideoElem> {
final current = (DateTime.now().millisecondsSinceEpoch / 1000).ceil();
final timeStamp = widget.message.timestamp ?? current;
if (current - timeStamp < 300) {
if (stateElement.snapshotPath != null &&
stateElement.snapshotPath != '') {
if (stateElement.snapshotPath != null && stateElement.snapshotPath != '') {
File imgF = File(stateElement.snapshotPath!);
bool isExist = imgF.existsSync();
if (isExist) {
return Image.file(File(stateElement.snapshotPath!),
fit: BoxFit.fitWidth);
return Image.file(File(stateElement.snapshotPath!), fit: BoxFit.fitWidth);
}
}
}
}
if ((stateElement.snapshotUrl == null || stateElement.snapshotUrl == '') &&
(stateElement.snapshotPath == null ||
stateElement.snapshotPath == '')) {
(stateElement.snapshotPath == null || stateElement.snapshotPath == '')) {
return Container(
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(5)),
@ -120,22 +119,16 @@ class _TIMUIKitVideoElemState extends TIMUIKitState<TIMUIKitVideoElem> {
widget.message.status == MessageStatus.V2TIM_MSG_STATUS_SENDING)
? (stateElement.snapshotPath!.isNotEmpty
? Image.file(File(stateElement.snapshotPath!), fit: BoxFit.fitWidth)
: Image.file(File(stateElement.localSnapshotUrl!),
fit: BoxFit.fitWidth))
: (PlatformUtils().isWeb ||
stateElement.localSnapshotUrl == null ||
stateElement.localSnapshotUrl == "")
: Image.file(File(stateElement.localSnapshotUrl!), fit: BoxFit.fitWidth))
: (PlatformUtils().isWeb || stateElement.localSnapshotUrl == null || stateElement.localSnapshotUrl == "")
? Image.network(stateElement.snapshotUrl!, fit: BoxFit.fitWidth)
: Image.file(File(stateElement.localSnapshotUrl!),
fit: BoxFit.fitWidth);
: Image.file(File(stateElement.localSnapshotUrl!), fit: BoxFit.fitWidth);
}
downloadMessageDetailAndSave() async {
if (TencentUtils.checkString(widget.message.msgID) != null) {
if (TencentUtils.checkString(widget.message.videoElem!.videoUrl) ==
null) {
final response = await _messageService.getMessageOnlineUrl(
msgID: widget.message.msgID!);
if (TencentUtils.checkString(widget.message.videoElem!.videoUrl) == null) {
final response = await _messageService.getMessageOnlineUrl(msgID: widget.message.msgID!);
if (response.data != null) {
widget.message.videoElem = response.data!.videoElem;
Future.delayed(const Duration(microseconds: 10), () {
@ -144,24 +137,14 @@ class _TIMUIKitVideoElemState extends TIMUIKitState<TIMUIKitVideoElem> {
}
}
if (!PlatformUtils().isWeb) {
if (TencentUtils.checkString(widget.message.videoElem!.localVideoUrl) ==
null ||
if (TencentUtils.checkString(widget.message.videoElem!.localVideoUrl) == null ||
!File(widget.message.videoElem!.localVideoUrl!).existsSync()) {
_messageService.downloadMessage(
msgID: widget.message.msgID!,
messageType: 5,
imageType: 0,
isSnapshot: false);
msgID: widget.message.msgID!, messageType: 5, imageType: 0, isSnapshot: false);
}
if (TencentUtils.checkString(
widget.message.videoElem!.localSnapshotUrl) ==
null ||
if (TencentUtils.checkString(widget.message.videoElem!.localSnapshotUrl) == null ||
!File(widget.message.videoElem!.localSnapshotUrl!).existsSync()) {
_messageService.downloadMessage(
msgID: widget.message.msgID!,
messageType: 5,
imageType: 0,
isSnapshot: true);
_messageService.downloadMessage(msgID: widget.message.msgID!, messageType: 5, imageType: 0, isSnapshot: true);
}
}
}
@ -181,7 +164,6 @@ class _TIMUIKitVideoElemState extends TIMUIKitState<TIMUIKitVideoElem> {
}
}
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme;
@ -196,16 +178,15 @@ class _TIMUIKitVideoElemState extends TIMUIKitState<TIMUIKitVideoElem> {
context: context,
mediaURL: url,
onClickOrigin: () => launchUrl(
Uri.parse(url),
mode: LaunchMode.externalApplication,
));
Uri.parse(url),
mode: LaunchMode.externalApplication,
));
return;
}
if (PlatformUtils().isDesktop) {
final videoElem = widget.message.videoElem;
if (videoElem != null) {
final localVideoUrl =
TencentUtils.checkString(videoElem.localVideoUrl);
final localVideoUrl = TencentUtils.checkString(videoElem.localVideoUrl);
final videoPath = TencentUtils.checkString(videoElem.videoPath);
final videoUrl = videoElem.videoUrl;
if (localVideoUrl != null) {
@ -223,10 +204,8 @@ class _TIMUIKitVideoElemState extends TIMUIKitState<TIMUIKitVideoElem> {
// mediaPath: videoPath,
// onClickOrigin: () => launchDesktopFile(videoPath));
} else if (TencentUtils.isTextNotEmpty(videoUrl)) {
onTIMCallback(TIMCallback(
infoCode: 6660414,
infoRecommendText: TIM_t("正在下载中"),
type: TIMCallbackType.INFO));
onTIMCallback(
TIMCallback(infoCode: 6660414, infoRecommendText: TIM_t("正在下载中"), type: TIMCallbackType.INFO));
}
}
} else {
@ -253,67 +232,50 @@ class _TIMUIKitVideoElemState extends TIMUIKitState<TIMUIKitVideoElem> {
isFromSelf: widget.message.isSelf ?? true,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(5)),
child: LayoutBuilder(builder:
(BuildContext context, BoxConstraints constraints) {
child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {
double? positionRadio;
if ((stateElement.snapshotWidth) != null &&
stateElement.snapshotHeight != null &&
stateElement.snapshotWidth != 0 &&
stateElement.snapshotHeight != 0) {
positionRadio = (stateElement.snapshotWidth! /
stateElement.snapshotHeight!);
positionRadio = (stateElement.snapshotWidth! / stateElement.snapshotHeight!);
}
return ConstrainedBox(
constraints: BoxConstraints(
maxWidth: PlatformUtils().isWeb
? 300
: constraints.maxWidth * 0.5,
maxWidth: PlatformUtils().isWeb ? 300 : constraints.maxWidth * 0.5,
maxHeight: min(constraints.maxHeight * 0.8, 300),
minHeight: 20,
minWidth: 20),
child: Stack(
children: <Widget>[
if (positionRadio != null &&
(stateElement.snapshotUrl != null ||
stateElement.snapshotUrl != null))
(stateElement.snapshotUrl != null || stateElement.snapshotUrl != null))
AspectRatio(
aspectRatio: positionRadio,
child: Container(
decoration: const BoxDecoration(
color: Colors.transparent),
decoration: const BoxDecoration(color: Colors.transparent),
),
),
Row(
children: [
Expanded(
child: generateSnapshot(theme,
stateElement.snapshotHeight ?? 100))
],
children: [Expanded(child: generateSnapshot(theme, stateElement.snapshotHeight ?? 100))],
),
if (widget.message.status !=
MessageStatus.V2TIM_MSG_STATUS_SENDING &&
(stateElement.snapshotUrl != null ||
stateElement.snapshotPath != null) &&
if (widget.message.status != MessageStatus.V2TIM_MSG_STATUS_SENDING &&
(stateElement.snapshotUrl != null || stateElement.snapshotPath != null) &&
stateElement.videoPath != null ||
stateElement.videoUrl != null)
Positioned.fill(
// alignment: Alignment.center,
child: Center(
child: Image.asset('images/play.png',
package: 'tencent_cloud_chat_uikit',
height: 64)),
child:
Image.asset('images/play.png', package: 'tencent_cloud_chat_uikit', height: 64)),
),
if (widget.message.videoElem?.duration != null &&
widget.message.videoElem!.duration! > 0)
if (widget.message.videoElem?.duration != null && widget.message.videoElem!.duration! > 0)
Positioned(
right: 10,
bottom: 10,
child: Text(
MessageUtils.formatVideoTime(widget
.message.videoElem!.duration!)
.toString(),
style: const TextStyle(
color: Colors.white, fontSize: 12))),
MessageUtils.formatVideoTime(widget.message.videoElem!.duration!).toString(),
style: const TextStyle(color: Colors.white, fontSize: 12))),
],
));
}),

View File

@ -4,9 +4,12 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:better_player_plus/better_player_plus.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
@ -83,9 +86,9 @@ class TIMUIKitVideoPlayerState extends State<TIMUIKitVideoPlayer> {
enableProgressBar: true,
enableProgressText: true,
showControlsOnInitialize: false,
enableMute:false,
enableOverflowMenu:false,
enableSkips:false,
enableMute: false,
enableOverflowMenu: false,
enableSkips: false,
),
);
@ -95,8 +98,7 @@ class TIMUIKitVideoPlayerState extends State<TIMUIKitVideoPlayer> {
);
if (mounted) {
setState(() {
});
setState(() {});
}
}
} catch (e) {
@ -134,13 +136,15 @@ class TIMUIKitVideoPlayerState extends State<TIMUIKitVideoPlayer> {
//
if (File(widget.message.videoElem!.videoPath!).existsSync()) {
console("video: local video path exists");
return CurrentVideoInfo(path: widget.message.videoElem!.videoPath!, type: CurrentVideoType.local, aspectRatio: aspectRatio);
return CurrentVideoInfo(
path: widget.message.videoElem!.videoPath!, type: CurrentVideoType.local, aspectRatio: aspectRatio);
}
} else if (TencentUtils.checkString(widget.message.videoElem!.localVideoUrl) != null) {
//
if (File(widget.message.videoElem!.localVideoUrl!).existsSync()) {
console("video: local url exists");
return CurrentVideoInfo(path: widget.message.videoElem!.localVideoUrl!, type: CurrentVideoType.local, aspectRatio: aspectRatio);
return CurrentVideoInfo(
path: widget.message.videoElem!.localVideoUrl!, type: CurrentVideoType.local, aspectRatio: aspectRatio);
}
} else {
// 线(todo 使 getMessageOnlineUrl )
@ -155,12 +159,15 @@ class TIMUIKitVideoPlayerState extends State<TIMUIKitVideoPlayer> {
}
}
if (!kIsWeb) {
V2TimValueCallback<V2TimMessageOnlineUrl> urlres = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: widget.message.msgID ?? "");
V2TimValueCallback<V2TimMessageOnlineUrl> urlres = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getMessageOnlineUrl(msgID: widget.message.msgID ?? "");
if (urlres.data != null) {
if (urlres.data?.videoElem != null) {
if (TencentUtils.checkString(urlres.data?.videoElem?.videoUrl) != null) {
console("view video online url ${urlres.data?.videoElem?.videoUrl}");
return CurrentVideoInfo(path: urlres.data!.videoElem!.videoUrl!, type: CurrentVideoType.online, aspectRatio: aspectRatio);
return CurrentVideoInfo(
path: urlres.data!.videoElem!.videoUrl!, type: CurrentVideoType.online, aspectRatio: aspectRatio);
}
}
}
@ -199,4 +206,4 @@ class TIMUIKitVideoPlayerState extends State<TIMUIKitVideoPlayer> {
),
);
}
}
}

View File

@ -2,8 +2,10 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_merger_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_merger_elem.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_merger_elem.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_wide_modal_operation_key.dart';
@ -81,8 +83,7 @@ class TIMUIKitMergerElemState extends TIMUIKitState<TIMUIKitMergerElem> {
_handleTap(BuildContext context, TUIChatSeparateViewModel model) async {
try {
if (widget.messageID != "") {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (isDesktopScreen) {
TUIKitWidePopup.showPopupWindow(
@ -94,9 +95,7 @@ class TIMUIKitMergerElemState extends TIMUIKitState<TIMUIKitMergerElem> {
child: (onClose) => Scrollbar(
controller: _scrollController,
child: MergerMessageScreen(
messageItemBuilder: widget.messageItemBuilder,
model: model,
msgID: widget.messageID),
messageItemBuilder: widget.messageItemBuilder, model: model, msgID: widget.messageID),
),
);
} else {
@ -104,17 +103,12 @@ class TIMUIKitMergerElemState extends TIMUIKitState<TIMUIKitMergerElem> {
context,
MaterialPageRoute(
builder: (context) => MergerMessageScreen(
messageItemBuilder: widget.messageItemBuilder,
model: model,
msgID: widget.messageID),
messageItemBuilder: widget.messageItemBuilder, model: model, msgID: widget.messageID),
));
}
}
} catch (e) {
onTIMCallback(TIMCallback(
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("无法定位到原消息"),
infoCode: 6660401));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("无法定位到原消息"), infoCode: 6660401));
}
}
@ -134,12 +128,9 @@ class TIMUIKitMergerElemState extends TIMUIKitState<TIMUIKitMergerElem> {
_showJumpColor();
});
}
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return Container(
constraints: BoxConstraints(
maxWidth:
MediaQuery.of(context).size.width * (isDesktopScreen ? 0.3 : 0.6)),
constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width * (isDesktopScreen ? 0.3 : 0.6)),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
@ -221,8 +212,7 @@ class TIMUIKitMergerElemState extends TIMUIKitState<TIMUIKitMergerElem> {
fontSize: 10,
),
),
if (widget.isShowMessageReaction ?? true)
TIMUIKitMessageReactionShowPanel(message: widget.message)
if (widget.isShowMessageReaction ?? true) TIMUIKitMessageReactionShowPanel(message: widget.message)
],
),
),

View File

@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_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_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -39,8 +40,7 @@ class _AtMemberPanelState extends TIMUIKitState<AtMemberPanel> {
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme;
final chatModal = Provider.of<TUIChatSeparateViewModel>(context);
final List<V2TimGroupMemberFullInfo?> groupMemberList =
chatModal.showAtMemberList;
final List<V2TimGroupMemberFullInfo?> groupMemberList = chatModal.showAtMemberList;
final double positionX = chatModal.atPositionX;
final double positionY = chatModal.atPositionY;
final int activeIndex = chatModal.activeAtIndex;
@ -67,10 +67,7 @@ class _AtMemberPanelState extends TIMUIKitState<AtMemberPanel> {
itemBuilder: ((context, index) {
final memberItem = groupMemberList[index];
if (memberItem == null) {
return AutoScrollTag(
key: ValueKey(index),
controller: widget.atMemberPanelScroll,
index: index);
return AutoScrollTag(key: ValueKey(index), controller: widget.atMemberPanelScroll, index: index);
}
final showName = _getShowName(memberItem);
final isAtAll = memberItem.userID == "__kImSDK_MesssageAtALL__";
@ -86,11 +83,8 @@ class _AtMemberPanelState extends TIMUIKitState<AtMemberPanel> {
widget.onSelectMember(memberItem);
},
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 8, vertical: 4),
color: activeIndex == index
? theme.weakBackgroundColor
: theme.wideBackgroundColor,
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
color: activeIndex == index ? theme.weakBackgroundColor : theme.wideBackgroundColor,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
@ -98,28 +92,22 @@ class _AtMemberPanelState extends TIMUIKitState<AtMemberPanel> {
SizedBox(
height: 24,
width: 24,
child: Avatar(
faceUrl: memberItem.faceUrl ?? "",
type: 1,
showName: showName),
child: Avatar(faceUrl: memberItem.faceUrl ?? "", type: 1, showName: showName),
),
const SizedBox(
width: 8,
),
Expanded(child: Text(
isAtAll
? "$showName(${groupMemberList.length - 1})"
: showName,
Expanded(
child: Text(
isAtAll ? "$showName(${groupMemberList.length - 1})" : showName,
softWrap: false,
style: TextStyle(
fontSize: 14,
overflow: TextOverflow.ellipsis,
fontWeight: memberItem.role == 400 ||
memberItem.role == 300
fontWeight: memberItem.role == 400 || memberItem.role == 300
? FontWeight.w500
: FontWeight.normal,
color: memberItem.role == 400 ||
memberItem.role == 300
color: memberItem.role == 400 || memberItem.role == 300
? theme.primaryColor
: theme.darkTextColor),
))

View File

@ -1,11 +1,17 @@
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
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_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart';
@ -78,8 +84,7 @@ class _AtTextState extends TIMUIKitState<AtText> {
Future<V2TimValueCallback<V2GroupMemberInfoSearchResult>> searchGroupMember(
V2TimGroupMemberSearchParam searchParam) async {
final res =
await _groupServices.searchGroupMembers(searchParam: searchParam);
final res = await _groupServices.searchGroupMembers(searchParam: searchParam);
if (res.code == 0) {}
return res;
@ -105,8 +110,7 @@ class _AtTextState extends TIMUIKitState<AtText> {
}
setState(() {
searchMemberList =
isSearchTextExist(searchText) ? searchMemberList : groupMemberList;
searchMemberList = isSearchTextExist(searchText) ? searchMemberList : groupMemberList;
});
}
@ -148,8 +152,7 @@ class _AtTextState extends TIMUIKitState<AtText> {
customTopArea: PlatformUtils().isWeb
? null
: GroupMemberSearchTextField(
onTextChange: (text) =>
handleSearchGroupMembers(text, context),
onTextChange: (text) => handleSearchGroupMembers(text, context),
));
}
@ -196,7 +199,7 @@ class _AtTextState extends TIMUIKitState<AtText> {
_submitAtMemberList();
},
child: Text(
TIM_t("确定"),
TIM_t("确定"),
style: TextStyle(
color: theme.appbarTextColor,
fontSize: 14,

View File

@ -2,10 +2,14 @@ import 'package:flutter/material.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_filter_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.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_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
@ -56,16 +60,13 @@ class _SelectCallInviterState extends TIMUIKitState<SelectCallInviter> {
return searchText != null && searchText != "";
}
Future<void> _loadGroupMemberList(
{required String groupID, int count = 100, String? seq}) async {
Future<void> _loadGroupMemberList({required String groupID, int count = 100, String? seq}) async {
if (seq == null || seq == "" || seq == "0") {
_groupMemberList = [];
}
final String? nextSeq = await _loadGroupMemberListFunction(
groupID: groupID, seq: seq, count: count);
final String? nextSeq = await _loadGroupMemberListFunction(groupID: groupID, seq: seq, count: count);
if (nextSeq != null && nextSeq != "0" && nextSeq != "") {
return await _loadGroupMemberList(
groupID: groupID, count: count, seq: nextSeq);
return await _loadGroupMemberList(groupID: groupID, count: count, seq: nextSeq);
} else {
setState(() {
_groupMemberList = _groupMemberList;
@ -75,8 +76,7 @@ class _SelectCallInviterState extends TIMUIKitState<SelectCallInviter> {
}
}
Future<String?> _loadGroupMemberListFunction(
{required String groupID, int count = 100, String? seq}) async {
Future<String?> _loadGroupMemberListFunction({required String groupID, int count = 100, String? seq}) async {
if (seq == "0") {
_groupMemberList?.clear();
}
@ -96,8 +96,7 @@ class _SelectCallInviterState extends TIMUIKitState<SelectCallInviter> {
Future<V2TimValueCallback<V2GroupMemberInfoSearchResult>> searchGroupMember(
V2TimGroupMemberSearchParam searchParam) async {
final res =
await _groupServices.searchGroupMembers(searchParam: searchParam);
final res = await _groupServices.searchGroupMembers(searchParam: searchParam);
if (res.code == 0) {}
return res;
@ -131,8 +130,7 @@ class _SelectCallInviterState extends TIMUIKitState<SelectCallInviter> {
}
setState(() {
loading = false;
searchMemberList =
isSearchTextExist(searchText) ? currentGroupMember : _groupMemberList;
searchMemberList = isSearchTextExist(searchText) ? currentGroupMember : _groupMemberList;
});
}
@ -146,8 +144,7 @@ class _SelectCallInviterState extends TIMUIKitState<SelectCallInviter> {
iconTheme: IconThemeData(
color: theme.appbarTextColor,
),
backgroundColor: theme.appbarBgColor ??
theme.primaryColor,
backgroundColor: theme.appbarBgColor ?? theme.primaryColor,
leading: TextButton(
onPressed: () {
Navigator.pop(context);
@ -191,12 +188,10 @@ class _SelectCallInviterState extends TIMUIKitState<SelectCallInviter> {
customTopArea: PlatformUtils().isWeb
? null
: GroupMemberSearchTextField(
onTextChange: (text) =>
handleSearchGroupMembers(text, context),
onTextChange: (text) => handleSearchGroupMembers(text, context),
),
memberList: (searchMemberList ?? [])
.where((element) =>
element?.userID != _coreServicesImpl.loginInfo.userID)
.where((element) => element?.userID != _coreServicesImpl.loginInfo.userID)
.toList(),
canSlideDelete: false,
canSelectMember: true,

View File

@ -12,7 +12,8 @@ import 'package:file_picker/file_picker.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_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_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKitTextField/tim_uikit_call_invite_list.dart';
import 'package:video_player/video_player.dart';
@ -475,14 +476,12 @@ class _MorePanelState extends TIMUIKitState<MorePanel> {
final size = await originFile!.length();
if (!isVideo) {
if (size >= MorePanelConfig.IMAGE_MAX_SIZE) {
onTIMCallback(
TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("文件大小超出了限制")));
onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("文件大小超出了限制")));
return;
}
MessageUtils.handleMessageError(
model.sendImageMessage(imagePath: originFile.path, convID: convID, convType: convType),
context);
model.sendImageMessage(imagePath: originFile.path, convID: convID, convType: convType), context);
} else {
//
_betterPlayerController.addEventsListener((event) {

View File

@ -9,9 +9,12 @@ import 'package:provider/provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -167,7 +170,11 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
baseUrl: "assets/custom_face_resource/${tccEmojiSet.name}",
isEmoji: tccEmojiSet.isEmoji,
isDefaultEmoji: true,
stickerList: tccEmojiSet.list.asMap().keys.map((idx) => CustomSticker(index: idx, name: tccEmojiSet.list[idx])).toList(),
stickerList: tccEmojiSet.list
.asMap()
.keys
.map((idx) => CustomSticker(index: idx, name: tccEmojiSet.list[idx]))
.toList(),
menuItem: CustomSticker(
index: 0,
name: tccEmojiSet.icon,
@ -181,7 +188,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
baseUrl: "assets/custom_face_resource/${qqEmojiSet.name}",
isEmoji: qqEmojiSet.isEmoji,
isDefaultEmoji: true,
stickerList: qqEmojiSet.list.asMap().keys.map((idx) => CustomSticker(index: idx, name: qqEmojiSet.list[idx])).toList(),
stickerList:
qqEmojiSet.list.asMap().keys.map((idx) => CustomSticker(index: idx, name: qqEmojiSet.list[idx])).toList(),
menuItem: CustomSticker(
index: 0,
name: qqEmojiSet.icon,
@ -192,7 +200,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
final defEmojiList = TUIKitStickerConstData.defaultUnicodeEmojiList.map((emojiItem) {
return CustomSticker(index: 0, name: emojiItem.toString(), unicode: emojiItem);
}).toList();
stickerPackageList.add(CustomStickerPackage(name: "defaultEmoji", stickerList: defEmojiList, menuItem: defEmojiList[0]));
stickerPackageList
.add(CustomStickerPackage(name: "defaultEmoji", stickerList: defEmojiList, menuItem: defEmojiList[0]));
}
stickerPackageList.addAll(stickerConfig.customStickerPackages);
@ -242,7 +251,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
textEditingController.text = text;
if (TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop) {
textEditingController.selection = TextSelection.fromPosition(TextPosition(offset: currentCursor ?? textEditingController.text.length));
textEditingController.selection =
TextSelection.fromPosition(TextPosition(offset: currentCursor ?? textEditingController.text.length));
focusNode.requestFocus();
}
}
@ -273,7 +283,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
}
if (TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop) {
textEditingController.selection = TextSelection.fromPosition(TextPosition(offset: currentCursor ?? textEditingController.text.length));
textEditingController.selection =
TextSelection.fromPosition(TextPosition(offset: currentCursor ?? textEditingController.text.length));
focusNode.requestFocus();
}
}
@ -286,9 +297,18 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
String text = textEditingController.text;
String convID = id ?? widget.conversationID;
final isTopic = convID.contains("@TOPIC#");
String conversationID = isTopic ? convID : ((convType ?? widget.conversationType) == ConvType.c2c ? "${TUIConversationViewModel.conversationC2CPrefix}$convID" : "${TUIConversationViewModel.conversationGroupPrefix}$convID");
String conversationID = isTopic
? convID
: ((convType ?? widget.conversationType) == ConvType.c2c
? "${TUIConversationViewModel.conversationC2CPrefix}$convID"
: "${TUIConversationViewModel.conversationGroupPrefix}$convID");
String draftText = _filterU200b(text);
return await conversationModel.setConversationDraft(groupID: groupID ?? widget.groupID, isTopic: isTopic, isAllowWeb: widget.model.chatConfig.isUseDraftOnWeb, conversationID: conversationID, draftText: draftText);
return await conversationModel.setConversationDraft(
groupID: groupID ?? widget.groupID,
isTopic: isTopic,
isAllowWeb: widget.model.chatConfig.isUseDraftOnWeb,
conversationID: conversationID,
draftText: draftText);
}
// onSubmitted一样
@ -346,9 +366,13 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
}
if (widget.model.repliedMessage != null) {
MessageUtils.handleMessageError(widget.model.sendFaceMessage(index: groupID, data: data, convID: widget.conversationID, convType: convType), context);
MessageUtils.handleMessageError(
widget.model.sendFaceMessage(index: groupID, data: data, convID: widget.conversationID, convType: convType),
context);
} else {
MessageUtils.handleMessageError(widget.model.sendFaceMessage(index: groupID, data: data, convID: widget.conversationID, convType: convType), context);
MessageUtils.handleMessageError(
widget.model.sendFaceMessage(index: groupID, data: data, convID: widget.conversationID, convType: convType),
context);
}
}
@ -368,11 +392,22 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
final convType = widget.conversationType;
if (text.isNotEmpty && text != zeroWidthSpace) {
if (widget.model.repliedMessage != null) {
MessageUtils.handleMessageError(widget.model.sendReplyMessage(text: text, convID: widget.conversationID, convType: convType, atUserIDList: getUserIdFromMemberInfoMap()), context);
MessageUtils.handleMessageError(
widget.model.sendReplyMessage(
text: text,
convID: widget.conversationID,
convType: convType,
atUserIDList: getUserIdFromMemberInfoMap()),
context);
} else if (mentionedMembersMap.isNotEmpty) {
widget.model.sendTextAtMessage(text: text, convType: widget.conversationType, convID: widget.conversationID, atUserList: getUserIdFromMemberInfoMap());
widget.model.sendTextAtMessage(
text: text,
convType: widget.conversationType,
convID: widget.conversationID,
atUserList: getUserIdFromMemberInfoMap());
} else {
MessageUtils.handleMessageError(widget.model.sendTextMessage(text: text, convID: widget.conversationID, convType: convType), context);
MessageUtils.handleMessageError(
widget.model.sendTextMessage(text: text, convID: widget.conversationID, convType: convType), context);
}
textEditingController.clear();
currentCursor = null;
@ -414,7 +449,10 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
}
String _getShowName(V2TimGroupMemberFullInfo? item) {
return TencentUtils.checkStringWithoutSpace(item?.nameCard) ?? TencentUtils.checkStringWithoutSpace(item?.nickName) ?? TencentUtils.checkStringWithoutSpace(item?.userID) ?? "";
return TencentUtils.checkStringWithoutSpace(item?.nameCard) ??
TencentUtils.checkStringWithoutSpace(item?.nickName) ??
TencentUtils.checkStringWithoutSpace(item?.userID) ??
"";
}
mentionMemberInMessage(String? userID, String? nickName) {
@ -558,10 +596,10 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
}
final int selfRole = widget.model.selfMemberInfo?.role ?? 0;
final bool canAtAll = widget.model.chatConfig.isMemberCanAtAll ? true : (selfRole == GroupMemberRoleType
.V2TIM_GROUP_MEMBER_ROLE_ADMIN || selfRole
==
GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER);
final bool canAtAll = widget.model.chatConfig.isMemberCanAtAll
? true
: (selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN ||
selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER);
if (isDesktopScreen) {
(int, String, bool)? changedCharacterRecord = findChangedCharacter(originalText, text);
@ -598,7 +636,10 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
"")
.toLowerCase();
keyword ??= "";
return element != null && showName.contains(keyword!.toLowerCase()) && TencentUtils.checkString(showName) != null && element.userID != widget.model.selfMemberInfo?.userID;
return element != null &&
showName.contains(keyword!.toLowerCase()) &&
TencentUtils.checkString(showName) != null &&
element.userID != widget.model.selfMemberInfo?.userID;
})
.whereType<V2TimGroupMemberFullInfo>()
.toList();
@ -626,7 +667,10 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
keyword ??= "";
if (canAtAll && showAtMemberList.isNotEmpty && keyword!.isEmpty) {
showAtMemberList = [V2TimGroupMemberFullInfo(userID: "__kImSDK_MesssageAtALL__", nickName: TIM_t("所有人")), ...showAtMemberList];
showAtMemberList = [
V2TimGroupMemberFullInfo(userID: "__kImSDK_MesssageAtALL__", nickName: TIM_t("所有人")),
...showAtMemberList
];
}
model.activeAtIndex = 0;
@ -642,7 +686,12 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
List<V2TimGroupMemberFullInfo> selectedAtMemberList = await Navigator.push(
context,
MaterialPageRoute(
builder: (context) => AtText(groupMemberList: model.groupMemberList, groupInfo: model.groupInfo, groupID: groupID, canAtAll: canAtAll, groupType: widget.groupType),
builder: (context) => AtText(
groupMemberList: model.groupMemberList,
groupInfo: model.groupInfo,
groupID: groupID,
canAtAll: canAtAll,
groupType: widget.groupType),
),
);
@ -687,14 +736,16 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
KeyEventResult handleDesktopKeyEvent(FocusNode node, RawKeyEvent event) {
final activeIndex = widget.model.activeAtIndex;
final showMemberList = widget.model.showAtMemberList;
final isPressEnter = (event.physicalKey == PhysicalKeyboardKey.enter) || (event.physicalKey == PhysicalKeyboardKey.numpadEnter);
final isPressEnter =
(event.physicalKey == PhysicalKeyboardKey.enter) || (event.physicalKey == PhysicalKeyboardKey.numpadEnter);
if (event.runtimeType == RawKeyDownEvent) {
if (event.physicalKey == PhysicalKeyboardKey.backspace) {
if (textEditingController.text.isEmpty && lastText.isEmpty) {
widget.model.repliedMessage = null;
return KeyEventResult.handled;
}
} else if ((event.isShiftPressed || event.isAltPressed || event.isControlPressed || event.isMetaPressed) && isPressEnter) {
} else if ((event.isShiftPressed || event.isAltPressed || event.isControlPressed || event.isMetaPressed) &&
isPressEnter) {
final offset = textEditingController.selection.baseOffset;
textEditingController.text = '${lastText.substring(0, offset)}\n${lastText.substring(offset)}';
textEditingController.selection = TextSelection.fromPosition(TextPosition(offset: offset + 1));
@ -766,7 +817,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
} else if (actionType == ActionType.setTextField) {
final newText = widget.controller?.inputText ?? "";
textEditingController.text = newText;
textEditingController.selection = TextSelection.fromPosition(TextPosition(offset: textEditingController.text.length));
textEditingController.selection =
TextSelection.fromPosition(TextPosition(offset: textEditingController.text.length));
lastText = textEditingController.text;
focusNode.requestFocus();
return;
@ -784,7 +836,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
super.didUpdateWidget(oldWidget);
if (widget.conversationID != oldWidget.conversationID) {
mentionedMembersMap.clear();
handleSetDraftText(id: oldWidget.conversationID, convType: oldWidget.conversationType, groupID: oldWidget.groupID);
handleSetDraftText(
id: oldWidget.conversationID, convType: oldWidget.conversationType, groupID: oldWidget.groupID);
if (oldWidget.initText != widget.initText) {
textEditingController.text = widget.initText ?? "";
} else {
@ -810,7 +863,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
Future<bool> getMemberMuteStatus(String userID) async {
// Get the mute state of the members recursively
if (widget.model.groupMemberList?.any((item) => (item?.userID == userID)) ?? false) {
final int muteUntil = widget.model.groupMemberList?.firstWhere((item) => (item?.userID == userID))?.muteUntil ?? 0;
final int muteUntil =
widget.model.groupMemberList?.firstWhere((item) => (item?.userID == userID))?.muteUntil ?? 0;
return muteUntil * 1000 > DateTime.now().millisecondsSinceEpoch;
} else {
return false;
@ -823,7 +877,8 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
}
final int selfRole = widget.model.selfMemberInfo?.role ?? 0;
final bool willNotBeenMuted = (selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN || selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER);
final bool willNotBeenMuted = (selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN ||
selfRole == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER);
if (widget.conversationType == ConvType.group && !willNotBeenMuted) {
if ((model.groupInfo?.isAllMuted ?? false) && muteStatus != MuteStatus.all) {
@ -832,13 +887,17 @@ class _InputTextFieldState extends TIMUIKitState<TIMUIKitInputTextField> {
muteStatus = MuteStatus.all;
});
});
} else if (selfModel.loginInfo?.userID != null && await getMemberMuteStatus(selfModel.loginInfo!.userID!) && muteStatus != MuteStatus.me) {
} else if (selfModel.loginInfo?.userID != null &&
await getMemberMuteStatus(selfModel.loginInfo!.userID!) &&
muteStatus != MuteStatus.me) {
Future.delayed(const Duration(seconds: 0), () {
setState(() {
muteStatus = MuteStatus.me;
});
});
} else if (!(model.groupInfo?.isAllMuted ?? false) && !(selfModel.loginInfo?.userID != null && await getMemberMuteStatus(selfModel.loginInfo!.userID!)) && muteStatus != MuteStatus.none) {
} else if (!(model.groupInfo?.isAllMuted ?? false) &&
!(selfModel.loginInfo?.userID != null && await getMemberMuteStatus(selfModel.loginInfo!.userID!)) &&
muteStatus != MuteStatus.none) {
Future.delayed(const Duration(seconds: 0), () {
setState(() {
muteStatus = MuteStatus.none;

View File

@ -1,13 +1,8 @@
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_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';
enum ActionType {
hideAllPanel,
longPressToAt,
setTextField,
requestFocus,
handleAtMember
}
enum ActionType { hideAllPanel, longPressToAt, setTextField, requestFocus, handleAtMember }
class TIMUIKitInputTextFieldController extends ChangeNotifier {
TextEditingController? textEditingController = TextEditingController();

View File

@ -6,7 +6,8 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_svg/svg.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -260,7 +261,10 @@ class _TIMUIKitTextFieldLayoutNarrowState extends TIMUIKitState<TIMUIKitTextFiel
}
if (showMore) {
return MorePanel(morePanelConfig: widget.morePanelConfig, conversationID: widget.conversationID, conversationType: widget.conversationType);
return MorePanel(
morePanelConfig: widget.morePanelConfig,
conversationID: widget.conversationID,
conversationType: widget.conversationType);
}
return const SizedBox(height: 0);
@ -335,7 +339,8 @@ class _TIMUIKitTextFieldLayoutNarrowState extends TIMUIKitState<TIMUIKitTextFiel
}
String getAbstractMessage(V2TimMessage message) {
final String? customAbstractMessage = widget.model.abstractMessageBuilder != null ? widget.model.abstractMessageBuilder!(message) : null;
final String? customAbstractMessage =
widget.model.abstractMessageBuilder != null ? widget.model.abstractMessageBuilder!(message) : null;
return customAbstractMessage ?? MessageUtils.getAbstractMessageAsync(message, widget.model.groupMemberList ?? []);
}
@ -454,17 +459,19 @@ class _TIMUIKitTextFieldLayoutNarrowState extends TIMUIKitState<TIMUIKitTextFiel
width: 28,
),
),
const SizedBox(
width: 10,
),
Expanded(
child: showSendSoundText
? SendSoundMessage(onDownBottom: widget.goDownBottom, conversationID: widget.conversationID, conversationType: widget.conversationType)
: Stack(
children: [
Center(
child: KeyboardVisibility(
child: ExtendedTextField(
const SizedBox(
width: 10,
),
Expanded(
child: showSendSoundText
? SendSoundMessage(
onDownBottom: widget.goDownBottom,
conversationID: widget.conversationID,
conversationType: widget.conversationType)
: Stack(children: [
Center(
child: KeyboardVisibility(
child: ExtendedTextField(
maxLines: 4,
minLines: 1,
focusNode: widget.focusNode,
@ -478,7 +485,9 @@ class _TIMUIKitTextFieldLayoutNarrowState extends TIMUIKitState<TIMUIKitTextFiel
});
},
keyboardType: TextInputType.multiline,
textInputAction: PlatformUtils().isAndroid ? TextInputAction.newline : TextInputAction.send,
textInputAction: PlatformUtils().isAndroid
? TextInputAction.newline
: TextInputAction.send,
onEditingComplete: () {
widget.onSubmitted();
if (showKeyboard) {
@ -505,38 +514,47 @@ class _TIMUIKitTextFieldLayoutNarrowState extends TIMUIKitState<TIMUIKitTextFiel
specialTextSpanBuilder: PlatformUtils().isWeb
? null
: DefaultSpecialTextSpanBuilder(
isUseQQPackage: widget.model.chatConfig.stickerPanelConfig?.useQQStickerPackage ?? true,
isUseTencentCloudChatPackage: widget.model.chatConfig.stickerPanelConfig?.useTencentCloudChatStickerPackage ?? true,
isUseTencentCloudChatPackageOldKeys: widget.model.chatConfig.stickerPanelConfig?.useTencentCloudChatStickerPackageOldKeys ?? false,
isUseQQPackage:
widget.model.chatConfig.stickerPanelConfig?.useQQStickerPackage ??
true,
isUseTencentCloudChatPackage: widget.model.chatConfig
.stickerPanelConfig?.useTencentCloudChatStickerPackage ??
true,
isUseTencentCloudChatPackageOldKeys: widget
.model
.chatConfig
.stickerPanelConfig
?.useTencentCloudChatStickerPackageOldKeys ??
false,
customEmojiStickerList: widget.customEmojiStickerList,
showAtBackground: true,
checkHttpLink: false,
)),
onChanged: (bool visibility) {
if (showKeyboard != visibility) {
setState(() {
showKeyboard = visibility;
});
}
}),
),
RawKeyboardListener(
autofocus: true,
focusNode: FocusNode(),
onKey: (key) {
if (key is RawKeyDownEvent && key.logicalKey == LogicalKeyboardKey.backspace) {
if (widget.onDeleteText != null) {
widget.onDeleteText!(widget.textEditingController.text);
}
onChanged: (bool visibility) {
if (showKeyboard != visibility) {
setState(() {
showKeyboard = visibility;
});
}
}, child: Container(),
),
]
}),
),
),
const SizedBox(
width: 10,
),
RawKeyboardListener(
autofocus: true,
focusNode: FocusNode(),
onKey: (key) {
if (key is RawKeyDownEvent && key.logicalKey == LogicalKeyboardKey.backspace) {
if (widget.onDeleteText != null) {
widget.onDeleteText!(widget.textEditingController.text);
}
}
},
child: Container(),
),
]),
),
const SizedBox(
width: 10,
),
if (widget.showSendEmoji)
InkWell(
onTap: () {
@ -544,7 +562,8 @@ class _TIMUIKitTextFieldLayoutNarrowState extends TIMUIKitState<TIMUIKitTextFiel
widget.goDownBottom();
},
child: PlatformUtils().isWeb
? Icon(showEmojiPanel ? Icons.keyboard_alt_outlined : Icons.mood_outlined, color: hexToColor("5c6168"), size: 32)
? Icon(showEmojiPanel ? Icons.keyboard_alt_outlined : Icons.mood_outlined,
color: hexToColor("5c6168"), size: 32)
: SvgPicture.asset(
showEmojiPanel ? 'images/keyboard.svg' : 'images/face.svg',
package: 'tencent_cloud_chat_uikit',
@ -553,9 +572,9 @@ class _TIMUIKitTextFieldLayoutNarrowState extends TIMUIKitState<TIMUIKitTextFiel
width: 28,
),
),
const SizedBox(
width: 10,
),
const SizedBox(
width: 10,
),
if (widget.showMorePanel && showMoreButton)
InkWell(
onTap: () {

View File

@ -17,8 +17,10 @@ import 'package:pasteboard/pasteboard.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -933,56 +935,55 @@ class _TIMUIKitTextFieldLayoutWideState extends TIMUIKitState<TIMUIKitTextFieldL
children: [
_buildRepliedMessage(widget.repliedMessage),
SizedBox(height: 1, child: Container(color: theme.weakDividerColor ?? Colors.black12)),
Container(
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: generateControlBar(widget.model, theme),
),
Container(
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 12),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: generateControlBar(widget.model, theme),
),
),
Container(
padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 6),
constraints: const BoxConstraints(minHeight: 50),
child: Row(
children: [
Expanded(
child: ExtendedTextField(
scrollController: _scrollController,
autofocus: true,
maxLines: widget.chatConfig.desktopMessageInputFieldLines,
minLines: widget.chatConfig.desktopMessageInputFieldLines,
focusNode: widget.focusNode,
onChanged: debounceFunc,
keyboardType: TextInputType.multiline,
onEditingComplete: () {
// // widget.onSubmitted();
},
textAlignVertical: TextAlignVertical.top,
style: const TextStyle(fontSize: 14),
decoration: InputDecoration(
hoverColor: Colors.transparent,
border: InputBorder.none,
hintStyle: const TextStyle(
color: Color(0xffAEA4A3),
),
fillColor: widget.backgroundColor ??
theme.desktopChatMessageInputBgColor ??
hexToColor("fafafa"),
filled: true,
isDense: true,
hintText: widget.hintText ?? '',
Expanded(
child: ExtendedTextField(
scrollController: _scrollController,
autofocus: true,
maxLines: widget.chatConfig.desktopMessageInputFieldLines,
minLines: widget.chatConfig.desktopMessageInputFieldLines,
focusNode: widget.focusNode,
onChanged: debounceFunc,
keyboardType: TextInputType.multiline,
onEditingComplete: () {
// // widget.onSubmitted();
},
textAlignVertical: TextAlignVertical.top,
style: const TextStyle(fontSize: 14),
decoration: InputDecoration(
hoverColor: Colors.transparent,
border: InputBorder.none,
hintStyle: const TextStyle(
color: Color(0xffAEA4A3),
),
controller: widget.textEditingController,
specialTextSpanBuilder: PlatformUtils().isWeb
? null
: DefaultSpecialTextSpanBuilder(
isUseTencentCloudChatPackage:
widget.model.chatConfig.stickerPanelConfig?.useTencentCloudChatStickerPackage ??
true,
customEmojiStickerList: widget.customEmojiStickerList,
showAtBackground: true,
)),
),
fillColor:
widget.backgroundColor ?? theme.desktopChatMessageInputBgColor ?? hexToColor("fafafa"),
filled: true,
isDense: true,
hintText: widget.hintText ?? '',
),
controller: widget.textEditingController,
specialTextSpanBuilder: PlatformUtils().isWeb
? null
: DefaultSpecialTextSpanBuilder(
isUseTencentCloudChatPackage:
widget.model.chatConfig.stickerPanelConfig?.useTencentCloudChatStickerPackage ??
true,
customEmojiStickerList: widget.customEmojiStickerList,
showAtBackground: true,
)),
),
],
),
),

View File

@ -7,11 +7,16 @@ import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_at_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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -74,7 +79,8 @@ class TIMUIKitChat extends StatefulWidget {
/// Avatar and name in message reaction secondary tap callback.
final void Function(String userID, TapDownDetails tapDetails)? onSecondaryTapAvatar;
@Deprecated("Nickname will not shows in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
@Deprecated(
"Nickname will not shows in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
/// Should show the nick name.
final bool showNickName;
@ -86,10 +92,12 @@ class TIMUIKitChat extends StatefulWidget {
final bool showTotalUnReadCount;
/// Deprecated("Please use [extraTipsActionItemBuilder] instead")
final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])? exteraTipsActionItemBuilder;
final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])?
exteraTipsActionItemBuilder;
/// The builder for extra tips action.
final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])? extraTipsActionItemBuilder;
final Widget? Function(V2TimMessage message, Function() closeTooltip, [Key? key, BuildContext? context])?
extraTipsActionItemBuilder;
/// The text of draft shows in TextField.
/// [Recommend]: You can specify this field with the draftText from V2TimConversation.
@ -180,7 +188,9 @@ class TIMUIKitChat extends StatefulWidget {
this.conversationShowName,
this.abstractMessageBuilder,
this.onTapAvatar,
@Deprecated("Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead") this.showNickName = false,
@Deprecated(
"Nickname will not show in one-to-one chat, if you tend to control it in group chat, please use `isShowSelfNameInGroup` and `isShowOthersNameInGroup` from `config: TIMUIKitChatConfig` instead")
this.showNickName = false,
this.showTotalUnReadCount = false,
this.messageItemBuilder,
@Deprecated("Please use [extraTipsActionItemBuilder] instead") this.exteraTipsActionItemBuilder,
@ -301,7 +311,9 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
updateDraft() async {
final isTopic = widget.conversation.conversationID.contains("@TOPIC#");
if (isTopic) {
final topicInfoList = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getTopicInfoList(groupID: widget.groupID!, topicIDList: [widget.conversation.conversationID]);
final topicInfoList = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getTopicInfoList(groupID: widget.groupID!, topicIDList: [widget.conversation.conversationID]);
final topicInfo = topicInfoList.data?.first.topicInfo;
final draftText = topicInfo?.draftText;
if (TencentUtils.checkString(draftText) != null) {
@ -349,7 +361,9 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
}
String _getConvID() {
return TencentUtils.checkString(widget.conversationID) ?? (widget.conversation.type == 1 ? widget.conversation.userID : widget.conversation.groupID) ?? "";
return TencentUtils.checkString(widget.conversationID) ??
(widget.conversation.type == 1 ? widget.conversation.userID : widget.conversation.groupID) ??
"";
}
ConvType _getConvType() {
@ -361,8 +375,7 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
return;
}
final w = await TUICore.instance.raiseExtension(TUIExtensionID.joinInGroup, {GROUP_ID: widget.conversationID!});
if(w != _joinInGroupCallWidget){
if (w != _joinInGroupCallWidget) {
setState(() {
_joinInGroupCallWidget = w;
});
@ -424,9 +437,16 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
}
List<CustomEmojiFaceData> customImageSmallPngEmojiPackages = [];
if (widget.config?.stickerPanelConfig?.customStickerPackages != null && widget.config!.stickerPanelConfig!.customStickerPackages.isNotEmpty) {
customImageSmallPngEmojiPackages = widget.config!.stickerPanelConfig!.customStickerPackages.where((element) => element.isEmoji == true).map((e) {
return CustomEmojiFaceData(name: e.name, isEmoji: true, icon: e.menuItem.url ?? "", list: e.stickerList.map((e) => e.url ?? "").toList());
if (widget.config?.stickerPanelConfig?.customStickerPackages != null &&
widget.config!.stickerPanelConfig!.customStickerPackages.isNotEmpty) {
customImageSmallPngEmojiPackages = widget.config!.stickerPanelConfig!.customStickerPackages
.where((element) => element.isEmoji == true)
.map((e) {
return CustomEmojiFaceData(
name: e.name,
isEmoji: true,
icon: e.menuItem.url ?? "",
list: e.stickerList.map((e) => e.url ?? "").toList());
}).toList();
}
if (customImageSmallPngEmojiPackages.isEmpty) {
@ -452,7 +472,13 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
onDragDone: (detail) {
setState(() {
_dragging = false;
sendFileWithConfirmation(files: detail.files, conversation: widget.conversation, conversationType: _getConvType(), model: model, theme: theme, context: context);
sendFileWithConfirmation(
files: detail.files,
conversation: widget.conversation,
conversationType: _getConvType(),
model: model,
theme: theme,
context: context);
});
},
onDragEntered: (detail) {
@ -471,7 +497,8 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (widget.customAppBar != null) widget.customAppBar!,
if (filteredApplicationList.isNotEmpty) _renderJoinGroupApplication(filteredApplicationList.length, theme),
if (filteredApplicationList.isNotEmpty)
_renderJoinGroupApplication(filteredApplicationList.length, theme),
if (widget.topFixWidget != null) widget.topFixWidget!,
if (_joinInGroupCallWidget != null) Center(child: _joinInGroupCallWidget!),
Expanded(
@ -484,7 +511,8 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
child: TIMUIKitHistoryMessageListContainer(
customMessageHoverBarOnDesktop: widget.customMessageHoverBarOnDesktop,
conversation: widget.conversation,
groupMemberInfo: model.groupMemberList?.firstWhere((element) => element?.userID == selfUserID, orElse: () => null),
groupMemberInfo: model.groupMemberList
?.firstWhere((element) => element?.userID == selfUserID, orElse: () => null),
textFieldController: textFieldController,
customEmojiStickerList: widget.customEmojiStickerList,
key: listContainerKey,
@ -498,7 +526,8 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
},
mainHistoryListConfig: widget.mainHistoryListConfig,
initFindingMsg: widget.initFindingMsg,
extraTipsActionItemBuilder: widget.extraTipsActionItemBuilder ?? widget.exteraTipsActionItemBuilder,
extraTipsActionItemBuilder:
widget.extraTipsActionItemBuilder ?? widget.exteraTipsActionItemBuilder,
conversationType: _getConvType(),
scrollController: autoController,
onSecondaryTapAvatar: widget.onSecondaryTapAvatar,
@ -535,7 +564,8 @@ class _TUIChatState extends TIMUIKitState<TIMUIKitChat> {
conversationType: _getConvType(),
initText: TencentUtils.checkString(widget.draftText) ??
(PlatformUtils().isWeb
? TencentUtils.checkString(conversationViewModel.getWebDraft(conversationID: widget.conversation.conversationID))
? TencentUtils.checkString(conversationViewModel.getWebDraft(
conversationID: widget.conversation.conversationID))
: TencentUtils.checkString(widget.conversation.draftText)),
hintText: widget.textFieldHintText,
showMorePanel: widget.config?.isAllowShowMorePanel ?? true,
@ -644,7 +674,8 @@ class TIMUIKitChatProviderScope extends StatelessWidget {
preGroupMemberList: groupMemberList,
groupID: groupID,
);
model?.showC2cMessageEditStatus = (conversationType == ConvType.c2c ? config?.showC2cMessageEditStatus ?? true : false);
model?.showC2cMessageEditStatus =
(conversationType == ConvType.c2c ? config?.showC2cMessageEditStatus ?? true : false);
loadData();
}

View File

@ -1,5 +1,6 @@
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
@ -130,8 +131,7 @@ class TIMUIKitChatConfig {
/// Configuration for offline push.
/// If this field is specified, `notificationTitle`, `notificationOPPOChannelID`, `notificationIOSSound`, `notificationAndroidSound`, `notificationBody` and `notificationExt` will not work.
final OfflinePushInfo? Function(
V2TimMessage message, String convID, ConvType convType)? offlinePushInfo;
final OfflinePushInfo? Function(V2TimMessage message, String convID, ConvType convType)? offlinePushInfo;
/// The title shows in push notification
final String notificationTitle;
@ -151,13 +151,11 @@ class TIMUIKitChatConfig {
/// The body content shows in push notification.
/// Returning `null` means using default body in this case.
final String? Function(
V2TimMessage message, String convID, ConvType convType)? notificationBody;
final String? Function(V2TimMessage message, String convID, ConvType convType)? notificationBody;
/// External information (String) for notification message, recommend used for jumping to target conversation with JSON format,
/// Returning `null` means using default ext in this case.
final String? Function(
V2TimMessage message, String convID, ConvType convType)? notificationExt;
final String? Function(V2TimMessage message, String convID, ConvType convType)? notificationExt;
/// The type of URL preview level, none preview, only hyperlink in text, or shows a preview card for website.
/// [Default]: UrlPreviewType.previewCardAndHyperlink.
@ -277,10 +275,9 @@ class TIMUIKitChatConfig {
this.isUseMessageReaction = true,
this.isShowAvatar = true,
this.isShowSelfNameInGroup = false,
this.isAtWhenReplyDynamic,
this.isAtWhenReplyDynamic,
this.offlinePushInfo,
@Deprecated("Please use [isShowReadingStatus] instead")
this.isShowGroupMessageReadReceipt = true,
@Deprecated("Please use [isShowReadingStatus] instead") this.isShowGroupMessageReadReceipt = true,
this.upperRecallTime = 120,
this.isShowOthersNameInGroup = true,
this.urlPreviewType = UrlPreviewType.onlyHyperlink,
@ -289,10 +286,8 @@ class TIMUIKitChatConfig {
this.notificationTitle = "",
this.notificationIOSSound = "",
this.isAllowSoundMessage = true,
@Deprecated("not support")
this.groupReadReceiptPermisionList,
@Deprecated("not support")
this.groupReadReceiptPermissionList,
@Deprecated("not support") this.groupReadReceiptPermisionList,
@Deprecated("not support") this.groupReadReceiptPermissionList,
this.isAllowEmojiPanel = true,
this.isAllowShowMorePanel = true,
this.isShowReadingStatus = true,
@ -303,8 +298,7 @@ class TIMUIKitChatConfig {
this.isEnableTextSelection,
this.additionalDesktopMessageHoverBarItem,
this.isShowGroupReadingStatus = true,
@Deprecated("Please use [isShowReadingStatus] instead")
this.isReportGroupReadingStatus = true,
@Deprecated("Please use [isShowReadingStatus] instead") this.isReportGroupReadingStatus = true,
this.showC2cMessageEditStatus = true,
this.additionalDesktopControlBarItems,
this.isAllowLongPressAvatarToAt = true,

View File

@ -2,7 +2,8 @@ import 'dart:io';
import 'package:dotted_border/dotted_border.dart';
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_separate_view_model.dart';
@ -18,10 +19,7 @@ import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
import 'TIMUIKitMessageItem/tim_uikit_chat_file_icon.dart';
String _getConvID(V2TimConversation conversation) {
return (conversation.type == 1
? conversation.userID
: conversation.groupID) ??
"";
return (conversation.type == 1 ? conversation.userID : conversation.groupID) ?? "";
}
sendFileWithConfirmation(
@ -65,8 +63,7 @@ sendFileWithConfirmation(
return;
}
final option1 = conversation.showName ??
(conversationType == ConvType.group ? TIM_t("群聊") : TIM_t("对方"));
final option1 = conversation.showName ?? (conversationType == ConvType.group ? TIM_t("群聊") : TIM_t("对方"));
TUIKitWidePopup.showPopupWindow(
operationKey: TUIKitWideModalOperationKey.beforeSendScreenShot,
context: context,
@ -85,9 +82,7 @@ sendFileWithConfirmation(
child: ListView.separated(
itemBuilder: (BuildContext context, int index) {
final file = files[index];
final fileName = PlatformUtils().isWeb
? file.name
: path.basename(file.path);
final fileName = PlatformUtils().isWeb ? file.name : path.basename(file.path);
return Material(
color: theme.wideBackgroundColor,
child: InkWell(
@ -95,22 +90,18 @@ sendFileWithConfirmation(
launchUrl(Uri.file(file.path));
},
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 6, horizontal: 20),
padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 20),
child: Row(
children: [
TIMUIKitFileIcon(
size: 44,
fileFormat: fileName.split(
".")[fileName.split(".").length - 1],
fileFormat: fileName.split(".")[fileName.split(".").length - 1],
),
const SizedBox(width: 16),
Expanded(
child: Text(
fileName,
style: TextStyle(
fontSize: 16,
color: theme.darkTextColor),
style: TextStyle(fontSize: 16, color: theme.darkTextColor),
),
),
],
@ -146,8 +137,7 @@ sendFileWithConfirmation(
),
ElevatedButton(
onPressed: () {
sendFiles(files, model, conversation,
conversationType, context);
sendFiles(files, model, conversation, conversationType, context);
closeFunc();
},
child: Text(TIM_t("发送")))
@ -159,21 +149,14 @@ sendFileWithConfirmation(
));
}
Future<void> sendFiles(
List<XFile> files,
TUIChatSeparateViewModel model,
V2TimConversation conversation,
ConvType conversationType,
BuildContext context) async {
Future<void> sendFiles(List<XFile> files, TUIChatSeparateViewModel model, V2TimConversation conversation,
ConvType conversationType, BuildContext context) async {
for (final file in files) {
final fileName = file.name;
final filePath = file.path;
await MessageUtils.handleMessageError(
model.sendFileMessage(
fileName: fileName,
filePath: filePath,
convID: _getConvID(conversation),
convType: conversationType),
fileName: fileName, filePath: filePath, convID: _getConvID(conversation), convType: conversationType),
context);
await Future.delayed(const Duration(microseconds: 300));
}
@ -188,8 +171,7 @@ class TIMUIKitSendFile extends TIMUIKitStatelessWidget {
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme;
final conversationType = conversation.type;
final option1 = conversation.showName ??
(conversationType == 2 ? TIM_t("群聊") : TIM_t("会话"));
final option1 = conversation.showName ?? (conversationType == 2 ? TIM_t("群聊") : TIM_t("会话"));
return Row(
mainAxisSize: MainAxisSize.max,
@ -222,12 +204,8 @@ class TIMUIKitSendFile extends TIMUIKitStatelessWidget {
height: 40,
),
Text(
TIM_t_para("发送给{{option1}}", "发送给$option1")(
option1: option1),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: theme.darkTextColor),
TIM_t_para("发送给{{option1}}", "发送给$option1")(option1: option1),
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: theme.darkTextColor),
)
],
))

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/friend_list_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart';
@ -48,7 +49,6 @@ class _TIMUIKitContactState extends TIMUIKitState<TIMUIKitContact> {
final TUIFriendShipViewModel model = serviceLocator<TUIFriendShipViewModel>();
String currentItem = "";
@override
void dispose() {
super.dispose();
@ -72,13 +72,13 @@ class _TIMUIKitContactState extends TIMUIKitState<TIMUIKitContact> {
emptyBuilder: widget.emptyBuilder,
isShowOnlineStatus: widget.isShowOnlineStatus,
contactList: memberList,
onTapItem: (item){
if(isDesktopScreen){
onTapItem: (item) {
if (isDesktopScreen) {
setState(() {
currentItem = item.userID;
});
}
if(widget.onTapItem != null){
if (widget.onTapItem != null) {
widget.onTapItem!(item);
}
},

View File

@ -6,8 +6,10 @@ import 'package:flutter_slidable_plus_plus/flutter_slidable_plus_plus.dart';
import 'package:provider/provider.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
@ -32,7 +34,8 @@ typedef ConversationItemBuilder = Widget Function(V2TimConversation conversation
typedef ConversationItemSlideBuilder = List<ConversationItemSlidePanel> Function(V2TimConversation conversationItem);
typedef ConversationItemSecondaryMenuBuilder = Widget Function(V2TimConversation conversationItem, VoidCallback onClose);
typedef ConversationItemSecondaryMenuBuilder = Widget Function(
V2TimConversation conversationItem, VoidCallback onClose);
class TIMUIKitConversation extends StatefulWidget {
/// the callback after clicking conversation item
@ -178,7 +181,8 @@ class _TIMUIKitConversationState extends TIMUIKitState<TIMUIKitConversation> {
}
_pinConversation(V2TimConversation conversation) {
_timuiKitConversationController.pinConversation(conversationID: conversation.conversationID, isPinned: !conversation.isPinned!);
_timuiKitConversationController.pinConversation(
conversationID: conversation.conversationID, isPinned: !conversation.isPinned!);
}
_deleteConversation(V2TimConversation conversation) {
@ -186,7 +190,8 @@ class _TIMUIKitConversationState extends TIMUIKitState<TIMUIKitConversation> {
}
List<V2TimConversation?> getFilteredConversation() {
List<V2TimConversation?> filteredConversationList = model.conversationList.where((element) => (element?.groupID != null || element?.userID != null)).toList();
List<V2TimConversation?> filteredConversationList =
model.conversationList.where((element) => (element?.groupID != null || element?.userID != null)).toList();
if (widget.conversationCollector != null) {
filteredConversationList = filteredConversationList.where(widget.conversationCollector!).toList();
}
@ -300,7 +305,8 @@ class _TIMUIKitConversationState extends TIMUIKitState<TIMUIKitConversation> {
providers: [
ChangeNotifierProvider.value(value: model),
ChangeNotifierProvider.value(value: friendShipViewModel),
ChangeNotifierProvider.value(value: groupListenerModel)],
ChangeNotifierProvider.value(value: groupListenerModel)
],
builder: (BuildContext context, Widget? w) {
final _model = Provider.of<TUIConversationViewModel>(context);
bool haveMoreData = _model.haveMoreData;
@ -346,7 +352,9 @@ class _TIMUIKitConversationState extends TIMUIKitState<TIMUIKitConversation> {
final conversationItem = filteredConversationList[index];
final V2TimUserStatus? onlineStatus = _friendShipViewModel.userStatusList.firstWhere((item) => item.userID == conversationItem?.userID, orElse: () => V2TimUserStatus(statusType: 0));
final V2TimUserStatus? onlineStatus = _friendShipViewModel.userStatusList.firstWhere(
(item) => item.userID == conversationItem?.userID,
orElse: () => V2TimUserStatus(statusType: 0));
if (widget.itemBuilder != null) {
return widget.itemBuilder!(conversationItem!, onlineStatus);
@ -371,14 +379,18 @@ class _TIMUIKitConversationState extends TIMUIKitState<TIMUIKitConversation> {
lastMessageBuilder: widget.lastMessageBuilder,
faceUrl: conversationItem.faceUrl ?? "",
nickName: conversationItem.showName ?? "",
isDisturb: (conversationItem.groupType == "Meeting" ? false : conversationItem
.recvOpt != 0),
isDisturb:
(conversationItem.groupType == "Meeting" ? false : conversationItem.recvOpt != 0),
lastMsg: conversationItem.lastMessage,
isPined: isPined,
groupAtInfoList: conversationItem.groupAtInfoList ?? [],
unreadCount: conversationItem.unreadCount ?? 0,
draftText: conversationItem.draftText,
onlineStatus: (widget.isShowOnlineStatus && conversationItem.userID != null && conversationItem.userID!.isNotEmpty) ? onlineStatus : null,
onlineStatus: (widget.isShowOnlineStatus &&
conversationItem.userID != null &&
conversationItem.userID!.isNotEmpty)
? onlineStatus
: null,
draftTimestamp: conversationItem.draftTimestamp,
convType: conversationItem.type),
onTap: () => onTapConvItem(conversationItem),
@ -399,7 +411,9 @@ class _TIMUIKitConversationState extends TIMUIKitState<TIMUIKitConversation> {
isDarkBackground: false,
borderRadius: const BorderRadius.all(Radius.circular(4)),
context: context,
offset: Offset(min(details.globalPosition.dx, MediaQuery.of(context).size.width - 80), min(details.globalPosition.dy, MediaQuery.of(context).size.height - 130)),
offset: Offset(
min(details.globalPosition.dx, MediaQuery.of(context).size.width - 80),
min(details.globalPosition.dy, MediaQuery.of(context).size.height - 130)),
child: (onClose) => _getSecondaryMenu(conversationItem, onClose));
},
child: conversationLineItem(),
@ -409,7 +423,13 @@ class _TIMUIKitConversationState extends TIMUIKitState<TIMUIKitConversation> {
key: ValueKey(conversationItem.conversationID),
controller: _autoScrollController,
index: index,
child: Slidable(groupTag: 'conversation-list', child: conversationLineItem(), endActionPane: ActionPane(extentRatio: slideChildren.length > 2 ? 0.77 : 0.5, motion: const DrawerMotion(), children: slideChildren)),
child: Slidable(
groupTag: 'conversation-list',
child: conversationLineItem(),
endActionPane: ActionPane(
extentRatio: slideChildren.length > 2 ? 0.77 : 0.5,
motion: const DrawerMotion(),
children: slideChildren)),
));
})
: (widget.emptyBuilder != null ? widget.emptyBuilder!() : Container());

View File

@ -1,9 +1,12 @@
// ignore_for_file: empty_catches
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/time_ago.dart';
@ -14,8 +17,7 @@ import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
typedef LastMessageBuilder = Widget? Function(
V2TimMessage? lastMsg, List<V2TimGroupAtInfo?> groupAtInfoList);
typedef LastMessageBuilder = Widget? Function(V2TimMessage? lastMsg, List<V2TimGroupAtInfo?> groupAtInfoList);
class TIMUIKitConversationItem extends TIMUIKitStatelessWidget {
final String faceUrl;
@ -51,10 +53,9 @@ class TIMUIKitConversationItem extends TIMUIKitStatelessWidget {
Widget _getShowMsgWidget(BuildContext context) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (lastMsg != null && lastMessageBuilder != null &&
lastMessageBuilder!(lastMsg, groupAtInfoList) != null) {
return lastMessageBuilder!(lastMsg, groupAtInfoList)!;
}
if (lastMsg != null && lastMessageBuilder != null && lastMessageBuilder!(lastMsg, groupAtInfoList) != null) {
return lastMessageBuilder!(lastMsg, groupAtInfoList)!;
}
if (lastMsg != null || (draftText != null && draftText != "")) {
return TIMUIKitLastMsg(
@ -106,8 +107,7 @@ class TIMUIKitConversationItem extends TIMUIKitStatelessWidget {
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: theme.conversationItemBorderColor ??
CommonColor.weakDividerColor,
color: theme.conversationItemBorderColor ?? CommonColor.weakDividerColor,
width: 1,
),
),
@ -124,11 +124,7 @@ class TIMUIKitConversationItem extends TIMUIKitStatelessWidget {
fit: StackFit.expand,
clipBehavior: Clip.none,
children: [
Avatar(
onlineStatus: onlineStatus,
faceUrl: faceUrl,
showName: nickName,
type: convType),
Avatar(onlineStatus: onlineStatus, faceUrl: faceUrl, showName: nickName, type: convType),
if (unreadCount != 0)
Positioned(
top: isDisturb ? -2.5 : -4.5,

View File

@ -8,8 +8,10 @@ import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_elem_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_at_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_at_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
@ -205,13 +207,13 @@ class _TIMUIKitLastMsgState extends TIMUIKitState<TIMUIKitLastMsg> {
if (widget.groupAtInfoList.isNotEmpty)
Text(_getAtMessage(), style: TextStyle(color: theme.cautionColor, fontSize: widget.fontSize)),
if (widget.draftText != null && widget.draftText != "")
Text(_getDraftShowText(), style: TextStyle(color: theme.conversationItemDraftTextColor, fontSize: widget.fontSize)),
Text(_getDraftShowText(),
style: TextStyle(color: theme.conversationItemDraftTextColor, fontSize: widget.fontSize)),
if (disturbUnreadCountInfo != "")
Text(disturbUnreadCountInfo, style: TextStyle(color: theme.weakTextColor, fontSize: widget.fontSize)),
if (widget.draftText != null && widget.draftText != "")
Expanded(
child: ExtendedText(
groupTipsAbstractText,
child: ExtendedText(groupTipsAbstractText,
softWrap: true,
maxLines: 1,
overflow: TextOverflow.ellipsis,
@ -220,23 +222,20 @@ class _TIMUIKitLastMsgState extends TIMUIKitState<TIMUIKitLastMsg> {
isUseQQPackage: true,
isUseTencentCloudChatPackage: true,
showAtBackground: true,
)
),
)),
),
if (widget.draftText == null || widget.draftText == "" && TencentUtils.checkString(groupTipsAbstractText) != null)
Expanded(
child: ExtendedText(
groupTipsAbstractText,
softWrap: true,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(height: 1, color: theme.weakTextColor, fontSize: widget.fontSize),
specialTextSpanBuilder: DefaultSpecialTextSpanBuilder(
isUseQQPackage: true,
isUseTencentCloudChatPackage: true,
showAtBackground: true,
)
),
child: ExtendedText(groupTipsAbstractText,
softWrap: true,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(height: 1, color: theme.weakTextColor, fontSize: widget.fontSize),
specialTextSpanBuilder: DefaultSpecialTextSpanBuilder(
isUseQQPackage: true,
isUseTencentCloudChatPackage: true,
showAtBackground: true,
)),
)
]);
}

View File

@ -2,8 +2,10 @@ import 'package:azlistview_all_platforms/azlistview_all_platforms.dart';
import 'package:flutter/material.dart';
import 'package:lpinyin/lpinyin.dart';
import 'package:provider/provider.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
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/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -16,24 +18,17 @@ import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme_view_model.dart';
typedef GroupItemBuilder = Widget Function(
BuildContext context, V2TimGroupInfo groupInfo);
typedef GroupItemBuilder = Widget Function(BuildContext context, V2TimGroupInfo groupInfo);
class TIMUIKitGroup extends StatefulWidget {
final void Function(V2TimGroupInfo groupInfo, V2TimConversation conversation)?
onTapItem;
final void Function(V2TimGroupInfo groupInfo, V2TimConversation conversation)? onTapItem;
final Widget Function(BuildContext context)? emptyBuilder;
final GroupItemBuilder? itemBuilder;
/// the filter for group conversation
final bool Function(V2TimGroupInfo? groupInfo)? groupCollector;
const TIMUIKitGroup(
{Key? key,
this.onTapItem,
this.emptyBuilder,
this.itemBuilder,
this.groupCollector})
const TIMUIKitGroup({Key? key, this.onTapItem, this.emptyBuilder, this.itemBuilder, this.groupCollector})
: super(key: key);
@override
@ -41,15 +36,11 @@ class TIMUIKitGroup extends StatefulWidget {
}
class _TIMUIKitGroupState extends TIMUIKitState<TIMUIKitGroup> {
final TUIFriendShipViewModel _friendshipViewModel =
serviceLocator<TUIFriendShipViewModel>();
final TUIGroupListenerModel _groupListenerModel =
serviceLocator<TUIGroupListenerModel>();
final TUIFriendShipViewModel _friendshipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIGroupListenerModel _groupListenerModel = serviceLocator<TUIGroupListenerModel>();
List<ISuspensionBeanImpl<V2TimGroupInfo>> _getShowList(
List<V2TimGroupInfo> groupList) {
final List<ISuspensionBeanImpl<V2TimGroupInfo>> showList =
List.empty(growable: true);
List<ISuspensionBeanImpl<V2TimGroupInfo>> _getShowList(List<V2TimGroupInfo> groupList) {
final List<ISuspensionBeanImpl<V2TimGroupInfo>> showList = List.empty(growable: true);
for (var i = 0; i < groupList.length; i++) {
final item = groupList[i];
@ -72,14 +63,10 @@ class _TIMUIKitGroupState extends TIMUIKitState<TIMUIKitGroup> {
final theme = Provider.of<TUIThemeViewModel>(context).theme;
final showName = groupInfo.groupName ?? groupInfo.groupID;
final faceUrl = groupInfo.faceUrl ?? "";
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color:
theme.weakDividerColor ?? CommonColor.weakDividerColor))),
border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Material(
color: isDesktopScreen ? theme.wideBackgroundColor : null,
child: InkWell(
@ -93,10 +80,9 @@ class _TIMUIKitGroupState extends TIMUIKitState<TIMUIKitGroup> {
groupType: groupInfo.groupType,
faceUrl: groupInfo.faceUrl,
);
final res = await TencentImSDKPlugin
.v2TIMManager.getConversationManager()
.getConversation(
conversationID: "group_${groupInfo.groupID}");
final res = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getConversation(conversationID: "group_${groupInfo.groupID}");
if (res.code == 0 && res.data != null) {
conversation = res.data!;
}
@ -126,8 +112,7 @@ class _TIMUIKitGroupState extends TIMUIKitState<TIMUIKitGroup> {
padding: const EdgeInsets.only(top: 10, bottom: 20),
child: Text(
showName,
style: TextStyle(
color: Colors.black, fontSize: isDesktopScreen ? 14 : 18),
style: TextStyle(color: Colors.black, fontSize: isDesktopScreen ? 14 : 18),
),
))
],
@ -154,12 +139,10 @@ class _TIMUIKitGroupState extends TIMUIKitState<TIMUIKitGroup> {
providers: [
ChangeNotifierProvider.value(value: _friendshipViewModel),
ChangeNotifierProvider.value(value: _groupListenerModel),
ChangeNotifierProvider.value(
value: serviceLocator<TUIThemeViewModel>()),
ChangeNotifierProvider.value(value: serviceLocator<TUIThemeViewModel>()),
],
builder: (BuildContext context, Widget? w) {
final NeedUpdate? needUpdate =
Provider.of<TUIGroupListenerModel>(context).needUpdate;
final NeedUpdate? needUpdate = Provider.of<TUIGroupListenerModel>(context).needUpdate;
if (needUpdate != null) {
_groupListenerModel.needUpdate = null;
switch (needUpdate.updateType) {
@ -173,8 +156,7 @@ class _TIMUIKitGroupState extends TIMUIKitState<TIMUIKitGroup> {
break;
}
}
List<V2TimGroupInfo> groupList =
Provider.of<TUIFriendShipViewModel>(context).groupList;
List<V2TimGroupInfo> groupList = Provider.of<TUIFriendShipViewModel>(context).groupList;
if (widget.groupCollector != null) {
groupList = groupList.where(widget.groupCollector!).toList();
}

View File

@ -2,7 +2,8 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_chat_global_model.dart';
@ -14,7 +15,8 @@ import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme_view_model.dart';
typedef GroupApplicationItemBuilder = Widget Function(BuildContext context, V2TimGroupApplication applicationInfo, int index);
typedef GroupApplicationItemBuilder = Widget Function(
BuildContext context, V2TimGroupApplication applicationInfo, int index);
enum ApplicationStatus {
none,
@ -57,7 +59,9 @@ class TIMUIKitGroupApplicationListState extends TIMUIKitState<TIMUIKitGroupAppli
final ApplicationStatus currentStatus = applicationStatusList[index];
String _getUserName() {
if (applicationInfo.fromUserNickName != null && applicationInfo.fromUserNickName!.isNotEmpty && applicationInfo.fromUserNickName != applicationInfo.fromUser) {
if (applicationInfo.fromUserNickName != null &&
applicationInfo.fromUserNickName!.isNotEmpty &&
applicationInfo.fromUserNickName != applicationInfo.fromUser) {
return "${applicationInfo.fromUserNickName} (${applicationInfo.fromUser})";
} else {
return "${applicationInfo.fromUser}";
@ -83,7 +87,9 @@ class TIMUIKitGroupApplicationListState extends TIMUIKitState<TIMUIKitGroupAppli
child: SizedBox(
height: 40,
width: 40,
child: Avatar(faceUrl: applicationInfo.fromUserFaceUrl ?? "", showName: applicationInfo.fromUserNickName ?? applicationInfo.fromUser ?? ""),
child: Avatar(
faceUrl: applicationInfo.fromUserFaceUrl ?? "",
showName: applicationInfo.fromUserNickName ?? applicationInfo.fromUser ?? ""),
),
),
Expanded(
@ -106,7 +112,10 @@ class TIMUIKitGroupApplicationListState extends TIMUIKitState<TIMUIKitGroupAppli
child: InkWell(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
decoration: BoxDecoration(borderRadius: BorderRadius.circular(4), color: theme.primaryColor, border: Border.all(width: 1, color: theme.weakTextColor ?? CommonColor.weakTextColor)),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: theme.primaryColor,
border: Border.all(width: 1, color: theme.weakTextColor ?? CommonColor.weakTextColor)),
child: Text(
TIM_t("同意"), // agree
style: const TextStyle(
@ -135,7 +144,10 @@ class TIMUIKitGroupApplicationListState extends TIMUIKitState<TIMUIKitGroupAppli
if (currentStatus == ApplicationStatus.none && applicationInfo.handleStatus == 0)
InkWell(
child: Container(
decoration: BoxDecoration(borderRadius: BorderRadius.circular(4), color: Colors.white, border: Border.all(width: 1, color: theme.weakTextColor ?? CommonColor.weakTextColor)),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Colors.white,
border: Border.all(width: 1, color: theme.weakTextColor ?? CommonColor.weakTextColor)),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4),
child: Text(
TIM_t("拒绝"), // reject
@ -146,7 +158,11 @@ class TIMUIKitGroupApplicationListState extends TIMUIKitState<TIMUIKitGroupAppli
),
onTap: () async {
final res = await _groupServices.refuseGroupApplication(
addTime: applicationInfo.addTime!, groupID: applicationInfo.groupID, fromUser: applicationInfo.fromUser!, toUser: applicationInfo.toUser!, type: GroupApplicationTypeEnum.values[applicationInfo.type]);
addTime: applicationInfo.addTime!,
groupID: applicationInfo.groupID,
fromUser: applicationInfo.fromUser!,
toUser: applicationInfo.toUser!,
type: GroupApplicationTypeEnum.values[applicationInfo.type]);
if (res.code == 0) {
setState(() {
applicationStatusList[index] = ApplicationStatus.reject;

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
@ -14,25 +15,19 @@ enum ApplicationStatus {
class TIMUIKitGroupApplicationListItem extends StatefulWidget {
final V2TimGroupApplication applicationInfo;
const TIMUIKitGroupApplicationListItem(
{Key? key, required this.applicationInfo})
: super(key: key);
const TIMUIKitGroupApplicationListItem({Key? key, required this.applicationInfo}) : super(key: key);
@override
State<StatefulWidget> createState() =>
TIMUIKitGroupApplicationListItemState();
State<StatefulWidget> createState() => TIMUIKitGroupApplicationListItemState();
}
class TIMUIKitGroupApplicationListItemState
extends TIMUIKitState<TIMUIKitGroupApplicationListItem> {
class TIMUIKitGroupApplicationListItemState extends TIMUIKitState<TIMUIKitGroupApplicationListItem> {
ApplicationStatus applicationStatus = ApplicationStatus.none;
String _getUserName() {
if (widget.applicationInfo.fromUserNickName != null &&
widget.applicationInfo.fromUserNickName!.isNotEmpty &&
widget.applicationInfo.fromUserNickName !=
widget.applicationInfo.fromUser) {
widget.applicationInfo.fromUserNickName != widget.applicationInfo.fromUser) {
return "${widget.applicationInfo.fromUserNickName} (${widget.applicationInfo.fromUser})";
} else {
return "${widget.applicationInfo.fromUser}";
@ -55,26 +50,18 @@ class TIMUIKitGroupApplicationListItemState
width: 40,
child: Avatar(
faceUrl: widget.applicationInfo.fromUserFaceUrl ?? "",
showName: widget.applicationInfo.fromUserNickName ??
widget.applicationInfo.fromUser ??
""),
showName: widget.applicationInfo.fromUserNickName ?? widget.applicationInfo.fromUser ?? ""),
),
),
Column(
children: [
Text(
_getUserName(),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: theme.darkTextColor),
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: theme.darkTextColor),
),
Text(
_getUserName(),
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
color: theme.darkTextColor),
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: theme.darkTextColor),
),
],
)

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart';

View File

@ -2,8 +2,10 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.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_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart';
@ -33,7 +35,8 @@ class _DeleteGroupMemberPageState extends TIMUIKitState<DeleteGroupMemberPage> {
handleSearchGroupMembers(String searchText, context) async {
searchText = searchText;
List<V2TimGroupMemberFullInfo?> currentGroupMember = Provider.of<TUIGroupProfileModel>(context, listen: false).groupMemberList;
List<V2TimGroupMemberFullInfo?> currentGroupMember =
Provider.of<TUIGroupProfileModel>(context, listen: false).groupMemberList;
final res = await widget.model.searchGroupMember(V2TimGroupMemberSearchParam(
keywordList: [searchText],
groupIDList: [widget.model.groupInfo!.groupID],
@ -60,7 +63,10 @@ class _DeleteGroupMemberPageState extends TIMUIKitState<DeleteGroupMemberPage> {
}
handleRole(groupMemberList) {
return groupMemberList?.where((value) => value?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER).toList() ?? [];
return groupMemberList
?.where((value) => value?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER)
.toList() ??
[];
}
void submitDelete() async {

View File

@ -3,8 +3,10 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.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_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -29,8 +31,7 @@ class GroupProfileMemberListPage extends StatefulWidget {
State<StatefulWidget> createState() => GroupProfileMemberListPageState();
}
class GroupProfileMemberListPageState
extends TIMUIKitState<GroupProfileMemberListPage> {
class GroupProfileMemberListPageState extends TIMUIKitState<GroupProfileMemberListPage> {
List<V2TimGroupMemberFullInfo?>? searchMemberList;
String? searchText;
@ -45,8 +46,7 @@ class GroupProfileMemberListPageState
handleSearchGroupMembers(String searchText, context) async {
searchText = searchText;
List<V2TimGroupMemberFullInfo?> currentGroupMember =
Provider.of<TUIGroupProfileModel>(context, listen: false)
.groupMemberList;
Provider.of<TUIGroupProfileModel>(context, listen: false).groupMemberList;
if (!isSearchTextExist(searchText)) {
setState(() {
@ -55,8 +55,7 @@ class GroupProfileMemberListPageState
return;
}
final res =
await widget.model.searchGroupMember(V2TimGroupMemberSearchParam(
final res = await widget.model.searchGroupMember(V2TimGroupMemberSearchParam(
keywordList: [searchText],
groupIDList: [widget.model.groupInfo!.groupID],
));
@ -84,25 +83,21 @@ class GroupProfileMemberListPageState
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final TUITheme theme = value.theme;
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor() == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor() == DeviceType.Desktop;
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: widget.model),
],
builder: (BuildContext context, Widget? w) {
final TUIGroupProfileModel groupProfileModel =
Provider.of<TUIGroupProfileModel>(context);
String option1 = groupProfileModel.groupInfo?.memberCount.toString() ??
widget.memberList.length.toString();
if(isDesktopScreen){
return GroupProfileMemberList(
final TUIGroupProfileModel groupProfileModel = Provider.of<TUIGroupProfileModel>(context);
String option1 = groupProfileModel.groupInfo?.memberCount.toString() ?? widget.memberList.length.toString();
if (isDesktopScreen) {
return GroupProfileMemberList(
customTopArea: PlatformUtils().isWeb
? null
: GroupMemberSearchTextField(
onTextChange: (text) =>
handleSearchGroupMembers(text, context),
),
onTextChange: (text) => handleSearchGroupMembers(text, context),
),
memberList: searchMemberList ?? groupProfileModel.groupMemberList,
removeMember: _kickedOffMember,
touchBottomCallBack: () {},
@ -116,13 +111,11 @@ class GroupProfileMemberListPageState
return Scaffold(
appBar: AppBar(
title: Text(
TIM_t_para("群成员({{option1}}人)", "群成员($option1人)")(
option1: option1),
TIM_t_para("群成员({{option1}}人)", "群成员($option1人)")(option1: option1),
style: TextStyle(color: theme.appbarTextColor, fontSize: 17),
),
shadowColor: theme.weakBackgroundColor,
backgroundColor: theme.appbarBgColor ??
theme.primaryColor,
backgroundColor: theme.appbarBgColor ?? theme.primaryColor,
iconTheme: IconThemeData(
color: theme.appbarTextColor,
)),
@ -130,8 +123,7 @@ class GroupProfileMemberListPageState
customTopArea: PlatformUtils().isWeb
? null
: GroupMemberSearchTextField(
onTextChange: (text) =>
handleSearchGroupMembers(text, context),
onTextChange: (text) => handleSearchGroupMembers(text, context),
),
memberList: searchMemberList ?? groupProfileModel.groupMemberList,
removeMember: _kickedOffMember,
@ -141,8 +133,7 @@ class GroupProfileMemberListPageState
widget.model.onClickUser!(memberInfo, details);
}
},
)
);
));
},
);
}

View File

@ -1,6 +1,8 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
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';
enum GroupProfileWidgetEnum {
/// The detail card for group.
@ -63,15 +65,14 @@ enum GroupProfileWidgetEnum {
class GroupProfileWidgetBuilder {
/// The detail card for group.
Widget Function(V2TimGroupInfo groupInfo,
Function(String updateGroupName)? updateGroupName)? detailCard;
Widget Function(V2TimGroupInfo groupInfo, Function(String updateGroupName)? updateGroupName)? detailCard;
/// The tile shows the members in the group.
Widget Function(List<V2TimGroupMemberFullInfo?> memberList)? memberListTile;
/// The entrance to the page editing the group notice.
Widget Function(String currentNotice, Function() toDefaultNoticeEditPage,
Function(String newNotice) setGroupNotice)? groupNotice;
Widget Function(String currentNotice, Function() toDefaultNoticeEditPage, Function(String newNotice) setGroupNotice)?
groupNotice;
/// The entrance to the page managing the group.
/// Works only for group owner and group admin.
@ -89,47 +90,37 @@ class GroupProfileWidgetBuilder {
/// Shows and modify the mode or options users add the group.
/// Includes "0: disallow group joining", "1: admin approval" and "2: automatic approval".
Widget Function(int groupAddOptType, Function(int addOpt) handleActionTap)?
groupJoiningModeBar;
Widget Function(int groupAddOptType, Function(int addOpt) handleActionTap)? groupJoiningModeBar;
/// Shows and modify the nickname for user in a specific group,
/// only shows and used in this group, as the name card here.
Widget Function(String nameCard, Function(String newName) setNameCard)?
nameCardBar;
Widget Function(String nameCard, Function(String newName) setNameCard)? nameCardBar;
/// The switch of if mute the message notification from a specific group.
Widget Function(bool isMute, Function(bool isMute) setMute)?
muteGroupMessageBar;
Widget Function(bool isMute, Function(bool isMute) setMute)? muteGroupMessageBar;
/// The switch of if pin this group to the top in conversation list.
Widget Function(bool isPined, Function(bool isMute) pinedConversation)?
pinedConversationBar;
Widget Function(bool isPined, Function(bool isMute) pinedConversation)? pinedConversationBar;
/// The button area, includes
/// "clear chat history", "transfer group owner", "disband group" and "quit group"
/// as default.
Widget Function(V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? buttonArea;
Widget Function(V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)? buttonArea;
/// Custom area, you may define anything you want here.
Widget Function(V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderOne;
Widget Function(V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderOne;
/// Custom area, you may define anything you want here.
Widget Function(V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderTwo;
Widget Function(V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderTwo;
/// Custom area, you may define anything you want here.
Widget Function(V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderThree;
Widget Function(V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderThree;
/// Custom area, you may define anything you want here.
Widget Function(V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderFour;
Widget Function(V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderFour;
/// Custom area, you may define anything you want here.
Widget Function(V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderFive;
Widget Function(V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)? customBuilderFive;
GroupProfileWidgetBuilder(
{this.detailCard,

View File

@ -4,8 +4,10 @@ import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_change_info_type.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
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_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/group_profile_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart';
@ -21,8 +23,8 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/t
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
export 'package:tencent_cloud_chat_uikit/ui/widgets/transimit_group_owner_select.dart';
typedef GroupProfileBuilder = Widget Function(BuildContext context,
V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList);
typedef GroupProfileBuilder = Widget Function(
BuildContext context, V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList);
class TIMUIKitGroupProfile extends StatefulWidget {
/// Group ID
@ -31,13 +33,15 @@ class TIMUIKitGroupProfile extends StatefulWidget {
/// [Deprecated:] The builder for custom bottom operation area.
/// [operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead.
final Widget Function(BuildContext context, V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? bottomOperationBuilder;
final Widget Function(
BuildContext context, V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)?
bottomOperationBuilder;
/// [Deprecated:] The builder for custom bottom operation area.
/// [operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead.
final Widget Function(BuildContext context, V2TimGroupInfo groupInfo,
List<V2TimGroupMemberFullInfo?> groupMemberList)? operationListBuilder;
final Widget Function(
BuildContext context, V2TimGroupInfo groupInfo, List<V2TimGroupMemberFullInfo?> groupMemberList)?
operationListBuilder;
/// [If you tend to customize the profile page, use [profileWidgetBuilder] with [profileWidgetsOrder] as priority.]
/// The builder for each widgets in profile page,
@ -67,9 +71,9 @@ class TIMUIKitGroupProfile extends StatefulWidget {
required this.groupID,
this.backGroundColor,
@Deprecated("[operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead")
this.bottomOperationBuilder,
this.bottomOperationBuilder,
@Deprecated("[operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead")
this.operationListBuilder,
this.operationListBuilder,
this.builder,
this.profileWidgetBuilder,
this.onClickUser,
@ -84,8 +88,7 @@ class TIMUIKitGroupProfile extends StatefulWidget {
class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
bool isSingleUse = false;
final model = TUIGroupProfileModel();
final TUIGroupListenerModel groupListenerModel =
serviceLocator<TUIGroupListenerModel>();
final TUIGroupListenerModel groupListenerModel = serviceLocator<TUIGroupListenerModel>();
@override
void initState() {
@ -141,8 +144,7 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
model.lifeCycle = widget.lifeCycle;
final V2TimGroupInfo? groupInfo = model.groupInfo;
final memberList = model.groupMemberList;
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (groupInfo == null) {
return Center(
child: LoadingAnimationWidget.staggeredDotsWave(
@ -152,8 +154,7 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
);
}
final TUIGroupListenerModel groupListenerModel =
Provider.of<TUIGroupListenerModel>(context);
final TUIGroupListenerModel groupListenerModel = Provider.of<TUIGroupListenerModel>(context);
final NeedUpdate? needUpdate = groupListenerModel.needUpdate;
if (needUpdate != null && needUpdate.groupID == widget.groupID) {
groupListenerModel.needUpdate = null;
@ -174,18 +175,14 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
}
}
final isGroupOwner = groupInfo.role ==
GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER;
final isAdmin = groupInfo.role ==
GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN;
final isGroupOwner = groupInfo.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_OWNER;
final isAdmin = groupInfo.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_ADMIN;
Widget groupProfilePage({required Widget child}) {
return SingleChildScrollView(
child: Container(
color: widget.backGroundColor ??
(isDesktopScreen
? theme.wideBackgroundColor
: theme.weakBackgroundColor),
color:
widget.backGroundColor ?? (isDesktopScreen ? theme.wideBackgroundColor : theme.weakBackgroundColor),
child: child,
),
);
@ -195,9 +192,8 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GroupProfileNotificationPage(
model: model,
notification: groupInfo.notification ?? "")));
builder: (context) =>
GroupProfileNotificationPage(model: model, notification: groupInfo.notification ?? "")));
}
void toDefaultManagePage() {
@ -209,19 +205,15 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
)));
}
List<Widget> _renderWidgetsWithOrder(
List<GroupProfileWidgetEnum> order) {
final GroupProfileWidgetBuilder? customBuilder =
widget.profileWidgetBuilder;
List<Widget> _renderWidgetsWithOrder(List<GroupProfileWidgetEnum> order) {
final GroupProfileWidgetBuilder? customBuilder = widget.profileWidgetBuilder;
return order.map((element) {
switch (element) {
case GroupProfileWidgetEnum.detailCard:
return (customBuilder?.detailCard != null
? customBuilder?.detailCard!(
groupInfo, model.setGroupName)
? customBuilder?.detailCard!(groupInfo, model.setGroupName)
: TIMUIKitGroupProfileWidget.detailCard(
isHavePermission: isAdmin || isGroupOwner,
groupInfo: groupInfo))!;
isHavePermission: isAdmin || isGroupOwner, groupInfo: groupInfo))!;
case GroupProfileWidgetEnum.memberListTile:
return (customBuilder?.memberListTile != null
? customBuilder?.memberListTile!(memberList)
@ -229,11 +221,8 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
case GroupProfileWidgetEnum.groupNotice:
return (customBuilder?.groupNotice != null
? customBuilder?.groupNotice!(
groupInfo.notification ?? "",
toDefaultNoticePage,
model.setGroupNotification)
: TIMUIKitGroupProfileWidget.groupNotification(
isHavePermission: isAdmin || isGroupOwner))!;
groupInfo.notification ?? "", toDefaultNoticePage, model.setGroupNotification)
: TIMUIKitGroupProfileWidget.groupNotification(isHavePermission: isAdmin || isGroupOwner))!;
case GroupProfileWidgetEnum.groupManage:
if (isAdmin || isGroupOwner) {
return (customBuilder?.groupManage != null
@ -263,25 +252,20 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
return Container();
}
return (customBuilder?.groupJoiningModeBar != null
? customBuilder?.groupJoiningModeBar!(
groupInfo.groupAddOpt ?? 1, model.setGroupAddOpt)
? customBuilder?.groupJoiningModeBar!(groupInfo.groupAddOpt ?? 1, model.setGroupAddOpt)
: TIMUIKitGroupProfileWidget.groupAddOpt())!;
case GroupProfileWidgetEnum.nameCardBar:
return (customBuilder?.nameCardBar != null
? customBuilder?.nameCardBar!(
model.getSelfNameCard(), model.setNameCard)
? customBuilder?.nameCardBar!(model.getSelfNameCard(), model.setNameCard)
: TIMUIKitGroupProfileWidget.nameCard())!;
case GroupProfileWidgetEnum.muteGroupMessageBar:
return (customBuilder?.muteGroupMessageBar != null
? customBuilder?.muteGroupMessageBar!(
model.conversation?.recvOpt != 0,
model.setMessageDisturb)
? customBuilder?.muteGroupMessageBar!(model.conversation?.recvOpt != 0, model.setMessageDisturb)
: TIMUIKitGroupProfileWidget.messageDisturb())!;
case GroupProfileWidgetEnum.pinedConversationBar:
return (customBuilder?.pinedConversationBar != null
? customBuilder?.pinedConversationBar!(
model.conversation?.isPinned ?? false,
model.pinedConversation)
model.conversation?.isPinned ?? false, model.pinedConversation)
: TIMUIKitGroupProfileWidget.pinedConversation())!;
case GroupProfileWidgetEnum.buttonArea:
return (customBuilder?.buttonArea != null
@ -299,8 +283,7 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
: Text(TIM_t("如使用自定义区域请在profileWidgetBuilder传入对应组件")))!;
case GroupProfileWidgetEnum.customBuilderThree:
return (customBuilder?.customBuilderThree != null
? customBuilder?.customBuilderThree!(
groupInfo, memberList)
? customBuilder?.customBuilderThree!(groupInfo, memberList)
// Please define the corresponding custom widget in `profileWidgetBuilder` before using it here.
: Text(TIM_t("如使用自定义区域请在profileWidgetBuilder传入对应组件")))!;
case GroupProfileWidgetEnum.customBuilderFour:
@ -326,9 +309,7 @@ class _TIMUIKitGroupProfileState extends TIMUIKitState<TIMUIKitGroupProfile> {
} else if (widget.profileWidgetsOrder != null) {
return groupProfilePage(
child: Column(
children: [
..._renderWidgetsWithOrder(widget.profileWidgetsOrder!)
],
children: [..._renderWidgetsWithOrder(widget.profileWidgetsOrder!)],
),
);
} else {

View File

@ -1,6 +1,8 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
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_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_ui_group_search_msg.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitGroupProfile/widgets/tim_uikit_group_add_opt.dart';

View File

@ -3,7 +3,8 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
@ -16,10 +17,8 @@ import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
class GroupProfileGroupSearch extends TIMUIKitStatelessWidget {
GroupProfileGroupSearch({Key? key, required this.onJumpToSearch})
: super(key: key);
final ConversationService _conversationService =
serviceLocator<ConversationService>();
GroupProfileGroupSearch({Key? key, required this.onJumpToSearch}) : super(key: key);
final ConversationService _conversationService = serviceLocator<ConversationService>();
final Function(V2TimConversation?) onJumpToSearch;
@ -32,21 +31,16 @@ class GroupProfileGroupSearch extends TIMUIKitStatelessWidget {
return InkWell(
onTap: () async {
V2TimConversation? conversation =
await _conversationService.getConversation(
conversationID: "group_${model.groupInfo!.groupID}");
await _conversationService.getConversation(conversationID: "group_${model.groupInfo!.groupID}");
if (conversation != null) {
onJumpToSearch(conversation);
}
},
child: Container(
padding: const EdgeInsets.symmetric(
vertical: 14, horizontal: 16),
padding: const EdgeInsets.symmetric(vertical: 14, horizontal: 16),
decoration: BoxDecoration(
color: Colors.white,
border: Border(
bottom: BorderSide(
color: theme.weakDividerColor ??
CommonColor.weakDividerColor))),
border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [

View File

@ -1,7 +1,8 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_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_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart';
@ -20,11 +21,9 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
final TUIGroupProfileModel model;
final sdkInstance = TIMUIKitCore.getSDKInstance();
final coreInstance = TIMUIKitCore.getInstance();
final TIMUIKitChatController _timuiKitChatController =
TIMUIKitChatController();
final TIMUIKitChatController _timuiKitChatController = TIMUIKitChatController();
GroupProfileButtonArea(this.groupID, this.model, {Key? key})
: super(key: key);
GroupProfileButtonArea(this.groupID, this.model, {Key? key}) : super(key: key);
final _operationList = [
{"label": TIM_t("清空消息"), "id": "clearHistory"},
@ -34,8 +33,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
];
_clearHistory(BuildContext context, theme) async {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (isDesktopScreen) {
TUIKitWidePopup.showSecondaryConfirmDialog(
@ -46,16 +44,13 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
onCancel: () {},
onConfirm: () async {
if (PlatformUtils().isWeb) {
final res = await sdkInstance
.getConversationManager()
.deleteConversation(conversationID: "group_$groupID");
final res =
await sdkInstance.getConversationManager().deleteConversation(conversationID: "group_$groupID");
if (res.code == 0) {
_timuiKitChatController.clearHistory(groupID);
}
} else {
final res = await sdkInstance
.getMessageManager()
.clearGroupHistoryMessage(groupID: groupID);
final res = await sdkInstance.getMessageManager().clearGroupHistoryMessage(groupID: groupID);
if (res.code == 0) {
_timuiKitChatController.clearHistory(groupID);
}
@ -82,16 +77,13 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
context,
);
if (PlatformUtils().isWeb) {
final res = await sdkInstance
.getConversationManager()
.deleteConversation(conversationID: "group_$groupID");
final res =
await sdkInstance.getConversationManager().deleteConversation(conversationID: "group_$groupID");
if (res.code == 0) {
_timuiKitChatController.clearHistory(groupID);
}
} else {
final res = await sdkInstance
.getMessageManager()
.clearGroupHistoryMessage(groupID: groupID);
final res = await sdkInstance.getMessageManager().clearGroupHistoryMessage(groupID: groupID);
if (res.code == 0) {
_timuiKitChatController.clearHistory(groupID);
}
@ -111,8 +103,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
}
_quitGroup(BuildContext context, TUITheme theme) async {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (isDesktopScreen) {
TUIKitWidePopup.showSecondaryConfirmDialog(
@ -124,9 +115,8 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
onConfirm: () async {
final res = await sdkInstance.quitGroup(groupID: groupID);
if (res.code == 0) {
final deleteConvRes = await sdkInstance
.getConversationManager()
.deleteConversation(conversationID: "group_$groupID");
final deleteConvRes =
await sdkInstance.getConversationManager().deleteConversation(conversationID: "group_$groupID");
if (deleteConvRes.code == 0) {
model.lifeCycle?.didLeaveGroup();
}
@ -155,9 +145,8 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
);
final res = await sdkInstance.quitGroup(groupID: groupID);
if (res.code == 0) {
final deleteConvRes = await sdkInstance
.getConversationManager()
.deleteConversation(conversationID: "group_$groupID");
final deleteConvRes =
await sdkInstance.getConversationManager().deleteConversation(conversationID: "group_$groupID");
if (deleteConvRes.code == 0) {
model.lifeCycle?.didLeaveGroup();
}
@ -181,8 +170,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
}
_dismissGroup(BuildContext context, theme) async {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (isDesktopScreen) {
TUIKitWidePopup.showSecondaryConfirmDialog(
@ -194,9 +182,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
onConfirm: () async {
final res = await sdkInstance.dismissGroup(groupID: groupID);
if (res.code == 0) {
await sdkInstance
.getConversationManager()
.deleteConversation(conversationID: "group_$groupID");
await sdkInstance.getConversationManager().deleteConversation(conversationID: "group_$groupID");
model.lifeCycle?.didLeaveGroup();
}
});
@ -220,9 +206,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
onPressed: () async {
final res = await sdkInstance.dismissGroup(groupID: groupID);
if (res.code == 0) {
await sdkInstance
.getConversationManager()
.deleteConversation(conversationID: "group_$groupID");
await sdkInstance.getConversationManager().deleteConversation(conversationID: "group_$groupID");
model.lifeCycle?.didLeaveGroup();
}
},
@ -240,8 +224,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
}
_transmitOwner(BuildContext context, String groupID) async {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (isDesktopScreen) {
TUIKitWidePopup.showPopupWindow(
@ -260,9 +243,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
onSelectedMember: (selectedMember) async {
if (selectedMember.isNotEmpty) {
final userID = selectedMember.first.userID;
await sdkInstance
.getGroupManager()
.transferGroupOwner(groupID: groupID, userID: userID);
await sdkInstance.getGroupManager().transferGroupOwner(groupID: groupID, userID: userID);
}
},
),
@ -279,29 +260,23 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
);
if (selectedMember != null) {
final userID = selectedMember.first.userID;
await sdkInstance
.getGroupManager()
.transferGroupOwner(groupID: groupID, userID: userID);
await sdkInstance.getGroupManager().transferGroupOwner(groupID: groupID, userID: userID);
}
}
}
List<Widget> _renderGroupOperation(
BuildContext context, TUITheme theme, bool isOwner, String groupType) {
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
List<Widget> _renderGroupOperation(BuildContext context, TUITheme theme, bool isOwner, String groupType) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return _operationList
.where((element) {
if (!isOwner) {
return ["quitGroup", "clearHistory"].contains(element["id"]);
} else {
if (groupType == "Work") {
return ["clearHistory", "quitGroup", "transimitOwner"]
.contains(element["id"]);
return ["clearHistory", "quitGroup", "transimitOwner"].contains(element["id"]);
}
if (groupType != "Work") {
return ["clearHistory", "dismissGroup", "transimitOwner"]
.contains(element["id"]);
return ["clearHistory", "dismissGroup", "transimitOwner"].contains(element["id"]);
}
return true;
}
@ -340,10 +315,8 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
padding: const EdgeInsets.symmetric(vertical: 15),
decoration: BoxDecoration(
color: Colors.white,
border: Border(
bottom: BorderSide(
color: theme.weakDividerColor ??
CommonColor.weakDividerColor))),
border:
Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Text(
e["label"]!,
style: TextStyle(color: theme.cautionColor, fontSize: 17),
@ -358,8 +331,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
final theme = value.theme;
final groupInfo = model.groupInfo;
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (isDesktopScreen) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
@ -367,10 +339,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
spacing: 28,
children: [
..._renderGroupOperation(
context,
theme,
groupInfo?.owner == coreInstance.loginUserInfo?.userID,
groupInfo?.groupType ?? "")
context, theme, groupInfo?.owner == coreInstance.loginUserInfo?.userID, groupInfo?.groupType ?? "")
],
),
);
@ -379,10 +348,7 @@ class GroupProfileButtonArea extends TIMUIKitStatelessWidget {
return Column(
children: [
..._renderGroupOperation(
context,
theme,
groupInfo?.owner == coreInstance.loginUserInfo?.userID,
groupInfo?.groupType ?? "")
context, theme, groupInfo?.owner == coreInstance.loginUserInfo?.userID, groupInfo?.groupType ?? "")
],
);
}

View File

@ -4,7 +4,8 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
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_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
@ -19,11 +20,7 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
final TextEditingController controller = TextEditingController();
final bool isHavePermission;
GroupProfileDetailCard(
{Key? key,
required this.groupInfo,
this.isHavePermission = false,
this.updateGroupName})
GroupProfileDetailCard({Key? key, required this.groupInfo, this.isHavePermission = false, this.updateGroupName})
: super(key: key);
@override
@ -33,8 +30,7 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
final faceUrl = groupInfo.faceUrl ?? "";
final groupID = groupInfo.groupID;
final showName = groupInfo.groupName ?? groupID;
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return InkWell(
onTapDown: !isHavePermission
@ -45,11 +41,8 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
context: context,
title: TIM_t("修改群名称"),
initText: showName,
initOffset: Offset(
min(details.globalPosition.dx,
MediaQuery.of(context).size.width - 350),
min(details.globalPosition.dy + 20,
MediaQuery.of(context).size.height - 470)),
initOffset: Offset(min(details.globalPosition.dx, MediaQuery.of(context).size.width - 350),
min(details.globalPosition.dy + 20, MediaQuery.of(context).size.height - 470)),
onSubmitted: (String newText) async {
final text = newText.trim();
if (updateGroupName != null) {
@ -88,31 +81,25 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10.0),
topRight: Radius.circular(10.0))),
topLeft: Radius.circular(10.0), topRight: Radius.circular(10.0))),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
padding: const EdgeInsets.symmetric(
vertical: 20),
padding: const EdgeInsets.symmetric(vertical: 20),
child: Text(TIM_t("修改群名称")),
),
Divider(
height: 2,
color: theme.weakDividerColor),
Divider(height: 2, color: theme.weakDividerColor),
Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
controller: controller,
decoration: InputDecoration(
border: InputBorder.none,
fillColor: theme
.weakBackgroundColor,
fillColor: theme.weakBackgroundColor,
filled: true,
isDense: true,
hintText: ''),
@ -122,10 +109,7 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
),
Text(
TIM_t("修改群名称"),
style: TextStyle(
fontSize: 13,
color:
theme.weakTextColor),
style: TextStyle(fontSize: 13, color: theme.weakTextColor),
textAlign: TextAlign.left,
),
const SizedBox(
@ -135,16 +119,11 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
width: double.infinity,
child: ElevatedButton(
onPressed: () {
final text = controller
.text
.trim();
if (updateGroupName !=
null) {
updateGroupName!(
text);
final text = controller.text.trim();
if (updateGroupName != null) {
updateGroupName!(text);
} else {
model.setGroupName(
text);
model.setGroupName(text);
}
Navigator.pop(context);
Navigator.pop(context);
@ -155,11 +134,8 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
height: 20,
),
Padding(
padding: EdgeInsets.only(
bottom:
MediaQuery.of(context)
.viewInsets
.bottom),
padding:
EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
)
],
),
@ -209,17 +185,13 @@ class GroupProfileDetailCard extends TIMUIKitStatelessWidget {
children: [
SelectableText(
showName,
style: TextStyle(
fontSize: isDesktopScreen ? 15 : 18,
fontWeight: FontWeight.w600),
style: TextStyle(fontSize: isDesktopScreen ? 15 : 18, fontWeight: FontWeight.w600),
),
SizedBox(
height: isDesktopScreen ? 4 : 8,
),
SelectableText("ID: $groupID",
style: TextStyle(
fontSize: isDesktopScreen ? 13 : 13,
color: theme.weakTextColor))
style: TextStyle(fontSize: isDesktopScreen ? 13 : 13, color: theme.weakTextColor))
],
),
),

View File

@ -7,7 +7,8 @@ import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_type.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_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/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
@ -45,7 +46,11 @@ class GroupProfileGroupManageState extends TIMUIKitState<GroupProfileGroupManage
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
decoration: BoxDecoration(color: Colors.white, border: isDesktopScreen ? null : Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
decoration: BoxDecoration(
color: Colors.white,
border: isDesktopScreen
? null
: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Column(
children: [
InkWell(
@ -121,7 +126,10 @@ class _GroupProfileGroupManagePageState extends TIMUIKitState<GroupProfileGroupM
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
return MultiProvider(
providers: [ChangeNotifierProvider.value(value: widget.model), ChangeNotifierProvider.value(value: serviceLocator<TUIThemeViewModel>())],
providers: [
ChangeNotifierProvider.value(value: widget.model),
ChangeNotifierProvider.value(value: serviceLocator<TUIThemeViewModel>())
],
builder: (context, w) {
final memberList = Provider.of<TUIGroupProfileModel>(context).groupMemberList;
final theme = Provider.of<TUIThemeViewModel>(context).theme;
@ -133,8 +141,16 @@ class _GroupProfileGroupManagePageState extends TIMUIKitState<GroupProfileGroupM
return Column(
children: [
Container(
padding: EdgeInsets.only(top: 12, left: isDesktopScreen ? 0 : 16, bottom: isDesktopScreen ? 0 : 12, right: isDesktopScreen ? 0 : 12),
decoration: BoxDecoration(color: Colors.white, border: isDesktopScreen ? null : Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
padding: EdgeInsets.only(
top: 12,
left: isDesktopScreen ? 0 : 16,
bottom: isDesktopScreen ? 0 : 12,
right: isDesktopScreen ? 0 : 12),
decoration: BoxDecoration(
color: Colors.white,
border: isDesktopScreen
? null
: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: InkWell(
onTap: isDesktopScreen
? null
@ -156,7 +172,11 @@ class _GroupProfileGroupManagePageState extends TIMUIKitState<GroupProfileGroupM
)
: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [Text(TIM_t("设置管理员"), style: TextStyle(fontSize: isDesktopScreen ? 14 : 16, color: theme.darkTextColor)), Icon(Icons.keyboard_arrow_right, color: theme.weakTextColor)],
children: [
Text(TIM_t("设置管理员"),
style: TextStyle(fontSize: isDesktopScreen ? 14 : 16, color: theme.darkTextColor)),
Icon(Icons.keyboard_arrow_right, color: theme.weakTextColor)
],
),
),
),
@ -167,7 +187,10 @@ class _GroupProfileGroupManagePageState extends TIMUIKitState<GroupProfileGroupM
if (!isDesktopScreen)
Container(
padding: const EdgeInsets.only(top: 12, left: 16, bottom: 12, right: 12),
decoration: BoxDecoration(color: Colors.white, border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
decoration: BoxDecoration(
color: Colors.white,
border:
Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
@ -229,7 +252,13 @@ class _GroupProfileGroupManagePageState extends TIMUIKitState<GroupProfileGroupM
: const EdgeInsets.only(
bottom: 4,
),
decoration: isDesktopScreen ? null : BoxDecoration(color: Colors.white, border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
decoration: isDesktopScreen
? null
: BoxDecoration(
color: Colors.white,
border: Border(
bottom:
BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(
children: [
Icon(
@ -293,7 +322,9 @@ class _GroupProfileGroupManagePageState extends TIMUIKitState<GroupProfileGroupM
isDarkBackground: false,
borderRadius: const BorderRadius.all(Radius.circular(4)),
context: context,
offset: Offset(min(details.globalPosition.dx, MediaQuery.of(context).size.width - 80), details.globalPosition.dy),
offset: Offset(
min(details.globalPosition.dx, MediaQuery.of(context).size.width - 80),
details.globalPosition.dy),
child: (onClose) => TUIKitColumnMenu(data: [
ColumnMenuItem(
label: TIM_t("删除"),
@ -408,7 +439,10 @@ Widget _buildListItem(BuildContext context, V2TimGroupMemberFullInfo memberInfo,
);
}
return TUIKitScreenUtils.getDeviceWidget(context: context, desktopWidget: nameItem(), defaultWidget: SingleChildScrollView(child: Slidable(endActionPane: endActionPane, child: nameItem())));
return TUIKitScreenUtils.getDeviceWidget(
context: context,
desktopWidget: nameItem(),
defaultWidget: SingleChildScrollView(child: Slidable(endActionPane: endActionPane, child: nameItem())));
}
///
@ -509,7 +543,12 @@ class _GroupProfileSetManagerPageState extends TIMUIKitState<GroupProfileSetMana
padding: const EdgeInsets.symmetric(
vertical: 12,
),
decoration: isDesktopScreen ? null : BoxDecoration(color: Colors.white, border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
decoration: isDesktopScreen
? null
: BoxDecoration(
color: Colors.white,
border: Border(
bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(
children: [
Icon(
@ -537,7 +576,10 @@ class _GroupProfileSetManagerPageState extends TIMUIKitState<GroupProfileSetMana
},
child: (onClose) => GroupProfileAddAdmin(
key: groupProfileAddAdminKey,
memberList: memberList.where((element) => element?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER).toList(),
memberList: memberList
.where(
(element) => element?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER)
.toList(),
appbarTitle: TIM_t("设置管理员"),
selectCompletedHandler: (context, selectedMember) async {
if (selectedMember.isNotEmpty) {
@ -554,7 +596,10 @@ class _GroupProfileSetManagerPageState extends TIMUIKitState<GroupProfileSetMana
MaterialPageRoute(
builder: (context) => GroupProfileAddAdmin(
key: groupProfileAddAdminKey,
memberList: memberList.where((element) => element?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER).toList(),
memberList: memberList
.where((element) =>
element?.role == GroupMemberRoleType.V2TIM_GROUP_MEMBER_ROLE_MEMBER)
.toList(),
appbarTitle: TIM_t("设置管理员"),
selectCompletedHandler: (context, selectedMember) async {
if (selectedMember.isNotEmpty) {
@ -576,7 +621,8 @@ class _GroupProfileSetManagerPageState extends TIMUIKitState<GroupProfileSetMana
isDarkBackground: false,
borderRadius: const BorderRadius.all(Radius.circular(4)),
context: context,
offset: Offset(min(details.globalPosition.dx, MediaQuery.of(context).size.width - 80), details.globalPosition.dy),
offset: Offset(min(details.globalPosition.dx, MediaQuery.of(context).size.width - 80),
details.globalPosition.dy),
child: (onClose) => TUIKitColumnMenu(data: [
ColumnMenuItem(
label: TIM_t("删除"),
@ -638,7 +684,9 @@ class GroupProfileAddAdmin extends StatefulWidget {
final String appbarTitle;
final void Function(BuildContext context, List<V2TimGroupMemberFullInfo?> selectedMemberList)? selectCompletedHandler;
const GroupProfileAddAdmin({Key? key, required this.memberList, this.selectCompletedHandler, required this.appbarTitle}) : super(key: key);
const GroupProfileAddAdmin(
{Key? key, required this.memberList, this.selectCompletedHandler, required this.appbarTitle})
: super(key: key);
@override
State<StatefulWidget> createState() => _GroupProfileAddAdminState();
@ -672,7 +720,10 @@ class _GroupProfileAddAdminState extends TIMUIKitState<GroupProfileAddAdmin> {
),
...widget.memberList
.map((e) => Container(
decoration: BoxDecoration(color: Colors.white, border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
decoration: BoxDecoration(
color: Colors.white,
border:
Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16),
child: InkWell(
onTap: () {

View File

@ -4,7 +4,8 @@ import 'package:dotted_border/dotted_border.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_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_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_group_profile_model.dart';
@ -87,7 +88,8 @@ class GroupMemberTitle extends TIMUIKitStatelessWidget {
return [];
}
void navigateToMemberList(BuildContext context, TUIGroupProfileModel model, List<V2TimGroupMemberFullInfo?> memberList) {
void navigateToMemberList(
BuildContext context, TUIGroupProfileModel model, List<V2TimGroupMemberFullInfo?> memberList) {
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
if (!isDesktopScreen) {
Navigator.push(
@ -134,7 +136,10 @@ class GroupMemberTitle extends TIMUIKitStatelessWidget {
children: [
Container(
padding: const EdgeInsets.only(bottom: 12),
decoration: isDesktopScreen ? null : BoxDecoration(border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
decoration: isDesktopScreen
? null
: BoxDecoration(
border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: InkWell(
onTap: () async {
navigateToMemberList(context, model, memberList);

View File

@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_application.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/new_contact_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart';
@ -13,8 +14,7 @@ import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart';
import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme_view_model.dart';
typedef NewContactItemBuilder = Widget Function(
BuildContext context, V2TimFriendApplication applicationInfo);
typedef NewContactItemBuilder = Widget Function(BuildContext context, V2TimFriendApplication applicationInfo);
class TIMUIKitNewContact extends StatefulWidget {
/// the callback when accept friend request
@ -33,12 +33,7 @@ class TIMUIKitNewContact extends StatefulWidget {
final NewContactLifeCycle? lifeCycle;
const TIMUIKitNewContact(
{Key? key,
this.lifeCycle,
this.onAccept,
this.onRefuse,
this.emptyBuilder,
this.itemBuilder})
{Key? key, this.lifeCycle, this.onAccept, this.onRefuse, this.emptyBuilder, this.itemBuilder})
: super(key: key);
@override
@ -49,28 +44,22 @@ class _TIMUIKitNewContactState extends TIMUIKitState<TIMUIKitNewContact> {
late TUIFriendShipViewModel model = serviceLocator<TUIFriendShipViewModel>();
_getShowName(V2TimFriendApplication item) {
return TencentUtils.checkString(item.nickname) ??
TencentUtils.checkString(item.userID);
return TencentUtils.checkString(item.nickname) ?? TencentUtils.checkString(item.userID);
}
Widget _itemBuilder(
BuildContext context, V2TimFriendApplication applicationInfo) {
Widget _itemBuilder(BuildContext context, V2TimFriendApplication applicationInfo) {
final theme = Provider.of<TUIThemeViewModel>(context).theme;
final showName = _getShowName(applicationInfo);
final faceUrl = applicationInfo.faceUrl ?? "";
final applicationText = applicationInfo.addWording ?? "";
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return Material(
color: theme.wideBackgroundColor,
child: InkWell(
onTap: () {},
child: Container(
padding: EdgeInsets.only(
top: isDesktopScreen ? 6 : 10,
left: 16,
right: isDesktopScreen ? 16 : 0),
padding: EdgeInsets.only(top: isDesktopScreen ? 6 : 10, left: 16, right: isDesktopScreen ? 16 : 0),
child: Row(
children: [
Container(
@ -86,27 +75,19 @@ class _TIMUIKitNewContactState extends TIMUIKitState<TIMUIKitNewContact> {
child: Container(
padding: const EdgeInsets.only(top: 10, bottom: 20),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: theme.weakDividerColor ??
CommonColor.weakDividerColor))),
border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Padding(
padding: EdgeInsets.only(
top: (applicationText.isNotEmpty && isDesktopScreen)
? 10
: 0),
padding: EdgeInsets.only(top: (applicationText.isNotEmpty && isDesktopScreen) ? 10 : 0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
showName,
style: TextStyle(
color: theme.darkTextColor,
fontSize: isDesktopScreen ? 14 : 18),
style: TextStyle(color: theme.darkTextColor, fontSize: isDesktopScreen ? 14 : 18),
),
if (applicationText.isNotEmpty && isDesktopScreen)
const SizedBox(
@ -115,8 +96,7 @@ class _TIMUIKitNewContactState extends TIMUIKitState<TIMUIKitNewContact> {
if (applicationText.isNotEmpty && isDesktopScreen)
Text(
applicationText,
style: TextStyle(
color: theme.weakTextColor, fontSize: 12),
style: TextStyle(color: theme.weakTextColor, fontSize: 12),
),
],
),
@ -126,15 +106,11 @@ class _TIMUIKitNewContactState extends TIMUIKitState<TIMUIKitNewContact> {
margin: const EdgeInsets.only(right: 8),
child: InkWell(
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 14, vertical: 6),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: theme.primaryColor,
border: Border.all(
width: 1,
color: theme.weakTextColor ??
CommonColor.weakTextColor)),
border: Border.all(width: 1, color: theme.weakTextColor ?? CommonColor.weakTextColor)),
child: Text(
TIM_t("同意"),
style: TextStyle(
@ -163,12 +139,8 @@ class _TIMUIKitNewContactState extends TIMUIKitState<TIMUIKitNewContact> {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.white,
border: Border.all(
width: 1,
color: theme.weakTextColor ??
CommonColor.weakTextColor)),
padding: const EdgeInsets.symmetric(
horizontal: 14, vertical: 6),
border: Border.all(width: 1, color: theme.weakTextColor ?? CommonColor.weakTextColor)),
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 6),
child: Text(
TIM_t("拒绝"),
style: TextStyle(

View File

@ -1,7 +1,10 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
enum ProfileWidgetEnum {
/// THe card shows the user info of a specific user.
@ -85,13 +88,11 @@ class ProfileWidgetBuilder {
/// The switch of if add another user to block list.
/// This will not shows when friendship relation not exist as default.
Widget Function(bool isAsBlocked, Function(bool value)? onChange)?
addToBlockListBar;
Widget Function(bool isAsBlocked, Function(bool value)? onChange)? addToBlockListBar;
/// The switch of if pin the one-to-one conversation to the top of the conversation list.
/// This will not shows when friendship relation not exist as default.
Widget Function(bool isPinned, Function(bool value)? onChange)?
pinConversationBar;
Widget Function(bool isPinned, Function(bool value)? onChange)? pinConversationBar;
/// The switch of if mute the message notification from a specific user.
/// This will not shows when friendship relation not exist as default.
@ -136,28 +137,23 @@ class ProfileWidgetBuilder {
/// The area shows the buttons,
/// contains "Send message", "Voice/Video Call", "Delete friend" when has the friend relationship,
/// while contains "Add friend" when no relationship exists, as default.
Widget Function(V2TimFriendInfo friendInfo, V2TimConversation conversation,
int friendType, bool isDisturb)? addAndDeleteArea;
Widget Function(V2TimFriendInfo friendInfo, V2TimConversation conversation, int friendType, bool isDisturb)?
addAndDeleteArea;
/// Custom area, you may define send message, make calling, search or anything you want here.
Widget Function(bool isFriend, V2TimFriendInfo friendInfo,
V2TimConversation conversation)? customBuilderOne;
Widget Function(bool isFriend, V2TimFriendInfo friendInfo, V2TimConversation conversation)? customBuilderOne;
/// Custom area, you may define send message, make calling, search or anything you want here.
Widget Function(bool isFriend, V2TimFriendInfo friendInfo,
V2TimConversation conversation)? customBuilderTwo;
Widget Function(bool isFriend, V2TimFriendInfo friendInfo, V2TimConversation conversation)? customBuilderTwo;
/// Custom area, you may define send message, make calling, search or anything you want here.
Widget Function(bool isFriend, V2TimFriendInfo friendInfo,
V2TimConversation conversation)? customBuilderThree;
Widget Function(bool isFriend, V2TimFriendInfo friendInfo, V2TimConversation conversation)? customBuilderThree;
/// Custom area, you may define send message, make calling, search or anything you want here.
Widget Function(bool isFriend, V2TimFriendInfo friendInfo,
V2TimConversation conversation)? customBuilderFour;
Widget Function(bool isFriend, V2TimFriendInfo friendInfo, V2TimConversation conversation)? customBuilderFour;
/// Custom area, you may define send message, make calling, search or anything you want here.
Widget Function(bool isFriend, V2TimFriendInfo friendInfo,
V2TimConversation conversation)? customBuilderFive;
Widget Function(bool isFriend, V2TimFriendInfo friendInfo, V2TimConversation conversation)? customBuilderFive;
ProfileWidgetBuilder(
{this.operationDivider,

View File

@ -2,9 +2,12 @@ import 'package:flutter/material.dart';
import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/life_cycle/profile_life_cycle.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_profile_view_model.dart';
@ -19,11 +22,7 @@ import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/widget/tim_uik
typedef OnSelfAvatarTap = void Function();
typedef ProfileBuilder = Widget Function(
BuildContext context,
V2TimFriendInfo userInfo,
V2TimConversation conversation,
int friendType,
bool isMute);
BuildContext context, V2TimFriendInfo userInfo, V2TimConversation conversation, int friendType, bool isMute);
class TIMUIKitProfile extends StatefulWidget {
/// user ID
@ -31,23 +30,19 @@ class TIMUIKitProfile extends StatefulWidget {
/// [Deprecated:] the builder for custom operation list.
/// [operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead.
final Widget Function(
BuildContext context,
V2TimFriendInfo friendInfo,
V2TimConversation conversation,
int friendType,
bool isMute)? operationListBuilder;
final Widget Function(BuildContext context, V2TimFriendInfo friendInfo, V2TimConversation conversation,
int friendType, bool isMute)? operationListBuilder;
/// [Deprecated:] The builder for custom bottom operation area.
/// [operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead.
final Widget Function(BuildContext context, V2TimFriendInfo? friendInfo,
V2TimConversation? conversation, int friendType)? bottomOperationBuilder;
final Widget Function(
BuildContext context, V2TimFriendInfo? friendInfo, V2TimConversation? conversation, int friendType)?
bottomOperationBuilder;
/// [Deprecated:] Callback when clicking profile detail card.
/// This widget will no longer shows the personal info card and can not jump to personal info page automatically,
/// please navigate to your custom personal info page manually and directly, you may refer to our demo.
final void Function(BuildContext context, V2TimUserFullInfo? userFullInfo)?
handleProfileDetailCardTap;
final void Function(BuildContext context, V2TimUserFullInfo? userFullInfo)? handleProfileDetailCardTap;
/// Profile Controller
final TIMUIKitProfileController? controller;
@ -90,11 +85,9 @@ class TIMUIKitProfile extends StatefulWidget {
const TIMUIKitProfile(
{Key? key,
required this.userID,
@Deprecated(
"[operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead")
@Deprecated("[operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead")
this.operationListBuilder,
@Deprecated(
"[operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead")
@Deprecated("[operationListBuilder] and [bottomOperationBuilder] merged into [builder], please use it instead")
this.bottomOperationBuilder,
@Deprecated(
"This widget will no longer shows the personal info card and can not jump to personal info page automatically, please navigate to your custom personal info page manually and directly, you may refer to our demo")
@ -139,11 +132,9 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
@override
void didUpdateWidget(covariant TIMUIKitProfile oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.userID != widget.userID ||
_model.userProfile?.friendInfo?.userID != widget.userID) {
if (oldWidget.userID != widget.userID || _model.userProfile?.friendInfo?.userID != widget.userID) {
_model.userProfile = null;
_model.loadData(
userID: widget.userID, isNeedConversation: !widget.isSelf);
_model.loadData(userID: widget.userID, isNeedConversation: !widget.isSelf);
}
}
@ -162,14 +153,12 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme;
final isDesktopScreen =
TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
final isDesktopScreen = TUIKitScreenUtils.getFormFactor(context) == DeviceType.Desktop;
return ChangeNotifierProvider.value(
value: _model,
child: Consumer<TUIProfileViewModel>(
builder: (context, value, child) {
final TUIProfileViewModel model =
Provider.of<TUIProfileViewModel>(context);
final TUIProfileViewModel model = Provider.of<TUIProfileViewModel>(context);
_controller.model = model;
final V2TimFriendInfo? userInfo = model.userProfile?.friendInfo;
@ -188,25 +177,20 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
type: 1,
userID: widget.userID,
faceUrl: model.userProfile?.friendInfo?.userProfile?.faceUrl,
showName: TencentUtils.checkString(
model.userProfile?.friendInfo?.friendRemark) ??
TencentUtils.checkString(model
.userProfile?.friendInfo?.userProfile?.nickName) ??
showName: TencentUtils.checkString(model.userProfile?.friendInfo?.friendRemark) ??
TencentUtils.checkString(model.userProfile?.friendInfo?.userProfile?.nickName) ??
widget.userID);
final TUISelfInfoViewModel _selfInfoViewModel =
serviceLocator<TUISelfInfoViewModel>();
final TUISelfInfoViewModel _selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
final isFriend = model.friendType != 0;
final isSelf = (model.userProfile?.friendInfo?.userID ==
_selfInfoViewModel.loginInfo?.userID);
final isSelf = (model.userProfile?.friendInfo?.userID == _selfInfoViewModel.loginInfo?.userID);
final isMute = model.isDisturb ?? false;
Widget profilePage({required Widget child}) {
return Container(
color: isDesktopScreen ? theme.wideBackgroundColor : null,
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(
parent: AlwaysScrollableScrollPhysics()),
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
child: Container(
child: child,
),
@ -234,8 +218,7 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
title: TIM_t("修改备注名"),
tips: TIM_t("仅限汉字、英文、数字和下划线"),
onSubmitted: (String remark) async {
final res =
await _controller.updateRemarks(widget.userID, remark);
final res = await _controller.updateRemarks(widget.userID, remark);
if (res.code == 0) {
widget.lifeCycle?.didRemarkUpdated(remark);
}
@ -255,47 +238,37 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
}
List<Widget> _renderWidgetsWithOrder(List<ProfileWidgetEnum> order) {
final ProfileWidgetBuilder? customBuilder =
widget.profileWidgetBuilder;
final ProfileWidgetBuilder? customBuilder = widget.profileWidgetBuilder;
return order.map((element) {
switch (element) {
case ProfileWidgetEnum.userInfoCard:
return (customBuilder?.userInfoCard != null
? customBuilder?.userInfoCard!(userInfo.userProfile)
: TIMUIKitProfileUserInfoCard(
userInfo: userInfo.userProfile))!;
: TIMUIKitProfileUserInfoCard(userInfo: userInfo.userProfile))!;
case ProfileWidgetEnum.addToBlockListBar:
if (isSelf) {
return Container();
}
return (customBuilder?.addToBlockListBar != null
? customBuilder?.addToBlockListBar!(
model.isAddToBlackList ?? false, handleAddToBlockList)
? customBuilder?.addToBlockListBar!(model.isAddToBlackList ?? false, handleAddToBlockList)
: TIMUIKitProfileWidget.addToBlackListBar(
model.isAddToBlackList ?? false,
context,
handleAddToBlockList,
widget.smallCardMode))!;
model.isAddToBlackList ?? false, context, handleAddToBlockList, widget.smallCardMode))!;
case ProfileWidgetEnum.pinConversationBar:
// if (!isFriend) {
// return Container();
// }
return (customBuilder?.pinConversationBar != null
? customBuilder?.pinConversationBar!(
conversation.isPinned ?? false, handlePinConversation)
? customBuilder?.pinConversationBar!(conversation.isPinned ?? false, handlePinConversation)
: TIMUIKitProfileWidget.pinConversationBar(
conversation.isPinned ?? false,
context,
handlePinConversation,
widget.smallCardMode))!;
conversation.isPinned ?? false, context, handlePinConversation, widget.smallCardMode))!;
case ProfileWidgetEnum.messageMute:
// if (!isFriend) {
// return Container();
// }
return (customBuilder?.messageMute != null
? customBuilder?.messageMute!(isMute, handleMuteMessage)
: TIMUIKitProfileWidget.messageDisturb(context, isMute,
handleMuteMessage, widget.smallCardMode))!;
: TIMUIKitProfileWidget.messageDisturb(
context, isMute, handleMuteMessage, widget.smallCardMode))!;
case ProfileWidgetEnum.searchBar:
return (customBuilder?.searchBar != null
? customBuilder?.searchBar!(conversation)
@ -305,44 +278,30 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
return (customBuilder?.portraitBar != null
? customBuilder?.portraitBar!(userInfo.userProfile)
: TIMUIKitProfileWidget.portraitBar(
TIMUIKitProfileWidget.defaultPortraitWidget(
userInfo.userProfile, widget.smallCardMode),
TIMUIKitProfileWidget.defaultPortraitWidget(userInfo.userProfile, widget.smallCardMode),
widget.smallCardMode))!;
case ProfileWidgetEnum.nicknameBar:
return (customBuilder?.nicknameBar != null
? customBuilder
?.nicknameBar!(userInfo.userProfile?.nickName ?? "")
: TIMUIKitProfileWidget.nicknameBar(
userInfo.userProfile?.nickName ?? "",
widget.smallCardMode))!;
? customBuilder?.nicknameBar!(userInfo.userProfile?.nickName ?? "")
: TIMUIKitProfileWidget.nicknameBar(userInfo.userProfile?.nickName ?? "", widget.smallCardMode))!;
case ProfileWidgetEnum.userAccountBar:
return (customBuilder?.userAccountBar != null
? customBuilder
?.userAccountBar!(userInfo.userProfile?.userID ?? "")
? customBuilder?.userAccountBar!(userInfo.userProfile?.userID ?? "")
: TIMUIKitProfileWidget.userAccountBar(
userInfo.userProfile?.userID ?? "",
widget.smallCardMode))!;
userInfo.userProfile?.userID ?? "", widget.smallCardMode))!;
case ProfileWidgetEnum.signatureBar:
return (customBuilder?.signatureBar != null
? customBuilder?.signatureBar!(
userInfo.userProfile?.selfSignature ?? "")
? customBuilder?.signatureBar!(userInfo.userProfile?.selfSignature ?? "")
: TIMUIKitProfileWidget.signatureBar(
userInfo.userProfile?.selfSignature ?? "",
widget.smallCardMode))!;
userInfo.userProfile?.selfSignature ?? "", widget.smallCardMode))!;
case ProfileWidgetEnum.genderBar:
return (customBuilder?.genderBar != null
? customBuilder
?.genderBar!(userInfo.userProfile?.gender ?? 0)
: TIMUIKitProfileWidget.genderBar(
userInfo.userProfile?.gender ?? 0,
widget.smallCardMode))!;
? customBuilder?.genderBar!(userInfo.userProfile?.gender ?? 0)
: TIMUIKitProfileWidget.genderBar(userInfo.userProfile?.gender ?? 0, widget.smallCardMode))!;
case ProfileWidgetEnum.birthdayBar:
return (customBuilder?.birthdayBar != null
? customBuilder
?.birthdayBar!(userInfo.userProfile?.birthday)
: TIMUIKitProfileWidget.birthdayBar(
userInfo.userProfile?.birthday,
widget.smallCardMode))!;
? customBuilder?.birthdayBar!(userInfo.userProfile?.birthday)
: TIMUIKitProfileWidget.birthdayBar(userInfo.userProfile?.birthday, widget.smallCardMode))!;
case ProfileWidgetEnum.addAndDeleteArea:
if (isSelf) {
return Container();
@ -381,50 +340,39 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
: TIMUIKitProfileWidget.operationDivider(
color: theme.weakDividerColor,
height: isDesktopScreen ? 1 : 10,
margin: isDesktopScreen
? EdgeInsets.symmetric(
vertical: widget.smallCardMode ? 4 : 20)
: null))!;
margin:
isDesktopScreen ? EdgeInsets.symmetric(vertical: widget.smallCardMode ? 4 : 20) : null))!;
case ProfileWidgetEnum.remarkBar:
if (!isFriend) {
return Container();
}
return (customBuilder?.remarkBar != null
? customBuilder?.remarkBar!(
userInfo.friendRemark ?? "", handleTapRemarkBar)
? customBuilder?.remarkBar!(userInfo.friendRemark ?? "", handleTapRemarkBar)
: TIMUIKitProfileWidget.remarkBar(
context,
userInfo.friendRemark ?? "",
handleTapRemarkBar,
widget.smallCardMode))!;
context, userInfo.friendRemark ?? "", handleTapRemarkBar, widget.smallCardMode))!;
case ProfileWidgetEnum.customBuilderOne:
return (customBuilder?.customBuilderOne != null
? customBuilder?.customBuilderOne!(
isFriend, userInfo, conversation)
? customBuilder?.customBuilderOne!(isFriend, userInfo, conversation)
// Please define the corresponding custom widget in `profileWidgetBuilder` before using it here.
: Text(TIM_t("如使用自定义区域请在profileWidgetBuilder传入对应组件")))!;
case ProfileWidgetEnum.customBuilderTwo:
return (customBuilder?.customBuilderTwo != null
? customBuilder?.customBuilderTwo!(
isFriend, userInfo, conversation)
? customBuilder?.customBuilderTwo!(isFriend, userInfo, conversation)
// Please define the corresponding custom widget in `profileWidgetBuilder` before using it here.
: Text(TIM_t("如使用自定义区域请在profileWidgetBuilder传入对应组件")))!;
case ProfileWidgetEnum.customBuilderThree:
return (customBuilder?.customBuilderThree != null
? customBuilder?.customBuilderThree!(
isFriend, userInfo, conversation)
? customBuilder?.customBuilderThree!(isFriend, userInfo, conversation)
// Please define the corresponding custom widget in `profileWidgetBuilder` before using it here.
: Text(TIM_t("如使用自定义区域请在profileWidgetBuilder传入对应组件")))!;
case ProfileWidgetEnum.customBuilderFour:
return (customBuilder?.customBuilderFour != null
? customBuilder?.customBuilderFour!(
isFriend, userInfo, conversation)
? customBuilder?.customBuilderFour!(isFriend, userInfo, conversation)
// Please define the corresponding custom widget in `profileWidgetBuilder` before using it here.
: Text(TIM_t("如使用自定义区域请在profileWidgetBuilder传入对应组件")))!;
case ProfileWidgetEnum.customBuilderFive:
return (customBuilder?.customBuilderFive != null
? customBuilder?.customBuilderFive!(
isFriend, userInfo, conversation)
? customBuilder?.customBuilderFive!(isFriend, userInfo, conversation)
// Please define the corresponding custom widget in `profileWidgetBuilder` before using it here.
: Text(TIM_t("如使用自定义区域请在profileWidgetBuilder传入对应组件")))!;
@ -435,14 +383,11 @@ class _TIMUIKitProfileState extends TIMUIKitState<TIMUIKitProfile> {
}
if (widget.builder != null) {
return widget.builder!(
context, userInfo, conversation, value.friendType, isMute);
return widget.builder!(context, userInfo, conversation, value.friendType, isMute);
} else if (widget.profileWidgetsOrder != null) {
return profilePage(
child: Column(
children: [
..._renderWidgetsWithOrder(widget.profileWidgetsOrder!)
],
children: [..._renderWidgetsWithOrder(widget.profileWidgetsOrder!)],
),
);
} else {

View File

@ -1,7 +1,8 @@
// ignore_for_file: deprecated_member_use_from_same_package
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitProfile/widget/tim_uikit_profile_userinfo_card/tim_uikit_profile_userinfo_card_narrow.dart';
@ -19,8 +20,9 @@ class TIMUIKitProfileUserInfoCard extends StatelessWidget {
const TIMUIKitProfileUserInfoCard(
{Key? key,
this.userInfo,
@Deprecated("This info card can no longer navigate to default personal profile page automatically, please deal with it manually.")
this.isJumpToPersonalProfile = false,
@Deprecated(
"This info card can no longer navigate to default personal profile page automatically, please deal with it manually.")
this.isJumpToPersonalProfile = false,
this.showArrowRightIcon = false,
this.onClickAvatar})
: super(key: key);

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart';
@ -19,8 +20,9 @@ class TIMUIKitProfileUserInfoCardNarrow extends TIMUIKitStatelessWidget {
{Key? key,
this.onClickAvatar,
this.userInfo,
@Deprecated("This info card can no longer navigate to default personal profile page automatically, please deal with it manually.")
this.isJumpToPersonalProfile = false,
@Deprecated(
"This info card can no longer navigate to default personal profile page automatically, please deal with it manually.")
this.isJumpToPersonalProfile = false,
this.showArrowRightIcon = false})
: super(key: key);
@ -32,9 +34,8 @@ class TIMUIKitProfileUserInfoCardNarrow extends TIMUIKitStatelessWidget {
final signature = userInfo?.selfSignature;
final showName = nickName != "" ? nickName : userInfo?.userID;
final option1 = signature;
final signatureText = option1 != null
? TIM_t_para("个性签名: {{option1}}", "个性签名: $option1")(option1: option1)
: TIM_t("暂无个性签名");
final signatureText =
option1 != null ? TIM_t_para("个性签名: {{option1}}", "个性签名: $option1")(option1: option1) : TIM_t("暂无个性签名");
return Container(
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
@ -76,25 +77,20 @@ class TIMUIKitProfileUserInfoCardNarrow extends TIMUIKitStatelessWidget {
children: [
Text(
"ID: ",
style:
TextStyle(fontSize: 13, color: theme.weakTextColor),
style: TextStyle(fontSize: 13, color: theme.weakTextColor),
),
SelectableText(
userInfo?.userID ?? "",
style:
TextStyle(fontSize: 13, color: theme.weakTextColor),
style: TextStyle(fontSize: 13, color: theme.weakTextColor),
),
],
),
),
SelectableText(signatureText,
style: TextStyle(fontSize: 13, color: theme.weakTextColor))
SelectableText(signatureText, style: TextStyle(fontSize: 13, color: theme.weakTextColor))
],
),
),
showArrowRightIcon
? const Icon(Icons.keyboard_arrow_right)
: Container()
showArrowRightIcon ? const Icon(Icons.keyboard_arrow_right) : Container()
],
),
);

View File

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/avatar.dart';
@ -19,8 +20,9 @@ class TIMUIKitProfileUserInfoCardWide extends TIMUIKitStatelessWidget {
{Key? key,
this.userInfo,
this.onClickAvatar,
@Deprecated("This info card can no longer navigate to default personal profile page automatically, please deal with it manually.")
this.isJumpToPersonalProfile = false,
@Deprecated(
"This info card can no longer navigate to default personal profile page automatically, please deal with it manually.")
this.isJumpToPersonalProfile = false,
this.showArrowRightIcon = false})
: super(key: key);
@ -55,22 +57,19 @@ class TIMUIKitProfileUserInfoCardWide extends TIMUIKitStatelessWidget {
children: [
Text(
"ID: ",
style:
TextStyle(fontSize: 12, color: theme.weakTextColor),
style: TextStyle(fontSize: 12, color: theme.weakTextColor),
),
Expanded(child: SelectableText(
Expanded(
child: SelectableText(
userInfo?.userID ?? "",
style:
TextStyle(fontSize: 12, color: theme.weakTextColor),
style: TextStyle(fontSize: 12, color: theme.weakTextColor),
)),
],
),
if (signature != null)
Container(
margin: const EdgeInsets.only(top: 18),
child: SelectableText(signature,
style: TextStyle(
fontSize: 14, color: hexToColor("7f7f7f"))),
child: SelectableText(signature, style: TextStyle(fontSize: 14, color: hexToColor("7f7f7f"))),
)
],
),
@ -93,9 +92,7 @@ class TIMUIKitProfileUserInfoCardWide extends TIMUIKitStatelessWidget {
),
),
),
showArrowRightIcon
? const Icon(Icons.keyboard_arrow_right)
: Container()
showArrowRightIcon ? const Icon(Icons.keyboard_arrow_right) : Container()
],
)
],

View File

@ -3,9 +3,12 @@ import 'dart:math';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
@ -14,11 +17,9 @@ import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
class TIMUIKitProfileWidget extends TIMUIKitClass {
static final bool isDesktopScreen =
TUIKitScreenUtils.getFormFactor() == DeviceType.Desktop;
static final bool isDesktopScreen = TUIKitScreenUtils.getFormFactor() == DeviceType.Desktop;
static Widget operationDivider(
{Color? color, double? height, EdgeInsetsGeometry? margin}) {
static Widget operationDivider({Color? color, double? height, EdgeInsetsGeometry? margin}) {
return Container(
color: color,
margin: margin,
@ -27,21 +28,15 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
}
/// Remarks
static Widget remarkBar(
BuildContext context,
String remark,
Function({Offset? offset, String? initText})? handleTap,
static Widget remarkBar(BuildContext context, String remark, Function({Offset? offset, String? initText})? handleTap,
bool smallCardMode) {
final GlobalKey key = GlobalKey();
return InkWell(
onTapDown: (details) {
if (handleTap != null) {
handleTap(
offset: Offset(
min(details.globalPosition.dx,
MediaQuery.of(context).size.width - 400),
min(details.globalPosition.dy,
MediaQuery.of(context).size.height - 100)),
offset: Offset(min(details.globalPosition.dx, MediaQuery.of(context).size.width - 400),
min(details.globalPosition.dy, MediaQuery.of(context).size.height - 100)),
initText: remark);
}
},
@ -51,15 +46,14 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
isEmpty: remark.isEmpty,
wideEditText: TIM_t("设置备注名"),
operationName: TIM_t("备注名"),
operationRightWidget:
Text(remark, textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(remark, textAlign: isDesktopScreen ? null : TextAlign.end),
),
);
}
/// add to block list
static Widget addToBlackListBar(bool value, BuildContext context,
Function(bool value)? onChanged, bool smallCardMode) {
static Widget addToBlackListBar(
bool value, BuildContext context, Function(bool value)? onChanged, bool smallCardMode) {
return TIMUIKitOperationItem(
smallCardMode: smallCardMode,
isEmpty: false,
@ -75,8 +69,8 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
}
/// pin the conversation to the top
static Widget pinConversationBar(bool value, BuildContext context,
Function(bool value)? onChanged, bool smallCardMode) {
static Widget pinConversationBar(
bool value, BuildContext context, Function(bool value)? onChanged, bool smallCardMode) {
return TIMUIKitOperationItem(
smallCardMode: smallCardMode,
isEmpty: false,
@ -92,8 +86,8 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
}
/// message disturb
static Widget messageDisturb(BuildContext context, bool isDisturb,
Function(bool value)? onChanged, bool smallCardMode) {
static Widget messageDisturb(
BuildContext context, bool isDisturb, Function(bool value)? onChanged, bool smallCardMode) {
return TIMUIKitOperationItem(
smallCardMode: smallCardMode,
isEmpty: false,
@ -121,8 +115,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
isEmpty: isEmpty,
operationName: operationName,
type: type,
operationRightWidget: Text(operationText ?? "",
textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(operationText ?? "", textAlign: isDesktopScreen ? null : TextAlign.end),
operationValue: operationValue,
onSwitchChange: onSwitchChange,
);
@ -163,8 +156,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
}
/// defaultPortraitWidget
static Widget defaultPortraitWidget(
V2TimUserFullInfo? userInfo, bool smallCardMode) {
static Widget defaultPortraitWidget(V2TimUserFullInfo? userInfo, bool smallCardMode) {
return SizedBox(
width: 48,
height: 48,
@ -189,8 +181,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
isEmpty: nickName.isEmpty,
showAllowEditStatus: false,
operationName: TIM_t("昵称"),
operationRightWidget:
Text(nickName, textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(nickName, textAlign: isDesktopScreen ? null : TextAlign.end),
),
);
}
@ -203,8 +194,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
isEmpty: false,
showAllowEditStatus: false,
operationName: TIM_t("账号"),
operationRightWidget: SelectableText(userNum,
textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: SelectableText(userNum, textAlign: isDesktopScreen ? null : TextAlign.end),
),
);
}
@ -217,8 +207,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
isEmpty: false,
showAllowEditStatus: false,
operationName: TIM_t("个性签名"),
operationRightWidget:
Text(signature, textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(signature, textAlign: isDesktopScreen ? null : TextAlign.end),
),
);
}
@ -236,8 +225,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
isEmpty: false,
showAllowEditStatus: false,
operationName: TIM_t("性别"),
operationRightWidget: Text(genderMap[gender],
textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(genderMap[gender], textAlign: isDesktopScreen ? null : TextAlign.end),
),
);
}
@ -254,8 +242,7 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
smallCardMode: smallCardMode,
isEmpty: false,
operationName: TIM_t("性别"),
operationRightWidget: Text(genderMap[gender],
textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(genderMap[gender], textAlign: isDesktopScreen ? null : TextAlign.end),
),
);
}
@ -269,16 +256,14 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
smallCardMode: smallCardMode,
isEmpty: false,
operationName: TIM_t("生日"),
operationRightWidget: Text(formatter.format(date),
textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(formatter.format(date), textAlign: isDesktopScreen ? null : TextAlign.end),
);
} catch (e) {
return TIMUIKitOperationItem(
smallCardMode: smallCardMode,
isEmpty: false,
operationName: TIM_t("生日"),
operationRightWidget:
Text(TIM_t("未填写"), textAlign: isDesktopScreen ? null : TextAlign.end),
operationRightWidget: Text(TIM_t("未填写"), textAlign: isDesktopScreen ? null : TextAlign.end),
);
}
}
@ -302,10 +287,8 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
child: Container(
alignment: Alignment.center,
padding: const EdgeInsets.symmetric(vertical: 15),
decoration: BoxDecoration(
color: Colors.white,
border:
Border(bottom: BorderSide(color: theme.weakDividerColor))),
decoration:
BoxDecoration(color: Colors.white, border: Border(bottom: BorderSide(color: theme.weakDividerColor))),
child: Text(
TIM_t("删除好友"),
style: TextStyle(color: theme.cautionColor, fontSize: 17),
@ -320,15 +303,11 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
// padding: const EdgeInsets.symmetric(vertical: 15),
decoration: BoxDecoration(
color: Colors.white,
border: Border(
bottom: BorderSide(
color: theme.weakDividerColor ??
CommonColor.weakDividerColor))),
border: Border(bottom: BorderSide(color: theme.weakDividerColor ?? CommonColor.weakDividerColor))),
child: Row(children: [
Expanded(
child: TextButton(
child: Text(TIM_t("加为好友"),
style: TextStyle(color: theme.primaryColor, fontSize: 17)),
child: Text(TIM_t("加为好友"), style: TextStyle(color: theme.primaryColor, fontSize: 17)),
onPressed: () {
handleAddFriend();
}),
@ -362,15 +341,13 @@ class TIMUIKitProfileWidget extends TIMUIKitClass {
style: TextStyle(color: color),
),
style: ButtonStyle(
minimumSize:
MaterialStateProperty.all<Size>(const Size(160, 40)),
minimumSize: MaterialStateProperty.all<Size>(const Size(160, 40)),
))
: ElevatedButton(
onPressed: onPressed,
child: Text(text),
style: ButtonStyle(
minimumSize:
MaterialStateProperty.all<Size>(const Size(180, 46)),
minimumSize: MaterialStateProperty.all<Size>(const Size(180, 46)),
backgroundColor: MaterialStateProperty.all<Color>(color)),
),
);

View File

@ -1,10 +1,15 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result_item.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info_result.dart';
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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result_item.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result_item.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart';
@ -29,12 +34,10 @@ class TIMUIKitSearch extends StatefulWidget {
/// [Deprecated] : You are supposed to use [onEnterSearchInConversation],
/// though the effects are the same.
final Function(V2TimConversation conversation, String initKeyword)?
onEnterConversation;
final Function(V2TimConversation conversation, String initKeyword)? onEnterConversation;
/// On click each conversation from 'Chat history' and searching for historical message in it.
final Function(V2TimConversation conversation, String initKeyword)?
onEnterSearchInConversation;
final Function(V2TimConversation conversation, String initKeyword)? onEnterSearchInConversation;
final VoidCallback? onBack;
@ -43,10 +46,11 @@ class TIMUIKitSearch extends StatefulWidget {
const TIMUIKitSearch(
{required this.onTapConversation,
Key? key,
@Deprecated("You are supposed to use [TIMUIKitSearchMsgDetail], if you tend to search inside a specific conversation, includes c2c and group")
this.conversation,
@Deprecated(
"You are supposed to use [TIMUIKitSearchMsgDetail], if you tend to search inside a specific conversation, includes c2c and group")
this.conversation,
@Deprecated("You are supposed to use [onEnterSearchInConversation], though the effects are the same.")
this.onEnterConversation,
this.onEnterConversation,
this.isAutoFocus = true,
this.onEnterSearchInConversation,
this.onBack})
@ -61,11 +65,7 @@ class TIMUIKitSearchState extends TIMUIKitState<TIMUIKitSearch> {
final model = serviceLocator<TUISearchViewModel>();
final FocusNode focusNode = FocusNode();
GlobalKey<dynamic> inputTextField = GlobalKey();
List<SearchType> searchTypes = [
SearchType.group,
SearchType.contact,
SearchType.history
];
List<SearchType> searchTypes = [SearchType.group, SearchType.contact, SearchType.history];
@override
void initState() {
@ -80,19 +80,12 @@ class TIMUIKitSearchState extends TIMUIKitState<TIMUIKitSearch> {
return TIMUIKitSearchNotSupport();
}
return MultiProvider(
providers: [
ChangeNotifierProvider.value(
value: serviceLocator<TUISearchViewModel>())
],
providers: [ChangeNotifierProvider.value(value: serviceLocator<TUISearchViewModel>())],
builder: (context, w) {
List<V2TimFriendInfoResult> friendResultList =
Provider.of<TUISearchViewModel>(context).friendList ?? [];
List<V2TimMessageSearchResultItem> msgList =
Provider.of<TUISearchViewModel>(context).msgList ?? [];
List<V2TimGroupInfo> groupList =
Provider.of<TUISearchViewModel>(context).groupList ?? [];
int totalMsgCount =
Provider.of<TUISearchViewModel>(context).totalMsgCount;
List<V2TimFriendInfoResult> friendResultList = Provider.of<TUISearchViewModel>(context).friendList ?? [];
List<V2TimMessageSearchResultItem> msgList = Provider.of<TUISearchViewModel>(context).msgList ?? [];
List<V2TimGroupInfo> groupList = Provider.of<TUISearchViewModel>(context).groupList ?? [];
int totalMsgCount = Provider.of<TUISearchViewModel>(context).totalMsgCount;
return GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
@ -123,14 +116,9 @@ class TIMUIKitSearchState extends TIMUIKitState<TIMUIKitSearch> {
child: SingleChildScrollView(
child: Column(
children: [
if ((friendResultList.isEmpty ||
!(searchTypes.contains(SearchType.contact))) &&
(groupList.isEmpty ||
!(searchTypes
.contains(SearchType.group))) &&
(totalMsgCount == 0 ||
!(searchTypes
.contains(SearchType.history))))
if ((friendResultList.isEmpty || !(searchTypes.contains(SearchType.contact))) &&
(groupList.isEmpty || !(searchTypes.contains(SearchType.group))) &&
(totalMsgCount == 0 || !(searchTypes.contains(SearchType.history))))
TIMUIKitSearchIndicator(
typeList: searchTypes,
onChange: (list) {
@ -143,10 +131,8 @@ class TIMUIKitSearchState extends TIMUIKitState<TIMUIKitSearch> {
TIMUIKitSearchFriend(
onTapConversation: (conversation, message) {
focusNode.unfocus();
Future.delayed(
const Duration(milliseconds: 100), () {
widget.onTapConversation(
conversation, message);
Future.delayed(const Duration(milliseconds: 100), () {
widget.onTapConversation(conversation, message);
});
},
friendResultList: friendResultList),
@ -155,8 +141,7 @@ class TIMUIKitSearchState extends TIMUIKitState<TIMUIKitSearch> {
groupList: groupList,
onTapConversation: (conversation, message) {
focusNode.unfocus();
Future.delayed(const Duration(milliseconds: 100),
() {
Future.delayed(const Duration(milliseconds: 100), () {
widget.onTapConversation(conversation, message);
});
},
@ -167,15 +152,11 @@ class TIMUIKitSearchState extends TIMUIKitState<TIMUIKitSearch> {
keyword: textEditingController.text,
totalMsgCount: totalMsgCount,
msgList: msgList,
onEnterConversation:
(V2TimConversation conversation,
String keyword) {
onEnterConversation: (V2TimConversation conversation, String keyword) {
if (widget.onEnterSearchInConversation != null) {
widget.onEnterSearchInConversation!(
conversation, keyword);
widget.onEnterSearchInConversation!(conversation, keyword);
} else if (widget.onEnterConversation != null) {
widget.onEnterConversation!(
conversation, keyword);
widget.onEnterConversation!(conversation, keyword);
}
},
),

View File

@ -5,9 +5,12 @@ import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart';
@ -19,11 +22,7 @@ class TIMUIKitSearchFriend extends StatefulWidget {
List<V2TimFriendInfoResult> friendResultList;
final Function(V2TimConversation, V2TimMessage?) onTapConversation;
TIMUIKitSearchFriend(
{required this.friendResultList,
Key? key,
required this.onTapConversation})
: super(key: key);
TIMUIKitSearchFriend({required this.friendResultList, Key? key, required this.onTapConversation}) : super(key: key);
@override
State<StatefulWidget> createState() => TIMUIKitSearchFriendState();
@ -46,31 +45,26 @@ class TIMUIKitSearchFriendState extends TIMUIKitState<TIMUIKitSearchFriend> {
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
List<V2TimConversation?> _conversationList =
Provider.of<TUISearchViewModel>(context).conversationList;
List<V2TimConversation?> _conversationList = Provider.of<TUISearchViewModel>(context).conversationList;
List<V2TimFriendInfoResult> filteredFriendResultList =
widget.friendResultList.where((friend) {
int index = _conversationList
.indexWhere((conv) => friend.friendInfo?.userID == conv?.userID);
List<V2TimFriendInfoResult> filteredFriendResultList = widget.friendResultList.where((friend) {
int index = _conversationList.indexWhere((conv) => friend.friendInfo?.userID == conv?.userID);
return index == -1 ? false : true;
}).toList();
List<V2TimFriendInfoResult> halfFilteredFriendResultList = isShowAll
? filteredFriendResultList
: filteredFriendResultList.sublist(
0, min(defaultShowLines, filteredFriendResultList.length));
: filteredFriendResultList.sublist(0, min(defaultShowLines, filteredFriendResultList.length));
if (filteredFriendResultList.isNotEmpty) {
return TIMUIKitSearchFolder(folderName: TIM_t("联系人"), children: [
...halfFilteredFriendResultList.map((conv) {
int convIndex = _conversationList
.indexWhere((item) => conv.friendInfo?.userID == item?.userID);
int convIndex = _conversationList.indexWhere((item) => conv.friendInfo?.userID == item?.userID);
V2TimConversation conversation = _conversationList[convIndex]!;
late String? showNickName;
if (conv.friendInfo?.friendRemark != null && conv.friendInfo?.friendRemark != "") {
showNickName = conv.friendInfo?.friendRemark;
} else if (conv.friendInfo?.userProfile?.nickName != null && conv.friendInfo?.userProfile?.nickName != "") {
} else if (conv.friendInfo?.userProfile?.nickName != null && conv.friendInfo?.userProfile?.nickName != "") {
showNickName = conv.friendInfo?.userProfile?.nickName;
} else {
showNickName = conv.friendInfo?.userID;
@ -82,7 +76,6 @@ class TIMUIKitSearchFriendState extends TIMUIKitState<TIMUIKitSearchFriend> {
},
faceUrl: conv.friendInfo?.userProfile?.faceUrl ?? "",
showName: "",
lineOne: conversation.userID!,
lineTwo: TIM_t("昵称") + ":" + showNickName!,
);

View File

@ -5,9 +5,12 @@ import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
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_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_state.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_item.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitSearch/pureUI/tim_uikit_search_folder.dart';
@ -19,9 +22,7 @@ class TIMUIKitSearchGroup extends StatefulWidget {
List<V2TimGroupInfo> groupList;
final Function(V2TimConversation, V2TimMessage?) onTapConversation;
TIMUIKitSearchGroup(
{required this.groupList, Key? key, required this.onTapConversation})
: super(key: key);
TIMUIKitSearchGroup({required this.groupList, Key? key, required this.onTapConversation}) : super(key: key);
@override
State<StatefulWidget> createState() => TIMUIKitSearchGroupState();
@ -44,26 +45,21 @@ class TIMUIKitSearchGroupState extends TIMUIKitState<TIMUIKitSearchGroup> {
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
List<V2TimConversation?> _conversationList =
Provider.of<TUISearchViewModel>(context).conversationList;
List<V2TimConversation?> _conversationList = Provider.of<TUISearchViewModel>(context).conversationList;
List<V2TimGroupInfo> filteredGroupResultList =
widget.groupList.where((group) {
int index = _conversationList
.indexWhere((conv) => group.groupID == conv?.groupID);
List<V2TimGroupInfo> filteredGroupResultList = widget.groupList.where((group) {
int index = _conversationList.indexWhere((conv) => group.groupID == conv?.groupID);
return index == -1 ? false : true;
}).toList();
List<V2TimGroupInfo> halfFilteredGroupResultList = isShowAll
? filteredGroupResultList
: filteredGroupResultList.sublist(
0, min(defaultShowLines, filteredGroupResultList.length));
: filteredGroupResultList.sublist(0, min(defaultShowLines, filteredGroupResultList.length));
if (filteredGroupResultList.isNotEmpty) {
return TIMUIKitSearchFolder(folderName: TIM_t("群聊"), children: [
...halfFilteredGroupResultList.map((group) {
int convIndex = _conversationList
.indexWhere((item) => group.groupID == item?.groupID);
int convIndex = _conversationList.indexWhere((item) => group.groupID == item?.groupID);
V2TimConversation conversation = _conversationList[convIndex]!;
return TIMUIKitSearchItem(
onClick: () {
@ -71,10 +67,7 @@ class TIMUIKitSearchGroupState extends TIMUIKitState<TIMUIKitSearchGroup> {
},
faceUrl: conversation.faceUrl ?? group.faceUrl ?? "",
showName: "",
lineOne: conversation.showName ??
group.groupName ??
conversation.groupID ??
"",
lineOne: conversation.showName ?? group.groupName ?? conversation.groupID ?? "",
);
}).toList(),
_renderShowALl(filteredGroupResultList.length),

View File

@ -3,9 +3,12 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result_item.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result_item.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result_item.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_statelesswidget.dart';
import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart';
@ -45,19 +48,17 @@ class TIMUIKitSearchMsg extends TIMUIKitStatelessWidget {
@override
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
List<V2TimConversation?> _conversationList =
Provider.of<TUISearchViewModel>(context).conversationList;
List<V2TimConversation?> _conversationList = Provider.of<TUISearchViewModel>(context).conversationList;
if (msgList.isNotEmpty) {
return TIMUIKitSearchFolder(folderName: TIM_t("聊天记录"), children: [
...msgList.map((conv) {
V2TimConversation? conversation;
final index = _conversationList.indexWhere(
(item) => item!.conversationID == conv?.conversationID);
if(index > -1){
final index = _conversationList.indexWhere((item) => item!.conversationID == conv?.conversationID);
if (index > -1) {
conversation = _conversationList[index]!;
}
if(conversation == null){
if (conversation == null) {
return Container();
}
final option1 = conv?.messageCount;
@ -68,8 +69,7 @@ class TIMUIKitSearchMsg extends TIMUIKitStatelessWidget {
faceUrl: conversation.faceUrl ?? "",
showName: conversation.showName ?? "",
lineOne: conversation.showName ?? "",
lineTwo: TIM_t_para("{{option1}}条相关聊天记录", "$option1条相关聊天记录")(
option1: option1),
lineTwo: TIM_t_para("{{option1}}条相关聊天记录", "$option1条相关聊天记录")(option1: option1),
);
}).toList(),
_renderShowALl(totalMsgCount > msgList.length)

Some files were not shown because too many files have changed in this diff Show More