RAHomeViewController.m 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  1. //
  2. // RAHomeViewController.m
  3. // Apex And Drivers
  4. //
  5. // Created by Jack on 2018/6/1.
  6. // Copyright © 2018年 USAI. All rights reserved.
  7. //
  8. #import "RAHomeViewController.h"
  9. #import "RAOrderDetailViewController.h"
  10. #import "RAProgressHUD.h"
  11. #import "ApexDriverUploadListVC.h"
  12. #import "RAHomeMoreViewController.h"
  13. #import <UserNotifications/UserNotifications.h>
  14. #import "UIScrollView+Empty.h"
  15. #import "RAEmptyView.h"
  16. #import "RAHomeHeaderView.h"
  17. #import "RAMessageViewController.h"
  18. #import "RASettingViewController.h"
  19. @implementation RAHomeSectionModel
  20. - (instancetype)init {
  21. if (self = [super init]) {
  22. }
  23. return self;
  24. }
  25. - (void)setOrders:(NSArray *)orders {
  26. NSMutableArray *orderArr = [NSMutableArray array];
  27. for (int i = 0; i < orders.count; i++) {
  28. NSDictionary *order = [orders objectAtIndex:i];
  29. RAHomeOrderModel *orderModel = [RAHomeOrderModel new];
  30. [orderModel setValuesForKeysWithDictionary:order];
  31. [orderArr addObject:orderModel];
  32. }
  33. _orders = orderArr;
  34. }
  35. - (void)setBackendFlagCount:(NSInteger)backendFlagCount {
  36. _backendFlagCount = backendFlagCount;
  37. if (self.delegate && [self.delegate respondsToSelector:@selector(refreshUI)]) {
  38. [self.delegate refreshUI];
  39. }
  40. }
  41. - (RAHomeOrderModel *)orderModelForIndex:(NSInteger)index {
  42. return [self.orders objectAtIndex:index];
  43. }
  44. - (NSInteger)ordersCount {
  45. return self.orders.count;
  46. }
  47. - (NSInteger)orderModelIndexForID:(NSString *)orderID {
  48. __block NSInteger curIndex = -1;;
  49. [self.orders enumerateObjectsUsingBlock:^(RAHomeOrderModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  50. if ([obj.orderID isEqualToString:orderID]) {
  51. curIndex = idx;
  52. return ;
  53. }
  54. }];
  55. return curIndex;
  56. }
  57. - (BOOL)hasMoreOrder {
  58. return self.totalCount > self.ordersCount;
  59. }
  60. @end
  61. #pragma mark - View Controller
  62. @interface RAHomeViewController () <RAHomeHeaderDelegate>
  63. @property (nonatomic,strong) NSMutableArray <RAHomeSectionModel *> *sectionArray;
  64. @property (nonatomic,strong) NSIndexPath *currentIndexPath;
  65. @property (nonatomic,strong) UIRefreshControl *refreshControl;
  66. @end
  67. @implementation RAHomeViewController
  68. + (instancetype)viewControllerFromStoryboard {
  69. RAHomeViewController *homeVC = [[UIStoryboard storyboardWithName:@"Home" bundle:nil] instantiateViewControllerWithIdentifier:[self storyboardID]];
  70. return homeVC;
  71. }
  72. - (void)viewDidLoad {
  73. [super viewDidLoad];
  74. // Do any additional setup after loading the view.
  75. [self configureNavigationBar];
  76. [self configureTable];
  77. [self registNotification];
  78. [self loadData];
  79. }
  80. - (void)viewWillAppear:(BOOL)animated {
  81. [super viewWillAppear:animated];
  82. }
  83. - (void)viewDidAppear:(BOOL)animated {
  84. [super viewDidAppear:animated];
  85. if (self.reloadFlag) {
  86. [self loadData];
  87. self.reloadFlag = !self.reloadFlag;
  88. }
  89. }
  90. - (void)dealloc {
  91. [[NSNotificationCenter defaultCenter] removeObserver:self];
  92. }
  93. - (void)didReceiveMemoryWarning {
  94. [super didReceiveMemoryWarning];
  95. // Dispose of any resources that can be recreated.
  96. }
  97. #pragma mark - Configure
  98. - (void)configureTable {
  99. if (@available(iOS 11, *)) {
  100. self.homeOrderTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
  101. } else {
  102. self.automaticallyAdjustsScrollViewInsets = NO;
  103. }
  104. self.homeOrderTableView.backgroundColor = [UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1];
  105. self.homeOrderTableView.tableFooterView = [UIView new];
  106. self.homeOrderTableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0);
  107. UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
  108. [refresh addTarget:self action:@selector(refreshControlValueChanged:) forControlEvents:UIControlEventValueChanged];
  109. [self.homeOrderTableView addSubview:refresh];
  110. self.refreshControl = refresh;
  111. // empty
  112. __weak typeof(self) weakSelf = self;
  113. self.homeOrderTableView.emptyView = [RAEmptyView emptyViewWithTapBlk:^(id sender) {
  114. [weakSelf loadData];
  115. }];
  116. // Header
  117. self.headerView = [RAHomeHeaderView homeHeader];
  118. self.headerView.delegate = self;
  119. self.homeOrderTableView.tableHeaderView = self.headerView;
  120. }
  121. - (void)configureNavigationBar {
  122. UIBarButtonItem *uploadListItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"upload_list"] imageWithRenderingMode:UIImageRenderingModeAutomatic]
  123. style:UIBarButtonItemStylePlain
  124. target:self
  125. action:@selector(uploadListItemClick:)];
  126. self.navigationItem.rightBarButtonItems = @[uploadListItem];
  127. // UIBarButtonItem *logoutItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"logout"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
  128. // style:UIBarButtonItemStylePlain
  129. // target:self
  130. // action:@selector(logoutItemClick:)];
  131. //
  132. // self.navigationItem.rightBarButtonItems = @[logoutItem,uploadListItem];
  133. self.title = RASingleton.sharedInstance.user;
  134. }
  135. - (void)registNotification {
  136. // [RASingleton.sharedInstance writeLog:[NSString stringWithFormat:@"%s",__func__]];
  137. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNewOrderNotification:) name:RANotificationHandleOrder object:nil];
  138. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveReloadNotification:) name:RANotificationReloadHome object:nil];
  139. }
  140. #pragma mark - Action
  141. - (void)uploadListItemClick:(UIBarButtonItem *)sender {
  142. ApexDriverUploadListVC *vc = [ApexDriverUploadListVC viewControllerFromStoryboard];
  143. [self.navigationController pushViewController:vc animated:YES];
  144. }
  145. - (void)logoutItemClick:(UIBarButtonItem *)sender {
  146. // show progress
  147. RAProgressHUD *hud = [RAProgressHUD showHUDOnView:self.view];
  148. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  149. [RADataProvider logout];
  150. dispatch_async(dispatch_get_main_queue(), ^{
  151. // dismiss progress
  152. [hud dismiss];
  153. [RASingleton.sharedInstance logout];
  154. [[NSNotificationCenter defaultCenter] postNotificationName:RANotificationLogout object:nil];
  155. });
  156. });
  157. }
  158. - (void)refreshControlValueChanged:(UIRefreshControl *)refresh {
  159. [self loadData];
  160. }
  161. #pragma mark - Setter
  162. - (void)setHeaderView:(RAHomeHeaderView *)headerView {
  163. _headerView = headerView;
  164. }
  165. #pragma mark - Getter
  166. - (NSMutableArray *)sectionArray {
  167. if (!_sectionArray) {
  168. _sectionArray = [NSMutableArray array];
  169. }
  170. return _sectionArray;
  171. }
  172. - (RAHomeSectionModel *)modelForSection:(NSInteger)section {
  173. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  174. return sectionModel;
  175. }
  176. - (NSUInteger)orderSectionCount {
  177. return self.sectionArray.count;
  178. }
  179. - (NSUInteger)orderCountForSection:(NSInteger)section {
  180. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  181. return [sectionModel ordersCount];
  182. }
  183. - (RAHomeOrderModel *)orderModelForIndexPath:(NSIndexPath *)indexPath {
  184. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:indexPath.section];
  185. return [sectionModel orderModelForIndex:indexPath.row];
  186. }
  187. - (NSString *)titleForSection:(NSInteger)section {
  188. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  189. return sectionModel.title;
  190. }
  191. - (BOOL)hasMoreOrderForSection:(NSInteger)section {
  192. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  193. return [sectionModel hasMoreOrder];
  194. }
  195. - (NSInteger)backendCountForSection:(NSInteger)section {
  196. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  197. return sectionModel.backendFlagCount;
  198. }
  199. #pragma mark - Set/Update
  200. - (void)setBackendFlagCount:(NSInteger)count forSection:(NSInteger)section {
  201. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  202. sectionModel.backendFlagCount = count;
  203. }
  204. - (void)decreaseBackendFlagCountForSection:(NSInteger)section {
  205. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  206. NSInteger count = sectionModel.backendFlagCount;
  207. sectionModel.backendFlagCount = --count;
  208. }
  209. - (void)setHeaderDelegate:(id<RAHomeSectionModelDelegate>)delegate forSection:(NSInteger)section {
  210. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  211. sectionModel.delegate = delegate;
  212. }
  213. #pragma mark - Data
  214. - (void)loadData {
  215. if (self.loading) {
  216. return;
  217. }
  218. self.loading = YES;
  219. [self.homeOrderTableView hideEmpty];
  220. // show progress
  221. RAProgressHUD *hud = [RAProgressHUD showHUDOnView:self.view];
  222. __weak typeof(self) weakSelf = self;
  223. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  224. NSDictionary *json = [RADataProvider requestOrderList];
  225. NSLog(@"home load data");
  226. dispatch_async(dispatch_get_main_queue(), ^{
  227. // dismiss progress
  228. [hud dismiss];
  229. if (weakSelf.refreshControl.isRefreshing) {
  230. [weakSelf.refreshControl endRefreshing];
  231. }
  232. if (weakSelf) {
  233. __strong typeof(weakSelf) strongSelf = weakSelf;
  234. // header
  235. BOOL driverAvailable = [[json objectForKey:@"driver_available"] boolValue];
  236. strongSelf.headerView.availabel = driverAvailable;
  237. NSInteger newCount = [[json objectForKey:@"new_count"] integerValue];
  238. NSInteger processingCount = [[json objectForKey:@"processing_count"] integerValue];
  239. NSInteger finishCount = [[json objectForKey:@"finish_count"] integerValue];
  240. strongSelf.headerView.NewOrderCount = newCount;
  241. strongSelf.headerView.ProcessingOrderCount = processingCount;
  242. strongSelf.headerView.FinishOrderCount = finishCount;
  243. int result = [[json objectForKey:@"result"] intValue];
  244. if (result == RESULT_TRUE) {
  245. BOOL requiredLocation = [[json objectForKey:@"requiredLocation"] boolValue];
  246. [RASingleton sharedInstance].requiredLocation = requiredLocation;
  247. NSArray *sectionArray = [json objectForKey:@"sections"];
  248. NSMutableArray *tmpSectionArr = [NSMutableArray array];
  249. strongSelf.currentIndexPath = nil;
  250. for (int i = 0; i < sectionArray.count; i++) {
  251. NSDictionary *section = [sectionArray objectAtIndex:i];
  252. RAHomeSectionModel *sectionModel = [RAHomeSectionModel new];
  253. sectionModel.section = i;
  254. [sectionModel setValuesForKeysWithDictionary:section];
  255. [tmpSectionArr addObject:sectionModel];
  256. if (strongSelf.currentOrderID.length > 0) {
  257. NSInteger idx = [sectionModel orderModelIndexForID:self.currentOrderID];
  258. if (idx > -1) {
  259. strongSelf.currentIndexPath = [NSIndexPath indexPathForRow:idx inSection:i];
  260. }
  261. }
  262. }
  263. strongSelf.sectionArray = tmpSectionArr;
  264. [strongSelf.homeOrderTableView reloadData];
  265. if (strongSelf.currentIndexPath) {
  266. // [strongSelf.homeOrderTableView scrollToRowAtIndexPath:self.currentIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
  267. [strongSelf.homeOrderTableView selectRowAtIndexPath:self.currentIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
  268. } else {
  269. }
  270. } else {
  271. [strongSelf.sectionArray removeAllObjects];
  272. strongSelf.homeOrderTableView.contentOffset = CGPointZero;
  273. [strongSelf.homeOrderTableView reloadData];
  274. // process error
  275. NSString *msg = [json objectForKey:@"err_msg"];
  276. // [strongSelf showAlert:msg];
  277. [strongSelf showAlertTilte:@"Warning" message:msg];
  278. }
  279. }
  280. weakSelf.loading = NO;
  281. if (weakSelf.orderSectionCount == 0) {
  282. [weakSelf.homeOrderTableView showEmpty];
  283. } else {
  284. [weakSelf.homeOrderTableView hideEmpty];
  285. }
  286. });
  287. });
  288. }
  289. - (void)updateDriverAvailable:(BOOL)available {
  290. // show progress
  291. RAProgressHUD *hud = [RAProgressHUD showHUDOnView:self.view];
  292. __weak typeof(self) weakSelf = self;
  293. dispatch_async(dispatch_get_global_queue(0, 0), ^{
  294. NSDictionary *json = [RADataProvider updateDriverAvailable:available];
  295. dispatch_async(dispatch_get_main_queue(), ^{
  296. [hud dismiss];
  297. int result = [[json objectForKey:@"result"] intValue];
  298. if (result == RESULT_TRUE) {
  299. weakSelf.headerView.availabel = available;
  300. } else {
  301. NSString *msg = [json objectForKey:@"err_msg"];
  302. [weakSelf showAlertTilte:@"Warning" message:msg];
  303. }
  304. });
  305. });
  306. }
  307. #pragma mark - Controller Action
  308. - (void)pushDetailViewControllerForModel:(RAHomeOrderModel *)model {
  309. [self pushDetailViewControllerForOrderID:model.orderID type:model.status type2:model.order_type2 statusNo:model.status_no];
  310. }
  311. - (void)pushDetailViewControllerForOrderID:(NSString *)orderID type:(NSInteger)type type2:(NSString *)type2 statusNo:(NSString *)statusNo {
  312. if (!orderID) {
  313. return;
  314. }
  315. RAOrderDetailViewController *detailVC = [RAOrderDetailViewController viewControllerFromStoryboard];
  316. detailVC.orderID = orderID;
  317. detailVC.orderType = type;
  318. detailVC.orderType2 = type2;
  319. detailVC.status_no = statusNo;
  320. [self.navigationController pushViewController:detailVC animated:YES];
  321. }
  322. - (void)showMoreOrderForSection:(NSInteger)section {
  323. RAHomeSectionModel *sectionModel = [self.sectionArray objectAtIndex:section];
  324. RAHomeMoreViewController *homeMoreVC = [RAHomeMoreViewController viewControllerFromStoryboard];
  325. homeMoreVC.title = sectionModel.title;
  326. homeMoreVC.type = sectionModel.type;
  327. __weak typeof(self) weakSelf = self;
  328. homeMoreVC.backendFlagOrderClickBlk = ^{
  329. weakSelf.reloadFlag = YES;
  330. };
  331. [self.navigationController pushViewController:homeMoreVC animated:YES];
  332. }
  333. #pragma mark - Nofitication Selector
  334. - (void)receiveNewOrderNotification:(NSNotification *)notification {
  335. [self loadData];
  336. }
  337. - (void)receiveReloadNotification:(NSNotification *)notification {
  338. [self loadData];
  339. }
  340. #pragma mark - Header Delegate
  341. - (void)signoutClick:(UIButton *)sender {
  342. [self logoutItemClick:nil];
  343. }
  344. - (void)settingClick:(UIButton *)sender {
  345. RASettingViewController *settingVC = [RASettingViewController viewControllerFromStoryboard];
  346. [self.navigationController pushViewController:settingVC animated:YES];
  347. }
  348. - (void)availableClick:(UIButton *)sender {
  349. NSString *msg = [NSString stringWithFormat:@"are you sure to change status to %@",self.headerView.availabel ? @"Unavailable" : @"Available"];
  350. UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Warning" message:msg preferredStyle:UIAlertControllerStyleAlert];
  351. UIAlertAction *yesAction = [UIAlertAction actionWithTitle:@"Yes" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  352. [self updateDriverAvailable:!self.headerView.availabel];
  353. }];
  354. UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  355. }];
  356. [alertVC addAction:cancelAction];
  357. [alertVC addAction:yesAction];
  358. [self presentViewController:alertVC animated:YES completion:nil];
  359. }
  360. - (void)messageClick:(UIButton *)sender {
  361. RAMessageViewController *messageVC = [RAMessageViewController viewControllerFromStoryboard];
  362. [self.navigationController pushViewController:messageVC animated:YES];
  363. }
  364. @end