|
@@ -6,708 +6,15 @@
|
|
|
//
|
|
|
|
|
|
#import "KSConversationListController.h"
|
|
|
-#import <TIMCommon/TIMDefine.h>
|
|
|
-#import <TUICore/TUICore.h>
|
|
|
-#import <TUICore/TUIThemeManager.h>
|
|
|
-#import "TUIConversationCell.h"
|
|
|
-#import "TUIConversationListDataProvider.h"
|
|
|
-#import "TUIFoldListViewController.h"
|
|
|
|
|
|
-#define GroupBtnSpace 24
|
|
|
-#define GroupScrollViewHeight 30
|
|
|
|
|
|
-@interface KSConversationListController ()<UIGestureRecognizerDelegate,
|
|
|
-UIPopoverPresentationControllerDelegate,
|
|
|
-TUIConversationTableViewDelegate,
|
|
|
-TUIPopViewDelegate,
|
|
|
-TUINotificationProtocol>
|
|
|
-@property(nonatomic, strong) TUINaviBarIndicatorView *titleView;
|
|
|
-@property(nonatomic, strong) TUIConversationListBaseDataProvider *settingDataProvider;
|
|
|
-@property(nonatomic, strong) UIView *bannerView;
|
|
|
-@property(nonatomic, assign) CGFloat viewHeight;
|
|
|
+@interface KSConversationListController ()
|
|
|
|
|
|
-@property(nonatomic, assign) BOOL actualShowConversationGroup;
|
|
|
-@property(nonatomic, strong) UIView *groupView;
|
|
|
-@property(nonatomic, strong) UIScrollView *groupScrollView;
|
|
|
-@property(nonatomic, strong) UIView *groupAnimationView;
|
|
|
-@property(nonatomic, strong) UIView *groupBtnContainer;
|
|
|
-@property(nonatomic, strong) NSMutableArray *groupItemList;
|
|
|
|
|
|
@end
|
|
|
|
|
|
@implementation KSConversationListController
|
|
|
|
|
|
-- (instancetype)init {
|
|
|
- self = [super init];
|
|
|
- if (self) {
|
|
|
- self.isShowBanner = YES;
|
|
|
- self.isShowConversationGroup = YES;
|
|
|
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onThemeChanged) name:TUIDidApplyingThemeChangedNotfication object:nil];
|
|
|
- }
|
|
|
- return self;
|
|
|
-}
|
|
|
-
|
|
|
-#pragma mark - NSNotification
|
|
|
-- (void)onThemeChanged {
|
|
|
- self.groupAnimationView.layer.borderColor = [TUIConversationDynamicColor(@"conversation_group_bg_color", @"#EBECF0") CGColor];
|
|
|
-}
|
|
|
-
|
|
|
-#pragma mark - SettingDataProvider
|
|
|
-- (void)setDataProvider:(TUIConversationListBaseDataProvider *)dataProvider {
|
|
|
- self.settingDataProvider = dataProvider;
|
|
|
-}
|
|
|
-
|
|
|
-- (TUIConversationListBaseDataProvider *)dataProvider {
|
|
|
- return self.settingDataProvider;
|
|
|
-}
|
|
|
-
|
|
|
-#pragma mark - Life Cycle
|
|
|
-- (void)viewDidLoad {
|
|
|
- [super viewDidLoad];
|
|
|
- [self setupNavigation];
|
|
|
- [self setupViews];
|
|
|
- [TUICore registerEvent:TUICore_TUIConversationGroupNotify subKey:@"" object:self];
|
|
|
- [TUICore registerEvent:TUICore_TUIConversationMarkNotify subKey:@"" object:self];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)viewWillAppear:(BOOL)animated {
|
|
|
- [super viewWillAppear:animated];
|
|
|
- [self.currentTableView reloadData];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)dealloc {
|
|
|
- [NSNotificationCenter.defaultCenter removeObserver:self];
|
|
|
- [TUICore unRegisterEventByObject:self];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)setupNavigation {
|
|
|
- UIButton *moreButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
|
- [moreButton setImage:TIMCommonDynamicImage(@"nav_more_img", [UIImage imageNamed:TIMCommonImagePath(@"more")]) forState:UIControlStateNormal];
|
|
|
- [moreButton addTarget:self action:@selector(rightBarButtonClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
- moreButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
|
|
|
- [moreButton.widthAnchor constraintEqualToConstant:24].active = YES;
|
|
|
- [moreButton.heightAnchor constraintEqualToConstant:24].active = YES;
|
|
|
- UIBarButtonItem *moreItem = [[UIBarButtonItem alloc] initWithCustomView:moreButton];
|
|
|
- self.navigationController.navigationItem.rightBarButtonItem = moreItem;
|
|
|
-
|
|
|
- self.navigationController.interactivePopGestureRecognizer.enabled = YES;
|
|
|
- self.navigationController.interactivePopGestureRecognizer.delegate = self;
|
|
|
-}
|
|
|
-
|
|
|
-- (void)rightBarButtonClick:(UIButton *)rightBarButton {
|
|
|
- NSMutableArray *menus = [NSMutableArray array];
|
|
|
- TUIPopCellData *friend = [[TUIPopCellData alloc] init];
|
|
|
-
|
|
|
- friend.image = TUIConversationDynamicImage(@"pop_icon_new_chat_img", [UIImage imageNamed:TUIConversationImagePath(@"new_chat")]);
|
|
|
- friend.title = TIMCommonLocalizableString(ChatsNewChatText);
|
|
|
- [menus addObject:friend];
|
|
|
-
|
|
|
- TUIPopCellData *group = [[TUIPopCellData alloc] init];
|
|
|
- group.image = TUIConversationDynamicImage(@"pop_icon_new_group_img", [UIImage imageNamed:TUIConversationImagePath(@"new_groupchat")]);
|
|
|
- group.title = TIMCommonLocalizableString(ChatsNewGroupText);
|
|
|
- [menus addObject:group];
|
|
|
-
|
|
|
- CGFloat height = [TUIPopCell getHeight] * menus.count + TUIPopView_Arrow_Size.height;
|
|
|
- CGFloat orginY = 0;
|
|
|
- TUIPopView *popView = [[TUIPopView alloc] initWithFrame:CGRectMake(Screen_Width - 155, orginY, 145, height)];
|
|
|
- CGRect frameInNaviView = [self.navigationController.view convertRect:rightBarButton.frame fromView:rightBarButton.superview];
|
|
|
- popView.arrowPoint = CGPointMake(frameInNaviView.origin.x + frameInNaviView.size.width * 0.5, orginY);
|
|
|
- popView.delegate = self;
|
|
|
- [popView setData:menus];
|
|
|
- [popView showInWindow:self.view.window];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)setupViews {
|
|
|
- self.view.backgroundColor = TUIConversationDynamicColor(@"conversation_bg_color", @"#FFFFFF");
|
|
|
- self.viewHeight = self.view.mm_h;
|
|
|
- if (self.isShowBanner) {
|
|
|
- CGSize size = CGSizeMake(self.view.bounds.size.width, 60);
|
|
|
- self.bannerView.mm_width(size.width).mm_height(60);
|
|
|
- NSMutableDictionary *param = [NSMutableDictionary dictionary];
|
|
|
- param[TUICore_TUIConversationExtension_ConversationListBanner_BannerSize] = NSStringFromCGSize(size);
|
|
|
- param[TUICore_TUIConversationExtension_ConversationListBanner_ModalVC] = self;
|
|
|
- BOOL result = [TUICore raiseExtension:TUICore_TUIConversationExtension_ConversationListBanner_ClassicExtensionID
|
|
|
- parentView:self.bannerView
|
|
|
- param:param];
|
|
|
- if (!result) {
|
|
|
- self.bannerView.mm_height(0);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- [self.view addSubview:self.tableViewContainer];
|
|
|
- [self.tableViewContainer addSubview:self.tableViewForAll];
|
|
|
-
|
|
|
- if (self.isShowConversationGroup) {
|
|
|
- // 延迟点时间加载,等待插件能力位异步加载完毕
|
|
|
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
|
- NSArray *extensionList = [TUICore getExtensionList:TUICore_TUIConversationExtension_ConversationGroupListBanner_ClassicExtensionID param:nil];
|
|
|
- @weakify(self);
|
|
|
- [[[RACObserve(self, actualShowConversationGroup) distinctUntilChanged] skip:0] subscribeNext:^(NSNumber *showConversationGroup) {
|
|
|
- @strongify(self);
|
|
|
- if ([showConversationGroup boolValue]) {
|
|
|
- [self.tableViewContainer setFrame:CGRectMake(0, self.groupView.mm_maxY, self.view.mm_w, self.viewHeight - self.groupView.mm_maxY)];
|
|
|
-
|
|
|
- self.groupItemList = [NSMutableArray array];
|
|
|
- TUIConversationGroupItem *allGroupItem = [[TUIConversationGroupItem alloc] init];
|
|
|
- allGroupItem.groupName = TIMCommonLocalizableString(TUIConversationGroupAll);
|
|
|
- [self addGroup:allGroupItem];
|
|
|
-
|
|
|
- for (TUIExtensionInfo *info in extensionList) {
|
|
|
- TUIConversationGroupItem *groupItem = info.data[TUICore_TUIConversationExtension_ConversationGroupListBanner_GroupItemKey];
|
|
|
- if (groupItem) {
|
|
|
- [self addGroup:groupItem];
|
|
|
- }
|
|
|
- }
|
|
|
- [self onSelectGroup:allGroupItem];
|
|
|
- } else {
|
|
|
- self.tableViewContainer.frame = CGRectMake(0, self.bannerView.mm_maxY, self.view.mm_w, self.viewHeight - self.bannerView.mm_maxY);
|
|
|
- self.tableViewForAll.frame = self.tableViewContainer.bounds;
|
|
|
- }
|
|
|
- }];
|
|
|
- self.actualShowConversationGroup = (extensionList.count > 0);
|
|
|
- });
|
|
|
- } else {
|
|
|
- self.tableViewContainer.frame = CGRectMake(0, self.bannerView.mm_maxY, self.view.mm_w, self.viewHeight - self.bannerView.mm_maxY);
|
|
|
- self.tableViewForAll.frame = self.tableViewContainer.bounds;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (UIView *)bannerView {
|
|
|
- if (!_bannerView) {
|
|
|
- _bannerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
|
|
|
- [self.view addSubview:_bannerView];
|
|
|
- }
|
|
|
- return _bannerView;
|
|
|
-}
|
|
|
-
|
|
|
-- (TUIConversationTableView *)currentTableView {
|
|
|
- for (UIView *view in self.tableViewContainer.subviews) {
|
|
|
- if ([view isKindOfClass:[TUIConversationTableView class]]) {
|
|
|
- return (TUIConversationTableView *)view;
|
|
|
- }
|
|
|
- }
|
|
|
- return nil;
|
|
|
-}
|
|
|
-
|
|
|
-- (UIView *)tableViewContainer {
|
|
|
- if (!_tableViewContainer) {
|
|
|
- _tableViewContainer = [[UIView alloc] init];
|
|
|
- _tableViewContainer.autoresizesSubviews = YES;
|
|
|
- }
|
|
|
- return _tableViewContainer;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-- (UIView *)groupView {
|
|
|
- if (!_groupView) {
|
|
|
- _groupView = [[UIView alloc] initWithFrame:CGRectMake(0, self.bannerView.mm_maxY, self.view.mm_w, 60)];
|
|
|
- [self.view addSubview:_groupView];
|
|
|
-
|
|
|
- CGFloat groupExtensionBtnLeft = _groupView.mm_w - GroupScrollViewHeight - kScale375(16);
|
|
|
- self.groupBtnContainer = [[UIView alloc] initWithFrame:CGRectMake(groupExtensionBtnLeft, 18, GroupScrollViewHeight, GroupScrollViewHeight)];
|
|
|
- [_groupView addSubview:self.groupBtnContainer];
|
|
|
- [TUICore raiseExtension:TUICore_TUIConversationExtension_ConversationGroupManagerContainer_ClassicExtensionID
|
|
|
- parentView:self.groupBtnContainer
|
|
|
- param:@{TUICore_TUIConversationExtension_ConversationGroupManagerContainer_ParentVCKey : self}];
|
|
|
-
|
|
|
- CGFloat groupScrollViewWidth = self.groupBtnContainer.mm_x - kScale375(16) - kScale375(10);
|
|
|
- self.groupScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(kScale375(16), 18, groupScrollViewWidth, GroupScrollViewHeight)];
|
|
|
- self.groupScrollView.backgroundColor = TUIConversationDynamicColor(@"conversation_group_bg_color", @"#EBECF0");
|
|
|
- self.groupScrollView.showsHorizontalScrollIndicator = NO;
|
|
|
- self.groupScrollView.showsVerticalScrollIndicator = NO;
|
|
|
- self.groupScrollView.bounces = NO;
|
|
|
- self.groupScrollView.scrollEnabled = YES;
|
|
|
- self.groupScrollView.layer.cornerRadius = GroupScrollViewHeight / 2.0;
|
|
|
- self.groupScrollView.layer.masksToBounds = YES;
|
|
|
- [_groupView addSubview:self.groupScrollView];
|
|
|
- @weakify(self);
|
|
|
- [[[RACObserve(self.groupScrollView, contentSize) distinctUntilChanged] skip:1] subscribeNext:^(NSValue *contentSizeValue) {
|
|
|
- @strongify(self);
|
|
|
- self.groupScrollView.mm_w = MIN(groupScrollViewWidth, [contentSizeValue CGSizeValue].width);
|
|
|
- }];
|
|
|
-
|
|
|
- self.groupAnimationView = [[UIView alloc] init];
|
|
|
- self.groupAnimationView.backgroundColor = TUIConversationDynamicColor(@"conversation_group_animate_view_color", @"#FFFFFF");
|
|
|
- self.groupAnimationView.layer.cornerRadius = GroupScrollViewHeight / 2.0;
|
|
|
- self.groupAnimationView.layer.masksToBounds = YES;
|
|
|
- self.groupAnimationView.layer.borderWidth = 1;
|
|
|
- self.groupAnimationView.layer.borderColor = [TUIConversationDynamicColor(@"conversation_group_bg_color", @"#EBECF0") CGColor];
|
|
|
- [self.groupScrollView addSubview:self.groupAnimationView];
|
|
|
- }
|
|
|
- return _groupView;
|
|
|
-}
|
|
|
-
|
|
|
-#pragma mark Conversation Group Manager
|
|
|
-- (void)createGroupBtn:(TUIConversationGroupItem *)groupItem positionX:(CGFloat)positionX {
|
|
|
- UIButton *groupBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
|
- [groupBtn setBackgroundColor:[UIColor clearColor]];
|
|
|
- [groupBtn setAttributedTitle:[self getGroupBtnAttributedString:groupItem] forState:UIControlStateNormal];
|
|
|
- [groupBtn setTitleColor:TUIConversationDynamicColor(@"conversation_group_btn_unselect_color", @"#666666") forState:UIControlStateNormal];
|
|
|
- [groupBtn.titleLabel setFont:[UIFont systemFontOfSize:16]];
|
|
|
- [groupBtn addTarget:self action:@selector(onGroupBtnClick:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
- [groupBtn sizeToFit];
|
|
|
- groupBtn.mm_x = positionX;
|
|
|
- groupBtn.mm_w = groupBtn.mm_w + GroupBtnSpace;
|
|
|
- groupBtn.mm_h = GroupScrollViewHeight;
|
|
|
- groupItem.groupBtn = groupBtn;
|
|
|
-}
|
|
|
-
|
|
|
-- (void)updateGroupBtn:(TUIConversationGroupItem *)groupItem {
|
|
|
- [groupItem.groupBtn setAttributedTitle:[self getGroupBtnAttributedString:groupItem] forState:UIControlStateNormal];
|
|
|
- [groupItem.groupBtn sizeToFit];
|
|
|
- groupItem.groupBtn.mm_w = groupItem.groupBtn.mm_w + GroupBtnSpace;
|
|
|
- groupItem.groupBtn.mm_h = GroupScrollViewHeight;
|
|
|
-}
|
|
|
-
|
|
|
-- (void)onGroupBtnClick:(UIButton *)btn {
|
|
|
- for (TUIConversationGroupItem *groupItem in self.groupItemList) {
|
|
|
- if ([groupItem.groupBtn isEqual:btn]) {
|
|
|
- [self onSelectGroup:groupItem];
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)loadGroupList:(NSArray<TUIConversationGroupItem *> *)groupItemList {
|
|
|
- NSString *selectGroup = @"";
|
|
|
- for (TUIConversationGroupItem *groupItem in self.groupItemList) {
|
|
|
- if (groupItem.groupBtn.isSelected) {
|
|
|
- selectGroup = groupItem.groupName;
|
|
|
- }
|
|
|
- [groupItem.groupBtn removeFromSuperview];
|
|
|
- }
|
|
|
- [self.groupItemList removeAllObjects];
|
|
|
- [self.groupScrollView setContentSize:CGSizeZero];
|
|
|
-
|
|
|
- for (TUIConversationGroupItem *groupItem in groupItemList) {
|
|
|
- [self addGroup:groupItem];
|
|
|
- if ([groupItem.groupName isEqualToString:selectGroup]) {
|
|
|
- groupItem.groupBtn.selected = YES;
|
|
|
- self.groupAnimationView.frame = groupItem.groupBtn.frame;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)addGroup:(TUIConversationGroupItem *)addGroup {
|
|
|
- [self createGroupBtn:addGroup positionX:self.groupScrollView.contentSize.width];
|
|
|
- [self.groupItemList addObject:addGroup];
|
|
|
- [self.groupScrollView addSubview:addGroup.groupBtn];
|
|
|
- [self.groupScrollView setContentSize:CGSizeMake(addGroup.groupBtn.mm_maxX, GroupScrollViewHeight)];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)insertGroup:(TUIConversationGroupItem *)insertGroup atIndex:(NSInteger)index {
|
|
|
- if (index < self.groupItemList.count) {
|
|
|
- for (int i = 0; i < self.groupItemList.count; ++i) {
|
|
|
- TUIConversationGroupItem *groupItem = self.groupItemList[i];
|
|
|
- if (i == index) {
|
|
|
- [self createGroupBtn:insertGroup positionX:groupItem.groupBtn.mm_x];
|
|
|
- [self.groupScrollView addSubview:insertGroup.groupBtn];
|
|
|
- }
|
|
|
- if (i >= index) {
|
|
|
- groupItem.groupBtn.mm_x += insertGroup.groupBtn.mm_w;
|
|
|
- if (groupItem.groupBtn.isSelected) {
|
|
|
- self.groupAnimationView.frame = groupItem.groupBtn.frame;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- [self.groupItemList insertObject:insertGroup atIndex:index];
|
|
|
- [self.groupScrollView setContentSize:CGSizeMake(self.groupScrollView.contentSize.width + insertGroup.groupBtn.mm_w, GroupScrollViewHeight)];
|
|
|
- } else {
|
|
|
- [self addGroup:insertGroup];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)updateGroup:(TUIConversationGroupItem *)updateGroup {
|
|
|
- CGFloat offsetX = 0;
|
|
|
- for (int i = 0; i < self.groupItemList.count; ++i) {
|
|
|
- TUIConversationGroupItem *groupItem = self.groupItemList[i];
|
|
|
- if (offsetX != 0) {
|
|
|
- groupItem.groupBtn.mm_x += offsetX;
|
|
|
- }
|
|
|
- if ([groupItem.groupName isEqualToString:updateGroup.groupName]) {
|
|
|
- groupItem.unreadCount = updateGroup.unreadCount;
|
|
|
- CGFloat oldBtnWidth = groupItem.groupBtn.mm_w;
|
|
|
- [self updateGroupBtn:groupItem];
|
|
|
- CGFloat newBtnWidth = groupItem.groupBtn.mm_w;
|
|
|
- offsetX = newBtnWidth - oldBtnWidth;
|
|
|
- }
|
|
|
- if (groupItem.groupBtn.isSelected) {
|
|
|
- self.groupAnimationView.frame = groupItem.groupBtn.frame;
|
|
|
- }
|
|
|
- }
|
|
|
- [self.groupScrollView setContentSize:CGSizeMake(self.groupScrollView.contentSize.width + offsetX, GroupScrollViewHeight)];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)renameGroup:(NSString *)oldName newName:(NSString *)newName {
|
|
|
- CGFloat offsetX = 0;
|
|
|
- for (int i = 0; i < self.groupItemList.count; ++i) {
|
|
|
- TUIConversationGroupItem *groupItem = self.groupItemList[i];
|
|
|
- if (offsetX != 0) {
|
|
|
- groupItem.groupBtn.mm_x += offsetX;
|
|
|
- }
|
|
|
- if ([groupItem.groupName isEqualToString:oldName]) {
|
|
|
- groupItem.groupName = newName;
|
|
|
- CGFloat oldBtnWidth = groupItem.groupBtn.mm_w;
|
|
|
- [self updateGroupBtn:groupItem];
|
|
|
- CGFloat newBtnWidth = groupItem.groupBtn.mm_w;
|
|
|
- offsetX = newBtnWidth - oldBtnWidth;
|
|
|
- }
|
|
|
- if (groupItem.groupBtn.isSelected) {
|
|
|
- self.groupAnimationView.frame = groupItem.groupBtn.frame;
|
|
|
- }
|
|
|
- }
|
|
|
- [self.groupScrollView setContentSize:CGSizeMake(self.groupScrollView.contentSize.width + offsetX, GroupScrollViewHeight)];
|
|
|
-}
|
|
|
-
|
|
|
-- (void)deleteGroup:(TUIConversationGroupItem *)deleteGroup {
|
|
|
- CGFloat offsetX = 0;
|
|
|
- NSUInteger removeIndex = 0;
|
|
|
- BOOL isSelectedGroup = NO;
|
|
|
- for (int i = 0; i < self.groupItemList.count; ++i) {
|
|
|
- TUIConversationGroupItem *groupItem = self.groupItemList[i];
|
|
|
- if (offsetX != 0) {
|
|
|
- groupItem.groupBtn.mm_x += offsetX;
|
|
|
- }
|
|
|
- if ([groupItem.groupName isEqualToString:deleteGroup.groupName]) {
|
|
|
- [groupItem.groupBtn removeFromSuperview];
|
|
|
- offsetX = -groupItem.groupBtn.mm_w;
|
|
|
- removeIndex = i;
|
|
|
- isSelectedGroup = groupItem.groupBtn.isSelected;
|
|
|
- }
|
|
|
- if (groupItem.groupBtn.isSelected) {
|
|
|
- self.groupAnimationView.frame = groupItem.groupBtn.frame;
|
|
|
- }
|
|
|
- }
|
|
|
- [self.groupItemList removeObjectAtIndex:removeIndex];
|
|
|
- [self.groupScrollView setContentSize:CGSizeMake(self.groupScrollView.contentSize.width + offsetX, GroupScrollViewHeight)];
|
|
|
- if (isSelectedGroup) {
|
|
|
- [self onSelectGroup:self.groupItemList.firstObject];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)onSelectGroup:(TUIConversationGroupItem *)selectGroupItem {
|
|
|
- for (int i = 0; i < self.groupItemList.count; ++i) {
|
|
|
- TUIConversationGroupItem *groupItem = self.groupItemList[i];
|
|
|
- if ([groupItem.groupName isEqualToString:selectGroupItem.groupName]) {
|
|
|
- groupItem.groupBtn.selected = YES;
|
|
|
-
|
|
|
- [UIView animateWithDuration:0.1
|
|
|
- animations:^{
|
|
|
- self.groupAnimationView.frame = groupItem.groupBtn.frame;
|
|
|
- }];
|
|
|
- for (UIView *view in self.tableViewContainer.subviews) {
|
|
|
- [view removeFromSuperview];
|
|
|
- }
|
|
|
- if ([groupItem.groupName isEqualToString:TIMCommonLocalizableString(TUIConversationGroupAll)]) {
|
|
|
- self.tableViewForAll.frame = self.tableViewContainer.bounds;
|
|
|
- [self.tableViewContainer addSubview:self.tableViewForAll];
|
|
|
- } else {
|
|
|
- [TUICore raiseExtension:TUICore_TUIConversationExtension_ConversationListContainer_ClassicExtensionID
|
|
|
- parentView:self.tableViewContainer
|
|
|
- param:@{TUICore_TUIConversationExtension_ConversationListContainer_GroupNameKey : groupItem.groupName}];
|
|
|
- self.currentTableView.convDelegate = self;
|
|
|
- }
|
|
|
- } else {
|
|
|
- groupItem.groupBtn.selected = NO;
|
|
|
- }
|
|
|
- [self updateGroupBtn:groupItem];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (NSMutableAttributedString *)getGroupBtnAttributedString:(TUIConversationGroupItem *)groupItem {
|
|
|
- NSMutableString *content = [NSMutableString stringWithString:groupItem.groupName];
|
|
|
- NSInteger unreadCount = groupItem.unreadCount;
|
|
|
- if (unreadCount > 0) {
|
|
|
- [content appendString:@" "];
|
|
|
- [content appendString:(unreadCount > 99 ? @"99+" : [@(unreadCount) stringValue])];
|
|
|
- }
|
|
|
- NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:content];
|
|
|
- if (groupItem.groupBtn.isSelected) {
|
|
|
- [attributeString setAttributes:@{
|
|
|
- NSFontAttributeName : [UIFont systemFontOfSize:16],
|
|
|
- NSForegroundColorAttributeName : TUIConversationDynamicColor(@"conversation_group_btn_select_color", @"#147AFF")
|
|
|
- }
|
|
|
- range:NSMakeRange(0, groupItem.groupName.length)];
|
|
|
- } else {
|
|
|
- [attributeString setAttributes:@{
|
|
|
- NSFontAttributeName : [UIFont systemFontOfSize:16],
|
|
|
- NSForegroundColorAttributeName : TUIConversationDynamicColor(@"conversation_group_btn_unselect_color", @"#666666")
|
|
|
- }
|
|
|
- range:NSMakeRange(0, groupItem.groupName.length)];
|
|
|
- }
|
|
|
- [attributeString setAttributes:@{
|
|
|
- NSForegroundColorAttributeName : TUIConversationDynamicColor(@"conversation_group_btn_select_color", @"#147AFF"),
|
|
|
- NSFontAttributeName : [UIFont systemFontOfSize:12],
|
|
|
- NSBaselineOffsetAttributeName : @(1)
|
|
|
- }
|
|
|
- range:NSMakeRange(groupItem.groupName.length, content.length - groupItem.groupName.length)];
|
|
|
- return attributeString;
|
|
|
-}
|
|
|
-
|
|
|
-#pragma mark TUINotificationProtocol
|
|
|
-- (void)onNotifyEvent:(NSString *)key subKey:(NSString *)subKey object:(nullable id)anObject param:(nullable NSDictionary *)param {
|
|
|
- if ([key isEqualToString:TUICore_TUIConversationGroupNotify] || [key isEqualToString:TUICore_TUIConversationMarkNotify]) {
|
|
|
- if (!self.actualShowConversationGroup) {
|
|
|
- self.actualShowConversationGroup = YES;
|
|
|
- }
|
|
|
- }
|
|
|
- if ([key isEqualToString:TUICore_TUIConversationGroupNotify]) {
|
|
|
- if ([param objectForKey:TUICore_TUIConversationGroupNotify_GroupListLoadKey]) {
|
|
|
- NSArray *groupItemList = [param objectForKey:TUICore_TUIConversationGroupNotify_GroupListLoadKey];
|
|
|
- if (groupItemList && groupItemList.count > 0) {
|
|
|
- [self loadGroupList:groupItemList];
|
|
|
- }
|
|
|
- } else if ([param objectForKey:TUICore_TUIConversationGroupNotify_GroupAddKey]) {
|
|
|
- TUIConversationGroupItem *groupItem = [param objectForKey:TUICore_TUIConversationGroupNotify_GroupAddKey];
|
|
|
- if (groupItem) {
|
|
|
- [self addGroup:groupItem];
|
|
|
- }
|
|
|
- } else if ([param objectForKey:TUICore_TUIConversationGroupNotify_GroupUpdateKey]) {
|
|
|
- TUIConversationGroupItem *groupItem = [param objectForKey:TUICore_TUIConversationGroupNotify_GroupUpdateKey];
|
|
|
- if (groupItem) {
|
|
|
- [self updateGroup:groupItem];
|
|
|
- }
|
|
|
- } else if ([param objectForKey:TUICore_TUIConversationGroupNotify_GroupRenameKey]) {
|
|
|
- NSDictionary *renameItem = [param objectForKey:TUICore_TUIConversationGroupNotify_GroupRenameKey];
|
|
|
- if (renameItem) {
|
|
|
- [self renameGroup:renameItem.allKeys.firstObject newName:renameItem.allValues.firstObject];
|
|
|
- }
|
|
|
- } else if ([param objectForKey:TUICore_TUIConversationGroupNotify_GroupDeleteKey]) {
|
|
|
- TUIConversationGroupItem *groupItem = [param objectForKey:TUICore_TUIConversationGroupNotify_GroupDeleteKey];
|
|
|
- if (groupItem) {
|
|
|
- [self deleteGroup:groupItem];
|
|
|
- }
|
|
|
- }
|
|
|
- } else if ([key isEqualToString:TUICore_TUIConversationMarkNotify]) {
|
|
|
- if ([param objectForKey:TUICore_TUIConversationGroupNotify_MarkAddKey]) {
|
|
|
- TUIConversationGroupItem *groupItem = [param objectForKey:TUICore_TUIConversationGroupNotify_MarkAddKey];
|
|
|
- if (groupItem) {
|
|
|
- [self insertGroup:groupItem atIndex:groupItem.groupIndex];
|
|
|
- }
|
|
|
- } else if ([param objectForKey:TUICore_TUIConversationGroupNotify_MarkUpdateKey]) {
|
|
|
- TUIConversationGroupItem *groupItem = [param objectForKey:TUICore_TUIConversationGroupNotify_MarkUpdateKey];
|
|
|
- if (groupItem) {
|
|
|
- [self updateGroup:groupItem];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-#pragma TUIConversationTableViewDelegate
|
|
|
-- (void)tableViewDidScroll:(CGFloat)offsetY {
|
|
|
- if (!self.bannerView || self.bannerView.hidden) {
|
|
|
- return;
|
|
|
- }
|
|
|
- UIEdgeInsets safeAreaInsets = UIEdgeInsetsZero;
|
|
|
- if (@available(iOS 11.0, *)) {
|
|
|
- safeAreaInsets = self.currentTableView.adjustedContentInset;
|
|
|
- }
|
|
|
- CGFloat contentSizeHeight = self.currentTableView.contentSize.height + safeAreaInsets.top + safeAreaInsets.bottom;
|
|
|
- if (contentSizeHeight > self.currentTableView.mm_h && self.currentTableView.contentOffset.y + self.currentTableView.mm_h > contentSizeHeight) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (offsetY > self.bannerView.mm_h) {
|
|
|
- offsetY = self.bannerView.mm_h;
|
|
|
- }
|
|
|
- if (offsetY < 0) {
|
|
|
- offsetY = 0;
|
|
|
- }
|
|
|
- self.bannerView.mm_top(offsetY);
|
|
|
- if (self.actualShowConversationGroup) {
|
|
|
- self.groupView.mm_top(self.bannerView.mm_maxY);
|
|
|
- self.tableViewContainer.mm_top(self.groupView.mm_maxY).mm_height(self.viewHeight - self.groupView.mm_maxY);
|
|
|
- } else {
|
|
|
- self.tableViewContainer.mm_top(self.bannerView.mm_maxY).mm_height(self.viewHeight - self.bannerView.mm_maxY);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)tableViewDidSelectCell:(TUIConversationCellData *)data {
|
|
|
- if (data.isLocalConversationFoldList) {
|
|
|
- [TUIConversationListDataProvider cacheConversationFoldListSettings_FoldItemIsUnread:NO];
|
|
|
-
|
|
|
- TUIFoldListViewController *foldVC = [[TUIFoldListViewController alloc] init];
|
|
|
- [self.navigationController pushViewController:foldVC animated:YES];
|
|
|
-
|
|
|
- @weakify(self);
|
|
|
- foldVC.dismissCallback = ^(NSMutableAttributedString *_Nonnull foldStr, NSArray *_Nonnull sortArr, NSArray *_Nonnull needRemoveFromCacheMapArray) {
|
|
|
- @strongify(self);
|
|
|
- data.foldSubTitle = foldStr;
|
|
|
- data.subTitle = data.foldSubTitle;
|
|
|
- data.isMarkAsUnread = NO;
|
|
|
-
|
|
|
- if (sortArr.count <= 0) {
|
|
|
- data.orderKey = 0;
|
|
|
- if ([self.dataProvider.conversationList containsObject:data]) {
|
|
|
- [self.dataProvider hideConversation:data];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (NSString *removeId in needRemoveFromCacheMapArray) {
|
|
|
- if ([self.dataProvider.markFoldMap objectForKey:removeId]) {
|
|
|
- [self.dataProvider.markFoldMap removeObjectForKey:removeId];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- [TUIConversationListDataProvider cacheConversationFoldListSettings_FoldItemIsUnread:NO];
|
|
|
- [self.currentTableView reloadData];
|
|
|
- };
|
|
|
- return;
|
|
|
- }
|
|
|
- if (self.delegate && [self.delegate respondsToSelector:@selector(conversationListController:didSelectConversation:)]) {
|
|
|
- [self.delegate conversationListController:self didSelectConversation:data];
|
|
|
- } else {
|
|
|
- NSDictionary *param = @{
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_Title : data.title ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_UserID : data.userID ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_GroupID : data.groupID ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_AvatarImage : data.avatarImage ?: [UIImage new],
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl : data.faceUrl ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_ConversationID : data.conversationID ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs : data.atMsgSeqs ?: @[],
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_Draft : data.draftText ?: @""
|
|
|
- };
|
|
|
- [self.navigationController pushViewController:TUICore_TUIChatObjectFactory_ChatViewController_Classic param:param forResult:nil];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)tableViewDidShowAlert:(UIAlertController *)ac {
|
|
|
- [self presentViewController:ac animated:YES completion:nil];
|
|
|
-}
|
|
|
-
|
|
|
-#pragma TUIPopViewDelegate
|
|
|
-- (void)popView:(TUIPopView *)popView didSelectRowAtIndex:(NSInteger)index {
|
|
|
- if (0 == index) {
|
|
|
- [self startConversation:V2TIM_C2C];
|
|
|
- } else {
|
|
|
- [self startConversation:V2TIM_GROUP];
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-- (void)startConversation:(V2TIMConversationType)type {
|
|
|
- __weak typeof(self) weakSelf = self;
|
|
|
- void (^selectContactCompletion)(NSArray<TUICommonContactSelectCellData *> *) = ^(NSArray<TUICommonContactSelectCellData *> *array) {
|
|
|
- if (V2TIM_C2C == type) {
|
|
|
- NSDictionary *param = @{
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_Title : array.firstObject.title ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_UserID : array.firstObject.identifier ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_AvatarImage : array.firstObject.avatarImage ?: [UIImage new],
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl : array.firstObject.avatarUrl.absoluteString ?: @""
|
|
|
- };
|
|
|
- [weakSelf.navigationController pushViewController:TUICore_TUIChatObjectFactory_ChatViewController_Classic param:param forResult:nil];
|
|
|
-
|
|
|
- NSMutableArray *tempArray = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
|
|
|
- [tempArray removeObjectAtIndex:tempArray.count - 2];
|
|
|
- weakSelf.navigationController.viewControllers = tempArray;
|
|
|
- } else {
|
|
|
- NSString *loginUser = [[V2TIMManager sharedInstance] getLoginUser];
|
|
|
- [[V2TIMManager sharedInstance]
|
|
|
- getUsersInfo:@[ loginUser ]
|
|
|
- succ:^(NSArray<V2TIMUserFullInfo *> *infoList) {
|
|
|
- NSString *showName = loginUser;
|
|
|
- if (infoList.firstObject.nickName.length > 0) {
|
|
|
- showName = infoList.firstObject.nickName;
|
|
|
- }
|
|
|
- NSMutableString *groupName = [NSMutableString stringWithString:showName];
|
|
|
- for (TUICommonContactSelectCellData *item in array) {
|
|
|
- [groupName appendFormat:@"、%@", item.title];
|
|
|
- }
|
|
|
-
|
|
|
- if ([groupName length] > 10) {
|
|
|
- groupName = [groupName substringToIndex:10].mutableCopy;
|
|
|
- }
|
|
|
- void (^createGroupCompletion)(BOOL, V2TIMGroupInfo *) = ^(BOOL isSuccess, V2TIMGroupInfo *_Nonnull info) {
|
|
|
- NSDictionary *param = @{
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_Title : info.groupName ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_GroupID : info.groupID ?: @"",
|
|
|
- TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl : info.faceURL ?: @""
|
|
|
- };
|
|
|
- [self.navigationController pushViewController:TUICore_TUIChatObjectFactory_ChatViewController_Classic param:param forResult:nil];
|
|
|
-
|
|
|
- NSMutableArray *tempArray = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
|
|
|
- for (UIViewController *vc in self.navigationController.viewControllers) {
|
|
|
- if ([vc isKindOfClass:NSClassFromString(@"TUIGroupCreateController")] ||
|
|
|
- [vc isKindOfClass:NSClassFromString(@"TUIContactSelectController")]) {
|
|
|
- [tempArray removeObject:vc];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- weakSelf.navigationController.viewControllers = tempArray;
|
|
|
- };
|
|
|
-
|
|
|
- NSDictionary *param = @{
|
|
|
- TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_TitleKey : array.firstObject.title ?: @"",
|
|
|
- TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_GroupNameKey : groupName ?: @"",
|
|
|
- TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_GroupTypeKey : GroupType_Work,
|
|
|
- TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_CompletionKey : createGroupCompletion,
|
|
|
- TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod_ContactListKey : array ?: @[]
|
|
|
- };
|
|
|
-
|
|
|
- UIViewController *groupVC = (UIViewController *)[TUICore createObject:TUICore_TUIContactObjectFactory
|
|
|
- key:TUICore_TUIContactObjectFactory_GetGroupCreateControllerMethod
|
|
|
- param:param];
|
|
|
- [weakSelf.navigationController pushViewController:(UIViewController *)groupVC animated:YES];
|
|
|
- }
|
|
|
- fail:nil];
|
|
|
- }
|
|
|
- };
|
|
|
- NSDictionary *param = @{
|
|
|
- TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_TitleKey : TIMCommonLocalizableString(ChatsSelectContact),
|
|
|
- TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_MaxSelectCount : @(type == V2TIM_C2C ? 1 : INT_MAX),
|
|
|
- TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod_CompletionKey : selectContactCompletion
|
|
|
- };
|
|
|
- UIViewController *vc = [TUICore createObject:TUICore_TUIContactObjectFactory
|
|
|
- key:TUICore_TUIContactObjectFactory_GetContactSelectControllerMethod
|
|
|
- param:param];
|
|
|
- [self.navigationController pushViewController:vc animated:YES];
|
|
|
-}
|
|
|
-
|
|
|
-#pragma mark TUIConversationListDataProviderDelegate
|
|
|
-- (NSString *)getConversationDisplayString:(V2TIMConversation *)conversation {
|
|
|
- if (self.delegate && [self.delegate respondsToSelector:@selector(getConversationDisplayString:)]) {
|
|
|
- return [self.delegate getConversationDisplayString:conversation];
|
|
|
- }
|
|
|
- V2TIMMessage *msg = conversation.lastMessage;
|
|
|
- if (msg.customElem == nil || msg.customElem.data == nil) {
|
|
|
- return nil;
|
|
|
- }
|
|
|
- NSDictionary *param = [TUITool jsonData2Dictionary:msg.customElem.data];
|
|
|
- if (param != nil && [param isKindOfClass:[NSDictionary class]]) {
|
|
|
- NSString *businessID = param[@"businessID"];
|
|
|
- if (![businessID isKindOfClass:[NSString class]]) {
|
|
|
- return nil;
|
|
|
- }
|
|
|
-
|
|
|
- // whether custom jump message
|
|
|
- if ([businessID isEqualToString:BussinessID_TextLink] || ([(NSString *)param[@"text"] length] > 0 && [(NSString *)param[@"link"] length] > 0)) {
|
|
|
- NSString *desc = param[@"text"];
|
|
|
- if (msg.status == V2TIM_MSG_STATUS_LOCAL_REVOKED) {
|
|
|
- if (msg.isSelf) {
|
|
|
- desc = TIMCommonLocalizableString(TUIKitMessageTipsYouRecallMessage);
|
|
|
- } else if (msg.userID.length > 0) {
|
|
|
- desc = TIMCommonLocalizableString(TUIKitMessageTipsOthersRecallMessage);
|
|
|
- } else if (msg.groupID.length > 0) {
|
|
|
- /**
|
|
|
- * 对于群组消息的名称显示,优先显示群名片,昵称优先级其次,用户ID优先级最低。
|
|
|
- * For the name display of group messages, the group business card is displayed first, the nickname has the second priority, and the user ID
|
|
|
- * has the lowest priority.
|
|
|
- */
|
|
|
- NSString *userName = msg.nameCard;
|
|
|
- if (userName.length == 0) {
|
|
|
- userName = msg.nickName ?: msg.sender;
|
|
|
- }
|
|
|
- desc = [NSString stringWithFormat:TIMCommonLocalizableString(TUIKitMessageTipsRecallMessageFormat), userName];
|
|
|
- }
|
|
|
- }
|
|
|
- return desc;
|
|
|
- }
|
|
|
- }
|
|
|
- return nil;
|
|
|
-}
|
|
|
-
|
|
|
-- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
|
|
|
- return UIModalPresentationNone;
|
|
|
-}
|
|
|
|
|
|
@end
|
|
|
|