// // XPMineUserInfoEditViewController.m // xplan-ios // // Created by 冯硕 on 2021/9/23. // #import "XPMineUserInfoEditViewController.h" ///Third #import #import ///Tool #import "TTPopup.h" #import "YYUtility.h" ///Model #import "XPMineUserInfoEditModel.h" #import "UserInfoModel.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 "XPMineUserInfoTagVC.h" UIKIT_EXTERN NSString * kUpdateSoundInfo; @interface XPMineUserInfoEditViewController () ///列表 @property (nonatomic,strong) UITableView *tableView; ///数据源 @property (nonatomic,strong) NSArray *datasouce; ///用户信息 @property (nonatomic,strong) UserInfoModel *userInfo; ///地区列表 @property (nonatomic,strong) NSMutableArray *areaList; ///标签 @property (nonatomic,strong) NSMutableArray *tagList; /// @property (nonatomic,assign) CGFloat maxWidth; @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]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(updateSoundInfo:) name:kUpdateSoundInfo object:nil]; } -(void)getAreaList{ [self.presenter getAreaList]; } -(void)updateSoundInfo:(NSNotification *)not{ if(not.object != nil){ self.soundModel = not.object; }else{ self.soundModel = nil; } [self.tableView reloadData]; } - (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 *photoLibrayConfig = [TTActionSheetConfig normalTitle:YMLocalizedString(@"XPMineUserInfoEditViewController6") clickAction:^{ [YYUtility checkAssetsLibrayAvailable:^{ @strongify(self); UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.modalPresentationCapturesStatusBarAppearance = YES; imagePicker.delegate = self; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.allowsEditing = YES; [self presentViewController:imagePicker animated:YES completion:NULL]; } denied:^{ @strongify(self); [self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController7") content:YMLocalizedString(@"XPMineUserInfoEditViewController8")]; } restriction:^{ @strongify(self); [self showNotPhoto:YMLocalizedString(@"XPMineUserInfoEditViewController9") content:YMLocalizedString(@"XPMineUserInfoEditViewController10")]; }]; }]; [TTPopup actionSheetWithItems:@[cameraConfig, photoLibrayConfig]]; } - (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]; }]; } #pragma mark - XPMineUserInfoTagVCDelegate - (void)xPMineUserInfoTagVC:(XPMineUserInfoTagVC *)vc didClickComplete:(NSArray *)meLabels{ self.tagModel.meLabels = meLabels; self.tagList = [NSMutableArray array]; CGFloat maxWidth = 0; self.maxWidth = 0; for (int i = 0; i < meLabels.count; i++) { XPMineUserInfoTagItemModel *model = [XPMineUserInfoTagItemModel new]; NSString *text = meLabels[i]; model.label = text; CGRect stringRect = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, kGetScaleWidth(18)) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFontRegular(10)} context:nil]; CGFloat width = stringRect.size.width + kGetScaleWidth(14); model.width = width; maxWidth = maxWidth + width; if(maxWidth < kGetScaleWidth(220)){ self.maxWidth = maxWidth; [self.tagList addObject:model]; } } [self.tableView reloadData]; if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoEditViewControllerC:didClickComplete:)]){ [self.delegate xPMineUserInfoEditViewControllerC:self didClickComplete:@""]; } } #pragma mark - UITableViewDelegate And UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.datasouce.count; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; if (model.type == XPMineUserInfoEditType_Avatar) { return kGetScaleWidth(80); } else { return kGetScaleWidth(60); } } - (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])]; } XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1:indexPath.row]; if(model.type == XPMineUserInfoEditType_Tag){ cell.itemList = self.tagList; cell.maxWidth = self.maxWidth + self.tagList.count * kGetScaleWidth(5); model.subTitle = self.tagList.count > 0 ? @"":YMLocalizedString(@"XPMineUserInfoEditPresenter9"); }else if(model.type == XPMineUserInfoEditType_Area){ model.subTitle = self.area; } cell.itmeModel = model; cell.soundModel = self.soundModel; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; XPMineUserInfoEditModel * model = [self.datasouce safeObjectAtIndex1: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: { XPMineUserInfoRecordedSoundVC *vc = [XPMineUserInfoRecordedSoundVC new]; vc.soundModel = self.soundModel; [self.navigationController pushViewController:vc animated:YES]; break; } case XPMineUserInfoEditType_Tag: { XPMineUserInfoTagVC *tagVC =[XPMineUserInfoTagVC new]; tagVC.tagModel = self.tagModel; tagVC.delegate = self; [self.navigationController pushViewController:tagVC animated:YES]; break; } case XPMineUserInfoEditType_Area: { XPMineUserInfoEditPickView *pckView = [[XPMineUserInfoEditPickView alloc]initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight)]; pckView.area = self.area; pckView.dataArray = self.areaList; pckView.delegate = self; [kWindow addSubview:pckView]; break; } default: break; } } #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.datasouce = array; [self.tableView reloadData]; } -(void)getAreaListSuccess:(NSArray *)list{ self.areaList = [list mutableCopy]; } - (void)saveAreaSuccess{ if(self.delegate && [self.delegate respondsToSelector:@selector(xPMineUserInfoEditViewControllerC:didClickCompleteArea:)]){ [self.delegate xPMineUserInfoEditViewControllerC:self didClickCompleteArea:self.area]; } [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 { [self hideHUD]; [self.presenter complectionInfoWithAvatar:url nick:nil birth:nil userDesc:nil]; } #pragma mark - XPMineUserInfoEditPickView - (void)didClickSureActionWithArea:(NSString *)area{ self.area = area; [self.presenter saveAreaConfigWithArea:area]; } #pragma mark - Getters And Setters -(void)setSoundModel:(XPSoundCardModel *)soundModel{ _soundModel = soundModel; [self.tableView reloadData]; } -(void)setTagModel:(XPMineUserInfoTagModel *)tagModel{ _tagModel = tagModel; NSArray *meLabels = _tagModel.meLabels; self.tagList = [NSMutableArray array]; CGFloat maxWidth = 0 ; self.maxWidth = 0; for (int i = 0; i < meLabels.count; i++) { XPMineUserInfoTagItemModel *model = [XPMineUserInfoTagItemModel new]; NSString *text = meLabels[i]; model.label = text; CGRect stringRect = [text boundingRectWithSize:CGSizeMake(MAXFLOAT, kGetScaleWidth(18)) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kFontRegular(10)} context:nil]; CGFloat width = stringRect.size.width + kGetScaleWidth(14); model.width = width; maxWidth = maxWidth + width; if(maxWidth < kGetScaleWidth(220)){ self.maxWidth = maxWidth; [self.tagList addObject:model]; } } [self.tableView reloadData]; } - (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