// // 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 "APIClient.h" #import "Message.h" #import "ColorScheme.h" #import "NewPostViewController.h" #import "LoginViewController.h" #import "ThreadViewController.h" #import "NSURL+PathParameters.h" @interface MessagesViewController () @property(nonatomic, strong) NSMutableArray *messages; @property(nonatomic, assign) Boolean dataLoading; @end @implementation MessagesViewController - (void) refreshData { self.dataLoading = YES; [[APIClient sharedClient] pullNextFromPath:self.path params:self.params callback:^(NSArray *next, NSError *err) { NSArray *newMsgs = next; NSUInteger oldCount = [self.messages count]; if ([self.path isEqualToString:[APIClient threadUrl]]) { NSUInteger lastRid = [((Message *)[self.messages lastObject]).rid unsignedIntegerValue]; NSUInteger count = [next count] - 1; if (oldCount > 0) { if (lastRid && lastRid < count) { newMsgs = [next subarrayWithRange:NSMakeRange(lastRid, count - lastRid)]; } else { return; } } } [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:YES]; [self.tableView endUpdates]; [self.refreshControl endRefreshing]; self.dataLoading = NO; }]; } - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; } - (void)viewDidLoad { [super viewDidLoad]; self.dataLoading = NO; [self.view setBackgroundColor:[ColorScheme mainBackground]]; self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 500.0f; self.messages = [NSMutableArray array]; self.params = [NSMutableDictionary new]; self.refreshControl = [UIRefreshControl new]; [self.refreshControl addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventValueChanged]; if ([User isAuthenticated]) { [User checkIsValid:^(BOOL success) { if (success) { self.path = [APIClient feedUrl]; [self refreshData]; } else { [User throwUnableToLogin:self]; } }]; } else { self.path = [APIClient messagesUrl]; [self refreshData]; } } - (void) composePressed { } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.messages.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { Message *msg = [self.messages objectAtIndex:indexPath.row]; NSString * cellIdentifier = @"messageCell"; MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; [cell configureWithMessage:msg]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if ([self.path isEqualToString:[APIClient threadUrl]]) return; Message *msg = [self.messages objectAtIndex:indexPath.row]; ThreadViewController *threadViewController = [[ThreadViewController alloc] init]; [threadViewController setPath:[APIClient threadUrl]]; [threadViewController setParams:[NSMutableDictionary dictionaryWithObjectsAndKeys:msg.mid, @"mid", nil]]; [self.navigationController pushViewController:threadViewController animated: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]) { Message *lastMsg = [self.messages lastObject]; if (lastMsg != nil) { NSNumber *lastMid = lastMsg.mid; if (![self.path isEqualToString:[APIClient threadUrl]]) { [self.params setObject:lastMid forKey:@"before_mid"]; } [self refreshData]; } } } @end