HomeLogsViewController.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. //
  2. // HomeLogsViewController.m
  3. // kneet
  4. //
  5. // Created by Jason Lee on 4/28/15.
  6. // Copyright (c) 2015 ntels. All rights reserved.
  7. //
  8. #import "JDObject.h"
  9. #import "RequestHandler.h"
  10. #import "ModeModel.h"
  11. #import "CustomLabel.h"
  12. #import "CustomButton.h"
  13. #import "CustomImageView.h"
  14. #import "UIImageView+WebCache.h"
  15. #import "UIButton+WebCache.h"
  16. #import "JYRefreshController.h"
  17. #import "HomeLogsViewController.h"
  18. @implementation HomeLogsHeaderTableView
  19. @end
  20. @implementation HomeLogsRuleTableViewCell
  21. - (void)awakeFromNib {
  22. self.selectionStyle = UITableViewCellSelectionStyleNone;
  23. }
  24. @end
  25. @implementation HomeLogsMemberTableViewCell
  26. - (void)awakeFromNib {
  27. self.selectionStyle = UITableViewCellSelectionStyleNone;
  28. }
  29. @end
  30. @implementation HomeLogsHomeTableViewCell
  31. - (void)awakeFromNib {
  32. self.selectionStyle = UITableViewCellSelectionStyleNone;
  33. }
  34. @end
  35. @interface HomeLogsViewController () <UITableViewDataSource, UITableViewDelegate> {
  36. NSString *_pagingType, *_pagingDateTime;
  37. NSMutableArray *_dataArray;
  38. UIImage *_bgCellImage1, *_bgCellImage2;
  39. }
  40. @property (strong, nonatomic) JYPullToRefreshController *refreshController;
  41. @property (strong, nonatomic) JYPullToLoadMoreController *loadMoreController;
  42. @end
  43. #pragma mark - Class Definition
  44. @implementation HomeLogsViewController
  45. - (void)viewDidLoad {
  46. [super viewDidLoad];
  47. _dataArray = [[NSMutableArray alloc] init];
  48. [self initUI];
  49. [self prepareViewDidLoad];
  50. }
  51. - (void)viewWillAppear:(BOOL)animated {
  52. [super viewWillAppear:animated];
  53. self.title = NSLocalizedString(@"홈 로그",nil);
  54. }
  55. - (void)initUI {
  56. //set tableview option
  57. _tableView.dataSource = self;
  58. _tableView.delegate = self;
  59. _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  60. _tableView.backgroundColor = [UIColor clearColor];
  61. _tableView.tableFooterView = [[UIView alloc] init]; //this call table events;
  62. //set refresh controls
  63. __weak typeof(self) weakSelf = self;
  64. self.refreshController = [[JYPullToRefreshController alloc] initWithScrollView:self.tableView];
  65. self.refreshController.pullToRefreshHandleAction = ^{
  66. [weakSelf requestHomelogsRecently];
  67. };
  68. self.loadMoreController = [[JYPullToLoadMoreController alloc] initWithScrollView:self.tableView];
  69. self.loadMoreController.pullToLoadMoreHandleAction = ^{
  70. [weakSelf requestHomelogsOlder];
  71. };
  72. UIEdgeInsets insets = UIEdgeInsetsMake(4, 4, 4, 4);
  73. _bgCellImage1 = [CommonUtil resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch img:[UIImage imageNamed:@"tp_01_img_list_bg_01"]];
  74. _bgCellImage2 = [CommonUtil resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch img:[UIImage imageNamed:@"tp_01_img_list_bg_02"]];
  75. }
  76. - (void)prepareViewDidLoad {
  77. [self performSelectorOnMainThread:@selector(requestHomelogs) withObject:nil waitUntilDone:0.0f];
  78. // _dataArray = [[NSMutableArray alloc] init];
  79. //
  80. // NSArray *today = @[@{@"type": @"rule", @"time": @"17:30", @"icon": @"tp_01_img_homelog_icon_rule", @"title": @"규칙이 실행되었습니다.", @"desc" : @"상쾌한 아침\n상쾌한 아침"},
  81. // @{@"type": @"rule", @"time": @"14:30", @"icon": @"tp_01_img_homelog_icon_rule", @"title": @"규칙이 실행되었습니다.규칙이 실행되었습니다.규칙이 실행되었습니다.", @"desc" : @"상쾌한 아침\n상쾌한 아침\n상쾌한 아침"},
  82. // @{@"type": @"member",@"time": @"12:30", @"icon": @"tp_01_img_homelog_icon_member", @"title": @"새로운 멤버가 참여했습니다.", @"desc" : @"파워유저",
  83. // @"member_role": @"파워유저", @"member_name": @"[막둥이]", @"member_icon": @"tp_01_img_singup_membericon_01"},
  84. // @{@"type": @"member",@"time": @"12:30", @"icon": @"tp_01_img_homelog_icon_member", @"title": @"새로운 멤버가 참여했습니다.새로운 멤버가 참여했습니다.새로운 멤버가 참여했습니다.", @"desc" : @"파워유저",
  85. // @"member_role": @"파워유저", @"member_name": @"[막둥이]", @"member_icon": @"tp_01_img_singup_membericon_01"},
  86. // @{@"type": @"member",@"time": @"12:30", @"icon": @"tp_01_img_homelog_icon_member", @"title": @"새로운 멤버가 참여했습니다.", @"desc" : @"파워유저",
  87. // @"member_role": @"파워유저", @"member_name": @"[막둥이]", @"member_icon": @"tp_01_img_singup_membericon_01"},
  88. // @{@"type": @"home", @"time": @"11:30", @"icon": @"tp_01_img_homelog_icon_home", @"title": @"[즐거운 나의 하우스] 시작합니다!", @"desc" : @"상쾌한 아침",
  89. // @"member_role": @"최고관리자", @"member_name": @"[아빠]", @"member_icon": @"tp_01_img_singup_membericon_01"},
  90. // @{@"type": @"home", @"time": @"11:30", @"icon": @"tp_01_img_homelog_icon_home", @"title": @"[즐거운 나의 하우스] 시작합니다![즐거운 나의 하우스] 시작합니다!", @"desc" : @"상쾌한 아침",
  91. // @"member_role": @"최고관리자", @"member_name": @"[아빠]", @"member_icon": @"tp_01_img_singup_membericon_01"},
  92. // @{@"type": @"home", @"time": @"11:30", @"icon": @"tp_01_img_homelog_icon_home", @"title": @"[즐거운 나의 하우스] 시작합니다![즐거운 나의 하우스] 시작합니다![즐거운 나의 하우스] 시작합니다!", @"desc" : @"상쾌한 아침",
  93. // @"member_role": @"최고관리자", @"member_name": @"[아빠]", @"member_icon": @"tp_01_img_singup_membericon_01"},
  94. // ];
  95. //
  96. // [_dataArray addObject:@{@"date": @"today", @"list": today}];
  97. // [_dataArray addObject:@{@"date": @"yesterday", @"list": today}];
  98. // [_dataArray addObject:@{@"date": @"2015.05.04", @"list": today}];
  99. // [_dataArray addObject:@{@"date": @"2015.05.03", @"list": today}];
  100. }
  101. #pragma mark - Main Logic
  102. - (void)requestHomelogsRecently {
  103. NSDictionary *homeDic = [_dataArray firstObject];
  104. HomeLogModel *firstHomelog = [homeDic[@"list"] firstObject];
  105. _pagingType = ksListPagingTypeUpward;
  106. _pagingDateTime = firstHomelog.createDatetime;
  107. [self performSelector:@selector(requestHomelogs) withObject:nil afterDelay:0.0f];
  108. }
  109. - (void)requestHomelogsOlder {
  110. NSDictionary *homeDic = [_dataArray lastObject];
  111. HomeLogModel *lastHomelog = [homeDic[@"list"] lastObject];
  112. _pagingType = ksListPagingTypeDownward;
  113. _pagingDateTime = lastHomelog.createDatetime;
  114. [self performSelector:@selector(requestHomelogs) withObject:nil afterDelay:0.0f];
  115. }
  116. - (void)requestHomelogs {
  117. //parameters
  118. NSDictionary *parameter = @{@"paging_datetime": _pagingDateTime ? _pagingDateTime : ksEmptyString,
  119. @"paging_type": _pagingType ? _pagingType : ksEmptyString};
  120. NSString *path = [NSString stringWithFormat:API_GET_HOMELOG];
  121. [[RequestHandler handler] sendAsyncGetRequestAPIPath:path parameters:parameter modelClass:[HomeLogListModel class] completion:^(id responseObject) {
  122. if (!responseObject) {//응답결과가 잘못되었거나 없을 경우,
  123. return;
  124. }
  125. HomeLogListModel *fetchedList = (HomeLogListModel *) responseObject;
  126. if (fetchedList && fetchedList.homelogList && fetchedList.homelogList.count) {//API 성공,
  127. //sort.
  128. [self sortHomelogs:fetchedList.homelogList];
  129. } else {//실패 시,
  130. if (!_dataArray.count) {//이미 로드된 데이터가 있을 경우는 출력하지 않음.
  131. // NoContentView *noContentView = [NoContentView viewFromNib];
  132. // _tableView.tableFooterView = noContentView;
  133. }
  134. }
  135. NSInteger count = 0;
  136. for (NSDictionary *dic in _dataArray) {
  137. count += [dic[@"list"] count];
  138. }
  139. [_tableView reloadData];
  140. } failure:^(id errorObject) {
  141. JDErrorModel *error = (JDErrorModel *)errorObject;
  142. [[JDFacade facade] alert:error.errorMessage];
  143. }];
  144. }
  145. - (void)sortHomelogs:(NSArray<HomeLogModel> *)homelogList {
  146. //날짜 비교를 위한 Array 생성.
  147. NSMutableArray *dateArray = [[NSMutableArray alloc] initWithArray:[_dataArray valueForKeyPath:@"createDate"]];
  148. //동일 날짜일 경우, 배열 맨 위부터 추가를 위한 인덱스.
  149. NSInteger i = 0;
  150. for (HomeLogModel *homelog in homelogList) {
  151. NSInteger index = [dateArray indexOfObjectPassingTest:^BOOL(NSString *date, NSUInteger idx, BOOL *stop) {
  152. return [homelog.createDate isEqualToString:date];
  153. }];
  154. //case 최신 - 새로운 create가 여러개일 경우 - 첫 데이터는 날짜를 추가 후 이후 같은 날짜 데이터는 배열에 추가해줌.
  155. //case 이전 - 기존에 존재하는 date가 여러개일 경우, - 해당 배열에 인덱스 추가.
  156. if (index == NSNotFound) {//새로 추가
  157. //새로운 날짜가 추가될 경우, 인덱스 카운트를 0으로 리셋
  158. i = 0;
  159. NSMutableArray<HomeLogModel> *homelogs = (NSMutableArray<HomeLogModel> *)[[NSMutableArray alloc] init];
  160. [homelogs addObject:homelog];
  161. if ([_pagingType isEqualToString:ksListPagingTypeUpward]) {//최신일 경우 - 다른 날짜일 경우, 배열 맨 위부터 추가
  162. [_dataArray insertObject:@{@"createDate": homelog.createDate,
  163. @"list": homelogs} atIndex:i]; //-dateListDic
  164. [dateArray insertObject:homelog.createDate atIndex:i];
  165. //increase index of array.
  166. i++;
  167. } else {//이전 데이터일 경우, 배열 뒤에 추가
  168. [_dataArray addObject:@{@"createDate": homelog.createDate,
  169. @"list": homelogs}];
  170. [dateArray addObject:homelog.createDate];
  171. }
  172. } else {//add
  173. NSDictionary *dateListDic = _dataArray[index];
  174. NSMutableArray<HomeLogModel> *homelogs = dateListDic[@"list"];
  175. if ([_pagingType isEqualToString:ksListPagingTypeUpward]) {//최신일 경우 - 동일 날짜일 경우, 배열 맨 위부터 추가,
  176. [homelogs insertObject:homelog atIndex:i++];
  177. } else {//이전 데이터일 경우, 배열 뒤에 추가
  178. [homelogs addObject:homelog];
  179. }
  180. }
  181. }
  182. NSLog(@"%s\n %@", __PRETTY_FUNCTION__, _dataArray);
  183. }
  184. #pragma mark - UITableView DataSource & Delegate
  185. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  186. return _dataArray.count;
  187. }
  188. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  189. NSInteger count = 0;
  190. NSDictionary *homeDic = _dataArray[section];
  191. NSMutableArray<HomeLogModel> *homelogs = homeDic[@"list"];
  192. count = homelogs.count;
  193. return count;
  194. }
  195. - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
  196. NSDictionary *homeDic = _dataArray[section];
  197. HomeLogsHeaderTableView *hcell = (HomeLogsHeaderTableView *)[tableView dequeueReusableCellWithIdentifier:@"HomeLogsHeaderCellIdentifier"];
  198. hcell.lblHeader.text = homeDic[@"createDate"];
  199. return hcell;
  200. }
  201. - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
  202. return 60.0f;
  203. }
  204. - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
  205. return 0.01f;
  206. }
  207. - (CGFloat)calculateTitleHeight:(NSString *)title {
  208. if ([title isEmptyString]) {
  209. return 0.0f;
  210. }
  211. CGFloat width = IPHONE_WIDTH - 20 - 40 - 35 - 10 - 10 - 20 - 10;
  212. UIFont *lfont = [UIFont boldSystemFontOfSize:kUIFontSize01];
  213. CGFloat nheight = [CommonUtil getSizeFromString:title font:lfont width:width].height;
  214. nheight = nheight < 20 ? 20.0f : fabs(nheight) + 1.0f; //adjust padding
  215. return nheight;
  216. }
  217. - (CGFloat)calculateDescHeight:(NSString *)desc {
  218. if ([desc isEmptyString]) {
  219. return 0.0f;
  220. }
  221. CGFloat width = IPHONE_WIDTH - 20 - 40 - 35 - 10 - 10 - 20 - 10;
  222. UIFont *lfont = [UIFont boldSystemFontOfSize:kUIFontSize01];
  223. CGFloat nheight = [CommonUtil getSizeFromString:desc font:lfont width:width].height;
  224. nheight = nheight < 19 ? 19.0f : fabs(nheight) + 1.0f; //adjust padding
  225. return nheight;
  226. }
  227. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
  228. NSDictionary *homeDic = _dataArray[indexPath.section];
  229. HomeLogModel *homelog = homeDic[@"list"][indexPath.row];
  230. CGFloat height = 0.0f;
  231. if ([homelog.homelogType isEqualToString:@"RL"]) {//규칙 실행 로그
  232. CGFloat theight = [self calculateTitleHeight:homelog.homelogTitle];
  233. CGFloat dheight = [self calculateDescHeight:homelog.homelogMsg];
  234. height = 34.0f + theight + dheight; //(title.height + padding)
  235. } else if ([homelog.homelogType isEqualToString:@"DV"]) {//디바이스 실행 로그
  236. CGFloat theight = [self calculateTitleHeight:homelog.homelogTitle];
  237. CGFloat dheight = [self calculateDescHeight:homelog.homelogMsg];
  238. height = 34.0f + theight + dheight; //(title.height + padding)
  239. } else if ([homelog.homelogType isEqualToString:@"MC"]) {//멀티 실행 로그
  240. CGFloat theight = [self calculateTitleHeight:homelog.homelogTitle];
  241. CGFloat dheight = [self calculateDescHeight:homelog.homelogMsg];
  242. height = 34.0f + theight + dheight; //(title.height + padding)
  243. } else if ([homelog.homelogType isEqualToString:@"HM"]) {//멤버 로그
  244. CGFloat theight = [self calculateTitleHeight:homelog.homelogTitle];
  245. height = 80.0f + theight;
  246. } else if ([homelog.homelogType isEqualToString:@"HO"]) {//홈 로그
  247. CGFloat theight = [self calculateTitleHeight:homelog.homelogTitle];
  248. height = 80.0f + theight;
  249. }
  250. return height;
  251. }
  252. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  253. UITableViewCell *cell = nil;
  254. NSDictionary *homeDic = _dataArray[indexPath.section];
  255. HomeLogModel *homelog = homeDic[@"list"][indexPath.row];
  256. if ([homelog.homelogType isEqualToString:@"RL"]) {//규칙 실행 로그
  257. HomeLogsRuleTableViewCell *rcell = (HomeLogsRuleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"HomeLogsRuleCellIdentifier"];
  258. rcell.lblTime.text = homelog.createTime;
  259. rcell.lblTitle.text = homelog.homelogTitle;
  260. rcell.lblRule.text = homelog.homelogMsg;
  261. [rcell.imgvIcon setImage:[UIImage imageNamed:@"tp_01_img_homelog_icon_rule"]];
  262. cell = rcell;
  263. } else if ([homelog.homelogType isEqualToString:@"DV"]) {//디바이스 실행 로그
  264. HomeLogsRuleTableViewCell *rcell = (HomeLogsRuleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"HomeLogsRuleCellIdentifier"];
  265. rcell.lblTime.text = homelog.createTime;
  266. rcell.lblTitle.text = homelog.homelogTitle;
  267. rcell.lblRule.text = homelog.homelogMsg;
  268. [rcell.imgvIcon setImage:[UIImage imageNamed:@"tp_01_img_homelog_icon_rule"]];
  269. cell = rcell;
  270. } else if ([homelog.homelogType isEqualToString:@"MC"]) {//멀티제어 실행 로그
  271. HomeLogsRuleTableViewCell *rcell = (HomeLogsRuleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"HomeLogsRuleCellIdentifier"];
  272. rcell.lblTime.text = homelog.createTime;
  273. rcell.lblTitle.text = homelog.homelogTitle;
  274. rcell.lblRule.text = homelog.homelogMsg;
  275. [rcell.imgvIcon setImage:[UIImage imageNamed:@"tp_01_img_homelog_icon_rule"]];
  276. cell = rcell;
  277. } else if ([homelog.homelogType isEqualToString:@"HM"]) {//멤버 로그
  278. HomeLogsMemberTableViewCell *rcell = (HomeLogsMemberTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"HomeLogsMemberCellIdentifier"];
  279. rcell.lblTime.text = homelog.createTime;
  280. rcell.lblTitle.text = homelog.homelogTitle;
  281. rcell.lblMemberRole.text = homelog.homelogMsg; //log[@"member_role"];
  282. // rcell.lblMemberName.text = log[@"member_name"];
  283. [rcell.imgvIcon setImage:[UIImage imageNamed:@"tp_01_img_homelog_icon_member"]];
  284. [rcell.imgvMemberIcon sd_setImageWithURL:[NSURL URLWithString:homelog.imageFileName] forState:UIControlStateNormal];
  285. cell = rcell;
  286. } else if ([homelog.homelogType isEqualToString:@"HO"]) {//홈 실행 로그
  287. HomeLogsHomeTableViewCell *rcell = (HomeLogsHomeTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"HomeLogsHomeCellIdentifier"];
  288. rcell.lblTime.text = homelog.createTime;
  289. rcell.lblTitle.text = homelog.homelogTitle;
  290. rcell.lblMemberRole.text = homelog.homelogMsg; //log[@"member_role"];
  291. [rcell.imgvIcon setImage:[UIImage imageNamed:@"tp_01_img_homelog_icon_home"]];
  292. // rcell.lblMemberName.text = log[@"member_name"];
  293. [rcell.imgvMemberIcon sd_setImageWithURL:[NSURL URLWithString:homelog.imageFileName] forState:UIControlStateNormal];
  294. cell = rcell;
  295. }
  296. return cell;
  297. }
  298. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  299. [tableView deselectRowAtIndexPath:indexPath animated:YES];
  300. }
  301. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
  302. // Remove seperator inset
  303. if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
  304. [cell setSeparatorInset:UIEdgeInsetsZero];
  305. }
  306. // Prevent the cell from inheriting the Table View's margin settings
  307. if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
  308. [cell setPreservesSuperviewLayoutMargins:NO];
  309. }
  310. // Explictly set your cell's layout margins
  311. if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
  312. [cell setLayoutMargins:UIEdgeInsetsZero];
  313. }
  314. }
  315. #pragma mark - UI Events
  316. #pragma mark - MemoryWarning
  317. - (void)didReceiveMemoryWarning
  318. {
  319. [super didReceiveMemoryWarning];
  320. // Dispose of any resources that can be recreated.
  321. }
  322. @end