This commit is contained in:
hrxiang
2022-05-18 16:47:14 +08:00
parent 952cb82417
commit 7457f182f3
21 changed files with 607 additions and 56 deletions

View File

@@ -130,8 +130,8 @@ class ConversationManager {
// _channel.invokeMethod(
// 'markSingleMessageHasRead', _buildParam({'userID': userID}));
/// Mark group chat messages as read
/// 标记群聊已读
/// Mark group chat all messages as read
/// 标记群聊会话已读
Future<dynamic> markGroupMessageHasRead({
required String groupID,
String? operationID,

View File

@@ -16,6 +16,7 @@ class FriendshipManager {
/// Get friend info by user id
/// 查询好友信息
/// [uidList] 好友的userID集合
Future<List<UserInfo>> getFriendsInfo({
required List<String> uidList,
String? operationID,
@@ -30,7 +31,9 @@ class FriendshipManager {
.then((value) => Utils.toList(value, (v) => UserInfo.fromJson(v)));
/// Send an friend application
/// 发送一个好友请求
/// 发送一个好友请求,需要对方调用同意申请才能成为好友。
/// [uid] 被邀请的用户ID
/// [reason] 说明
Future<dynamic> addFriend({
required String uid,
String? reason,
@@ -92,6 +95,8 @@ class FriendshipManager {
/// Modify friend remark name
/// 设置好友备注
/// [uid] 好友的userID
/// [remark] 好友的备注
Future<dynamic> setFriendRemark({
required String uid,
required String remark,
@@ -107,6 +112,7 @@ class FriendshipManager {
/// Add friends to blacklist
/// 加入黑名单
/// [uid]被加入黑名单的好友ID
Future<dynamic> addBlacklist({
required String uid,
String? operationID,

View File

@@ -74,6 +74,10 @@ class GroupManager {
/// Get the list of group members
/// 分页获取组成员列表
/// [groupId] 群ID
/// [filter] 过滤成员 1普通成员, 2群主3管理员0所有
/// [offset] 开始下标
/// [count] 总数
Future<List<GroupMembersInfo>> getGroupMemberList({
required String groupId,
int filter = 0,
@@ -96,6 +100,10 @@ class GroupManager {
/// Get the list of group members
/// 分页获取组成员列表
/// [groupId] 群ID
/// [filter] 过滤成员 1普通成员, 2群主3管理员0所有
/// [offset] 开始下标
/// [count] 总数
Future<List<dynamic>> getGroupMemberListMap({
required String groupId,
int filter = 0,
@@ -147,6 +155,12 @@ class GroupManager {
/// Create a group
/// 创建一个组
/// [groupName] 群名
/// [notification] 公告
/// [introduction] 群介绍
/// [faceUrl] 群头像
/// [ex] 额外信息
/// [list] 初创群成员以及其角色
Future<GroupInfo> createGroup({
String? groupName,
String? notification,
@@ -177,6 +191,12 @@ class GroupManager {
/// Edit group information
/// 编辑组资料
/// [groupID] 被编辑的群ID
/// [groupName] 新的群名
/// [notification] 新的公告
/// [introduction] 新的群介绍
/// [faceUrl] 新的群头像
/// [ex] 新的额外信息
Future<dynamic> setGroupInfo({
required String groupID,
String? groupName,
@@ -218,7 +238,7 @@ class GroupManager {
(value) => Utils.toList(value, (map) => GroupInfo.fromJson(map)));
/// Apply to join the group
/// 申请加入组,需要通过管理员同意。
/// 申请加入组,需要通过管理员/群组同意。
Future<dynamic> joinGroup({
required String gid,
String? reason,
@@ -260,8 +280,8 @@ class GroupManager {
'operationID': Utils.checkOperationID(operationID),
}));
/// As the group owner or administrator, get the list of received group members' applications to join the group.
/// 作为群主或者管理员,获取收到的群成员申请进群列表。
/// As the group owner or administrator, the group member's application to join the group received
/// 作为群主或者管理员,收到的群成员入群申请
Future<List<GroupApplicationInfo>> getRecvGroupApplicationList(
{String? operationID}) =>
_channel
@@ -288,6 +308,7 @@ class GroupManager {
/// Accept group application
/// 管理员或者群主同意某人进入某群
/// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理
Future<dynamic> acceptGroupApplication({
required String gid,
required String uid,
@@ -305,6 +326,7 @@ class GroupManager {
/// Refuse group application
/// 管理员或者群主拒绝某人进入某群
/// 注:主动申请入群需要通过管理员/群组处理,被别人拉入群不需要管理员/群组处理
Future<dynamic> refuseGroupApplication({
required String gid,
required String uid,
@@ -334,7 +356,9 @@ class GroupManager {
}));
/// Enable group mute
/// 开启群禁言
/// 开启群禁言,所有群成员禁止发言
/// [groupID] 将开启群禁言的组ID
/// [mute] true开启false关闭
Future<dynamic> changeGroupMute({
required String groupID,
required bool mute,
@@ -350,6 +374,9 @@ class GroupManager {
/// Mute group members
/// 禁言群成员
/// [groupID] 群ID
/// [userID] 将被禁言的成员ID
/// [seconds] 被禁言的时间s设置为0则为接触禁言
Future<dynamic> changeGroupMemberMute({
required String groupID,
required String userID,
@@ -367,6 +394,9 @@ class GroupManager {
/// Set group user nickname
/// 设置群成员昵称
/// [groupID] 群ID
/// [userID] 群成员的用户ID
/// [groupNickname] 群昵称
Future<dynamic> setGroupMemberNickname({
required String groupID,
required String userID,

View File

@@ -14,11 +14,14 @@ class IMManager {
// late OfflinePushManager offlinePushManager;
late SignalingManager signalingManager;
late WorkMomentsManager workMomentsManager;
late OrganizationManager organizationManager;
late OnConnectListener _connectListener;
late String uid;
late UserInfo uInfo;
bool isLogined = false;
String? token;
String? _objectStorage;
IMManager(this._channel) {
conversationManager = ConversationManager(_channel);
@@ -29,6 +32,7 @@ class IMManager {
// offlinePushManager = OfflinePushManager(_channel);
signalingManager = SignalingManager(_channel);
workMomentsManager = WorkMomentsManager(_channel);
organizationManager = OrganizationManager(_channel);
_addNativeCallback(_channel);
}
@@ -269,6 +273,13 @@ class IMManager {
workMomentsManager.listener.recvNewNotification();
break;
}
} else if (call.method == ListenerType.organizationListener) {
String type = call.arguments['type'];
switch (type) {
case 'onOrganizationUpdated':
organizationManager.listener.organizationUpdated();
break;
}
}
} catch (err) {
print(
@@ -284,6 +295,8 @@ class IMManager {
/// [apiAddr] api server ip address
/// [wsAddr] webSocket ip address
/// [dataDir] data storage directory
/// [objectStorage] storage object: cos/minio
/// [logLevel] log level: 1-not print
///
/// 初始化SDK
///
@@ -291,6 +304,8 @@ class IMManager {
/// [apiAddr] SDK api地址
/// [wsAddr] SDK websocket地址
/// [dataDir] SDK数据库存储目录
/// [objectStorage] 存储对象 cos/minio
/// [logLevel] 日志 1-不打印
Future<dynamic> initSDK({
required int platform,
required String apiAddr,
@@ -301,7 +316,8 @@ class IMManager {
String objectStorage = 'cos',
String? operationID,
}) {
_connectListener = listener;
this._connectListener = listener;
this._objectStorage = objectStorage;
return _channel.invokeMethod(
'initSDK',
_buildParam(
@@ -324,6 +340,8 @@ class IMManager {
/// Login sdk
/// 登录
/// [uid]用户id
/// [token]登录token从业务服务器上获取
Future<UserInfo> login({
required String uid,
required String token,
@@ -339,6 +357,7 @@ class IMManager {
);
this.isLogined = true;
this.uid = uid;
this.token = token;
this.uInfo = await userManager.getSelfUserInfo();
return uInfo;
}
@@ -352,6 +371,7 @@ class IMManager {
'operationID': Utils.checkOperationID(operationID),
}));
this.isLogined = false;
this.token = null;
return value;
}
@@ -368,12 +388,33 @@ class IMManager {
Future<UserInfo> getLoginUserInfo() async => uInfo;
/// wakeup
/// 从后台回到前台立刻唤醒
Future wakeUp({String? operationID}) => _channel.invokeMethod(
'wakeUp',
_buildParam({
'operationID': Utils.checkOperationID(operationID),
}));
/// upload image to server
/// 上传图片到服务器
/// [path]图片路径
/// [token] im token
/// [objectStorage] 存储对象 cos/minio
Future uploadImage({
required String path,
String? token,
String? objectStorage,
String? operationID,
}) =>
_channel.invokeMethod(
'uploadImage',
_buildParam({
'path': path,
'token': token ?? this.token,
'obj': objectStorage ?? this._objectStorage,
'operationID': Utils.checkOperationID(operationID),
}));
static Map _buildParam(Map param) {
param["ManagerName"] = "imManager";
return param;

View File

@@ -54,10 +54,12 @@ class MessageManager {
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Find all history message
/// 获取聊天记录
/// [userID]接收消息的用户id
/// [conversationID] 会话id查询通知可用
/// [groupID]接收消息的组id
/// 获取聊天记录(以startMsg为节点以前的聊天记录)
/// [userID] 接收消息的用户id
/// [conversationID] 会话id查询通知可用
/// [groupID] 接收消息的组id
/// [startMsg] 从这条消息开始查询[count]条获取的列表index==length-1为最新消息所以获取下一页历史记录startMsg=list.first
/// [count] 一次拉取的总数
Future<List<Message>> getHistoryMessageList({
String? userID,
String? groupID,
@@ -93,7 +95,7 @@ class MessageManager {
})));
/// Delete message
/// 删除消息
/// 删除本地消息
Future deleteMessageFromLocalStorage({
required Message message,
String? operationID,
@@ -110,45 +112,41 @@ class MessageManager {
// _channel.invokeMethod('deleteMessages',
// _buildParam({"msgList": msgList.map((e) => e.toJson()).toList()}));
///
Future insertSingleMessageToLocalStorage({
/// 插入单聊消息到本地
Future<Message> insertSingleMessageToLocalStorage({
String? receiverID,
String? senderID,
Message? message,
String? operationID,
}) =>
_channel.invokeMethod(
'insertSingleMessageToLocalStorage',
_buildParam({
"message": message?.toJson(),
"receiverID": receiverID,
"senderID": senderID,
"operationID": Utils.checkOperationID(operationID),
}));
_channel
.invokeMethod(
'insertSingleMessageToLocalStorage',
_buildParam({
"message": message?.toJson(),
"receiverID": receiverID,
"senderID": senderID,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
///
Future insertGroupMessageToLocalStorage({
/// 插入群聊消息到本地
Future<Message> insertGroupMessageToLocalStorage({
String? groupID,
String? senderID,
Message? message,
String? operationID,
}) =>
_channel.invokeMethod(
'insertGroupMessageToLocalStorage',
_buildParam({
"message": message?.toJson(),
"groupID": groupID,
"senderID": senderID,
"operationID": Utils.checkOperationID(operationID),
}));
/// Query the message according to the message id
// Future findMessages({required List<String> messageIDList}) =>
// _channel.invokeMethod(
// 'findMessages',
// _buildParam({
// "messageIDList": messageIDList,
// }));
_channel
.invokeMethod(
'insertGroupMessageToLocalStorage',
_buildParam({
"message": message?.toJson(),
"groupID": groupID,
"senderID": senderID,
"operationID": Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Mark c2c message as read
/// 标记c2c消息已读
@@ -182,6 +180,7 @@ class MessageManager {
/// Typing
/// 正在输入提示
/// [msgTip] 自定义内容
Future typingStatusUpdate({
required String userID,
String? msgTip,
@@ -212,6 +211,10 @@ class MessageManager {
/// Create @ message
/// 创建@消息
/// [text] 输入内容
/// [atUserIDList] 被@到的userID集合
/// [atUserInfoList] userID跟nickname映射关系用在界面显示时将id替换为nickname
/// [quoteMessage] 引用消息(被回复的消息)
Future<Message> createTextAtMessage({
required String text,
required List<String> atUserIDList,
@@ -250,6 +253,7 @@ class MessageManager {
/// Create picture message
/// 创建图片消息
/// [imagePath] 路径
Future<Message> createImageMessageFromFullPath({
required String imagePath,
String? operationID,
@@ -273,7 +277,7 @@ class MessageManager {
}) =>
_channel
.invokeMethod(
'createSoundMessage',
'createSoundMessage',
_buildParam({
'soundPath': soundPath,
"duration": duration,
@@ -284,6 +288,8 @@ class MessageManager {
/// Create sound message
/// 创建语音消息
/// [soundPath] 路径
/// [duration] 时长s
Future<Message> createSoundMessageFromFullPath({
required String soundPath,
required int duration,
@@ -323,6 +329,10 @@ class MessageManager {
/// Create video message
/// 创建视频消息
/// [videoPath] 路径
/// [videoType] 视频mime类型
/// [duration] 时长s
/// [snapshotPath] 默认站位图路径
Future<Message> createVideoMessageFromFullPath({
required String videoPath,
required String videoType,
@@ -362,6 +372,8 @@ class MessageManager {
/// Create file message
/// 创建文件消息
/// [filePath] 路径
/// [fileName] 文件名
Future<Message> createFileMessageFromFullPath({
required String filePath,
required String fileName,
@@ -379,6 +391,9 @@ class MessageManager {
/// Create merger message
/// 创建合并消息
/// [messageList] 被选中的消息
/// [title] 摘要标题
/// [summaryList] 摘要内容
Future<Message> createMergerMessage({
required List<Message> messageList,
required String title,
@@ -398,6 +413,7 @@ class MessageManager {
/// Create forward message
/// 创建转发消息
/// [message] 被转发的消息
Future<Message> createForwardMessage({
required Message message,
String? operationID,
@@ -414,6 +430,9 @@ class MessageManager {
/// Create location message
/// 创建位置消息
/// [latitude] 纬度
/// [longitude] 经度
/// [description] 自定义描述信息
Future<Message> createLocationMessage({
required double latitude,
required double longitude,
@@ -452,6 +471,8 @@ class MessageManager {
/// Create quote message
/// 创建引用消息
/// [text] 回复的内容
/// [quoteMsg] 被回复的消息
Future<Message> createQuoteMessage({
required String text,
required Message quoteMsg,
@@ -483,9 +504,11 @@ class MessageManager {
.then((value) => Utils.toObj(value, (map) => Message.fromJson(map)));
/// Create custom emoji message
/// [index] The position of the emoji, such as the position emoji
/// [data] Other data, such as url expressions
/// 创建自定义表情消息
/// [index] The position of the emoji, such as the position emoji表情的位置如位置表情
/// [data] Other data, such as url expressions其他数据如url表情
/// [index] 位置表情根据index匹配
/// [data] url表情直接使用url显示
Future<Message> createFaceMessage({
int index = -1,
String? data,
@@ -571,7 +594,7 @@ class MessageManager {
Utils.toObj(value, (map) => SearchResult.fromJson(map)));
/// Delete message from local and service
/// 删除消息
/// 删除本地跟服务器的指定的消息
Future<dynamic> deleteMessageFromLocalAndSvr({
required Message message,
String? operationID,
@@ -584,7 +607,7 @@ class MessageManager {
})));
/// Delete all message from local
/// 删除所有消息
/// 删除本地所有聊天记录
Future<dynamic> deleteAllMsgFromLocal({
String? operationID,
}) =>
@@ -595,7 +618,7 @@ class MessageManager {
}));
/// Delete all message from service
/// 删除所有消息
/// 删除本地跟服务器所有聊天记录
Future<dynamic> deleteAllMsgFromLocalAndSvr({
String? operationID,
}) =>
@@ -607,6 +630,8 @@ class MessageManager {
/// Mark conversation message as read
/// 标记消息已读
/// [conversationID] 会话ID
/// [messageIDList] 被标记的消息clientMsgID
Future markMessageAsReadByConID({
required String conversationID,
required List<String> messageIDList,
@@ -621,7 +646,7 @@ class MessageManager {
}));
/// Clear all c2c history message
/// 清空单聊消息记录
/// 删除本地跟服务器的单聊聊天记录
Future<dynamic> clearC2CHistoryMessageFromLocalAndSvr({
required String uid,
String? operationID,
@@ -634,7 +659,7 @@ class MessageManager {
}));
/// Clear all group history
/// 清空组消息记录
/// 删除本地跟服务器的群聊天记录
Future<dynamic> clearGroupHistoryMessageFromLocalAndSvr({
required String gid,
String? operationID,
@@ -647,10 +672,12 @@ class MessageManager {
}));
/// Find all history message
/// 获取聊天记录
/// [userID]接收消息的用户id
/// [conversationID] 会话id
/// [groupID]接收消息的组id
/// 获取聊天记录(以startMsg为节点新收到的聊天记录),用在全局搜索定位某一条消息,然后此条消息后新增的消息
/// [userID] 接收消息的用户id
/// [conversationID] 会话id,查询通知时可用
/// [groupID] 接收消息的组id
/// [startMsg] 从这条消息开始查询[count]条获取的列表index==length-1为最新消息所以获取下一页历史记录startMsg=list.last
/// [count] 一次拉取的总数
Future<List<Message>> getHistoryMessageListReverse({
String? userID,
String? groupID,

View File

@@ -0,0 +1,98 @@
import 'package:flutter/services.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
class OrganizationManager {
MethodChannel _channel;
late OnOrganizationListener listener;
OrganizationManager(this._channel);
/// Observe organization info changes
/// 组织架构发生变化回调
Future setOrganizationListener(OnOrganizationListener listener) {
this.listener = listener;
return _channel.invokeMethod('setOrganizationListener', _buildParam({}));
}
/// Query sub department
/// 获取子部门列表
Future<List<DeptInfo>> getSubDept({
required String departmentID,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'getSubDepartment',
_buildParam({
'departmentID': departmentID,
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => DeptInfo.fromJson(v)));
/// Get member under a department
/// 获取部门下的成员列表
Future<List<DeptMemberInfo>> getDeptMember({
required String departmentID,
int offset = 0,
int count = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'getDepartmentMember',
_buildParam({
'departmentID': departmentID,
'offset': offset,
'count': count,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) =>
Utils.toList(value, (v) => DeptMemberInfo.fromJson(v)));
/// Get member's department
/// 获取成员所在的部门
Future<List<UserInDept>> getUserInDept({
required String userID,
String? operationID,
}) =>
_channel
.invokeMethod(
'getUserInDepartment',
_buildParam({
'userID': userID,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => UserInDept.fromJson(v)));
/// Get the sub-departments and employees under the department
/// 获取部门下的子部门跟员工
Future<List<UserInDept>> getDeptMemberAndSubDept({
required String departmentID,
int departmentOffset = 0,
int departmentCount = 40,
int memberOffset = 0,
int memberCount = 40,
String? operationID,
}) =>
_channel
.invokeMethod(
'getDepartmentMemberAndSubDepartment',
_buildParam({
'departmentID': departmentID,
'departmentOffset': departmentOffset,
'departmentCount': departmentCount,
'memberOffset': memberOffset,
'memberCount': memberCount,
'operationID': Utils.checkOperationID(operationID),
}))
.then((value) => Utils.toList(value, (v) => UserInDept.fromJson(v)));
static Map _buildParam(Map param) {
param["ManagerName"] = "organizationManager";
return param;
}
}