// // XPNewHomeViewController.m // YuMi // // Created by YuMi on 2023/6/18. // #import "XPNewHomeViewController.h" ///Third #import #import #import #import #import ///Tool #import "Api+Home.h" #import "YUMIMacroUitls.h" #import "DJDKMIMOMColor.h" #import "YUMIHtmlUrl.h" #import "UIImage+Utils.h" #import "AccountInfoStorage.h" #import "Api+Room.h" #import "TTPopup.h" #import "NSArray+Safe.h" #import "XPWeakTimer.h" ///Model #import "HomeTagModel.h" #import "AccountModel.h" #import "XPLittleGameRoomOpenView.h" #import "PIHomeItemModel.h" #import "HomeMenuSourceModel.h" ///View #import "XPRoomSearchContainerViewController.h" #import "XPHomePartyViewController.h" #import "XPWebViewController.h" #import "XPHomeRecommendViewController.h" #import "XPNewHomeNavView.h" #import "XPRoomViewController.h" #import "XPNewHomeHeadView.h" #import "PIHoemCategoryTitleView.h" #import "XPHomeRecommendOtherRoomView.h" ///P #import "XPHomeContainerPresenter.h" #import "XPHomeContainerProtocol.h" #import "ClientConfig.h" #import "SessionViewController.h" #import "Api+Main.h" #import "XPLoginViewController.h" #import "BaseNavigationController.h" #import "XPAdImageTool.h" #import "PIHomeCategoryTitleModel.h" UIKIT_EXTERN NSString * kHomeMoreScrollPageKey; UIKIT_EXTERN NSString * const kOpenRoomNotification; @interface XPNewHomeViewController () ///背景 //@property (nonatomic,strong) UIImageView *backImageView; ///导航 //@property (nonatomic,strong) XPNewHomeNavView *navView; ///头视图 @property(nonatomic,strong) XPNewHomeHeadView *headView; ///分页标题 @property (nonatomic, strong) NSMutableArray *tagModelList; ///分页控件 @property (nonatomic, strong) JXCategoryTitleView *titleView; ///分页lineView @property (nonatomic, strong) JXPagerView *pagingView; @property (nonatomic,strong) HomeTagModel *recommendItem; ///解决弱网时首页底部出现一片空白bug @property (nonatomic,assign) BOOL isEmpty; @property(nonatomic,strong) XPHomeRecommendViewController * recommendVC; @property(nonatomic,assign) BOOL isCheckIp; @property(nonatomic,assign) NSInteger type; @property(nonatomic,strong) NSMutableDictionary *validListDict; @end @implementation XPNewHomeViewController -(instancetype)initWithIsEmpty:(BOOL)isEmpty{ self = [super init]; if(self){ self.isEmpty = isEmpty; } return self; } -(void)dealloc{ [[NSNotificationCenter defaultCenter]removeObserver:self]; } - (BOOL)isHiddenNavBar { return YES; } - (XPHomeContainerPresenter *)createPresenter { return [[XPHomeContainerPresenter alloc] init]; } - (void)viewDidLoad { [super viewDidLoad]; if(self.isEmpty == NO){ [self initSubViews]; [self initSubViewConstraints]; [self requestCheckIp]; // [self.presenter getHomeAllTopsData]; [self.presenter getHomeTopData]; [self.presenter getHomeTagList]; } } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.pagingView.mainTableView.mj_header beginRefreshing]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } - (void)tokenInvalid { [[AccountInfoStorage instance] saveAccountInfo:nil]; [[AccountInfoStorage instance] saveTicket:nil]; if ([NIMSDK sharedSDK].loginManager.isLogined) { [[NIMSDK sharedSDK].loginManager logout:nil]; } XPLoginViewController *lvc = [[XPLoginViewController alloc] init]; BaseNavigationController * nav = [[BaseNavigationController alloc] initWithRootViewController:lvc]; nav.modalPresentationStyle = UIModalPresentationFullScreen; kWindow.rootViewController = nav; XPAdImageTool.shareImageTool.isImLogin = NO; } #pragma mark - Private Method - (void)addTimer { // PIHomeCategoryTitleModel *tagModel = [self.tagModelList safeObjectAtIndex1:self.type]; // XPHomePartyViewController *homeVC = [self.validListDict objectForKey:[NSNumber numberWithInteger:self.type]]; // homeVC.tagModel = tagModel; } - (void)initSubViews { self.type = 0; self.view.backgroundColor = [UIColor clearColor]; // [self.view addSubview:self.backImageView]; // [self.view addSubview:self.navView]; [self.view addSubview:self.pagingView]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(openRoomNotification:) name:kOpenRoomNotification object:nil]; if([[AccountInfoStorage instance] getUid].length == 0){ return; } if([ClientConfig shareConfig].roomId != nil){ [self opRoom:[ClientConfig shareConfig].roomId]; [ClientConfig shareConfig].roomId = nil; } if([ClientConfig shareConfig].chatId != nil){ NIMSession * session = [NIMSession session:[ClientConfig shareConfig].chatId type:NIMSessionTypeP2P]; SessionViewController * sessionVC = [[SessionViewController alloc] initWithSession:session]; sessionVC.isAttention = YES; [self.navigationController pushViewController:sessionVC animated:YES]; [ClientConfig shareConfig].chatId = nil; } if([ClientConfig shareConfig].pushChatId != nil){ NIMSession * session = [NIMSession session:[ClientConfig shareConfig].pushChatId type:NIMSessionTypeP2P]; SessionViewController * sessionVC = [[SessionViewController alloc] initWithSession:session]; [self.navigationController pushViewController:sessionVC animated:YES]; [ClientConfig shareConfig].pushChatId = nil; } 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 = [DJDKMIMOMColor secondTextColor]; header.lastUpdatedTimeLabel.textColor = [DJDKMIMOMColor secondTextColor]; self.pagingView.mainTableView.mj_header = header; [ClientConfig shareConfig].inviteCode = @""; // [self.pagingView.mainTableView.mj_header beginRefreshing]; @kWeakify(self); self.recommendVC.refreshComplete = ^{ @kStrongify(self); [self.pagingView.mainTableView.mj_header endRefreshing]; }; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(homeVCRefreshComplete) name:@"khomeVCRefreshComplete" object:nil]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(logOut) name:@"kInLoginVC" object:nil]; } -(void)homeVCRefreshComplete{ [self.pagingView.mainTableView.mj_header endRefreshing]; [self.pagingView.mainTableView.mj_footer endRefreshing]; } -(void)logOut{ [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(requestCheckIp) object:nil]; } -(void)headerRefresh{ [self.presenter getHomeTopData]; [self.presenter getHomeRanks]; PIHomeCategoryTitleModel *tagModel = [self.tagModelList xpSafeObjectAtIndex:self.type]; XPHomePartyViewController *homeVC = [self.validListDict objectForKey:[NSNumber numberWithInteger:self.type]]; homeVC.tagModel = tagModel; } -(void)openRoomNotification:(NSNotification *)notification{ if([[AccountInfoStorage instance] getUid].length == 0){ return; } NSString *uid = notification.userInfo[@"uid"]; NSString *type = notification.userInfo[@"type"]; BOOL isNoAttention = [notification.userInfo[@"isNoAttention"] boolValue]; if([type isEqualToString:@"kOpenChat"]){ if (uid.length > 0) { NIMSession * session = [NIMSession session:uid type:NIMSessionTypeP2P]; SessionViewController * sessionVC = [[SessionViewController alloc] initWithSession:session]; sessionVC.isAttention = !isNoAttention; [self.navigationController pushViewController:sessionVC animated:YES]; if(isNoAttention == YES){ [ClientConfig shareConfig].pushChatId = nil; }else{ [ClientConfig shareConfig].chatId = nil; } } return; } ClientConfig *config = [ClientConfig shareConfig]; config.chatId = uid; if(uid != nil){ [self opRoom:uid]; [ClientConfig shareConfig].roomId = nil; } } - (void)initSubViewConstraints { // [self.backImageView mas_makeConstraints:^(MASConstraintMaker *make) { // make.leading.trailing.top.mas_equalTo(self.view); // make.height.mas_equalTo(kGetScaleWidth(223)); // }]; // // [self.navView mas_makeConstraints:^(MASConstraintMaker *make) { // make.leading.trailing.top.mas_equalTo(self.view); // make.height.mas_equalTo(kNavigationHeight); // }]; [self.pagingView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view).mas_offset(kGetScaleWidth(10)); make.leading.bottom.trailing.mas_equalTo(0); }]; } #pragma mark - XPNewHomeNavViewDelegate - (void)xPNewHomeNavView:(XPNewHomeNavView *)view didClickRank:(UIButton *)sender { XPWebViewController * webVC =[[XPWebViewController alloc] init]; webVC.url = URLWithType(kHomeRankURL); [self.navigationController pushViewController:webVC animated:YES]; } - (void)xPNewHomeNavView:(XPNewHomeNavView *)view didClickOpenRoom:(UIButton *)sender { NSString* roomUid = [AccountInfoStorage instance].getUid; [self opRoom:roomUid]; } -(void)opRoom:(NSString *)roomUid{ [Api getRoomInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { if(code == 401){ [self tokenInvalid]; [self showErrorToast:msg]; return; } if (code == 200) { RoomInfoModel * roomInfo = [RoomInfoModel modelWithJSON:data.data]; if (roomInfo.isReselect) { XPLittleGameRoomOpenView * roomOpenView = [[XPLittleGameRoomOpenView alloc] init]; roomOpenView.roomInfo = roomInfo; roomOpenView.currentVC = self; [TTPopup popupView:roomOpenView style:TTPopupStyleActionSheet]; } else { [XPRoomViewController openRoom:roomUid viewController:self]; } } else { [self showErrorToast:msg]; } } uid:roomUid intoUid:roomUid]; } - (void)xPNewHomeNavView:(XPNewHomeNavView *)view didClickSearch:(UIView *)sender { XPRoomSearchContainerViewController * searchVC = [[XPRoomSearchContainerViewController alloc] init]; searchVC.modalPresentationStyle = UIModalPresentationFullScreen; [self.navigationController presentViewController:searchVC animated:YES completion:nil]; } #pragma mark - XPHomeRecommendViewControllerDelegate -(void)openRoom{ NSString* roomUid = [AccountInfoStorage instance].getUid; [self opRoom:roomUid]; } #pragma mark - JXCategoryViewDelegate - (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView { if (self.headView.itemList.count == 0 && self.headView.bannerList.count == 0){ return 0; }else if (self.headView.itemList.count > 0 && self.headView.bannerList.count == 0){ return kGetScaleWidth(80); }else if (self.headView.itemList.count == 0 && self.headView.bannerList.count > 0){ return kGetScaleWidth(90); } return kGetScaleWidth(170); } - (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView { return self.headView; } - (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { return kGetScaleWidth(50); } - (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { return self.titleView; } - (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView { return self.tagModelList.count; } - (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index { id homeV = [self.validListDict objectForKey:[NSNumber numberWithInteger:index]]; if (homeV) { return homeV; } XPHomePartyViewController *homeVC = [[XPHomePartyViewController alloc] init]; homeVC.tagModel = [self.tagModelList xpSafeObjectAtIndex:index]; [self.validListDict setObject:homeVC forKey:@(index)]; return homeVC; } #pragma mark - JXCategoryListContentViewDelegate - (UIView *)listView { return self.view; } #pragma mark - JXPagerMainTableViewGestureDelegate - (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { //禁止categoryView左右滑动的时候,上下和左右都可以滚动 if (otherGestureRecognizer.view == self.pagingView.listContainerView) { return NO; } if(otherGestureRecognizer.view.tag == 9000001){ return NO; } if(otherGestureRecognizer.view.tag == 9000002){ return NO; } if(otherGestureRecognizer.view.tag == 98777){ return NO; } return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; } #pragma mark - XPHomeContainerProtocol - (void)getHomeTopDataSuccess:(NSArray*)list menuList:(NSArray *)memuList{ self.headView.itemList = memuList; self.headView.bannerList = list; [self.pagingView reloadData]; [self.pagingView resizeTableHeaderViewHeightWithAnimatable:NO duration:0 curve:0]; } - (void)getHomeTopDataSuccess:(NSArray *)resourceList banners:(NSArray *)banners rankAvatars:(NSArray *)rankAvatars { self.headView.itemList = resourceList; self.headView.bannerList = banners; self.headView.rankAvatars = rankAvatars; [self.pagingView reloadData]; [self.pagingView resizeTableHeaderViewHeightWithAnimatable:NO duration:0 curve:0]; } - (void)getHomeRanksSuccess:(NSArray *)resourceList { self.headView.rankAvatars = resourceList; } ///获取所有的tag成功 - (void)getHomeTagListSuccess:(NSArray *)array{ if(array.count == 0) { return; } NSMutableArray *list = [NSMutableArray new]; NSMutableArray *titleArray = [NSMutableArray array]; for (PIHomeCategoryTitleModel *model in array) { if (model.isHomeRecommend == YES){ [list insertObject:model atIndex:0]; [titleArray insertObject:model.name atIndex:0]; }else{ [list addObject:model]; [titleArray addObject:model.name]; } } self.tagModelList = list; self.titleView.titles = titleArray; [self.titleView reloadData]; } - (void)homeChatPickSuccess:(NSString *)uid { /// 跳聊天 NSString *sessionId = uid; NIMSession *session = [NIMSession session:sessionId type:NIMSessionTypeP2P]; SessionViewController *sessionVC = [[SessionViewController alloc] initWithSession:session]; [self.navigationController pushViewController:sessionVC animated:YES]; } - (void)homeChatPickFail:(NSString *)msg { } - (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index{ self.type = index; } #pragma mark - XPNewHomeHeadViewDelegate /// -(void)checkIpRegionSuccess:(NSInteger)seconds{ if(seconds <= 0)return; [self performSelector:@selector(requestCheckIp) withObject:nil afterDelay:seconds]; } - (void)checkIpRegionFailWithMsg:(NSString *)msg{ [self tokenInvalid]; [self showErrorToast:msg]; } -(void)requestCheckIp{ if([AccountInfoStorage instance].getTicket.length > 0 && [AccountInfoStorage instance].name.length > 0){ [self.presenter checkIpRegionAction]; } } ///选择 -(void)selectItemWithModel:(PIHomeItemModel *)model{ if (model.resourceType == HomeMenuResourceType_H5) { XPWebViewController * webVC = [[ XPWebViewController alloc] init]; webVC.url = model.resourceContent; [self.navigationController pushViewController:webVC animated:YES]; }else if (model.resourceType == HomeMenuResourceType_Match) { // 一键匹配的 [self.presenter homeChatPick]; }else { NSString * uid = [AccountInfoStorage instance].getUid; if (model.ID.length > 0 && uid.length > 0) { [Api homePickResource:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { if (code == 200) { HomeMenuSourceModel * sourceModel = [HomeMenuSourceModel modelWithDictionary:data.data]; if (sourceModel.isPick) { if (sourceModel.uid.integerValue > 0) { [XPRoomViewController openRoom:sourceModel.uid fromNick:nil fromType:UserEnterRoomFromType_Home_Recommend fromUid:nil viewController:self]; } } else { XPHomeRecommendOtherRoomView * recommendView = [[XPHomeRecommendOtherRoomView alloc] init]; recommendView.delegate = self; recommendView.roomInfo = sourceModel; [TTPopup popupView:recommendView style:TTPopupStyleAlert]; } } else { [XNDJTDDLoadingTool showErrorWithMessage:msg]; } } uid:uid rid:model.ID]; } } } -(void)selectBannerListWithModel:(HomeBannerInfoModel *)model{ switch (model.skipType) { case HomeBannerInfoSkipType_Room: { if (model.skipUri.length > 0) { [XPRoomViewController openRoom:model.skipUri viewController:self]; } } break; case HomeBannerInfoSkipType_Web: { XPWebViewController *vc = [[XPWebViewController alloc]init]; vc.url = model.skipUri; [self.navigationController pushViewController:vc animated:YES]; } break; default: break; } } ///点击了进入房间 - (void)xPHomeRecommendOtherRoomView:(XPHomeRecommendOtherRoomView *)view didClickEnterRoom:(HomeMenuSourceModel *)model{ if (model.uid.integerValue > 0) { [XPRoomViewController openRoom:model.uid fromNick:nil fromType:UserEnterRoomFromType_Home_Recommend fromUid:nil viewController:self]; } } #pragma mark - Getters And Setters - (JXCategoryTitleView *)titleView { if (!_titleView) { _titleView = [[JXCategoryTitleView alloc] initWithFrame:CGRectZero]; _titleView.delegate = self; _titleView.titles = @[]; _titleView.backgroundColor = [UIColor clearColor]; _titleView.titleColor = UIColorFromRGB(0x767585); _titleView.titleSelectedColor = UIColorFromRGB(0x1E1E1E); _titleView.titleFont = kFontBold(14); _titleView.titleSelectedFont = kFontBold(14); _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; _titleView.defaultSelectedIndex = 0; _titleView.cellSpacing = kGetScaleWidth(20); _titleView.listContainer = (id)self.pagingView.listContainerView; JXCategoryIndicatorImageView * indicator = [[JXCategoryIndicatorImageView alloc] init]; indicator.indicatorImageView.image = kImage(@"ms_login_choose_phone_icon"); indicator.indicatorImageViewSize = CGSizeMake(kGetScaleWidth(24), kGetScaleWidth(24)); indicator.verticalMargin = -kGetScaleWidth(4); indicator.contentMode = UIViewContentModeScaleAspectFit; _titleView.indicators = @[indicator]; } return _titleView; } - (NSMutableArray *)tagModelList{ if(!_tagModelList){ _tagModelList = [NSMutableArray array]; } return _tagModelList; } - (JXPagerView *)pagingView { if (!_pagingView) { _pagingView = [[JXPagerView alloc] initWithDelegate:self listContainerType:0]; _pagingView.mainTableView.gestureDelegate = self; _pagingView.backgroundColor = [UIColor clearColor]; _pagingView.listContainerView.backgroundColor = [UIColor clearColor]; _pagingView.listContainerView.listCellBackgroundColor = [UIColor clearColor]; _pagingView.mainTableView.backgroundColor = [UIColor clearColor]; } return _pagingView; } - (HomeTagModel *)recommendItem { if (!_recommendItem) { _recommendItem = [[HomeTagModel alloc] init]; _recommendItem.name = YMLocalizedString(@"XPNewHomeViewController3"); } return _recommendItem; } //- (XPNewHomeNavView *)navView { // if (!_navView) { // _navView = [[XPNewHomeNavView alloc] init]; // _navView.delegate = self; // } // return _navView; //} //- (UIImageView *)backImageView { // if (!_backImageView) { // _backImageView = [[UIImageView alloc] init]; // _backImageView.image = [UIImage imageNamed:@"home_top_bg"]; // _backImageView.layer.masksToBounds = YES; // _backImageView.contentMode = UIViewContentModeScaleAspectFill; // } // return _backImageView; //} - (XPNewHomeHeadView *)headView{ if(!_headView){ _headView = [[XPNewHomeHeadView alloc]initWithFrame:CGRectZero]; _headView.delegate = self; } return _headView; } - (XPHomeRecommendViewController *)recommendVC{ if(!_recommendVC){ _recommendVC = [[XPHomeRecommendViewController alloc] init]; _recommendVC.delegate = self; } return _recommendVC; } - (NSMutableDictionary *)validListDict{ if(!_validListDict){ _validListDict = [NSMutableDictionary dictionary]; } return _validListDict; } @end