Commit da40f74562216b71a4de342a9c2f80b10d2dfe20

Authored by nvtu11790@gmail.com
1 parent 7fc917f3b6

Finish group detail screen, load tweet list, friend list, join group

Showing 8 changed files with 132 additions and 35 deletions Inline Diff

LifeLog/LifeLog/GroupDetailViewController.m
1 // 1 //
2 // GroupDetailViewController.m 2 // GroupDetailViewController.m
3 // LifeLog 3 // LifeLog
4 // 4 //
5 // Created by nvtu on 8/13/17. 5 // Created by nvtu on 8/13/17.
6 // Copyright © 2017 PhongNV. All rights reserved. 6 // Copyright © 2017 PhongNV. All rights reserved.
7 // 7 //
8 8
9 #import "GroupDetailViewController.h" 9 #import "GroupDetailViewController.h"
10 #import <SDWebImage/UIImageView+WebCache.h> 10 #import <SDWebImage/UIImageView+WebCache.h>
11 11
12 #import "Utilities.h" 12 #import "Utilities.h"
13 #import "ServerAPI.h" 13 #import "ServerAPI.h"
14 #import "SNSRecentTopicTableViewCell.h" 14 #import "SNSRecentTopicTableViewCell.h"
15 15
16 @interface GroupDetailViewController () 16 @interface GroupDetailViewController ()
17 17
18 @end 18 @end
19 19
20 @implementation GroupDetailViewController 20 @implementation GroupDetailViewController
21 21
22 - (void)viewDidLoad { 22 - (void)viewDidLoad {
23 [super viewDidLoad]; 23 [super viewDidLoad];
24 isMemberList = false; 24 isMemberList = false;
25 //register nib for table view 25 //register nib for table view
26 [self.tableBase registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"]; 26 [self.tableBase registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"];
27 if(_curGroup != nil) { 27 if(_curGroup != nil) {
28 [self requestGroupDetail]; 28 [self requestGroupDetail];
29 } 29 }
30 // Do any additional setup after loading the view from its nib. 30 // Do any additional setup after loading the view from its nib.
31 } 31 }
32 32
33 - (void)didReceiveMemoryWarning { 33 - (void)didReceiveMemoryWarning {
34 [super didReceiveMemoryWarning]; 34 [super didReceiveMemoryWarning];
35 // Dispose of any resources that can be recreated. 35 // Dispose of any resources that can be recreated.
36 } 36 }
37 37
38 - (void) setGroup : (GroupObject *) object { 38 - (void) setGroup : (GroupObject *) object {
39 _curGroup = object; 39 _curGroup = object;
40 } 40 }
41 41
42 - (void)setupView { 42 - (void)setupView {
43 if(_curGroup != nil) { 43 if(_curGroup != nil) {
44 if(_curGroup.avatar && ![_curGroup.avatar isKindOfClass:[NSNull class]]) { 44 if(_curGroup.avatar && ![_curGroup.avatar isKindOfClass:[NSNull class]]) {
45 [self.imgAva sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:_curGroup.avatar]]]; 45 [self.imgAva sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:_curGroup.avatar]]];
46 } 46 }
47 [self.lblGrpName setText:_curGroup.name]; 47 [self.lblGrpName setText:_curGroup.name];
48 [self.lblGrpGoal setText:_curGroup.goal]; 48 [self.lblGrpGoal setText:_curGroup.goal];
49 [self.btJoinGrp setHidden:_curGroup.isJoin]; 49 [self.btJoinGrp setHidden:_curGroup.isJoin];
50 NSString *mode = @""; 50 NSString *mode = @"";
51 if(_curGroup.runMode) { 51 if(_curGroup.runMode) {
52 mode = [mode stringByAppendingString:@"ランニング\n"]; 52 mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.running", nil)];
53 mode = [mode stringByAppendingString:@"\n"];
53 } 54 }
54 if(_curGroup.walkMode) { 55 if(_curGroup.walkMode) {
55 mode = [mode stringByAppendingString:@"ウォーキング\n"]; 56 mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.walking", nil)];
57 mode = [mode stringByAppendingString:@"\n"];
56 } 58 }
57 if(_curGroup.bikeMode) { 59 if(_curGroup.bikeMode) {
58 mode = [mode stringByAppendingString:@"バイク\n"]; 60 mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.bike", nil)];
61 mode = [mode stringByAppendingString:@"\n"];
59 } 62 }
63 if(_curGroup.stepMode) {
64 mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.step", nil)];
65 mode = [mode stringByAppendingString:@"\n"];
66 }
67 if(_curGroup.beginMode) {
68 mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.begin", nil)];
69 mode = [mode stringByAppendingString:@"\n"];
70 }
71 if(_curGroup.gymMode) {
72 mode = [mode stringByAppendingString:NSLocalizedString(@"lifelog.grDetail.mode.gym", nil)];
73 mode = [mode stringByAppendingString:@"\n"];
74 }
75 NSRange range = [mode rangeOfString:@"\n" options:NSBackwardsSearch];
76 if(range.length > 0) {
77 mode = [mode stringByReplacingOccurrencesOfString:@"\n" withString:@"" options:NSBackwardsSearch range:range];
78 }
60 self.lbbGrpActiveMode.text = mode; 79 self.lbbGrpActiveMode.text = mode;
61 } 80 }
62 } 81 }
63 #pragma mark IBAction 82 #pragma mark IBAction
64 83
65 - (IBAction)clickBack:(id)sender { 84 - (IBAction)clickBack:(id)sender {
66 [self.navigationController popViewControllerAnimated:true]; 85 [self.navigationController popViewControllerAnimated:true];
67 } 86 }
68 87
69 - (IBAction)clickSwitch:(AutoTransButton *)sender { 88 - (IBAction)clickSwitch:(AutoTransButton *)sender {
70 isMemberList = !isMemberList; 89 isMemberList = !isMemberList;
90 if(isMemberList) {
91 [sender setTitle:NSLocalizedString(@"lifelog.grDetail.bt.viewTweet", nil) forState:UIControlStateNormal];
92 }
93 else {
94 [sender setTitle:NSLocalizedString(@"lifelog.grDetail.bt.viewMem", nil) forState:UIControlStateNormal];
95 }
96 [sender setUserInteractionEnabled:false];
71 [self resetData]; 97 [self resetData];
72 } 98 }
73 99
74 - (IBAction)clickJoin:(AutoTransButton *)sender { 100 - (IBAction)clickJoin:(AutoTransButton *)sender {
75 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; 101 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
76 MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; 102 MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
77 [[ServerAPI server] requestTweetsList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){ 103 [[ServerAPI server] requestJoinGroup:token groupID:_curGroup.groupID CompletionHandler:^(NSError *error){
104 GroupDetailViewController __weak *weakSelf = self;
78 dispatch_async(dispatch_get_main_queue(), ^{ 105 dispatch_async(dispatch_get_main_queue(), ^{
79 if(hudView != nil) { 106 [hudView hideAnimated:true];
80 [hudView hideAnimated:true]; 107 if(error == nil) {
108 _curGroup.isJoin = true;
109 [weakSelf.btJoinGrp setHidden:_curGroup.isJoin];
81 } 110 }
82 }); 111 });
83 }]; 112 }];
113
84 } 114 }
85 115
86 116
87 117
88 #pragma mark UITableView Delegate 118 #pragma mark UITableView Delegate
89 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 119 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
90 SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"]; 120 SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"];
91 if(isMemberList) { 121 if(isMemberList) {
92 MemberObject *object = [_curDataList objectAtIndex:indexPath.row]; 122 MemberObject *object = [_curDataList objectAtIndex:indexPath.row];
93 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) { 123 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
94 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]]; 124 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
95 } 125 }
126 else {
127 [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
128 }
96 cell.lblUsername.text = @""; 129 cell.lblUsername.text = @"";
97 cell.lblDateTime.text = @""; 130 cell.lblDateTime.text = @"";
98 cell.lblDes.text = object.userName; 131 cell.lblDes.text = object.userName;
99 cell.lblMode.text = @""; 132 cell.lblMode.text = @"";
100 cell.lblDistance.text = @""; 133 cell.lblDistance.text = @"";
101 cell.lblDuration.text = @""; 134 cell.lblDuration.text = @"";
102 } 135 }
103 else { 136 else {
104 TweetObject *object = [_curDataList objectAtIndex:indexPath.row]; 137 TweetObject *object = [_curDataList objectAtIndex:indexPath.row];
105 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) { 138 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
106 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]]; 139 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
107 } 140 }
141 else {
142 [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
143 }
108 cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm"]; 144 cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm"];
109 cell.lblUsername.text = object.userName; 145 cell.lblUsername.text = object.userName;
110 cell.lblDes.text = object.content; 146 cell.lblDes.text = object.content;
111 cell.lblMode.text = object.mode; 147 cell.lblMode.text = object.mode;
112 cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance]; 148 cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance];
113 cell.lblDuration.text = object.time; 149 cell.lblDuration.text = object.time;
114 } 150 }
115 151
116 return cell; 152 return cell;
117 } 153 }
118 154
119 #pragma mark Private Function 155 #pragma mark Private Function
120 156
121 - (void) requestGroupDetail { 157 - (void) requestGroupDetail {
122 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; 158 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
123 MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; 159 MBProgressHUD *hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
124 [[ServerAPI server] getGroupDetail:token withGroupID:_curGroup.groupID CompletionHandler:^(GroupObject *object, NSError *error) { 160 [[ServerAPI server] getGroupDetail:token withGroupID:_curGroup.groupID CompletionHandler:^(GroupObject *object, NSError *error) {
125 GroupDetailViewController __weak *weakSelf = self; 161 GroupDetailViewController __weak *weakSelf = self;
126 _curGroup = object; 162 [_curGroup updateDate:object];
127 dispatch_async(dispatch_get_main_queue(), ^{ 163 dispatch_async(dispatch_get_main_queue(), ^{
128 [hudView hideAnimated:true]; 164 [hudView hideAnimated:true];
129 [weakSelf setupView]; 165 [weakSelf setupView];
130 [weakSelf callRequestToUpdateData]; 166 [weakSelf callRequestToUpdateData];
131 }); 167 });
132 }]; 168 }];
133 } 169 }
134 170
135 -(void) callRequestToUpdateData { 171 -(void) callRequestToUpdateData {
136 [super callRequestToUpdateData]; 172 [super callRequestToUpdateData];
137 173
138 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; 174 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
139 MBProgressHUD *hudView = nil; 175 MBProgressHUD *hudView = nil;
140 if(_curPage == 1 && !self.refreshControl.isRefreshing) { 176 if(_curPage == 1 && !self.refreshControl.isRefreshing) {
141 hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; 177 hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
142 } 178 }
143 if(isMemberList) { 179 if(isMemberList) {
144 [[ServerAPI server] requestMemberList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){ 180 [[ServerAPI server] requestMemberList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){
145 dispatch_async(dispatch_get_main_queue(), ^{ 181 dispatch_async(dispatch_get_main_queue(), ^{
146 if(hudView != nil) { 182 if(hudView != nil) {
147 [hudView hideAnimated:true]; 183 [hudView hideAnimated:true];
148 } 184 }
149 }); 185 });
150 GroupDetailViewController __weak *weakSelf = self; 186 GroupDetailViewController __weak *weakSelf = self;
151 [weakSelf updateTableData:array error:error]; 187 [weakSelf updateTableData:array error:error];
188 [weakSelf.btSwitch setUserInteractionEnabled:true];
152 }]; 189 }];
153 } 190 }
154 else { 191 else {
155 [[ServerAPI server] requestTweetsList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){ 192 [[ServerAPI server] requestTweetsList:token groupID:_curGroup.groupID withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){
156 dispatch_async(dispatch_get_main_queue(), ^{ 193 dispatch_async(dispatch_get_main_queue(), ^{
157 if(hudView != nil) { 194 if(hudView != nil) {
158 [hudView hideAnimated:true]; 195 [hudView hideAnimated:true];
159 } 196 }
160 }); 197 });
161 GroupDetailViewController __weak *weakSelf = self; 198 GroupDetailViewController __weak *weakSelf = self;
162 [weakSelf updateTableData:array error:error]; 199 [weakSelf updateTableData:array error:error];
200 [weakSelf.btSwitch setUserInteractionEnabled:true];
163 }]; 201 }];
164 } 202 }
165 } 203 }
166 204
167 @end 205 @end
168 206
LifeLog/LifeLog/GroupDetailViewController.xib
1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12121" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES"> 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="12118" systemVersion="16D32" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
3 <device id="retina4_7" orientation="portrait"> 3 <device id="retina4_7" orientation="portrait">
4 <adaptation id="fullscreen"/> 4 <adaptation id="fullscreen"/>
5 </device> 5 </device>
6 <dependencies> 6 <dependencies>
7 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/> 7 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12086"/>
8 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 8 <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
9 </dependencies> 9 </dependencies>
10 <objects> 10 <objects>
11 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="GroupDetailViewController"> 11 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="GroupDetailViewController">
12 <connections> 12 <connections>
13 <outlet property="btJoinGrp" destination="caN-x7-hJz" id="B17-YC-Rmk"/> 13 <outlet property="btJoinGrp" destination="caN-x7-hJz" id="B17-YC-Rmk"/>
14 <outlet property="btSwitch" destination="gBg-k9-tgw" id="3ZZ-Qb-d3a"/> 14 <outlet property="btSwitch" destination="gBg-k9-tgw" id="3ZZ-Qb-d3a"/>
15 <outlet property="imgAva" destination="qYg-Gw-R2b" id="f9w-A2-u4G"/> 15 <outlet property="imgAva" destination="qYg-Gw-R2b" id="f9w-A2-u4G"/>
16 <outlet property="lbbGrpActiveMode" destination="O8z-6V-YFd" id="s8J-3i-pW3"/> 16 <outlet property="lbbGrpActiveMode" destination="O8z-6V-YFd" id="s8J-3i-pW3"/>
17 <outlet property="lblGrpGoal" destination="Bdy-dI-j47" id="AKx-8y-Ifm"/> 17 <outlet property="lblGrpGoal" destination="Bdy-dI-j47" id="AKx-8y-Ifm"/>
18 <outlet property="lblGrpName" destination="YWV-pS-TCo" id="VeU-Ov-uSD"/> 18 <outlet property="lblGrpName" destination="YWV-pS-TCo" id="VeU-Ov-uSD"/>
19 <outlet property="tableBase" destination="4VU-Ye-7Au" id="m1e-cS-Sxf"/> 19 <outlet property="tableBase" destination="4VU-Ye-7Au" id="m1e-cS-Sxf"/>
20 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> 20 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
21 </connections> 21 </connections>
22 </placeholder> 22 </placeholder>
23 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 23 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
24 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT"> 24 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
25 <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> 25 <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
26 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 26 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
27 <subviews> 27 <subviews>
28 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="25d-3H-0fr" userLabel="ViewHeader"> 28 <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="25d-3H-0fr" userLabel="ViewHeader">
29 <rect key="frame" x="0.0" y="0.0" width="375" height="46"/> 29 <rect key="frame" x="0.0" y="0.0" width="375" height="46"/>
30 <subviews> 30 <subviews>
31 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SNS" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DxD-Cy-0wi" customClass="AutoTransLabel"> 31 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SNS" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DxD-Cy-0wi" customClass="AutoTransLabel">
32 <rect key="frame" x="0.0" y="0.0" width="375" height="46"/> 32 <rect key="frame" x="0.0" y="0.0" width="375" height="46"/>
33 <fontDescription key="fontDescription" type="system" pointSize="17"/> 33 <fontDescription key="fontDescription" type="system" pointSize="17"/>
34 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> 34 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
35 <nil key="highlightedColor"/> 35 <nil key="highlightedColor"/>
36 <userDefinedRuntimeAttributes> 36 <userDefinedRuntimeAttributes>
37 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.title"/> 37 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.title"/>
38 </userDefinedRuntimeAttributes> 38 </userDefinedRuntimeAttributes>
39 </label> 39 </label>
40 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="O3M-Ba-zHF"> 40 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="O3M-Ba-zHF">
41 <rect key="frame" x="0.0" y="5" width="70" height="36"/> 41 <rect key="frame" x="0.0" y="5" width="70" height="36"/>
42 <constraints> 42 <constraints>
43 <constraint firstAttribute="width" constant="70" id="2Mk-ly-c0t"/> 43 <constraint firstAttribute="width" constant="70" id="2Mk-ly-c0t"/>
44 </constraints> 44 </constraints>
45 <state key="normal" image="today_back_button"/> 45 <state key="normal" image="today_back_button"/>
46 <connections> 46 <connections>
47 <action selector="clickBack:" destination="-1" eventType="touchUpInside" id="gS4-F3-fzi"/> 47 <action selector="clickBack:" destination="-1" eventType="touchUpInside" id="gS4-F3-fzi"/>
48 </connections> 48 </connections>
49 </button> 49 </button>
50 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="y09-DG-Krp"> 50 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="y09-DG-Krp">
51 <rect key="frame" x="330" y="0.0" width="45" height="46"/> 51 <rect key="frame" x="330" y="0.0" width="45" height="46"/>
52 <constraints> 52 <constraints>
53 <constraint firstAttribute="width" constant="45" id="hHa-aE-1zd"/> 53 <constraint firstAttribute="width" constant="45" id="hHa-aE-1zd"/>
54 </constraints> 54 </constraints>
55 <state key="normal" image="icon_menu"/> 55 <state key="normal" image="icon_menu"/>
56 </button> 56 </button>
57 </subviews> 57 </subviews>
58 <color key="backgroundColor" red="0.098039215690000001" green="0.098039215690000001" blue="0.098039215690000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 58 <color key="backgroundColor" red="0.098039215690000001" green="0.098039215690000001" blue="0.098039215690000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
59 <constraints> 59 <constraints>
60 <constraint firstItem="y09-DG-Krp" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="top" id="65z-ZM-a3D"/> 60 <constraint firstItem="y09-DG-Krp" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="top" id="65z-ZM-a3D"/>
61 <constraint firstItem="O3M-Ba-zHF" firstAttribute="leading" secondItem="25d-3H-0fr" secondAttribute="leading" id="CQk-IB-W9y"/> 61 <constraint firstItem="O3M-Ba-zHF" firstAttribute="leading" secondItem="25d-3H-0fr" secondAttribute="leading" id="CQk-IB-W9y"/>
62 <constraint firstAttribute="bottom" secondItem="y09-DG-Krp" secondAttribute="bottom" id="IWC-4b-gp6"/> 62 <constraint firstAttribute="bottom" secondItem="y09-DG-Krp" secondAttribute="bottom" id="IWC-4b-gp6"/>
63 <constraint firstItem="O3M-Ba-zHF" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="top" constant="5" id="JWL-bD-I2Z"/> 63 <constraint firstItem="O3M-Ba-zHF" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="top" constant="5" id="JWL-bD-I2Z"/>
64 <constraint firstItem="DxD-Cy-0wi" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="top" id="WYM-oV-6xn"/> 64 <constraint firstItem="DxD-Cy-0wi" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="top" id="WYM-oV-6xn"/>
65 <constraint firstAttribute="bottom" secondItem="O3M-Ba-zHF" secondAttribute="bottom" constant="5" id="ZA0-Bo-IQF"/> 65 <constraint firstAttribute="bottom" secondItem="O3M-Ba-zHF" secondAttribute="bottom" constant="5" id="ZA0-Bo-IQF"/>
66 <constraint firstItem="DxD-Cy-0wi" firstAttribute="leading" secondItem="25d-3H-0fr" secondAttribute="leading" id="cbx-fE-OaR"/> 66 <constraint firstItem="DxD-Cy-0wi" firstAttribute="leading" secondItem="25d-3H-0fr" secondAttribute="leading" id="cbx-fE-OaR"/>
67 <constraint firstAttribute="trailing" secondItem="DxD-Cy-0wi" secondAttribute="trailing" id="i0L-w8-Oxm"/> 67 <constraint firstAttribute="trailing" secondItem="DxD-Cy-0wi" secondAttribute="trailing" id="i0L-w8-Oxm"/>
68 <constraint firstAttribute="trailing" secondItem="y09-DG-Krp" secondAttribute="trailing" id="nNZ-jP-k6U"/> 68 <constraint firstAttribute="trailing" secondItem="y09-DG-Krp" secondAttribute="trailing" id="nNZ-jP-k6U"/>
69 <constraint firstAttribute="bottom" secondItem="DxD-Cy-0wi" secondAttribute="bottom" id="oxP-oa-3FJ"/> 69 <constraint firstAttribute="bottom" secondItem="DxD-Cy-0wi" secondAttribute="bottom" id="oxP-oa-3FJ"/>
70 <constraint firstAttribute="height" constant="46" id="u2G-4s-RB5"/> 70 <constraint firstAttribute="height" constant="46" id="u2G-4s-RB5"/>
71 </constraints> 71 </constraints>
72 </view> 72 </view>
73 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YWV-pS-TCo"> 73 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YWV-pS-TCo">
74 <rect key="frame" x="15" y="54" width="345" height="21"/> 74 <rect key="frame" x="15" y="54" width="345" height="21"/>
75 <constraints> 75 <constraints>
76 <constraint firstAttribute="height" constant="21" id="fQO-ja-W9R"/> 76 <constraint firstAttribute="height" constant="21" id="fQO-ja-W9R"/>
77 </constraints> 77 </constraints>
78 <fontDescription key="fontDescription" type="system" pointSize="17"/> 78 <fontDescription key="fontDescription" type="system" pointSize="17"/>
79 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> 79 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
80 <nil key="highlightedColor"/> 80 <nil key="highlightedColor"/>
81 </label> 81 </label>
82 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="O8z-6V-YFd"> 82 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="O8z-6V-YFd">
83 <rect key="frame" x="15" y="85" width="243" height="60"/> 83 <rect key="frame" x="15" y="85" width="243" height="60"/>
84 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> 84 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
85 <constraints> 85 <constraints>
86 <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="60" id="Bid-NM-Ree"/> 86 <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="60" id="Bid-NM-Ree"/>
87 </constraints> 87 </constraints>
88 <fontDescription key="fontDescription" type="system" pointSize="14"/> 88 <fontDescription key="fontDescription" type="system" pointSize="14"/>
89 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> 89 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
90 <nil key="highlightedColor"/> 90 <nil key="highlightedColor"/>
91 </label> 91 </label>
92 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bdy-dI-j47"> 92 <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bdy-dI-j47">
93 <rect key="frame" x="15" y="160" width="345" height="80"/> 93 <rect key="frame" x="15" y="160" width="345" height="80"/>
94 <constraints> 94 <constraints>
95 <constraint firstAttribute="height" constant="80" id="jgH-57-Bae"/> 95 <constraint firstAttribute="height" constant="80" id="jgH-57-Bae"/>
96 </constraints> 96 </constraints>
97 <fontDescription key="fontDescription" type="system" pointSize="17"/> 97 <fontDescription key="fontDescription" type="system" pointSize="17"/>
98 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/> 98 <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
99 <nil key="highlightedColor"/> 99 <nil key="highlightedColor"/>
100 </label> 100 </label>
101 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qYg-Gw-R2b"> 101 <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qYg-Gw-R2b">
102 <rect key="frame" x="280" y="85" width="80" height="60"/> 102 <rect key="frame" x="280" y="85" width="80" height="60"/>
103 <constraints> 103 <constraints>
104 <constraint firstAttribute="width" constant="80" id="NEk-vg-zus"/> 104 <constraint firstAttribute="width" constant="80" id="NEk-vg-zus"/>
105 <constraint firstAttribute="height" constant="60" id="qlv-ht-SUw"/> 105 <constraint firstAttribute="height" constant="60" id="qlv-ht-SUw"/>
106 </constraints> 106 </constraints>
107 </imageView> 107 </imageView>
108 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gBg-k9-tgw" customClass="AutoTransButton"> 108 <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gBg-k9-tgw" customClass="AutoTransButton">
109 <rect key="frame" x="15" y="270" width="162" height="30"/> 109 <rect key="frame" x="15" y="270" width="162" height="30"/>
110 <color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 110 <color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
111 <constraints> 111 <constraints>
112 <constraint firstAttribute="height" constant="30" id="6Ir-ZZ-NOb"/> 112 <constraint firstAttribute="height" constant="30" id="6Ir-ZZ-NOb"/>
113 </constraints> 113 </constraints>
114 <state key="normal" title="メンバーを見る"> 114 <state key="normal" title="メンバーを見る">
115 <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/> 115 <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
116 </state> 116 </state>
117 <userDefinedRuntimeAttributes> 117 <userDefinedRuntimeAttributes>
118 <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius"> 118 <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
119 <integer key="value" value="5"/> 119 <integer key="value" value="5"/>
120 </userDefinedRuntimeAttribute> 120 </userDefinedRuntimeAttribute>
121 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.bt.viewMem"/> 121 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.bt.viewMem"/>
122 </userDefinedRuntimeAttributes> 122 </userDefinedRuntimeAttributes>
123 <connections> 123 <connections>
124 <action selector="clickSwitch:" destination="-1" eventType="touchUpInside" id="z4V-ym-fqS"/> 124 <action selector="clickSwitch:" destination="-1" eventType="touchUpInside" id="z4V-ym-fqS"/>
125 </connections> 125 </connections>
126 </button> 126 </button>
127 <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="caN-x7-hJz" customClass="AutoTransButton"> 127 <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="caN-x7-hJz" customClass="AutoTransButton">
128 <rect key="frame" x="197" y="270" width="162" height="30"/> 128 <rect key="frame" x="197" y="270" width="162" height="30"/>
129 <color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> 129 <color key="backgroundColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
130 <constraints> 130 <constraints>
131 <constraint firstAttribute="height" constant="30" id="gIs-Km-dbx"/> 131 <constraint firstAttribute="height" constant="30" id="gIs-Km-dbx"/>
132 </constraints> 132 </constraints>
133 <state key="normal" title="グループに参加する"> 133 <state key="normal" title="グループに参加する">
134 <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/> 134 <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
135 </state> 135 </state>
136 <userDefinedRuntimeAttributes> 136 <userDefinedRuntimeAttributes>
137 <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius"> 137 <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
138 <integer key="value" value="5"/> 138 <integer key="value" value="5"/>
139 </userDefinedRuntimeAttribute> 139 </userDefinedRuntimeAttribute>
140 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.bt.joinGr"/> 140 <userDefinedRuntimeAttribute type="string" keyPath="localizeKey" value="lifelog.grDetail.bt.joinGr"/>
141 </userDefinedRuntimeAttributes> 141 </userDefinedRuntimeAttributes>
142 <connections> 142 <connections>
143 <action selector="clickJoin:" destination="-1" eventType="touchUpInside" id="Ukt-bi-Sw2"/> 143 <action selector="clickJoin:" destination="-1" eventType="touchUpInside" id="Ukt-bi-Sw2"/>
144 </connections> 144 </connections>
145 </button> 145 </button>
146 <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="none" rowHeight="100" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="4VU-Ye-7Au"> 146 <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" style="plain" separatorStyle="none" rowHeight="100" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="4VU-Ye-7Au">
147 <rect key="frame" x="0.0" y="310" width="375" height="307"/> 147 <rect key="frame" x="0.0" y="310" width="375" height="307"/>
148 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> 148 <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
149 <connections> 149 <connections>
150 <outlet property="dataSource" destination="-1" id="TLB-6X-bRI"/> 150 <outlet property="dataSource" destination="-1" id="TLB-6X-bRI"/>
151 <outlet property="delegate" destination="-1" id="QcJ-Yh-deE"/> 151 <outlet property="delegate" destination="-1" id="QcJ-Yh-deE"/>
152 </connections> 152 </connections>
153 </tableView> 153 </tableView>
154 </subviews> 154 </subviews>
155 <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> 155 <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
156 <constraints> 156 <constraints>
157 <constraint firstItem="25d-3H-0fr" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="5o2-0w-AL5"/> 157 <constraint firstItem="25d-3H-0fr" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" id="5o2-0w-AL5"/>
158 <constraint firstAttribute="trailing" secondItem="25d-3H-0fr" secondAttribute="trailing" id="7IX-2R-C0n"/> 158 <constraint firstAttribute="trailing" secondItem="25d-3H-0fr" secondAttribute="trailing" id="7IX-2R-C0n"/>
159 <constraint firstItem="O8z-6V-YFd" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="81K-BQ-6tU"/> 159 <constraint firstItem="O8z-6V-YFd" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="81K-BQ-6tU"/>
160 <constraint firstAttribute="bottom" secondItem="4VU-Ye-7Au" secondAttribute="bottom" constant="50" id="GKY-NB-YYF"/> 160 <constraint firstAttribute="bottom" secondItem="4VU-Ye-7Au" secondAttribute="bottom" constant="50" id="GKY-NB-YYF"/>
161 <constraint firstItem="O8z-6V-YFd" firstAttribute="top" secondItem="YWV-pS-TCo" secondAttribute="bottom" constant="10" id="HOo-rH-ysj"/> 161 <constraint firstItem="O8z-6V-YFd" firstAttribute="top" secondItem="YWV-pS-TCo" secondAttribute="bottom" constant="10" id="HOo-rH-ysj"/>
162 <constraint firstItem="Bdy-dI-j47" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="I1a-bY-ME9"/> 162 <constraint firstItem="Bdy-dI-j47" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="I1a-bY-ME9"/>
163 <constraint firstItem="YWV-pS-TCo" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="IS9-SU-75m"/> 163 <constraint firstItem="YWV-pS-TCo" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="IS9-SU-75m"/>
164 <constraint firstAttribute="trailing" secondItem="Bdy-dI-j47" secondAttribute="trailing" constant="15" id="Ka2-Ki-Pu6"/> 164 <constraint firstAttribute="trailing" secondItem="Bdy-dI-j47" secondAttribute="trailing" constant="15" id="Ka2-Ki-Pu6"/>
165 <constraint firstItem="qYg-Gw-R2b" firstAttribute="top" secondItem="YWV-pS-TCo" secondAttribute="bottom" constant="10" id="One-fp-LTK"/> 165 <constraint firstItem="qYg-Gw-R2b" firstAttribute="top" secondItem="YWV-pS-TCo" secondAttribute="bottom" constant="10" id="One-fp-LTK"/>
166 <constraint firstAttribute="trailing" secondItem="qYg-Gw-R2b" secondAttribute="trailing" constant="15" id="PMd-CT-MVj"/> 166 <constraint firstAttribute="trailing" secondItem="qYg-Gw-R2b" secondAttribute="trailing" constant="15" id="PMd-CT-MVj"/>
167 <constraint firstItem="gBg-k9-tgw" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="bTf-qW-d1y"/> 167 <constraint firstItem="gBg-k9-tgw" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="15" id="bTf-qW-d1y"/>
168 <constraint firstItem="YWV-pS-TCo" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="bottom" constant="8" id="cKj-l3-dgv"/> 168 <constraint firstItem="YWV-pS-TCo" firstAttribute="top" secondItem="25d-3H-0fr" secondAttribute="bottom" constant="8" id="cKj-l3-dgv"/>
169 <constraint firstItem="4VU-Ye-7Au" firstAttribute="top" secondItem="caN-x7-hJz" secondAttribute="bottom" constant="10" id="eQe-Kl-cMp"/> 169 <constraint firstItem="4VU-Ye-7Au" firstAttribute="top" secondItem="caN-x7-hJz" secondAttribute="bottom" constant="10" id="eQe-Kl-cMp"/>
170 <constraint firstItem="4VU-Ye-7Au" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="fru-BN-M5T"/> 170 <constraint firstItem="4VU-Ye-7Au" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="fru-BN-M5T"/>
171 <constraint firstItem="caN-x7-hJz" firstAttribute="top" secondItem="gBg-k9-tgw" secondAttribute="top" id="gUS-Ty-4Hk"/> 171 <constraint firstItem="caN-x7-hJz" firstAttribute="top" secondItem="gBg-k9-tgw" secondAttribute="top" id="gUS-Ty-4Hk"/>
172 <constraint firstItem="qYg-Gw-R2b" firstAttribute="leading" secondItem="O8z-6V-YFd" secondAttribute="trailing" constant="22" id="gzU-2Q-G96"/> 172 <constraint firstItem="qYg-Gw-R2b" firstAttribute="leading" secondItem="O8z-6V-YFd" secondAttribute="trailing" constant="22" id="gzU-2Q-G96"/>
173 <constraint firstItem="caN-x7-hJz" firstAttribute="leading" secondItem="gBg-k9-tgw" secondAttribute="trailing" constant="20" id="hWK-jf-zee"/> 173 <constraint firstItem="caN-x7-hJz" firstAttribute="leading" secondItem="gBg-k9-tgw" secondAttribute="trailing" constant="20" id="hWK-jf-zee"/>
174 <constraint firstItem="25d-3H-0fr" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="jhT-CE-fr7"/> 174 <constraint firstItem="25d-3H-0fr" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" id="jhT-CE-fr7"/>
175 <constraint firstItem="caN-x7-hJz" firstAttribute="width" secondItem="gBg-k9-tgw" secondAttribute="width" id="mD6-eL-KB7"/> 175 <constraint firstItem="caN-x7-hJz" firstAttribute="width" secondItem="gBg-k9-tgw" secondAttribute="width" id="mD6-eL-KB7"/>
176 <constraint firstItem="gBg-k9-tgw" firstAttribute="top" secondItem="Bdy-dI-j47" secondAttribute="bottom" constant="30" id="mgw-uX-VOK"/> 176 <constraint firstItem="gBg-k9-tgw" firstAttribute="top" secondItem="Bdy-dI-j47" secondAttribute="bottom" constant="30" id="mgw-uX-VOK"/>
177 <constraint firstAttribute="trailing" secondItem="YWV-pS-TCo" secondAttribute="trailing" constant="15" id="rEO-bb-Pqr"/> 177 <constraint firstAttribute="trailing" secondItem="YWV-pS-TCo" secondAttribute="trailing" constant="15" id="rEO-bb-Pqr"/>
178 <constraint firstAttribute="trailing" secondItem="caN-x7-hJz" secondAttribute="trailing" constant="16" id="rRn-Vw-t5g"/> 178 <constraint firstAttribute="trailing" secondItem="caN-x7-hJz" secondAttribute="trailing" constant="16" id="rRn-Vw-t5g"/>
179 <constraint firstItem="Bdy-dI-j47" firstAttribute="top" secondItem="O8z-6V-YFd" secondAttribute="bottom" constant="15" id="xEO-fP-Riz"/> 179 <constraint firstItem="Bdy-dI-j47" firstAttribute="top" secondItem="O8z-6V-YFd" secondAttribute="bottom" constant="15" id="xEO-fP-Riz"/>
180 <constraint firstAttribute="trailing" secondItem="4VU-Ye-7Au" secondAttribute="trailing" id="ylN-vm-QF2"/> 180 <constraint firstAttribute="trailing" secondItem="4VU-Ye-7Au" secondAttribute="trailing" id="ylN-vm-QF2"/>
181 </constraints> 181 </constraints>
182 <point key="canvasLocation" x="24.5" y="52.5"/> 182 <point key="canvasLocation" x="24.5" y="52.5"/>
183 </view> 183 </view>
184 </objects> 184 </objects>
185 <resources> 185 <resources>
186 <image name="icon_menu" width="30" height="30"/> 186 <image name="icon_menu" width="30" height="30"/>
187 <image name="today_back_button" width="73" height="37"/> 187 <image name="today_back_button" width="73" height="37"/>
188 </resources> 188 </resources>
189 </document> 189 </document>
190 190
LifeLog/LifeLog/GroupObject.h
1 // 1 //
2 // GroupObject.h 2 // GroupObject.h
3 // LifeLog 3 // LifeLog
4 // 4 //
5 // Created by nvtu on 8/11/17. 5 // Created by nvtu on 8/11/17.
6 // Copyright © 2017 PhongNV. All rights reserved. 6 // Copyright © 2017 PhongNV. All rights reserved.
7 // 7 //
8 8
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
10 10
11 @interface GroupObject : NSObject 11 @interface GroupObject : NSObject
12 12
13 @property (nonatomic) int groupID; 13 @property (nonatomic) int groupID;
14 @property (nonatomic) int numSearch; 14 @property (nonatomic) int numSearch;
15 15
16 @property (nonatomic) int walkGoal;
17 @property (nonatomic) int runGoal;
18 @property (nonatomic) int bikeGoal;
19 @property (nonatomic) int stepGoal;
20 @property (nonatomic) int gymGoal;
21 @property (nonatomic) int beginGoal;
22
16 @property (nonatomic) BOOL isJoin; 23 @property (nonatomic) BOOL isJoin;
17 @property (nonatomic) BOOL walkMode; 24 @property (nonatomic) BOOL walkMode;
18 @property (nonatomic) BOOL runMode; 25 @property (nonatomic) BOOL runMode;
19 @property (nonatomic) BOOL bikeMode; 26 @property (nonatomic) BOOL bikeMode;
20 @property (nonatomic) BOOL stepMode; 27 @property (nonatomic) BOOL stepMode;
21 @property (nonatomic) BOOL gymMode; 28 @property (nonatomic) BOOL gymMode;
22 @property (nonatomic) BOOL beginMode; 29 @property (nonatomic) BOOL beginMode;
23 30
24 @property (nonatomic, strong) NSString * name; 31 @property (nonatomic, strong) NSString * name;
25 @property (nonatomic, strong) NSString * avatar; 32 @property (nonatomic, strong) NSString * avatar;
26 @property (nonatomic, strong) NSString * goal; 33 @property (nonatomic, strong) NSString * goal;
27 34
28 @property (nonatomic, strong) NSDate * createDate; 35 @property (nonatomic, strong) NSDate * createDate;
29 36
30 -(id) initWithData : (NSDictionary *) dict; 37 -(id) initWithData : (NSDictionary *) dict;
31 38 -(id) initWithData : (NSDictionary *) dict andGroupID : (int) groupID;
39 -(void) updateDate : (GroupObject *) obj;
32 @end 40 @end
33 41
LifeLog/LifeLog/GroupObject.m
1 // 1 //
2 // GroupObject.m 2 // GroupObject.m
3 // LifeLog 3 // LifeLog
4 // 4 //
5 // Created by nvtu on 8/11/17. 5 // Created by nvtu on 8/11/17.
6 // Copyright © 2017 PhongNV. All rights reserved. 6 // Copyright © 2017 PhongNV. All rights reserved.
7 // 7 //
8 8
9 #import "GroupObject.h" 9 #import "GroupObject.h"
10 #import "Utilities.h" 10 #import "Utilities.h"
11 11
12 @implementation GroupObject 12 @implementation GroupObject
13
14 -(id) initWithData : (NSDictionary *) dict { 13 -(id) initWithData : (NSDictionary *) dict {
15 if([dict objectForKey:@"group_id"] != nil) { 14 if([dict objectForKey:@"group_id"] != nil) {
16 self.groupID = [dict[@"group_id"] intValue]; 15 self.groupID = [dict[@"group_id"] intValue];
17 } 16 }
18 if([dict objectForKey:@"group_name"] != nil) {
19 self.name = dict[@"group_name"];
20 }
21 if([dict objectForKey:@"group_avatar"] != nil) { 17 if([dict objectForKey:@"group_avatar"] != nil) {
22 self.avatar = dict[@"group_avatar"]; 18 self.avatar = dict[@"group_avatar"];
23 } 19 }
20 if([dict objectForKey:@"created_at"] != nil) {
21 NSString *dateString = dict[@"created_at"];
22 self.createDate = [Utilities dateFromString:dateString withFormat:@"yyyy-MM-dd hh:mm:ss"];
23 }
24 else {
25 self.createDate = [NSDate date];
26 }
27 if([dict objectForKey:@"num_search"] != nil) {
28 self.numSearch = [dict[@"num_search"] intValue];
29 }
30 [self parseData:dict];
31 return self;
32 }
33
34 -(id) initWithData : (NSDictionary *) dict andGroupID : (int) groupID {
35 self.groupID = groupID;
36 if([dict objectForKey:@"join_group"] != nil && ![[dict objectForKey:@"join_group"] isKindOfClass:[NSNull class]]) {
37 self.isJoin = [dict[@"join_group"] boolValue];
38 }
39 if([dict objectForKey:@"goal"] != nil && ![[dict objectForKey:@"goal"] isKindOfClass:[NSNull class]]) {
40 self.goal = dict[@"goal"];
41 }
42 else {
43 self.goal = @"";
44 }
45 if([dict objectForKey:@"walk_mode_goal"] != nil && ![[dict objectForKey:@"walk_mode_goal"] isKindOfClass:[NSNull class]]) {
46 self.walkGoal = [dict[@"walk_mode_goal"] intValue];
47 }
48 if([dict objectForKey:@"run_mode_goal"] != nil && ![[dict objectForKey:@"run_mode_goal"] isKindOfClass:[NSNull class]]) {
49 self.runGoal = [dict[@"run_mode_goal"] intValue];
50 }
51 if([dict objectForKey:@"bike_mode_goal"] != nil && ![[dict objectForKey:@"bike_mode_goal"] isKindOfClass:[NSNull class]]) {
52 self.bikeGoal = [dict[@"bike_mode_goal"] intValue];
53 }
54 if([dict objectForKey:@"step_mode_goal"] != nil && ![[dict objectForKey:@"step_mode_goal"] isKindOfClass:[NSNull class]]) {
55 self.stepGoal = [dict[@"step_mode_goal"] intValue];
56 }
57 if([dict objectForKey:@"gym_mode_goal"] != nil && ![[dict objectForKey:@"gym_mode_goal"] isKindOfClass:[NSNull class]]) {
58 self.gymGoal = [dict[@"gym_mode_goal"] intValue];
59 }
60 if([dict objectForKey:@"beginer_mode_goal"] != nil && ![[dict objectForKey:@"beginer_mode_goal"] isKindOfClass:[NSNull class]]) {
61 self.beginGoal = [dict[@"beginer_mode_goal"] intValue];
62 }
63 [self parseData:dict];
64 return self;
65 }
66
67 -(void) parseData : (NSDictionary *) dict {
68 if([dict objectForKey:@"group_name"] != nil) {
69 self.name = dict[@"group_name"];
70 }
24 if([dict objectForKey:@"walk_mode_active"] != nil && ![[dict objectForKey:@"walk_mode_active"] isKindOfClass:[NSNull class]]) { 71 if([dict objectForKey:@"walk_mode_active"] != nil && ![[dict objectForKey:@"walk_mode_active"] isKindOfClass:[NSNull class]]) {
25 self.walkMode = [dict[@"walk_mode_active"] boolValue]; 72 self.walkMode = [dict[@"walk_mode_active"] boolValue];
26 } 73 }
27 if([dict objectForKey:@"run_mode_active"] != nil && ![[dict objectForKey:@"run_mode_active"] isKindOfClass:[NSNull class]]) { 74 if([dict objectForKey:@"run_mode_active"] != nil && ![[dict objectForKey:@"run_mode_active"] isKindOfClass:[NSNull class]]) {
28 self.runMode = [dict[@"run_mode_active"] boolValue]; 75 self.runMode = [dict[@"run_mode_active"] boolValue];
29 } 76 }
30 if([dict objectForKey:@"bike_mode_active"] != nil && ![[dict objectForKey:@"bike_mode_active"] isKindOfClass:[NSNull class]]) { 77 if([dict objectForKey:@"bike_mode_active"] != nil && ![[dict objectForKey:@"bike_mode_active"] isKindOfClass:[NSNull class]]) {
31 self.bikeMode = [dict[@"bike_mode_active"] boolValue]; 78 self.bikeMode = [dict[@"bike_mode_active"] boolValue];
32 } 79 }
33 if([dict objectForKey:@"step_mode_active"] != nil && ![[dict objectForKey:@"step_mode_active"] isKindOfClass:[NSNull class]]) { 80 if([dict objectForKey:@"step_mode_active"] != nil && ![[dict objectForKey:@"step_mode_active"] isKindOfClass:[NSNull class]]) {
34 self.stepMode = [dict[@"step_mode_active"] boolValue]; 81 self.stepMode = [dict[@"step_mode_active"] boolValue];
35 } 82 }
36 if([dict objectForKey:@"gym_mode_active"] != nil && ![[dict objectForKey:@"gym_mode_active"] isKindOfClass:[NSNull class]]) { 83 if([dict objectForKey:@"gym_mode_active"] != nil && ![[dict objectForKey:@"gym_mode_active"] isKindOfClass:[NSNull class]]) {
37 self.gymMode = [dict[@"gym_mode_active"] boolValue]; 84 self.gymMode = [dict[@"gym_mode_active"] boolValue];
38 } 85 }
39 if([dict objectForKey:@"beginer_mode_active"] != nil && ![[dict objectForKey:@"beginer_mode_active"] isKindOfClass:[NSNull class]]) { 86 if([dict objectForKey:@"beginer_mode_active"] != nil && ![[dict objectForKey:@"beginer_mode_active"] isKindOfClass:[NSNull class]]) {
40 self.beginMode = [dict[@"beginer_mode_active"] boolValue]; 87 self.beginMode = [dict[@"beginer_mode_active"] boolValue];
41 } 88 }
42 if([dict objectForKey:@"join_group"] != nil && ![[dict objectForKey:@"join_group"] isKindOfClass:[NSNull class]]) { 89 }
43 self.isJoin = [dict[@"join_group"] boolValue]; 90
44 } 91 -(void) updateDate : (GroupObject *) obj {
45 if([dict objectForKey:@"created_at"] != nil) { 92 self.name = obj.name;
46 NSString *dateString = dict[@"created_at"]; 93 self.walkMode = obj.walkMode;
47 self.createDate = [Utilities dateFromString:dateString withFormat:@"yyyy-MM-dd hh:mm:ss"]; 94 self.runMode = obj.runMode;
48 } 95 self.bikeMode = obj.bikeMode;
49 else { 96 self.stepMode = obj.stepMode;
50 self.createDate = [NSDate date]; 97 self.gymMode = obj.gymMode;
51 } 98 self.beginMode = obj.beginMode;
52 if([dict objectForKey:@"num_search"] != nil) { 99 self.isJoin = obj.isJoin;
53 self.numSearch = [dict[@"num_search"] intValue]; 100 self.goal = obj.goal;
54 } 101 self.walkGoal = obj.walkGoal;
55 if([dict objectForKey:@"goal"] != nil && ![[dict objectForKey:@"goal"] isKindOfClass:[NSNull class]]) { 102 self.runGoal = obj.runGoal;
56 self.goal = dict[@"goal"]; 103 self.bikeGoal = obj.bikeGoal;
57 } 104 self.stepGoal = obj.stepGoal;
58 else { 105 self.gymGoal = obj.gymGoal;
59 self.goal = @""; 106 self.beginGoal = obj.beginGoal;
LifeLog/LifeLog/Localizable.strings
No preview for this file type
LifeLog/LifeLog/SNSViewController.m
1 // 1 //
2 // SNSViewController.m 2 // SNSViewController.m
3 // LifeLog 3 // LifeLog
4 // 4 //
5 // Created by Nguyen Van Phong on 7/25/17. 5 // Created by Nguyen Van Phong on 7/25/17.
6 // Copyright © 2017 PhongNV. All rights reserved. 6 // Copyright © 2017 PhongNV. All rights reserved.
7 // 7 //
8 8
9 #import "SNSViewController.h" 9 #import "SNSViewController.h"
10 10
11 #import <SDWebImage/UIImageView+WebCache.h> 11 #import <SDWebImage/UIImageView+WebCache.h>
12 12
13 #import "ServerAPI.h" 13 #import "ServerAPI.h"
14 #import "Utilities.h" 14 #import "Utilities.h"
15 15
16 #import "SNSRecentTopicTableViewCell.h" 16 #import "SNSRecentTopicTableViewCell.h"
17 #import "SearchGroupViewController.h" 17 #import "SearchGroupViewController.h"
18 #import "GroupDetailViewController.h" 18 #import "GroupDetailViewController.h"
19 19
20 @interface SNSViewController () 20 @interface SNSViewController ()
21 21
22 @end 22 @end
23 23
24 @implementation SNSViewController 24 @implementation SNSViewController
25 25
26 - (void)viewDidLoad { 26 - (void)viewDidLoad {
27 [super viewDidLoad]; 27 [super viewDidLoad];
28 // Do any additional setup after loading the view from its nib. 28 // Do any additional setup after loading the view from its nib.
29 self.title = NSLocalizedString(@"lifelog.tapbar.sns", nil); 29 self.title = NSLocalizedString(@"lifelog.tapbar.sns", nil);
30 30
31 [self callRequestToUpdateData]; 31 [self callRequestToUpdateData];
32 32
33 //register nib for table view 33 //register nib for table view
34 [self.tableBase registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"]; 34 [self.tableBase registerNib:[UINib nibWithNibName:@"SNSRecentTopicTableViewCell" bundle:nil] forCellReuseIdentifier:@"RecentTopicCell"];
35 } 35 }
36 36
37 - (void)didReceiveMemoryWarning { 37 - (void)didReceiveMemoryWarning {
38 [super didReceiveMemoryWarning]; 38 [super didReceiveMemoryWarning];
39 // Dispose of any resources that can be recreated. 39 // Dispose of any resources that can be recreated.
40 } 40 }
41 41
42 #pragma mark IBAction 42 #pragma mark IBAction
43 - (IBAction)clickRecommendGroup:(id)sender { 43 - (IBAction)clickRecommendGroup:(id)sender {
44 SearchGroupViewController * search = [[SearchGroupViewController alloc] init]; 44 SearchGroupViewController * search = [[SearchGroupViewController alloc] init];
45 [self.navigationController pushViewController:search animated:true]; 45 [self.navigationController pushViewController:search animated:true];
46 } 46 }
47 47
48 - (IBAction)clickMyGroup:(id)sender { 48 - (IBAction)clickMyGroup:(id)sender {
49 // GroupDetailViewController * detail = [[GroupDetailViewController alloc] init]; 49 // GroupDetailViewController * detail = [[GroupDetailViewController alloc] init];
50 // [self.navigationController pushViewController:detail animated:true]; 50 // [self.navigationController pushViewController:detail animated:true];
51 } 51 }
52 52
53 #pragma mark UITableView Delegate 53 #pragma mark UITableView Delegate
54 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 54 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
55 SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"]; 55 SNSRecentTopicTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RecentTopicCell"];
56 TweetObject *object = [_curDataList objectAtIndex:indexPath.row]; 56 TweetObject *object = [_curDataList objectAtIndex:indexPath.row];
57 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) { 57 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
58 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]]; 58 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
59 } 59 }
60 else {
61 [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
62 }
60 cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm"]; 63 cell.lblDateTime.text = [Utilities stringFromDate:object.createDate withFormat:@"YYYY/MM/dd hh:mm"];
61 cell.lblUsername.text = object.userName; 64 cell.lblUsername.text = object.userName;
62 cell.lblDes.text = object.content; 65 cell.lblDes.text = object.content;
63 cell.lblMode.text = object.mode; 66 cell.lblMode.text = object.mode;
64 cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance]; 67 cell.lblDistance.text = [NSString stringWithFormat:@"%.0f m", object.distance];
65 cell.lblDuration.text = object.time; 68 cell.lblDuration.text = object.time;
66 return cell; 69 return cell;
67 } 70 }
68 71
69 #pragma mark Private Function 72 #pragma mark Private Function
70 73
71 -(void) callRequestToUpdateData { 74 -(void) callRequestToUpdateData {
72 [super callRequestToUpdateData]; 75 [super callRequestToUpdateData];
73 76
74 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; 77 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
75 MBProgressHUD *hudView = nil; 78 MBProgressHUD *hudView = nil;
76 if(_curPage == 1 && !self.refreshControl.isRefreshing) { 79 if(_curPage == 1 && !self.refreshControl.isRefreshing) {
77 hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; 80 hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
78 } 81 }
79 [[ServerAPI server] requestTweetsList:token groupID:-1 withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){ 82 [[ServerAPI server] requestTweetsList:token groupID:-1 withPage:_curPage CompletionHandler:^(NSArray *array, NSError *error){
80 dispatch_async(dispatch_get_main_queue(), ^{ 83 dispatch_async(dispatch_get_main_queue(), ^{
81 if(hudView != nil) { 84 if(hudView != nil) {
82 [hudView hideAnimated:true]; 85 [hudView hideAnimated:true];
83 } 86 }
84 }); 87 });
85 SNSViewController __weak *weakSelf = self; 88 SNSViewController __weak *weakSelf = self;
86 [weakSelf updateTableData:array error:error]; 89 [weakSelf updateTableData:array error:error];
87 }]; 90 }];
88 } 91 }
89 92
90 @end 93 @end
91 94
LifeLog/LifeLog/SearchGroupViewController.m
1 // 1 //
2 // SearchGroupViewController.m 2 // SearchGroupViewController.m
3 // LifeLog 3 // LifeLog
4 // 4 //
5 // Created by nvtu on 8/11/17. 5 // Created by nvtu on 8/11/17.
6 // Copyright © 2017 PhongNV. All rights reserved. 6 // Copyright © 2017 PhongNV. All rights reserved.
7 // 7 //
8 8
9 #import "SearchGroupViewController.h" 9 #import "SearchGroupViewController.h"
10 10
11 #import <SDWebImage/UIImageView+WebCache.h> 11 #import <SDWebImage/UIImageView+WebCache.h>
12 12
13 #import "ServerAPI.h" 13 #import "ServerAPI.h"
14 #import "Utilities.h" 14 #import "Utilities.h"
15 15
16 #import "SearchGroupTableViewCell.h" 16 #import "SearchGroupTableViewCell.h"
17 #import "GroupDetailViewController.h" 17 #import "GroupDetailViewController.h"
18 18
19 @interface SearchGroupViewController () 19 @interface SearchGroupViewController ()
20 20
21 @end 21 @end
22 22
23 @implementation SearchGroupViewController 23 @implementation SearchGroupViewController
24 24
25 - (void)viewDidLoad { 25 - (void)viewDidLoad {
26 [super viewDidLoad]; 26 [super viewDidLoad];
27 [self callRequestToUpdateData]; 27 [self callRequestToUpdateData];
28 28
29 //register nib for table view 29 //register nib for table view
30 [self.tableBase registerNib:[UINib nibWithNibName:@"SearchGroupTableViewCell" bundle:nil] forCellReuseIdentifier:@"SearchGroupCell"]; 30 [self.tableBase registerNib:[UINib nibWithNibName:@"SearchGroupTableViewCell" bundle:nil] forCellReuseIdentifier:@"SearchGroupCell"];
31 } 31 }
32 32
33 - (void)didReceiveMemoryWarning { 33 - (void)didReceiveMemoryWarning {
34 [super didReceiveMemoryWarning]; 34 [super didReceiveMemoryWarning];
35 // Dispose of any resources that can be recreated. 35 // Dispose of any resources that can be recreated.
36 } 36 }
37 37
38 #pragma mark IBAction 38 #pragma mark IBAction
39 39
40 - (IBAction)clickBack:(id)sender { 40 - (IBAction)clickBack:(id)sender {
41 [self.navigationController popViewControllerAnimated:true]; 41 [self.navigationController popViewControllerAnimated:true];
42 } 42 }
43 43
44 - (IBAction)clickSearch:(id)sender { 44 - (IBAction)clickSearch:(id)sender {
45 [self resetData]; 45 [self resetData];
46 } 46 }
47 47
48 - (IBAction)clickCreateGroup:(id)sender { 48 - (IBAction)clickCreateGroup:(id)sender {
49 49
50 } 50 }
51 51
52 #pragma mark UITableView Delegate 52 #pragma mark UITableView Delegate
53 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 53 - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
54 SearchGroupTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"SearchGroupCell"]; 54 SearchGroupTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"SearchGroupCell"];
55 GroupObject *object = [_curDataList objectAtIndex:indexPath.row]; 55 GroupObject *object = [_curDataList objectAtIndex:indexPath.row];
56 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) { 56 if(object.avatar && ![object.avatar isKindOfClass:[NSNull class]]) {
57 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]]; 57 [cell.imgAvatar sd_setImageWithURL:[NSURL URLWithString:[Utilities getImageLink:object.avatar]]];
58 } 58 }
59 else {
60 [cell.imgAvatar setImage:[UIImage imageNamed:@"avatar_default"]];
61 }
59 cell.lblName.text = object.name; 62 cell.lblName.text = object.name;
60 return cell; 63 return cell;
61 } 64 }
62 65
63 -(void) scrollViewDidScroll:(UIScrollView *)scrollView { 66 -(void) scrollViewDidScroll:(UIScrollView *)scrollView {
64 [self.view endEditing:true]; 67 [self.view endEditing:true];
65 } 68 }
66 69
67 -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 70 -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
68 GroupDetailViewController * detail = [[GroupDetailViewController alloc] init]; 71 GroupDetailViewController * detail = [[GroupDetailViewController alloc] init];
69 [detail setGroup:[_curDataList objectAtIndex:indexPath.row]]; 72 [detail setGroup:[_curDataList objectAtIndex:indexPath.row]];
70 [self.navigationController pushViewController:detail animated:true]; 73 [self.navigationController pushViewController:detail animated:true];
71 } 74 }
72 75
73 #pragma mark UITextField Delegate 76 #pragma mark UITextField Delegate
74 -(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 77 -(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
75 [self resetData]; 78 [self resetData];
76 return true; 79 return true;
77 } 80 }
78 81
79 #pragma mark Private Function 82 #pragma mark Private Function
80 -(void) callRequestToUpdateData { 83 -(void) callRequestToUpdateData {
81 [super callRequestToUpdateData]; 84 [super callRequestToUpdateData];
82 85
83 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; 86 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
84 MBProgressHUD *hudView = nil; 87 MBProgressHUD *hudView = nil;
85 if(_curPage == 1 && !self.refreshControl.isRefreshing) { 88 if(_curPage == 1 && !self.refreshControl.isRefreshing) {
86 hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true]; 89 hudView = [MBProgressHUD showHUDAddedTo:self.view animated:true];
87 } 90 }
88 [[ServerAPI server] searchGroup:token withKey:self.textFieldSearch.text andPage:_curPage CompletionHandler:^(NSArray *array, NSError *error) { 91 [[ServerAPI server] searchGroup:token withKey:self.textFieldSearch.text andPage:_curPage CompletionHandler:^(NSArray *array, NSError *error) {
89 dispatch_async(dispatch_get_main_queue(), ^{ 92 dispatch_async(dispatch_get_main_queue(), ^{
90 if(hudView != nil) { 93 if(hudView != nil) {
91 [hudView hideAnimated:true]; 94 [hudView hideAnimated:true];
92 } 95 }
93 }); 96 });
94 SearchGroupViewController __weak *weakSelf = self; 97 SearchGroupViewController __weak *weakSelf = self;
95 [weakSelf updateTableData:array error:error]; 98 [weakSelf updateTableData:array error:error];
96 }]; 99 }];
97 } 100 }
98 @end 101 @end
99 102
LifeLog/LifeLog/ServerAPI.m
1 // 1 //
2 // ServerAPI.m 2 // ServerAPI.m
3 // LifeLog 3 // LifeLog
4 // 4 //
5 // Created by Nguyen Van Phong on 7/30/17. 5 // Created by Nguyen Van Phong on 7/30/17.
6 // Copyright © 2017 PhongNV. All rights reserved. 6 // Copyright © 2017 PhongNV. All rights reserved.
7 // 7 //
8 8
9 #import "ServerAPI.h" 9 #import "ServerAPI.h"
10 10
11 NSString *const kServerAddress = @"http://clover.timesfun.jp:9001/"; 11 NSString *const kServerAddress = @"http://clover.timesfun.jp:9001/";
12 NSString *const kUser = @"KEY_USER"; 12 NSString *const kUser = @"KEY_USER";
13 NSString *const kToken = @"KEY_TOKEN"; 13 NSString *const kToken = @"KEY_TOKEN";
14 NSString *const kNotificationToken = @"TOKEN_INVALID"; 14 NSString *const kNotificationToken = @"TOKEN_INVALID";
15 15
16 @implementation NSString (NSString_Extended) 16 @implementation NSString (NSString_Extended)
17 - (NSString *)urlencode { 17 - (NSString *)urlencode {
18 NSMutableString *output = [NSMutableString string]; 18 NSMutableString *output = [NSMutableString string];
19 const unsigned char *source = (const unsigned char *)[self UTF8String]; 19 const unsigned char *source = (const unsigned char *)[self UTF8String];
20 int sourceLen = (int)strlen((const char *)source); 20 int sourceLen = (int)strlen((const char *)source);
21 for (int i = 0; i < sourceLen; ++i) { 21 for (int i = 0; i < sourceLen; ++i) {
22 const unsigned char thisChar = source[i]; 22 const unsigned char thisChar = source[i];
23 if (thisChar == ' '){ 23 if (thisChar == ' '){
24 [output appendString:@"+"]; 24 [output appendString:@"+"];
25 } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || 25 } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
26 (thisChar >= 'a' && thisChar <= 'z') || 26 (thisChar >= 'a' && thisChar <= 'z') ||
27 (thisChar >= 'A' && thisChar <= 'Z') || 27 (thisChar >= 'A' && thisChar <= 'Z') ||
28 (thisChar >= '0' && thisChar <= '9')) { 28 (thisChar >= '0' && thisChar <= '9')) {
29 [output appendFormat:@"%c", thisChar]; 29 [output appendFormat:@"%c", thisChar];
30 } else { 30 } else {
31 [output appendFormat:@"%%%02X", thisChar]; 31 [output appendFormat:@"%%%02X", thisChar];
32 } 32 }
33 } 33 }
34 return output; 34 return output;
35 } 35 }
36 @end 36 @end
37 37
38 @implementation ServerAPI 38 @implementation ServerAPI
39 static ServerAPI *_server = nil; 39 static ServerAPI *_server = nil;
40 40
41 NSURLSessionDataTask * searchTask; 41 NSURLSessionDataTask * searchTask;
42 42
43 @synthesize timeOutInterval = _timeOutInterval; 43 @synthesize timeOutInterval = _timeOutInterval;
44 44
45 + (instancetype)server 45 + (instancetype)server
46 { 46 {
47 @synchronized(self) { 47 @synchronized(self) {
48 if (_server == nil) { 48 if (_server == nil) {
49 _server = [[ServerAPI alloc] init]; 49 _server = [[ServerAPI alloc] init];
50 } 50 }
51 } 51 }
52 return _server; 52 return _server;
53 } 53 }
54 54
55 - (instancetype)init 55 - (instancetype)init
56 { 56 {
57 self = [super init]; 57 self = [super init];
58 if (self != nil) { 58 if (self != nil) {
59 self.timeOutInterval = 150; 59 self.timeOutInterval = 150;
60 } 60 }
61 return self; 61 return self;
62 } 62 }
63 63
64 #pragma mark - Login and Register 64 #pragma mark - Login and Register
65 // Login 65 // Login
66 - (void)loginWithEmail:(NSString *)email Password:(NSString *)password CompletionHandler: (void (^)(User *, NSString *, NSError *)) completion 66 - (void)loginWithEmail:(NSString *)email Password:(NSString *)password CompletionHandler: (void (^)(User *, NSString *, NSError *)) completion
67 { 67 {
68 [self _request:[kServerAddress stringByAppendingFormat: @"login"] method:@"POST" token:@"" paras:@{@"email":email, @"password": password} completion:^(NSData *data, NSError *error) { 68 [self _request:[kServerAddress stringByAppendingFormat: @"login"] method:@"POST" token:@"" paras:@{@"email":email, @"password": password} completion:^(NSData *data, NSError *error) {
69 69
70 if (completion == NULL) { 70 if (completion == NULL) {
71 return ; 71 return ;
72 } 72 }
73 73
74 if (error == nil) 74 if (error == nil)
75 { 75 {
76 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 76 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
77 77
78 int status = [dataResult[@"status"] intValue]; 78 int status = [dataResult[@"status"] intValue];
79 if (status == 1) { // status = 1 success 79 if (status == 1) { // status = 1 success
80 NSString *token = dataResult[@"result"][@"token"]; 80 NSString *token = dataResult[@"result"][@"token"];
81 NSDictionary *dictUser = dataResult[@"result"][@"user"]; 81 NSDictionary *dictUser = dataResult[@"result"][@"user"];
82 User *user = [[User alloc] init]; 82 User *user = [[User alloc] init];
83 user.user_id = [NSString stringWithFormat:@"%@",dictUser[@"id"]]; 83 user.user_id = [NSString stringWithFormat:@"%@",dictUser[@"id"]];
84 user.username = [NSString stringWithFormat:@"%@",dictUser[@"username"]]; 84 user.username = [NSString stringWithFormat:@"%@",dictUser[@"username"]];
85 user.full_name = [NSString stringWithFormat:@"%@",dictUser[@"full_name"]]; 85 user.full_name = [NSString stringWithFormat:@"%@",dictUser[@"full_name"]];
86 user.nickname = [NSString stringWithFormat:@"%@",dictUser[@"nickname"]]; 86 user.nickname = [NSString stringWithFormat:@"%@",dictUser[@"nickname"]];
87 user.email = [NSString stringWithFormat:@"%@",dictUser[@"email"]]; 87 user.email = [NSString stringWithFormat:@"%@",dictUser[@"email"]];
88 user.password = [NSString stringWithFormat:@"%@",dictUser[@"password"]]; 88 user.password = [NSString stringWithFormat:@"%@",dictUser[@"password"]];
89 user.birthday = [NSString stringWithFormat:@"%@",dictUser[@"birthday"]]; 89 user.birthday = [NSString stringWithFormat:@"%@",dictUser[@"birthday"]];
90 user.address = [NSString stringWithFormat:@"%@",dictUser[@"address"]]; 90 user.address = [NSString stringWithFormat:@"%@",dictUser[@"address"]];
91 user.gender = [[NSString stringWithFormat:@"%@",dictUser[@"gender"]] intValue]; 91 user.gender = [[NSString stringWithFormat:@"%@",dictUser[@"gender"]] intValue];
92 user.height = [[NSString stringWithFormat:@"%@",dictUser[@"height"]] floatValue]; 92 user.height = [[NSString stringWithFormat:@"%@",dictUser[@"height"]] floatValue];
93 user.weight = [[NSString stringWithFormat:@"%@",dictUser[@"weight"]] floatValue]; 93 user.weight = [[NSString stringWithFormat:@"%@",dictUser[@"weight"]] floatValue];
94 user.user_description = [NSString stringWithFormat:@"%@",dictUser[@"description"]]; 94 user.user_description = [NSString stringWithFormat:@"%@",dictUser[@"description"]];
95 user.created_at = [NSString stringWithFormat:@"%@",dictUser[@"created_at"]]; 95 user.created_at = [NSString stringWithFormat:@"%@",dictUser[@"created_at"]];
96 user.physical_activity = [NSString stringWithFormat:@"%@",dictUser[@"physical_activity"]]; 96 user.physical_activity = [NSString stringWithFormat:@"%@",dictUser[@"physical_activity"]];
97 user.profile_image = [NSString stringWithFormat:@"%@",dictUser[@"profile_image"]]; 97 user.profile_image = [NSString stringWithFormat:@"%@",dictUser[@"profile_image"]];
98 user.updated_at = [NSString stringWithFormat:@"%@",dictUser[@"updated_at"]]; 98 user.updated_at = [NSString stringWithFormat:@"%@",dictUser[@"updated_at"]];
99 user.delete_flag = [[NSString stringWithFormat:@"%@",dictUser[@"delete_flag"]] intValue]; 99 user.delete_flag = [[NSString stringWithFormat:@"%@",dictUser[@"delete_flag"]] intValue];
100 user.fat_rate = [[NSString stringWithFormat:@"%@",dictUser[@"fat_rate"]] intValue]; 100 user.fat_rate = [[NSString stringWithFormat:@"%@",dictUser[@"fat_rate"]] intValue];
101 user.profiles_share = [[NSString stringWithFormat:@"%@",dictUser[@"profiles_share"]] intValue]; 101 user.profiles_share = [[NSString stringWithFormat:@"%@",dictUser[@"profiles_share"]] intValue];
102 user.remember_me = [[NSString stringWithFormat:@"%@",dictUser[@"remember_me"]] intValue]; 102 user.remember_me = [[NSString stringWithFormat:@"%@",dictUser[@"remember_me"]] intValue];
103 user.sound_notifications_share = [[NSString stringWithFormat:@"%@",dictUser[@"sound_notifications_share"]] intValue]; 103 user.sound_notifications_share = [[NSString stringWithFormat:@"%@",dictUser[@"sound_notifications_share"]] intValue];
104 user.spend_calo_in_day = [[NSString stringWithFormat:@"%@",dictUser[@"spend_calo_in_day"]] intValue]; 104 user.spend_calo_in_day = [[NSString stringWithFormat:@"%@",dictUser[@"spend_calo_in_day"]] intValue];
105 user.target = [[NSString stringWithFormat:@"%@",dictUser[@"target"]] intValue]; 105 user.target = [[NSString stringWithFormat:@"%@",dictUser[@"target"]] intValue];
106 completion(user, token, nil); 106 completion(user, token, nil);
107 } 107 }
108 else { // status = 0 error 108 else { // status = 0 error
109 NSString *message = dataResult[@"message"]; 109 NSString *message = dataResult[@"message"];
110 if (message == nil) { 110 if (message == nil) {
111 message = @"Unknown error"; 111 message = @"Unknown error";
112 } 112 }
113 NSError *loginFaild = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 113 NSError *loginFaild = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
114 completion(nil, nil, loginFaild); 114 completion(nil, nil, loginFaild);
115 } 115 }
116 } 116 }
117 else 117 else
118 { 118 {
119 completion(nil, nil, error); 119 completion(nil, nil, error);
120 } 120 }
121 }]; 121 }];
122 } 122 }
123 123
124 // Register 124 // Register
125 - (void)registerUserWithParams:(NSDictionary *)params CompletionHandler: (void (^)(User *, NSString *, NSError *)) completion { 125 - (void)registerUserWithParams:(NSDictionary *)params CompletionHandler: (void (^)(User *, NSString *, NSError *)) completion {
126 [self _request:[kServerAddress stringByAppendingFormat: @"register"] method:@"POST" token:@"" paras:params completion:^(NSData *data, NSError *error) { 126 [self _request:[kServerAddress stringByAppendingFormat: @"register"] method:@"POST" token:@"" paras:params completion:^(NSData *data, NSError *error) {
127 127
128 if (completion == NULL) { 128 if (completion == NULL) {
129 return ; 129 return ;
130 } 130 }
131 131
132 if (error == nil) 132 if (error == nil)
133 { 133 {
134 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 134 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
135 135
136 int status = [dataResult[@"status"] intValue]; 136 int status = [dataResult[@"status"] intValue];
137 if (status == 1) { // status = 1 success 137 if (status == 1) { // status = 1 success
138 NSString *token = dataResult[@"result"][@"token"]; 138 NSString *token = dataResult[@"result"][@"token"];
139 NSDictionary *dictUser = dataResult[@"result"][@"user"]; 139 NSDictionary *dictUser = dataResult[@"result"][@"user"];
140 User *user = [[User alloc] init]; 140 User *user = [[User alloc] init];
141 user.user_id = [NSString stringWithFormat:@"%@",dictUser[@"id"]]; 141 user.user_id = [NSString stringWithFormat:@"%@",dictUser[@"id"]];
142 user.username = [NSString stringWithFormat:@"%@",dictUser[@"username"]]; 142 user.username = [NSString stringWithFormat:@"%@",dictUser[@"username"]];
143 user.full_name = [NSString stringWithFormat:@"%@",dictUser[@"full_name"]]; 143 user.full_name = [NSString stringWithFormat:@"%@",dictUser[@"full_name"]];
144 user.nickname = [NSString stringWithFormat:@"%@",dictUser[@"nickname"]]; 144 user.nickname = [NSString stringWithFormat:@"%@",dictUser[@"nickname"]];
145 user.email = [NSString stringWithFormat:@"%@",dictUser[@"email"]]; 145 user.email = [NSString stringWithFormat:@"%@",dictUser[@"email"]];
146 user.password = [NSString stringWithFormat:@"%@",dictUser[@"password"]]; 146 user.password = [NSString stringWithFormat:@"%@",dictUser[@"password"]];
147 user.birthday = [NSString stringWithFormat:@"%@",dictUser[@"birthday"]]; 147 user.birthday = [NSString stringWithFormat:@"%@",dictUser[@"birthday"]];
148 user.address = [NSString stringWithFormat:@"%@",dictUser[@"address"]]; 148 user.address = [NSString stringWithFormat:@"%@",dictUser[@"address"]];
149 user.gender = [[NSString stringWithFormat:@"%@",dictUser[@"gender"]] intValue]; 149 user.gender = [[NSString stringWithFormat:@"%@",dictUser[@"gender"]] intValue];
150 user.height = [[NSString stringWithFormat:@"%@",dictUser[@"height"]] floatValue]; 150 user.height = [[NSString stringWithFormat:@"%@",dictUser[@"height"]] floatValue];
151 user.weight = [[NSString stringWithFormat:@"%@",dictUser[@"weight"]] floatValue]; 151 user.weight = [[NSString stringWithFormat:@"%@",dictUser[@"weight"]] floatValue];
152 user.user_description = [NSString stringWithFormat:@"%@",dictUser[@"description"]]; 152 user.user_description = [NSString stringWithFormat:@"%@",dictUser[@"description"]];
153 user.created_at = [NSString stringWithFormat:@"%@",dictUser[@"created_at"]]; 153 user.created_at = [NSString stringWithFormat:@"%@",dictUser[@"created_at"]];
154 user.physical_activity = [NSString stringWithFormat:@"%@",dictUser[@"physical_activity"]]; 154 user.physical_activity = [NSString stringWithFormat:@"%@",dictUser[@"physical_activity"]];
155 user.profile_image = [NSString stringWithFormat:@"%@",dictUser[@"profile_image"]]; 155 user.profile_image = [NSString stringWithFormat:@"%@",dictUser[@"profile_image"]];
156 user.updated_at = [NSString stringWithFormat:@"%@",dictUser[@"updated_at"]]; 156 user.updated_at = [NSString stringWithFormat:@"%@",dictUser[@"updated_at"]];
157 user.delete_flag = [[NSString stringWithFormat:@"%@",dictUser[@"delete_flag"]] intValue]; 157 user.delete_flag = [[NSString stringWithFormat:@"%@",dictUser[@"delete_flag"]] intValue];
158 user.fat_rate = [[NSString stringWithFormat:@"%@",dictUser[@"fat_rate"]] intValue]; 158 user.fat_rate = [[NSString stringWithFormat:@"%@",dictUser[@"fat_rate"]] intValue];
159 user.profiles_share = [[NSString stringWithFormat:@"%@",dictUser[@"profiles_share"]] intValue]; 159 user.profiles_share = [[NSString stringWithFormat:@"%@",dictUser[@"profiles_share"]] intValue];
160 user.remember_me = [[NSString stringWithFormat:@"%@",dictUser[@"remember_me"]] intValue]; 160 user.remember_me = [[NSString stringWithFormat:@"%@",dictUser[@"remember_me"]] intValue];
161 user.sound_notifications_share = [[NSString stringWithFormat:@"%@",dictUser[@"sound_notifications_share"]] intValue]; 161 user.sound_notifications_share = [[NSString stringWithFormat:@"%@",dictUser[@"sound_notifications_share"]] intValue];
162 user.spend_calo_in_day = [[NSString stringWithFormat:@"%@",dictUser[@"spend_calo_in_day"]] intValue]; 162 user.spend_calo_in_day = [[NSString stringWithFormat:@"%@",dictUser[@"spend_calo_in_day"]] intValue];
163 user.target = [[NSString stringWithFormat:@"%@",dictUser[@"target"]] intValue]; 163 user.target = [[NSString stringWithFormat:@"%@",dictUser[@"target"]] intValue];
164 completion(user, token, nil); 164 completion(user, token, nil);
165 } 165 }
166 else { // status = 0 error 166 else { // status = 0 error
167 NSString *message = dataResult[@"message"]; 167 NSString *message = dataResult[@"message"];
168 if (message == nil) { 168 if (message == nil) {
169 message = @"Unknown error"; 169 message = @"Unknown error";
170 } 170 }
171 NSError *loginFaild = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 171 NSError *loginFaild = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
172 completion(nil, nil, loginFaild); 172 completion(nil, nil, loginFaild);
173 } 173 }
174 } 174 }
175 else 175 else
176 { 176 {
177 completion(nil, nil, error); 177 completion(nil, nil, error);
178 } 178 }
179 }]; 179 }];
180 } 180 }
181 181
182 - (void)forgetPass:(NSString *)email CompletionHandler:(void (^)(NSError *)) completion { 182 - (void)forgetPass:(NSString *)email CompletionHandler:(void (^)(NSError *)) completion {
183 [self _request:[kServerAddress stringByAppendingFormat: @"forgetPass"] method:@"POST" token:@"" paras:@{@"email":email} completion:^(NSData *data, NSError *error) { 183 [self _request:[kServerAddress stringByAppendingFormat: @"forgetPass"] method:@"POST" token:@"" paras:@{@"email":email} completion:^(NSData *data, NSError *error) {
184 184
185 if (completion == NULL) { 185 if (completion == NULL) {
186 return ; 186 return ;
187 } 187 }
188 188
189 if (error == nil) 189 if (error == nil)
190 { 190 {
191 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 191 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
192 192
193 int status = [dataResult[@"status"] intValue]; 193 int status = [dataResult[@"status"] intValue];
194 if (status == 1) { // status = 1 success 194 if (status == 1) { // status = 1 success
195 completion(nil); 195 completion(nil);
196 } 196 }
197 else { // status = 0 error 197 else { // status = 0 error
198 NSString *message = dataResult[@"message"]; 198 NSString *message = dataResult[@"message"];
199 if (message == nil) { 199 if (message == nil) {
200 message = @"Unknown error"; 200 message = @"Unknown error";
201 } 201 }
202 NSError *forgetPass = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 202 NSError *forgetPass = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
203 completion(forgetPass); 203 completion(forgetPass);
204 } 204 }
205 } 205 }
206 else 206 else
207 { 207 {
208 completion(error); 208 completion(error);
209 } 209 }
210 }]; 210 }];
211 } 211 }
212 - (void)confirmForgetPass:(NSString *)email withConfirm:(NSString *)confirm CompletionHandler:(void (^)(NSError *)) completion { 212 - (void)confirmForgetPass:(NSString *)email withConfirm:(NSString *)confirm CompletionHandler:(void (^)(NSError *)) completion {
213 [self _request:[kServerAddress stringByAppendingFormat: @"forgetPass/confirm"] method:@"POST" token:@"" paras:@{@"email":email, @"code_confirm": confirm} completion:^(NSData *data, NSError *error) { 213 [self _request:[kServerAddress stringByAppendingFormat: @"forgetPass/confirm"] method:@"POST" token:@"" paras:@{@"email":email, @"code_confirm": confirm} completion:^(NSData *data, NSError *error) {
214 214
215 if (completion == NULL) { 215 if (completion == NULL) {
216 return ; 216 return ;
217 } 217 }
218 218
219 if (error == nil) 219 if (error == nil)
220 { 220 {
221 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 221 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
222 222
223 int status = [dataResult[@"status"] intValue]; 223 int status = [dataResult[@"status"] intValue];
224 if (status == 1) { // status = 1 success 224 if (status == 1) { // status = 1 success
225 completion(nil); 225 completion(nil);
226 } 226 }
227 else { // status = 0 error 227 else { // status = 0 error
228 NSString *message = dataResult[@"message"]; 228 NSString *message = dataResult[@"message"];
229 NSError *confirmForgetPass = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 229 NSError *confirmForgetPass = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
230 completion(confirmForgetPass); 230 completion(confirmForgetPass);
231 } 231 }
232 } 232 }
233 else 233 else
234 { 234 {
235 completion(error); 235 completion(error);
236 } 236 }
237 }]; 237 }];
238 } 238 }
239 239
240 - (void)uploadImage:(NSString *)token andImageData:(NSData *)data CompletionHandler:(void (^)(NSString *, NSError *)) completion { 240 - (void)uploadImage:(NSString *)token andImageData:(NSData *)data CompletionHandler:(void (^)(NSString *, NSError *)) completion {
241 NSDictionary *dict = nil; 241 NSDictionary *dict = nil;
242 NSString *base64Encoded = [data base64EncodedStringWithOptions:0]; 242 NSString *base64Encoded = [data base64EncodedStringWithOptions:0];
243 if (token != nil) { 243 if (token != nil) {
244 dict = @{@"token":token, @"img": base64Encoded}; 244 dict = @{@"token":token, @"img": base64Encoded};
245 } 245 }
246 else { 246 else {
247 dict = @{@"img": base64Encoded}; 247 dict = @{@"img": base64Encoded};
248 } 248 }
249 [self _request:[kServerAddress stringByAppendingFormat: @"upload-image"] method:@"POST" token:token paras:dict completion:^(NSData *data, NSError *error) { 249 [self _request:[kServerAddress stringByAppendingFormat: @"upload-image"] method:@"POST" token:token paras:dict completion:^(NSData *data, NSError *error) {
250 250
251 if (completion == NULL) { 251 if (completion == NULL) {
252 return ; 252 return ;
253 } 253 }
254 254
255 if (error == nil) 255 if (error == nil)
256 { 256 {
257 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 257 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
258 NSString *image_profile = [NSString stringWithFormat:@"%@", dataResult[@"message"]]; 258 NSString *image_profile = [NSString stringWithFormat:@"%@", dataResult[@"message"]];
259 completion(image_profile, nil); 259 completion(image_profile, nil);
260 } 260 }
261 else 261 else
262 { 262 {
263 completion(nil, error); 263 completion(nil, error);
264 } 264 }
265 }]; 265 }];
266 } 266 }
267 267
268 -(NSString *) convertIntToString : (int) type { 268 -(NSString *) convertIntToString : (int) type {
269 switch (type) { 269 switch (type) {
270 case 1: 270 case 1:
271 return @"week"; 271 return @"week";
272 break; 272 break;
273 case 2: 273 case 2:
274 return @"oneMonth"; 274 return @"oneMonth";
275 break; 275 break;
276 case 3: 276 case 3:
277 return @"threeMonth"; 277 return @"threeMonth";
278 break; 278 break;
279 case 4: 279 case 4:
280 return @"sixMonth"; 280 return @"sixMonth";
281 break; 281 break;
282 default: 282 default:
283 return @"today"; 283 return @"today";
284 break; 284 break;
285 } 285 }
286 } 286 }
287 287
288 #pragma mark - Home Screen Function 288 #pragma mark - Home Screen Function
289 - (void)requestTopWithMode:(int)mode andDate:(NSString *)date CompletionHandler:(void (^)(TopObject *, NSError *)) completion 289 - (void)requestTopWithMode:(int)mode andDate:(NSString *)date CompletionHandler:(void (^)(TopObject *, NSError *)) completion
290 { 290 {
291 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; 291 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
292 NSString *url = [kServerAddress stringByAppendingFormat:@"api/top/%d/%@", mode, date]; 292 NSString *url = [kServerAddress stringByAppendingFormat:@"api/top/%d/%@", mode, date];
293 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { 293 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
294 294
295 if (completion == NULL) { 295 if (completion == NULL) {
296 return ; 296 return ;
297 } 297 }
298 298
299 if (error == nil) 299 if (error == nil)
300 { 300 {
301 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 301 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
302 int status = [dataResult[@"status"] intValue]; 302 int status = [dataResult[@"status"] intValue];
303 if (status == 1) { // status = 1 success 303 if (status == 1) { // status = 1 success
304 if(dataResult[@"result"] != nil) { 304 if(dataResult[@"result"] != nil) {
305 NSDictionary * dictResult = dataResult[@"result"]; 305 NSDictionary * dictResult = dataResult[@"result"];
306 TopObject *topObject = [[TopObject alloc] init]; 306 TopObject *topObject = [[TopObject alloc] init];
307 TargetInfor *targetInfor = [[TargetInfor alloc] initWithData:dictResult[@"targetInf"]]; 307 TargetInfor *targetInfor = [[TargetInfor alloc] initWithData:dictResult[@"targetInf"]];
308 topObject.targetInfor = targetInfor; 308 topObject.targetInfor = targetInfor;
309 topObject.kcal = [[NSString stringWithFormat:@"%@", dictResult[@"kcal"]] intValue]; 309 topObject.kcal = [[NSString stringWithFormat:@"%@", dictResult[@"kcal"]] intValue];
310 topObject.distance = [[NSString stringWithFormat:@"%@", dictResult[@"distance"]] floatValue]; 310 topObject.distance = [[NSString stringWithFormat:@"%@", dictResult[@"distance"]] floatValue];
311 topObject.time = [NSString stringWithFormat:@"%@", dictResult[@"time"]]; 311 topObject.time = [NSString stringWithFormat:@"%@", dictResult[@"time"]];
312 NSMutableArray *arrayStep = [[NSMutableArray alloc] init]; 312 NSMutableArray *arrayStep = [[NSMutableArray alloc] init];
313 NSArray *array = dictResult[@"dataChart"]; 313 NSArray *array = dictResult[@"dataChart"];
314 for(NSDictionary *dict in array) { 314 for(NSDictionary *dict in array) {
315 StepObject *object = [[StepObject alloc] init]; 315 StepObject *object = [[StepObject alloc] init];
316 if([dict objectForKey:@"numStep"] != nil) { 316 if([dict objectForKey:@"numStep"] != nil) {
317 object.step = [dict[@"numStep"] intValue]; 317 object.step = [dict[@"numStep"] intValue];
318 } 318 }
319 if([dict objectForKey:@"hour"] != nil) { 319 if([dict objectForKey:@"hour"] != nil) {
320 object.hour = [dict[@"hour"] intValue]; 320 object.hour = [dict[@"hour"] intValue];
321 } 321 }
322 switch (mode) { 322 switch (mode) {
323 case 1: 323 case 1:
324 object.typeStep = @"walking"; 324 object.typeStep = @"walking";
325 break; 325 break;
326 case 2: 326 case 2:
327 object.typeStep = @"running"; 327 object.typeStep = @"running";
328 break; 328 break;
329 case 3: 329 case 3:
330 object.typeStep = @"bike"; 330 object.typeStep = @"bike";
331 break; 331 break;
332 default: 332 default:
333 break; 333 break;
334 } 334 }
335 [arrayStep addObject:object]; 335 [arrayStep addObject:object];
336 } 336 }
337 topObject.dataChart = [[NSMutableArray alloc] initWithArray:arrayStep]; 337 topObject.dataChart = [[NSMutableArray alloc] initWithArray:arrayStep];
338 completion(topObject, nil); 338 completion(topObject, nil);
339 } 339 }
340 else { 340 else {
341 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 341 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
342 completion(nil, errorObject); 342 completion(nil, errorObject);
343 } 343 }
344 } 344 }
345 else { 345 else {
346 NSString *message = dataResult[@"message"]; 346 NSString *message = dataResult[@"message"];
347 if (message == nil) { 347 if (message == nil) {
348 message = @"Unknown error"; 348 message = @"Unknown error";
349 } 349 }
350 350
351 if ([message isEqualToString:@"Token is invalid"]) { 351 if ([message isEqualToString:@"Token is invalid"]) {
352 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 352 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
353 [self requestTopWithMode:mode andDate:date CompletionHandler:completion]; 353 [self requestTopWithMode:mode andDate:date CompletionHandler:completion];
354 } 354 }
355 else { 355 else {
356 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 356 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
357 completion(nil, errorObject); 357 completion(nil, errorObject);
358 } 358 }
359 } 359 }
360 } 360 }
361 else 361 else
362 { 362 {
363 completion(nil, error); 363 completion(nil, error);
364 } 364 }
365 }]; 365 }];
366 } 366 }
367 367
368 - (void)requestCreateLog:(int)mode withStep:(int)numStep startDate:(NSString *)startDate endDate:(NSString *)endDate CompletionHandler:(void (^)(NSError *))completion { 368 - (void)requestCreateLog:(int)mode withStep:(int)numStep startDate:(NSString *)startDate endDate:(NSString *)endDate CompletionHandler:(void (^)(NSError *))completion {
369 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken]; 369 NSString * token = [[NSUserDefaults standardUserDefaults] stringForKey:kToken];
370 NSString *url = [kServerAddress stringByAppendingFormat:@"api/createLog"]; 370 NSString *url = [kServerAddress stringByAppendingFormat:@"api/createLog"];
371 NSDictionary *dict = @{@"mode": [NSNumber numberWithInt:mode], @"numStep": [NSNumber numberWithInt:numStep], @"startTime": startDate, @"endTime": endDate}; 371 NSDictionary *dict = @{@"mode": [NSNumber numberWithInt:mode], @"numStep": [NSNumber numberWithInt:numStep], @"startTime": startDate, @"endTime": endDate};
372 [self _request:url method:@"POST" token:token paras:dict completion:^(NSData *data, NSError *error) { 372 [self _request:url method:@"POST" token:token paras:dict completion:^(NSData *data, NSError *error) {
373 373
374 if (completion == NULL) { 374 if (completion == NULL) {
375 return ; 375 return ;
376 } 376 }
377 377
378 if (error == nil) 378 if (error == nil)
379 { 379 {
380 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 380 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
381 int status = [dataResult[@"status"] intValue]; 381 int status = [dataResult[@"status"] intValue];
382 if (status == 1) { // status = 1 success 382 if (status == 1) { // status = 1 success
383 completion(nil); 383 completion(nil);
384 } 384 }
385 else { 385 else {
386 NSString *message = dataResult[@"message"]; 386 NSString *message = dataResult[@"message"];
387 if (message == nil) { 387 if (message == nil) {
388 message = @"Unknown error"; 388 message = @"Unknown error";
389 } 389 }
390 390
391 if ([message isEqualToString:@"Token is invalid"]) { 391 if ([message isEqualToString:@"Token is invalid"]) {
392 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 392 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
393 [self requestCreateLog:mode withStep:numStep startDate:startDate endDate:endDate CompletionHandler:completion]; 393 [self requestCreateLog:mode withStep:numStep startDate:startDate endDate:endDate CompletionHandler:completion];
394 } 394 }
395 else { 395 else {
396 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 396 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
397 completion(errorObject); 397 completion(errorObject);
398 } 398 }
399 } 399 }
400 } 400 }
401 else 401 else
402 { 402 {
403 completion(error); 403 completion(error);
404 } 404 }
405 }]; 405 }];
406 } 406 }
407 407
408 #pragma mark - History Screen Function 408 #pragma mark - History Screen Function
409 - (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion { 409 - (void) requestHistory:(NSString *)token atDate:(NSDate *)date withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryObject *, NSError *)) completion {
410 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/%@/%d", [self convertIntToString:type], mode]; 410 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/%@/%d", [self convertIntToString:type], mode];
411 NSLog(@"requestHistory link %@", url); 411 NSLog(@"requestHistory link %@", url);
412 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { 412 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
413 413
414 if (completion == NULL) { 414 if (completion == NULL) {
415 return ; 415 return ;
416 } 416 }
417 417
418 if (error == nil) 418 if (error == nil)
419 { 419 {
420 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 420 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
421 NSLog(@"%@", dataResult); 421 NSLog(@"%@", dataResult);
422 int status = [dataResult[@"status"] intValue]; 422 int status = [dataResult[@"status"] intValue];
423 if (status == 1) { // status = 1 success 423 if (status == 1) { // status = 1 success
424 HistoryObject * object = [[HistoryObject alloc] initWithData:dataResult[@"result"]]; 424 HistoryObject * object = [[HistoryObject alloc] initWithData:dataResult[@"result"]];
425 completion(object, nil); 425 completion(object, nil);
426 } 426 }
427 else { 427 else {
428 NSString *message = dataResult[@"message"]; 428 NSString *message = dataResult[@"message"];
429 if (message == nil) { 429 if (message == nil) {
430 message = @"Unknown error"; 430 message = @"Unknown error";
431 } 431 }
432 432
433 if ([message isEqualToString:@"Token is invalid"]) { 433 if ([message isEqualToString:@"Token is invalid"]) {
434 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 434 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
435 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken]; 435 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
436 [self requestHistory:tokenNew atDate:date withType:type andMode:mode CompletionHandler:completion]; 436 [self requestHistory:tokenNew atDate:date withType:type andMode:mode CompletionHandler:completion];
437 } 437 }
438 else { 438 else {
439 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 439 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
440 completion(nil, errorObject); 440 completion(nil, errorObject);
441 } 441 }
442 } 442 }
443 } 443 }
444 else 444 else
445 { 445 {
446 completion(nil, error); 446 completion(nil, error);
447 } 447 }
448 }]; 448 }];
449 } 449 }
450 450
451 - (void) requestHistoryGraph:(NSString *)token withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryGraphObject *, NSError *)) completion { 451 - (void) requestHistoryGraph:(NSString *)token withType:(int)type andMode:(int) mode CompletionHandler:(void (^)(HistoryGraphObject *, NSError *)) completion {
452 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/graph/%@/%d", [self convertIntToString:type], mode]; 452 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/graph/%@/%d", [self convertIntToString:type], mode];
453 NSLog(@"requestHistoryGraph link %@", url); 453 NSLog(@"requestHistoryGraph link %@", url);
454 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { 454 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
455 455
456 if (completion == NULL) { 456 if (completion == NULL) {
457 return ; 457 return ;
458 } 458 }
459 459
460 if (error == nil) 460 if (error == nil)
461 { 461 {
462 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 462 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
463 NSLog(@"%@", dataResult); 463 NSLog(@"%@", dataResult);
464 int status = [dataResult[@"status"] intValue]; 464 int status = [dataResult[@"status"] intValue];
465 if (status == 1) { // status = 1 success 465 if (status == 1) { // status = 1 success
466 HistoryGraphObject * object = [[HistoryGraphObject alloc] initWithData:dataResult[@"result"]]; 466 HistoryGraphObject * object = [[HistoryGraphObject alloc] initWithData:dataResult[@"result"]];
467 completion(object, nil); 467 completion(object, nil);
468 } 468 }
469 else { 469 else {
470 NSString *message = dataResult[@"message"]; 470 NSString *message = dataResult[@"message"];
471 if (message == nil) { 471 if (message == nil) {
472 message = @"Unknown error"; 472 message = @"Unknown error";
473 } 473 }
474 474
475 if ([message isEqualToString:@"Token is invalid"]) { 475 if ([message isEqualToString:@"Token is invalid"]) {
476 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 476 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
477 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken]; 477 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
478 [self requestHistoryGraph:tokenNew withType:type andMode:mode CompletionHandler:completion]; 478 [self requestHistoryGraph:tokenNew withType:type andMode:mode CompletionHandler:completion];
479 } 479 }
480 else { 480 else {
481 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 481 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
482 completion(nil, errorObject); 482 completion(nil, errorObject);
483 } 483 }
484 } 484 }
485 } 485 }
486 else 486 else
487 { 487 {
488 completion(nil, error); 488 completion(nil, error);
489 } 489 }
490 }]; 490 }];
491 } 491 }
492 492
493 - (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSArray *, NSError *)) completion { 493 - (void) requestHistoryList:(NSString *)token withType:(int)type andMode:(int) mode AtPage:(int) page CompletionHandler:(void (^)(NSArray *, NSError *)) completion {
494 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/list/%@/%d?page=%d&record=50", [self convertIntToString:type], mode, page]; 494 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/history/list/%@/%d?page=%d&record=50", [self convertIntToString:type], mode, page];
495 NSLog(@"requestHistoryList link %@", url); 495 NSLog(@"requestHistoryList link %@", url);
496 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { 496 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
497 497
498 if (completion == NULL) { 498 if (completion == NULL) {
499 return ; 499 return ;
500 } 500 }
501 501
502 if (error == nil) 502 if (error == nil)
503 { 503 {
504 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 504 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
505 NSLog(@"%@", dataResult); 505 NSLog(@"%@", dataResult);
506 int status = [dataResult[@"status"] intValue]; 506 int status = [dataResult[@"status"] intValue];
507 if (status == 1) { // status = 1 success 507 if (status == 1) { // status = 1 success
508 if(dataResult[@"result"] != nil) { 508 if(dataResult[@"result"] != nil) {
509 NSArray * array = dataResult[@"result"][@"data"]; 509 NSArray * array = dataResult[@"result"][@"data"];
510 NSMutableArray * arrayHistory = [[NSMutableArray alloc] init]; 510 NSMutableArray * arrayHistory = [[NSMutableArray alloc] init];
511 for(NSDictionary * dict in array) { 511 for(NSDictionary * dict in array) {
512 HistoryObject * object = [[HistoryObject alloc] initWithData:dict]; 512 HistoryObject * object = [[HistoryObject alloc] initWithData:dict];
513 [arrayHistory addObject:object]; 513 [arrayHistory addObject:object];
514 } 514 }
515 completion(arrayHistory, nil); 515 completion(arrayHistory, nil);
516 } 516 }
517 else { 517 else {
518 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 518 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
519 completion(nil, errorObject); 519 completion(nil, errorObject);
520 } 520 }
521 } 521 }
522 else { 522 else {
523 NSString *message = dataResult[@"message"]; 523 NSString *message = dataResult[@"message"];
524 if (message == nil) { 524 if (message == nil) {
525 message = @"Unknown error"; 525 message = @"Unknown error";
526 } 526 }
527 527
528 if ([message isEqualToString:@"Token is invalid"]) { 528 if ([message isEqualToString:@"Token is invalid"]) {
529 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 529 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
530 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken]; 530 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
531 [self requestHistoryList:tokenNew withType:type andMode:mode AtPage:page CompletionHandler:completion]; 531 [self requestHistoryList:tokenNew withType:type andMode:mode AtPage:page CompletionHandler:completion];
532 } 532 }
533 else { 533 else {
534 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 534 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
535 completion(nil, errorObject); 535 completion(nil, errorObject);
536 } 536 }
537 } 537 }
538 } 538 }
539 else 539 else
540 { 540 {
541 completion(nil, error); 541 completion(nil, error);
542 } 542 }
543 }]; 543 }];
544 } 544 }
545 545
546 #pragma mark - SNS Screen Function 546 #pragma mark - SNS Screen Function
547 - (void) requestTweetsList:(NSString *)token groupID: (int) groupID withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion { 547 - (void) requestTweetsList:(NSString *)token groupID: (int) groupID withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion {
548 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/sns/%d", page]; 548 NSString *url = [kServerAddress stringByAppendingFormat:@"/api/sns/%d", page];
549 if(groupID > -1) { 549 if(groupID > -1) {
550 url = [kServerAddress stringByAppendingFormat:@"api/tweet/list?group_id=%d&page=%d&record=10", groupID, page]; 550 url = [kServerAddress stringByAppendingFormat:@"api/tweet/list?group_id=%d&page=%d&record=10", groupID, page];
551 } 551 }
552 NSLog(@"requestTweetsList link %@", url); 552 NSLog(@"requestTweetsList link %@", url);
553 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { 553 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
554 554
555 if (completion == NULL) { 555 if (completion == NULL) {
556 return ; 556 return ;
557 } 557 }
558 558
559 if (error == nil) 559 if (error == nil)
560 { 560 {
561 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 561 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
562 NSLog(@"%@", dataResult); 562 NSLog(@"%@", dataResult);
563 int status = [dataResult[@"status"] intValue]; 563 int status = [dataResult[@"status"] intValue];
564 if (status == 1) { // status = 1 success 564 if (status == 1) { // status = 1 success
565 if(dataResult[@"result"] != nil) { 565 if(dataResult[@"result"] != nil) {
566 NSArray * array = dataResult[@"result"]; 566 NSArray * array = dataResult[@"result"];
567 NSMutableArray * arrayTweets = [[NSMutableArray alloc] init]; 567 NSMutableArray * arrayTweets = [[NSMutableArray alloc] init];
568 for(NSDictionary * dict in array) { 568 for(NSDictionary * dict in array) {
569 TweetObject * object = [[TweetObject alloc] initWithData:dict]; 569 TweetObject * object = [[TweetObject alloc] initWithData:dict];
570 [arrayTweets addObject:object]; 570 [arrayTweets addObject:object];
571 } 571 }
572 completion(arrayTweets, nil); 572 completion(arrayTweets, nil);
573 } 573 }
574 else { 574 else {
575 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 575 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
576 completion(nil, errorObject); 576 completion(nil, errorObject);
577 } 577 }
578 } 578 }
579 else { 579 else {
580 NSString *message = dataResult[@"message"]; 580 NSString *message = dataResult[@"message"];
581 if (message == nil) { 581 if (message == nil) {
582 message = @"Unknown error"; 582 message = @"Unknown error";
583 } 583 }
584 584
585 if ([message isEqualToString:@"Token is invalid"]) { 585 if ([message isEqualToString:@"Token is invalid"]) {
586 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 586 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
587 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken]; 587 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
588 [self requestTweetsList:tokenNew groupID:groupID withPage:page CompletionHandler:completion]; 588 [self requestTweetsList:tokenNew groupID:groupID withPage:page CompletionHandler:completion];
589 } 589 }
590 else { 590 else {
591 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 591 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
592 completion(nil, errorObject); 592 completion(nil, errorObject);
593 } 593 }
594 } 594 }
595 } 595 }
596 else 596 else
597 { 597 {
598 completion(nil, error); 598 completion(nil, error);
599 } 599 }
600 }]; 600 }];
601 } 601 }
602 602
603 - (void) searchGroup:(NSString *)token withKey:(NSString *)key andPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion { 603 - (void) searchGroup:(NSString *)token withKey:(NSString *)key andPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion {
604 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/search"]; 604 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/search"];
605 NSLog(@"searchGroup link %@ page %d", url, page); 605 NSLog(@"searchGroup link %@ page %d", url, page);
606 if(searchTask != nil) { 606 if(searchTask != nil) {
607 [searchTask cancel]; 607 [searchTask cancel];
608 } 608 }
609 609
610 searchTask = [self _request:url method:@"POST" token:token paras:@{@"keyword":key, @"page": [NSNumber numberWithInt:page]} completion:^(NSData *data, NSError *error) { 610 searchTask = [self _request:url method:@"POST" token:token paras:@{@"keyword":key, @"page": [NSNumber numberWithInt:page]} completion:^(NSData *data, NSError *error) {
611 searchTask = nil; 611 searchTask = nil;
612 if (completion == NULL) { 612 if (completion == NULL) {
613 return ; 613 return ;
614 } 614 }
615 615
616 if (error == nil) 616 if (error == nil)
617 { 617 {
618 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 618 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
619 NSLog(@"%@", dataResult); 619 NSLog(@"%@", dataResult);
620 int status = [dataResult[@"status"] intValue]; 620 int status = [dataResult[@"status"] intValue];
621 if (status == 1) { // status = 1 success 621 if (status == 1) { // status = 1 success
622 if(dataResult[@"result"] != nil) { 622 if(dataResult[@"result"] != nil) {
623 NSArray * array = dataResult[@"result"]; 623 NSArray * array = dataResult[@"result"];
624 NSMutableArray * arrayTweets = [[NSMutableArray alloc] init]; 624 NSMutableArray * arrayTweets = [[NSMutableArray alloc] init];
625 for(NSDictionary * dict in array) { 625 for(NSDictionary * dict in array) {
626 GroupObject * object = [[GroupObject alloc] initWithData:dict]; 626 GroupObject * object = [[GroupObject alloc] initWithData:dict];
627 [arrayTweets addObject:object]; 627 [arrayTweets addObject:object];
628 } 628 }
629 completion(arrayTweets, nil); 629 completion(arrayTweets, nil);
630 } 630 }
631 else { 631 else {
632 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 632 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
633 completion(nil, errorObject); 633 completion(nil, errorObject);
634 } 634 }
635 } 635 }
636 else { 636 else {
637 NSString *message = dataResult[@"message"]; 637 NSString *message = dataResult[@"message"];
638 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 638 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
639 completion(nil, errorObject); 639 completion(nil, errorObject);
640 } 640 }
641 } 641 }
642 else 642 else
643 { 643 {
644 completion(nil, error); 644 completion(nil, error);
645 } 645 }
646 }]; 646 }];
647 } 647 }
648 648
649 #pragma mark - Group Function 649 #pragma mark - Group Function
650 - (void) getGroupDetail:(NSString *)token withGroupID:(int)groupID CompletionHandler:(void (^)(GroupObject *, NSError *)) completion { 650 - (void) getGroupDetail:(NSString *)token withGroupID:(int)groupID CompletionHandler:(void (^)(GroupObject *, NSError *)) completion {
651 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/detail/%d", groupID]; 651 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/detail/%d", groupID];
652 NSLog(@"getGroupDetail link %@", url); 652 NSLog(@"getGroupDetail link %@", url);
653 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { 653 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
654 654
655 if (completion == NULL) { 655 if (completion == NULL) {
656 return ; 656 return ;
657 } 657 }
658 658
659 if (error == nil) 659 if (error == nil)
660 { 660 {
661 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 661 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
662 NSLog(@"%@", dataResult); 662 NSLog(@"%@", dataResult);
663 int status = [dataResult[@"status"] intValue]; 663 int status = [dataResult[@"status"] intValue];
664 if (status == 1) { // status = 1 success 664 if (status == 1) { // status = 1 success
665 if(dataResult[@"result"] != nil) { 665 if(dataResult[@"result"] != nil) {
666 NSArray * array = dataResult[@"result"]; 666 NSArray * array = dataResult[@"result"];
667 GroupObject * object = [[GroupObject alloc] initWithData:array[0]]; 667 GroupObject * object = [[GroupObject alloc] initWithData:array[0] andGroupID:groupID];
668 completion(object, nil); 668 completion(object, nil);
669 } 669 }
670 else { 670 else {
671 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 671 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
672 completion(nil, errorObject); 672 completion(nil, errorObject);
673 } 673 }
674 } 674 }
675 else { 675 else {
676 NSString *message = dataResult[@"message"]; 676 NSString *message = dataResult[@"message"];
677 if (message == nil) { 677 if (message == nil) {
678 message = @"Unknown error"; 678 message = @"Unknown error";
679 } 679 }
680 680
681 if ([message isEqualToString:@"Token is invalid"]) { 681 if ([message isEqualToString:@"Token is invalid"]) {
682 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 682 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
683 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken]; 683 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
684 [self getGroupDetail:tokenNew withGroupID:groupID CompletionHandler:completion]; 684 [self getGroupDetail:tokenNew withGroupID:groupID CompletionHandler:completion];
685 } 685 }
686 else { 686 else {
687 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 687 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
688 completion(nil, errorObject); 688 completion(nil, errorObject);
689 } 689 }
690 } 690 }
691 } 691 }
692 else 692 else
693 { 693 {
694 completion(nil, error); 694 completion(nil, error);
695 } 695 }
696 }]; 696 }];
697 } 697 }
698 698
699 - (void) requestMemberList:(NSString *)token groupID: (int) groupID withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion { 699 - (void) requestMemberList:(NSString *)token groupID: (int) groupID withPage:(int)page CompletionHandler:(void (^)(NSArray *, NSError *)) completion {
700 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/member/%d/%d", groupID, page]; 700 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/member/%d/%d", groupID, page];
701 NSLog(@"requestMemberList link %@ page %d", url, page); 701 NSLog(@"requestMemberList link %@ page %d", url, page);
702 702
703 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) { 703 [self _request:url method:@"GET" token:token paras:nil completion:^(NSData *data, NSError *error) {
704 if (completion == NULL) { 704 if (completion == NULL) {
705 return ; 705 return ;
706 } 706 }
707 707
708 if (error == nil) 708 if (error == nil)
709 { 709 {
710 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 710 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
711 NSLog(@"%@", dataResult); 711 NSLog(@"%@", dataResult);
712 int status = [dataResult[@"status"] intValue]; 712 int status = [dataResult[@"status"] intValue];
713 if (status == 1) { // status = 1 success 713 if (status == 1) { // status = 1 success
714 if(dataResult[@"result"] != nil) { 714 if(dataResult[@"result"] != nil) {
715 NSArray * array = dataResult[@"result"]; 715 NSArray * array = dataResult[@"result"];
716 NSMutableArray * arrayTweets = [[NSMutableArray alloc] init]; 716 NSMutableArray * arrayTweets = [[NSMutableArray alloc] init];
717 for(NSDictionary * dict in array) { 717 for(NSDictionary * dict in array) {
718 MemberObject * object = [[MemberObject alloc] initWithData:dict]; 718 MemberObject * object = [[MemberObject alloc] initWithData:dict];
719 [arrayTweets addObject:object]; 719 [arrayTweets addObject:object];
720 } 720 }
721 completion(arrayTweets, nil); 721 completion(arrayTweets, nil);
722 } 722 }
723 else { 723 else {
724 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 724 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
725 completion(nil, errorObject); 725 completion(nil, errorObject);
726 } 726 }
727 } 727 }
728 else { 728 else {
729 NSString *message = dataResult[@"message"]; 729 NSString *message = dataResult[@"message"];
730 if (message == nil) { 730 if (message == nil) {
731 message = @"Unknown error"; 731 message = @"Unknown error";
732 } 732 }
733 733
734 if ([message isEqualToString:@"Token is invalid"]) { 734 if ([message isEqualToString:@"Token is invalid"]) {
735 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 735 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
736 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken]; 736 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
737 [self requestMemberList:tokenNew groupID:groupID withPage:page CompletionHandler:completion]; 737 [self requestMemberList:tokenNew groupID:groupID withPage:page CompletionHandler:completion];
738 } 738 }
739 else { 739 else {
740 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 740 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
741 completion(nil, errorObject); 741 completion(nil, errorObject);
742 } 742 }
743 } 743 }
744 } 744 }
745 else 745 else
746 { 746 {
747 completion(nil, error); 747 completion(nil, error);
748 } 748 }
749 }]; 749 }];
750 } 750 }
751 751
752 - (void) requestJoinGroup:(NSString *)token groupID: (int) groupID CompletionHandler:(void (^)(NSError *)) completion { 752 - (void) requestJoinGroup:(NSString *)token groupID: (int) groupID CompletionHandler:(void (^)(NSError *)) completion {
753 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/join"]; 753 NSString *url = [kServerAddress stringByAppendingFormat:@"api/sns/group/join"];
754 NSLog(@"requestJoinGroup link %@", url); 754 NSLog(@"requestJoinGroup link %@", url);
755 755
756 searchTask = [self _request:url method:@"POST" token:token paras:@{@"group_id": [NSNumber numberWithInt:groupID]} completion:^(NSData *data, NSError *error) { 756 searchTask = [self _request:url method:@"POST" token:token paras:@{@"group_id": [NSNumber numberWithInt:groupID]} completion:^(NSData *data, NSError *error) {
757 searchTask = nil; 757 searchTask = nil;
758 if (completion == NULL) { 758 if (completion == NULL) {
759 return ; 759 return ;
760 } 760 }
761 761
762 if (error == nil) 762 if (error == nil)
763 { 763 {
764 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 764 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
765 NSLog(@"%@", dataResult); 765 NSLog(@"%@", dataResult);
766 int status = [dataResult[@"status"] intValue]; 766 int status = [dataResult[@"status"] intValue];
767 if (status == 1) { // status = 1 success 767 if (status == 1) { // status = 1 success
768 if(dataResult[@"result"] != nil) { 768 if(dataResult[@"result"] != nil) {
769 completion(nil); 769 completion(nil);
770 } 770 }
771 else { 771 else {
772 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 772 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
773 completion(errorObject); 773 completion(errorObject);
774 } 774 }
775 } 775 }
776 else { 776 else {
777 NSString *message = dataResult[@"message"]; 777 NSString *message = dataResult[@"message"];
778 if ([message isEqualToString:@"Token is invalid"]) { 778 if ([message isEqualToString:@"Token is invalid"]) {
779 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES]; 779 [self performSelectorOnMainThread:@selector(checkToken) withObject:nil waitUntilDone:YES];
780 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken]; 780 NSString *tokenNew = [[NSUserDefaults standardUserDefaults] objectForKey:kToken];
781 [self requestJoinGroup:tokenNew groupID:groupID CompletionHandler:completion]; 781 [self requestJoinGroup:tokenNew groupID:groupID CompletionHandler:completion];
782 } 782 }
783 else { 783 else {
784 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 784 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
785 completion(errorObject); 785 completion(errorObject);
786 } 786 }
787 } 787 }
788 } 788 }
789 else 789 else
790 { 790 {
791 completion(error); 791 completion(error);
792 } 792 }
793 }]; 793 }];
794 } 794 }
795 795
796 #pragma mark - Common API 796 #pragma mark - Common API
797 - (void)refreshToken: (NSString *)userID CompletionHandler:(void (^)(NSString *, NSError *))completion { 797 - (void)refreshToken: (NSString *)userID CompletionHandler:(void (^)(NSString *, NSError *))completion {
798 [self _request:[kServerAddress stringByAppendingFormat: @"refreshToken"] method:@"POST" token:@"" paras:@{@"userId":userID} completion:^(NSData *data, NSError *error) { 798 [self _request:[kServerAddress stringByAppendingFormat: @"refreshToken"] method:@"POST" token:@"" paras:@{@"userId":userID} completion:^(NSData *data, NSError *error) {
799 799
800 if (completion == NULL) { 800 if (completion == NULL) {
801 return ; 801 return ;
802 } 802 }
803 803
804 if (error == nil) 804 if (error == nil)
805 { 805 {
806 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error]; 806 NSDictionary *dataResult = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingAllowFragments error: &error];
807 807
808 int status = [dataResult[@"status"] intValue]; 808 int status = [dataResult[@"status"] intValue];
809 if (status == 1) { // status = 1 success 809 if (status == 1) { // status = 1 success
810 NSArray *arrayResult = dataResult[@"result"]; 810 NSArray *arrayResult = dataResult[@"result"];
811 if (arrayResult.count > 0) { 811 if (arrayResult.count > 0) {
812 NSString *token = arrayResult[0]; 812 NSString *token = arrayResult[0];
813 completion(token, nil); 813 completion(token, nil);
814 } 814 }
815 else { 815 else {
816 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}]; 816 NSError *errorObject = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":@"Unknown Error"}];
817 completion(nil, errorObject); 817 completion(nil, errorObject);
818 } 818 }
819 819
820 } 820 }
821 else { // status = 0 error 821 else { // status = 0 error
822 NSString *message = dataResult[@"message"]; 822 NSString *message = dataResult[@"message"];
823 if (message == nil) { 823 if (message == nil) {
824 message = @"Unknown error"; 824 message = @"Unknown error";
825 } 825 }
826 NSError *loginFaild = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}]; 826 NSError *loginFaild = [NSError errorWithDomain:@"LifeLog_Domain" code:-1 userInfo:@{@"message":message}];
827 completion(nil, loginFaild); 827 completion(nil, loginFaild);
828 } 828 }
829 } 829 }
830 else 830 else
831 { 831 {
832 completion(nil, error); 832 completion(nil, error);
833 } 833 }
834 }]; 834 }];
835 } 835 }
836 836
837 #pragma mark - Private Function 837 #pragma mark - Private Function
838 - (void) checkToken { 838 - (void) checkToken {
839 // [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationToken object:nil]; 839 // [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationToken object:nil];
840 NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kUser]; 840 NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kUser];
841 User *user = (User *)[NSKeyedUnarchiver unarchiveObjectWithData:data]; 841 User *user = (User *)[NSKeyedUnarchiver unarchiveObjectWithData:data];
842 if (user != nil) { 842 if (user != nil) {
843 [self refreshToken:user.user_id CompletionHandler:^(NSString *token, NSError *error) { 843 [self refreshToken:user.user_id CompletionHandler:^(NSString *token, NSError *error) {
844 if (error == nil) { 844 if (error == nil) {
845 [[NSUserDefaults standardUserDefaults] setObject:token forKey:kToken]; 845 [[NSUserDefaults standardUserDefaults] setObject:token forKey:kToken];
846 [[NSUserDefaults standardUserDefaults] synchronize]; 846 [[NSUserDefaults standardUserDefaults] synchronize];
847 } 847 }
848 }]; 848 }];
849 } 849 }
850 } 850 }
851 - (NSData *) _encodeDictionary: (NSDictionary *) dictionary 851 - (NSData *) _encodeDictionary: (NSDictionary *) dictionary
852 { 852 {
853 NSMutableArray *parts = [[NSMutableArray alloc] init]; 853 NSMutableArray *parts = [[NSMutableArray alloc] init];
854 for (id key in dictionary) 854 for (id key in dictionary)
855 { 855 {
856 NSString *encodedValue = [[dictionary[key] description] urlencode]; 856 NSString *encodedValue = [[dictionary[key] description] urlencode];
857 NSString *encodedKey = [[key description] urlencode];//[[key description] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 857 NSString *encodedKey = [[key description] urlencode];//[[key description] stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
858 NSString *part = [NSString stringWithFormat: @"%@=%@", encodedKey, encodedValue]; 858 NSString *part = [NSString stringWithFormat: @"%@=%@", encodedKey, encodedValue];
859 [parts addObject:part]; 859 [parts addObject:part];
860 } 860 }
861 NSString *encodedDictionary = [parts componentsJoinedByString:@"&"]; 861 NSString *encodedDictionary = [parts componentsJoinedByString:@"&"];
862 return [encodedDictionary dataUsingEncoding: NSUTF8StringEncoding]; 862 return [encodedDictionary dataUsingEncoding: NSUTF8StringEncoding];
863 } 863 }
864 864
865 - (NSURLSessionDataTask *) _request:(NSString *)address method:(NSString *)method token:(NSString *) token paras:(NSDictionary *)paras completion:(void (^)(NSData *data, NSError *error))completion 865 - (NSURLSessionDataTask *) _request:(NSString *)address method:(NSString *)method token:(NSString *) token paras:(NSDictionary *)paras completion:(void (^)(NSData *data, NSError *error))completion
866 { 866 {
867 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:address]]; 867 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:address]];
868 request.HTTPMethod = method; 868 request.HTTPMethod = method;
869 [request setValue: @"application/json" forHTTPHeaderField: @"Accept"]; 869 [request setValue: @"application/json" forHTTPHeaderField: @"Accept"];
870 [request setValue: @"application/json" forHTTPHeaderField: @"Content-Type"]; 870 [request setValue: @"application/json" forHTTPHeaderField: @"Content-Type"];
871 if(token != nil && ![token isEqual: @""]) { 871 if(token != nil && ![token isEqual: @""]) {
872 [request setValue: token forHTTPHeaderField: @"token"]; 872 [request setValue: token forHTTPHeaderField: @"token"];
873 } 873 }
874 [request setTimeoutInterval:self.timeOutInterval]; 874 [request setTimeoutInterval:self.timeOutInterval];
875 875
876 if (paras != nil) 876 if (paras != nil)
877 { 877 {
878 NSData *encodedData = [self _encodeDictionary: paras]; 878 NSData *encodedData = [self _encodeDictionary: paras];
879 [request setValue: [NSString stringWithFormat: @"%lu", (unsigned long) encodedData.length] forHTTPHeaderField: @"Content-Length"]; 879 [request setValue: [NSString stringWithFormat: @"%lu", (unsigned long) encodedData.length] forHTTPHeaderField: @"Content-Length"];
880 [request setValue: @"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField: @"Content-Type"]; 880 [request setValue: @"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField: @"Content-Type"];
881 [request setHTTPBody: encodedData]; 881 [request setHTTPBody: encodedData];
882 } 882 }
883 883
884 NSURLSession *session = [NSURLSession sharedSession]; 884 NSURLSession *session = [NSURLSession sharedSession];
885 NSURLSessionDataTask *task = [session dataTaskWithRequest:request 885 NSURLSessionDataTask *task = [session dataTaskWithRequest:request
886 completionHandler: 886 completionHandler:
887 ^(NSData *data, NSURLResponse *response, NSError *error) { 887 ^(NSData *data, NSURLResponse *response, NSError *error) {
888 if (completion == NULL) { 888 if (completion == NULL) {
889 return ; 889 return ;
890 } 890 }
891 if (error == nil) 891 if (error == nil)
892 { 892 {
893 completion(data, nil); 893 completion(data, nil);
894 } 894 }
895 else 895 else
896 { 896 {
897 completion(nil, error); 897 completion(nil, error);
898 } 898 }
899 }]; 899 }];
900 [task resume]; 900 [task resume];
901 return task; 901 return task;
902 } 902 }
903 903
904 -(void)waitUntilDone:(void(^)(void))waitBlock { 904 -(void)waitUntilDone:(void(^)(void))waitBlock {
905 //use your statement or call method here 905 //use your statement or call method here
906 if(waitBlock){ 906 if(waitBlock){
907 waitBlock(); 907 waitBlock();
908 } 908 }
909 } 909 }
910 910
911 @end 911 @end
912 912