diff options
-rw-r--r-- | Juick.xcodeproj/project.pbxproj | 10 | ||||
-rw-r--r-- | Juick/APIClient.h | 1 | ||||
-rw-r--r-- | Juick/APIClient.m | 15 | ||||
-rw-r--r-- | Juick/ViewControllers/MessagesViewController.m | 2 | ||||
-rw-r--r-- | Juick/ViewControllers/ThreadViewController.h | 3 | ||||
-rw-r--r-- | Juick/ViewControllers/ThreadViewController.m | 31 | ||||
-rw-r--r-- | Juick/Views/MessageInputView.h | 15 | ||||
-rw-r--r-- | Juick/Views/MessageInputView.m | 13 | ||||
-rw-r--r-- | Juick/Views/MessageInputView.xib | 82 |
9 files changed, 161 insertions, 11 deletions
diff --git a/Juick.xcodeproj/project.pbxproj b/Juick.xcodeproj/project.pbxproj index 38a14a7..2708a64 100644 --- a/Juick.xcodeproj/project.pbxproj +++ b/Juick.xcodeproj/project.pbxproj @@ -46,6 +46,8 @@ 77C6ADDE1F770EB2000AEA8C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 77C6ADDD1F770EB2000AEA8C /* Main.storyboard */; }; 77C6ADE41F7717BC000AEA8C /* ThreadViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 77C6ADE31F7717BC000AEA8C /* ThreadViewController.m */; }; 77E35A82189A5B5A00B2D216 /* LoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E35A81189A5B5A00B2D216 /* LoginViewController.m */; }; + 77E61A5B1FD467FC00B4E304 /* MessageInputView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 77E61A5A1FD467FC00B4E304 /* MessageInputView.xib */; }; + 77E61A5E1FD4682B00B4E304 /* MessageInputView.m in Sources */ = {isa = PBXBuildFile; fileRef = 77E61A5D1FD4682B00B4E304 /* MessageInputView.m */; }; 77FCADDF1D6A50DA00CBA649 /* APIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 77FCADDE1D6A50DA00CBA649 /* APIClient.m */; }; /* End PBXBuildFile section */ @@ -119,6 +121,9 @@ 77C6ADE31F7717BC000AEA8C /* ThreadViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ThreadViewController.m; sourceTree = "<group>"; }; 77E35A80189A5B5A00B2D216 /* LoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LoginViewController.h; sourceTree = "<group>"; }; 77E35A81189A5B5A00B2D216 /* LoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LoginViewController.m; sourceTree = "<group>"; }; + 77E61A5A1FD467FC00B4E304 /* MessageInputView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MessageInputView.xib; sourceTree = "<group>"; }; + 77E61A5C1FD4682B00B4E304 /* MessageInputView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MessageInputView.h; sourceTree = "<group>"; }; + 77E61A5D1FD4682B00B4E304 /* MessageInputView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MessageInputView.m; sourceTree = "<group>"; }; 77FCADDE1D6A50DA00CBA649 /* APIClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APIClient.m; sourceTree = "<group>"; }; 77FCADE01D6A50EC00CBA649 /* APIClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APIClient.h; sourceTree = "<group>"; }; 9FF4AA695CB46B0E7AED628D /* Pods_JuickTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_JuickTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -303,6 +308,9 @@ 776C41BA1FD3EF180063B82E /* MessageCell.h */, 776C41BB1FD3EF180063B82E /* MessageCell.m */, 776C41BC1FD3EF180063B82E /* MessageCell.xib */, + 77E61A5A1FD467FC00B4E304 /* MessageInputView.xib */, + 77E61A5C1FD4682B00B4E304 /* MessageInputView.h */, + 77E61A5D1FD4682B00B4E304 /* MessageInputView.m */, ); path = Views; sourceTree = "<group>"; @@ -414,6 +422,7 @@ 773F231C1F76DD0B00B5B0DF /* SerpentineBoldItalic.ttf in Resources */, 77317BB6181BBE8500D60005 /* InfoPlist.strings in Resources */, 773F23331F76ECAC00B5B0DF /* LaunchScreen.storyboard in Resources */, + 77E61A5B1FD467FC00B4E304 /* MessageInputView.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -516,6 +525,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 77E61A5E1FD4682B00B4E304 /* MessageInputView.m in Sources */, 77317BBC181BBE8500D60005 /* AppDelegate.m in Sources */, 776C41C11FD3FF6E0063B82E /* DiscoverViewController.m in Sources */, 77FCADDF1D6A50DA00CBA649 /* APIClient.m in Sources */, diff --git a/Juick/APIClient.h b/Juick/APIClient.h index 8c6e024..ca511a5 100644 --- a/Juick/APIClient.h +++ b/Juick/APIClient.h @@ -14,6 +14,7 @@ +(APIClient *) sharedClient; -(void) pullNextFromPath:(NSString *)path params:(NSDictionary *)params callback:(void(^)(NSArray *, NSError *))callback; +-(void) postReplyToThread:(NSNumber *)mid inReplyTo:(NSNumber *)rid text:(NSString *)text; +(NSString *) messagesUrl; +(NSString *) threadUrl; diff --git a/Juick/APIClient.m b/Juick/APIClient.m index beace7c..ca894d4 100644 --- a/Juick/APIClient.m +++ b/Juick/APIClient.m @@ -52,6 +52,21 @@ }); } +-(void) postReplyToThread:(NSNumber *)mid inReplyTo:(NSNumber *)rid text:(NSString *)text { + AFHTTPSessionManager *manager = [APIClient sharedClient].manager; + NSOperationQueue *operationQueue = [NSOperationQueue new]; + [operationQueue addOperationWithBlock:^{ + [manager POST:@"/post" parameters: + @{ + @"mid": mid, + @"rid": rid, + @"body": text + } progress:nil success:nil failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + NSLog(@"Errrorrr: %@", [error localizedDescription]); + }]; + }]; +} + +(NSString *) messagesUrl { return @"/messages"; diff --git a/Juick/ViewControllers/MessagesViewController.m b/Juick/ViewControllers/MessagesViewController.m index 5a5a794..71f4271 100644 --- a/Juick/ViewControllers/MessagesViewController.m +++ b/Juick/ViewControllers/MessagesViewController.m @@ -117,7 +117,7 @@ if (lastMsg != nil) { NSNumber *lastMid = lastMsg.mid; if (![self.path isEqualToString:[APIClient threadUrl]]) { - [self.params setObject:lastMid forKey:@"before_mid"]; + self.params = [@{@"before_mid":lastMid} mutableCopy]; } [self refreshData]; } diff --git a/Juick/ViewControllers/ThreadViewController.h b/Juick/ViewControllers/ThreadViewController.h index 484e2fb..a9c5259 100644 --- a/Juick/ViewControllers/ThreadViewController.h +++ b/Juick/ViewControllers/ThreadViewController.h @@ -8,7 +8,6 @@ #import <UIKit/UIKit.h> #include "MessagesViewController.h" -@import PHFComposeBarView; -@interface ThreadViewController : MessagesViewController<PHFComposeBarViewDelegate> +@interface ThreadViewController : MessagesViewController @end diff --git a/Juick/ViewControllers/ThreadViewController.m b/Juick/ViewControllers/ThreadViewController.m index 4de0cab..2b0d3c4 100644 --- a/Juick/ViewControllers/ThreadViewController.m +++ b/Juick/ViewControllers/ThreadViewController.m @@ -9,13 +9,15 @@ #import "ThreadViewController.h" #import "ColorScheme.h" #import "MessageCell.h" -@import PHFComposeBarView; +#import "MessageInputView.h" +#import "APIClient.h" @interface ThreadViewController () @property (nonatomic, readwrite, retain) UIView *inputAccessoryView; -(void) updateQuoteText:(Message *)message; +@property NSNumber *replyTo; @end @@ -23,6 +25,9 @@ - (void)viewDidLoad { [super viewDidLoad]; + self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive; + + _replyTo = @(0); } @@ -32,26 +37,36 @@ - (UIView *)inputAccessoryView { if (!_inputAccessoryView) { - CGRect viewBounds = self.view.bounds; - CGRect frame = CGRectMake(0, viewBounds.size.height - PHFComposeBarViewInitialHeight - self.view.safeAreaInsets.top + self.view.safeAreaInsets.bottom, viewBounds.size.width, PHFComposeBarViewInitialHeight); - PHFComposeBarView *inputView = [[PHFComposeBarView alloc] initWithFrame:frame]; - inputView.backgroundColor = [UIColor whiteColor]; + 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.delegate = self;*/ + inputView.autoresizingMask = UIViewAutoresizingFlexibleHeight; + [inputView.sendButton addTarget:self action:@selector(sendReply) forControlEvents:UIControlEventTouchUpInside]; _inputAccessoryView = inputView; } return _inputAccessoryView; } -(void) updateQuoteText:(Message *)message { - /*MessageInputView *inputView = (MessageInputView *)self.inputAccessoryView; - inputView.quoteText.text = message.text;*/ + MessageInputView *inputView = (MessageInputView *)self.inputAccessoryView; + inputView.quoteText.text = message.text; + [inputView.contentView setNeedsUpdateConstraints]; + [inputView.contentView updateConstraintsIfNeeded]; + [inputView.contentView setNeedsLayout]; + [inputView.contentView layoutIfNeeded]; +} +-(void) sendReply { + MessageInputView *inputView = (MessageInputView *)self.inputAccessoryView; + Message *msg = [self.messages firstObject]; + [[APIClient sharedClient] postReplyToThread:msg.mid inReplyTo:self.replyTo text:inputView.textContent.text]; } -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Message * selectedMessage = [self.messages objectAtIndex:indexPath.row]; + _replyTo = selectedMessage.rid; [self updateQuoteText:selectedMessage]; } diff --git a/Juick/Views/MessageInputView.h b/Juick/Views/MessageInputView.h new file mode 100644 index 0000000..46919b4 --- /dev/null +++ b/Juick/Views/MessageInputView.h @@ -0,0 +1,15 @@ +// +// MessageInputView.h +// Juick +// +// Created by Vitaly Takmazov on 03/12/2017. +// Copyright © 2017 com.juick. All rights reserved. +// + +#import <UIKit/UIKit.h> + +@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.m b/Juick/Views/MessageInputView.m new file mode 100644 index 0000000..147a508 --- /dev/null +++ b/Juick/Views/MessageInputView.m @@ -0,0 +1,13 @@ +// +// MessageInputView.m +// Juick +// +// Created by Vitaly Takmazov on 03/12/2017. +// Copyright © 2017 com.juick. All rights reserved. +// + +#import "MessageInputView.h" +@implementation MessageInputView + + +@end diff --git a/Juick/Views/MessageInputView.xib b/Juick/Views/MessageInputView.xib new file mode 100644 index 0000000..54ba547 --- /dev/null +++ b/Juick/Views/MessageInputView.xib @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13529" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait"> + <adaptation id="fullscreen"/> + </device> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13527"/> + <capability name="Safe area layout guides" minToolsVersion="9.0"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> + <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> + <visualEffectView opaque="NO" contentMode="scaleToFill" id="8gV-Bq-kOk" customClass="MessageInputView"> + <rect key="frame" x="0.0" y="0.0" width="604" height="87"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" id="imu-GT-9JL"> + <rect key="frame" x="0.0" y="0.0" width="604" height="87"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> + <subviews> + <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="3Wb-84-dcd"> + <rect key="frame" x="6" y="6" width="592" height="75"/> + <subviews> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" verticalCompressionResistancePriority="248" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Swn-59-jWb"> + <rect key="frame" x="0.0" y="0.0" width="592" height="31"/> + <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> + <stackView opaque="NO" contentMode="scaleToFill" verticalCompressionResistancePriority="749" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="e2q-59-qlo"> + <rect key="frame" x="0.0" y="37" width="592" height="38"/> + <subviews> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="infoLight" showsTouchWhenHighlighted="YES" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ZXm-ce-xjB"> + <rect key="frame" x="0.0" y="0.0" width="44" height="38"/> + <constraints> + <constraint firstAttribute="width" constant="44" id="chf-2p-LxF"/> + </constraints> + </button> + <textView multipleTouchEnabled="YES" contentMode="scaleToFill" horizontalHuggingPriority="252" horizontalCompressionResistancePriority="749" scrollEnabled="NO" keyboardDismissMode="interactive" textAlignment="natural" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="alc-Oi-DBv"> + <rect key="frame" x="56" y="0.0" width="480" height="38"/> + <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> + <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> + <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/> + <userDefinedRuntimeAttributes> + <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius"> + <integer key="value" value="5"/> + </userDefinedRuntimeAttribute> + <userDefinedRuntimeAttribute type="boolean" keyPath="layer.clipsToBounds" value="YES"/> + </userDefinedRuntimeAttributes> + </textView> + <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="9h3-lP-1PC"> + <rect key="frame" x="548" y="0.0" width="44" height="38"/> + <constraints> + <constraint firstAttribute="width" constant="44" id="QvX-xP-ypC"/> + </constraints> + <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> + <state key="normal" title="Send"/> + </button> + </subviews> + </stackView> + </subviews> + </stackView> + </subviews> + <constraints> + <constraint firstItem="ZiU-Ll-9jB" firstAttribute="bottom" secondItem="3Wb-84-dcd" secondAttribute="bottom" constant="6" id="6la-q5-7Uo"/> + <constraint firstItem="3Wb-84-dcd" firstAttribute="top" secondItem="ZiU-Ll-9jB" secondAttribute="top" constant="6" id="ibK-wT-80X"/> + <constraint firstItem="ZiU-Ll-9jB" firstAttribute="trailing" secondItem="3Wb-84-dcd" secondAttribute="trailing" constant="6" id="wBb-3j-nHr"/> + <constraint firstItem="3Wb-84-dcd" firstAttribute="leading" secondItem="ZiU-Ll-9jB" secondAttribute="leading" constant="6" id="wM0-uw-QAg"/> + </constraints> + <viewLayoutGuide key="safeArea" id="ZiU-Ll-9jB"/> + </view> + <blurEffect style="light"/> + <connections> + <outlet property="quoteText" destination="Swn-59-jWb" id="tky-lv-tWn"/> + <outlet property="sendButton" destination="9h3-lP-1PC" id="9a8-ZV-jcJ"/> + <outlet property="textContent" destination="alc-Oi-DBv" id="PqQ-aJ-Unr"/> + </connections> + <point key="canvasLocation" x="213" y="82.5"/> + </visualEffectView> + </objects> +</document> |