Commit 7aa2027583dc8d6ca20d372caa8a9ae1ac86714d
1 parent
923306f25e
Exists in
master
and in
1 other branch
Add API get recent tweets list in SNS Screen
Showing 14 changed files with 295 additions and 26 deletions Side-by-side Diff
- LifeLog/LifeLog.xcodeproj/project.pbxproj
- LifeLog/LifeLog/Entities.h
- LifeLog/LifeLog/HistoryViewController.m
- LifeLog/LifeLog/SNSRecentTopicTableViewCell.h
- LifeLog/LifeLog/SNSRecentTopicTableViewCell.xib
- LifeLog/LifeLog/SNSViewController.h
- LifeLog/LifeLog/SNSViewController.m
- LifeLog/LifeLog/ServerAPI.h
- LifeLog/LifeLog/ServerAPI.m
- LifeLog/LifeLog/TweetObject.h
- LifeLog/LifeLog/TweetObject.m
- LifeLog/LifeLog/Utilities.h
- LifeLog/LifeLog/Utilities.m
- LifeLog/Podfile
LifeLog/LifeLog.xcodeproj/project.pbxproj
| ... | ... | @@ -57,6 +57,7 @@ |
| 57 | 57 | E99E13AD1F336F4500C78787 /* CollectionView.xib in Resources */ = {isa = PBXBuildFile; fileRef = E99E13AC1F336F4500C78787 /* CollectionView.xib */; }; |
| 58 | 58 | E99E13B11F33720600C78787 /* LabelCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E99E13AF1F33720600C78787 /* LabelCollectionViewCell.m */; }; |
| 59 | 59 | E99E13B21F33720600C78787 /* LabelCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E99E13B01F33720600C78787 /* LabelCollectionViewCell.xib */; }; |
| 60 | + E9D909211F3D559D004CF99F /* TweetObject.m in Sources */ = {isa = PBXBuildFile; fileRef = E9D909201F3D559D004CF99F /* TweetObject.m */; }; | |
| 60 | 61 | E9F73DCC1F338A0F004A3A6F /* HistoryListTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = E9F73DCA1F338A0F004A3A6F /* HistoryListTableViewCell.m */; }; |
| 61 | 62 | E9F73DCD1F338A0F004A3A6F /* HistoryListTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E9F73DCB1F338A0F004A3A6F /* HistoryListTableViewCell.xib */; }; |
| 62 | 63 | /* End PBXBuildFile section */ |
| ... | ... | @@ -167,6 +168,8 @@ |
| 167 | 168 | E99E13AE1F33720600C78787 /* LabelCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LabelCollectionViewCell.h; sourceTree = "<group>"; }; |
| 168 | 169 | E99E13AF1F33720600C78787 /* LabelCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LabelCollectionViewCell.m; sourceTree = "<group>"; }; |
| 169 | 170 | E99E13B01F33720600C78787 /* LabelCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LabelCollectionViewCell.xib; sourceTree = "<group>"; }; |
| 171 | + E9D9091F1F3D559D004CF99F /* TweetObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TweetObject.h; sourceTree = "<group>"; }; | |
| 172 | + E9D909201F3D559D004CF99F /* TweetObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TweetObject.m; sourceTree = "<group>"; }; | |
| 170 | 173 | E9F73DC91F338A0F004A3A6F /* HistoryListTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HistoryListTableViewCell.h; sourceTree = "<group>"; }; |
| 171 | 174 | E9F73DCA1F338A0F004A3A6F /* HistoryListTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HistoryListTableViewCell.m; sourceTree = "<group>"; }; |
| 172 | 175 | E9F73DCB1F338A0F004A3A6F /* HistoryListTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HistoryListTableViewCell.xib; sourceTree = "<group>"; }; |
| ... | ... | @@ -238,6 +241,8 @@ |
| 238 | 241 | E9373E491F35AA180059355A /* HistoryObject.m */, |
| 239 | 242 | E9373E4B1F361A230059355A /* HistoryGraphObject.h */, |
| 240 | 243 | E9373E4C1F361A230059355A /* HistoryGraphObject.m */, |
| 244 | + E9D9091F1F3D559D004CF99F /* TweetObject.h */, | |
| 245 | + E9D909201F3D559D004CF99F /* TweetObject.m */, | |
| 241 | 246 | ); |
| 242 | 247 | name = Model; |
| 243 | 248 | sourceTree = "<group>"; |
| ... | ... | @@ -727,6 +732,7 @@ |
| 727 | 732 | 6E8DA0F71F2BAC3400CCE941 /* TodayViewController.m in Sources */, |
| 728 | 733 | 6E7F93451F35872B00EFBC71 /* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */, |
| 729 | 734 | E9682E2E1F39675A00FE05A2 /* RankingTableViewCell.m in Sources */, |
| 735 | + E9D909211F3D559D004CF99F /* TweetObject.m in Sources */, | |
| 730 | 736 | 6E48AF0D1F2F9D3300C1D184 /* CustomTextField.m in Sources */, |
| 731 | 737 | E99E13AB1F336F3600C78787 /* CollectionView.m in Sources */, |
| 732 | 738 | 6E84E3B01F27A975001EB88E /* HomeViewController.m in Sources */, |
LifeLog/LifeLog/Entities.h
LifeLog/LifeLog/HistoryViewController.m
| ... | ... | @@ -150,16 +150,19 @@ |
| 150 | 150 | if(self.tableListHistory.alpha == 0.0) { |
| 151 | 151 | [[ServerAPI server] requestHistory:token atDate:_curDate withType:type andMode:mode CompletionHandler:^(HistoryObject *object, NSError *error) { |
| 152 | 152 | HistoryViewController __weak *weakSelf = self; |
| 153 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 154 | + if(hudView != nil) { | |
| 155 | + [hudView hideAnimated:true]; | |
| 156 | + } | |
| 157 | + }); | |
| 153 | 158 | if(error == nil) { |
| 154 | 159 | _curHisObj = object; |
| 155 | 160 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 156 | - [hudView hideAnimated:true]; | |
| 157 | 161 | [weakSelf updateView]; |
| 158 | 162 | }); |
| 159 | 163 | } |
| 160 | 164 | else { |
| 161 | 165 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 162 | - [hudView hideAnimated:true]; | |
| 163 | 166 | NSString *message = [error.userInfo objectForKey:@"message"]; |
| 164 | 167 | [Utilities showErrorMessage:message withViewController:weakSelf]; |
| 165 | 168 | }); |
| 166 | 169 | |
| 167 | 170 | |
| ... | ... | @@ -185,16 +188,19 @@ |
| 185 | 188 | else { |
| 186 | 189 | [[ServerAPI server] requestHistoryList:token withType:type andMode:mode AtPage:1 CompletionHandler:^(NSMutableArray *object, NSError *error) { |
| 187 | 190 | HistoryViewController __weak *weakSelf = self; |
| 191 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 192 | + if(hudView != nil) { | |
| 193 | + [hudView hideAnimated:true]; | |
| 194 | + } | |
| 195 | + }); | |
| 188 | 196 | if(error == nil) { |
| 189 | 197 | _curHisList = object; |
| 190 | 198 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 191 | - [hudView hideAnimated:true]; | |
| 192 | 199 | [weakSelf.tableListHistory reloadData]; |
| 193 | 200 | }); |
| 194 | 201 | } |
| 195 | 202 | else { |
| 196 | 203 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 197 | - [hudView hideAnimated:true]; | |
| 198 | 204 | NSString *message = [error.userInfo objectForKey:@"message"]; |
| 199 | 205 | [Utilities showErrorMessage:message withViewController:weakSelf]; |
| 200 | 206 | }); |
LifeLog/LifeLog/SNSRecentTopicTableViewCell.h
| ... | ... | @@ -12,7 +12,7 @@ |
| 12 | 12 | |
| 13 | 13 | @property (weak, nonatomic) IBOutlet UIImageView *imgAvatar; |
| 14 | 14 | @property (weak, nonatomic) IBOutlet UILabel *lblDateTime; |
| 15 | -@property (weak, nonatomic) IBOutlet UILabel *lblLocation; | |
| 15 | +@property (weak, nonatomic) IBOutlet UILabel *lblUsername; | |
| 16 | 16 | @property (weak, nonatomic) IBOutlet UILabel *lblDes; |
| 17 | 17 | @property (weak, nonatomic) IBOutlet UILabel *lblMode; |
| 18 | 18 | @property (weak, nonatomic) IBOutlet UILabel *lblDistance; |
LifeLog/LifeLog/SNSRecentTopicTableViewCell.xib
| ... | ... | @@ -5,7 +5,6 @@ |
| 5 | 5 | </device> |
| 6 | 6 | <dependencies> |
| 7 | 7 | <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> |
| 8 | - <capability name="Aspect ratio constraints" minToolsVersion="5.1"/> | |
| 9 | 8 | <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> |
| 10 | 9 | </dependencies> |
| 11 | 10 | <objects> |
| 12 | 11 | |
| 13 | 12 | |
| 14 | 13 | |
| ... | ... | @@ -15,14 +14,14 @@ |
| 15 | 14 | <rect key="frame" x="0.0" y="0.0" width="320" height="100"/> |
| 16 | 15 | <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> |
| 17 | 16 | <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM"> |
| 18 | - <rect key="frame" x="0.0" y="0.0" width="320" height="99.5"/> | |
| 17 | + <rect key="frame" x="0.0" y="0.0" width="320" height="100"/> | |
| 19 | 18 | <autoresizingMask key="autoresizingMask"/> |
| 20 | 19 | <subviews> |
| 21 | - <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar_default" translatesAutoresizingMaskIntoConstraints="NO" id="ybP-aK-loM"> | |
| 22 | - <rect key="frame" x="8" y="17.5" width="50" height="65"/> | |
| 20 | + <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar_default" translatesAutoresizingMaskIntoConstraints="NO" id="ybP-aK-loM"> | |
| 21 | + <rect key="frame" x="8" y="10" width="50" height="80"/> | |
| 23 | 22 | <constraints> |
| 24 | - <constraint firstAttribute="width" secondItem="ybP-aK-loM" secondAttribute="height" multiplier="10:13" id="6rL-og-ZNA"/> | |
| 25 | 23 | <constraint firstAttribute="width" constant="50" id="Bkh-J5-a8V"/> |
| 24 | + <constraint firstAttribute="height" constant="80" id="C55-ta-Dpa"/> | |
| 26 | 25 | </constraints> |
| 27 | 26 | </imageView> |
| 28 | 27 | <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Sv2-7A-ngx"> |
| 29 | 28 | |
| ... | ... | @@ -129,8 +128,8 @@ |
| 129 | 128 | <outlet property="lblDes" destination="rfd-Mx-5Wv" id="cHd-S3-6NO"/> |
| 130 | 129 | <outlet property="lblDistance" destination="Qs8-Mr-CzW" id="19w-MP-GTq"/> |
| 131 | 130 | <outlet property="lblDuration" destination="JHq-wA-TUm" id="cKs-J1-eJa"/> |
| 132 | - <outlet property="lblLocation" destination="3XR-JQ-EfG" id="xnZ-Ab-KhF"/> | |
| 133 | 131 | <outlet property="lblMode" destination="w7w-q1-yZi" id="uke-pj-NlL"/> |
| 132 | + <outlet property="lblUsername" destination="3XR-JQ-EfG" id="Enq-ZC-f2b"/> | |
| 134 | 133 | </connections> |
| 135 | 134 | <point key="canvasLocation" x="25" y="113"/> |
| 136 | 135 | </tableViewCell> |
LifeLog/LifeLog/SNSViewController.h
| ... | ... | @@ -8,7 +8,13 @@ |
| 8 | 8 | |
| 9 | 9 | #import <UIKit/UIKit.h> |
| 10 | 10 | |
| 11 | -@interface SNSViewController : UIViewController | |
| 11 | +@interface SNSViewController : UIViewController<UITableViewDelegate, UITableViewDataSource> { | |
| 12 | + BOOL _firstTime; | |
| 13 | + BOOL _isLoading; | |
| 14 | + BOOL _isEndOfResult; | |
| 15 | + int _curPage; | |
| 16 | + NSMutableArray * _curTweetList; | |
| 17 | +} | |
| 12 | 18 | |
| 13 | 19 | @property (weak, nonatomic) IBOutlet UITableView *tableRecent; |
| 14 | 20 |
LifeLog/LifeLog/SNSViewController.m
| ... | ... | @@ -8,6 +8,9 @@ |
| 8 | 8 | |
| 9 | 9 | #import "SNSViewController.h" |
| 10 | 10 | #import "SNSRecentTopicTableViewCell.h" |
| 11 | +#import "ServerAPI.h" | |
| 12 | +#import "Utilities.h" | |
| 13 | +#import <SDWebImage/UIImageView+WebCache.h> | |
| 11 | 14 | |
| 12 | 15 | @interface SNSViewController () |
| 13 | 16 | |
| 14 | 17 | |
| ... | ... | @@ -19,7 +22,14 @@ |
| 19 | 22 | [super viewDidLoad]; |
| 20 | 23 | // Do any additional setup after loading the view from its nib. |
| 21 | 24 | self.title = NSLocalizedString(@"lifelog.tapbar.sns", nil); |
| 25 | + _firstTime = true; | |
| 26 | + _curPage = 1; | |
| 27 | + _isEndOfResult = false; | |
| 22 | 28 | |
| 29 | + _curTweetList = [[NSMutableArray alloc] init]; | |
| 30 | + | |
| 31 | + [self callRequestToUpdateData]; | |
| 32 | + | |
| 23 | 33 | //register nib for table view |
| 24 | 34 | [self.tableRecent registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"]; |
| 25 | 35 | } |
| 26 | 36 | |
| 27 | 37 | |
| 28 | 38 | |
| 29 | 39 | |
| ... | ... | @@ -32,27 +42,97 @@ |
| 32 | 42 | |
| 33 | 43 | #pragma mark UITableView Delegate |
| 34 | 44 | - (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { |
| 35 | - // if(_curHisList == nil || _curHisList.count == 0) { | |
| 36 | - // UILabel * noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)]; | |
| 37 | - // noDataLabel.text = @"No data available"; | |
| 38 | - // noDataLabel.backgroundColor = [UIColor clearColor]; | |
| 39 | - // noDataLabel.textColor = [UIColor whiteColor]; | |
| 40 | - // noDataLabel.textAlignment = NSTextAlignmentCenter; | |
| 41 | - // tableView.backgroundView = noDataLabel; | |
| 42 | - // tableView.backgroundView.layer.zPosition -= 1; | |
| 43 | - // return 0; | |
| 44 | - // } | |
| 45 | - // tableView.backgroundView = nil; | |
| 45 | + if((_curTweetList == nil || _curTweetList.count == 0) && !_firstTime) { | |
| 46 | + UILabel * noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, tableView.frame.size.height)]; | |
| 47 | + noDataLabel.text = @"No data available"; | |
| 48 | + noDataLabel.backgroundColor = [UIColor clearColor]; | |
| 49 | + noDataLabel.textColor = [UIColor whiteColor]; | |
| 50 | + noDataLabel.textAlignment = NSTextAlignmentCenter; | |
| 51 | + tableView.backgroundView = noDataLabel; | |
| 52 | + tableView.backgroundView.layer.zPosition -= 1; | |
| 53 | + return 0; | |
| 54 | + } | |
| 55 | + tableView.backgroundView = nil; | |
| 46 | 56 | return 1; |
| 47 | 57 | } |
| 48 | 58 | |
| 49 | 59 | - (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
| 50 | - return 6; | |
| 60 | + return _curTweetList.count; | |
| 51 | 61 | } |
| 52 | 62 | |
| 53 | -- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 63 | +- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 54 | 64 | SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"]; |
| 65 | + TweetObject *object = [_curTweetList objectAtIndex:indexPath.row]; | |
| 66 | + if(object.avatarLink && ![object.avatarLink isKindOfClass:[NSNull class]]) { | |
| 67 | + [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatarLink]]]; | |
| 68 | + } | |
| 69 | + cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm"]; | |
| 70 | + cell.lblUsername.text = object.userName; | |
| 71 | + cell.lblDes.text = object.content; | |
| 72 | + cell.lblMode.text = object.mode; | |
| 73 | + cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance]; | |
| 74 | + cell.lblDuration.text = object.time; | |
| 55 | 75 | return cell; |
| 76 | +} | |
| 77 | + | |
| 78 | +- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { | |
| 79 | + NSInteger lastRowIndex = [tableView numberOfRowsInSection:0] - 1; | |
| 80 | + if (indexPath.row == lastRowIndex) { | |
| 81 | + // This is the last cell | |
| 82 | + if(!_isLoading) { | |
| 83 | + _curPage += 1; | |
| 84 | + [self callRequestToUpdateData]; | |
| 85 | + } | |
| 86 | + } | |
| 87 | +} | |
| 88 | +#pragma mark Private Function | |
| 89 | + | |
| 90 | +-(void) callRequestToUpdateData { | |
| 91 | + _isLoading = true; | |
| 92 | + NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; | |
| 93 | + MBProgressHUD *hudView = nil; | |
| 94 | + if(_curPage == 1) { | |
| 95 | + hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; | |
| 96 | + } | |
| 97 | + [[ServerAPI server] requestRecentlyTweetsList:token withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){ | |
| 98 | + SNSViewController __weak *weakSelf = self; | |
| 99 | + _isLoading = false; | |
| 100 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 101 | + if(hudView != nil) { | |
| 102 | + [hudView hideAnimated:true]; | |
| 103 | + } | |
| 104 | + }); | |
| 105 | + if(error == nil) { | |
| 106 | + if(_curPage == 1) { | |
| 107 | + [_curTweetList removeAllObjects]; | |
| 108 | + } | |
| 109 | + if(array.count != 0) { | |
| 110 | + [_curTweetList addObjectsFromArray:array]; | |
| 111 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 112 | + [weakSelf.tableRecent reloadData]; | |
| 113 | + }); | |
| 114 | + } | |
| 115 | + else { | |
| 116 | + _isEndOfResult = true; | |
| 117 | + _curPage = MAX(1, _curPage - 1); | |
| 118 | + } | |
| 119 | + } | |
| 120 | + else { | |
| 121 | + _curPage = MAX(1, _curPage - 1); | |
| 122 | + dispatch_async(dispatch_get_main_queue(), ^{ | |
| 123 | + NSString *message = [error.userInfo objectForKey:@"message"]; | |
| 124 | + [Utilities showErrorMessage:message withViewController:weakSelf]; | |
| 125 | + }); | |
| 126 | + } | |
| 127 | + | |
| 128 | + }]; | |
| 129 | +} | |
| 130 | + | |
| 131 | +-(void) resetData { | |
| 132 | + _isLoading = false; | |
| 133 | + _isEndOfResult = false; | |
| 134 | + _firstTime = true; | |
| 135 | + _curPage = 1; | |
| 56 | 136 | } |
| 57 | 137 | |
| 58 | 138 | @end |
LifeLog/LifeLog/ServerAPI.h
| ... | ... | @@ -22,8 +22,12 @@ |
| 22 | 22 | - (void)forgetPass:(NSString *)email CompletionHandler:(void (^)(NSError *)) completion; |
| 23 | 23 | - (void)confirmForgetPass:(NSString *)email withConfirm:(NSString *)confirm CompletionHandler:(void (^)(NSError *)) completion; |
| 24 | 24 | |
| 25 | +#pragma mark - History Screen Function | |
| 25 | 26 | - (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion; |
| 26 | 27 | - (void) requestHistoryGraph:(NSString *)token withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryGraphObject *, NSError *)) completion; |
| 27 | 28 | - (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSMutableArray *, NSError *)) completion; |
| 29 | + | |
| 30 | +#pragma mark - SNS Screen Function | |
| 31 | +- (void) requestRecentlyTweetsList:(NSString *)token withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion; | |
| 28 | 32 | @end |
LifeLog/LifeLog/ServerAPI.m
| ... | ... | @@ -350,7 +350,7 @@ |
| 350 | 350 | }]; |
| 351 | 351 | } |
| 352 | 352 | |
| 353 | -- (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSMutableArray *, NSError *)) completion { | |
| 353 | +- (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSArray *, NSError *)) completion { | |
| 354 | 354 | NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/list/%@/%d?page=%d&record=50", [self convertIntToString:type], mode, page]; |
| 355 | 355 | NSLog(@"requestHistoryList link %@", url); |
| 356 | 356 | [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { |
| ... | ... | @@ -384,6 +384,49 @@ |
| 384 | 384 | if (message == nil) { |
| 385 | 385 | message = @"Unknown error"; |
| 386 | 386 | } |
| 387 | + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; | |
| 388 | + completion(nil, errorObject); | |
| 389 | + } | |
| 390 | + } | |
| 391 | + else | |
| 392 | + { | |
| 393 | + completion(nil, error); | |
| 394 | + } | |
| 395 | + }]; | |
| 396 | +} | |
| 397 | + | |
| 398 | +#pragma mark - SNS Screen Function | |
| 399 | +- (void) requestRecentlyTweetsList:(NSString *)token withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion { | |
| 400 | + NSString *url = [kServerAddress stringByAppendingFormat:@"/api/sns/%d", page]; | |
| 401 | + NSLog(@"requestRecentlyTweetsList link %@", url); | |
| 402 | + [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { | |
| 403 | + | |
| 404 | + if (completion == NULL) { | |
| 405 | + return ; | |
| 406 | + } | |
| 407 | + | |
| 408 | + if (error == nil) | |
| 409 | + { | |
| 410 | + NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; | |
| 411 | + NSLog(@"%@", dataResult); | |
| 412 | + int status = [dataResult[@"status"] intValue]; | |
| 413 | + if (status == 1) { // status = 1 success | |
| 414 | + if(dataResult[@"result"] != nil) { | |
| 415 | + NSArray * array = dataResult[@"result"]; | |
| 416 | + NSMutableArray * arrayTweets = [[NSMutableArray alloc] init]; | |
| 417 | + for(NSDictionary * dict in array) { | |
| 418 | + TweetObject * object = [[TweetObject alloc] initWithData:dict]; | |
| 419 | + [arrayTweets addObject:object]; | |
| 420 | + } | |
| 421 | + completion(arrayTweets, nil); | |
| 422 | + } | |
| 423 | + else { | |
| 424 | + NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; | |
| 425 | + completion(nil, errorObject); | |
| 426 | + } | |
| 427 | + } | |
| 428 | + else { | |
| 429 | + NSString *message = dataResult[@"message"]; | |
| 387 | 430 | NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; |
| 388 | 431 | completion(nil, errorObject); |
| 389 | 432 | } |
LifeLog/LifeLog/TweetObject.h
| 1 | +// | |
| 2 | +// TweetObject.h | |
| 3 | +// LifeLog | |
| 4 | +// | |
| 5 | +// Created by nvtu on 8/11/17. | |
| 6 | +// Copyright ยฉ 2017 PhongNV. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +@interface TweetObject : NSObject | |
| 12 | + | |
| 13 | +@property (nonatomic) int tweetID; | |
| 14 | +@property (nonatomic) int groupID; | |
| 15 | +@property (nonatomic) int userID; | |
| 16 | +@property (nonatomic) float distance; | |
| 17 | + | |
| 18 | +@property (nonatomic, strong) NSString * content; | |
| 19 | +@property (nonatomic, strong) NSString * mode; | |
| 20 | +@property (nonatomic, strong) NSString * time; | |
| 21 | +@property (nonatomic, strong) NSString * userName; | |
| 22 | +@property (nonatomic, strong) NSString * avatarLink; | |
| 23 | +@property (nonatomic, strong) NSDate * createDate; | |
| 24 | + | |
| 25 | +-(id) initWithData : (NSDictionary *) dict; | |
| 26 | + | |
| 27 | +@end |
LifeLog/LifeLog/TweetObject.m
| 1 | +// | |
| 2 | +// TweetObject.m | |
| 3 | +// LifeLog | |
| 4 | +// | |
| 5 | +// Created by nvtu on 8/11/17. | |
| 6 | +// Copyright ยฉ 2017 PhongNV. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "TweetObject.h" | |
| 10 | +#import "Utilities.h" | |
| 11 | + | |
| 12 | +@implementation TweetObject | |
| 13 | + | |
| 14 | +-(id) initWithData : (NSDictionary *) dict { | |
| 15 | + if([dict objectForKey:@"id"] != nil) { | |
| 16 | + self.tweetID = [dict[@"id"] intValue]; | |
| 17 | + } | |
| 18 | + if([dict objectForKey:@"group_id"] != nil) { | |
| 19 | + self.groupID = [dict[@"group_id"] intValue]; | |
| 20 | + } | |
| 21 | + if([dict objectForKey:@"tweet_content"] != nil) { | |
| 22 | + self.content = dict[@"tweet_content"]; | |
| 23 | + } | |
| 24 | + if([dict objectForKey:@"mode"] != nil) { | |
| 25 | + int modeInt = [dict[@"mode"] intValue]; | |
| 26 | + switch (modeInt) { | |
| 27 | + case 2: | |
| 28 | + self.mode = @"running"; | |
| 29 | + break; | |
| 30 | + case 3: | |
| 31 | + self.mode = @"bike"; | |
| 32 | + break; | |
| 33 | + default: | |
| 34 | + self.mode = @"walking"; | |
| 35 | + break; | |
| 36 | + } | |
| 37 | + } | |
| 38 | + if([dict objectForKey:@"distance"] != nil) { | |
| 39 | + self.distance = [dict[@"distance"] floatValue]; | |
| 40 | + } | |
| 41 | + if([dict objectForKey:@"time"] != nil) { | |
| 42 | + self.time = dict[@"time"]; | |
| 43 | + } | |
| 44 | + if([dict objectForKey:@"user_id"] != nil) { | |
| 45 | + self.userID = [dict[@"user_id"] intValue]; | |
| 46 | + } | |
| 47 | + if([dict objectForKey:@"username"] != nil) { | |
| 48 | + self.userName = dict[@"username"]; | |
| 49 | + } | |
| 50 | + if([dict objectForKey:@"profile_image"] != nil) { | |
| 51 | + self.avatarLink = dict[@"profile_image"]; | |
| 52 | + } | |
| 53 | + if([dict objectForKey:@"created_at"] != nil) { | |
| 54 | + self.createDate = dict[@"created_at"]; | |
| 55 | + } | |
| 56 | + if([dict objectForKey:@"created_at"] != nil) { | |
| 57 | + NSString *dateString = dict[@"created_at"]; | |
| 58 | + self.createDate = [Utilities dateFromString:dateString withFormat:@"yyyy-MM-dd hh:mm:ss"]; | |
| 59 | + } | |
| 60 | + else { | |
| 61 | + self.createDate = [NSDate date]; | |
| 62 | + } | |
| 63 | + return self; | |
| 64 | +} | |
| 65 | + | |
| 66 | +@end |
LifeLog/LifeLog/Utilities.h
| ... | ... | @@ -13,11 +13,16 @@ |
| 13 | 13 | + (NSString *)addCommaFromNumber:(NSInteger)number; |
| 14 | 14 | + (UIColor *)convertHecToColor:(int) hex; |
| 15 | 15 | + (void)showErrorMessage:(NSString *)message withViewController:(UIViewController *)vc; |
| 16 | ++ (NSString *) getImageLink : (NSString *) path; | |
| 16 | 17 | |
| 17 | 18 | //share function |
| 18 | 19 | + (void) shareFacebook : (NSString *) content withViewController:(UIViewController *)vc; |
| 19 | 20 | + (void) shareTwitter : (NSString *) content withViewController:(UIViewController *)vc; |
| 20 | 21 | + (void) shareLine : (NSString *) content withViewController:(UIViewController *)vc; |
| 21 | 22 | + (void) shareEmail : (NSString *) content withViewController:(UIViewController *)vc; |
| 23 | + | |
| 24 | +//convert date time | |
| 25 | ++ (NSDate *) dateFromString : (NSString *) dateString withFormat: (NSString *) format; | |
| 26 | ++ (NSString *) stringFromDate : (NSDate *) date withFormat: (NSString *) format; | |
| 22 | 27 | @end |
LifeLog/LifeLog/Utilities.m
| ... | ... | @@ -10,6 +10,7 @@ |
| 10 | 10 | #import <LineKit/Line.h> |
| 11 | 11 | |
| 12 | 12 | #import "Utilities.h" |
| 13 | +#import "ServerAPI.h" | |
| 13 | 14 | |
| 14 | 15 | @implementation Utilities |
| 15 | 16 | + (NSString *)addCommaFromNumber:(NSInteger)number |
| ... | ... | @@ -51,6 +52,11 @@ |
| 51 | 52 | } |
| 52 | 53 | } |
| 53 | 54 | |
| 55 | ++ (NSString *) getImageLink : (NSString *) path { | |
| 56 | + NSString * link = kServerAddress; | |
| 57 | + return [link stringByAppendingString:path]; | |
| 58 | +} | |
| 59 | + | |
| 54 | 60 | + (void) shareFacebook : (NSString *) content withViewController:(UIViewController *)vc { |
| 55 | 61 | if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) |
| 56 | 62 | { |
| ... | ... | @@ -118,5 +124,24 @@ |
| 118 | 124 | urlEmail = [urlEmail stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]]; |
| 119 | 125 | [[UIApplication sharedApplication] openURL: [NSURL URLWithString: urlEmail]]; |
| 120 | 126 | } |
| 127 | + | |
| 128 | +#pragma mark convert date time | |
| 129 | ++ (NSDate *) dateFromString : (NSString *) dateString withFormat: (NSString *) format { | |
| 130 | + NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; | |
| 131 | + [dateFormat setDateFormat:format]; | |
| 132 | + NSDate *date = [dateFormat dateFromString:dateString]; | |
| 133 | + if(date == NULL) { | |
| 134 | + return [NSDate date]; | |
| 135 | + } | |
| 136 | + return date; | |
| 137 | +} | |
| 138 | + | |
| 139 | ++ (NSString *) stringFromDate : (NSDate *) date withFormat: (NSString *) format { | |
| 140 | + NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; | |
| 141 | + [dateFormat setDateFormat:format]; | |
| 142 | + NSString *dateString = [dateFormat stringFromDate:date]; | |
| 143 | + return dateString; | |
| 144 | +} | |
| 145 | + | |
| 121 | 146 | @end |