// 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 #import #import #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 *messages; @property (strong, nonatomic) RLMNotificationToken *messagesNotificationToken; @end @implementation OCTConversationViewController - (instancetype)initWithManager:(id)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