This commit is contained in:
2025-06-30 16:24:20 +08:00
commit 68de5eb048
454 changed files with 56921 additions and 0 deletions
BIN
View File
Binary file not shown.
@@ -0,0 +1,39 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation_result.dart';
abstract class ConversationService {
Future<V2TimConversationResult?> getConversationList({
required String nextSeq,
required int count,
});
Future<V2TimConversation?> getConversation({
required String conversationID,
});
Future<V2TimCallback> pinConversation({
required String conversationID,
required bool isPinned,
});
Future<V2TimCallback> deleteConversation({
required String conversationID,
});
Future<void> addConversationListener({
required V2TimConversationListener listener,
});
Future<V2TimCallback> setConversationDraft({required String conversationID, String? draftText});
Future<void> removeConversationListener({V2TimConversationListener? listener});
Future<int> getTotalUnreadCount();
Future<V2TimConversation?> getConversationListByConversationId({required String convID});
}
@@ -0,0 +1,123 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimConversationListener.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_conversation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_conversation_result.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
class ConversationServicesImpl extends ConversationService {
final CoreServicesImpl _coreService = serviceLocator<CoreServicesImpl>();
@override
Future<V2TimConversationResult?> getConversationList({
required String nextSeq,
required int count,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getConversationList(nextSeq: nextSeq, count: count);
if (result.code == 0) {
return result.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
return null;
}
}
@override
Future<V2TimCallback> pinConversation({
required String conversationID,
required bool isPinned,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.pinConversation(conversationID: conversationID, isPinned: isPinned);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> deleteConversation({
required String conversationID,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.deleteConversation(conversationID: conversationID);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<void> addConversationListener({
required V2TimConversationListener listener,
}) {
return TencentImSDKPlugin.v2TIMManager.getConversationManager().addConversationListener(listener: listener);
}
@override
Future<V2TimConversation?> getConversation({
required String conversationID,
}) async {
final res =
await TencentImSDKPlugin.v2TIMManager.getConversationManager().getConversation(conversationID: conversationID);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return null;
}
@override
Future<V2TimCallback> setConversationDraft({required String conversationID, String? draftText}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.setConversationDraft(conversationID: conversationID, draftText: draftText);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<void> removeConversationListener({V2TimConversationListener? listener}) {
return TencentImSDKPlugin.v2TIMManager.getConversationManager().removeConversationListener(listener: listener);
}
@override
Future<V2TimConversation?> getConversationListByConversationId({required String convID}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getConversationManager()
.getConversationListByConversationIds(conversationIDList: [convID]);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return (result.data != null && result.data!.isNotEmpty) ? result.data![0] : null;
}
@override
Future<int> getTotalUnreadCount() async {
final res = await TencentImSDKPlugin.v2TIMManager.getConversationManager().getTotalUnreadMessageCount();
if (res.code == 0) {
return res.data ?? 0;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return 0;
}
}
+106
View File
@@ -0,0 +1,106 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/log_level_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_config.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
enum AppStatus { foreground, background }
enum LanguageEnum {
/// Chinese, Traditional
zhHant,
/// Chinese, Simplified
zhHans,
/// English
en,
/// Korean
ko,
/// Japanese
ja,
}
const languageEnumToString = {
LanguageEnum.zhHant: "zh-Hant",
LanguageEnum.zhHans: "zh-Hans",
LanguageEnum.en: "en",
LanguageEnum.ja: "ja",
LanguageEnum.ko: "ko",
};
abstract class CoreServices {
Future<bool?> init({
required int sdkAppID,
required LogLevelEnum loglevel,
required V2TimSDKListener listener,
/// Callback from TUIKit invoke, includes IM SDK API error, notify information, Flutter error.
ValueChanged<TIMCallback>? onTUIKitCallbackListener,
TIMUIKitConfig? config,
/// only support "en" and "zh" temporally
LanguageEnum? language,
});
Future<void> setDataFromNative({
required String userId,
/// Callback from TUIKit invoke, includes IM SDK API error, notify information, Flutter error.
ValueChanged<TIMCallback>? onTUIKitCallbackListener,
TIMUIKitConfig? config,
/// only support "en" and "zh" temporally
LanguageEnum? language,
});
Future login({
required String userID,
required String userSig,
});
Future logout();
Future logoutWithoutClearData();
Future unInit();
Future<V2TimValueCallback<List<V2TimUserFullInfo>>> getUsersInfo({
required List<String> userIDList,
});
// 注意:uikit的离线推送不支持TPNS
// Note: uikit's offline push do not supports TPNS
Future<V2TimCallback> setOfflinePushConfig({
bool isTPNSToken = false,
int businessID,
required String token,
});
Future<V2TimCallback> setSelfInfo({
required V2TimUserFullInfo userFullInfo,
});
Future<V2TimCallback> setOfflinePushStatus({
required AppStatus status,
int? totalCount,
});
setTheme({required TUITheme theme});
setDarkTheme();
setLightTheme();
setDeviceType(DeviceType deviceType);
}
@@ -0,0 +1,420 @@
// ignore_for_file: avoid_print
import 'package:collection/collection.dart';
import 'package:flutter/cupertino.dart';
import 'package:tencent_chat_i18n_tool/tools/i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSDKListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/log_level_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_setting_model.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/common_utils.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/logger.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/screen_utils.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_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_conversation_view_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_config.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/data_services/core/web_support/uikit_web_support.dart'
if (dart.library.html) 'package:tencent_cloud_chat_uikit/data_services/core/web_support/uikit_web_support_implement.dart';
import 'package:tencent_cloud_chat_uikit/theme/color.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme_view_model.dart';
typedef EmptyAvatarBuilder = Widget Function(BuildContext context);
class LoginInfo {
final String userID;
final String userSig;
final int sdkAppID;
final V2TimUserFullInfo? loginUser;
LoginInfo({this.sdkAppID = 0, this.userSig = "", this.userID = "", this.loginUser});
}
class CoreServicesImpl implements CoreServices {
V2TimUserFullInfo? _loginInfo;
late int _sdkAppID;
late String _userID;
late String _userSig;
ValueChanged<TIMCallback>? onCallback;
VoidCallback? webLoginSuccess;
bool isLoginSuccess = false;
V2TimUserFullInfo? get loginUserInfo {
return _loginInfo;
}
LoginInfo get loginInfo {
return LoginInfo(sdkAppID: _sdkAppID, userID: _userID, userSig: _userSig, loginUser: _loginInfo);
}
EmptyAvatarBuilder? _emptyAvatarBuilder;
EmptyAvatarBuilder? get emptyAvatarBuilder {
return _emptyAvatarBuilder;
}
setEmptyAvatarBuilder(EmptyAvatarBuilder builder) {
_emptyAvatarBuilder = builder;
}
setGlobalConfig(TIMUIKitConfig? config) {
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
final TUISettingModel settingModel = serviceLocator<TUISettingModel>();
selfInfoViewModel.globalConfig = config;
settingModel.init();
}
addIdentifier() {
TUIKitWebSupport.addSetterToWindow();
TUIKitWebSupport.addIdentifierToWindow();
}
@override
Future<bool?> init(
{
/// Callback from TUIKit invoke, includes IM SDK API error, notify information, Flutter error.
ValueChanged<TIMCallback>? onTUIKitCallbackListener,
required int sdkAppID,
required LogLevelEnum loglevel,
required V2TimSDKListener listener,
LanguageEnum? language,
String? extraLanguage,
TIMUIKitConfig? config,
/// Specify the current device platform, mobile or desktop, based on your needs.
/// TUIKit will automatically determine the platform if no specification is provided. DeviceType? platform,
DeviceType? platform,
String? uikitLogPath,
VoidCallback? onWebLoginSuccess}) async {
if (platform != null) {
TUIKitScreenUtils.deviceType = platform;
}
addIdentifier();
if (extraLanguage != null) {
Future.delayed(const Duration(milliseconds: 1), () {
I18nUtils(null, extraLanguage);
});
} else if (language != null) {
Future.delayed(const Duration(milliseconds: 1), () {
I18nUtils(null, languageEnumToString[language]);
});
}
if (onTUIKitCallbackListener != null) {
onCallback = onTUIKitCallbackListener;
}
setGlobalConfig(config);
_sdkAppID = sdkAppID;
webLoginSuccess = onWebLoginSuccess;
final result = await TencentImSDKPlugin.v2TIMManager.initSDK(
sdkAppID: sdkAppID,
loglevel: loglevel,
listener: V2TimSDKListener(
onConnectFailed: listener.onConnectFailed,
onConnectSuccess: () {
if (PlatformUtils().isWeb) {
didLoginSuccess();
if (onWebLoginSuccess != null) {
onWebLoginSuccess();
}
}
listener.onConnectSuccess();
},
onConnecting: listener.onConnecting,
onKickedOffline: listener.onKickedOffline,
onUserStatusChanged: (List<V2TimUserStatus> userStatusList) {
updateUserStatusList(userStatusList);
listener.onUserStatusChanged(userStatusList);
},
onSelfInfoUpdated: (V2TimUserFullInfo info) {
listener.onSelfInfoUpdated(info);
serviceLocator<TUISelfInfoViewModel>().setLoginInfo(info);
_loginInfo = info;
},
onUserSigExpired: listener.onUserSigExpired));
if (result.code == 0) {
return true;
} else {
return false;
}
}
/// This method is used for init the TUIKit after you initialized the IM SDK from Native SDK.
@override
Future<void> setDataFromNative({
/// Callback from TUIKit invoke, includes IM SDK API error, notify information, Flutter error.
ValueChanged<TIMCallback>? onTUIKitCallbackListener,
LanguageEnum? language,
TIMUIKitConfig? config,
String? extraLanguage,
required String userId,
}) async {
_userID = userId;
if (extraLanguage != null) {
Future.delayed(const Duration(milliseconds: 1), () {
I18nUtils(null, extraLanguage);
});
} else if (language != null) {
Future.delayed(const Duration(milliseconds: 1), () {
I18nUtils(null, languageEnumToString[language]);
});
}
if (onTUIKitCallbackListener != null) {
onCallback = onTUIKitCallbackListener;
}
setGlobalConfig(config);
if (!PlatformUtils().isWeb) {
didLoginSuccess();
}
}
void addInitListener() {
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel = serviceLocator<TUIChatGlobalModel>();
final TUIGroupListenerModel tuiGroupListenerModel = serviceLocator<TUIGroupListenerModel>();
tuiFriendShipViewModel.addFriendListener();
tuiConversationViewModel.setConversationListener();
tuiChatViewModel.addAdvancedMsgListener();
tuiGroupListenerModel.setGroupListener();
}
void removeListener() {
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel = serviceLocator<TUIChatGlobalModel>();
final TUIGroupListenerModel tuiGroupListenerModel = serviceLocator<TUIGroupListenerModel>();
tuiFriendShipViewModel.removeFriendshipListener();
tuiConversationViewModel.removeConversationListener();
tuiChatViewModel.removeAdvanceMsgListener();
tuiGroupListenerModel.removeGroupListener();
}
callOnCallback(TIMCallback callbackValue) {
if (onCallback != null) {
Future.delayed(const Duration(milliseconds: 500), () {
onCallback!(callbackValue);
});
} else {
outputLogger.i("TUIKit Callback: ${callbackValue.type} - ${callbackValue.stackTrace}");
}
}
initDataModel() {
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
tuiFriendShipViewModel.initFriendShipModel();
tuiConversationViewModel.initConversation();
}
clearData() {
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final TUIConversationViewModel tuiConversationViewModel = serviceLocator<TUIConversationViewModel>();
final TUIChatGlobalModel tuiChatViewModel = serviceLocator<TUIChatGlobalModel>();
tuiFriendShipViewModel.clearData();
tuiConversationViewModel.clearData();
tuiChatViewModel.clearData();
}
updateUserStatusList(List<V2TimUserStatus> newUserStatusList) {
try {
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
if (selfInfoViewModel.globalConfig?.isShowOnlineStatus == false) {
return;
}
final TUIFriendShipViewModel tuiFriendShipViewModel = serviceLocator<TUIFriendShipViewModel>();
final currentUserStatusList = tuiFriendShipViewModel.userStatusList;
for (int i = 0; i < newUserStatusList.length; i++) {
final int indexInCurrentUserList =
currentUserStatusList.indexWhere((element) => element.userID == newUserStatusList[i].userID);
if (indexInCurrentUserList == -1) {
currentUserStatusList.add(newUserStatusList[i]);
} else {
currentUserStatusList[indexInCurrentUserList] = newUserStatusList[i];
}
}
tuiFriendShipViewModel.userStatusList = currentUserStatusList;
// ignore: empty_catches
} catch (e) {}
}
@override
Future<V2TimCallback> login({
required String userID,
required String userSig,
}) async {
_userID = userID;
_userSig = userSig;
V2TimCallback result = await TencentImSDKPlugin.v2TIMManager.login(userID: userID, userSig: userSig);
if (!PlatformUtils().isWeb) {
didLoginSuccess();
}
if (result.code != 0) {
callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorCode: result.code, errorMsg: result.desc));
}
return result;
}
void didLoginSuccess() async {
if (isLoginSuccess == true) {
return;
}
isLoginSuccess = true;
addInitListener();
initDataModel();
if (TencentUtils.checkString(_userID) == null) {
V2TimValueCallback<String> getLoginUserRes = await TencentImSDKPlugin.v2TIMManager.getLoginUser();
if (getLoginUserRes.code == 0) {
_userID = getLoginUserRes.data ?? "";
}
}
getUsersInfoWithRetry();
}
void getUsersInfoWithRetry() async {
V2TimValueCallback<List<V2TimUserFullInfo>>? res;
bool success = false;
while (!success) {
res = await getUsersInfo(userIDList: [_userID]);
if (res.code == 0 &&
res.data != null &&
res.data!.isNotEmpty &&
res.data!.firstWhereOrNull((element) => element.userID == _userID) != null) {
success = true;
} else {
await Future.delayed(const Duration(seconds: 2));
}
}
_loginInfo = res?.data!.firstWhereOrNull((element) => element.userID == _userID);
final TUISelfInfoViewModel selfInfoViewModel = serviceLocator<TUISelfInfoViewModel>();
if (_loginInfo != null) {
selfInfoViewModel.setLoginInfo(_loginInfo);
}
}
// Deprecated
void didLoginOut() {
removeListener();
clearData();
_loginInfo = null;
serviceLocator<TUISelfInfoViewModel>().setLoginInfo(_loginInfo);
}
@override
Future<V2TimCallback> logout() async {
final result = await TencentImSDKPlugin.v2TIMManager.logout();
isLoginSuccess = false;
removeListener();
clearData();
serviceLocator<TUISelfInfoViewModel>().setLoginInfo(null);
return result;
}
@override
Future<V2TimCallback> logoutWithoutClearData() async {
final result = await TencentImSDKPlugin.v2TIMManager.logout();
isLoginSuccess = false;
removeListener();
serviceLocator<TUISelfInfoViewModel>().setLoginInfo(null);
return result;
}
@override
Future unInit() async {
final result = await TencentImSDKPlugin.v2TIMManager.unInitSDK();
return result;
}
@override
Future<V2TimValueCallback<List<V2TimUserFullInfo>>> getUsersInfo({
required List<String> userIDList,
}) {
return TencentImSDKPlugin.v2TIMManager.getUsersInfo(userIDList: userIDList);
}
@override
Future<V2TimCallback> setOfflinePushConfig({
required String token,
bool isTPNSToken = false,
int? businessID,
}) {
return TencentImSDKPlugin.v2TIMManager.getOfflinePushManager().setOfflinePushConfig(
businessID: businessID?.toDouble() ?? 0,
token: token,
isTPNSToken: isTPNSToken,
);
}
@override
Future<V2TimCallback> setSelfInfo({
required V2TimUserFullInfo userFullInfo,
}) {
return TencentImSDKPlugin.v2TIMManager.setSelfInfo(userFullInfo: userFullInfo);
}
@override
setTheme({required TUITheme theme}) {
// 合并传入Theme和默认Theme
final TUIThemeViewModel _theme = serviceLocator<TUIThemeViewModel>();
Map<String, Color?> jsonMap = Map.from(CommonColor.defaultTheme.toJson());
Map<String, Color?> jsonInputThemeMap = Map.from(theme.toJson());
jsonInputThemeMap.forEach((key, value) {
if (value != null) {
jsonMap.update(key, (v) => value);
}
});
_theme.theme = TUITheme.fromJson(jsonMap);
}
@override
setDarkTheme() {
final TUIThemeViewModel _theme = serviceLocator<TUIThemeViewModel>();
_theme.theme = TUITheme.dark; //Dark
}
@override
setLightTheme() {
final TUIThemeViewModel _theme = serviceLocator<TUIThemeViewModel>();
_theme.theme = TUITheme.light; //Light
}
@override
Future<V2TimCallback> setOfflinePushStatus({required AppStatus status, int? totalCount}) {
if (status == AppStatus.foreground) {
return TencentImSDKPlugin.v2TIMManager.getOfflinePushManager().doForeground();
} else {
return TencentImSDKPlugin.v2TIMManager.getOfflinePushManager().doBackground(unreadCount: totalCount ?? 0);
}
}
@override
setDeviceType(DeviceType deviceType) {
TUIKitScreenUtils.deviceType = deviceType;
}
}
@@ -0,0 +1,55 @@
import 'package:flutter/cupertino.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/tim_uikit_wide_modal_operation_key.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme.dart';
class TIMUIKitConfig {
/// Control if show online status of friends or contacts.
/// This only works with [Ultimate Edition].
/// [Default]: true.
final bool isShowOnlineStatus;
/// Controls if allows to check the disk memory after login.
/// If the storage space is less than 1GB,
/// an callback from `onTUIKitCallbackListener` will be invoked,
/// type is `INFO`, while code is 6661403.
final bool isCheckDiskStorageSpace;
/// The asset path of the default avatar image.
final String? defaultAvatarAssetPath;
/// The configuration of border radius for all the avatar shows in TUIKit.
final BorderRadius? defaultAvatarBorderRadius;
/// You can use this function to customize the Modal that shows on desktop.
/// Do not specified or return `false` will use our default implementation.
final Future<bool> Function(
TUIKitWideModalOperationKey operationKey,
BuildContext context,
Widget Function(VoidCallback closeFunc) child,
TUITheme? theme,
double? width,
double? height,
Offset? offset,
String? initText,
BorderRadius? borderRadius,
bool? isDarkBackground,
String? title,
VoidCallback? onSubmit,
Widget? submitWidget,
VoidCallback? onConfirm,
VoidCallback? onCancel,
)? showDesktopModalFunc;
/// Determines whether TUIKit should preload some messages after initialization for faster message display,
/// with a default value of `true`, and backward-compatibility.
final bool isPreloadMessagesAfterInit;
const TIMUIKitConfig( {
this.defaultAvatarAssetPath,
this.showDesktopModalFunc,
this.isPreloadMessagesAfterInit = true,
this.defaultAvatarBorderRadius,
this.isCheckDiskStorageSpace = true,
this.isShowOnlineStatus = true,
});
}
@@ -0,0 +1,43 @@
enum TUIKitWideModalOperationKey{
/// You could use this value for your own Modal usage.
custom,
// The following values are used in TUIKit
conversationSecondaryMenu,
chooseCountry,
beforeSendScreenShot,
showUserProfileFromChat,
addNewContact,
showBlockedUsers,
chooseContacts,
addFriend,
addGroup,
chooseGroupType,
settings,
contactUs,
aboutUs,
showConditionsAndTerms,
secondaryClickUserAvatar,
forward,
messageReadDetails,
mergerMessageList,
chooseMentionedMembers,
chatHistory,
groupAddOpt,
setMute,
setUnmute,
setAdmins,
deleteAdmin,
groupMembersList,
addGroupMembers,
kickOffGroupMembers,
confirmDeleteMessages,
confirmClearChatHistory,
confirmExitGroup,
confirmDisbandGroup,
confirmGeneral,
unableToSendDueToFolders
}
@@ -0,0 +1,4 @@
class TUIKitWebSupport {
static void addSetterToWindow() {}
static void addIdentifierToWindow() {}
}
@@ -0,0 +1,12 @@
// ignore: avoid_web_libraries_in_flutter
import 'dart:js';
class TUIKitWebSupport {
static void addSetterToWindow() {}
static void addIdentifierToWindow() {
// var object = newObject();
// setProperty(object, "platform", "flutter_uikit");
context['tencent_cloud_im_csig_flutter_for_web_25F_cy'] =
"flutter_web_uikit";
}
}
@@ -0,0 +1,94 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimFriendshipListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_response_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_check_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_check_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
abstract class FriendshipServices {
Future<List<V2TimFriendInfoResult>?> getFriendsInfo({
required List<String> userIDList,
});
Future<List<V2TimUserFullInfo>?> getUsersInfo({
required List<String> userIDList,
});
Future<List<V2TimFriendOperationResult>?> addToBlackList({
required List<String> userIDList,
});
Future<V2TimValueCallback<V2TimFriendOperationResult>> addFriend({
required String userID,
required FriendTypeEnum addType,
String? remark,
String? friendGroup,
String? addSource,
String? addWording,
});
Future<List<V2TimFriendOperationResult>?> deleteFromBlackList({
required List<String> userIDList,
});
Future<List<V2TimFriendOperationResult>?> deleteFromFriendList({
required List<String> userIDList,
required FriendTypeEnum deleteType,
});
Future<List<V2TimFriendInfo>?> getFriendList();
Future<List<V2TimFriendInfoResult>?> searchFriends({
required V2TimFriendSearchParam searchParam,
});
Future<List<V2TimFriendInfo>?> getBlackList();
Future<List<V2TimFriendCheckResult>?> checkFriend({
required List<String> userIDList,
required FriendTypeEnum checkType,
});
Future<void> addFriendListener({
required V2TimFriendshipListener listener,
});
Future<void> removeFriendListener({
V2TimFriendshipListener? listener,
});
Future<V2TimFriendApplicationResult?> getFriendApplicationList();
Future<V2TimFriendOperationResult?> acceptFriendApplication(
{required FriendResponseTypeEnum responseType, required FriendApplicationTypeEnum type, required String userID});
Future<V2TimFriendOperationResult?> refuseFriendApplication(
{required FriendApplicationTypeEnum type, required String userID});
Future<V2TimCallback> setFriendInfo({
required String userID,
String? friendRemark,
Map<String, String>? friendCustomInfo,
});
Future<List<V2TimUserStatus>> getUserStatus({
required List<String> userIDList,
});
}
@@ -0,0 +1,311 @@
import 'package:tencent_chat_i18n_tool/tencent_chat_i18n_tool.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimFriendshipListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_response_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/friend_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_check_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_check_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_friend_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_friend_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_user_status.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_user_status.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/error_message_converter.dart';
class FriendshipServicesImpl implements FriendshipServices {
final CoreServicesImpl _coreService = serviceLocator<CoreServicesImpl>();
@override
Future<List<V2TimFriendInfoResult>?> getFriendsInfo({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getFriendsInfo(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimUserFullInfo>?> getUsersInfo({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getUsersInfo(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimFriendOperationResult>?> addToBlackList({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().addToBlackList(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<V2TimValueCallback<V2TimFriendOperationResult>> addFriend({
required String userID,
required FriendTypeEnum addType,
String? remark,
String? friendGroup,
String? addSource,
String? addWording,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().addFriend(
userID: userID,
addType: addType,
remark: remark,
addWording: addWording,
friendGroup: friendGroup,
addSource: addSource,
);
if (result.code != 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code,
infoRecommendText: TIM_t("好友添加失败"),
));
} else if (result.code == 0 && result.data?.resultCode != 0) {
String recommendText = "";
if (result.data != null && result.data!.resultCode != null) {
recommendText = ErrorMessageConverter.getErrorMessage(result.data!.resultCode!);
}
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.code == 0 ? result.data?.resultInfo : result.desc,
errorCode: result.code == 0 ? result.data?.resultCode : result.code,
infoRecommendText: recommendText,
));
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code,
infoRecommendText: TIM_t("好友添加成功"),
));
}
return result;
}
@override
Future<List<V2TimFriendOperationResult>?> deleteFromBlackList({
required List<String> userIDList,
}) async {
final res =
await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().deleteFromBlackList(userIDList: userIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimFriendOperationResult>?> deleteFromFriendList({
required List<String> userIDList,
required FriendTypeEnum deleteType,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.deleteFromFriendList(userIDList: userIDList, deleteType: deleteType);
if (res.code == 0) {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code,
infoRecommendText: TIM_t("好友删除成功")));
return res.data;
} else {
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: res.desc,
errorCode: res.code,
infoRecommendText: TIM_t("好友删除失败")));
return null;
}
}
@override
Future<List<V2TimFriendInfo>?> getFriendList() async {
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getFriendList();
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimFriendInfo>?> getBlackList() async {
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getBlackList();
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimFriendCheckResult>?> checkFriend({
required List<String> userIDList,
required FriendTypeEnum checkType,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.checkFriend(userIDList: userIDList, checkType: checkType);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<void> addFriendListener({
required V2TimFriendshipListener listener,
}) {
return TencentImSDKPlugin.v2TIMManager.getFriendshipManager().addFriendListener(listener: listener);
}
@override
Future<void> removeFriendListener({
V2TimFriendshipListener? listener,
}) {
return TencentImSDKPlugin.v2TIMManager.getFriendshipManager().removeFriendListener(listener: listener);
}
@override
Future<V2TimFriendApplicationResult?> getFriendApplicationList() async {
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().getFriendApplicationList();
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<V2TimFriendOperationResult?> acceptFriendApplication({
required FriendResponseTypeEnum responseType,
required FriendApplicationTypeEnum type,
required String userID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().acceptFriendApplication(
responseType: responseType,
type: type,
userID: userID,
);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<V2TimFriendOperationResult?> refuseFriendApplication(
{required FriendApplicationTypeEnum type, required String userID}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.refuseFriendApplication(type: type, userID: userID);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<V2TimCallback> setFriendInfo({
required String userID,
String? friendRemark,
Map<String, String>? friendCustomInfo,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getFriendshipManager()
.setFriendInfo(friendRemark: friendRemark, friendCustomInfo: friendCustomInfo, userID: userID);
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return res;
}
@override
Future<List<V2TimFriendInfoResult>?> searchFriends({
required V2TimFriendSearchParam searchParam,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getFriendshipManager().searchFriends(searchParam: searchParam);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimUserStatus>> getUserStatus({
required List<String> userIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getUserStatus(userIDList: userIDList);
if (res.code == 0) {
return res.data ?? [];
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return [];
}
}
}
+121
View File
@@ -0,0 +1,121 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_filter_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
abstract class GroupServices {
Future<List<V2TimGroupInfo>?> getJoinedGroupList();
Future<List<V2TimGroupInfoResult>?> getGroupsInfo({
required List<String> groupIDList,
});
Future<V2TimValueCallback<V2TimGroupMemberInfoResult>> getGroupMemberList({
required String groupID,
required GroupMemberFilterTypeEnum filter,
required String nextSeq,
int count = 15,
int offset = 0,
});
Future<V2TimValueCallback<List<V2TimGroupMemberFullInfo>>> getGroupMembersInfo(
{required String groupID, required List<String> memberList});
Future<V2TimCallback> setGroupInfo({
required V2TimGroupInfo info,
});
Future<V2TimCallback> setGroupMemberRole({
required String groupID,
required String userID,
required GroupMemberRoleTypeEnum role,
});
getGroupMembersInfoThrottle({required String groupID, required List<String> memberList, Function? callBack});
Future<V2TimCallback> muteGroupMember({
required String groupID,
required String userID,
required int seconds,
});
Future<V2TimCallback> setGroupMemberInfo({
required String groupID,
required String userID,
String? nameCard,
Map<String, String>? customInfo,
});
Future<V2TimCallback> kickGroupMember({
required String groupID,
required List<String> memberList,
String? reason,
});
Future<V2TimValueCallback<List<V2TimGroupMemberOperationResult>>> inviteUserToGroup({
required String groupID,
required List<String> userList,
});
Future<V2TimValueCallback<List<V2TimGroupInfo>>> searchGroups({
required V2TimGroupSearchParam searchParam,
});
Future<V2TimValueCallback<V2GroupMemberInfoSearchResult>> searchGroupMembers({
required V2TimGroupMemberSearchParam searchParam,
});
Future<V2TimCallback> joinGroup({
required String groupID,
required String message,
});
Future<void> addGroupListener({
required V2TimGroupListener listener,
});
Future<void> removeGroupListener({
V2TimGroupListener? listener,
});
Future<V2TimValueCallback<V2TimGroupApplicationResult>> getGroupApplicationList();
Future<V2TimCallback> acceptGroupApplication({
required String groupID,
required String fromUser,
required String toUser,
required int addTime,
required int type,
String? reason,
});
Future<V2TimCallback> refuseGroupApplication(
{String? reason,
required int addTime,
required String groupID,
required String fromUser,
required String toUser,
required GroupApplicationTypeEnum type});
}
@@ -0,0 +1,321 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimGroupListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_application_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_filter_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/group_member_role_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_application_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_application_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_full_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_operation_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_operation_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_member_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/error_message_converter.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/optimize_utils.dart';
class GroupServicesImpl extends GroupServices {
static List<Function?> groupInfoCallBackList = [];
final CoreServicesImpl _coreService = serviceLocator<CoreServicesImpl>();
final throttleGetGroupInfo = OptimizeUtils.throttle((val) async {
String groupID = val["groupID"];
List<String> memberList = val["memberList"];
final res = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupMembersInfo(groupID: groupID, memberList: memberList);
emitGroupCbList(res.data ?? []);
clearGroupCbList();
}, 1000);
static emitGroupCbList(List<V2TimGroupMemberFullInfo?> list) {
for (var cb in groupInfoCallBackList) {
cb!(list);
}
}
static clearGroupCbList() {
groupInfoCallBackList = [];
}
@override
Future<List<V2TimGroupInfo>?> getJoinedGroupList() async {
final res = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getJoinedGroupList();
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
Future<List<V2TimGroupInfoResult>?> getGroupsInfo({
required List<String> groupIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getGroupsInfo(groupIDList: groupIDList);
if (res.code == 0) {
return res.data;
} else {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
}
@override
void getGroupMembersInfoThrottle(
{required String groupID, required List<String> memberList, Function? callBack}) async {
if (callBack != null) {
groupInfoCallBackList.add(callBack);
throttleGetGroupInfo({"groupID": groupID, "memberList": memberList});
}
}
@override
Future<V2TimValueCallback<List<V2TimGroupMemberFullInfo>>> getGroupMembersInfo(
{required String groupID, required List<String> memberList}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupMembersInfo(groupID: groupID, memberList: memberList);
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return res;
}
@override
Future<V2TimValueCallback<V2TimGroupMemberInfoResult>> getGroupMemberList({
required String groupID,
required GroupMemberFilterTypeEnum filter,
required String nextSeq,
int count = 15,
int offset = 0,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.getGroupMemberList(groupID: groupID, filter: filter, nextSeq: nextSeq, count: count, offset: offset);
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return res;
}
@override
Future<V2TimCallback> setGroupInfo({
required V2TimGroupInfo info,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().setGroupInfo(info: info);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setGroupMemberRole({
required String groupID,
required String userID,
required GroupMemberRoleTypeEnum role,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.setGroupMemberRole(groupID: groupID, userID: userID, role: role);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> muteGroupMember({
required String groupID,
required String userID,
required int seconds,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.muteGroupMember(groupID: groupID, userID: userID, seconds: seconds);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setGroupMemberInfo({
required String groupID,
required String userID,
String? nameCard,
Map<String, String>? customInfo,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.setGroupMemberInfo(groupID: groupID, userID: userID, nameCard: nameCard, customInfo: customInfo);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> kickGroupMember({
required String groupID,
required List<String> memberList,
String? reason,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getGroupManager()
.kickGroupMember(groupID: groupID, memberList: memberList, reason: reason);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<List<V2TimGroupMemberOperationResult>>> inviteUserToGroup({
required String groupID,
required List<String> userList,
}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getGroupManager().inviteUserToGroup(groupID: groupID, userList: userList);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<List<V2TimGroupInfo>>> searchGroups({
required V2TimGroupSearchParam searchParam,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().searchGroups(searchParam: searchParam);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> joinGroup({
required String groupID,
required String message,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.joinGroup(groupID: groupID, message: message);
if (result.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(result.code);
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code,
infoRecommendText: recommendText));
}
return result;
}
@override
Future<V2TimValueCallback<V2GroupMemberInfoSearchResult>> searchGroupMembers({
required V2TimGroupMemberSearchParam searchParam,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().searchGroupMembers(param: searchParam);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<void> addGroupListener({
required V2TimGroupListener listener,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.addGroupListener(listener: listener);
return result;
}
@override
Future<void> removeGroupListener({
V2TimGroupListener? listener,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.removeGroupListener(listener: listener);
return result;
}
@override
Future<V2TimValueCallback<V2TimGroupApplicationResult>> getGroupApplicationList() async {
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().getGroupApplicationList();
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> acceptGroupApplication(
{required String groupID,
required String fromUser,
required String toUser,
required int type,
required int addTime,
String? reason}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().acceptGroupApplication(
groupID: groupID,
fromUser: fromUser,
toUser: toUser,
addTime: addTime,
type: GroupApplicationTypeEnum.values[type],
reason: reason ?? "",
);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> refuseGroupApplication(
{String? reason,
required int addTime,
required String groupID,
required String fromUser,
required String toUser,
required GroupApplicationTypeEnum type}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getGroupManager().refuseGroupApplication(
groupID: groupID, fromUser: fromUser, toUser: toUser, type: type, addTime: addTime, reason: reason);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
}
@@ -0,0 +1,685 @@
// ignore_for_file: deprecated_member_use
import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSimpleMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/get_group_message_read_member_list_filter.dart';
import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_message_read_member_list.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';
import 'package:tencent_cloud_chat_uikit/base_widgets/tim_callback.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_conversation_view_model.dart';
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/services_locatar.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/error_message_converter.dart';
import 'package:tencent_cloud_chat_uikit/ui/utils/platform.dart';
class MessageServiceImpl extends MessageService {
final CoreServicesImpl _coreService = serviceLocator<CoreServicesImpl>();
final Map<String, List<V2TimMessage>> messageListMap = {};
final Map<String, List<V2TimMessage>> sendingMessage = {};
@override
Future<MessageListResponse> getHistoryMessageListV2({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = -1,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
}) async {
bool haveMoreData = true;
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final List<V2TimMessage> responseMessageList = res.data ?? [];
final conversationID = userID ?? groupID;
final cachedMessageList = messageListMap[conversationID];
List<V2TimMessage> combinedMessageList = [];
// 加载更多
if (lastMsgID != null && cachedMessageList != null) {
combinedMessageList = [...cachedMessageList, ...responseMessageList];
// 首次加载
} else {
final bool existSendingMessage =
sendingMessage[conversationID] != null && sendingMessage[conversationID]!.isNotEmpty;
// 存在未发送完成的消息
if (existSendingMessage) {
combinedMessageList = [...sendingMessage[conversationID]!, ...responseMessageList];
} else {
sendingMessage.remove(conversationID);
combinedMessageList = responseMessageList;
}
}
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
if (responseMessageList.isEmpty ||
(!PlatformUtils().isWeb && responseMessageList.length < count) ||
(PlatformUtils().isWeb && responseMessageList.length < min(count, 20))) {
haveMoreData = false;
} else {
haveMoreData = true;
}
return MessageListResponse(haveMoreData: haveMoreData, data: combinedMessageList);
}
@override
Future<List<V2TimMessage>> getHistoryMessageList({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = -1,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageList(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final reponseMessageList = res.data ?? [];
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return reponseMessageList;
}
@override
Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq = 0,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getHistoryMessageListV2(
count: count,
getType: getType,
userID: userID,
groupID: groupID,
lastMsgID: lastMsgID,
lastMsgSeq: lastMsgSeq,
messageTypeList: messageTypeList);
final responseMessageList = res.data;
if (res.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
}
return responseMessageList;
}
@override
Future addSimpleMsgListener({
required V2TimSimpleMsgListener listener,
}) async {
return TencentImSDKPlugin.v2TIMManager.addSimpleMsgListener(listener: listener);
}
@override
Future<void> removeSimpleMsgListener({V2TimSimpleMsgListener? listener}) {
return TencentImSDKPlugin.v2TIMManager.removeSimpleMsgListener(listener: listener);
}
@override
Future<void> addAdvancedMsgListener({
required V2TimAdvancedMsgListener listener,
}) {
return TencentImSDKPlugin.v2TIMManager.getMessageManager().addAdvancedMsgListener(listener: listener);
}
@override
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> getGroupMessageReadMemberList({
required String messageID,
required GetGroupMessageReadMemberListFilter filter,
int nextSeq = 0,
int count = 100,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.getGroupMessageReadMemberList(messageID: messageID, filter: filter, nextSeq: nextSeq, count: count);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<List<V2TimMessageReceipt>>> getMessageReadReceipts({
required List<String> messageIDList,
}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageReadReceipts(messageIDList: messageIDList);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> sendMessageReadReceipts({
required List<String> messageIDList,
}) async {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessageReadReceipts(messageIDList: messageIDList);
});
}
@override
Future<V2TimMsgCreateInfoResult?> createTextMessage({required String text}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createTextMessage(text: text);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createCustomMessage({required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createCustomMessage(data: data);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createFaceMessage({required int index, required String data}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createFaceMessage(index: index, data: data);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessage>> reSendMessage({required String msgID, bool? onlineUserOnly}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.reSendMessage(msgID: msgID, onlineUserOnly: onlineUserOnly ?? false);
if (res.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(res.code);
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code, infoRecommendText: recommendText));
}
return res;
}
@override
Future<V2TimMsgCreateInfoResult?> createTextAtMessage(
{required String text, required List<String> atUserList}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createTextAtMessage(text: text, atUserList: atUserList);
if (res.code == 0) {
final messageResult = res.data;
return messageResult;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createImageMessage(
{String? imageName, String? imagePath, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createImageMessage(imageName: imageName, imagePath: imagePath ?? "", inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createSoundMessage({
required String soundPath,
required int duration,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createSoundMessage(soundPath: soundPath, duration: duration);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessage>> sendMessage({
required String id, // 自己创建的ID
required String receiver,
required String groupID,
MessagePriorityEnum priority = MessagePriorityEnum.V2TIM_PRIORITY_NORMAL,
bool onlineUserOnly = false,
bool isExcludedFromUnreadCount = false,
bool needReadReceipt = false,
OfflinePushInfo? offlinePushInfo,
String? cloudCustomData,
String? localCustomData,
bool isExcludedFromContentModeration = false,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage(
id: id,
receiver: receiver,
groupID: groupID,
priority: priority,
onlineUserOnly: onlineUserOnly,
offlinePushInfo: offlinePushInfo,
needReadReceipt: needReadReceipt,
localCustomData: localCustomData,
cloudCustomData: cloudCustomData,
isExcludedFromContentModeration: isExcludedFromContentModeration,
);
if (result.code != 0) {
String recommendText = ErrorMessageConverter.getErrorMessage(result.code);
_coreService.callOnCallback(TIMCallback(
type: TIMCallbackType.API_ERROR,
errorMsg: result.desc,
errorCode: result.code,
infoRecommendText: recommendText));
}
return result;
}
@override
Future<V2TimCallback> deleteMessageFromLocalStorage({
required String msgID,
Object? webMessageInstance,
}) async {
V2TimCallback result;
if (kIsWeb) {
result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(msgIDs: [], webMessageInstanceList: [webMessageInstance]);
} else {
result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().deleteMessageFromLocalStorage(msgID: msgID);
}
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> revokeMessage({required String msgID, Object? webMessageInstance}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.revokeMessage(msgID: msgID, webMessageInstatnce: webMessageInstance);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> clearC2CHistoryMessage({
required String userID,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearC2CHistoryMessage(userID: userID);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> clearGroupHistoryMessage({
required String groupID,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().clearGroupHistoryMessage(groupID: groupID);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
Future<V2TimCallback> _retryMarkMessageAsRead({
required Future<V2TimCallback> Function() action,
int retries = 3,
}) async {
V2TimCallback result;
int attempts = 0;
do {
result = await action();
if (result.code == 0) {
return result;
}
attempts++;
await Future.delayed(const Duration(milliseconds: 500));
} while (attempts < retries);
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
return result;
}
@override
Future<V2TimCallback> markC2CMessageAsRead({
required String userID,
}) {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager.getConversationManager().cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationC2CPrefix}$userID",
cleanTimestamp: 0,
cleanSequence: 0,
);
});
}
@override
Future<V2TimCallback> markGroupMessageAsRead({
required String groupID,
}) {
return _retryMarkMessageAsRead(action: () {
return TencentImSDKPlugin.v2TIMManager.getConversationManager().cleanConversationUnreadMessageCount(
conversationID: "${TUIConversationViewModel.conversationGroupPrefix}$groupID",
cleanTimestamp: 0,
cleanSequence: 0,
);
});
}
@override
Future<void> removeAdvancedMsgListener({V2TimAdvancedMsgListener? listener}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().removeAdvancedMsgListener(listener: listener);
return result;
}
@override
Future<List<V2TimMessage>?> downloadMergerMessage({
required String msgID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().downloadMergerMessage(msgID: msgID);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createForwardMessage({
required String msgID,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createForwardMessage(msgID: msgID);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createMergerMessage({
required List<String> msgIDList,
required String title,
required List<String> abstractList,
required String compatibleText,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createMergerMessage(
msgIDList: msgIDList, title: title, abstractList: abstractList, compatibleText: compatibleText);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimCallback> deleteMessages({required List<String> msgIDs, List<dynamic>? webMessageInstanceList}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.deleteMessages(msgIDs: msgIDs, webMessageInstanceList: webMessageInstanceList);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimMsgCreateInfoResult?> createVideoMessage(
{String? videoPath, String? type, int? duration, String? snapshotPath, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createVideoMessage(
videoFilePath: videoPath ?? "",
type: type ?? "",
duration: duration ?? 1,
snapshotPath: snapshotPath ?? "",
inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessage>> sendReplyMessage({
required String id, // 自己创建的ID
required String receiver,
required String groupID,
OfflinePushInfo? offlinePushInfo,
bool needReadReceipt = false,
required V2TimMessage replyMessage, // 被回复的消息
}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendReplyMessage(
id: id,
receiver: receiver,
offlinePushInfo: offlinePushInfo,
groupID: groupID,
needReadReceipt: needReadReceipt,
replyMessage: replyMessage);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimMsgCreateInfoResult?> createFileMessage(
{String? filePath, required String fileName, dynamic inputElement}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createFileMessage(filePath: filePath ?? "", fileName: fileName, inputElement: inputElement);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimMsgCreateInfoResult?> createLocationMessage(
{required String desc, required double longitude, required double latitude}) async {
final res = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.createLocationMessage(desc: desc, longitude: longitude, latitude: latitude);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimValueCallback<V2TimMessageSearchResult>> searchLocalMessages(
{required V2TimMessageSearchParam searchParam}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().searchLocalMessages(searchParam: searchParam);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<List<V2TimMessage>?> findMessages({
required List<String> messageIDList,
}) async {
final res = await TencentImSDKPlugin.v2TIMManager.getMessageManager().findMessages(messageIDList: messageIDList);
if (res.code == 0) {
return res.data;
}
_coreService.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: res.desc, errorCode: res.code));
return null;
}
@override
Future<V2TimCallback> setLocalCustomInt({required String msgID, required int localCustomInt}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomInt(msgID: msgID, localCustomInt: localCustomInt);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setC2CReceiveMessageOpt({
required List<String> userIDList,
required ReceiveMsgOptEnum opt,
}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setC2CReceiveMessageOpt(userIDList: userIDList, opt: opt);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setGroupReceiveMessageOpt({
required String groupID,
required ReceiveMsgOptEnum opt,
}) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().setGroupReceiveMessageOpt(groupID: groupID, opt: opt);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage({required V2TimMessage message}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().modifyMessage(message: message);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> setLocalCustomData({required String msgID, required String localCustomData}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.setLocalCustomData(msgID: msgID, localCustomData: localCustomData);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl({required String msgID}) async {
final result = await TencentImSDKPlugin.v2TIMManager.getMessageManager().getMessageOnlineUrl(msgID: msgID);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<V2TimCallback> downloadMessage(
{required String msgID, required int messageType, required int imageType, required bool isSnapshot}) async {
final result = await TencentImSDKPlugin.v2TIMManager
.getMessageManager()
.downloadMessage(msgID: msgID, messageType: messageType, imageType: imageType, isSnapshot: isSnapshot);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result;
}
@override
Future<String> translateText(String text, String target) async {
final result =
await TencentImSDKPlugin.v2TIMManager.getMessageManager().translateText(texts: [text], targetLanguage: target);
if (result.code != 0) {
_coreService
.callOnCallback(TIMCallback(type: TIMCallbackType.API_ERROR, errorMsg: result.desc, errorCode: result.code));
}
return result.data?[text] ?? "";
}
}
@@ -0,0 +1,220 @@
import 'package:tencent_cloud_chat_sdk/enum/V2TimAdvancedMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/V2TimSimpleMsgListener.dart';
import 'package:tencent_cloud_chat_sdk/enum/get_group_message_read_member_list_filter.dart';
import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/message_priority_enum.dart';
import 'package:tencent_cloud_chat_sdk/enum/offlinePushInfo.dart';
import 'package:tencent_cloud_chat_sdk/enum/receive_message_opt_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_callback.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_message_read_member_list.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_group_message_read_member_list.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_change_info.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_change_info.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_list_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_list_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_online_url.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_online_url.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_receipt.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_receipt.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_param.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_param.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message_search_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_message_search_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_msg_create_info_result.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_msg_create_info_result.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart'
if (dart.library.html) 'package:tencent_cloud_chat_sdk/web/compatible_models/v2_tim_value_callback.dart';
class MessageListResponse {
final bool haveMoreData;
final List<V2TimMessage> data;
MessageListResponse({required this.haveMoreData, required this.data});
}
abstract class MessageService {
Future<List<V2TimMessage>> getHistoryMessageList({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
});
Future<V2TimMessageListResult?> getHistoryMessageListWithComplete({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
});
Future<MessageListResponse> getHistoryMessageListV2({
HistoryMsgGetTypeEnum getType = HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
String? userID,
String? groupID,
int lastMsgSeq,
required int count,
String? lastMsgID,
List<int>? messageTypeList,
});
Future addSimpleMsgListener({
required V2TimSimpleMsgListener listener,
});
Future addAdvancedMsgListener({
required V2TimAdvancedMsgListener listener,
});
Future<void> removeSimpleMsgListener({V2TimSimpleMsgListener? listener});
Future<V2TimMsgCreateInfoResult?> createTextMessage({required String text});
Future<V2TimMsgCreateInfoResult?> createFaceMessage({required int index, required String data});
Future<V2TimMsgCreateInfoResult?> createCustomMessage({required String data});
Future<V2TimMsgCreateInfoResult?> createTextAtMessage({required String text, required List<String> atUserList});
Future<V2TimValueCallback<V2TimMessage>> sendMessage(
{required String id, // 自己创建的ID
required String receiver,
required String groupID,
MessagePriorityEnum priority = MessagePriorityEnum.V2TIM_PRIORITY_NORMAL,
bool onlineUserOnly = false,
bool isExcludedFromUnreadCount = false,
bool needReadReceipt = false,
OfflinePushInfo? offlinePushInfo,
String? cloudCustomData, // 云自定义消息字段,只能在消息发送前添加
String? localCustomData,
bool isExcludedFromContentModeration});
Future<V2TimValueCallback<V2TimMessage>> sendReplyMessage({
required String id, // 自己创建的ID
required String receiver,
required String groupID,
OfflinePushInfo? offlinePushInfo,
bool needReadReceipt = false,
required V2TimMessage replyMessage, // 被回复的消息
});
Future<V2TimValueCallback<V2TimMessage>> reSendMessage({required String msgID, bool onlineUserOnly});
Future<V2TimValueCallback<V2TimMessageChangeInfo>> modifyMessage({required V2TimMessage message});
Future<V2TimMsgCreateInfoResult?> createImageMessage({String? imageName, String? imagePath, dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createVideoMessage(
{String? videoPath = "", String? type = "", int? duration = 0, String? snapshotPath = "", dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createFileMessage(
{String? filePath, required String fileName, dynamic inputElement});
Future<V2TimMsgCreateInfoResult?> createLocationMessage(
{required String desc, required double longitude, required double latitude});
Future<V2TimMsgCreateInfoResult?> createSoundMessage({
required String soundPath,
required int duration,
});
Future<V2TimMsgCreateInfoResult?> createForwardMessage({
required String msgID,
});
Future<V2TimMsgCreateInfoResult?> createMergerMessage({
required List<String> msgIDList,
required String title,
required List<String> abstractList,
required String compatibleText,
});
Future<V2TimCallback> deleteMessageFromLocalStorage({
required String msgID,
Object? webMessageInstance,
});
Future<V2TimCallback> revokeMessage({required String msgID, Object? webMessageInstance});
Future<V2TimCallback> clearC2CHistoryMessage({
required String userID,
});
Future<V2TimCallback> clearGroupHistoryMessage({
required String groupID,
});
Future<V2TimCallback> markC2CMessageAsRead({
required String userID,
});
Future<V2TimCallback> markGroupMessageAsRead({
required String groupID,
});
Future<void> removeAdvancedMsgListener({V2TimAdvancedMsgListener? listener});
Future<List<V2TimMessage>?> downloadMergerMessage({
required String msgID,
});
Future<V2TimCallback> deleteMessages({required List<String> msgIDs, List<dynamic>? webMessageInstanceList});
Future<List<V2TimMessage>?> findMessages({
required List<String> messageIDList,
});
Future<V2TimValueCallback<V2TimMessageSearchResult>> searchLocalMessages({
required V2TimMessageSearchParam searchParam,
});
Future<V2TimCallback> setLocalCustomInt({required String msgID, required int localCustomInt});
Future<V2TimCallback> setLocalCustomData({required String msgID, required String localCustomData});
Future<V2TimCallback> setC2CReceiveMessageOpt({
required List<String> userIDList,
required ReceiveMsgOptEnum opt,
});
Future<V2TimCallback> setGroupReceiveMessageOpt({
required String groupID,
required ReceiveMsgOptEnum opt,
});
Future<V2TimValueCallback<V2TimGroupMessageReadMemberList>> getGroupMessageReadMemberList({
required String messageID,
required GetGroupMessageReadMemberListFilter filter,
int nextSeq = 0,
int count = 100,
});
Future<V2TimValueCallback<List<V2TimMessageReceipt>>> getMessageReadReceipts({
required List<String> messageIDList,
});
Future<V2TimCallback> sendMessageReadReceipts({
required List<String> messageIDList,
});
Future<V2TimValueCallback<V2TimMessageOnlineUrl>> getMessageOnlineUrl({
required String msgID,
});
Future<V2TimCallback> downloadMessage({
required String msgID,
required int messageType,
required int imageType, // 图片类型,仅messageType为图片消息是有效
required bool isSnapshot, // 是否是视频封面,仅messageType为视频消息是有效
});
Future<String> translateText(String text, String target);
}
+55
View File
@@ -0,0 +1,55 @@
import 'package:get_it/get_it.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/listener_model/tui_group_listener_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/separate_models/tui_chat_model_tools.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_conversation_view_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_friendship_view_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_setting_model.dart';
import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/conversation/conversation_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/core/core_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/friendShip/friendship_services_implements.dart';
import 'package:tencent_cloud_chat_uikit/data_services/group/group_services.dart';
import 'package:tencent_cloud_chat_uikit/data_services/group/group_services_implement.dart';
import 'package:tencent_cloud_chat_uikit/data_services/message/message_service_implement.dart';
import 'package:tencent_cloud_chat_uikit/data_services/message/message_services.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_search_view_model.dart';
import 'package:tencent_cloud_chat_uikit/business_logic/view_models/tui_self_info_view_model.dart';
import 'package:tencent_cloud_chat_uikit/theme/tui_theme_view_model.dart';
final serviceLocator = GetIt.instance;
bool boolIsInitailized = false;
void setupServiceLocator() {
if (!boolIsInitailized) {
// setting
serviceLocator.registerSingleton<TUISettingModel>(TUISettingModel());
// services
serviceLocator.registerSingleton<CoreServicesImpl>(CoreServicesImpl());
serviceLocator
.registerSingleton<TUISelfInfoViewModel>(TUISelfInfoViewModel());
serviceLocator
.registerSingleton<ConversationService>(ConversationServicesImpl());
serviceLocator.registerSingleton<MessageService>(MessageServiceImpl());
serviceLocator
.registerSingleton<FriendshipServices>(FriendshipServicesImpl());
serviceLocator.registerSingleton<GroupServices>(GroupServicesImpl());
// view models
serviceLocator.registerSingleton<TUIChatGlobalModel>(TUIChatGlobalModel());
serviceLocator.registerSingleton<TUIChatModelTools>(TUIChatModelTools());
serviceLocator.registerSingleton<TUIConversationViewModel>(
TUIConversationViewModel());
serviceLocator
.registerSingleton<TUIFriendShipViewModel>(TUIFriendShipViewModel());
serviceLocator.registerSingleton<TUIThemeViewModel>(TUIThemeViewModel());
serviceLocator.registerSingleton<TUISearchViewModel>(TUISearchViewModel());
// listener models
serviceLocator
.registerSingleton<TUIGroupListenerModel>(TUIGroupListenerModel());
boolIsInitailized = true;
}
}