feat: Upgrade to 2.3.3

This commit is contained in:
anonymous 2023-10-27 15:38:08 +08:00
parent 038a3d483d
commit 9c11e66fd5
12 changed files with 326 additions and 829 deletions

View File

@ -1,3 +1,13 @@
# 2.3.3
## New Features
* Added a new lifecycle hook, `messageListShouldMount`.
## Bug Fixes
* Fixed an issue on time tag creator.
# 2.3.2 # 2.3.2
## Improvements ## Improvements

View File

@ -85,26 +85,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: cached_network_image name: cached_network_image
sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.2.3" version: "3.3.0"
cached_network_image_platform_interface: cached_network_image_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: cached_network_image_platform_interface name: cached_network_image_platform_interface
sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "3.0.0"
cached_network_image_web: cached_network_image_web:
dependency: transitive dependency: transitive
description: description:
name: cached_network_image_web name: cached_network_image_web
sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.1.0"
camera: camera:
dependency: transitive dependency: transitive
description: description:
@ -237,18 +237,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dart_internal name: dart_internal
sha256: dae3976f383beddcfcd07ad5291a422df2c8c0a8a03c52cda63ac7b4f26e0f4e sha256: "689dccc3d5f62affd339534cca548dce12b3a6b32f0f10861569d3025efc0567"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.8" version: "0.2.9"
desktop_drop: desktop_drop:
dependency: transitive dependency: transitive
description: description:
name: desktop_drop name: desktop_drop
sha256: "4ca4d960f4b11c032e9adfd2a0a8ac615bc3fddb4cbe73dcf840dd8077582186" sha256: d55a010fe46c8e8fcff4ea4b451a9ff84a162217bdb3b2a0aa1479776205e15d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.1" version: "0.4.4"
device_info_plus: device_info_plus:
dependency: transitive dependency: transitive
description: description:
@ -414,14 +414,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_blurhash:
dependency: transitive
description:
name: flutter_blurhash
sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
flutter_cache_manager: flutter_cache_manager:
dependency: transitive dependency: transitive
description: description:
@ -796,10 +788,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: octo_image name: octo_image
sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "2.0.0"
open_file: open_file:
dependency: transitive dependency: transitive
description: description:
@ -1211,7 +1203,7 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "2.3.0" version: "2.3.3-preview.0"
tencent_cloud_uikit_core: tencent_cloud_uikit_core:
dependency: transitive dependency: transitive
description: description:
@ -1565,5 +1557,5 @@ packages:
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.1.0-185.0.dev <3.2.0" dart: ">=3.1.0-185.0.dev <3.3.0"
flutter: ">=3.13.0" flutter: ">=3.13.0"

View File

@ -1,50 +1,46 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:tencent_im_base/tencent_im_base.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart';
import 'package:tencent_im_base/tencent_im_base.dart';
typedef MessageFunction = Future<V2TimMessage?> Function(V2TimMessage message); typedef MessageFunction = Future<V2TimMessage?> Function(V2TimMessage message);
typedef MessageFunctionNullCallback = Function(V2TimValueCallback<V2TimMessage> res); typedef MessageFunctionNullCallback = Function(V2TimValueCallback<V2TimMessage> res);
typedef MessageFunctionOptional = Future<V2TimMessage?> Function( typedef MessageFunctionOptional = Future<V2TimMessage?> Function(V2TimMessage message);
V2TimMessage message);
typedef MessageListFunction = Future<List<V2TimMessage>> Function( typedef MessageListFunction = Future<List<V2TimMessage>> Function(List<V2TimMessage> messageList);
List<V2TimMessage> messageList);
typedef MessageListFunctionAsync = List<V2TimMessage> Function(List<V2TimMessage> messageList);
typedef FutureBool = Future<bool>; typedef FutureBool = Future<bool>;
typedef AddFriendFunction = Function( typedef AddFriendFunction = Function(String userID, String? remark, String? friendGroup, String? addWording);
String userID, String? remark, String? friendGroup, String? addWording);
typedef ConversationListFunction = Future<List<V2TimConversation?>> Function( typedef ConversationListFunction = Future<List<V2TimConversation?>> Function(List<V2TimConversation?> conversationList);
List<V2TimConversation?> conversationList);
typedef FriendListFunction = Future<List<V2TimFriendInfo>> Function( typedef FriendListFunction = Future<List<V2TimFriendInfo>> Function(List<V2TimFriendInfo> friendList);
List<V2TimFriendInfo> friendList);
typedef FriendInfoFunction = Future<V2TimFriendInfo?> Function( typedef FriendInfoFunction = Future<V2TimFriendInfo?> Function(V2TimFriendInfo? friendInfo);
V2TimFriendInfo? friendInfo);
/// Here is the default life cycle hooks implementation for all the hooks in TUIKit. /// Here is the default life cycle hooks implementation for all the hooks in TUIKit.
abstract class DefaultLifeCycle { abstract class DefaultLifeCycle {
static Future<List<V2TimConversation?>> defaultConversationListSolution( static Future<List<V2TimConversation?>> defaultConversationListSolution(List<V2TimConversation?> list) async {
List<V2TimConversation?> list) async {
return list; return list;
} }
static Future<List<V2TimFriendInfo>> defaultFriendListSolution( static Future<List<V2TimFriendInfo>> defaultFriendListSolution(List<V2TimFriendInfo> list) async {
List<V2TimFriendInfo> list) async {
return list; return list;
} }
static Future<V2TimMessage> defaultMessageSolution( static Future<V2TimMessage> defaultMessageSolution(V2TimMessage message) async {
V2TimMessage message) async {
return message; return message;
} }
static Future<List<V2TimMessage>> defaultMessageListSolution( static Future<List<V2TimMessage>> defaultMessageListSolution(List<V2TimMessage> list) async {
List<V2TimMessage> list) async { return list;
}
static List<V2TimMessage> defaultMessageListSolutionAsync(List<V2TimMessage> list) {
return list; return list;
} }
@ -56,31 +52,23 @@ abstract class DefaultLifeCycle {
return true; return true;
} }
static defaultNullCallbackSolution(dynamic) { static defaultNullCallbackSolution(dynamic) {}
}
static Future<bool> defaultAddFriend( static Future<bool> defaultAddFriend(String userID, String? remark, String? friendGroup, String? addWording, [BuildContext? context]) async {
String userID, String? remark, String? friendGroup, String? addWording,
[BuildContext? context]) async {
return true; return true;
} }
static Future<bool> defaultAddGroup(String groupID, String message, static Future<bool> defaultAddGroup(String groupID, String message, [BuildContext? context]) async {
[BuildContext? context]) async {
return true; return true;
} }
static Future<V2TimFriendInfo?> defaultFriendInfoSolution( static Future<V2TimFriendInfo?> defaultFriendInfoSolution(V2TimFriendInfo? friendInfo) async {
V2TimFriendInfo? friendInfo) async {
return friendInfo; return friendInfo;
} }
static Future<void> defaultPopBackRemind() async { static Future<void> defaultPopBackRemind() async {
// You have to implement the exact life cycle hook in this case. // You have to implement the exact life cycle hook in this case.
TIMUIKitClass.onTIMCallback(TIMCallback( TIMUIKitClass.onTIMCallback(TIMCallback(type: TIMCallbackType.INFO, infoRecommendText: TIM_t("请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。"), infoCode: 6661402));
type: TIMCallbackType.INFO,
infoRecommendText: TIM_t("请传入离开群组生命周期函数,提供返回首页或其他页面的导航方法。"),
infoCode: 6661402));
return; return;
} }
} }

View File

@ -34,16 +34,19 @@ class ChatLifeCycle {
/// Before rendering a message to message list. /// Before rendering a message to message list.
bool Function(V2TimMessage msg) messageShouldMount; bool Function(V2TimMessage msg) messageShouldMount;
/// Before all message will be rendered on the message list.
/// You may add or delete some messages here.
MessageListFunctionAsync messageListShouldMount;
ChatLifeCycle({ ChatLifeCycle({
this.shouldClearHistoricalMessageList = this.shouldClearHistoricalMessageList = DefaultLifeCycle.defaultAsyncBooleanSolution,
DefaultLifeCycle.defaultAsyncBooleanSolution,
this.shouldDeleteMessage = DefaultLifeCycle.defaultAsyncBooleanSolution, this.shouldDeleteMessage = DefaultLifeCycle.defaultAsyncBooleanSolution,
this.messageDidSend = DefaultLifeCycle.defaultNullCallbackSolution, this.messageDidSend = DefaultLifeCycle.defaultNullCallbackSolution,
this.didGetHistoricalMessageList = this.didGetHistoricalMessageList = DefaultLifeCycle.defaultMessageListSolution,
DefaultLifeCycle.defaultMessageListSolution,
this.messageWillSend = DefaultLifeCycle.defaultMessageSolution, this.messageWillSend = DefaultLifeCycle.defaultMessageSolution,
this.modifiedMessageWillMount = DefaultLifeCycle.defaultMessageSolution, this.modifiedMessageWillMount = DefaultLifeCycle.defaultMessageSolution,
this.newMessageWillMount = DefaultLifeCycle.defaultMessageSolution, this.newMessageWillMount = DefaultLifeCycle.defaultMessageSolution,
this.messageShouldMount = DefaultLifeCycle.defaultBooleanSolution, this.messageShouldMount = DefaultLifeCycle.defaultBooleanSolution,
this.messageListShouldMount = DefaultLifeCycle.defaultMessageListSolutionAsync,
}); });
} }

View File

@ -4,6 +4,7 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart'; import 'package:tencent_cloud_chat_uikit/base_widgets/tim_ui_kit_class.dart';
@ -14,18 +15,13 @@ import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart'; import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/message.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';
enum ConvType { none, c2c, group } enum ConvType { none, c2c, group }
enum HistoryMessagePosition { enum HistoryMessagePosition { bottom, inTwoScreen, awayTwoScreen, notShowLatest }
bottom,
inTwoScreen,
awayTwoScreen,
notShowLatest
}
class CurrentConversation { class CurrentConversation {
final String conversationID; final String conversationID;
@ -49,8 +45,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
ChatLifeCycle? _lifeCycle; ChatLifeCycle? _lifeCycle;
bool _isDownloading = false; bool _isDownloading = false;
final List<Map<String, String>> _waitingDownloadList = final List<Map<String, String>> _waitingDownloadList = List.empty(growable: true); // example {"savePath":"","url":"",msgId:""}
List.empty(growable: true); // example {"savePath":"","url":"",msgId:""}
int _totalUnreadCount = 0; int _totalUnreadCount = 0;
String localKeyPrefix = "TUIKit_conversation_stored_"; String localKeyPrefix = "TUIKit_conversation_stored_";
String localMsgIDListKey = "TUIKit_conversation_list"; String localMsgIDListKey = "TUIKit_conversation_list";
@ -63,8 +58,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
TIMUIKitChatConfig chatConfig = const TIMUIKitChatConfig(); TIMUIKitChatConfig chatConfig = const TIMUIKitChatConfig();
List<V2TimGroupApplication>? _groupApplicationList; List<V2TimGroupApplication>? _groupApplicationList;
String Function(V2TimMessage message)? _abstractMessageBuilder; String Function(V2TimMessage message)? _abstractMessageBuilder;
final Map<String, int> _c2cMessageEditStatusMap = final Map<String, int> _c2cMessageEditStatusMap = Map.from({}); // 0 normal 1 sending
Map.from({}); // 0 normal 1 sending
final Map<String, bool> _c2cMessageFromUserActiveMap = Map.from({}); final Map<String, bool> _c2cMessageFromUserActiveMap = Map.from({});
final Map<String, Timer> _c2cMessageActiveTimer = Map.from({}); final Map<String, Timer> _c2cMessageActiveTimer = Map.from({});
bool _showC2cMessageEditStatus = true; bool _showC2cMessageEditStatus = true;
@ -91,8 +85,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
onRecvMessageModified: (V2TimMessage newMsg) { onRecvMessageModified: (V2TimMessage newMsg) {
onMessageModified(newMsg); onMessageModified(newMsg);
}, },
onMessageDownloadProgressCallback: onMessageDownloadProgressCallback: (V2TimMessageDownloadProgress messageProgress) {
(V2TimMessageDownloadProgress messageProgress) {
onMessageDownloadProgressCallback(messageProgress); onMessageDownloadProgressCallback(messageProgress);
}, },
); );
@ -188,24 +181,15 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
int get unreadCountForConversation => _unreadCountForConversation; int get unreadCountForConversation => _unreadCountForConversation;
List<V2TimGroupApplication> get groupApplicationList => List<V2TimGroupApplication> get groupApplicationList => _groupApplicationList ?? [];
_groupApplicationList ?? [];
String Function(V2TimMessage message)? get abstractMessageBuilder => String Function(V2TimMessage message)? get abstractMessageBuilder => _abstractMessageBuilder;
_abstractMessageBuilder;
Map<String, V2TimMessageReceipt> get messageReadReceiptMap => Map<String, V2TimMessageReceipt> get messageReadReceiptMap => _messageReadReceiptMap;
_messageReadReceiptMap;
String get currentSelectedConv => _currentConversationList.isNotEmpty String get currentSelectedConv => _currentConversationList.isNotEmpty ? _currentConversationList[_currentConversationList.length - 1].conversationID : "";
? _currentConversationList[_currentConversationList.length - 1]
.conversationID
: "";
ConvType? get currentSelectedConvType => _currentConversationList.isNotEmpty ConvType? get currentSelectedConvType => _currentConversationList.isNotEmpty ? _currentConversationList[_currentConversationList.length - 1].conversationType : null;
? _currentConversationList[_currentConversationList.length - 1]
.conversationType
: null;
setCurrentConversation(CurrentConversation value) { setCurrentConversation(CurrentConversation value) {
_currentConversationList.add(value); _currentConversationList.add(value);
@ -214,9 +198,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
clearCurrentConversation() { clearCurrentConversation() {
// Only keep the last 20 messages when existing a chat. // Only keep the last 20 messages when existing a chat.
_messageListMap[currentSelectedConv] = _messageListMap[currentSelectedConv] = (_messageListMap[currentSelectedConv] ?? []).sublist(max(0, ((_messageListMap[currentSelectedConv] ?? []).length - 20)));
(_messageListMap[currentSelectedConv] ?? []).sublist(
max(0, ((_messageListMap[currentSelectedConv] ?? []).length - 20)));
_currentConversationList.removeLast(); _currentConversationList.removeLast();
// notifyListeners(); // notifyListeners();
} }
@ -239,8 +221,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
_c2cMessageEditStatusMap[userID] = 0; _c2cMessageEditStatusMap[userID] = 0;
} }
} }
_c2cMessageStatusShowTimer[userID] = _c2cMessageStatusShowTimer[userID] = Timer.periodic(const Duration(seconds: 5), (timer) {
Timer.periodic(const Duration(seconds: 5), (timer) {
_c2cMessageEditStatusMap[userID] = 0; _c2cMessageEditStatusMap[userID] = 0;
Timer? t = _c2cMessageStatusShowTimer[userID]; Timer? t = _c2cMessageStatusShowTimer[userID];
if (t != null && t.isActive) { if (t != null && t.isActive) {
@ -282,23 +263,17 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
chatConfig = config; chatConfig = config;
} }
initMessageMapFromLocalDatabase( initMessageMapFromLocalDatabase(List<V2TimConversation?> conversations) async {
List<V2TimConversation?> conversations) async {
int index = 0; int index = 0;
for (V2TimConversation? conversationItem in conversations) { for (V2TimConversation? conversationItem in conversations) {
if (conversationItem == null || conversationItem.type == null) { if (conversationItem == null || conversationItem.type == null) {
return; return;
} }
final conversationID = conversationItem.userID ?? final conversationID = conversationItem.userID ?? conversationItem.groupID ?? conversationItem.conversationID;
conversationItem.groupID ?? if (messageListMap[conversationID] == null || messageListMap[conversationID]!.isEmpty) {
conversationItem.conversationID;
if (messageListMap[conversationID] == null ||
messageListMap[conversationID]!.isEmpty) {
index++; index++;
Future.delayed(Duration(milliseconds: 500 * index), () { Future.delayed(Duration(milliseconds: 500 * index), () {
preloadMessageForConversation( preloadMessageForConversation(conversationID: conversationID, conversationType: ConvType.values[conversationItem.type!]);
conversationID: conversationID,
conversationType: ConvType.values[conversationItem.type!]);
}); });
} }
} }
@ -309,12 +284,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
required String conversationID, required String conversationID,
}) async { }) async {
final response = await _messageService.getHistoryMessageList( final response = await _messageService.getHistoryMessageList(
count: 10, count: 10, getType: HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, userID: conversationType == ConvType.c2c ? conversationID : null, groupID: conversationType == ConvType.group ? conversationID : null);
getType: HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG, if (_messageListMap[conversationID] == null || _messageListMap[conversationID]!.isEmpty) {
userID: conversationType == ConvType.c2c ? conversationID : null,
groupID: conversationType == ConvType.group ? conversationID : null);
if (_messageListMap[conversationID] == null ||
_messageListMap[conversationID]!.isEmpty) {
_messageListMap[conversationID] = response; _messageListMap[conversationID] = response;
} }
} }
@ -332,15 +303,9 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
prefs.remove(localMsgIDListKey); prefs.remove(localMsgIDListKey);
} }
Future<void> updateMessageFromController( Future<void> updateMessageFromController({required String msgID, required String conversationID, required ConvType conversationType}) async {
{required String msgID,
required String conversationID,
required ConvType conversationType}) async {
final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>(); final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>();
V2TimMessage? newMessage = await tools.getExistingMessageByID( V2TimMessage? newMessage = await tools.getExistingMessageByID(msgID: msgID, conversationID: conversationID, conversationType: conversationType);
msgID: msgID,
conversationID: conversationID,
conversationType: conversationType);
if (newMessage != null) { if (newMessage != null) {
onMessageModified(newMessage, currentSelectedConv); onMessageModified(newMessage, currentSelectedConv);
} }
@ -363,14 +328,10 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
_preLoadImage(List<V2TimMessage> msgList) { _preLoadImage(List<V2TimMessage> msgList) {
List<V2TimMessage> needPreViewList = List<V2TimMessage> needPreViewList = msgList.sublist(0, max(0, min(5, msgList.length - 1)));
msgList.sublist(0, max(0, min(5, msgList.length - 1)));
for (var msgItem in needPreViewList) { for (var msgItem in needPreViewList) {
V2TimImage? getImageFromList(V2TimImageTypesEnum imgType) { V2TimImage? getImageFromList(V2TimImageTypesEnum imgType) {
V2TimImage? img = MessageUtils.getImageFromImgList( V2TimImage? img = MessageUtils.getImageFromImgList(msgItem.imageElem?.imageList, HistoryMessageDartConstant.imgPriorMap[imgType] ?? HistoryMessageDartConstant.oriImgPrior);
msgItem.imageElem?.imageList,
HistoryMessageDartConstant.imgPriorMap[imgType] ??
HistoryMessageDartConstant.oriImgPrior);
return img; return img;
} }
@ -380,12 +341,9 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
ImageConfiguration configuration = const ImageConfiguration(); ImageConfiguration configuration = const ImageConfiguration();
final image = FileImage(File((originalImg.localUrl!))); final image = FileImage(File((originalImg.localUrl!)));
image.resolve(configuration).addListener( image.resolve(configuration).addListener(ImageStreamListener((ImageInfo image, bool synchronousCall) {
ImageStreamListener((ImageInfo image, bool synchronousCall) {
final tempImg = image.image; final tempImg = image.image;
_preloadImageMap[msgItem.seq! + _preloadImageMap[msgItem.seq! + msgItem.timestamp.toString() + (msgItem.msgID ?? "")] = tempImg;
msgItem.timestamp.toString() +
(msgItem.msgID ?? "")] = tempImg;
outputLogger.i("cacheImage ${msgItem.msgID}"); outputLogger.i("cacheImage ${msgItem.msgID}");
})); }));
} catch (e) { } catch (e) {
@ -429,8 +387,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
_editStatusCheck(V2TimMessage msg) { _editStatusCheck(V2TimMessage msg) {
bool isStatusMessage = false; bool isStatusMessage = false;
if (msg.customElem != null && if (msg.customElem != null && TencentUtils.checkString(msg.groupID) == null) {
TencentUtils.checkString(msg.groupID) == null) {
V2TimCustomElem customElem = msg.customElem!; V2TimCustomElem customElem = msg.customElem!;
String sender = msg.sender ?? ""; String sender = msg.sender ?? "";
if (customElem.data!.isNotEmpty) { if (customElem.data!.isNotEmpty) {
@ -450,8 +407,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
if (userAction != null) { if (userAction != null) {
if (userAction == 14) { if (userAction == 14) {
if (actionParam != null) { if (actionParam != null) {
setC2cMessageEditStatus(sender, setC2cMessageEditStatus(sender, actionParam == "EIMAMSG_InputStatus_Ing" ? 1 : 0);
actionParam == "EIMAMSG_InputStatus_Ing" ? 1 : 0);
} }
} }
} }
@ -486,8 +442,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
t.cancel(); t.cancel();
} }
} }
_c2cMessageActiveTimer[msg.sender ?? ""] = _c2cMessageActiveTimer[msg.sender ?? ""] = Timer.periodic(const Duration(seconds: 30), (timer) {
Timer.periodic(const Duration(seconds: 30), (timer) {
_c2cMessageFromUserActiveMap[msg.sender ?? ""] = false; _c2cMessageFromUserActiveMap[msg.sender ?? ""] = false;
Timer? t = _c2cMessageActiveTimer[msg.sender ?? ""]; Timer? t = _c2cMessageActiveTimer[msg.sender ?? ""];
if (t != null && t.isActive) { if (t != null && t.isActive) {
@ -511,15 +466,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
return; return;
} }
V2TimMsgCreateInfoResult? res = await _messageService.createCustomMessage( V2TimMsgCreateInfoResult? res = await _messageService.createCustomMessage(
data: json.encode({ 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"}));
"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) { if (res != null) {
_sendMessage( _sendMessage(
id: res.id!, id: res.id!,
@ -555,9 +502,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
_onReceiveNewMsg(V2TimMessage msgComing) async { _onReceiveNewMsg(V2TimMessage msgComing) async {
final V2TimMessage? newMsg = _lifeCycle?.newMessageWillMount != null final V2TimMessage? newMsg = _lifeCycle?.newMessageWillMount != null ? await _lifeCycle?.newMessageWillMount(msgComing) : msgComing;
? await _lifeCycle?.newMessageWillMount(msgComing)
: msgComing;
if (newMsg == null) { if (newMsg == null) {
return; return;
} }
@ -571,16 +516,13 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
_checkFromUserisActive(msgComing); _checkFromUserisActive(msgComing);
final convID = TencentUtils.checkString(newMsg.userID) ?? newMsg.groupID; final convID = TencentUtils.checkString(newMsg.userID) ?? newMsg.groupID;
final convType = TencentUtils.checkString(newMsg.groupID) != null final convType = TencentUtils.checkString(newMsg.groupID) != null ? ConvType.group : ConvType.c2c;
? ConvType.group
: ConvType.c2c;
if (convID != null && convID == currentSelectedConv) { if (convID != null && convID == currentSelectedConv) {
final position = getMessageListPosition(convID); final position = getMessageListPosition(convID);
if (position == HistoryMessagePosition.notShowLatest) { if (position == HistoryMessagePosition.notShowLatest) {
return; return;
} }
if (position == HistoryMessagePosition.bottom && if (position == HistoryMessagePosition.bottom && unreadCountForConversation == 0) {
unreadCountForConversation == 0) {
_unreadCountForConversation = 0; _unreadCountForConversation = 0;
if (chatConfig.isAutoReportRead) { if (chatConfig.isAutoReportRead) {
Future.delayed(const Duration(seconds: 1), () { Future.delayed(const Duration(seconds: 1), () {
@ -596,11 +538,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
notifyListeners(); notifyListeners();
final messageID = newMsg.msgID; final messageID = newMsg.msgID;
final needReadReceipt = newMsg.needReadReceipt ?? false; final needReadReceipt = newMsg.needReadReceipt ?? false;
if (needReadReceipt && if (needReadReceipt && messageID != null && msgComing.groupID != null && chatConfig.isReportGroupReadingStatus && chatConfig.isAutoReportRead) {
messageID != null &&
msgComing.groupID != null &&
chatConfig.isReportGroupReadingStatus &&
chatConfig.isAutoReportRead) {
// only group message send message read receipt // only group message send message read receipt
Future.delayed(const Duration(seconds: 1), () { Future.delayed(const Duration(seconds: 1), () {
sendMessageReadReceipts([messageID]); sendMessageReadReceipts([messageID]);
@ -623,19 +561,16 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
sendMessageReadReceipts(List<String> messageIDList) async { sendMessageReadReceipts(List<String> messageIDList) async {
final res = await _messageService.sendMessageReadReceipts( final res = await _messageService.sendMessageReadReceipts(messageIDList: messageIDList);
messageIDList: messageIDList);
return res; return res;
} }
onMessageRevoked(String msgID, [String? convID]) { onMessageRevoked(String msgID, [String? convID]) {
final activeMessageList = _messageListMap[convID ?? currentSelectedConv]; final activeMessageList = _messageListMap[convID ?? currentSelectedConv];
if (activeMessageList != null) { if (activeMessageList != null) {
final findeIndex = final findeIndex = activeMessageList.indexWhere((element) => element.msgID == msgID);
activeMessageList.indexWhere((element) => element.msgID == msgID);
if (findeIndex != -1) { if (findeIndex != -1) {
final findeIndex = final findeIndex = activeMessageList.indexWhere((element) => element.msgID == msgID);
activeMessageList.indexWhere((element) => element.msgID == msgID);
if (findeIndex != -1) { if (findeIndex != -1) {
final targetItem = activeMessageList[findeIndex]; final targetItem = activeMessageList[findeIndex];
targetItem.status = MessageStatus.V2TIM_MSG_STATUS_LOCAL_REVOKED; targetItem.status = MessageStatus.V2TIM_MSG_STATUS_LOCAL_REVOKED;
@ -650,15 +585,12 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
onMessageModified(V2TimMessage modifiedMessage, [String? convID]) async { onMessageModified(V2TimMessage modifiedMessage, [String? convID]) async {
modifiedMessage.id = DateTime.now().millisecondsSinceEpoch.toString(); modifiedMessage.id = DateTime.now().millisecondsSinceEpoch.toString();
final String? exactId = TencentUtils.checkString(modifiedMessage.userID) ?? final String? exactId = TencentUtils.checkString(modifiedMessage.userID) ?? TencentUtils.checkString(modifiedMessage.groupID);
TencentUtils.checkString(modifiedMessage.groupID);
final activeMessageList = _messageListMap[convID ?? exactId]; final activeMessageList = _messageListMap[convID ?? exactId];
if (activeMessageList == null || activeMessageList.isEmpty) { if (activeMessageList == null || activeMessageList.isEmpty) {
return; return;
} }
final V2TimMessage newMsg = final V2TimMessage newMsg = await _lifeCycle?.modifiedMessageWillMount(modifiedMessage) ?? modifiedMessage;
await _lifeCycle?.modifiedMessageWillMount(modifiedMessage) ??
modifiedMessage;
final msgID = newMsg.msgID; final msgID = newMsg.msgID;
_messageListMap[convID ?? exactId ?? ""] = activeMessageList.map((item) { _messageListMap[convID ?? exactId ?? ""] = activeMessageList.map((item) {
if (item.msgID == msgID) { if (item.msgID == msgID) {
@ -704,13 +636,11 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
outputLogger.i("message progress: $progress"); outputLogger.i("message progress: $progress");
} }
Future<void> onMessageDownloadProgressCallback( Future<void> onMessageDownloadProgressCallback(V2TimMessageDownloadProgress messageProgress) async {
V2TimMessageDownloadProgress messageProgress) async {
final currentProgress = getMessageProgress(messageProgress.msgID); final currentProgress = getMessageProgress(messageProgress.msgID);
if (messageProgress.isFinish && currentProgress < 100) { if (messageProgress.isFinish && currentProgress < 100) {
V2TimMessage? message = V2TimMessage? message = await _findAndRetrieveMessage(messageProgress.msgID);
await _findAndRetrieveMessage(messageProgress.msgID);
_handleFinishedDownload(messageProgress, message); _handleFinishedDownload(messageProgress, message);
return; return;
} }
@ -719,25 +649,19 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
Future<V2TimMessage?> _findAndRetrieveMessage(String messageId) async { Future<V2TimMessage?> _findAndRetrieveMessage(String messageId) async {
final messages = final messages = await _messageService.findMessages(messageIDList: [messageId]);
await _messageService.findMessages(messageIDList: [messageId]);
return messages?.first; return messages?.first;
} }
void _handleFinishedDownload( void _handleFinishedDownload(V2TimMessageDownloadProgress messageProgress, V2TimMessage? message) {
V2TimMessageDownloadProgress messageProgress, V2TimMessage? message) {
if (message != null) { if (message != null) {
bool isImageType = bool isImageType = message.elemType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE;
message.elemType == MessageElemType.V2TIM_ELEM_TYPE_IMAGE; bool isVideoType = message.elemType == MessageElemType.V2TIM_ELEM_TYPE_VIDEO;
bool isVideoType =
message.elemType == MessageElemType.V2TIM_ELEM_TYPE_VIDEO;
final originalImageType = PlatformUtils().isIOS ? 1 : 0; final originalImageType = PlatformUtils().isIOS ? 1 : 0;
if (!isImageType && !isVideoType) { if (!isImageType && !isVideoType) {
_updateMessageLocationAndDownloadFile(messageProgress); _updateMessageLocationAndDownloadFile(messageProgress);
} else if ((isImageType && messageProgress.type == originalImageType) || } else if ((isImageType && messageProgress.type == originalImageType) || isVideoType) {
isVideoType) { Future.delayed(const Duration(seconds: 1), () => _updateMessageAndDownloadFile(message, messageProgress));
Future.delayed(const Duration(seconds: 1),
() => _updateMessageAndDownloadFile(message, messageProgress));
} else { } else {
return; return;
} }
@ -746,32 +670,22 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
} }
void _updateMessageAndDownloadFile( void _updateMessageAndDownloadFile(V2TimMessage message, V2TimMessageDownloadProgress messageProgress) {
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); _updateMessageLocationAndDownloadFile(messageProgress);
} }
void _updateMessageLocationAndDownloadFile( void _updateMessageLocationAndDownloadFile(V2TimMessageDownloadProgress messageProgress) {
V2TimMessageDownloadProgress messageProgress) {
setFileMessageLocation(messageProgress.msgID, messageProgress.path); setFileMessageLocation(messageProgress.msgID, messageProgress.path);
setMessageProgress(messageProgress.msgID, 100); setMessageProgress(messageProgress.msgID, 100);
downloadFile(); downloadFile();
} }
void _updateProgressIfNeeded( void _updateProgressIfNeeded(V2TimMessageDownloadProgress messageProgress, int currentProgress) {
V2TimMessageDownloadProgress messageProgress, int currentProgress) {
try { try {
if (messageProgress.totalSize != -1 && !messageProgress.isFinish) { if (messageProgress.totalSize != -1 && !messageProgress.isFinish) {
int progress = min( int progress = min(99, (messageProgress.currentSize / messageProgress.totalSize * 100).floor());
99,
(messageProgress.currentSize / messageProgress.totalSize * 100)
.floor());
if (progress > 1 && progress > currentProgress) { if (progress > 1 && progress > currentProgress) {
setMessageProgress(messageProgress.msgID, progress); setMessageProgress(messageProgress.msgID, progress);
} }
@ -815,13 +729,10 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>(); final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>();
List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? []; List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? [];
if (messageInfo != null) { if (messageInfo != null) {
final messageInfoWithSender = messageInfo.sender == null final messageInfoWithSender = messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id!) : messageInfo;
? tools.setUserInfoForMessage(messageInfo, messageInfo.id!)
: messageInfo;
currentHistoryMsgList = [messageInfoWithSender, ...currentHistoryMsgList]; currentHistoryMsgList = [messageInfoWithSender, ...currentHistoryMsgList];
setMessageList(convID, currentHistoryMsgList); setMessageList(convID, currentHistoryMsgList);
if (loadingMessage[convID] != null && if (loadingMessage[convID] != null && loadingMessage[convID]!.isNotEmpty) {
loadingMessage[convID]!.isNotEmpty) {
loadingMessage[convID]!.add(messageInfoWithSender); loadingMessage[convID]!.add(messageInfoWithSender);
} else { } else {
loadingMessage[convID] = <V2TimMessage>[messageInfoWithSender]; loadingMessage[convID] = <V2TimMessage>[messageInfoWithSender];
@ -837,9 +748,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
setInputField: setInputField, setInputField: setInputField,
id: messageInfo.id as String, id: messageInfo.id as String,
convType: ConvType.values[convType.index], convType: ConvType.values[convType.index],
offlinePushInfo: offlinePushInfo ?? offlinePushInfo: offlinePushInfo ?? tools.buildMessagePushInfo(messageInfo, convID, ConvType.values[convType.index]),
tools.buildMessagePushInfo(
messageInfo, convID, ConvType.values[convType.index]),
); );
} }
return null; return null;
@ -863,36 +772,23 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>(); final TUIChatModelTools tools = serviceLocator<TUIChatModelTools>();
List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? []; List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? [];
V2TimMsgCreateInfoResult? textMessageInfo = V2TimMsgCreateInfoResult? textMessageInfo = await _messageService.createTextMessage(text: text);
await _messageService.createTextMessage(text: text);
textMessageInfo = await _messageService.createTextAtMessage( textMessageInfo = await _messageService.createTextAtMessage(
text: text + text: text + "\n@${TencentUtils.checkString(messageBeenReplied.nickName) ?? TencentUtils.checkString(messageBeenReplied.sender) ?? TencentUtils.checkString(messageBeenReplied.userID)}",
"\n@${TencentUtils.checkString(messageBeenReplied.nickName) ?? TencentUtils.checkString(messageBeenReplied.sender) ?? TencentUtils.checkString(messageBeenReplied.userID)}", atUserList: [TencentUtils.checkString(messageBeenReplied.sender) ?? TencentUtils.checkString(messageBeenReplied.userID) ?? ""]);
atUserList: [
TencentUtils.checkString(messageBeenReplied.sender) ??
TencentUtils.checkString(messageBeenReplied.userID) ??
""
]);
final V2TimMessage? messageInfo = textMessageInfo!.messageInfo; final V2TimMessage? messageInfo = textMessageInfo!.messageInfo;
if (messageInfo != null) { if (messageInfo != null) {
final messageInfoWithSender = messageInfo.sender == null final messageInfoWithSender = messageInfo.sender == null ? tools.setUserInfoForMessage(messageInfo, messageInfo.id ?? textMessageInfo.id ?? "") : messageInfo;
? tools.setUserInfoForMessage(
messageInfo, messageInfo.id ?? textMessageInfo.id ?? "")
: messageInfo;
final hasNickName = messageBeenReplied.nickName != null && final hasNickName = messageBeenReplied.nickName != null && messageBeenReplied.nickName != "";
messageBeenReplied.nickName != "";
final cloudCustomData = { final cloudCustomData = {
"messageReply": { "messageReply": {
"messageID": messageBeenReplied.msgID, "messageID": messageBeenReplied.msgID,
"messageAbstract": tools.getMessageAbstract( "messageAbstract": tools.getMessageAbstract(messageBeenReplied, abstractMessageBuilder),
messageBeenReplied, abstractMessageBuilder), "messageSender": hasNickName ? messageBeenReplied.nickName : messageBeenReplied.sender,
"messageSender": hasNickName
? messageBeenReplied.nickName
: messageBeenReplied.sender,
"messageType": messageBeenReplied.elemType, "messageType": messageBeenReplied.elemType,
"version": 1 "version": 1
} }
@ -905,9 +801,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
return _sendMessage( return _sendMessage(
cloudCustomData: json.encode(cloudCustomData), cloudCustomData: json.encode(cloudCustomData),
id: textMessageInfo.id as String, id: textMessageInfo.id as String,
offlinePushInfo: offlinePushInfo ?? offlinePushInfo: offlinePushInfo ?? tools.buildMessagePushInfo(messageInfo, convID, ConvType.values[convType.index]),
tools.buildMessagePushInfo(
messageInfo, convID, ConvType.values[convType.index]),
priority: priority, priority: priority,
onlineUserOnly: onlineUserOnly, onlineUserOnly: onlineUserOnly,
isExcludedFromUnreadCount: isExcludedFromUnreadCount, isExcludedFromUnreadCount: isExcludedFromUnreadCount,
@ -921,10 +815,8 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
return null; return null;
} }
Future<bool> setLocalCustomData( Future<bool> setLocalCustomData(String msgID, String localCustomData, String conversationID) async {
String msgID, String localCustomData, String conversationID) async { final res = await _messageService.setLocalCustomData(msgID: msgID, localCustomData: localCustomData);
final res = await _messageService.setLocalCustomData(
msgID: msgID, localCustomData: localCustomData);
List<V2TimMessage> messageList = _messageListMap[conversationID] ?? []; List<V2TimMessage> messageList = _messageListMap[conversationID] ?? [];
if (res.code == 0) { if (res.code == 0) {
messageList = messageList.map((item) { messageList = messageList.map((item) {
@ -934,17 +826,14 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
return item; return item;
}).toList(); }).toList();
setMessageList(conversationID, messageList, setMessageList(conversationID, messageList, needResetNewMessageCount: false);
needResetNewMessageCount: false);
return true; return true;
} }
return false; return false;
} }
Future<bool> setLocalCustomInt( Future<bool> setLocalCustomInt(String msgID, int localCustomInt, String conversationID) async {
String msgID, int localCustomInt, String conversationID) async { final res = await _messageService.setLocalCustomInt(msgID: msgID, localCustomInt: localCustomInt);
final res = await _messageService.setLocalCustomInt(
msgID: msgID, localCustomInt: localCustomInt);
List<V2TimMessage> messageList = _messageListMap[conversationID] ?? []; List<V2TimMessage> messageList = _messageListMap[conversationID] ?? [];
if (res.code == 0) { if (res.code == 0) {
messageList = messageList.map((item) { messageList = messageList.map((item) {
@ -954,8 +843,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
return item; return item;
}).toList(); }).toList();
setMessageList(conversationID, messageList, setMessageList(conversationID, messageList, needResetNewMessageCount: false);
needResetNewMessageCount: false);
return true; return true;
} }
return false; return false;
@ -978,20 +866,15 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
}) async { }) async {
String receiver = convType == ConvType.c2c ? convID : ''; String receiver = convType == ConvType.c2c ? convID : '';
String groupID = convType == ConvType.group ? convID : ''; String groupID = convType == ConvType.group ? convID : '';
final oldGroupType = final oldGroupType = groupType != null ? GroupReceptAllowType.values[groupType.index] : null;
groupType != null ? GroupReceptAllowType.values[groupType.index] : null;
final sendMsgRes = await _messageService.sendMessage( final sendMsgRes = await _messageService.sendMessage(
id: id, id: id,
receiver: receiver, receiver: receiver,
needReadReceipt: needReadReceipt ?? needReadReceipt: needReadReceipt ??
chatConfig.isShowGroupReadingStatus && chatConfig.isShowGroupReadingStatus &&
convType == ConvType.group && convType == ConvType.group &&
((chatConfig.groupReadReceiptPermissionList != null && ((chatConfig.groupReadReceiptPermissionList != null && chatConfig.groupReadReceiptPermissionList!.contains(groupType)) ||
chatConfig.groupReadReceiptPermissionList! (chatConfig.groupReadReceiptPermisionList != null && chatConfig.groupReadReceiptPermisionList!.contains(oldGroupType))),
.contains(groupType)) ||
(chatConfig.groupReadReceiptPermisionList != null &&
chatConfig.groupReadReceiptPermisionList!
.contains(oldGroupType))),
groupID: groupID, groupID: groupID,
priority: priority, priority: priority,
localCustomData: localCustomData, localCustomData: localCustomData,
@ -1015,8 +898,7 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
return sendMsgRes; return sendMsgRes;
} }
void setMessageList(String conversationID, List<V2TimMessage> messageList, void setMessageList(String conversationID, List<V2TimMessage> messageList, {bool needResetNewMessageCount = true}) {
{bool needResetNewMessageCount = true}) {
_messageListMap[conversationID] = messageList; _messageListMap[conversationID] = messageList;
if (needResetNewMessageCount) { if (needResetNewMessageCount) {
_receivedNewMessageCount = 0; _receivedNewMessageCount = 0;
@ -1024,27 +906,15 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
notifyListeners(); notifyListeners();
} }
updateMessage( updateMessage(V2TimValueCallback<V2TimMessage> sendMsgRes, String convID, String id, ConvType convType, GroupReceiptAllowType? groupType, ValueChanged<String>? setInputField) {
V2TimValueCallback<V2TimMessage> sendMsgRes,
String convID,
String id,
ConvType convType,
GroupReceiptAllowType? groupType,
ValueChanged<String>? setInputField) {
List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? []; List<V2TimMessage> currentHistoryMsgList = _messageListMap[convID] ?? [];
final V2TimMessage sendMsgResData = sendMsgRes.data as V2TimMessage; final V2TimMessage sendMsgResData = sendMsgRes.data as V2TimMessage;
if ([80001, 80002].contains(sendMsgRes.code) && if ([80001, 80002].contains(sendMsgRes.code) && sendMsgRes.data?.textElem?.text != null && setInputField != null) {
sendMsgRes.data?.textElem?.text != null &&
setInputField != null) {
setInputField(sendMsgRes.data!.textElem!.text ?? ""); setInputField(sendMsgRes.data!.textElem!.text ?? "");
} }
final findIdIndex = final findIdIndex = currentHistoryMsgList.indexWhere((element) => element.id == id);
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) { if (targetIndex != -1) {
currentHistoryMsgList[targetIndex] = sendMsgResData; currentHistoryMsgList[targetIndex] = sendMsgResData;
} else { } else {
@ -1053,19 +923,13 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
if (loadingMessage[convID] != null && loadingMessage[convID]!.isNotEmpty) { if (loadingMessage[convID] != null && loadingMessage[convID]!.isNotEmpty) {
loadingMessage[convID]!.removeWhere((element) => element.id == id); loadingMessage[convID]!.removeWhere((element) => element.id == id);
} }
final oldGroupType = final oldGroupType = groupType != null ? GroupReceptAllowType.values[groupType.index] : null;
groupType != null ? GroupReceptAllowType.values[groupType.index] : null;
if (chatConfig.isShowGroupReadingStatus && if (chatConfig.isShowGroupReadingStatus &&
convType == ConvType.group && convType == ConvType.group &&
sendMsgRes.data?.msgID != null && sendMsgRes.data?.msgID != null &&
((chatConfig.groupReadReceiptPermissionList != null && ((chatConfig.groupReadReceiptPermissionList != null && chatConfig.groupReadReceiptPermissionList!.contains(groupType)) ||
chatConfig.groupReadReceiptPermissionList! (chatConfig.groupReadReceiptPermisionList != null && chatConfig.groupReadReceiptPermisionList!.contains(oldGroupType)))) {
.contains(groupType)) || _messageReadReceiptMap[sendMsgRes.data!.msgID!] = V2TimMessageReceipt(timestamp: 0, userID: "", readCount: 0);
(chatConfig.groupReadReceiptPermisionList != null &&
chatConfig.groupReadReceiptPermisionList!
.contains(oldGroupType)))) {
_messageReadReceiptMap[sendMsgRes.data!.msgID!] =
V2TimMessageReceipt(timestamp: 0, userID: "", readCount: 0);
} }
_messageListMap[convID] = currentHistoryMsgList; _messageListMap[convID] = currentHistoryMsgList;
notifyListeners(); notifyListeners();
@ -1094,20 +958,13 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
List<V2TimMessage>? getMessageList(String conversationID) { List<V2TimMessage>? getMessageList(String conversationID) {
final list = (messageListMap[conversationID]?.reversed.toList() ?? []) final list = (messageListMap[conversationID]?.reversed.toList() ?? []).where((element) => _lifeCycle?.messageShouldMount(element) ?? true).toList();
.where((element) => _lifeCycle?.messageShouldMount(element) ?? true); final finalList = _lifeCycle?.messageListShouldMount(list) ?? list;
final List<V2TimMessage> listWithTimestamp = []; final List<V2TimMessage> listWithTimestamp = [];
final interval = chatConfig.timeDividerConfig?.timeInterval ?? 300; final interval = chatConfig.timeDividerConfig?.timeInterval ?? 300;
for (var item in list) { for (var item in finalList) {
{ {
if (listWithTimestamp.isEmpty || if (listWithTimestamp.isEmpty || (listWithTimestamp[listWithTimestamp.length - 1].timestamp != null && item.timestamp != null && (item.timestamp! - listWithTimestamp[listWithTimestamp.length - 1].timestamp! > interval))) {
(listWithTimestamp[listWithTimestamp.length - 1].timestamp !=
null &&
item.timestamp != null &&
(item.timestamp! -
listWithTimestamp[listWithTimestamp.length - 1]
.timestamp! >
interval))) {
listWithTimestamp.add(V2TimMessage( listWithTimestamp.add(V2TimMessage(
userID: '', userID: '',
isSelf: false, isSelf: false,
@ -1123,19 +980,16 @@ class TUIChatGlobalModel extends ChangeNotifier implements TIMUIKitClass {
} }
HistoryMessagePosition getMessageListPosition(String? conversationID) { HistoryMessagePosition getMessageListPosition(String? conversationID) {
final HistoryMessagePosition? position = final HistoryMessagePosition? position = _historyMessagePositionMap[conversationID];
_historyMessagePositionMap[conversationID];
if (position == null) { if (position == null) {
_historyMessagePositionMap[conversationID ?? currentSelectedConv] = _historyMessagePositionMap[conversationID ?? currentSelectedConv] = HistoryMessagePosition.bottom;
HistoryMessagePosition.bottom;
return HistoryMessagePosition.bottom; return HistoryMessagePosition.bottom;
} else { } else {
return position; return position;
} }
} }
void setMessageListPosition( void setMessageListPosition(String conversationID, HistoryMessagePosition position) {
String conversationID, HistoryMessagePosition position) {
_historyMessagePositionMap[conversationID] = position; _historyMessagePositionMap[conversationID] = position;
notifyListeners(); notifyListeners();
} }

View File

@ -3,11 +3,11 @@
import 'dart:math'; import 'dart:math';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:tencent_im_base/tencent_im_base.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart'; import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart'; import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';
import 'package:tencent_im_base/tencent_im_base.dart';
class MessageServiceImpl extends MessageService { class MessageServiceImpl extends MessageService {
final CoreServicesImpl _coreService = serviceLocator<CoreServicesImpl>(); final CoreServicesImpl _coreService = serviceLocator<CoreServicesImpl>();
@ -16,8 +16,7 @@ class MessageServiceImpl extends MessageService {
@override @override
Future<MessageListResponse> getHistoryMessageListV2({ Future<MessageListResponse> getHistoryMessageListV2({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID, String? userID,
String? groupID, String? groupID,
int lastMsgSeq = -1, int lastMsgSeq = -1,
@ -26,16 +25,8 @@ class MessageServiceImpl extends MessageService {
List<int>? messageTypeList, List<int>? messageTypeList,
}) async { }) async {
bool haveMoreData = true; bool haveMoreData = true;
final res = await TencentImSDKPlugin.v2TIMManager final res =
.getMessageManager() await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(count: count, getType: getType, userID: userID, groupID: groupID, lastMsgID: lastMsgID, lastMsgSeq: lastMsgSeq, messageTypeList: messageTypeList);
.getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final List<V2TimMessage> responsedMessageList = res.data ?? []; final List<V2TimMessage> responsedMessageList = res.data ?? [];
final conversationID = userID ?? groupID; final conversationID = userID ?? groupID;
final cachedMessageList = messgaeListMap[conversationID]; final cachedMessageList = messgaeListMap[conversationID];
@ -45,41 +36,29 @@ class MessageServiceImpl extends MessageService {
combinedMessageList = [...cachedMessageList, ...responsedMessageList]; combinedMessageList = [...cachedMessageList, ...responsedMessageList];
// //
} else { } else {
final bool existSendingMessage = sendingMessage[conversationID] != null && final bool existSendingMessage = sendingMessage[conversationID] != null && sendingMessage[conversationID]!.isNotEmpty;
sendingMessage[conversationID]!.isNotEmpty;
// //
if (existSendingMessage) { if (existSendingMessage) {
combinedMessageList = [ combinedMessageList = [...sendingMessage[conversationID]!, ...responsedMessageList];
...sendingMessage[conversationID]!,
...responsedMessageList
];
} else { } else {
sendingMessage.remove(conversationID); sendingMessage.remove(conversationID);
combinedMessageList = responsedMessageList; combinedMessageList = responsedMessageList;
} }
} }
if (res.code != 0) { if (res.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
} }
if (responsedMessageList.isEmpty || if (responsedMessageList.isEmpty || (!PlatformUtils().isWeb && responsedMessageList.length < count) || (PlatformUtils().isWeb && responsedMessageList.length < min(count, 20))) {
(!PlatformUtils().isWeb && responsedMessageList.length < count) ||
(PlatformUtils().isWeb &&
responsedMessageList.length < min(count, 20))) {
haveMoreData = false; haveMoreData = false;
} else { } else {
haveMoreData = true; haveMoreData = true;
} }
return MessageListResponse( return MessageListResponse(haveMoreData: haveMoreData, data: combinedMessageList);
haveMoreData: haveMoreData, data: combinedMessageList);
} }
@override @override
Future<List<V2TimMessage>> getHistoryMessageList({ Future<List<V2TimMessage>> getHistoryMessageList({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID, String? userID,
String? groupID, String? groupID,
int lastMsgSeq = -1, int lastMsgSeq = -1,
@ -87,30 +66,18 @@ class MessageServiceImpl extends MessageService {
String? lastMsgID, String? lastMsgID,
List<int>? messageTypeList, List<int>? messageTypeList,
}) async { }) async {
final res = await TencentImSDKPlugin.v2TIMManager final res =
.getMessageManager() await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(count: count, getType: getType, userID: userID, groupID: groupID, lastMsgID: lastMsgID, lastMsgSeq: lastMsgSeq, messageTypeList: messageTypeList);
.getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final reponseMessageList = res.data ?? []; final reponseMessageList = res.data ?? [];
if (res.code != 0) { if (res.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
} }
return reponseMessageList; return reponseMessageList;
} }
@override @override
Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({ Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID, String? userID,
String? groupID, String? groupID,
int lastMsgSeq = -1, int lastMsgSeq = -1,
@ -118,22 +85,11 @@ class MessageServiceImpl extends MessageService {
String? lastMsgID, String? lastMsgID,
List<int>? messageTypeList, List<int>? messageTypeList,
}) async { }) async {
final res = await TencentImSDKPlugin.v2TIMManager final res =
.getMessageManager() await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageListV2(count: count, getType: getType, userID: userID, groupID: groupID, lastMsgID: lastMsgID, lastMsgSeq: lastMsgSeq, messageTypeList: messageTypeList);
.getHistoryMessageListV2(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final responseMessageList = res.data; final responseMessageList = res.data;
if (res.code != 0) { if (res.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
} }
return responseMessageList; return responseMessageList;
} }
@ -142,45 +98,31 @@ class MessageServiceImpl extends MessageService {
Future addSimpleMsgListener({ Future addSimpleMsgListener({
required V2TimSimpleMsgListener listener, required V2TimSimpleMsgListener listener,
}) async { }) async {
return TencentImSDKPlugin.v2TIMManager return TencentImSDKPlugin.v2TIMManager.addSimpleMsgListener(listener: listener);
.addSimpleMsgListener(listener: listener);
} }
@override @override
Future<void> removeSimpleMsgListener({V2TimSimpleMsgListener? listener}) { Future<void> removeSimpleMsgListener({V2TimSimpleMsgListener? listener}) {
return TencentImSDKPlugin.v2TIMManager return TencentImSDKPlugin.v2TIMManager.removeSimpleMsgListener(listener: listener);
.removeSimpleMsgListener(listener: listener);
} }
@override @override
Future<void> addAdvancedMsgListener({ Future<void> addAdvancedMsgListener({
required V2TimAdvancedMsgListener listener, required V2TimAdvancedMsgListener listener,
}) { }) {
return TencentImSDKPlugin.v2TIMManager return TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
.getMessageManager()
.addAdvancedMsgListener(listener: listener);
} }
@override @override
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> getGroupMessageReadMemberList({
getGroupMessageReadMemberList({
required String messageID, required String messageID,
required GetGroupMessageReadMemberListFilter filter, required GetGroupMessageReadMemberListFilter filter,
int nextSeq = 0, int nextSeq = 0,
int count = 100, int count = 100,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getGroupMessageReadMemberList(messageID: messageID, filter: filter, nextSeq: nextSeq, count: count);
.getMessageManager()
.getGroupMessageReadMemberList(
messageID: messageID,
filter: filter,
nextSeq: nextSeq,
count: count);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -189,14 +131,9 @@ class MessageServiceImpl extends MessageService {
Future<V2TimValueCallback<List<V2TimMessageReceipt>>> getMessageReadReceipts({ Future<V2TimValueCallback<List<V2TimMessageReceipt>>> getMessageReadReceipts({
required List<String> messageIDList, required List<String> messageIDList,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageReadReceipts(messageIDList: messageIDList);
.getMessageManager()
.getMessageReadReceipts(messageIDList: messageIDList);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -205,66 +142,43 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> sendMessageReadReceipts({ Future<V2TimCallback> sendMessageReadReceipts({
required List<String> messageIDList, required List<String> messageIDList,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessageReadReceipts(messageIDList: messageIDList);
.getMessageManager()
.sendMessageReadReceipts(messageIDList: messageIDList);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createTextMessage( Future<V2TimMsgCreateInfoResult?> createTextMessage({required String text}) async {
{required String text}) async { final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createTextMessage(text: text);
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createTextMessage(text: text);
if (res.code == 0) { if (res.code == 0) {
final messageResult = res.data; final messageResult = res.data;
return messageResult; return messageResult;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createCustomMessage( Future<V2TimMsgCreateInfoResult?> createCustomMessage({required String data}) async {
{required String data}) async { final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createCustomMessage(data: data);
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createCustomMessage(data: data);
if (res.code == 0) { if (res.code == 0) {
final messageResult = res.data; final messageResult = res.data;
return messageResult; return messageResult;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createFaceMessage( Future<V2TimMsgCreateInfoResult?> createFaceMessage({required int index, required String data}) async {
{required int index, required String data}) async { final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createFaceMessage(index: index, data: data);
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createFaceMessage(index: index, data: data);
if (res.code == 0) { if (res.code == 0) {
final messageResult = res.data; final messageResult = res.data;
return messageResult; return messageResult;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@ -272,51 +186,31 @@ class MessageServiceImpl extends MessageService {
Future<V2TimValueCallback<V2TimMessage>> reSendMessage( Future<V2TimValueCallback<V2TimMessage>> reSendMessage(
{required String msgID, // ID {required String msgID, // ID
bool? onlineUserOnly}) async { bool? onlineUserOnly}) async {
final res = await TencentImSDKPlugin.v2TIMManager final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().reSendMessage(msgID: msgID, onlineUserOnly: onlineUserOnly ?? false);
.getMessageManager()
.reSendMessage(msgID: msgID, onlineUserOnly: onlineUserOnly ?? false);
if (res.code != 0) { if (res.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
} }
return res; return res;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createTextAtMessage( Future<V2TimMsgCreateInfoResult?> createTextAtMessage({required String text, required List<String> atUserList}) async {
{required String text, required List<String> atUserList}) async { final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createTextAtMessage(text: text, atUserList: atUserList);
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createTextAtMessage(text: text, atUserList: atUserList);
if (res.code == 0) { if (res.code == 0) {
final messageResult = res.data; final messageResult = res.data;
return messageResult; return messageResult;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createImageMessage( Future<V2TimMsgCreateInfoResult?> createImageMessage({String? imageName, String? imagePath, dynamic inputElement}) async {
{String? imageName, String? imagePath, dynamic inputElement}) async { final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createImageMessage(imageName: imageName, imagePath: imagePath ?? "", inputElement: inputElement);
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createImageMessage(
imageName: imageName,
imagePath: imagePath ?? "",
inputElement: inputElement);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@ -325,16 +219,11 @@ class MessageServiceImpl extends MessageService {
required String soundPath, required String soundPath,
required int duration, required int duration,
}) async { }) async {
final res = await TencentImSDKPlugin.v2TIMManager final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createSoundMessage(soundPath: soundPath, duration: duration);
.getMessageManager()
.createSoundMessage(soundPath: soundPath, duration: duration);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@ -351,23 +240,19 @@ class MessageServiceImpl extends MessageService {
String? cloudCustomData, String? cloudCustomData,
String? localCustomData, String? localCustomData,
}) async { }) async {
final result = final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage(
await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage( id: id,
id: id, receiver: receiver,
receiver: receiver, groupID: groupID,
groupID: groupID, priority: priority,
priority: priority, onlineUserOnly: onlineUserOnly,
onlineUserOnly: onlineUserOnly, offlinePushInfo: offlinePushInfo,
offlinePushInfo: offlinePushInfo, needReadReceipt: needReadReceipt,
needReadReceipt: needReadReceipt, localCustomData: localCustomData,
localCustomData: localCustomData, cloudCustomData: cloudCustomData,
cloudCustomData: cloudCustomData, );
);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -379,36 +264,22 @@ class MessageServiceImpl extends MessageService {
}) async { }) async {
V2TimCallback result; V2TimCallback result;
if (kIsWeb) { if (kIsWeb) {
result = await TencentImSDKPlugin.v2TIMManager result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().deleteMessages(msgIDs: [], webMessageInstanceList: [webMessageInstance]);
.getMessageManager()
.deleteMessages(
msgIDs: [], webMessageInstanceList: [webMessageInstance]);
} else { } else {
result = await TencentImSDKPlugin.v2TIMManager result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().deleteMessageFromLocalStorage(msgID: msgID);
.getMessageManager()
.deleteMessageFromLocalStorage(msgID: msgID);
} }
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimCallback> revokeMessage( Future<V2TimCallback> revokeMessage({required String msgID, Object? webMessageInstance}) async {
{required String msgID, Object? webMessageInstance}) async { final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().revokeMessage(msgID: msgID, webMessageInstatnce: webMessageInstance);
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.revokeMessage(msgID: msgID, webMessageInstatnce: webMessageInstance);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -417,14 +288,9 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> clearC2CHistoryMessage({ Future<V2TimCallback> clearC2CHistoryMessage({
required String userID, required String userID,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearC2CHistoryMessage(userID: userID);
.getMessageManager()
.clearC2CHistoryMessage(userID: userID);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -433,14 +299,9 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> clearGroupHistoryMessage({ Future<V2TimCallback> clearGroupHistoryMessage({
required String groupID, required String groupID,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearGroupHistoryMessage(groupID: groupID);
.getMessageManager()
.clearGroupHistoryMessage(groupID: groupID);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -449,14 +310,9 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> markC2CMessageAsRead({ Future<V2TimCallback> markC2CMessageAsRead({
required String userID, required String userID,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().markC2CMessageAsRead(userID: userID);
.getMessageManager()
.markC2CMessageAsRead(userID: userID);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -465,24 +321,16 @@ class MessageServiceImpl extends MessageService {
Future<V2TimCallback> markGroupMessageAsRead({ Future<V2TimCallback> markGroupMessageAsRead({
required String groupID, required String groupID,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().markGroupMessageAsRead(groupID: groupID);
.getMessageManager()
.markGroupMessageAsRead(groupID: groupID);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<void> removeAdvancedMsgListener( Future<void> removeAdvancedMsgListener({V2TimAdvancedMsgListener? listener}) async {
{V2TimAdvancedMsgListener? listener}) async { final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().removeAdvancedMsgListener(listener: listener);
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.removeAdvancedMsgListener(listener: listener);
return result; return result;
} }
@ -490,16 +338,11 @@ class MessageServiceImpl extends MessageService {
Future<List<V2TimMessage>?> downloadMergerMessage({ Future<List<V2TimMessage>?> downloadMergerMessage({
required String msgID, required String msgID,
}) async { }) async {
final res = await TencentImSDKPlugin.v2TIMManager final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMergerMessage(msgID: msgID);
.getMessageManager()
.downloadMergerMessage(msgID: msgID);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@ -507,16 +350,11 @@ class MessageServiceImpl extends MessageService {
Future<V2TimMsgCreateInfoResult?> createForwardMessage({ Future<V2TimMsgCreateInfoResult?> createForwardMessage({
required String msgID, required String msgID,
}) async { }) async {
final res = await TencentImSDKPlugin.v2TIMManager final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createForwardMessage(msgID: msgID);
.getMessageManager()
.createForwardMessage(msgID: msgID);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@ -527,62 +365,30 @@ class MessageServiceImpl extends MessageService {
required List<String> abstractList, required List<String> abstractList,
required String compatibleText, required String compatibleText,
}) async { }) async {
final res = await TencentImSDKPlugin.v2TIMManager final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createMergerMessage(msgIDList: msgIDList, title: title, abstractList: abstractList, compatibleText: compatibleText);
.getMessageManager()
.createMergerMessage(
msgIDList: msgIDList,
title: title,
abstractList: abstractList,
compatibleText: compatibleText);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@override @override
Future<V2TimCallback> deleteMessages( Future<V2TimCallback> deleteMessages({required List<String> msgIDs, List<dynamic>? webMessageInstanceList}) async {
{required List<String> msgIDs, final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().deleteMessages(msgIDs: msgIDs, webMessageInstanceList: webMessageInstanceList);
List<dynamic>? webMessageInstanceList}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(
msgIDs: msgIDs, webMessageInstanceList: webMessageInstanceList);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createVideoMessage( Future<V2TimMsgCreateInfoResult?> createVideoMessage({String? videoPath, String? type, int? duration, String? snapshotPath, dynamic inputElement}) async {
{String? videoPath, final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createVideoMessage(videoFilePath: videoPath ?? "", type: type ?? "", duration: duration ?? 1, snapshotPath: snapshotPath ?? "", inputElement: inputElement);
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) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@ -595,75 +401,38 @@ class MessageServiceImpl extends MessageService {
bool needReadReceipt = false, bool needReadReceipt = false,
required V2TimMessage replyMessage, // required V2TimMessage replyMessage, //
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendReplyMessage(id: id, receiver: receiver, offlinePushInfo: offlinePushInfo, groupID: groupID, needReadReceipt: needReadReceipt, replyMessage: replyMessage);
.getMessageManager()
.sendReplyMessage(
id: id,
receiver: receiver,
offlinePushInfo: offlinePushInfo,
groupID: groupID,
needReadReceipt: needReadReceipt,
replyMessage: replyMessage);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createFileMessage( Future<V2TimMsgCreateInfoResult?> createFileMessage({String? filePath, required String fileName, dynamic inputElement}) async {
{String? filePath, final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createFileMessage(filePath: filePath ?? "", fileName: fileName, inputElement: inputElement);
required String fileName,
dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createFileMessage(
filePath: filePath ?? "",
fileName: fileName,
inputElement: inputElement);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@override @override
Future<V2TimMsgCreateInfoResult?> createLocationMessage( Future<V2TimMsgCreateInfoResult?> createLocationMessage({required String desc, required double longitude, required double latitude}) async {
{required String desc, final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createLocationMessage(desc: desc, longitude: longitude, latitude: latitude);
required double longitude,
required double latitude}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createLocationMessage(
desc: desc, longitude: longitude, latitude: latitude);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@override @override
Future<V2TimValueCallback<V2TimMessageSearchResult>> searchLocalMessages( Future<V2TimValueCallback<V2TimMessageSearchResult>> searchLocalMessages({required V2TimMessageSearchParam searchParam}) async {
{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) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -672,30 +441,19 @@ class MessageServiceImpl extends MessageService {
Future<List<V2TimMessage>?> findMessages({ Future<List<V2TimMessage>?> findMessages({
required List<String> messageIDList, required List<String> messageIDList,
}) async { }) async {
final res = await TencentImSDKPlugin.v2TIMManager final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().findMessages(messageIDList: messageIDList);
.getMessageManager()
.findMessages(messageIDList: messageIDList);
if (res.code == 0) { if (res.code == 0) {
return res.data; return res.data;
} }
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code));
return null; return null;
} }
@override @override
Future<V2TimCallback> setLocalCustomInt( Future<V2TimCallback> setLocalCustomInt({required String msgID, required int localCustomInt}) async {
{required String msgID, required int localCustomInt}) async { final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().setLocalCustomInt(msgID: msgID, localCustomInt: localCustomInt);
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomInt(msgID: msgID, localCustomInt: localCustomInt);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -705,14 +463,9 @@ class MessageServiceImpl extends MessageService {
required List<String> userIDList, required List<String> userIDList,
required ReceiveMsgOptEnum opt, required ReceiveMsgOptEnum opt,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().setC2CReceiveMessageOpt(userIDList: userIDList, opt: opt);
.getMessageManager()
.setC2CReceiveMessageOpt(userIDList: userIDList, opt: opt);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@ -722,96 +475,55 @@ class MessageServiceImpl extends MessageService {
required String groupID, required String groupID,
required ReceiveMsgOptEnum opt, required ReceiveMsgOptEnum opt,
}) async { }) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().setGroupReceiveMessageOpt(groupID: groupID, opt: opt);
.getMessageManager()
.setGroupReceiveMessageOpt(groupID: groupID, opt: opt);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage( Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage({required V2TimMessage message}) async {
{required V2TimMessage message}) async { final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().modifyMessage(message: message);
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.modifyMessage(message: message);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimCallback> setLocalCustomData( Future<V2TimCallback> setLocalCustomData({required String msgID, required String localCustomData}) async {
{required String msgID, required String localCustomData}) async { final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().setLocalCustomData(msgID: msgID, localCustomData: localCustomData);
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomData(msgID: msgID, localCustomData: localCustomData);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl( Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl({required String msgID}) async {
{required String msgID}) async { final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: msgID);
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getMessageOnlineUrl(msgID: msgID);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<V2TimCallback> downloadMessage( Future<V2TimCallback> downloadMessage({required String msgID, required int messageType, required int imageType, required bool isSnapshot}) async {
{required String msgID, final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMessage(msgID: msgID, messageType: messageType, imageType: imageType, isSnapshot: isSnapshot);
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);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result; return result;
} }
@override @override
Future<String> translateText(String text, String target) async { Future<String> translateText(String text, String target) async {
final result = await TencentImSDKPlugin.v2TIMManager final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().translateText(texts: [text], targetLanguage: target);
.getMessageManager()
.translateText(texts: [text], targetLanguage: target);
if (result.code != 0) { if (result.code != 0) {
_coreService.callOnCallback(TIMCallback( _coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code));
} }
return result.data?[text] ?? ""; return result.data?[text] ?? "";
} }

View File

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
// import 'package:audioplayers/audioplayers.dart'; // import 'package:audioplayers/audioplayers.dart';
import 'package:flutter_plugin_record_plus/const/play_state.dart'; import 'package:flutter_plugin_record_plus/const/play_state.dart';
import 'package:flutter_plugin_record_plus/const/response.dart'; import 'package:flutter_plugin_record_plus/const/response.dart';
@ -14,14 +15,14 @@ class SoundPlayer {
final ImportProxy importProxy = ImportProxy(); final ImportProxy importProxy = ImportProxy();
static final FlutterPluginRecord _recorder = FlutterPluginRecord(); static final FlutterPluginRecord _recorder = FlutterPluginRecord();
static SoundInterruptListener? _soundInterruptListener; static SoundInterruptListener? _soundInterruptListener;
static bool isInited = false; static bool isInit = false;
static final AudioPlayer _audioPlayer = AudioPlayer(); static final AudioPlayer _audioPlayer = AudioPlayer();
static initSoundPlayer() { static initSoundPlayer() {
if (!isInited) { if (!isInit) {
_recorder.init(); _recorder.init();
// AudioPlayer.global.setGlobalAudioContext(const AudioContext()); // AudioPlayer.global.setGlobalAudioContext(const AudioContext());
isInited = true; isInit = true;
} }
} }
@ -43,10 +44,7 @@ class SoundPlayer {
_recorder.dispose(); _recorder.dispose();
} }
static StreamSubscription<PlayerState> playStateListener( static StreamSubscription<PlayerState> playStateListener({required void Function(PlayerState)? listener}) => _audioPlayer.playerStateStream.listen(listener);
{required void Function(PlayerState)? listener}) =>
_audioPlayer.playerStateStream.listen(listener);
static setSoundInterruptListener(SoundInterruptListener listener) { static setSoundInterruptListener(SoundInterruptListener listener) {
_soundInterruptListener = listener; _soundInterruptListener = listener;
@ -56,13 +54,9 @@ class SoundPlayer {
_soundInterruptListener = null; _soundInterruptListener = null;
} }
static StreamSubscription<RecordResponse> responseListener( static StreamSubscription<RecordResponse> responseListener(ResponseListener listener) => _recorder.response.listen(listener);
ResponseListener listener) =>
_recorder.response.listen(listener);
static StreamSubscription<RecordResponse> responseFromAmplitudeListener( static StreamSubscription<RecordResponse> responseFromAmplitudeListener(ResponseListener listener) => _recorder.responseFromAmplitude.listen(listener);
ResponseListener listener) =>
_recorder.responseFromAmplitude.listen(listener);
static startRecord() { static startRecord() {
_recorder.start(); _recorder.start();

View File

@ -12,38 +12,19 @@ class TimeAgo {
} }
List<String> weekdayMap() { List<String> weekdayMap() {
return [ return ['', TIM_t("星期一"), TIM_t("星期二"), TIM_t("星期三"), TIM_t("星期四"), TIM_t("星期五"), TIM_t("星期六"), TIM_t("星期天")];
'',
TIM_t("星期一"),
TIM_t("星期二"),
TIM_t("星期三"),
TIM_t("星期四"),
TIM_t("星期五"),
TIM_t("星期六"),
TIM_t("星期天")
];
} }
String getYearMonthDate(DateTime dateTime) { String getYearMonthDate(DateTime dateTime) {
String month = dateTime.month.toString(); String month = dateTime.month.toString();
String date = dateTime.day.toString(); String date = dateTime.day.toString();
return dateTime.year.toString() + return dateTime.year.toString() + '/' + (month.length == 1 ? '0' : '') + month + '/' + (date.length == 1 ? '0' : '') + date;
'/' +
(month.length == 1 ? '0' : '') +
month +
'/' +
(date.length == 1 ? '0' : '') +
date;
} }
String getMonthDate(DateTime dateTime) { String getMonthDate(DateTime dateTime) {
String month = dateTime.month.toString(); String month = dateTime.month.toString();
String date = dateTime.day.toString(); String date = dateTime.day.toString();
return (month.length == 1 ? '0' : '') + return (month.length == 1 ? '0' : '') + month + '/' + (date.length == 1 ? '0' : '') + date;
month +
'/' +
(date.length == 1 ? '0' : '') +
date;
} }
String? getTimeStringForChat(int timeStamp) { String? getTimeStringForChat(int timeStamp) {
@ -55,14 +36,7 @@ class TimeAgo {
} }
final Duration duration = DateTime.now().difference(date); final Duration duration = DateTime.now().difference(date);
final int diffDays = duration.inDays + final int diffDays = duration.inDays + (duration.inMinutes > DateTime.now().difference(DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day)).inMinutes ? 1 : 0);
(duration.inMinutes >
DateTime.now()
.difference(DateTime(DateTime.now().year,
DateTime.now().month, DateTime.now().day))
.inMinutes
? 1
: 0);
final int diffMinutes = duration.inMinutes; final int diffMinutes = duration.inMinutes;
var res; var res;
@ -87,8 +61,7 @@ class TimeAgo {
final String option2 = diffMinutes.toString(); final String option2 = diffMinutes.toString();
res = TIM_t_para("{{option2}} 分钟前", "$option2 分钟前")(option2: option2); res = TIM_t_para("{{option2}} 分钟前", "$option2 分钟前")(option2: option2);
} else { } else {
res = res = "${date.hour}:${date.minute < 10 ? "0" + date.minute.toString() : date.minute}";
"${date.hour}:${date.minute < 10 ? date.minute.toString() + "0" : date.minute}";
// res = "$prefix $timeStr"; // res = "$prefix $timeStr";
} }
} else { } else {
@ -104,8 +77,7 @@ class TimeAgo {
nowTime = DateTime(nowTime.year, nowTime.month, nowTime.day); nowTime = DateTime(nowTime.year, nowTime.month, nowTime.day);
var ftime = DateTime.fromMillisecondsSinceEpoch(timeStamp * 1000); var ftime = DateTime.fromMillisecondsSinceEpoch(timeStamp * 1000);
// var preFix = ftime.hour >= 12 ? TIM_t("下午") : TIM_t("上午"); // var preFix = ftime.hour >= 12 ? TIM_t("下午") : TIM_t("上午");
final timeStr = final timeStr = DateFormat('HH:mm').format(ftime); // Use 'HH:mm' for 24-hour format
DateFormat('HH:mm').format(ftime); // Use 'HH:mm' for 24-hour format
// + (24) // + (24)
if (nowTime.year != ftime.year) { if (nowTime.year != ftime.year) {
return '${DateFormat('yyyy-MM-dd').format(ftime)} $timeStr'; return '${DateFormat('yyyy-MM-dd').format(ftime)} $timeStr';

View File

@ -10,13 +10,13 @@ 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'; 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/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/business_logic/view_models/tui_chat_global_model.dart';
import 'package:tencent_cloud_chat_uikit/tencent_cloud_chat_uikit.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart';
// ignore: unused_import // ignore: unused_import
import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/tim_uikit_chat_history_message_list_config.dart';
import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart'; import 'package:tencent_cloud_chat_uikit/ui/views/TIMUIKitChat/TIMUIKItMessageList/utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/widgets/keepalive_wrapper.dart'; import 'package:tencent_cloud_chat_uikit/ui/widgets/keepalive_wrapper.dart';
import 'package:tencent_im_base/tencent_im_base.dart';
import 'TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart'; import 'TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue.dart';
import 'TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue_container.dart'; import 'TIMUIKitTongue/tim_uikit_chat_history_message_list_tongue_container.dart';
@ -406,7 +406,12 @@ class _TIMUIKitHistoryMessageListState extends TIMUIKitState<TIMUIKitHistoryMess
final messageItem = readMessageList[index]; final messageItem = readMessageList[index];
if (index == readMessageList.length - 1) { if (index == readMessageList.length - 1) {
if (haveMoreData) { if (haveMoreData) {
throttleFunction(index, LoadDirection.previous); 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{
throttleFunction(index, messageList);
}
return Column( return Column(
children: [ children: [
LoadingAnimationWidget.staggeredDotsWave( LoadingAnimationWidget.staggeredDotsWave(

View File

@ -1,6 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:math'; import 'dart:math';
// import 'package:audioplayers/audioplayers.dart'; // import 'package:audioplayers/audioplayers.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:just_audio/just_audio.dart'; import 'package:just_audio/just_audio.dart';
@ -12,8 +12,9 @@ import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart'; import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart'; import 'package:tencent_cloud_chat_uikit/ui/constants/history_message_constant.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';
import 'package:tencent_im_base/tencent_im_base.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/sound_record.dart'; import 'package:tencent_cloud_chat_uikit/ui/utils/sound_record.dart';
import 'package:tencent_im_base/tencent_im_base.dart';
import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart'; import 'TIMUIKitMessageReaction/tim_uikit_message_reaction_show_panel.dart';
class TIMUIKitSoundElem extends StatefulWidget { class TIMUIKitSoundElem extends StatefulWidget {
@ -63,13 +64,11 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
late V2TimSoundElem stateElement = widget.message.soundElem!; late V2TimSoundElem stateElement = widget.message.soundElem!;
_playSound() async { _playSound() async {
if (!SoundPlayer.isInited) { if (!SoundPlayer.isInit) {
SoundPlayer.initSoundPlayer(); SoundPlayer.initSoundPlayer();
} }
if (widget.localCustomInt == null || if (widget.localCustomInt == null || widget.localCustomInt != HistoryMessageDartConstant.read) {
widget.localCustomInt != HistoryMessageDartConstant.read) { globalModel.setLocalCustomInt(widget.msgID, HistoryMessageDartConstant.read, widget.chatModel.conversationID);
globalModel.setLocalCustomInt(widget.msgID,
HistoryMessageDartConstant.read, widget.chatModel.conversationID);
} }
if (isPlaying) { if (isPlaying) {
SoundPlayer.stop(); SoundPlayer.stop();
@ -82,11 +81,9 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
downloadMessageDetailAndSave() async { downloadMessageDetailAndSave() async {
if (widget.message.msgID != null && widget.message.msgID != '') { if (widget.message.msgID != null && widget.message.msgID != '') {
if (widget.message.soundElem!.url == null || if (widget.message.soundElem!.url == null || widget.message.soundElem!.url == '') {
widget.message.soundElem!.url == '') { final response = await _messageService.getMessageOnlineUrl(msgID: widget.message.msgID!);
final response = await _messageService.getMessageOnlineUrl( if (response.data != null) {
msgID: widget.message.msgID!);
if(response.data != null){
widget.message.soundElem = response.data!.soundElem; widget.message.soundElem = response.data!.soundElem;
Future.delayed(const Duration(microseconds: 10), () { Future.delayed(const Duration(microseconds: 10), () {
setState(() => stateElement = response.data!.soundElem!); setState(() => stateElement = response.data!.soundElem!);
@ -94,13 +91,8 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
} }
} }
if (!PlatformUtils().isWeb) { if (!PlatformUtils().isWeb) {
if (widget.message.soundElem!.localUrl == null || if (widget.message.soundElem!.localUrl == null || widget.message.soundElem!.localUrl == '') {
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);
} }
} }
} }
@ -110,8 +102,7 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
void didUpdateWidget(oldWidget) { void didUpdateWidget(oldWidget) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
setState(() { setState(() {
isPlaying = widget.chatModel.currentPlayedMsgId != '' && isPlaying = widget.chatModel.currentPlayedMsgId != '' && widget.chatModel.currentPlayedMsgId == widget.msgID;
widget.chatModel.currentPlayedMsgId == widget.msgID;
}); });
} }
@ -119,9 +110,8 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
void initState() { void initState() {
super.initState(); super.initState();
subscription = subscription = SoundPlayer.playStateListener(listener: (PlayerState state) {
SoundPlayer.playStateListener(listener: (PlayerState state) { if (state.processingState == ProcessingState.completed) {
if(state.processingState == ProcessingState.completed){
widget.chatModel.currentPlayedMsgId = ""; widget.chatModel.currentPlayedMsgId = "";
} }
}); });
@ -157,8 +147,7 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
} }
_showJumpColor() { _showJumpColor() {
if ((widget.chatModel.jumpMsgID != widget.message.msgID) && if ((widget.chatModel.jumpMsgID != widget.message.msgID) && (widget.message.msgID?.isNotEmpty ?? true)) {
(widget.message.msgID?.isNotEmpty ?? true)) {
return; return;
} }
isShining = true; isShining = true;
@ -185,30 +174,18 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
Widget tuiBuild(BuildContext context, TUIKitBuildValue value) { Widget tuiBuild(BuildContext context, TUIKitBuildValue value) {
final theme = value.theme; final theme = value.theme;
final backgroundColor = widget.isFromSelf final backgroundColor = widget.isFromSelf ? (theme.chatMessageItemFromSelfBgColor ?? theme.lightPrimaryMaterialColor.shade50) : (theme.chatMessageItemFromOthersBgColor);
? (theme.chatMessageItemFromSelfBgColor ??
theme.lightPrimaryMaterialColor.shade50)
: (theme.chatMessageItemFromOthersBgColor);
final borderRadius = widget.isFromSelf final borderRadius = widget.isFromSelf
? const BorderRadius.only( ? const BorderRadius.only(topLeft: Radius.circular(10), topRight: Radius.circular(2), bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10))
topLeft: Radius.circular(10), : const BorderRadius.only(topLeft: Radius.circular(2), topRight: Radius.circular(10), bottomLeft: Radius.circular(10), bottomRight: 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 (widget.isShowJump) {
if (!isShining) { if (!isShining) {
Future.delayed(Duration.zero, () { Future.delayed(Duration.zero, () {
_showJumpColor(); _showJumpColor();
}); });
} else { } else {
if ((widget.chatModel.jumpMsgID == widget.message.msgID) && if ((widget.chatModel.jumpMsgID == widget.message.msgID) && (widget.message.msgID?.isNotEmpty ?? false)) {
(widget.message.msgID?.isNotEmpty ?? false)) {
widget.clearJump!(); widget.clearJump!();
} }
} }
@ -218,9 +195,7 @@ class _TIMUIKitSoundElemState extends TIMUIKitState<TIMUIKitSoundElem> {
child: Container( child: Container(
padding: widget.textPadding ?? const EdgeInsets.all(10), padding: widget.textPadding ?? const EdgeInsets.all(10),
decoration: BoxDecoration( decoration: BoxDecoration(
color: isShowJumpState color: isShowJumpState ? const Color.fromRGBO(245, 166, 35, 1) : (widget.backgroundColor ?? backgroundColor),
? const Color.fromRGBO(245, 166, 35, 1)
: (widget.backgroundColor ?? backgroundColor),
borderRadius: widget.borderRadius ?? borderRadius, borderRadius: widget.borderRadius ?? borderRadius,
), ),
constraints: const BoxConstraints(maxWidth: 240), constraints: const BoxConstraints(maxWidth: 240),

View File

@ -133,26 +133,26 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: cached_network_image name: cached_network_image
sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.2.3" version: "3.3.0"
cached_network_image_platform_interface: cached_network_image_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: cached_network_image_platform_interface name: cached_network_image_platform_interface
sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "3.0.0"
cached_network_image_web: cached_network_image_web:
dependency: transitive dependency: transitive
description: description:
name: cached_network_image_web name: cached_network_image_web
sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.1.0"
camera: camera:
dependency: transitive dependency: transitive
description: description:
@ -301,10 +301,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dart_internal name: dart_internal
sha256: dae3976f383beddcfcd07ad5291a422df2c8c0a8a03c52cda63ac7b4f26e0f4e sha256: "689dccc3d5f62affd339534cca548dce12b3a6b32f0f10861569d3025efc0567"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.8" version: "0.2.9"
dart_style: dart_style:
dependency: transitive dependency: transitive
description: description:
@ -317,10 +317,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: desktop_drop name: desktop_drop
sha256: "4ca4d960f4b11c032e9adfd2a0a8ac615bc3fddb4cbe73dcf840dd8077582186" sha256: d55a010fe46c8e8fcff4ea4b451a9ff84a162217bdb3b2a0aa1479776205e15d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.1" version: "0.4.4"
device_info_plus: device_info_plus:
dependency: "direct main" dependency: "direct main"
description: description:
@ -478,14 +478,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_blurhash:
dependency: transitive
description:
name: flutter_blurhash
sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6"
url: "https://pub.dev"
source: hosted
version: "0.7.0"
flutter_cache_manager: flutter_cache_manager:
dependency: transitive dependency: transitive
description: description:
@ -871,10 +863,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: octo_image name: octo_image
sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "2.0.0"
open_file: open_file:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1284,34 +1276,34 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: tencent_cloud_chat_sdk name: tencent_cloud_chat_sdk
sha256: "013f8c9d96bbeed06d5fe971b7802d8ddf830c776332d6c6de6ccb9de8956d83" sha256: "7dbb354209eca61f2c816c8ba7c1b1282dd5fb7e090135186bde56c89d976110"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.8" version: "6.0.2"
tencent_cloud_uikit_core: tencent_cloud_uikit_core:
dependency: "direct main" dependency: "direct main"
description: description:
name: tencent_cloud_uikit_core name: tencent_cloud_uikit_core
sha256: acb3bae877428457318b8c5604a6c263957b6df3454ed3e30e8b6f620c6b2cd9 sha256: "5624654c52a230111cbcfcaa648b9c6e3ee877018f16bc5eec076b639655a191"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.2.1"
tencent_im_base: tencent_im_base:
dependency: "direct main" dependency: "direct main"
description: description:
name: tencent_im_base name: tencent_im_base
sha256: bc5eb080090038d21c879480c06d3ed7cb4b1dcc2cbe894189613eadf08cf7c5 sha256: "52a99ef1c9dbd219530cf6f96a9891ab316f789b9b2c11634e0002d0a0f0f63c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.1" version: "3.1.0"
tencent_im_sdk_plugin_platform_interface: tencent_im_sdk_plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: tencent_im_sdk_plugin_platform_interface name: tencent_im_sdk_plugin_platform_interface
sha256: "1f9814d654dc1ad0a4cb62936f0849defac058c3bdca471472efc8b64b63cc5e" sha256: "3b39f19fcc2306c7cbdabe79e532bbb7feade695630f5373308a52703ece482c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.3.22" version: "1.0.0"
tencent_keyboard_visibility: tencent_keyboard_visibility:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1641,5 +1633,5 @@ packages:
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.1.0-185.0.dev <3.2.0" dart: ">=3.1.0-185.0.dev <3.3.0"
flutter: ">=3.13.0" flutter: ">=3.13.0"

View File

@ -1,6 +1,6 @@
name: tencent_cloud_chat_uikit name: tencent_cloud_chat_uikit
description: A powerful chat UI component library and business logic for Tencent Cloud Chat, creating seamless in-app chat modules for delightful user experiences. description: A powerful chat UI component library and business logic for Tencent Cloud Chat, creating seamless in-app chat modules for delightful user experiences.
version: 2.3.2 version: 2.3.3
homepage: https://trtc.io/products/chat?utm_source=gfs&utm_medium=link&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=k6WgfCKn homepage: https://trtc.io/products/chat?utm_source=gfs&utm_medium=link&utm_campaign=%E6%B8%A0%E9%81%93&_channel_track_key=k6WgfCKn
repository: https://github.com/TencentCloud/chat-uikit-flutter repository: https://github.com/TencentCloud/chat-uikit-flutter
documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html documentation: https://comm.qq.com/im/doc/flutter/en/TUIKit/readme.html
@ -38,7 +38,7 @@ dependencies:
transparent_image: ^2.0.0 transparent_image: ^2.0.0
image_gallery_saver: ^2.0.1 image_gallery_saver: ^2.0.1
path_provider: ^2.0.8 path_provider: ^2.0.8
cached_network_image: ^3.2.0 cached_network_image: ^3.3.0
shared_preferences: ^2.0.13 shared_preferences: ^2.0.13
scroll_to_index: ^2.1.1 scroll_to_index: ^2.1.1
wechat_assets_picker: ^8.5.0 wechat_assets_picker: ^8.5.0
@ -63,12 +63,12 @@ dependencies:
open_file: ^3.3.2 open_file: ^3.3.2
tencent_keyboard_visibility: ^1.0.1 tencent_keyboard_visibility: ^1.0.1
tim_ui_kit_sticker_plugin: ^3.0.1+1 tim_ui_kit_sticker_plugin: ^3.0.1+1
tencent_im_base: ^3.0.1 tencent_im_base: ^3.1.0
fc_native_video_thumbnail: any fc_native_video_thumbnail: any
path: ^1.8.1 path: ^1.8.1
tencent_cloud_uikit_core: ^1.1.0 tencent_cloud_uikit_core: ^1.2.1
pasteboard: ^0.2.0 pasteboard: ^0.2.0
desktop_drop: ^0.4.1 desktop_drop: ^0.4.4
device_info_plus: any device_info_plus: any
cross_file: ^0.3.3+4 cross_file: ^0.3.3+4
csslib: 0.17.2 csslib: 0.17.2