174 lines
5.5 KiB
Objective-C
174 lines
5.5 KiB
Objective-C
//
|
|
// SessionViewController.m
|
|
// xplan-ios
|
|
//
|
|
// Created by zu on 2021/11/28.
|
|
//
|
|
|
|
#import "SessionViewController.h"
|
|
#import "MessageCell.h"
|
|
#import "SendMessageView.h"
|
|
#import "UITableView+NIMScrollToBottom.h"
|
|
#import "XPMacro.h"
|
|
|
|
#import <Masonry/Masonry.h>
|
|
|
|
@interface SessionViewController ()<UITableViewDelegate, UITableViewDataSource, NIMChatManagerDelegate, NIMConversationManagerDelegate, NIMMediaManagerDelegate>
|
|
|
|
@property (nonatomic, strong) NIMSession * session;
|
|
@property (nonatomic, strong) NSMutableArray<NIMMessage *> * messages;
|
|
|
|
@property (nonatomic, strong) UITableView * sessionTableView;
|
|
@property (nonatomic, strong) SendMessageView * sendMessageView;
|
|
|
|
@end
|
|
|
|
@implementation SessionViewController
|
|
|
|
- (void)dealloc {
|
|
[[NIMSDK sharedSDK].chatManager removeDelegate:self];
|
|
[[NIMSDK sharedSDK].conversationManager removeDelegate:self];
|
|
[[NIMSDK sharedSDK].mediaManager removeDelegate:self];
|
|
}
|
|
|
|
- (instancetype)initWithSession:(NIMSession *)session {
|
|
self = [super init];
|
|
if (self) {
|
|
_session = session;
|
|
[self initViews];
|
|
[self initLayout];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
[self initData];
|
|
[[NIMSDK sharedSDK].chatManager addDelegate:self];
|
|
[[NIMSDK sharedSDK].conversationManager addDelegate:self];
|
|
}
|
|
|
|
- (void)initViews {
|
|
NIMUser * user = [[NIMSDK sharedSDK].userManager userInfo:self.session.sessionId];
|
|
if (user) {
|
|
self.title = user.userInfo.nickName;
|
|
} else {
|
|
self.title = @"加载中……";
|
|
}
|
|
|
|
|
|
[self.view addSubview:self.sessionTableView];
|
|
[self.view addSubview:self.sendMessageView];
|
|
}
|
|
|
|
- (void)initLayout {
|
|
[self.sessionTableView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.right.top.mas_equalTo(self.view);
|
|
make.bottom.mas_equalTo(self.sendMessageView.mas_top);
|
|
}];
|
|
|
|
[self.sendMessageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
|
make.left.right.bottom.mas_equalTo(self.view);
|
|
}];
|
|
}
|
|
|
|
- (void)initData {
|
|
NSArray<NIMMessage *> *messages = [[[NIMSDK sharedSDK] conversationManager] messagesInSession:self.session
|
|
message:nil
|
|
limit:1000];
|
|
[self.messages addObjectsFromArray:messages.copy];
|
|
[self.sessionTableView reloadData];
|
|
[self.sessionTableView nim_scrollToBottom:NO];
|
|
|
|
[[NIMSDK sharedSDK].userManager fetchUserInfos:@[self.session.sessionId] completion:^(NSArray<NIMUser *> * _Nullable users, NSError * _Nullable error) {
|
|
if (!error) {
|
|
self.title = users[0].userInfo.nickName;
|
|
}
|
|
}];
|
|
|
|
[[NIMSDK sharedSDK].conversationManager markAllMessagesReadInSession:self.session];
|
|
}
|
|
|
|
#pragma mark - UITableViewDataSource
|
|
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
|
|
return 1;
|
|
}
|
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
|
return self.messages.count;
|
|
}
|
|
|
|
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
|
|
MessageCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([MessageCell class])];
|
|
if (cell == nil) {
|
|
cell = [[MessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([MessageCell class])];
|
|
}
|
|
[cell renderWithMessage:[self.messages objectAtIndex:indexPath.row]];
|
|
return cell;
|
|
}
|
|
|
|
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
NIMMessage *msg = [self.messages objectAtIndex:indexPath.row];
|
|
return [MessageCell measureHeight:msg];
|
|
}
|
|
|
|
#pragma mark - NIMChatManagerDelegate
|
|
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages {
|
|
NIMMessage *message = messages.firstObject;
|
|
NIMSession *session = message.session;
|
|
if (![session isEqual:self.session] || !messages.count) {
|
|
return;
|
|
}
|
|
for (NIMMessage *message in messages) {
|
|
if (message.isDeleted) {
|
|
continue;
|
|
}
|
|
[self.messages addObject:message];
|
|
}
|
|
[self.sessionTableView reloadData];
|
|
[self.sessionTableView nim_scrollToBottom:YES];
|
|
|
|
[[NIMSDK sharedSDK].conversationManager markAllMessagesReadInSession:self.session];
|
|
}
|
|
|
|
#pragma mark - NIMConversationManagerDelegate
|
|
- (void)messagesDeletedInSession:(NIMSession *)session {
|
|
[self.messages removeAllObjects];
|
|
[self initData];
|
|
}
|
|
|
|
- (NSArray<NIMMessage *> *)messages {
|
|
if (!_messages) {
|
|
_messages = [[NSMutableArray alloc] init];
|
|
}
|
|
return _messages;
|
|
}
|
|
|
|
- (UITableView *)sessionTableView {
|
|
if (!_sessionTableView) {
|
|
_sessionTableView = [[UITableView alloc] init];
|
|
_sessionTableView.delegate = self;
|
|
_sessionTableView.dataSource = self;
|
|
_sessionTableView.backgroundColor = UIColor.clearColor;
|
|
_sessionTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
|
|
|
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyBoard)];
|
|
[_sessionTableView addGestureRecognizer:tap];
|
|
}
|
|
return _sessionTableView;
|
|
}
|
|
|
|
- (void)closeKeyBoard {
|
|
[self.view endEditing:YES];
|
|
[self.sessionTableView endEditing:YES];
|
|
}
|
|
|
|
- (SendMessageView *)sendMessageView {
|
|
if (!_sendMessageView) {
|
|
_sendMessageView = [[SendMessageView alloc] init];
|
|
}
|
|
return _sendMessageView;
|
|
}
|
|
|
|
@end
|