DailyTaskView.m 11.3 KB
//
//  DailyTaskView.m
//  DreamSleep
//
//  Created by peter on 2022/6/29.
//

#import "DailyTaskView.h"
#import "DailyTaskSrollView.h"
#import "DailyBgView.h"
#import "SignTaskView.h"
#import "DailyTaskCell.h"
#import "TaskGroupModel.h"

@interface DailyTaskView () <UIScrollViewDelegate, UITableViewDelegate, UITableViewDataSource, DailyTaskCellDelegate>
@property (nonatomic, strong) DailyTaskSrollView *dtSrollView;
@property (nonatomic, strong) UIScrollView *scrollInnerView;
@property (nonatomic, strong) DailyBgView *dailyBgView;
@property (nonatomic, strong) UITableView *taskTableView;
@property (nonatomic, strong) SignTaskView *signTaskView;
@property (nonatomic, assign) BOOL vccanScroll;
@property (nonatomic, assign) CGFloat bgHeight;
@property (nonatomic, assign) CGFloat coverHeight;
@property (nonatomic, strong) NSArray *taskListArr;
@end

@implementation DailyTaskView

- (instancetype)initWithDelegate:(id<DailyTaskViewDelegate>)delegate {
    if (self = [super init]) {
        _delegate = delegate;
        
        self.vccanScroll = YES;
        self.bgHeight = kScreenWidth*300/375.0;
        self.coverHeight = 50;
        
        [self insertSubview:self.dtSrollView atIndex:0];
    }
    return self;
}

#pragma mark - DailyTaskCellDelegate
- (void)finishWithModel:(id)model taskType:(TaskType)taskType {
    if (taskType == TaskTypeDaily) { // 每日任务
        DailyTaskModel *dailyTaskModel = (DailyTaskModel *)model;
        if (self.delegate && [self.delegate respondsToSelector:@selector(goToTaskPageWithTaskID:url:)]) {
            [self.delegate goToTaskPageWithTaskID:dailyTaskModel.task_id url:dailyTaskModel.url];
        }
    } else { // 新手任务
        NewTaskModel *newTaskModel = (NewTaskModel *)model;
        if (self.delegate && [self.delegate respondsToSelector:@selector(goToTaskPageWithTaskID:url:)]) {
            [self.delegate goToTaskPageWithTaskID:newTaskModel.task_id url:newTaskModel.url];
        }
    }
}

- (void)waitingReceiveWithTaskID:(int)taskID taskType:(TaskType)taskType sender:(UIButton *)sender {
    if (taskType == TaskTypeDaily) {
        [ScoreTaskRequestModel receiveUserDailyTaskPointWithTaskID:taskID completion:^(ScoreTaskRequestModel * _Nonnull requestModel) {
            if (requestModel.resCode == DSResCodeSuccess) {
                [self.dailyBgView updateTodayPointData:requestModel.date_points];
                [sender setTitle:@"已领取" forState:UIControlStateNormal];
                sender.userInteractionEnabled = NO;
            }
        }];
    } else {
        [ScoreTaskRequestModel receiveUserNewsTaskPointWithTaskID:taskID completion:^(ScoreTaskRequestModel * _Nonnull requestModel) {
            if (requestModel.resCode == DSResCodeSuccess) {
                [self.dailyBgView updateTodayPointData:requestModel.date_points];
                [sender setTitle:@"已领取" forState:UIControlStateNormal];
                sender.userInteractionEnabled = NO;
            }
        }];
    }
}

#pragma mark - public
- (void)updateSignView:(ScoreTaskRequestModel *)requestModel {
    [self.signTaskView updateSignView:requestModel];
}

- (void)updateTaskView:(ScoreTaskRequestModel *)requestModel {
    if (!requestModel) { return; }
    
    [self.dailyBgView updateTodayPointData:requestModel.points];
    
    NSMutableArray *tmpArr = [NSMutableArray array];
    if (requestModel.task_items.count) {
        TaskGroupModel *groupModel = [TaskGroupModel modelWithTaskType:TaskTypeDaily taskArr:requestModel.task_items];
        [tmpArr addObject:groupModel];
    }
    if (requestModel.task_news.count) {
        TaskGroupModel *groupModel = [TaskGroupModel modelWithTaskType:TaskTypeNew taskArr:requestModel.task_news];
        [tmpArr addObject:groupModel];
    }
    self.taskListArr = [tmpArr copy];
    [self.taskTableView reloadData];
}

#pragma mark - UITableViewDelegate && UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.taskListArr.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    TaskGroupModel *groupModel = self.taskListArr[section];
    if (groupModel.taskType == TaskTypeDaily) {
        return groupModel.task_items.count;
    } else {
        return groupModel.task_news.count;
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 71;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *cellID = [NSString stringWithFormat:@"DailyTaskCell_%zd", indexPath.section];
    DailyTaskCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (!cell) {
        cell = [[DailyTaskCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }
    cell.delegate = self;
    TaskGroupModel *groupModel = self.taskListArr[indexPath.section];
    if (groupModel.taskType == TaskTypeDaily) {
        cell.taskType = TaskTypeDaily;
        DailyTaskModel *dailyTaskModel = groupModel.task_items[indexPath.row];
        cell.dailyTaskModel = dailyTaskModel;
    } else {
        cell.taskType = TaskTypeNew;
        NewTaskModel *newTaskModel = groupModel.task_news[indexPath.row];
        cell.nTaskModel = newTaskModel;
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    TaskGroupModel *groupModel = self.taskListArr[indexPath.section];
    NSArray *tmpArr = groupModel.taskType == TaskTypeDaily ? groupModel.task_items : groupModel.task_news;
    
    // 最后1个单元格圆角设置
    if (indexPath.row == tmpArr.count - 1) {
        [cell setCornerRadiusRect:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadius:24.0];
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 15.0 + 52;
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    if (section == self.taskListArr.count - 1) {
        return (24 + Bottom_SafeArea_Height);
    } else {
        return 0.001;
    }
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    TaskGroupModel *groupModel = self.taskListArr[section];
    
    CGFloat h = 15.0 + 52;
    UIView *headView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, h)];
    headView.backgroundColor = DSClearColor;
    UILabel *titleLab = [UILabel labWithText:(groupModel.taskType == TaskTypeDaily ? @"每日任务" : @"新手任务") font:BoldFont(16.0) fit:YES];
    titleLab.textAlignment = NSTextAlignmentCenter;
    titleLab.frame = CGRectMake(0, 15, kScreenWidth - 30, 52);
    [titleLab setCornerRadiusRect:(UIRectCornerTopLeft | UIRectCornerTopRight) cornerRadius:24.0];
    titleLab.dk_textColorPicker = DKColorPickerWithKey(Dk_TITLE);
    titleLab.dk_backgroundColorPicker = DKColorPickerWithKey(TabBarBG);
    [headView addSubview:titleLab];
    return headView;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    CGFloat h = (section == self.taskListArr.count - 1) ? (24 + Bottom_SafeArea_Height) : 0.001;
    return [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, h)];
}

#pragma mark - lazy
- (DailyTaskSrollView *)dtSrollView {
    if (!_dtSrollView) {
        _dtSrollView = [[DailyTaskSrollView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
        _dtSrollView.contentSize = CGSizeMake(kScreenWidth, self.bgHeight + kScreenHeight - self.coverHeight);
        _dtSrollView.showsVerticalScrollIndicator = NO;
        _dtSrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
        _dtSrollView.delegate = self;
        _dtSrollView.bounces = NO;
        [_dtSrollView addSubview:self.scrollInnerView];
    }
    return _dtSrollView;
}

- (UIScrollView *)scrollInnerView {
    if (_scrollInnerView == nil) {
        _scrollInnerView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight + self.bgHeight - self.coverHeight)];
        _scrollInnerView.contentSize = CGSizeMake(kScreenWidth, kScreenHeight + self.bgHeight - self.coverHeight);
        _scrollInnerView.showsVerticalScrollIndicator = NO;
        _scrollInnerView.delegate = self;
        _scrollInnerView.dk_backgroundColorPicker = DKColorPickerWithKey(VCViewBG);
        [_scrollInnerView addSubview:self.dailyBgView];
        [_scrollInnerView addSubview:self.taskTableView];
    }
    return _scrollInnerView;
}

- (DailyBgView *)dailyBgView {
    if (!_dailyBgView) {
        _dailyBgView = [[DailyBgView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, self.bgHeight)];
    }
    return _dailyBgView;
}

- (UITableView *)taskTableView {
    if (!_taskTableView) {
        _taskTableView = [[UITableView alloc] initWithFrame:CGRectMake(15, self.bgHeight - self.coverHeight, kScreenWidth - 30, kScreenHeight) style:UITableViewStyleGrouped];
        _taskTableView.delegate = self;
        _taskTableView.dataSource = self;
        _taskTableView.backgroundColor = DSClearColor;
        _taskTableView.showsVerticalScrollIndicator = NO;
        _taskTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        _taskTableView.tableHeaderView = self.signTaskView;
    }
    return _taskTableView;
}

- (SignTaskView *)signTaskView {
    if (!_signTaskView) {
        _signTaskView = [[SignTaskView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth - 30, 186)];
    }
    return _signTaskView;
}

- (NSArray *)taskListArr {
    if (!_taskListArr) {
        _taskListArr = [NSArray array];
    }
    return _taskListArr;
}

#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat offsetY = scrollView.contentOffset.y;
    if (scrollView == self.dtSrollView) {
        CGFloat maxOffsetY = self.bgHeight - self.coverHeight;
        if (offsetY >= maxOffsetY) {
            scrollView.contentOffset = CGPointMake(0, maxOffsetY);
            self.vccanScroll = NO;
            
            if (self.delegate && [self.delegate respondsToSelector:@selector(didScrollToMaxOffsetY:)]) {
                [self.delegate didScrollToMaxOffsetY:YES];
            }
        } else {
            if (self.vccanScroll == NO) {
                scrollView.contentOffset = CGPointMake(0, maxOffsetY);
            }
        }
        
        if (offsetY <= 0) {
            if (self.delegate && [self.delegate respondsToSelector:@selector(didScrollToMaxOffsetY:)]) {
                [self.delegate didScrollToMaxOffsetY:NO];
            }
        }
    } else if (scrollView == self.taskTableView) {
        CGPoint point = [scrollView.panGestureRecognizer translationInView:scrollView];
        CGFloat taboffsetY = point.y;
        if (offsetY < 0) {
            self.vccanScroll = YES;
        }
        if (taboffsetY < 0) {
            if (self.dtSrollView.contentOffset.y < self.bgHeight - self.coverHeight) {
                self.taskTableView.contentOffset = CGPointZero;
            }
        } else {
            if (offsetY > 0) {
                self.dtSrollView.contentOffset = CGPointMake(0, self.bgHeight - self.coverHeight);
            } else if (offsetY < 0) {
                if (self.dtSrollView.contentOffset.y > 0 && self.dtSrollView.contentOffset.y < self.bgHeight - self.coverHeight) {
                    self.taskTableView.contentOffset = CGPointZero;
                }
            }
        }
    }
}

@end