123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592 |
- //
- // NTESNormalTeamCardViewController.m
- // NIM
- //
- // Created by chris on 15/3/10.
- // Copyright (c) 2015年 Netease. All rights reserved.
- //
- #import <NIMSDK/NIMSDK.h>
- #import "NIMNormalTeamCardViewController.h"
- #import "NIMCardMemberItem.h"
- #import "NIMTeamCardOperationItem.h"
- #import "NIMKitDependency.h"
- #import "NIMTeamCardRowItem.h"
- #import "NIMTeamCardHeaderCell.h"
- #import "NIMTeamMemberCardViewController.h"
- #import "NIMUsrInfoData.h"
- #import "UIView+NIM.h"
- #import "NIMMemberGroupView.h"
- #import "NIMKitColorButtonCell.h"
- #import "NIMTeamSwitchTableViewCell.h"
- #import "NIMContactSelectConfig.h"
- #import "NIMContactSelectViewController.h"
- #import "NIMGlobalMacro.h"
- #import "NIMKitProgressHUD.h"
- #define TableCellReuseId @"tableCell"
- #define TableButtonCellReuseId @"tableButtonCell"
- #define TableSwitchReuseId @"tableSwitchReuseId"
- #define TableSepTag 10001
- @interface NIMNormalTeamCardViewController ()<NIMTeamManagerDelegate, NIMTeamMemberCardActionDelegate,UITableViewDataSource,UITableViewDelegate,NIMTeamSwitchProtocol,NIMContactSelectDelegate,NIMMemberGroupViewDelegate>{
- UIAlertView *_updateTeamNameAlertView;
- UIAlertView *_quitTeamAlertView;
- }
- @property (nonatomic,strong) NIMTeamMember *myTeamInfo;
- @property (nonatomic,strong) NIMTeam *team;
- @property (nonatomic,copy) NSArray *teamMembers;
- @property (nonatomic,strong) NIMMemberGroupView *headerView;
- @property (nonatomic,strong) UITableView *tableView;
- @property (nonatomic,assign) NIMKitCardHeaderOpeator currentOpera;
- @property (nonatomic,strong) NSMutableArray *headerData; //表头collectionView数据
- @property (nonatomic,strong) NSArray *bodyData; //表身数据
- @end
- @implementation NIMNormalTeamCardViewController
- - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
- self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
- if (self) {
- [[NIMSDK sharedSDK].teamManager addDelegate:self];
- }
- return self;
- }
- - (instancetype)initWithTeam:(NIMTeam *)team{
- self = [self initWithNibName:nil bundle:nil];
- if (self) {
- _team = team;
- }
- return self;
- }
- - (void)dealloc{
- [[NIMSDK sharedSDK].teamManager removeDelegate:self];
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
- self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
- self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
- self.tableView.backgroundColor = NIMKit_UIColorFromRGB(0xecf1f5);
- if (@available(iOS 15.0, *)) {
- self.tableView.sectionHeaderTopPadding = 0;
- }
- [self.view addSubview:self.tableView];
- __weak typeof(self) wself = self;
- [self requestData:^(NSError *error, NSArray *data) {
- if (!error) {
- [wself refreshWithMembers:data];
- }else{
- [wself.view makeToast:@"讨论组成员获取失败"];
- }
- }];
- }
- - (void)viewDidLayoutSubviews{
- [self refreshTableHeader:self.view.nim_width];
- }
- - (NSString*)title{
- return self.team.teamName;
- }
- #pragma mark - Data
- - (void)requestData:(void(^)(NSError *error,NSArray *data)) handler{
- __weak typeof(self) wself = self;
- [[NIMSDK sharedSDK].teamManager fetchTeamMembers:self.team.teamId completion:^(NSError *error, NSArray *members) {
- NSMutableArray *array = nil;
- if (!error) {
- NSString *myAccount = [[NIMSDK sharedSDK].loginManager currentAccount];
- for (NIMTeamMember *item in members) {
- if ([item.userId isEqualToString:myAccount]) {
- wself.myTeamInfo = item;
- }
- }
- array = [[NSMutableArray alloc]init];
- for (NIMTeamMember *member in members) {
- NIMTeamCardMemberItem *item = [[NIMTeamCardMemberItem alloc] initWithMember:member];
- [array addObject:item];
- }
- wself.teamMembers = members;
- }else if(error.code == NIMRemoteErrorCodeTeamNotMember){
- [wself.view makeToast:@"你已经不在讨论组里"];
- }else{
- [wself.view makeToast:@"拉好友失败"];
- }
- handler(error,array);
- }];
- }
- - (NSArray*)buildBodyData{
-
- NIMTeamCardRowItem *itemName = [[NIMTeamCardRowItem alloc] init];
- itemName.title = @"讨论组名称";
- itemName.subTitle = self.team.teamName;
- itemName.action = @selector(updateTeamInfoName);
- itemName.rowHeight = 50.f;
- itemName.type = TeamCardRowItemTypeCommon;
-
- NIMTeamCardRowItem *teamNotify = [[NIMTeamCardRowItem alloc] init];
- teamNotify.title = @"消息提醒";
- //普通群没有只接受管理员
- teamNotify.switchOn = [self.team notifyStateForNewMsg] == NIMTeamNotifyStateAll;
- teamNotify.rowHeight = 50.f;
- teamNotify.type = TeamCardRowItemTypeSwitch;
- NIMTeamCardRowItem *itemQuit = [[NIMTeamCardRowItem alloc] init];
- itemQuit.title = @"退出讨论组";
- itemQuit.action = @selector(quitTeam);
- itemQuit.rowHeight = 60.f;
- itemQuit.type = TeamCardRowItemTypeRedButton;
-
- return @[@[itemName,teamNotify,],@[itemQuit]];
- }
- - (void)addHeaderDatas:(NSArray*)members{
- NSMutableArray *array = [[NSMutableArray alloc] init];
- for (NIMTeamMember *member in members) {
- NIMTeamCardMemberItem* item = [[NIMTeamCardMemberItem alloc] initWithMember:member];
- [array addObject:item];
- }
- [self addMembers:array];
- }
- #pragma mark - UITableViewAction
- - (void)updateTeamInfoName{
- _updateTeamNameAlertView = [[UIAlertView alloc] initWithTitle:@"" message:@"修改讨论组名称" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];
- _updateTeamNameAlertView.alertViewStyle = UIAlertViewStylePlainTextInput;
- [_updateTeamNameAlertView show];
- }
- - (void)quitTeam{
- _quitTeamAlertView = [[UIAlertView alloc] initWithTitle:@"" message:@"确认退出讨论组?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];
- [_quitTeamAlertView show];
- }
- #pragma mark - ContactSelectDelegate
- - (void)didFinishedSelect:(NSArray *)selectedContacts{
- //modify by leo v1.0.7 云信新sdk
- /*
- if (selectedContacts.count) {
- __weak typeof(self) wself = self;
- switch (self.currentOpera) {
- case CardHeaderOpeatorAdd:{
- [NIMKitProgressHUD show];
- [[NIMSDK sharedSDK].teamManager addUsers:selectedContacts
- toTeam:self.team.teamId
- postscript:@"邀请你加入讨论组"
- completion:^(NSError *error,NSArray *members) {
- [NIMKitProgressHUD dismiss];
- if (!error) {
- if (self.team.type == NIMTeamTypeNormal) {
- [wself addHeaderDatas:members];
- }else{
- [wself.view makeToast:@"邀请成功,等待验证" duration:2.0 position:CSToastPositionCenter];
- }
- [wself refreshTableHeader:self.view.nim_width];
- }else{
- [wself.view makeToast:@"邀请失败"];
- }
- wself.currentOpera = CardHeaderOpeatorNone;
-
- }];
- }
- break;
- default:
- break;
- }
- }
- */
- }
- - (void)didCancelledSelect{
- self.currentOpera = CardHeaderOpeatorNone;
- }
- #pragma mark - TeamSwitchProtocol
- - (void)onStateChanged:(BOOL)on
- {
- __weak typeof(self) weakSelf = self;
- NIMTeamNotifyState state = on? NIMTeamNotifyStateAll : NIMTeamNotifyStateNone;
- [[[NIMSDK sharedSDK] teamManager] updateNotifyState:state
- inTeam:[self.team teamId]
- completion:^(NSError *error) {
- [weakSelf refreshTableBody];
- }];
- }
- #pragma mark - NIMTeamManagerDelegate
- - (void)onTeamUpdated:(NIMTeam *)team{
- if ([team.teamId isEqualToString:self.team.teamId]) {
- self.navigationItem.title = [self title];
- __weak typeof(self) wself = self;
- [self requestData:^(NSError *error, NSArray *data) {
- [wself refreshWithMembers:data];
- }];
- }
- }
- - (NIMTeamMember*)teamInfo:(NSString*)uid{
- for (NIMTeamMember *member in self.teamMembers) {
- if ([member.userId isEqualToString:uid]) {
- return member;
- }
- }
- return nil;
- }
- - (void)transferOwner:(NSString *)memberId isLeave:(BOOL)isLeave{
- __block typeof(self) wself = self;
- NIMTeamMember *memberInfo = [self teamInfo:memberId];
- [[NIMSDK sharedSDK].teamManager transferManagerWithTeam:self.team.teamId newOwnerId:memberId isLeave:isLeave completion:^(NSError *error) {
- if (!error) {
- memberInfo.type = NIMTeamMemberTypeOwner;
- [wself.view makeToast:@"修改成功"];
- }else{
- [wself.view makeToast:@"修改失败"];
- }
- }];
- }
- #pragma mark - UITableViewDataSource
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
- return self.bodyData.count;
- }
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
- NSArray *sectionData = self.bodyData[section];
- return sectionData.count;
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
- id<NTESCardBodyData> bodyData = [self bodyDataAtIndexPath:indexPath];
- return bodyData.rowHeight;
- }
- - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
- if (section == 0) {
- return 0.0f;
- }
- return 20.f;
- }
- - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
- UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
- view.backgroundColor = NIMKit_UIColorFromRGB(0xecf1f5);
- return view;
- }
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
- id<NTESCardBodyData> bodyData = [self bodyDataAtIndexPath:indexPath];
- UITableViewCell * cell;
- NIMKitTeamCardRowItemType type = bodyData.type;
- switch (type) {
- case TeamCardRowItemTypeCommon:
- cell = [self builidCommonCell:bodyData indexPath:indexPath];
- break;
- case TeamCardRowItemTypeRedButton:
- cell = [self builidRedButtonCell:bodyData indexPath:indexPath];
- break;
- case TeamCardRowItemTypeBlueButton:
- cell = [self builidBlueButtonCell:bodyData indexPath:indexPath];
- break;
- case TeamCardRowItemTypeSwitch:
- cell = [self buildTeamSwitchCell:bodyData indexPath:indexPath];
- break;
- default:
- break;
- }
- return cell;
- }
- - (UITableViewCell*)builidCommonCell:(id<NTESCardBodyData>) bodyData indexPath:(NSIndexPath *)indexPath{
- UITableViewCell * cell = [self.tableView dequeueReusableCellWithIdentifier:TableCellReuseId];
- if (!cell) {
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:TableCellReuseId];
- CGFloat left = 15.f;
- CGFloat height = 1.f;
- UIView *sep = [[UIView alloc] initWithFrame:CGRectMake(left, cell.nim_height - height, cell.nim_width, height)];
- sep.backgroundColor = NIMKit_UIColorFromRGB(0xebebeb);
- [cell addSubview:sep];
- [sep setTag:TableSepTag];
- sep.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
- }
- UIView *sep = [cell viewWithTag:TableSepTag];
- sep.hidden = (indexPath.row + 1 == [self.tableView numberOfRowsInSection:indexPath.section]);
-
- cell.textLabel.text = bodyData.title;
- if ([bodyData respondsToSelector:@selector(subTitle)]) {
- cell.detailTextLabel.text = bodyData.subTitle;
- }
-
- if ([bodyData respondsToSelector:@selector(actionDisabled)] && bodyData.actionDisabled) {
- cell.accessoryType = UITableViewCellAccessoryNone;
- }else{
- cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
- }
- return cell;
-
- }
- - (UITableViewCell*)builidRedButtonCell:(id<NTESCardBodyData>) bodyData indexPath:(NSIndexPath *)indexPath{
- NIMKitColorButtonCell * cell = [self.tableView dequeueReusableCellWithIdentifier:TableButtonCellReuseId];
- if (!cell) {
- cell = [[NIMKitColorButtonCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableButtonCellReuseId];
- }
- cell.button.style = NIMKitColorButtonCellStyleRed;
- [cell.button setTitle:bodyData.title forState:UIControlStateNormal];
- return cell;
- }
- - (UITableViewCell*)builidBlueButtonCell:(id<NTESCardBodyData>) bodyData indexPath:(NSIndexPath *)indexPath{
- NIMKitColorButtonCell * cell = [self.tableView dequeueReusableCellWithIdentifier:TableButtonCellReuseId];
- if (!cell) {
- cell = [[NIMKitColorButtonCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableButtonCellReuseId];
- }
- cell.button.style = NIMKitColorButtonCellStyleBlue;
- [cell.button setTitle:bodyData.title forState:UIControlStateNormal];
- return cell;
- }
- - (UITableViewCell *)buildTeamSwitchCell:(id<NTESCardBodyData>)bodyData indexPath:(NSIndexPath *)indexPath
- {
- NIMTeamSwitchTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:TableSwitchReuseId];
- if (!cell) {
- cell = [[NIMTeamSwitchTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"NIMTeamSwitchTableViewCell"];
- CGFloat left = 15.f;
- CGFloat height = 1.f;
- UIView *sep = [[UIView alloc] initWithFrame:CGRectMake(left, cell.nim_height - height, cell.nim_width, height)];
- sep.backgroundColor = NIMKit_UIColorFromRGB(0xebebeb);
- [cell addSubview:sep];
- [sep setTag:TableSepTag];
- sep.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
- }
- UIView *sep = [cell viewWithTag:TableSepTag];
- sep.hidden = (indexPath.row + 1 == [self.tableView numberOfRowsInSection:indexPath.section]);
- cell.textLabel.text = bodyData.title;
- cell.switcher.on = bodyData.switchOn;
- cell.switchDelegate = self;
-
- return cell;
- }
- #pragma mark - UITableViewDelegate
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
- [tableView deselectRowAtIndexPath:indexPath animated:YES];
- NSArray *scections = self.bodyData[indexPath.section];
- id<NTESCardBodyData> bodyData = scections[indexPath.row];
- if ([bodyData respondsToSelector:@selector(actionDisabled)] && bodyData.actionDisabled) {
- return;
- }
- if ([bodyData respondsToSelector:@selector(action)]) {
- if (bodyData.action) {
- NIMKit_SuppressPerformSelectorLeakWarning([self performSelector:bodyData.action]);
- }
- }
- }
- #pragma mark - UIAlertViewDelegate
- - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex{
- if (alertView == _updateTeamNameAlertView) {
- switch (buttonIndex) {
- case 0://取消
- break;
- case 1:{
- NSString *name = [alertView textFieldAtIndex:0].text;
- if (name.length) {
- [[NIMSDK sharedSDK].teamManager updateTeamName:name teamId:self.team.teamId completion:^(NSError *error) {
- if (!error) {
- self.team = [[[NIMSDK sharedSDK] teamManager] teamById:self.team.teamId];
- [self.view makeToast:@"修改成功"];
- [self refreshTableBody];
- [self refreshTitle];
- }else{
- [self.view makeToast:@"修改失败"];
- }
- }];
- }
- break;
- }
- default:
- break;
- }
- }
-
- if (alertView == _quitTeamAlertView) {
- switch (buttonIndex) {
- case 0://取消
- break;
- case 1:{
- [[NIMSDK sharedSDK].teamManager quitTeam:self.team.teamId completion:^(NSError *error) {
- if (!error) {
- [self.navigationController popToRootViewControllerAnimated:YES];
- }else{
- [self.view makeToast:@"退出失败"];
- }
- }];
- break;
- }
- default:
- break;
- }
- }
- }
- #pragma mark - NIMMemberGroupViewDelegate
- - (void)didSelectRemoveButtonWithMemberId:(NSString *)uid{
- __weak typeof(self) wself = self;
- [NIMKitProgressHUD show];
- [[NIMSDK sharedSDK].teamManager kickUsers:@[uid] fromTeam:self.team.teamId completion:^(NSError *error) {
- [NIMKitProgressHUD dismiss];
- if (!error) {
- [wself removeMembers:@[uid]];
- [wself refreshTableHeader:self.view.nim_width];
- }else{
- [wself.view makeToast:@"移除失败"];
- }
- }];
- }
- - (void)didSelectOperator:(NIMKitCardHeaderOpeator)opera{
- switch (opera) {
- case CardHeaderOpeatorAdd:{
- self.currentOpera = CardHeaderOpeatorAdd;
- NSMutableArray *users = [[NSMutableArray alloc] init];
- NSString *currentUserID = [[[NIMSDK sharedSDK] loginManager] currentAccount];
- [users addObject:currentUserID];
- [users addObjectsFromArray:self.headerUserIds];
- NIMContactFriendSelectConfig *config = [[NIMContactFriendSelectConfig alloc] init];
- config.filterIds = users;
- config.needMutiSelected = YES;
- NIMContactSelectViewController *vc = [[NIMContactSelectViewController alloc] initWithConfig:config];
- vc.delegate = self;
- [vc show];
- break;
- }
- case CardHeaderOpeatorRemove:{
- self.currentOpera = self.currentOpera==CardHeaderOpeatorRemove? CardHeaderOpeatorNone : CardHeaderOpeatorRemove;
- [self refreshTableHeader:self.view.nim_width];
- break;
- }
- default:
- break;
- }
- }
- #pragma mark - Refresh
- - (void)refreshWithMembers:(NSArray*)members{
- self.headerData = [members mutableCopy];
- [self youpaifsetupTableView];
- [self refreshTableBody];
- [self refreshTableHeader:self.view.nim_width];
- }
- - (void)refreshTableHeader:(CGFloat)width{
- [self setupTableHeader:width];
- }
- - (void)refreshTableBody{
- self.bodyData = [self buildBodyData];
- [self.tableView reloadData];
- }
- - (void)refreshTitle{
- self.navigationItem.title = self.title;
- }
- - (void)youpaifsetupTableView{
- [self setupTableHeader:self.view.nim_width];
- self.tableView.tableFooterView = [[UIView alloc] init];
- self.tableView.delegate = self;
- self.tableView.dataSource = self;
- }
- - (void)setupTableHeader:(CGFloat)width{
- self.headerView = [[NIMMemberGroupView alloc] initWithFrame:CGRectZero];
- self.headerView.delegate = self;
- NIMKitCardHeaderOpeator opeartor;
- if (self.myTeamInfo.type == NIMTeamMemberTypeOwner) {
- opeartor = CardHeaderOpeatorAdd | CardHeaderOpeatorRemove;
- }else{
- opeartor = CardHeaderOpeatorAdd;
- }
- [self.headerView refreshUids:self.headerUserIds operators:opeartor];
- CGSize size = [self.headerView sizeThatFits:CGSizeMake(width, CGFLOAT_MAX)];
- self.headerView.nim_size = size;
- self.headerView.enableRemove = self.currentOpera == CardHeaderOpeatorRemove;
- self.tableView.tableHeaderView = self.headerView;
- }
- #pragma mark - Private
- - (NSArray*)headerUserIds{
- NSMutableArray * uids = [[NSMutableArray alloc] init];
- for (id<NIMKitCardHeaderData> data in self.headerData) {
- if ([data respondsToSelector:@selector(memberId)] && data.memberId.length) {
- [uids addObject:data.memberId];
- }
- }
- return uids;
- }
- - (id<NTESCardBodyData>)bodyDataAtIndexPath:(NSIndexPath*)indexpath{
- NSArray *sectionData = self.bodyData[indexpath.section];
- return sectionData[indexpath.row];
- }
- - (void)addMembers:(NSArray*)members{
- NSInteger opeatorCount = 0;
- for (id<NIMKitCardHeaderData> data in self.headerData.reverseObjectEnumerator.allObjects) {
- if ([data respondsToSelector:@selector(opera)]) {
- opeatorCount++;
- }else{
- break;
- }
- }
- NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(self.headerData.count - opeatorCount, members.count)];
- [self.headerData insertObjects:members atIndexes:indexSet];
- [self refreshWithMembers:self.headerData];
- }
- - (void)removeMembers:(NSArray*)members{
- for (id object in members) {
- if ([object isKindOfClass:[NSString class]]) {
- for (id<NIMKitCardHeaderData> data in self.headerData) {
- if ([data respondsToSelector:@selector(memberId)] && [data.memberId isEqualToString:object]) {
- [self.headerData removeObject:data];
- break;
- }
- }
- }else{
- [self.headerData removeObject:object];
- }
- }
- [self refreshWithMembers:self.headerData];
- }
- @end
|