ComListViewModel.m 4.6 KB
//
//  ComListViewModel.m
//  DreamSleep
//
//  Created by peter on 2022/9/27.
//

#import "ComListViewModel.h"
#import "ComDynListResultModel.h"

@interface ComListViewModel ()
/// 社区动态列表结果数据model
@property (nonatomic, strong) ComDynListResultModel *resultModel;
@end

@implementation ComListViewModel

+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper {
    return @{@"resultModel" : @"result"
    };
}

- (instancetype)init {
    if (self = [super init]) {
        self.listArr = [NSArray array];
    }
    return self;
}

- (NSURLSessionDataTask *)querySleepDynamicListWithLoadMore:(BOOL)loadMore offset:(int)offset completion:(void (^)(ComListViewModel *requestModel))completion {
    NSString *api = @"query_sleep_dynamic_list";
    NSString *argStr = [NSString stringWithFormat:@"query{%@(offset:%d)}", api, offset];
    return [ComListViewModel httpPostBodyRequestWithAPI:api params:@{@"query" : argStr} view:nil hasNetActivity:YES loadingInfo:nil hasFailInfo:NO success:^(NSDictionary * _Nonnull apiDic) {
        DSLog(@"社区动态查询列表接口apiDic:%@", apiDic);
        // 1、解析数据
        self.resCode = DSResCodeSuccess;
        self.resultModel = [ComDynListResultModel yy_modelWithDictionary:apiDic[@"result"]];
        // 2、根据业务需要的数据结构对数据进行加工
        NSArray *latest_data_list = self.resultModel.data_list ?: @[];
        self.latestDataList = latest_data_list;
        if (loadMore) {
            NSMutableArray *tmp_list_arr = [NSMutableArray arrayWithArray:self.listArr];
            [tmp_list_arr addObjectsFromArray:latest_data_list.copy];
            self.listArr = tmp_list_arr.copy;
        } else {
            self.listArr = latest_data_list.copy;
        }
        // 3、如果是官方发布的动态,则放在第一位,并且只插入1次
        NSMutableArray *newList = [NSMutableArray arrayWithArray:self.listArr];
        __block BOOL hasOfficialModel = NO;
        [newList enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if ([obj isKindOfClass:[OfficialMessageModel class]]) {
                hasOfficialModel = YES;
                *stop = YES;
            }
        }];
        if (hasOfficialModel == NO) {
            [newList insertObject:self.resultModel.officialMessageModel atIndex:0];
        }
        self.isOfficial = self.resultModel.officialMessageModel;
        self.listArr = newList.copy;
        completion(self);
    } failure:^(id _Nonnull failureInfo) {
        self.resCode = [failureInfo[@"errorCode"] integerValue];
        self.errMessage = failureInfo[@"errMessage"];
        completion(self);
    }];
}

- (void)showOfficialAllContent {
    self.resultModel.officialMessageModel.isShowAllContent = YES;
}

- (void)insertUserDyModel:(ComDynModel *)dyModel {
    if (!dyModel) { return; }
    // 用户发的说说临时插入到动态列表第一条
    NSInteger insertIndex = 0;
    // 如果有官方动态,则插入到官方动态下面
    if (self.resultModel.officialMessageModel) {
        insertIndex = 1;
    }
    NSMutableArray *tmpListArr = [NSMutableArray arrayWithArray:self.listArr];
    [tmpListArr insertObject:dyModel atIndex:insertIndex];
    self.listArr = tmpListArr.copy;
}

+ (void)updateLikeData:(ComDynModel *)comDynModel {
    if (comDynModel.isLike) {
        comDynModel.likeCount--;
    } else {
        comDynModel.likeCount++;
    }
    comDynModel.isLike = !comDynModel.isLike;
}

+ (NSURLSessionDataTask *)userDynamicPraiseWithComDynModel:(ComDynModel *)comDynModel completion:(void (^)(ComListViewModel *requestModel))completion {
    ComListViewModel * requestModel = [[ComListViewModel alloc] init];
    NSString *api = @"user_dynamic_praise";
    NSString *argStr = [NSString stringWithFormat:@"mutation{%@(talk_id:%d,user_id:%d)}", api, comDynModel.dynamicID, comDynModel.userID];
    return [self httpPostBodyRequestWithAPI:api params:@{@"query" : argStr} view:nil hasNetActivity:YES loadingInfo:nil hasFailInfo:NO success:^(NSDictionary * _Nonnull apiDic) {
        DSLog(@"用户动态点赞、取消点赞接口apiDic:%@", apiDic);
        requestModel.resCode = DSResCodeSuccess;
        completion(requestModel);
    } failure:^(id _Nonnull failureInfo) {
        requestModel.resCode = [failureInfo[@"errorCode"] integerValue];
        requestModel.errMessage = failureInfo[@"errMessage"];
        
        // 回滚数据model
        if (comDynModel.isLike) {
            comDynModel.likeCount--;
        } else {
            comDynModel.likeCount++;
        }
        comDynModel.isLike = !comDynModel.isLike;
        
        completion(requestModel);
    }];
}

@end