From a38541e14ecfea8e37c80755fb3b2ef25cd81272 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Sat, 9 Dec 2017 23:47:30 +0300 Subject: working post/reply --- Juick/APIClient.h | 1 + Juick/APIClient.m | 20 ++++++++ Juick/Main.storyboard | 12 +++-- Juick/Supporting Files/Juick-Info.plist | 2 +- Juick/ViewControllers/MessagesViewController.h | 3 +- Juick/ViewControllers/MessagesViewController.m | 16 +++++-- Juick/ViewControllers/NewPostViewController.h | 6 +++ Juick/ViewControllers/NewPostViewController.m | 45 ++++++++++++++++-- Juick/ViewControllers/ThreadViewController.m | 63 ++++---------------------- Juick/Views/MessageCell.xib | 4 +- Juick/Views/MessageInputView.h | 2 - Juick/Views/MessageInputView.xib | 62 +++++-------------------- 12 files changed, 117 insertions(+), 119 deletions(-) diff --git a/Juick/APIClient.h b/Juick/APIClient.h index 9347da9..a20998a 100644 --- a/Juick/APIClient.h +++ b/Juick/APIClient.h @@ -15,6 +15,7 @@ +(APIClient *) sharedClient; -(void) pullNextFromPath:(NSString *)path params:(NSDictionary *)params callback:(void(^)(NSArray *, NSError *))callback; +-(void) postMessage:(NSString *)text result:(void(^)(Message *, NSError *))callback; -(void) postReplyToThread:(NSNumber *)mid inReplyTo:(NSNumber *)rid text:(NSString *)text result:(void(^)(Message *, NSError *))callback; +(NSString *) messagesUrl; diff --git a/Juick/APIClient.m b/Juick/APIClient.m index abefa40..ecaf536 100644 --- a/Juick/APIClient.m +++ b/Juick/APIClient.m @@ -57,6 +57,26 @@ }]; } +-(void) postMessage:(NSString *)text result:(void (^)(Message *, NSError *))callback { + AFHTTPSessionManager *manager = [APIClient sharedClient].manager; + [self.backgroundQueue addOperationWithBlock:^{ + [manager POST:@"/post" parameters:nil constructingBodyWithBlock:^(id _Nonnull formData) { + [formData appendPartWithFormData:[text dataUsingEncoding:NSUTF8StringEncoding] name:@"body"]; + } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + NSLog(@"Success!"); + Message *result = [Message yy_modelWithJSON:responseObject]; + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + callback(result, nil); + }]; + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + NSLog(@"Error: %@", [error localizedDescription]); + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + callback(nil, error); + }]; + }]; + }]; +} + -(void) postReplyToThread:(NSNumber *)mid inReplyTo:(NSNumber *)rid text:(NSString *)text result:(void(^)(Message *, NSError *))callback { AFHTTPSessionManager *manager = [APIClient sharedClient].manager; [self.backgroundQueue addOperationWithBlock:^{ diff --git a/Juick/Main.storyboard b/Juick/Main.storyboard index 5f3c1ce..71391a9 100644 --- a/Juick/Main.storyboard +++ b/Juick/Main.storyboard @@ -40,13 +40,16 @@ - + - + + + + @@ -58,7 +61,7 @@ - + @@ -308,4 +311,7 @@ + + + diff --git a/Juick/Supporting Files/Juick-Info.plist b/Juick/Supporting Files/Juick-Info.plist index 1415672..b3cfda5 100644 --- a/Juick/Supporting Files/Juick-Info.plist +++ b/Juick/Supporting Files/Juick-Info.plist @@ -21,7 +21,7 @@ CFBundleSignature ???? CFBundleVersion - 1.0.31 + 1.0.32 ITSAppUsesNonExemptEncryption LSApplicationCategoryType diff --git a/Juick/ViewControllers/MessagesViewController.h b/Juick/ViewControllers/MessagesViewController.h index 7f5f274..548f8ec 100644 --- a/Juick/ViewControllers/MessagesViewController.h +++ b/Juick/ViewControllers/MessagesViewController.h @@ -11,7 +11,8 @@ @interface MessagesViewController : UITableViewController @property(nonatomic, strong) NSString *path; @property(nonatomic, strong) NSMutableDictionary *params; -- (void) refreshData; +-(void) refreshData; +-(void) refreshData:(BOOL)scrollToBottom; @property(nonatomic, strong) NSMutableArray *messages; @property(nonatomic, assign) Boolean dataLoading; diff --git a/Juick/ViewControllers/MessagesViewController.m b/Juick/ViewControllers/MessagesViewController.m index 80e8c73..823d838 100644 --- a/Juick/ViewControllers/MessagesViewController.m +++ b/Juick/ViewControllers/MessagesViewController.m @@ -23,7 +23,11 @@ @implementation MessagesViewController -- (void) refreshData { +-(void) refreshData { + [self refreshData:NO]; +} + +-(void) refreshData:(BOOL)scrollToBottom { self.dataLoading = YES; [[APIClient sharedClient] pullNextFromPath:self.path params:self.params callback:^(NSArray *next, NSError *err) { NSArray *newMsgs = next; @@ -49,6 +53,10 @@ [self.tableView endUpdates]; [self.refreshControl endRefreshing]; self.dataLoading = NO; + if (scrollToBottom) { + NSIndexPath *lastRow = [NSIndexPath indexPathForRow:self.messages.count - 1 inSection:0]; + [self.tableView scrollToRowAtIndexPath:lastRow atScrollPosition:UITableViewScrollPositionBottom animated:YES]; + } }]; } @@ -75,7 +83,7 @@ if ([self.path length] == 0) { self.path = [APIClient feedUrl]; } - [self refreshData]; + [self refreshData:NO]; } else { [User throwUnableToLogin:self]; } @@ -85,7 +93,7 @@ if ([self.path length] == 0) { self.path = [APIClient messagesUrl]; } - [self refreshData]; + [self refreshData:NO]; } } @@ -119,7 +127,7 @@ if (![self.path isEqualToString:[APIClient threadUrl]]) { self.params = [@{@"before_mid":lastMid} mutableCopy]; } - [self refreshData]; + [self refreshData:NO]; } } } diff --git a/Juick/ViewControllers/NewPostViewController.h b/Juick/ViewControllers/NewPostViewController.h index 3d4ba88..7a1dfac 100644 --- a/Juick/ViewControllers/NewPostViewController.h +++ b/Juick/ViewControllers/NewPostViewController.h @@ -7,8 +7,14 @@ // #import +#import "Message.h" @interface NewPostViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextView *textView; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint; + +@property (strong, nonatomic) NSString *draft; + +@property (strong, nonatomic) Message *replyTo; + @end diff --git a/Juick/ViewControllers/NewPostViewController.m b/Juick/ViewControllers/NewPostViewController.m index 9643b78..8a9bc0e 100644 --- a/Juick/ViewControllers/NewPostViewController.m +++ b/Juick/ViewControllers/NewPostViewController.m @@ -7,13 +7,18 @@ // #import "NewPostViewController.h" +#import "MessagesViewController.h" #import "ColorScheme.h" +#import "MessageInputView.h" +#import "APIClient.h" @interface NewPostViewController () @property (nonatomic, assign) BOOL didSetupConstraints; @property (nonatomic, assign) int paddingValue; +@property (nonatomic, readwrite, retain) UIView *inputAccessoryView; + @end @implementation NewPostViewController @@ -21,8 +26,14 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.navigationController.visibleViewController.title = @"Post"; - self.navigationController.visibleViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + if (_replyTo != nil) { + MessageInputView *inputView = (MessageInputView *) self.inputAccessoryView; + inputView.quoteText.text = _replyTo.text; + self.navigationController.visibleViewController.title = [NSString stringWithFormat:@"Reply to %@", _replyTo.user.uname]; + } else { + self.navigationController.visibleViewController.title = @"Post"; + } + self.navigationController.visibleViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelCompose)]; self.navigationController.visibleViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(doneCompose)]; @@ -37,7 +48,19 @@ } - (void) doneCompose { - [self.navigationController.visibleViewController.navigationController popToRootViewControllerAnimated:YES]; + if (_replyTo == nil) { + [[APIClient sharedClient] postMessage:self.textView.text result:^(Message *msg, NSError *err) { + [self.navigationController.visibleViewController.navigationController popViewControllerAnimated:YES]; + MessagesViewController *target = (MessagesViewController *)self.navigationController.visibleViewController; + [target refreshData:YES]; + }]; + } else { + [[APIClient sharedClient] postReplyToThread:_replyTo.mid inReplyTo:_replyTo.rid text:self.textView.text result:^(Message *msg, NSError *err) { + [self.navigationController.visibleViewController.navigationController popViewControllerAnimated:YES]; + MessagesViewController *target = (MessagesViewController *)self.navigationController.visibleViewController; + [target refreshData:YES]; + }]; + } } -(void) keyboardDidShow:(NSNotification *)sender { @@ -53,4 +76,20 @@ self.bottomConstraint.constant = self.paddingValue; [self.view layoutIfNeeded]; } + +-(BOOL) canBecomeFirstResponder { + return YES; +} + +- (UIView *) inputAccessoryView { + if (!_inputAccessoryView) { + MessageInputView *inputView = (MessageInputView *)[[[NSBundle mainBundle] loadNibNamed:@"MessageInputView" owner:self options:nil] firstObject]; + inputView.autoresizingMask = UIViewAutoresizingFlexibleHeight; + inputView.quoteText.text = self.replyTo.text; + _inputAccessoryView = inputView; + } + return _inputAccessoryView; +} + + @end diff --git a/Juick/ViewControllers/ThreadViewController.m b/Juick/ViewControllers/ThreadViewController.m index 06cbf9a..8cb2cb5 100644 --- a/Juick/ViewControllers/ThreadViewController.m +++ b/Juick/ViewControllers/ThreadViewController.m @@ -7,70 +7,27 @@ // #import "ThreadViewController.h" -#import "ColorScheme.h" +#import "NewPostViewController.h" #import "MessageCell.h" -#import "MessageInputView.h" -#import "APIClient.h" @interface ThreadViewController () -@property (nonatomic, readwrite, retain) UIView *inputAccessoryView; - --(void) updateQuoteText:(Message *)message; -@property NSNumber *replyTo; - @end @implementation ThreadViewController -- (void)viewDidLoad { - [super viewDidLoad]; - self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; - - _replyTo = @(0); -} - - -- (BOOL) canBecomeFirstResponder { - return YES; +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + NSString * cellIdentifier = @"messageCell"; + MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; + [self performSegueWithIdentifier:@"replySegue" sender:cell]; } -- (UIView *)inputAccessoryView { - if (!_inputAccessoryView) { - MessageInputView *inputView = (MessageInputView *)[[[NSBundle mainBundle] loadNibNamed:@"MessageInputView" owner:self options:nil] firstObject]; - /*inputView.backgroundColor = [UIColor whiteColor]; - inputView.buttonTintColor = [ColorScheme linkColor]; - inputView.maxLinesCount = 4; - inputView.utilityButtonImage = [UIImage imageNamed:@"Camera"]; - inputView.delegate = self;*/ - inputView.autoresizingMask = UIViewAutoresizingFlexibleHeight; - [inputView.sendButton addTarget:self action:@selector(sendReply) forControlEvents:UIControlEventTouchUpInside]; - _inputAccessoryView = inputView; +-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + if ([segue.identifier isEqual: @"replySegue"]) { + Message *msg = [self.messages objectAtIndex:[self.tableView indexPathForSelectedRow].row]; + NewPostViewController *postVC = (NewPostViewController *)segue.destinationViewController; + [postVC setReplyTo:msg]; } - return _inputAccessoryView; -} - --(void) updateQuoteText:(Message *)message { - MessageInputView *inputView = (MessageInputView *)self.inputAccessoryView; - inputView.quoteText.text = message.text; - [inputView.textContent becomeFirstResponder]; -} --(void) sendReply { - MessageInputView *inputView = (MessageInputView *)self.inputAccessoryView; - Message *msg = [self.messages firstObject]; - [[APIClient sharedClient] postReplyToThread:msg.mid inReplyTo:self.replyTo text:inputView.textContent.text result:^(Message *msg, NSError *err) { - MessageInputView *inputView = (MessageInputView *)self.inputAccessoryView; - inputView.quoteText.text = @""; - inputView.textContent.text = @""; - [inputView.textContent endEditing:YES]; - [self refreshData]; - }]; -} - --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - Message * selectedMessage = [self.messages objectAtIndex:indexPath.row]; - _replyTo = selectedMessage.rid; - [self updateQuoteText:selectedMessage]; } @end diff --git a/Juick/Views/MessageCell.xib b/Juick/Views/MessageCell.xib index d5fcab0..2216ef4 100644 --- a/Juick/Views/MessageCell.xib +++ b/Juick/Views/MessageCell.xib @@ -1,11 +1,11 @@ - + - + diff --git a/Juick/Views/MessageInputView.h b/Juick/Views/MessageInputView.h index 46919b4..cfdcea6 100644 --- a/Juick/Views/MessageInputView.h +++ b/Juick/Views/MessageInputView.h @@ -10,6 +10,4 @@ @interface MessageInputView : UIVisualEffectView @property (weak, nonatomic) IBOutlet UILabel *quoteText; -@property (weak, nonatomic) IBOutlet UIButton *sendButton; -@property (weak, nonatomic) IBOutlet UITextView *textContent; @end diff --git a/Juick/Views/MessageInputView.xib b/Juick/Views/MessageInputView.xib index 2245927..125956d 100644 --- a/Juick/Views/MessageInputView.xib +++ b/Juick/Views/MessageInputView.xib @@ -1,11 +1,11 @@ - + - + @@ -19,64 +19,26 @@ - + + + + + - - - - + + + + - - - + -- cgit v1.2.3