149 lines
4.7 KiB
Dart
149 lines
4.7 KiB
Dart
import 'package:get/get.dart';
|
||
import 'package:loopin/IM/controller/im_user_info_controller.dart';
|
||
import 'package:loopin/IM/im_service.dart';
|
||
import 'package:loopin/components/my_toast.dart';
|
||
import 'package:tencent_cloud_chat_sdk/enum/group_member_filter_enum.dart';
|
||
import 'package:tencent_cloud_chat_sdk/enum/group_type.dart';
|
||
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_info.dart';
|
||
import 'package:tencent_cloud_chat_sdk/models/v2_tim_group_member_full_info.dart';
|
||
|
||
class GroupDetailController extends GetxController {
|
||
// 群ID
|
||
final String groupID;
|
||
GroupDetailController({required this.groupID});
|
||
// 群资料
|
||
Rxn<V2TimGroupInfo> info = Rxn<V2TimGroupInfo>();
|
||
// 群成员列表
|
||
RxList<V2TimGroupMemberFullInfo> memberList = <V2TimGroupMemberFullInfo>[].obs;
|
||
// 自己在群里的信息
|
||
Rxn<V2TimGroupMemberFullInfo> selfInfo = Rxn<V2TimGroupMemberFullInfo>();
|
||
// 是否是群主
|
||
RxBool isOwner = false.obs;
|
||
|
||
Future<void> init() async {
|
||
await getSelfInfo();
|
||
await getGroupData();
|
||
await getMemberData(); // 最后在拉取成员信息
|
||
canRemoveMembers();
|
||
}
|
||
|
||
// 修改群资料
|
||
Future<void> setGroupInfo({required V2TimGroupInfo changedInfo}) async {
|
||
if (isOwner.value && info.value != null) {
|
||
final res = await ImService.instance.setGroupInfo(info: changedInfo);
|
||
if (!res.success) {
|
||
// 修改失败重新获取info
|
||
MyToast().tip(title: '请稍后再试');
|
||
getGroupData();
|
||
} else {
|
||
// info.value?.faceUrl = changedInfo.faceUrl;
|
||
final current = info.value!;
|
||
if (changedInfo.faceUrl != null) current.faceUrl = changedInfo.faceUrl;
|
||
if (changedInfo.groupName != null) current.groupName = changedInfo.groupName;
|
||
if (changedInfo.introduction != null) current.introduction = changedInfo.introduction;
|
||
if (changedInfo.notification != null) current.notification = changedInfo.notification;
|
||
info.refresh();
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取群资料
|
||
Future<void> getGroupData() async {
|
||
final res = await ImService.instance.getGroupsInfo(groupIDList: [groupID]);
|
||
if (res.success && res.data != null) {
|
||
info.value = res.data!.first.groupInfo ?? V2TimGroupInfo(groupID: groupID, groupType: GroupType.Work);
|
||
}
|
||
}
|
||
|
||
//群成员(这里非群主拿14个,群住拿13个)
|
||
Future<void> getMemberData() async {
|
||
final res = await ImService.instance.getGroupMemberList(
|
||
groupID: groupID,
|
||
filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ALL,
|
||
nextSeq: "0",
|
||
count: isOwner.value ? 13 : 14,
|
||
);
|
||
if (res.success && res.data != null) {
|
||
memberList.value = res.data!.memberInfoList ?? [];
|
||
}
|
||
}
|
||
|
||
// 自己的群资料
|
||
Future<void> getSelfInfo() async {
|
||
final selfID = Get.find<ImUserInfoController>().userID.value;
|
||
final res = await ImService.instance.getGroupMembersInfo(
|
||
groupID: groupID,
|
||
memberList: [selfID],
|
||
);
|
||
if (res.success && res.data != null) {
|
||
selfInfo.value = res.data!.first;
|
||
}
|
||
}
|
||
|
||
// 设置自己的群资料
|
||
Future<void> setSelfInfo({required String nameCard}) async {
|
||
final res = await ImService.instance.setGroupMemberInfo(
|
||
groupID: groupID,
|
||
userID: selfInfo.value?.userID ?? '',
|
||
nameCard: nameCard,
|
||
);
|
||
if (!res.success) {
|
||
MyToast().tip(title: '设置失败', position: 'top');
|
||
} else {
|
||
selfInfo.value?.nameCard = nameCard;
|
||
selfInfo.refresh();
|
||
}
|
||
}
|
||
|
||
// 邀请进群 inviteUserToGroup
|
||
Future<void> inviteUserToGroup({required List<String> userList}) async {
|
||
final res = await ImService.instance.inviteUserToGroup(
|
||
groupID: groupID,
|
||
userList: userList,
|
||
);
|
||
if (res.success && res.data != null) {
|
||
refresh();
|
||
}
|
||
}
|
||
|
||
// 退出群聊
|
||
Future<void> quitGroup() async {
|
||
final res = await ImService.instance.quitGroup(
|
||
groupID: groupID,
|
||
);
|
||
if (res.success) {
|
||
refresh();
|
||
}
|
||
}
|
||
|
||
// 踢人 inviteUserToGroup
|
||
Future<void> kickGroupMember(List<String> userIDs) async {
|
||
await ImService.instance.kickGroupMember(
|
||
groupID: groupID,
|
||
memberList: userIDs,
|
||
);
|
||
}
|
||
|
||
// 踢人权限
|
||
void canRemoveMembers() {
|
||
final owner = info.value?.owner;
|
||
final myID = selfInfo.value?.userID;
|
||
final myRole = selfInfo.value?.role;
|
||
|
||
if (owner == null || myID == null || myRole == null) {
|
||
isOwner.value = false;
|
||
} else if (owner == myID) {
|
||
isOwner.value = true;
|
||
} else if ([300, 400].contains(myRole)) {
|
||
isOwner.value = true;
|
||
} else {
|
||
isOwner.value = false;
|
||
}
|
||
// role=200普通 300管理 400群主
|
||
// if (owner == myID) result = true;
|
||
// if ([300, 400].contains(myRole)) result = true;
|
||
// isOwner
|
||
// return false;
|
||
}
|
||
}
|