// // XPMonentsAttentionViewController.m // xplan-ios // // Created by 冯硕 on 2022/5/18. // #import "XPMonentsAttentionViewController.h" ///Third #import #import ///Tool #import "ThemeColor.h" #import "XPMacro.h" #import "XPMonentsLayoutConfig.h" #import "TTPopup.h" #import "NSArray+Safe.h" ///Model #import "MonentsListInfoModel.h" ///P #import "XPMonentsAttentionPresenter.h" #import "XPMonentsAttentionProtocol.h" ///View #import "XPMonentsTableViewCell.h" #import "XPMonentsEmptyTableViewCell.h" #import "XPMonentsDetailViewController.h" @interface XPMonentsAttentionViewController () ///列表 @property (nonatomic,strong) UITableView *tableView; ///数据源 @property (nonatomic,strong) NSMutableArray *datasource; ///当前的页数 @property (nonatomic,assign) NSInteger page; ///是否有更多的数据 @property (nonatomic,assign) BOOL hasNoMoreData; ///数据信息 @property (nonatomic,strong) MonentsListInfoModel *listInfo; @end @implementation XPMonentsAttentionViewController - (BOOL)isHiddenNavBar { return YES; } - (__kindof id)createPresenter { return [[XPMonentsAttentionPresenter alloc] init]; } - (void)viewDidLoad { [super viewDidLoad]; [self initHeaderAndFooterRrfresh]; [self initSubViews]; [self initSubViewConstraints]; } #pragma mark - Private Method - (void)initSubViews { [self.view addSubview:self.tableView]; } - (void)initSubViewConstraints { [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.view); }]; } #pragma mark - 下拉刷新 - (void)initHeaderAndFooterRrfresh { MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(headerRefresh)]; header.stateLabel.font = [UIFont systemFontOfSize:10.0]; header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:10.0]; header.stateLabel.textColor = [ThemeColor secondTextColor]; header.lastUpdatedTimeLabel.textColor = [ThemeColor secondTextColor]; self.tableView.mj_header = header; MJRefreshBackNormalFooter *footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(footerRefresh)]; footer.stateLabel.textColor = [ThemeColor secondTextColor]; footer.stateLabel.font = [UIFont systemFontOfSize:10.0]; self.tableView.mj_footer = footer; [self headerRefresh]; } #pragma mark - 刷新的fangfa - (void)headerRefresh { self.page = 1; [self.presenter getMonentsAttentionListPageSize:20 dynamicId:@"" state:0]; } - (void)footerRefresh { if (self.hasNoMoreData) { [self showErrorToast:@"没有更多数据了"]; [self.tableView.mj_footer endRefreshing]; return; } self.page++; [self.presenter getMonentsAttentionListPageSize:20 dynamicId:self.listInfo.nextDynamicId state:1]; } #pragma mark - UITableViewDelegate And UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.datasource.count > 0 ? self.datasource.count : 1; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.datasource.count > 0) { MonentsInfoModel * monentInfo= [self.datasource safeObjectAtIndex1:indexPath.row]; [XPMonentsLayoutConfig layoutMonentsModel:monentInfo]; return monentInfo.rowHeight; } return KScreenHeight - kNavigationHeight - 49 - kSafeAreaBottomHeight; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (self.datasource.count > 0) { XPMonentsTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMonentsTableViewCell class])]; MonentsInfoModel * monentsInfo = [self.datasource safeObjectAtIndex1:indexPath.row]; cell.delegate = self; cell.monentsInfo = monentsInfo; return cell; } XPMonentsEmptyTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMonentsEmptyTableViewCell class])]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; if (self.datasource.count > 0) { XPMonentsDetailViewController * detailVC = [[XPMonentsDetailViewController alloc] init]; MonentsInfoModel * monentsInfo = [self.datasource safeObjectAtIndex1:indexPath.row]; detailVC.monentsInfo = monentsInfo; detailVC.delegate = self; [self.navigationController pushViewController:detailVC animated:YES]; } } #pragma mark - XPMonentsDetailViewControllerDelegate - (void)xPMonentsDetailViewController:(XPMonentsDetailViewController *)view deleteMonents:(NSString *)dynamicId { __block MonentsInfoModel * deleteInfo; [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.dynamicId.integerValue == dynamicId.integerValue) { deleteInfo = obj; } }]; if (deleteInfo) { [self.datasource removeObject:deleteInfo]; [self.tableView reloadData]; } } #pragma mark - XPMonentsTableViewCellDelegate - (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClickLike:(MonentsInfoModel *)monentsInfo { [self.presenter likeMonent:monentsInfo.dynamicId status:!monentsInfo.isLike likedUid:monentsInfo.uid worldId:[NSString stringWithFormat:@"%ld", monentsInfo.worldId]]; } - (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicDelete:(MonentsInfoModel *)monentsInfo { [TTPopup alertWithMessage:@"删除后不可恢复\n确定删除该动态吗?" confirmHandler:^{ [self.presenter deleteMonents:monentsInfo.dynamicId worldId:[NSString stringWithFormat:@"%ld", monentsInfo.worldId]]; } cancelHandler:^{ }]; } - (void)xPMonentsTableViewCell:(XPMonentsTableViewCell *)view didClicFold:(MonentsInfoModel *)monentsInfo { __block MonentsInfoModel * monentsInfos; [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.dynamicId.integerValue == monentsInfo.dynamicId.integerValue) { monentsInfos = obj; *stop = YES; } }]; if (monentsInfos) { NSInteger row = [self.datasource indexOfObject:monentsInfo]; [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; } } #pragma mark -JXCategoryListContainerViewDelegate - (UIView *)listView { return self.view; } #pragma mark - XPMonentsRecommendProtocol - (void)getMonentsAttentionListSuccess:(MonentsListInfoModel *)listInfo state:(int)state { self.listInfo = listInfo; if (state == 0) { [self.datasource removeAllObjects]; } if (listInfo.dynamicList.count > 0) { [self.datasource addObjectsFromArray:listInfo.dynamicList]; } if (state == 0) { self.hasNoMoreData = NO; [self.tableView.mj_header endRefreshing]; } else { if (listInfo.dynamicList.count > 0) { self.hasNoMoreData = NO; } else { self.hasNoMoreData = YES; } [self.tableView.mj_footer endRefreshing]; } [self.tableView reloadData]; } - (void)getMonentsAttentionListFail:(NSString *)msg state:(int)state { if (state == 0) { [self.tableView.mj_header endRefreshing]; } else { [self.tableView.mj_footer endRefreshing]; } } - (void)likeMonentsSuccess:(NSString *)dynamicId status:(BOOL)status { [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj.dynamicId isEqualToString:dynamicId]) { if (status) { obj.isLike += 1; } else { obj.isLike -= 1; } *stop = YES; } }]; [self.tableView reloadData]; } - (void)deleteMonentsSuccess:(NSString *)monentsInfo { [self showSuccessToast:@"删除成功"]; __block MonentsInfoModel * deleteInfo; [self.datasource enumerateObjectsUsingBlock:^(MonentsInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj.dynamicId.integerValue == monentsInfo.integerValue) { deleteInfo = obj; } }]; if (deleteInfo) { [self.datasource removeObject:deleteInfo]; [self.tableView reloadData]; } } #pragma mark - Getters And Setters - (UITableView *)tableView { if (!_tableView) { _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; _tableView.delegate = self; _tableView.dataSource = self; _tableView.tableFooterView = [UIView new]; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; _tableView.backgroundColor = [UIColor clearColor]; if (@available(iOS 11.0, *)) { _tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } [_tableView registerClass:[XPMonentsTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMonentsTableViewCell class])]; [_tableView registerClass:[XPMonentsEmptyTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMonentsEmptyTableViewCell class])]; } return _tableView; } - (NSMutableArray *)datasource { if (!_datasource) { _datasource = [NSMutableArray array]; } return _datasource; } @end