// // RAHomeMoreViewController.m // Apex And Drivers // // Created by Jack on 2018/6/28. // Copyright © 2018年 USAI. All rights reserved. // #import "RAHomeMoreViewController.h" #import "RAProgressHUD.h" #import "RAOrderDetailViewController.h" #import "JLRefreshFooter.h" #import "RAOrderFilterViewController.h" #import "UIScrollView+Empty.h" #import "RAEmptyView.h" static const NSInteger limit = 20; typedef enum { LoadDataActionTypeInitial, LoadDataActionTypeReLoad, LoadDataActionTypeLoadMore } LoadDataActionType; @interface RAHomeMoreViewController () @property (nonatomic,strong) IBOutlet UITableView *homeMoreTableView; @property (nonatomic,strong) UIRefreshControl *refreshControl; @property (nonatomic,strong) NSMutableArray *orderArray; @property (nonatomic,strong) JLRefreshFooter *refreshFooter; @property (nonatomic,strong) NSDictionary *filterTemplate; @property (nonatomic,strong) NSDictionary *filter; @end @implementation RAHomeMoreViewController + (instancetype)viewControllerFromStoryboard { RAHomeMoreViewController *homeMoreVC = [[UIStoryboard storyboardWithName:@"Home" bundle:nil] instantiateViewControllerWithIdentifier:[self storyboardID]]; return homeMoreVC; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self configureNavigationBar]; [self configureTableView]; [self registNotification]; [self loadData]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } #pragma mark - Configure - (void)configureNavigationBar { UIBarButtonItem *filterItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"filter"] imageWithRenderingMode:UIImageRenderingModeAutomatic] style:UIBarButtonItemStylePlain target:self action:@selector(filterItemClick:)]; self.navigationItem.rightBarButtonItem = filterItem; } - (void)configureTableView { if (@available(iOS 11.0, *)) { self.homeMoreTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } else{ self.automaticallyAdjustsScrollViewInsets = NO; } self.homeMoreTableView.tableFooterView = [UIView new]; self.homeMoreTableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0); UIRefreshControl *refresh = [[UIRefreshControl alloc] init]; [refresh addTarget:self action:@selector(refreshControlValueChanged:) forControlEvents:UIControlEventValueChanged]; [self.homeMoreTableView addSubview:refresh]; self.refreshControl = refresh; self.refreshFooter = [[JLRefreshFooter alloc] init]; self.refreshFooter.refreshDelegate = self; self.homeMoreTableView.jl_footer = self.refreshFooter; // empty __weak typeof(self) weakSelf = self; self.homeMoreTableView.emptyView = [RAEmptyView emptyViewWithTapBlk:^(id sender) { [weakSelf loadData]; }]; } - (void)registNotification { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNewOrderNotification:) name:RANotificationHandleOrder object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveReloadNotification:) name:RANotificationReloadHome object:nil]; } #pragma mark - Lazy - (NSMutableArray *)orderArray { if (!_orderArray) { _orderArray = [NSMutableArray array]; } return _orderArray; } #pragma mark - Getter - (RAHomeOrderModel *)orderModelForIndexPath:(NSIndexPath *)indexPath { return [self.orderArray objectAtIndex:indexPath.row]; } - (NSUInteger)orderCount { return self.orderArray.count; } #pragma mark - Action - (void)refreshControlValueChanged:(UIRefreshControl *)refresh { [self reloadData]; } - (void)filterItemClick:(id)sender { // self.filterTemplate = [RADataProvider loadFakeData:@"fake_order_filter.json"]; RAOrderFilterViewController *filterVC = [RAOrderFilterViewController viewControllerFromStoryboard]; [filterVC setFilter:self.filterTemplate]; __weak typeof(self) weakSelf = self; filterVC.searchBlk = ^(NSDictionary *params) { weakSelf.filter = params; [weakSelf loadData:LoadDataActionTypeReLoad]; }; [self.navigationController pushViewController:filterVC animated:YES]; } #pragma mark - Controller Action - (void)pushDetailViewControllerForModel:(RAHomeOrderModel *)model { [self pushDetailViewControllerForOrderID:model.orderID type:model.status type2:model.order_type2 statusNo:model.status_no]; } - (void)pushDetailViewControllerForOrderID:(NSString *)orderID type:(NSInteger)type type2:(NSString *)type2 statusNo:(NSString *)statusNo { if (!orderID) { return; } RAOrderDetailViewController *detailVC = [RAOrderDetailViewController viewControllerFromStoryboard]; detailVC.orderID = orderID; detailVC.orderType = type; detailVC.orderType2 = type2; detailVC.status_no = statusNo; [self.navigationController pushViewController:detailVC animated:YES]; } #pragma mark - Load Data - (void)loadData:(LoadDataActionType)actionType { if (self.loading) { return; } self.loading = YES; [self.homeMoreTableView hideEmpty]; NSInteger offset = 0; if (actionType == LoadDataActionTypeLoadMore) { offset = self.orderCount; } // show progress RAProgressHUD *hud = [RAProgressHUD showHUDOnView:self.view]; __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSDictionary *json = [RADataProvider requestMoreOrder:weakSelf.type offset:offset limit:limit filter:weakSelf.filter]; dispatch_async(dispatch_get_main_queue(), ^{ // dismiss progress [hud dismiss]; if (weakSelf.refreshControl.isRefreshing) { [weakSelf.refreshControl endRefreshing]; } if (weakSelf) { __strong typeof(weakSelf) strongSelf = weakSelf; if (actionType == LoadDataActionTypeLoadMore) { [strongSelf.refreshFooter performSelector:@selector(endRefresh)]; } int result = [[json objectForKey:@"result"] intValue]; if (result == RESULT_TRUE) { strongSelf.filterTemplate = [json objectForKey:@"filter"]; NSArray *orders = [json objectForKey:@"orders"]; if (actionType != LoadDataActionTypeLoadMore) { [strongSelf.orderArray removeAllObjects]; } else { if (orders.count < limit) { [strongSelf.refreshFooter performSelector:@selector(noMoreData)]; } } for (int i = 0; i < orders.count; i++) { NSDictionary *order = [orders objectAtIndex:i]; RAHomeOrderModel *orderModel = [RAHomeOrderModel new]; [orderModel setValuesForKeysWithDictionary:order]; [strongSelf.orderArray addObject:orderModel]; } [strongSelf.homeMoreTableView reloadData]; } else { [strongSelf.orderArray removeAllObjects]; strongSelf.homeMoreTableView.contentOffset = CGPointZero; [strongSelf.homeMoreTableView reloadData]; // process error NSString *msg = [json objectForKey:@"err_msg"]; // [strongSelf showAlert:msg]; [strongSelf showAlertTilte:NSLocalizedString(@"Warning", nil) message:msg]; } } weakSelf.loading = NO; if (weakSelf.orderCount == 0) { [weakSelf.homeMoreTableView showEmpty]; } else { [weakSelf.homeMoreTableView hideEmpty]; } }); }); } - (void)loadData { [self loadData:LoadDataActionTypeInitial]; } - (void)reloadData { [self loadData:LoadDataActionTypeReLoad]; } - (void)loadMore { [self loadData:LoadDataActionTypeLoadMore]; } #pragma mark - Refresh Delegate - (void)jl_beginRefresh:(JLRefreshBasis *)refresh { if (refresh == self.refreshFooter) { if(refresh.state==JLRefreshStateNoMore) //数据取完不再加载 return; [self loadMore]; } } - (void)jl_pullRefresh:(JLRefreshBasis *)refresh state:(JLRefreshState)state percentage:(float)percentage { } - (void)jl_endRefresh:(JLRefreshBasis *)refresh { } #pragma mark - Nofitication Selector - (void)receiveNewOrderNotification:(NSNotification *)notification { [self loadData]; } - (void)receiveReloadNotification:(NSNotification *)notification { [self loadData]; } @end