// // YMIncomeBreakdownListViewController.m // MSYOUPAI // // Created by YoMi on 2024/3/3. // Copyright © 2024 MS. All rights reserved. // #import "YMIncomeBreakdownListViewController.h" #import "YMIncomeBreakdownListViewModel.h" #import "YMIncomeBreakdownListSectionView.h" #import "YMIncomeBreakdownListPointsAndEarningsCell.h" #import "YMIncomeBreakdownListWithdrawalRecordsCell.h" @interface YMIncomeBreakdownListViewController () /// 滚动视图回调 @property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); /// 列表VM @property (nonatomic, strong) YMIncomeBreakdownListViewModel *viewModel; /// 内容列表 @property (nonatomic, strong) UITableView *contentTableView; @end @implementation YMIncomeBreakdownListViewController @dynamic viewModel; - (void)viewDidLoad { [super viewDidLoad]; [self setNavHidden:YES]; [OCNotificationCenter addObserver:self selector:@selector(changeIncomeBreakdownDateData:) name:REFRESH_HOME_NOTIFICATION object:nil]; } - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; } - (void)ym_setupViews{ [self.view addSubview:self.contentTableView]; [self.view setNeedsUpdateConstraints]; [self.view updateConstraintsIfNeeded]; } - (void)updateViewConstraints{ [self.contentTableView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view); make.left.equalTo(self.view); make.right.equalTo(self.view); make.bottom.equalTo(self.view); }]; [super updateViewConstraints]; } - (void)ym_bindViewModel{ [self headerRefreshing]; @weakify(self) [[self.viewModel.refreshUISubject takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id result) { @strongify(self) [self.contentTableView reloadData]; switch ([result intValue]) { case YMHeaderRefresh_HasMoreData: case YMHeaderRefresh_HasNoMoreData: { [self.contentTableView.mj_header endRefreshing]; [self.contentTableView.mj_footer endRefreshing]; } break; case YMFooterRefresh_HasMoreData: { [self.contentTableView.mj_header endRefreshing]; [self.contentTableView.mj_footer endRefreshing]; if (self.contentTableView.mj_footer == self.noLoadMoreFooter) { self.contentTableView.mj_footer = self.loadMoreFooter; } } break; case YMFooterRefresh_HasNoMoreData: { [self.contentTableView.mj_header endRefreshing]; [self.contentTableView.mj_footer endRefreshing]; if (self.contentTableView.mj_footer == self.loadMoreFooter) { self.contentTableView.mj_footer = self.noLoadMoreFooter; } } break; case YMRefreshError: { [self.contentTableView.mj_header endRefreshing]; [self.contentTableView.mj_footer endRefreshing]; } break; default: break; } [self.contentTableView ym_endLoading]; }]; } - (void)changeIncomeBreakdownDateData:(NSNotification *)notice{ [self.viewModel.changeIncomeBreakdownDateSubject sendNext:[notice.userInfo stringValueForKey:@"date" defaultValue:@""]]; } - (void)headerRefreshing{ [self.contentTableView ym_startLoading]; self.viewModel.currentPage = 1; [self.viewModel getIncomeBreakdownListData]; } - (void)footerRefreshing{ [self.contentTableView ym_startLoading]; self.viewModel.currentPage++; [self.viewModel getIncomeBreakdownListData]; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ switch (self.viewModel.categoryType) { case YMIncomeBreakdownCategoryTypePoints: case YMIncomeBreakdownCategoryTypeEarnings: { return self.viewModel.pointsAndEarningsDataArray.count; } break; case YMIncomeBreakdownCategoryTypeWithdrawalRecords: { return 1; } default: break; } } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (self.viewModel.categoryType) { case YMIncomeBreakdownCategoryTypePoints: case YMIncomeBreakdownCategoryTypeEarnings: { return self.viewModel.pointsAndEarningsDataArray[section].rowDataArray.count; } break; case YMIncomeBreakdownCategoryTypeWithdrawalRecords: { return self.viewModel.withdrawalRecordsDataArray.count; } default: break; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ switch (self.viewModel.categoryType) { case YMIncomeBreakdownCategoryTypePoints: case YMIncomeBreakdownCategoryTypeEarnings: { YMIncomeBreakdownListPointsAndEarningsCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([YMIncomeBreakdownListPointsAndEarningsCell class])]; if (!cell) { cell = [[YMIncomeBreakdownListPointsAndEarningsCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:NSStringFromClass([YMIncomeBreakdownListPointsAndEarningsCell class])]; } cell.selectionStyle = UITableViewCellSelectionStyleNone; [cell ym_bindViewModel:self.viewModel.pointsAndEarningsDataArray[indexPath.section].rowDataArray[indexPath.item]]; return cell; } break; case YMIncomeBreakdownCategoryTypeWithdrawalRecords: { YMIncomeBreakdownListWithdrawalRecordsCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([YMIncomeBreakdownListWithdrawalRecordsCell class])]; if (!cell) { cell = [[YMIncomeBreakdownListWithdrawalRecordsCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:NSStringFromClass([YMIncomeBreakdownListWithdrawalRecordsCell class])]; } cell.selectionStyle = UITableViewCellSelectionStyleNone; [cell ym_bindViewModel:self.viewModel.withdrawalRecordsDataArray[indexPath.item]]; return cell; } default: break; } } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ switch (self.viewModel.categoryType) { case YMIncomeBreakdownCategoryTypePoints: case YMIncomeBreakdownCategoryTypeEarnings: { return adapt(90); } break; case YMIncomeBreakdownCategoryTypeWithdrawalRecords: { return adapt(180); } default: break; } } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ switch (self.viewModel.categoryType) { case YMIncomeBreakdownCategoryTypePoints: case YMIncomeBreakdownCategoryTypeEarnings: { if (OCStringIsEmpty(self.viewModel.pointsAndEarningsDataArray[section].sectionTitle)) { return nil; } else { YMIncomeBreakdownListSectionView *sectionHeaderView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:NSStringFromClass([YMIncomeBreakdownListSectionView class])]; if(!sectionHeaderView){ sectionHeaderView = [[YMIncomeBreakdownListSectionView alloc] initWithReuseIdentifier:NSStringFromClass([YMIncomeBreakdownListSectionView class])]; } [sectionHeaderView ym_bindViewModel:self.viewModel.pointsAndEarningsDataArray[section]]; return sectionHeaderView; } } break; case YMIncomeBreakdownCategoryTypeWithdrawalRecords: { return nil; } default: break; } } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { switch (self.viewModel.categoryType) { case YMIncomeBreakdownCategoryTypePoints: case YMIncomeBreakdownCategoryTypeEarnings: { if (OCStringIsEmpty(self.viewModel.pointsAndEarningsDataArray[section].sectionTitle)) { return CGFLOAT_MIN; } else { return adapt(30); } } break; case YMIncomeBreakdownCategoryTypeWithdrawalRecords: { return CGFLOAT_MIN; } default: break; } } - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return nil; } - (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { return CGFLOAT_MIN; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { switch (self.viewModel.categoryType) { case YMIncomeBreakdownCategoryTypePoints: case YMIncomeBreakdownCategoryTypeEarnings: { if (self.viewModel.pointsAndEarningsDataArray[indexPath.section].rowDataArray[indexPath.item].userId != 0) { [self.viewModel.gotoPersonalPageSubject sendNext:@(self.viewModel.pointsAndEarningsDataArray[indexPath.section].rowDataArray[indexPath.item].userId)]; } } break; case YMIncomeBreakdownCategoryTypeWithdrawalRecords: { } default: break; } } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { !self.scrollCallback ?: self.scrollCallback(scrollView); } #pragma mark - JXPagingViewListViewDelegate - (UIView *)listView { return self.view; } - (UIScrollView *)listScrollView { return self.contentTableView; } - (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback { self.scrollCallback = callback; } - (void)listWillAppear { // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } - (void)listDidAppear { // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } - (void)listWillDisappear { // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } - (void)listDidDisappear { // NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } - (UITableView *)contentTableView{ if (!_contentTableView) { _contentTableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain]; _contentTableView.delegate = self; _contentTableView.dataSource = self; _contentTableView.estimatedRowHeight = 0; _contentTableView.estimatedSectionHeaderHeight = 0; _contentTableView.estimatedSectionFooterHeight = 0; _contentTableView.showsVerticalScrollIndicator = NO; _contentTableView.showsHorizontalScrollIndicator = NO; _contentTableView.separatorColor = UIColor.clearColor; _contentTableView.backgroundColor = UIColor.whiteColor; [_contentTableView registerClass:[YMIncomeBreakdownListSectionView class] forHeaderFooterViewReuseIdentifier:NSStringFromClass([YMIncomeBreakdownListSectionView class])]; [_contentTableView registerClass:[YMIncomeBreakdownListPointsAndEarningsCell class] forCellReuseIdentifier:NSStringFromClass([YMIncomeBreakdownListPointsAndEarningsCell class])]; [_contentTableView registerClass:[YMIncomeBreakdownListWithdrawalRecordsCell class] forCellReuseIdentifier:NSStringFromClass([YMIncomeBreakdownListWithdrawalRecordsCell class])]; _contentTableView.mj_header = self.refreshHeader; _contentTableView.mj_footer = self.noLoadMoreFooter; YMEmptyView *empty = [YMEmptyView emptyViewWithImageStr:@"ym_common_no_data_icon" titleStr:@"暂无查到相关数据" detailStr:@""]; empty.imageSize = kEmptyViewSize; _contentTableView.ym_emptyView = empty; _contentTableView.ym_emptyView.autoShowEmptyView = NO; } return _contentTableView; } @end