// // MasterViewController.m // Juick // // Created by Vitaly Takmazov on 26.10.13. // Copyright (c) 2013 com.juick. All rights reserved. // #import "MessagesViewController.h" #import "MessageCell.h" #import "Message.h" #import "NewPostViewController.h" #import "LoginViewController.h" #import "ThreadViewController.h" #import "BlogViewController.h" #import "User+UIView.h" NSString* const messageCellIdentifier = @"messageCell"; @interface MessagesViewController() @property(nonatomic, assign) Boolean initialDataLoaded; -(void) applicationActivated; @end @implementation MessagesViewController - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationController.visibleViewController.title = self.title; } -(void) refreshData { UIApplicationState state = [UIApplication sharedApplication].applicationState; if (state == UIApplicationStateActive && self.dataLoading == NO) { if ([self.path length] > 0) { self.dataLoading = YES; if (self.messages.count == 0) { [self.tableView reloadData]; } [[AppDelegate shared].api pullNextFromPath:self.path params:self.params callback:^(NSArray *next, NSError *err) { if (!self.initialDataLoaded) { self.initialDataLoaded = YES; } self.dataLoading = NO; if (err) { [User throwUnableToLogin:self sourceView:self.navigationItem.titleView error:err path:self.path params:self.params]; return; } NSArray *newMsgs = next; if ([self isAtTop:self.params]) { if (![self.path isEqualToString:[API threadUrl]]) { [self.messages removeAllObjects]; [self.tableView reloadData]; } } NSUInteger oldCount = [self.messages count]; if ([self.path isEqualToString:[API threadUrl]]) { NSUInteger lastRid = [((Message *)[self.messages lastObject]).rid unsignedIntegerValue] + 1; NSUInteger count = [next count]; if (oldCount > 0) { if (lastRid && lastRid < count) { newMsgs = [next subarrayWithRange:NSMakeRange(lastRid, count - lastRid)]; } else { [self.refreshControl endRefreshing]; return; } } } if (self.messages.count == 0) { [self.tableView reloadData]; } [self.messages addObjectsFromArray:newMsgs]; NSMutableArray *indexPaths = [NSMutableArray new]; for (NSUInteger index = oldCount; index <= oldCount + [newMsgs count] - 1; index++) { [indexPaths addObject:[NSIndexPath indexPathForRow:index inSection: 0]]; } [self.tableView beginUpdates]; [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:NO]; [self.tableView endUpdates]; [self.refreshControl endRefreshing]; if (self.shouldScrollToUnreadOnRefresh) { NSInteger messagesCount = [self.messages count]; if (messagesCount > 0) { NSInteger itemToScroll = [self.firstUnread integerValue] ? : self.messages.count - 1; NSIndexPath *lastRow = [NSIndexPath indexPathForRow:MIN(itemToScroll, messagesCount - 1) inSection:0]; [self.tableView scrollToRowAtIndexPath:lastRow atScrollPosition:UITableViewScrollPositionBottom animated:NO]; } self.firstUnread = nil; } }]; } } } -(void) refreshControlActivated { NSMutableDictionary *refreshedParams = [self.params mutableCopy]; refreshedParams[@"before_mid"] = nil; refreshedParams[@"to"] = nil; self.params = refreshedParams; [self refreshData]; } -(BOOL) isAtTop:(NSDictionary *)params { return [params objectForKey:@"before_mid"] == nil && [params objectForKey:@"to"] == nil; } - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } - (void)viewDidLoad { [super viewDidLoad]; [self.view setBackgroundColor:[UIColor colorNamed:@"Background"]]; [self.tableView registerNib:[UINib nibWithNibName:@"MessageCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:messageCellIdentifier]; [self.tableView registerNib:[UINib nibWithNibName:@"ContentLoadingCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"contentLoadingCell"]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 500.0f; if (!self.messages) { self.messages = [NSMutableArray array]; } #if !TARGET_OS_MACCATALYST self.refreshControl = [UIRefreshControl new]; [self.refreshControl addTarget:self action:@selector(refreshControlActivated) forControlEvents:UIControlEventValueChanged]; #endif [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newMessage:) name:NewMessageNotificationName object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationActivated) name:UIApplicationDidBecomeActiveNotification object:nil]; [self refreshData]; } - (void) composePressed { } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataLoading && self.messages.count == 0 ? 4 : self.messages.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.dataLoading && self.messages.count == 0) { return [tableView dequeueReusableCellWithIdentifier:@"contentLoadingCell"]; } else { Message *msg = [self.messages objectAtIndex:indexPath.row]; MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:messageCellIdentifier forIndexPath:indexPath]; [cell configureWithMessage:msg selectable:self.shouldAllowToSelectText]; return cell; } } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return self.dataLoading && self.messages.count == 0 ? 200.0f : [super tableView:tableView heightForRowAtIndexPath:indexPath]; } -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Message *msg = [self.messages objectAtIndex:indexPath.row]; [self viewThreadForMessage:msg mid:msg.mid scrollTo:0]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { /* if ([segue.identifier isEqual: @"profileSegue"]) { BlogViewController *blogVC = (BlogViewController *)segue.destinationViewController; [blogVC setUname:self.selectedUser]; [blogVC setTitle:self.selectedUser]; blogVC.path = [NSString stringWithFormat:@"/messages?uname=%@", self.selectedUser]; [blogVC setShouldScrollToBottomOnRefresh:NO]; }*/ } -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView_ { CGFloat actualPosition = scrollView_.contentOffset.y; CGFloat contentHeight = scrollView_.contentSize.height - scrollView_.contentSize.height / 2; if (actualPosition >= contentHeight && !self.dataLoading && ![self.tableView isTracking]) { [_messagesDelegate loadMore]; } } -(void) viewThreadForMessage:(Message *)msg mid:(NSNumber *)mid scrollTo:(NSNumber *)rid { [[AppDelegate shared] presentThread:self]; } -(void) newMessage:(NSNotification *)obj { Message *msg = (Message *)[obj object]; [self viewThreadForMessage:msg mid:msg.mid scrollTo:0]; } - (void)applicationActivated { if (!self.initialDataLoaded) { [self refreshData]; } } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil]; } @end