Files
featherVoice/TUIKit/TUIContact/UI_Classic/Service/TUIContactObjectFactory.m
2025-08-08 10:49:36 +08:00

283 lines
16 KiB
Objective-C

//
// TUIContactObjectFactory.m
// TUIContact
//
// Created by wyl on 2023/3/29.
// Copyright © 2023 Tencent. All rights reserved.
//
#import "TUIContactObjectFactory.h"
#import <TUICore/TUIThemeManager.h>
#import "TUIContactController.h"
#import "TUIContactSelectController.h"
#import "TUIFriendProfileController.h"
#import "TUIGroupCreateController.h"
#import "TUIUserProfileController.h"
#import "TUIGroupMemberController.h"
#import <TIMCommon/TIMDefine.h>
#import <TUICore/NSDictionary+TUISafe.h>
#import <TUICore/TUIGlobalization.h>
#import <TUICore/TUIThemeManager.h>
#import "TUIGroupRequestViewController.h"
#import "TUISelectGroupMemberViewController.h"
@interface TUIContactObjectFactory () <TUIObjectProtocol>
@end
@implementation TUIContactObjectFactory
+ (void)load {
[TUICore registerObjectFactory:TUICore_TUIContactObjectFactory objectFactory:[TUIContactObjectFactory shareInstance]];
}
+ (TUIContactObjectFactory *)shareInstance {
static dispatch_once_t onceToken;
static TUIContactObjectFactory *g_sharedInstance = nil;
dispatch_once(&onceToken, ^{
g_sharedInstance = [[TUIContactObjectFactory alloc] init];
});
return g_sharedInstance;
}
#pragma mark - TUIObjectProtocol
- (id)onCreateObject:(NSString *)method param:(nullable NSDictionary *)param {
if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetContactControllerMethod]) {
return [self createContactController];
} else if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod]) {
NSString *title = [param objectForKey:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_TitleKey];
NSArray *sourceIds = [param objectForKey:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_SourceIdsKey];
NSArray *disableIds = [param objectForKey:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_DisableIdsKey];
NSDictionary *displayNames = [param objectForKey:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_DisplayNamesKey];
NSNumber *maxSelectCount = [param objectForKey:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_MaxSelectCount];
void (^completion)(NSArray<TUICommonContactSelectCellData *> *) =
[param objectForKey:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_CompletionKey];
return [self createContactSelectController:sourceIds
disableIds:disableIds
title:title
displayNames:displayNames
maxSelectCount:[maxSelectCount intValue]
completion:completion];
} else if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetFriendProfileControllerMethod]) {
V2TIMFriendInfo *friendInfo = [param objectForKey:TUICore_TUIContactObjectFactory_GetFriendProfileControllerMethod_FriendProfileKey];
return [self createFriendProfileController:friendInfo];
} else if ([method isEqualToString:TUICore_TUIContactObjectFactory_UserProfileController_Classic]) {
V2TIMUserFullInfo *userInfo = [param objectForKey:TUICore_TUIContactObjectFactory_UserProfileController_UserProfile];
TUICommonCellData *cellData = [param objectForKey:TUICore_TUIContactObjectFactory_UserProfileController_PendencyData];
ProfileControllerAction action =
(ProfileControllerAction)([[param objectForKey:TUICore_TUIContactObjectFactory_UserProfileController_ActionType] unsignedIntegerValue]);
return [self createUserProfileController:userInfo pendencyData:cellData actionType:action];
} else if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod]) {
NSString *title = [param tui_objectForKey:TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_TitleKey asClass:NSString.class];
NSString *groupName = [param tui_objectForKey:TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_GroupNameKey asClass:NSString.class];
NSString *groupType = [param tui_objectForKey:TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_GroupTypeKey asClass:NSString.class];
NSArray *contactList = [param tui_objectForKey:TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_ContactListKey asClass:NSArray.class];
void (^completion)(BOOL, V2TIMGroupInfo *) = [param objectForKey:TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_CompletionKey];
return [self createGroupCreateController:title groupName:groupName groupType:groupType contactList:contactList completion:completion];
} else if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod]) {
NSString *userID = [param objectForKey:TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_UserIDKey];
void (^succ)(UIViewController *vc) = [param objectForKey:TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_SuccKey];
V2TIMFail fail = [param objectForKey:TUICore_TUIContactObjectFactory_GetUserOrFriendProfileVCMethod_FailKey];
[self createUserOrFriendProfileVCWithUserID:userID succBlock:succ failBlock:fail];
}
else if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetGroupMemberVCMethod]) {
NSString *groupId = [param objectForKey:@"groupID"];
V2TIMGroupInfo *groupInfo = [param objectForKey:@"groupInfo"];
TUIGroupMemberController *membersController = [[TUIGroupMemberController alloc] init];
membersController.groupId = groupId;
membersController.groupInfo = groupInfo;
return membersController;
}
else if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetGroupRequestViewControllerMethod]) {
return [self createGroupRequestViewController:[param tui_objectForKey:TUICore_TUIContactObjectFactory_GetGroupRequestViewControllerMethod_GroupInfoKey
asClass:V2TIMGroupInfo.class]];
} else if ([method isEqualToString:TUICore_TUIContactObjectFactory_GetGroupInfoVC_Classic]) {
return [self createGroupInfoController:[param tui_objectForKey:TUICore_TUIContactObjectFactory_GetGroupInfoVC_GroupID asClass:NSString.class]];
} else if ([method isEqualToString:TUICore_TUIContactObjectFactory_SelectGroupMemberVC_Classic]) {
NSString *groupID = [param tui_objectForKey:TUICore_TUIContactObjectFactory_SelectGroupMemberVC_GroupID asClass:NSString.class];
NSString *title = [param tui_objectForKey:TUICore_TUIContactObjectFactory_SelectGroupMemberVC_Name asClass:NSString.class];
NSNumber *optionalStyleNum = [param tui_objectForKey:TUICore_TUIContactObjectFactory_SelectGroupMemberVC_OptionalStyle asClass:NSNumber.class];
NSArray *selectedUserIDList = [param tui_objectForKey:TUICore_TUIContactObjectFactory_SelectGroupMemberVC_SelectedUserIDList asClass:NSArray.class];
return [self createSelectGroupMemberViewController:groupID
name:title
optionalStyle:[optionalStyleNum integerValue]
selectedUserIDList:selectedUserIDList
userData:@""];
}
return nil;
}
- (UIViewController *)createContactController {
return [[TUIContactController alloc] init];
}
- (UIViewController *)createContactSelectController:(NSArray *)sourceIds
disableIds:(NSArray *)disableIds
title:(NSString *)title
displayNames:(NSDictionary *)displayNames
maxSelectCount:(int)maxSelectCount
completion:(void (^)(NSArray<TUICommonContactSelectCellData *> *selectArray))completion {
TUIContactSelectController *vc = [[TUIContactSelectController alloc] init];
vc.title = title;
vc.displayNames = displayNames;
vc.maxSelectCount = maxSelectCount;
if (sourceIds.count > 0) {
vc.sourceIds = sourceIds;
} else if (disableIds.count > 0) {
vc.viewModel.disableFilter = ^BOOL(TUICommonContactSelectCellData *data) {
for (NSString *identifier in disableIds) {
if ([identifier isEqualToString:data.identifier]) {
return YES;
}
}
return NO;
};
}
vc.finishBlock = ^(NSArray<TUICommonContactSelectCellData *> *_Nonnull selectArray) {
if (completion) {
completion(selectArray);
}
};
return vc;
}
- (UIViewController *)createFriendProfileController:(V2TIMFriendInfo *)friendInfo {
TUIFriendProfileController *vc = [[TUIFriendProfileController alloc] init];
vc.friendProfile = friendInfo;
return vc;
}
- (UIViewController *)createUserProfileController:(V2TIMUserFullInfo *)user actionType:(ProfileControllerAction)actionType {
TUIUserProfileController *vc = [[TUIUserProfileController alloc] init];
vc.userFullInfo = user;
vc.actionType = actionType;
return vc;
}
- (UIViewController *)createUserProfileController:(V2TIMUserFullInfo *)user
pendencyData:(TUICommonCellData *)data
actionType:(ProfileControllerAction)actionType {
TUIUserProfileController *vc = [[TUIUserProfileController alloc] init];
vc.userFullInfo = user;
vc.actionType = actionType;
if (actionType == PCA_GROUP_CONFIRM) {
if ([data isKindOfClass:[TUIGroupPendencyCellData class]]) {
vc.groupPendency = (TUIGroupPendencyCellData *)data;
}
} else if (actionType == PCA_PENDENDY_CONFIRM) {
vc.pendency = (TUICommonPendencyCellData *)data;
}
return vc;
}
- (UIViewController *)createGroupCreateController:(NSString *)title
groupName:(NSString *)groupName
groupType:(NSString *)groupType
contactList:(NSArray<TUICommonContactSelectCellData *> *)contactList
completion:(void (^)(BOOL isSuccess, V2TIMGroupInfo *_Nonnull info))completion {
TUIGroupCreateController *vc = [[TUIGroupCreateController alloc] init];
vc.title = @"";
V2TIMGroupInfo *createGroupInfo = [[V2TIMGroupInfo alloc] init];
createGroupInfo.groupID = @"";
createGroupInfo.groupName = groupName;
createGroupInfo.groupType = groupType;
vc.createGroupInfo = createGroupInfo;
vc.createContactArray = [NSArray arrayWithArray:contactList];
vc.submitCallback = ^(BOOL isSuccess, V2TIMGroupInfo *_Nonnull info) {
if (completion) {
completion(isSuccess, info);
}
};
return vc;
}
- (void)createUserOrFriendProfileVCWithUserID:(NSString *)userID succBlock:(void (^)(UIViewController *vc))succ failBlock:(nullable V2TIMFail)fail {
if (userID.length == 0) {
if (fail) {
fail(-1, @"invalid parameter, userID is nil");
}
return;
}
@weakify(self);
[[V2TIMManager sharedInstance] getFriendsInfo:@[ userID ]
succ:^(NSArray<V2TIMFriendInfoResult *> *resultList) {
@strongify(self);
V2TIMFriendInfoResult *friend = resultList.firstObject;
if (friend.relation & V2TIM_FRIEND_RELATION_TYPE_IN_MY_FRIEND_LIST) {
if (friend.friendInfo == nil) {
if (fail) {
fail(-1, @"invalid parameter, friend info is nil");
}
return;
}
UIViewController *vc = [self createFriendProfileController:friend.friendInfo];
if (succ) {
succ(vc);
}
} else {
[[V2TIMManager sharedInstance]
getUsersInfo:@[ userID ]
succ:^(NSArray<V2TIMUserFullInfo *> *infoList) {
V2TIMUserFullInfo *user = infoList.firstObject;
if (user == nil) {
if (fail) {
fail(-1, @"invalid parameter, user info is nil");
return;
}
}
NSUInteger actionType =
[user.userID isEqualToString:[[V2TIMManager sharedInstance] getLoginUser]] ? 0 : 1;
UIViewController *vc = [self createUserProfileController:user actionType:actionType];
if (succ) {
succ(vc);
}
}
fail:fail];
}
}
fail:fail];
}
#pragma mark - TUIObjectProtocol - groupInfo
- (UIViewController *)createGroupRequestViewController:(V2TIMGroupInfo *)groupInfo {
TUIGroupRequestViewController *vc = [[TUIGroupRequestViewController alloc] init];
vc.groupInfo = groupInfo;
return vc;
}
- (UIViewController *)createGroupInfoController:(NSString *)groupID {
return nil;
}
- (UIViewController *)createSelectGroupMemberViewController:(NSString *)groupID
name:(NSString *)name
optionalStyle:(TUISelectMemberOptionalStyle)optionalStyle {
return [self createSelectGroupMemberViewController:groupID name:name optionalStyle:optionalStyle selectedUserIDList:@[]];
}
- (UIViewController *)createSelectGroupMemberViewController:(NSString *)groupID
name:(NSString *)name
optionalStyle:(TUISelectMemberOptionalStyle)optionalStyle
selectedUserIDList:(NSArray *)userIDList {
return [self createSelectGroupMemberViewController:groupID name:name optionalStyle:optionalStyle selectedUserIDList:@[] userData:@""];
}
- (UIViewController *)createSelectGroupMemberViewController:(NSString *)groupID
name:(NSString *)name
optionalStyle:(TUISelectMemberOptionalStyle)optionalStyle
selectedUserIDList:(NSArray *)userIDList
userData:(NSString *)userData {
TUISelectGroupMemberViewController *vc = [[TUISelectGroupMemberViewController alloc] init];
vc.groupId = groupID;
vc.name = name;
vc.optionalStyle = optionalStyle;
vc.selectedUserIDList = userIDList;
vc.userData = userData;
return vc;
}
@end