import 'dart:async'; import 'dart:developer'; import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; import '../models/update_req.dart'; class ConversationManager { MethodChannel _channel; late OnConversationListener listener; ConversationManager(this._channel); /// Conversation Listener Future setConversationListener(OnConversationListener listener) { this.listener = listener; return _channel.invokeMethod('setConversationListener', _buildParam({})); } /// Get All Conversations Future> getAllConversationList({String? operationID}) => _channel .invokeMethod( 'getAllConversationList', _buildParam({ "operationID": Utils.checkOperationID(operationID), })) .then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map))); /// Paginate Through Conversations /// [offset] Starting index /// [count] Number of items per page Future> getConversationListSplit({ int offset = 0, int count = 20, String? operationID, }) => _channel .invokeMethod( 'getConversationListSplit', _buildParam({ 'offset': offset, 'count': count, "operationID": Utils.checkOperationID(operationID), })) .then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map))); /// Query a Conversation; if it doesn't exist, it will be created /// [sourceID] UserID for one-on-one conversation, GroupID for group conversation /// [sessionType] Reference [ConversationType] Future getOneConversation({ required String sourceID, required int sessionType, String? operationID, }) => _channel .invokeMethod( 'getOneConversation', _buildParam({ "sourceID": sourceID, "sessionType": sessionType, "operationID": Utils.checkOperationID(operationID), })) .then((value) => Utils.toObj(value, (map) => ConversationInfo.fromJson(map))); /// Get Multiple Conversations by Conversation ID /// [conversationIDList] List of conversation IDs Future> getMultipleConversation({ required List conversationIDList, String? operationID, }) => _channel .invokeMethod( 'getMultipleConversation', _buildParam({ "conversationIDList": conversationIDList, "operationID": Utils.checkOperationID(operationID), })) .then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map))); /// Set Conversation Draft /// [conversationID] Conversation ID /// [draftText] Draft text Future setConversationDraft({ required String conversationID, required String draftText, String? operationID, }) => _channel.invokeMethod( 'setConversationDraft', _buildParam({ "conversationID": conversationID, "draftText": draftText, "operationID": Utils.checkOperationID(operationID), })); /// Pin a Conversation /// [conversationID] Conversation ID /// [isPinned] true: pin, false: unpin Future pinConversation({ required String conversationID, required bool isPinned, String? operationID, }) { final req = ConversationReq(isPinned: isPinned); return setConversation(conversationID, req, operationID: operationID); } /// Hide a Conversation /// [conversationID] Conversation ID Future hideConversation({ required String conversationID, String? operationID, }) => _channel.invokeMethod( 'hideConversation', _buildParam({ "conversationID": conversationID, "operationID": Utils.checkOperationID(operationID), })); /// Hide All Conversations Future hideAllConversations({ String? operationID, }) => _channel.invokeMethod( 'hideAllConversations', _buildParam({ "operationID": Utils.checkOperationID(operationID), })); /// Query Conversation ID /// [sourceID] UserID for one-on-one, GroupID for group /// [sessionType] Reference [ConversationType] Future getConversationIDBySessionType({ required String sourceID, required int sessionType, String? operationID, }) { return _channel.invokeMethod( 'getConversationIDBySessionType', _buildParam({ 'sourceID': sourceID, 'sessionType': sessionType, 'operationID': Utils.checkOperationID(operationID), })); } /// get total unread message count /// int.tryParse(count) ?? 0; Future getTotalUnreadMsgCount({ String? operationID, }) => _channel.invokeMethod( 'getTotalUnreadMsgCount', _buildParam({ "operationID": Utils.checkOperationID(operationID), })); /// Message Do-Not-Disturb Setting /// [conversationID] Conversation ID /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages @Deprecated('use [setConversation] instead') Future setConversationRecvMessageOpt({ required String conversationID, required int status, String? operationID, }) { final req = ConversationReq(recvMsgOpt: status); return setConversation(conversationID, req, operationID: operationID); } /// Message Do-Not-Disturb Setting /// [conversationID] Conversation ID /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages Future> getConversationRecvMessageOpt({ required List conversationIDList, String? operationID, }) => _channel .invokeMethod( 'getConversationRecvMessageOpt', _buildParam({ "conversationIDList": conversationIDList, "operationID": Utils.checkOperationID(operationID), })) .then((value) => Utils.toListMap(value)); /// Self-Destruct Messages /// [conversationID] Conversation ID /// [isPrivate] true: enable, false: disable @Deprecated('use [setConversation] instead') Future setConversationPrivateChat({ required String conversationID, required bool isPrivate, String? operationID, }) { final req = ConversationReq(isPrivateChat: isPrivate); return setConversation(conversationID, req, operationID: operationID); } /// Delete a Conversation Locally and from the Server /// [conversationID] Conversation ID Future deleteConversationAndDeleteAllMsg({ required String conversationID, String? operationID, }) => _channel.invokeMethod( 'deleteConversationAndDeleteAllMsg', _buildParam({ "conversationID": conversationID, "operationID": Utils.checkOperationID(operationID), })); /// Clear Messages in a Conversation /// [conversationID] Conversation ID Future clearConversationAndDeleteAllMsg({ required String conversationID, String? operationID, }) => _channel.invokeMethod( 'clearConversationAndDeleteAllMsg', _buildParam({ "conversationID": conversationID, "operationID": Utils.checkOperationID(operationID), })); /// Delete All Local Conversations @Deprecated('use hideAllConversations instead') Future deleteAllConversationFromLocal({ String? operationID, }) => _channel.invokeMethod( 'deleteAllConversationFromLocal', _buildParam({ "operationID": Utils.checkOperationID(operationID), })); /// Reset Mentioned (Group At) Flags [GroupAtType] /// [conversationID] Conversation ID @Deprecated('use [setConversation] instead') Future resetConversationGroupAtType({ required String conversationID, String? operationID, }) { final req = ConversationReq(groupAtType: 0); return setConversation(conversationID, req, operationID: operationID); } /// Query @ All Flag Future getAtAllTag({ String? operationID, }) => _channel.invokeMethod( 'getAtAllTag', _buildParam({ "operationID": Utils.checkOperationID(operationID), })); /// Get @ All Tag String get atAllTag => 'AtAllTag'; /// Global Do-Not-Disturb /// [status] 0: normal; 1: not receiving messages; 2: receive online messages but not offline messages @Deprecated('use [OpenIM.iMManager.userManager.setSelfInfo()] instead') Future setGlobalRecvMessageOpt({ required int status, String? operationID, }) { throw UnimplementedError('setGlobalRecvMessageOpt'); } /// Set Self-Destruct Message Duration /// [conversationID] Conversation ID /// [burnDuration] Duration in seconds, default: 30s @Deprecated('use [setConversation] instead') Future setConversationBurnDuration({ required String conversationID, int burnDuration = 30, String? operationID, }) { final req = ConversationReq(burnDuration: burnDuration); return setConversation(conversationID, req, operationID: operationID); } /// Mark Messages as Read /// [conversationID] Conversation ID Future markConversationMessageAsRead({ required String conversationID, String? operationID, }) => _channel.invokeMethod( 'markConversationMessageAsRead', _buildParam({ "conversationID": conversationID, "operationID": Utils.checkOperationID(operationID), })); /// search Conversations Future> searchConversations( String name, { String? operationID, }) { return _channel .invokeMethod( 'searchConversations', _buildParam({ 'name': name, "operationID": Utils.checkOperationID(operationID), })) .then((value) => Utils.toList(value, (map) => ConversationInfo.fromJson(map))); } @Deprecated('use [setConversation] instead') Future setConversationEx( String conversationID, { String? ex, String? operationID, }) { final req = ConversationReq(ex: ex); return setConversation(conversationID, req, operationID: operationID); } /// Custom Sort for Conversation List List simpleSort(List list) => list ..sort((a, b) { if ((a.isPinned == true && b.isPinned == true) || (a.isPinned != true && b.isPinned != true)) { int aCompare = a.draftTextTime! > a.latestMsgSendTime! ? a.draftTextTime! : a.latestMsgSendTime!; int bCompare = b.draftTextTime! > b.latestMsgSendTime! ? b.draftTextTime! : b.latestMsgSendTime!; if (aCompare > bCompare) { return -1; } else if (aCompare < bCompare) { return 1; } else { return 0; } } else if (a.isPinned == true && b.isPinned != true) { return -1; } else { return 1; } }); Future changeInputStates({ required String conversationID, required bool focus, String? operationID, }) { return _channel.invokeMethod( 'changeInputStates', _buildParam( { 'focus': focus, 'conversationID': conversationID, 'operationID': Utils.checkOperationID(operationID), }, ), ); } Future?> getInputStates( String conversationID, String userID, { String? operationID, }) { return _channel .invokeMethod( 'getInputStates', _buildParam( { 'conversationID': conversationID, 'userID': userID, 'operationID': Utils.checkOperationID(operationID), }, ), ) .then((value) { print('getInputStates: $value'); final result = Utils.toListMap(value); return List.from(result); }); } Future setConversation( String conversationID, ConversationReq req, { String? operationID, }) { return _channel.invokeMethod( 'setConversation', _buildParam( { 'conversationID': conversationID, 'req': req.toJson(), 'operationID': Utils.checkOperationID(operationID), }, ), ); } static Map _buildParam(Map param) { param["ManagerName"] = "conversationManager"; param = Utils.cleanMap(param); log('param: $param'); return param; } }