// // TUIContactExtensionObserver.m // TUIContact // // Created by harvy on 2023/3/29. // Copyright © 2023 Tencent. All rights reserved. // #import "TUIContactExtensionObserver.h" #import #import #import "TUIGroupManageController.h" #import "TUIGroupMemberController.h" #import "TUIGroupMembersCell.h" #import "TUISelectGroupMemberViewController.h" @interface TUIContactExtensionObserver () //TUICore_TUIChatExtension_GroupProfileMemberListExtension_ClassicExtensionID //pargm start @property(nonatomic, assign) NSInteger tag; @property(nonatomic,strong) UINavigationController *pushVC; @property(nonatomic,copy) NSString *groupId; @property(nonatomic, strong) UIViewController *showContactSelectVC; @property(nonatomic, strong) NSMutableArray *membersData; @property(nonatomic, strong) TUIGroupMembersCellData *groupMembersCellData; //pargm end @end @implementation TUIContactExtensionObserver + (void)load { [TUICore registerExtension:TUICore_TUIChatExtension_NavigationMoreItem_ClassicExtensionID object:TUIContactExtensionObserver.shareInstance]; [TUICore registerExtension:TUICore_TUIChatExtension_GroupProfileMemberListExtension_ClassicExtensionID object:TUIContactExtensionObserver.shareInstance]; [TUICore registerExtension:TUICore_TUIChatExtension_GroupProfileSettingsItemExtension_ClassicExtensionID object:TUIContactExtensionObserver.shareInstance]; [TUICore registerExtension:TUICore_TUIChatExtension_GroupProfileBottomItemExtension_ClassicExtensionID object:TUIContactExtensionObserver.shareInstance]; } + (instancetype)shareInstance { static dispatch_once_t onceToken; static id instance = nil; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } #pragma mark - TUIExtensionProtocol - (BOOL)onRaiseExtension:(NSString *)extensionID parentView:(UIView *)parentView param:(nullable NSDictionary *)param { if ([extensionID isEqualToString:TUICore_TUIChatExtension_GroupProfileMemberListExtension_ClassicExtensionID]) { TUIGroupMembersCellData * data = [param objectForKey:@"data"]; self.groupId = [param objectForKey:@"groupID"]; self.pushVC = [param tui_objectForKey:@"pushVC" asClass:UINavigationController.class]; self.membersData = [param tui_objectForKey:@"membersData" asClass:NSMutableArray.class]; self.groupMembersCellData = [param tui_objectForKey:@"groupMembersCellData" asClass:TUIGroupMembersCellData.class]; if (![parentView isKindOfClass:UIView.class]) { return NO; } TUIGroupMembersCell *cell = [[TUIGroupMembersCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; [parentView addSubview:cell]; parentView.userInteractionEnabled = YES; [cell mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(parentView); }]; cell.backgroundColor = TUIChatDynamicColor(@"chat_pop_menu_bg_color", @"#FFFFFF"); [cell setData:data]; cell.delegate = (id)self; return YES; } return NO; } - (NSArray *)onGetExtension:(NSString *)extensionID param:(NSDictionary *)param { if (![extensionID isKindOfClass:NSString.class]) { return nil; } if ([extensionID isEqualToString:TUICore_TUIChatExtension_NavigationMoreItem_ClassicExtensionID]) { return [self getNavigationMoreItemExtensionForClassicChat:param]; } else if ([extensionID isEqualToString:TUICore_TUIChatExtension_GroupProfileSettingsItemExtension_ClassicExtensionID]) { return [self getGroupProfileSettingsItemExtensionForClassicChat:param]; } else if ([extensionID isEqualToString:TUICore_TUIChatExtension_GroupProfileBottomItemExtension_ClassicExtensionID]) { return [self getGroupProfileBottomItemExtensionForClassicChat:param]; } else { return nil; } } - (NSArray *)getNavigationMoreItemExtensionForClassicChat:(NSDictionary *)param { if (![param isKindOfClass:NSDictionary.class]) { return nil; } NSString *userID = [param tui_objectForKey:TUICore_TUIChatExtension_NavigationMoreItem_UserID asClass:NSString.class]; if (userID.length > 0) { TUIExtensionInfo *info = [[TUIExtensionInfo alloc] init]; info.icon = TIMCommonBundleThemeImage(@"chat_nav_more_menu_img", @"chat_nav_more_menu"); info.weight = 100; info.onClicked = ^(NSDictionary *_Nonnull param) { UINavigationController *pushVC = [param tui_objectForKey:TUICore_TUIChatExtension_NavigationMoreItem_PushVC asClass:UINavigationController.class]; if (pushVC) { NSDictionary *param = @{TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_UserIDKey : userID ?: @"", TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_SuccKey : ^(UIViewController *vc){ [pushVC pushViewController:vc animated:YES]; } , TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_FailKey : ^(int code, NSString *desc) { } }; [TUICore createObject:TUICore_TUIContactObjectFactory key:TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod param:param]; } }; return @[ info ]; } else { return nil; } } - (NSArray *)getGroupProfileSettingsItemExtensionForClassicChat:(NSDictionary *)param { if (![param isKindOfClass:NSDictionary.class]) { return nil; } NSString *groupID = [param tui_objectForKey:@"groupID" asClass:NSString.class]; if (groupID.length > 0) { UINavigationController *pushVC = [param tui_objectForKey:@"pushVC" asClass:UINavigationController.class]; TUIExtensionInfo *info = [[TUIExtensionInfo alloc] init]; info.icon = nil; info.weight = 100; info.text = TIMCommonLocalizableString(TUIKitGroupProfileManage); info.onClicked = ^(NSDictionary *_Nonnull clickParam) { if (pushVC) { TUIGroupManageController *vc = [[TUIGroupManageController alloc] init]; vc.groupID = groupID; [pushVC pushViewController:vc animated:YES]; } }; return @[ info ]; } return nil; } - (NSArray *)getGroupProfileBottomItemExtensionForClassicChat:(NSDictionary *)param { if (![param isKindOfClass:NSDictionary.class]) { return nil; } NSString *groupID = [param tui_objectForKey:@"groupID" asClass:NSString.class]; if (groupID.length > 0) { void (^updateGroupInfoCallback)(void) = param[@"updateGroupInfoCallback"]; UINavigationController *pushVC = [param tui_objectForKey:@"pushVC" asClass:UINavigationController.class]; TUIExtensionInfo *info = [[TUIExtensionInfo alloc] init]; info.icon = nil; info.weight = 100; info.text = TIMCommonLocalizableString(TUIKitGroupTransferOwner); info.onClicked = ^(NSDictionary *_Nonnull clickparam) { TUISelectGroupMemberViewController *vc = [[TUISelectGroupMemberViewController alloc] init]; vc.optionalStyle = TUISelectMemberOptionalStyleTransferOwner; vc.groupId = groupID; vc.name = TIMCommonLocalizableString(TUIKitGroupTransferOwner); @weakify(self); vc.selectedFinished = ^(NSMutableArray *_Nonnull modelList) { @strongify(self); TUIUserModel *userModel = modelList[0]; NSString *groupId = groupID; NSString *member = userModel.userId; if (userModel && [userModel isKindOfClass:[TUIUserModel class]]) { @weakify(self); [self transferGroupOwner:groupId member:member succ:^{ @strongify(self); if (updateGroupInfoCallback) { updateGroupInfoCallback(); } [TUITool makeToast:TIMCommonLocalizableString(TUIKitGroupTransferOwnerSuccess)]; } fail:^(int code, NSString *desc) { [TUITool makeToastError:code msg:desc]; }]; } }; [pushVC pushViewController:vc animated:YES]; }; return @[ info ]; } return nil; } - (void)transferGroupOwner:(NSString *)groupID member:(NSString *)userID succ:(V2TIMSucc)succ fail:(V2TIMFail)fail { [V2TIMManager.sharedInstance transferGroupOwner:groupID member:userID succ:^{ succ(); } fail:^(int code, NSString *desc) { fail(code, desc); }]; } #pragma TUIGroupMembersCellDelegate - (void)groupMembersCell:(TUIGroupMembersCell *)cell didSelectItemAtIndex:(NSInteger)index { TUIGroupMemberCellData *mem = self.groupMembersCellData.members[index]; NSMutableArray *ids = [NSMutableArray array]; NSMutableDictionary *displayNames = [NSMutableDictionary dictionary]; for (TUIGroupMemberCellData *cd in self.membersData) { if (![cd.identifier isEqualToString:[[V2TIMManager sharedInstance] getLoginUser]]) { [ids addObject:cd.identifier]; [displayNames setObject:cd.name ?: @"" forKey:cd.identifier ?: @""]; } } @weakify(self); void (^selectContactCompletion)(NSArray *) = ^(NSArray *array) { @strongify(self); if (self.tag == 1) { // add NSMutableArray *list = @[].mutableCopy; for (TUICommonContactSelectCellData *data in array) { [list addObject:data.identifier]; } [self.pushVC popViewControllerAnimated:YES]; [self addGroupId:self.groupId memebers:list]; } else if (self.tag == 2) { // delete NSMutableArray *list = @[].mutableCopy; for (TUICommonContactSelectCellData *data in array) { [list addObject:data.identifier]; } [self.pushVC popViewControllerAnimated:YES]; [self deleteGroupId:self.groupId memebers:list]; } }; self.tag = mem.tag; if (self.tag == 1) { // add NSMutableDictionary *param = [NSMutableDictionary dictionary]; param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_TitleKey] = TIMCommonLocalizableString(GroupAddFirend); param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_DisableIdsKey] = ids; param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_DisplayNamesKey] = displayNames; param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_CompletionKey] = selectContactCompletion; self.showContactSelectVC = [TUICore createObject:TUICore_TUIContactObjectFactory key:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod param:param]; [self.pushVC pushViewController:self.showContactSelectVC animated:YES]; } else if (self.tag == 2) { // delete NSMutableDictionary *param = [NSMutableDictionary dictionary]; param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_TitleKey] = TIMCommonLocalizableString(GroupDeleteFriend); param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_SourceIdsKey] = ids; param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_DisplayNamesKey] = displayNames; param[TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_CompletionKey] = selectContactCompletion; self.showContactSelectVC = [TUICore createObject:TUICore_TUIContactObjectFactory key:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod param:param]; [self.pushVC pushViewController:self.showContactSelectVC animated:YES]; } else { [self didCurrentMemberAtCellData:mem]; } } - (void)didCurrentMemberAtCellData:(TUIGroupMemberCellData *)mem { NSString *userID = mem.identifier; @weakify(self); [self getUserOrFriendProfileVCWithUserID:userID succBlock:^(UIViewController *vc) { @strongify(self); [self.pushVC pushViewController:vc animated:YES]; } failBlock:^(int code, NSString *desc){ }]; } - (void)getUserOrFriendProfileVCWithUserID:(NSString *)userID succBlock:(void (^)(UIViewController *vc))succ failBlock:(nullable V2TIMFail)fail { NSDictionary *param = @{ TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_UserIDKey: userID ? : @"", TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_SuccKey: succ ? : ^(UIViewController *vc){}, TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_FailKey: fail ? : ^(int code, NSString * desc){} }; [TUICore createObject:TUICore_TUIContactObjectFactory key:TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod param:param]; } - (void)addGroupId:(NSString *)groupId memebers:(NSArray *)members { @weakify(self); [[V2TIMManager sharedInstance] inviteUserToGroup:_groupId userList:members succ:^(NSArray *resultList) { @strongify(self); // [self updateData]; [TUITool makeToast:TIMCommonLocalizableString(add_success)]; } fail:^(int code, NSString *desc) { [TUITool makeToastError:code msg:desc]; }]; } - (void)deleteGroupId:(NSString *)groupId memebers:(NSArray *)members { @weakify(self); [[V2TIMManager sharedInstance] kickGroupMember:groupId memberList:members reason:@"" succ:^(NSArray *resultList) { @strongify(self); // [self updateData]; [TUITool makeToast:TIMCommonLocalizableString(delete_success)]; } fail:^(int code, NSString *desc) { [TUITool makeToastError:code msg:desc]; }]; } @end