Files
peko-ios/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoEditViewController.m
2025-03-21 16:19:07 +08:00

584 lines
22 KiB
Objective-C

//
// XPMineUserInfoEditViewController.m
// xplan-ios
//
// Created by 冯硕 on 2021/9/23.
//
#import "XPMineUserInfoEditViewController.h"
///Third
#import <Masonry/Masonry.h>
#import <ReactiveObjC/ReactiveObjC.h>
#import <TZImagePickerController/TZImagePickerController.h>
///Tool
#import "TTPopup.h"
#import "YYUtility.h"
#import "Api+Mine.h"
///Model
#import "XPMineUserInfoEditModel.h"
#import "UserInfoModel.h"
#import "LocationModel.h"
///View
#import "XPMineUserInfoEditTableViewCell.h"
#import "XPMineUserInfoDateView.h"
#import "XPMineUserInfoEditPickView.h"
///P
#import "XPMineUserInfoEditProtocol.h"
#import "XPMineUserInfoEditPresenter.h"
///VC
#import "XPMineUserInfoNickViewController.h"
#import "XPMineUserInfoDesViewController.h"
#import "XPMineUserInfoAlbumViewController.h"
#import "XPMineUserInfoRecordedSoundVC.h"
#import "AlbumResourcePickerViewController.h"
UIKIT_EXTERN NSString * kUpdateSoundInfo;
@interface XPMineUserInfoEditViewController ()<
UITableViewDelegate,
UITableViewDataSource,
XPMineUserInfoEditProtocol,
XPMineUserInfoDesViewControllerDelegate,
XPMineUserInfoNickViewControllerDelegate,
UIImagePickerControllerDelegate,
UINavigationControllerDelegate,
XPMineUserInfoDateViewDelegate,
XPMineUserInfoEditPickViewDelegate,
TZImagePickerControllerDelegate>
///列表
@property (nonatomic,strong) UITableView *tableView;
///数据源
@property (nonatomic,strong) NSArray *dataSource;
///用户信息
@property (nonatomic,strong) UserInfoModel *userInfo;
///地区列表
@property (nonatomic,strong) NSMutableArray <LocationModel *>*areaList;
@property (nonatomic,assign) CGFloat maxWidth;
@property (nonatomic, assign) BOOL isPhotoPickerDisplayGIF;
@end
@implementation XPMineUserInfoEditViewController
-(void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
- (XPMineUserInfoEditPresenter *)createPresenter {
return [[XPMineUserInfoEditPresenter alloc] init];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.areaList = [NSMutableArray array];
[self initSubViews];
[self initSubViewConstraints];
[self getAreaList];
}
-(void)getAreaList {
[self.presenter getAreaList];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.presenter getUserInfo];
}
#pragma mark - Private Method
- (void)initSubViews {
self.view.backgroundColor = [UIColor whiteColor];
self.title = YMLocalizedString(@"XPMineUserInfoEditViewController0");
[self.view addSubview:self.tableView];
}
- (void)initSubViewConstraints {
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.view);
}];
}
- (void)showPhotoView {
@weakify(self);
TTActionSheetConfig *cameraConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoEditViewController1") clickAction:^{
[YYUtility checkCameraAvailable:^{
@strongify(self);
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.allowsEditing = YES;
[self presentViewController:imagePicker animated:YES completion:NULL];
} denied:^{
@strongify(self);
[self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController2") content:YMLocalizedString(@"XPMineUserInfoEditViewController3")];
} restriction:^{
@strongify(self);
[self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController4") content:YMLocalizedString(@"XPMineUserInfoEditViewController5")];
}];
}];
TTActionSheetConfig *photoLibraryConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"UserInfoEdit_1.0.17_1") clickAction:^{
[YYUtility checkAssetsLibrayAvailable:^{
@strongify(self);
[self presentViewController:[self photoPickerWillDisplayGIF: NO]
animated:YES
completion:nil];
} denied:^{
@strongify(self);
[self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController7") content:YMLocalizedString(@"XPMineUserInfoEditViewController8")];
} restriction:^{
@strongify(self);
[self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController9") content:YMLocalizedString(@"XPMineUserInfoEditViewController10")];
}];
}];
// if (self.userInfo.userVipInfoVO.uploadGifAvatar) {
if (![self.userInfo isEnglish]) {
TTActionSheetConfig *gifLibraryConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"UserInfoEdit_1.0.17_0") clickAction:^{
if (self.userInfo.uploadGifAvatarPrice == 0) {
[self displayGifPhotoBroswer];
} else {
TTAlertConfig *config = [[TTAlertConfig alloc] init];
config.actionStyle = TTAlertActionBothStyle;
config.title = YMLocalizedString(@"AnchorPKStageView0");
config.titleFont = kFontMedium(15);
config.titleColor = UIColorFromRGB(0x313131);
config.messageTextAlignment = NSTextAlignmentLeft;
config.message = [NSString stringWithFormat:YMLocalizedString(@"20.20.51_text_27"), @(self.userInfo.uploadGifAvatarPrice), @(self.userInfo.uploadGifAvatarPrice)];
@kWeakify(self);
[TTPopup alertWithConfig:config
confirmHandler:^{
@kStrongify(self);
[self.presenter checkMoney:^(NSInteger currentMoney){
if (currentMoney < self.userInfo.uploadGifAvatarPrice) {
[XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"XPTreasureFairyViewController5")];
} else {
[self displayGifPhotoBroswer];
}
} failure:^(NSString * _Nonnull message) {
}];
} cancelHandler:^{
}];
}
}];
gifLibraryConfig.displayMoliCoin = self.userInfo.uploadGifAvatarPrice > 0;
[TTPopup actionSheetWithItems:@[cameraConfig, photoLibraryConfig, gifLibraryConfig]];
} else {
[TTPopup actionSheetWithItems:@[cameraConfig, photoLibraryConfig]];
}
}
- (void)displayGifPhotoBroswer {
@kWeakify(self);
[YYUtility checkAssetsLibrayAvailable:^{
@kStrongify(self);
[self presentViewController:[self photoPickerWillDisplayGIF: YES]
animated:YES
completion:nil];
} denied:^{
@kStrongify(self);
[self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController7") content:YMLocalizedString(@"XPMineUserInfoEditViewController8")];
} restriction:^{
@kStrongify(self);
[self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController9") content:YMLocalizedString(@"XPMineUserInfoEditViewController10")];
}];
}
- (TZImagePickerController *)photoPickerWillDisplayGIF:(BOOL)displayGIF {
self.isPhotoPickerDisplayGIF = displayGIF;
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:1
delegate:self];
imagePickerVc.modalPresentationStyle = UIModalPresentationOverFullScreen;
imagePickerVc.allowPickingVideo = NO;
imagePickerVc.allowTakeVideo = NO;
if (displayGIF) {
imagePickerVc.allowTakePicture = NO;
}
imagePickerVc.allowPickingGif = displayGIF;
imagePickerVc.allowCrop = YES;
CGFloat cropWidth = KScreenWidth;
imagePickerVc.cropRect = CGRectMake(0, (self.view.bounds.size.height - cropWidth) / 2, cropWidth, cropWidth);
imagePickerVc.naviBgColor = [DJDKMIMOMColor appCellBackgroundColor];
imagePickerVc.naviTitleColor = [DJDKMIMOMColor mainTextColor];
imagePickerVc.barItemTextColor = [DJDKMIMOMColor mainTextColor];
return imagePickerVc;
}
- (void)showNotPhoto:(NSString *)title content:(NSString *)content {
TTAlertConfig *config = [[TTAlertConfig alloc] init];
config.title = title;
config.message = content;
[TTPopup alertWithConfig:config confirmHandler:^{
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
}];
}
} cancelHandler:^{
}];
}
- (void)showDatePickerView {
XPMineUserInfoDateView *dateView = [[XPMineUserInfoDateView alloc] initWithFrame:CGRectMake(0, KScreenHeight, KScreenWidth,KScreenHeight)];
dateView.delegate = self;
dateView.time = self.userInfo.birth/1000;
[kWindow addSubview:dateView];
[UIView animateWithDuration:0.5 animations:^{
dateView.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
}completion:^(BOOL finished) {
dateView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
}];
}
- (void)updateCPSetting:(BOOL)isOn type:(NSInteger)type {
[self showLoading];
@kWeakify(self);
[Api updateCPSetting:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
@kStrongify(self);
[self hideHUD];
if (code == 200) {
if (type == 1) {
self.relationUser.showCpAvatar = isOn;
} else {
self.relationUser.showCpAnim = isOn;
}
[self showSuccessToast:msg];
} else {
[self showErrorToast:msg];
}
} type:@(type) isShow:@(isOn)];
}
#pragma mark - UITableViewDelegate And UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section == 1) {
return 2;
}
return self.dataSource.count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 1) {
return kGetScaleWidth(60);
}
XPMineUserInfoEditModel * model = [self.dataSource xpSafeObjectAtIndex:indexPath.row];
if (model.type == XPMineUserInfoEditType_Avatar) {
return kGetScaleWidth(80);
} else {
return kGetScaleWidth(60);
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (section == 1) {
return 60;
}
return 0;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if (section == 1) {
// 创建 header view
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 60)];
headerView.backgroundColor = [UIColor clearColor];
// 创建 label 或者其他子视图
UILabel *label = [UILabel labelInitWithText:@"CP" font:kFontMedium(15) textColor:UIColorFromRGB(0x313131)];
// 添加到 header view
[headerView addSubview:label];
// 设置 Auto Layout 约束,给 label 添加左间距
label.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:@[
[label.leadingAnchor constraintEqualToAnchor:headerView.leadingAnchor constant:16], // 左间距为16
[label.centerYAnchor constraintEqualToAnchor:headerView.centerYAnchor], // 垂直居中
]];
return headerView;
}
return nil;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
XPMineUserInfoEditTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])];
if (cell == nil) {
cell = [[XPMineUserInfoEditTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])];
}
if (indexPath.section == 1) {
XPMineUserInfoEditModel *model = [[XPMineUserInfoEditModel alloc] init];
if (indexPath.row == 0) {
model.isCPAnimation = self.relationUser.showCpAnim;
model.title = YMLocalizedString(@"UserDetail_Setting_0");
model.type = XPMineUserInfoEditType_CP_Animation;
} else {
model.isCPAvatar = self.relationUser.showCpAvatar;
model.title =YMLocalizedString(@"UserDetail_Setting_1");
model.type = XPMineUserInfoEditType_CP_Avatar;
}
cell.itemModel = model;
@kWeakify(self);
[cell setChangeCPSwitch:^(BOOL isOn, NSInteger type) {
@kStrongify(self);
[self updateCPSetting:isOn type:type];
}];
return cell;
}
XPMineUserInfoEditModel * model = [self.dataSource xpSafeObjectAtIndex:indexPath.row];
if(model.type == XPMineUserInfoEditType_Tag){
}else if(model.type == XPMineUserInfoEditType_Area){
if (self.selectedArea) {
model.subTitle = self.selectedArea.name;
} else {
model.subTitle = self.outsideSelectedRegionName;
}
}
cell.itemModel = model;
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.section == 1) {
return;
}
XPMineUserInfoEditModel * model = [self.dataSource xpSafeObjectAtIndex:indexPath.row];
switch (model.type) {
case XPMineUserInfoEditType_Nick:
{
XPMineUserInfoNickViewController * nickVC = [[XPMineUserInfoNickViewController alloc] init];
nickVC.delegate = self;
nickVC.nick = self.userInfo.nick;
[self.navigationController pushViewController:nickVC animated:YES];
}
break;
case XPMineUserInfoEditType_Avatar: {
if (self.userInfo.isReview) {
[self showErrorToast:YMLocalizedString(@"XPMineUserInfoEditViewController11")];
} else {
[self showPhotoView];
}
}
break;
case XPMineUserInfoEditType_Birth:
[self showDatePickerView];
break;
case XPMineUserInfoEditType_UseDes:
{
XPMineUserInfoDesViewController * desVC = [[XPMineUserInfoDesViewController alloc] init];
desVC.delegate = self;
desVC.userDesc = self.userInfo.userDesc;
[self.navigationController pushViewController:desVC animated:YES];
}
break;
case XPMineUserInfoEditType_Photo:
{
XPMineUserInfoAlbumViewController * albumVC = [[XPMineUserInfoAlbumViewController alloc] init];
[self.navigationController pushViewController:albumVC animated:YES];
}
break;
case XPMineUserInfoEditType_Sound:
break;
case XPMineUserInfoEditType_Tag:
break;
case XPMineUserInfoEditType_Area:
{
XPMineUserInfoEditPickView *pickerView = [[XPMineUserInfoEditPickView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)];
pickerView.outsideSelectedAreaName = self.outsideSelectedRegionName;
pickerView.selectedArea = self.selectedArea;
pickerView.dataArray = self.areaList;
pickerView.delegate = self;
[kWindow addSubview:pickerView];
break;
}
default:
break;
}
}
#pragma mark - TZImagePickerControllerDelegate
- (BOOL)isAssetCanBeDisplayed:(PHAsset *)asset {
if (self.isPhotoPickerDisplayGIF) {
return [[asset valueForKey:@"filename"] containsString:@"GIF"];
} else {
return ![[asset valueForKey:@"filename"] containsString:@"GIF"];
}
}
- (void)imagePickerController:(TZImagePickerController *)picker
didFinishPickingPhotos:(NSArray<UIImage *> *)photos
sourceAssets:(NSArray *)assets
isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto
infos:(NSArray<NSDictionary *> *)infos {
PHAsset *sourceAsset = assets.firstObject;
if ([[sourceAsset valueForKey:@"filename"] containsString:@"GIF"]) {
@kWeakify(self);
dispatch_async(dispatch_get_main_queue(), ^{
@kStrongify(self);
[self showLoading];
[[PHImageManager defaultManager] requestImageDataForAsset:sourceAsset
options:nil
resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
[self.presenter uploadGifAvatar:imageData];
}];
[picker dismissViewControllerAnimated:YES completion:^{}];
});
} else {
@kWeakify(self);
dispatch_async(dispatch_get_main_queue(), ^{
@kStrongify(self);
UIImage *croppedImage = photos.firstObject; // 选中的裁剪后的图片
// 在这里处理裁剪后的图片
if (croppedImage) {
[self showLoading];
[self.presenter uploadAvatar:croppedImage];
}
[picker dismissViewControllerAnimated:YES completion:^{}];
});
}
}
#pragma mark - UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *selectedPhoto = [info objectForKey:UIImagePickerControllerEditedImage];
if (selectedPhoto) {
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
UIImageWriteToSavedPhotosAlbum(selectedPhoto, nil, nil, nil);
}
[self showLoading];
[self.presenter uploadAvatar:selectedPhoto];
}
[picker dismissViewControllerAnimated:YES completion:^{}];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[picker dismissViewControllerAnimated:YES completion:^{
}];
}
#pragma mark - XPMineUserInfoDateViewDelegate
- (void)xPMineUserInfoDateView:(XPMineUserInfoDateView *)view didClickSureButton:(NSString *)dateStr{
if (dateStr.length > 0) {
[self.presenter complectionInfoWithAvatar:nil nick:nil birth:dateStr userDesc:nil];
}
}
#pragma mark - XPMineUserInfoNickViewControllerDelegate
- (void)xPMineUserInfoNickViewController:(XPMineUserInfoNickViewController *)viewController updateNick:(NSString *)nick {
if (nick.length > 0) {
[self.presenter complectionInfoWithAvatar:nil nick:nick birth:nil userDesc:nil];
}
}
#pragma mark - XPMineUserInfoDesViewControllerDelegate
- (void)xPMineUserInfoDesViewController:(XPMineUserInfoDesViewController *)viewController updateUserDes:(NSString *)userDes {
if (userDes.length > 0) {
[self.presenter complectionInfoWithAvatar:nil nick:nil birth:nil userDesc:userDes];
}
}
#pragma mark - XPMineUserInfoEditProtocol
- (void)getUserInfoEditDataSourceSuccess:(NSArray *)array {
self.dataSource = array;
[self.tableView reloadData];
}
-(void)getAreaListSuccess:(NSArray <LocationModel *>*)list{
self.areaList = [list mutableCopy];
}
- (void)saveAreaSuccess{
if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoEditViewControllerC:didClickCompleteArea:)]){
[self.delegate xPMineUserInfoEditViewControllerC:self didClickCompleteArea:self.selectedArea];
}
[self.tableView reloadData];
}
- (void)completeUserInfoSuccess:(UserInfoModel *)userInfo {
if (userInfo.isReview) {
[self showSuccessToast:YMLocalizedString(@"XPMineUserInfoEditViewController12")];
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[self.presenter getUserInfo];
});
} else {
[self showSuccessToast:YMLocalizedString(@"XPMineUserInfoEditViewController13")];
[self.presenter getUserInfo];
}
}
- (void)onGetUserInfoSuccess:(UserInfoModel *)userInfo {
self.userInfo = userInfo;
[self.presenter getUserInfoEditDataSourceWithUserInfo:self.userInfo];
}
- (void)uploadImageSuccess:(NSString *)url {
@kWeakify(self);
dispatch_async(dispatch_get_main_queue(), ^{
@kStrongify(self);
[self hideHUD];
if (self.isPhotoPickerDisplayGIF) {
[self uploadGiftAvatar:url];
} else {
[self.presenter complectionInfoWithAvatar:url nick:nil birth:nil userDesc:nil];
}
});
}
- (void)uploadGiftAvatar:(NSString *)url {
[self.presenter uploadAvatarV2:url needPay:self.userInfo.uploadGifAvatarPrice > 0];
}
- (void)uploadGifAvatarSuccess:(NSString *)url {
self.userInfo.avatar = url;
XPMineUserInfoEditModel *model = [self.dataSource firstObject];
if (model) {
model.avatarUrl = url;
}
[self.tableView reloadData];
}
#pragma mark - XPMineUserInfoEditPickView
- (void)didClickSureActionWithArea:(LocationModel *)area{
self.selectedArea = area;
[self.presenter saveAreaConfigWithArea:self.selectedArea];
}
#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.tableHeaderView = [UIView new];
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_tableView.backgroundColor = [UIColor clearColor];
if (@available(iOS 11.0, *)) {
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
}
[_tableView registerClass:[XPMineUserInfoEditTableViewCell class] forCellReuseIdentifier:NSStringFromClass([XPMineUserInfoEditTableViewCell class])];
}
return _tableView;
}
@end