init
This commit is contained in:
Vendored
BIN
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;
|
||||
}
|
||||
}
|
||||
@@ -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 [];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user