diff options
author | Vitaly Takmazov | 2017-12-09 23:47:30 +0300 |
---|---|---|
committer | Vitaly Takmazov | 2017-12-09 23:47:30 +0300 |
commit | a38541e14ecfea8e37c80755fb3b2ef25cd81272 (patch) | |
tree | 3b26f5e4f86a4eb103193535abf7f9b15e0e67e6 | |
parent | e2ac87809468e9487389e5d22ab9766996898478 (diff) |
working post/reply
-rw-r--r-- | Juick/APIClient.h | 1 | ||||
-rw-r--r-- | Juick/APIClient.m | 20 | ||||
-rw-r--r-- | Juick/Main.storyboard | 12 | ||||
-rw-r--r-- | Juick/Supporting Files/Juick-Info.plist | 2 | ||||
-rw-r--r-- | Juick/ViewControllers/MessagesViewController.h | 3 | ||||
-rw-r--r-- | Juick/ViewControllers/MessagesViewController.m | 16 | ||||
-rw-r--r-- | Juick/ViewControllers/NewPostViewController.h | 6 | ||||
-rw-r--r-- | Juick/ViewControllers/NewPostViewController.m | 45 | ||||
-rw-r--r-- | Juick/ViewControllers/ThreadViewController.m | 63 | ||||
-rw-r--r-- | Juick/Views/MessageCell.xib | 4 | ||||
-rw-r--r-- | Juick/Views/MessageInputView.h | 2 | ||||
-rw-r--r-- | 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<AFMultipartFormData> _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 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <prototypes> - <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="messageCell" id="6fG-tI-4kH"> + <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="messageCell" id="6fG-tI-4kH"> <rect key="frame" x="0.0" y="28" width="375" height="44"/> <autoresizingMask key="autoresizingMask"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="6fG-tI-4kH" id="ifl-hK-faj"> - <rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/> + <rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/> <autoresizingMask key="autoresizingMask"/> </tableViewCellContentView> + <connections> + <segue destination="rr1-jx-MLx" kind="push" identifier="replySegue" id="gw8-QZ-Hrt"/> + </connections> </tableViewCell> </prototypes> <connections> @@ -58,7 +61,7 @@ </tableViewController> <placeholder placeholderIdentifier="IBFirstResponder" id="woP-g5-FaQ" userLabel="First Responder" sceneMemberID="firstResponder"/> </objects> - <point key="canvasLocation" x="-671" y="-958"/> + <point key="canvasLocation" x="-223" y="-1072"/> </scene> <!--Discover--> <scene sceneID="uvH-u9-x7X"> @@ -308,4 +311,7 @@ <image name="chats_icon" width="20" height="22"/> <image name="profile_icon" width="16" height="20"/> </resources> + <inferredMetricsTieBreakers> + <segue reference="gw8-QZ-Hrt"/> + </inferredMetricsTieBreakers> </document> 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 @@ <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> - <string>1.0.31</string> + <string>1.0.32</string> <key>ITSAppUsesNonExemptEncryption</key> <false/> <key>LSApplicationCategoryType</key> 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 <UIKit/UIKit.h> +#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 @@ <?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"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" 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"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> 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 @@ <?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"> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" 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"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> @@ -19,64 +19,26 @@ <rect key="frame" x="0.0" y="0.0" width="368" height="90"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> - <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="6" translatesAutoresizingMaskIntoConstraints="NO" id="3Wb-84-dcd"> + <label opaque="NO" userInteractionEnabled="NO" contentMode="left" verticalHuggingPriority="251" verticalCompressionResistancePriority="248" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontForContentSizeCategory="YES" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Swn-59-jWb"> <rect key="frame" x="6" y="6" width="356" height="78"/> - <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="356" height="34"/> - <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="40" width="356" 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="244" 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="312" 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> + <fontDescription key="fontDescription" style="UICTFontTextStyleBody"/> + <nil key="textColor"/> + <nil key="highlightedColor"/> + </label> </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"/> + <constraint firstItem="Swn-59-jWb" firstAttribute="leading" secondItem="ZiU-Ll-9jB" secondAttribute="leading" constant="6" id="nTb-2n-vCy"/> + <constraint firstItem="ZiU-Ll-9jB" firstAttribute="bottom" secondItem="Swn-59-jWb" secondAttribute="bottom" constant="6" id="snn-zN-hrV"/> + <constraint firstItem="ZiU-Ll-9jB" firstAttribute="trailing" secondItem="Swn-59-jWb" secondAttribute="trailing" constant="6" id="tyN-OL-Y06"/> + <constraint firstItem="Swn-59-jWb" firstAttribute="top" secondItem="ZiU-Ll-9jB" secondAttribute="top" constant="6" id="vVV-Yt-s8Q"/> </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="-229" y="9"/> + <point key="canvasLocation" x="-433" y="56"/> </visualEffectView> </objects> </document> |