Antidote/local_pod_repo/objcTox/iOSDemo/OCTConversationViewController.m
2024-02-22 21:43:11 +02:00

160 lines
4.7 KiB
Objective-C

// 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