160 lines
4.7 KiB
Mathematica
160 lines
4.7 KiB
Mathematica
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
||
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||
|
|
||
|
#import <BlocksKit/UIActionSheet+BlocksKit.h>
|
||
|
#import <BlocksKit/UIAlertView+BlocksKit.h>
|
||
|
#import <BlocksKit/UIBarButtonItem+BlocksKit.h>
|
||
|
|
||
|
#import "OCTConversationViewController.h"
|
||
|
#import "OCTChat.h"
|
||
|
#import "OCTMessageAbstract.h"
|
||
|
#import "OCTSubmanagerObjects.h"
|
||
|
#import "OCTSubmanagerChats.h"
|
||
|
#import "OCTSubmanagerCalls.h"
|
||
|
|
||
|
@interface OCTConversationViewController ()
|
||
|
|
||
|
@property (strong, nonatomic) OCTChat *chat;
|
||
|
@property (strong, nonatomic) RLMResults<OCTMessageAbstract *> *messages;
|
||
|
@property (strong, nonatomic) RLMNotificationToken *messagesNotificationToken;
|
||
|
|
||
|
@end
|
||
|
|
||
|
@implementation OCTConversationViewController
|
||
|
|
||
|
- (instancetype)initWithManager:(id<OCTManager>)manager chat:(OCTChat *)chat
|
||
|
{
|
||
|
self = [super initWithManager:manager];
|
||
|
|
||
|
if (! self) {
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
_chat = chat;
|
||
|
|
||
|
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"chatUniqueIdentifier == %@", chat.uniqueIdentifier];
|
||
|
_messages = [self.manager.objects objectsForType:OCTFetchRequestTypeMessageAbstract predicate:predicate];
|
||
|
|
||
|
self.title = [NSString stringWithFormat:@"%@", chat.uniqueIdentifier];
|
||
|
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)dealloc
|
||
|
{
|
||
|
[self.messagesNotificationToken invalidate];
|
||
|
}
|
||
|
|
||
|
- (void)viewDidLoad
|
||
|
{
|
||
|
[super viewDidLoad];
|
||
|
|
||
|
__weak typeof(self)weakSelf = self;
|
||
|
|
||
|
self.messagesNotificationToken = [self.messages addNotificationBlock:^(RLMResults *results, RLMCollectionChange *changes, NSError *error) {
|
||
|
if (error) {
|
||
|
NSLog(@"Failed to open Realm on background worker: %@", error);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
UITableView *tableView = weakSelf.tableView;
|
||
|
|
||
|
// Initial run of the query will pass nil for the change information
|
||
|
if (! changes) {
|
||
|
[tableView reloadData];
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Query results have changed, so apply them to the UITableView
|
||
|
[tableView beginUpdates];
|
||
|
[tableView deleteRowsAtIndexPaths:[changes deletionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic];
|
||
|
[tableView insertRowsAtIndexPaths:[changes insertionsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic];
|
||
|
[tableView reloadRowsAtIndexPaths:[changes modificationsInSection:0] withRowAnimation:UITableViewRowAnimationAutomatic];
|
||
|
[tableView endUpdates];
|
||
|
}];
|
||
|
|
||
|
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
|
||
|
bk_initWithBarButtonSystemItem:UIBarButtonSystemItemAdd handler:^(id handler) {
|
||
|
[weakSelf showSendDialog];
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
#pragma mark - UITableViewDelegate
|
||
|
|
||
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
|
||
|
{
|
||
|
[tableView deselectRowAtIndexPath:indexPath animated:YES];
|
||
|
}
|
||
|
|
||
|
#pragma mark - UITableViewDataSource
|
||
|
|
||
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||
|
{
|
||
|
return self.messages.count;
|
||
|
}
|
||
|
|
||
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||
|
{
|
||
|
UITableViewCell *cell = [self cellForIndexPath:indexPath];
|
||
|
|
||
|
OCTMessageAbstract *message = self.messages[indexPath.row];
|
||
|
|
||
|
cell.textLabel.text = [message description];
|
||
|
|
||
|
return cell;
|
||
|
}
|
||
|
|
||
|
#pragma mark - Private
|
||
|
|
||
|
- (void)showSendDialog
|
||
|
{
|
||
|
__weak OCTConversationViewController *weakSelf = self;
|
||
|
|
||
|
[self showActionSheet:^(UIActionSheet *sheet) {
|
||
|
[sheet bk_addButtonWithTitle:@"Send message" handler:^{
|
||
|
[weakSelf sendMessage];
|
||
|
}];
|
||
|
|
||
|
[sheet bk_addButtonWithTitle:@"Call friend" handler:^{
|
||
|
[weakSelf callFriend];
|
||
|
}];
|
||
|
}];
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
- (void)sendMessage
|
||
|
{
|
||
|
UIAlertView *alert = [UIAlertView bk_alertViewWithTitle:@"Send message" message:nil];
|
||
|
|
||
|
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
|
||
|
UITextField *messageField = [alert textFieldAtIndex:0];
|
||
|
messageField.placeholder = @"Message";
|
||
|
|
||
|
__weak OCTConversationViewController *weakSelf = self;
|
||
|
[alert bk_addButtonWithTitle:@"OK" handler:^{
|
||
|
[weakSelf.manager.chats sendMessageToChat:weakSelf.chat text:messageField.text type:OCTToxMessageTypeNormal successBlock:^(OCTMessageAbstract *_) {
|
||
|
[weakSelf.tableView reloadData];
|
||
|
} failureBlock:nil];
|
||
|
}];
|
||
|
|
||
|
[alert bk_setCancelButtonWithTitle:@"Cancel" handler:nil];
|
||
|
|
||
|
[alert show];
|
||
|
}
|
||
|
|
||
|
#pragma mark - Call methods
|
||
|
|
||
|
- (void)callFriend
|
||
|
{
|
||
|
NSError *error;
|
||
|
OCTCall *call = [self.manager.calls callToChat:self.chat enableAudio:YES enableVideo:NO error:&error];
|
||
|
|
||
|
if (! call) {
|
||
|
NSLog(@"Unable to create call, %@", error.localizedFailureReason);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@end
|