import 'dart:convert'; import 'package:flutter/services.dart'; import 'package:flutter_openim_sdk/flutter_openim_sdk.dart'; class MessageManager { MethodChannel _channel; List advancedMsgListeners = List.empty(growable: true); MsgSendProgressListener? msgSendProgressListener; MessageManager(this._channel); /// Add a message listener Future addAdvancedMsgListener(AdvancedMsgListener listener) { advancedMsgListeners.add(listener); return _channel.invokeMethod( 'addAdvancedMsgListener', _buildParam({ 'id': listener.id, })); } /// Remove a message listener Future removeAdvancedMsgListener(AdvancedMsgListener listener) { advancedMsgListeners.remove(listener); return _channel.invokeMethod( 'removeAdvancedMsgListener', _buildParam({ 'id': listener.id, })); } /// Set up message sending progress monitoring void setMsgSendProgressListener(MsgSendProgressListener listener) { msgSendProgressListener = listener; } /// Send a message to user or to group /// [userID] receiver's user ID Future sendMessage({ required Message message, String? userID, String? groupID, bool onlineUserOnly = false, }) { return _channel.invokeMethod( 'sendMessage', _buildParam({ 'message': message.toJson(), 'receiver': userID ?? '', 'groupID': groupID ?? '', 'onlineUserOnly': onlineUserOnly, })) /*.then((value) => _toObj(value))*/; } /// Find all history message Future> getHistoryMessageList({ String? userID, String? groupID, Message? startMsg, int? count, }) { return _channel .invokeMethod( 'getHistoryMessageList', _buildParam({ 'userID': userID ?? '', 'startMsg': startMsg?.toJson() /*?? {}*/, 'groupID': groupID ?? '', 'count': count ?? 10, })) .then((value) => _toList(value)); } /// Revoke the sent information Future revokeMessage({required Message message}) { return _channel.invokeMethod( 'revokeMessage', _buildParam(message.toJson())); } /// Delete message Future deleteMessageFromLocalStorage({required Message message}) { return _channel.invokeMethod( 'deleteMessageFromLocalStorage', _buildParam(message.toJson())); } /// @deprecated Future deleteMessages({required List msgList}) { return _channel.invokeMethod('deleteMessages', _buildParam({"msgList": msgList.map((e) => e.toJson()).toList()})); } /// Future insertSingleMessageToLocalStorage({ String? receiver, String? sender, Message? message, }) { return _channel.invokeMethod( 'insertSingleMessageToLocalStorage', _buildParam({ "userID": receiver, "message": message?.toJson(), "sender": sender, })); } /// Query the message according to the message id Future findMessages({required List messageIDList}) { return _channel.invokeMethod( 'findMessages', _buildParam({ "messageIDList": messageIDList, })); } /// Mark c2c message as read Future markC2CMessageAsRead({ required String userID, required List messageIDList, }) { return _channel.invokeMethod( 'markC2CMessageAsRead', _buildParam({ "messageIDList": messageIDList, "userID": userID, })); } /// Typing Future typingStatusUpdate({ required String userID, bool typing = false, }) { return _channel.invokeMethod( 'typingStatusUpdate', _buildParam({ "typing": typing ? 'yes' : 'no', "userID": userID, })); } /// Create text message Future createTextMessage({required String text}) { return _channel .invokeMethod('createTextMessage', _buildParam({'text': text})) .then((value) => _toObj(value)); } /// Create @ message Future createTextAtMessage({ required String text, required List atUidList, }) { return _channel .invokeMethod( 'createTextAtMessage', _buildParam({ 'text': text, 'atUserList': atUidList, }), ) .then((value) => _toObj(value)); } /// Create picture message Future createImageMessage({required String imagePath}) { return _channel .invokeMethod( 'createImageMessage', _buildParam({'imagePath': imagePath}), ) .then((value) => _toObj(value)); } /// Create picture message Future createImageMessageFromFullPath({required String imagePath}) { return _channel .invokeMethod( 'createImageMessageFromFullPath', _buildParam({'imagePath': imagePath}), ) .then((value) => _toObj(value)); } /// Create sound message Future createSoundMessage({ required String soundPath, required int duration, }) { return _channel .invokeMethod( 'createSoundMessage', _buildParam({'soundPath': soundPath, "duration": duration}), ) .then((value) => _toObj(value)); } /// Create sound message Future createSoundMessageFromFullPath({ required String soundPath, required int duration, }) { return _channel .invokeMethod( 'createSoundMessageFromFullPath', _buildParam({'soundPath': soundPath, "duration": duration}), ) .then((value) => _toObj(value)); } /// Create video message Future createVideoMessage({ required String videoPath, required String videoType, required int duration, required String snapshotPath, }) { return _channel .invokeMethod( 'createVideoMessage', _buildParam({ 'videoPath': videoPath, 'videoType': videoType, 'duration': duration, 'snapshotPath': snapshotPath, })) .then((value) => _toObj(value)); } /// Create video message Future createVideoMessageFromFullPath({ required String videoPath, required String videoType, required int duration, required String snapshotPath, }) { return _channel .invokeMethod( 'createVideoMessageFromFullPath', _buildParam({ 'videoPath': videoPath, 'videoType': videoType, 'duration': duration, 'snapshotPath': snapshotPath, })) .then((value) => _toObj(value)); } /// Create file message Future createFileMessage({ required String filePath, required String fileName, }) { return _channel .invokeMethod( 'createFileMessage', _buildParam({ 'filePath': filePath, 'fileName': fileName, })) .then((value) => _toObj(value)); } /// Create file message Future createFileMessageFromFullPath({ required String filePath, required String fileName, }) { return _channel .invokeMethod( 'createFileMessageFromFullPath', _buildParam({ 'filePath': filePath, 'fileName': fileName, })) .then((value) => _toObj(value)); } /// Create merger message Future createMergerMessage({ required List messageList, required String title, required List summaryList, }) { return _channel .invokeMethod( 'createMergerMessage', _buildParam({ 'messageList': messageList.map((e) => e.toJson()).toList(), 'title': title, 'summaryList': summaryList, })) .then((value) => _toObj(value)); } /// Create forward message Future createForwardMessage({required Message message}) { return _channel .invokeMethod( 'createForwardMessage', _buildParam({ 'message': message.toJson(), })) .then((value) => _toObj(value)); } /// Create location message Future createLocationMessage({ required double latitude, required double longitude, required String description, }) { return _channel .invokeMethod( 'createLocationMessage', _buildParam({ 'latitude': latitude, 'longitude': longitude, 'description': description, })) .then((value) => _toObj(value)); } /// Create custom message Future createCustomMessage({ required String data, required String extension, required String description, }) { return _channel .invokeMethod( 'createCustomMessage', _buildParam({ 'data': data, 'extension': extension, 'description': description, })) .then((value) => _toObj(value)); } /// Create quote message Future createQuoteMessage({ required String text, required Message quoteMsg, }) { return _channel .invokeMethod( 'createQuoteMessage', _buildParam({ 'quoteText': text, 'quoteMessage': quoteMsg.toJson(), })) .then((value) => _toObj(value)); } /// Create card message Future createCardMessage({ required Map data, }) { return _channel .invokeMethod( 'createCardMessage', _buildParam({ 'cardMessage': data, })) .then((value) => _toObj(value)); } /// void forceSyncMsg() { _channel.invokeMethod('forceSyncMsg', _buildParam({})); } static Map _buildParam(Map param) { param["ManagerName"] = "messageManager"; return param; } static List _toList(String value) => (_formatJson(value) as List).map((e) => Message.fromJson(e)).toList(); static Message _toObj(String value) => Message.fromJson(_formatJson(value)); static dynamic _formatJson(value) { return jsonDecode(_printValue(value)); } static String _printValue(value) { return value; } }