Files
yinmeng-ios/xplan-ios/Main/Tabbar/View/TabbarViewController.m

403 lines
16 KiB
Mathematica
Raw Normal View History

2021-09-07 23:05:43 +08:00
//
// ViewController.m
// xplan-ios
//
// Created by zu on 2021/8/31.
//
#import <UIKit/UIKit.h>
///Third
#import <flutter_boost/FlutterBoost.h>
2021-10-21 12:01:21 +08:00
#import <ReactiveObjC/ReactiveObjC.h>
#import <NIMSDK/NIMSDK.h>
///Tool
#import "XPMacro.h"
#import "ThemeColor.h"
#import "UIImage+Utils.h"
2021-09-15 18:41:40 +08:00
#import "XCHUDTool.h"
2021-09-26 20:42:33 +08:00
#import "AccountInfoStorage.h"
2021-12-07 11:08:43 +08:00
#import "TTPopup.h"
#import "XPConstant.h"
#import "XPRoomMiniManager.h"
2021-12-11 16:15:40 +08:00
#import "ClientConfig.h"
#import "RtcManager.h"
#import "XCCurrentVCStackManager.h"
2022-06-02 18:53:45 +08:00
#import "Api+Home.h"
2021-10-21 12:01:21 +08:00
///Model
#import "AccountModel.h"
#import "RoomInfoModel.h"
#import "AttachmentModel.h"
#import "NobleLevelUpModel.h"
#import "XPMineVisitorUnReadModel.h"
2022-06-02 18:53:45 +08:00
#import "InviteUserInfoModel.h"
#import "NewUserGreetModel.h"
///VC
2021-09-07 23:05:43 +08:00
#import "TabbarViewController.h"
#import "BaseViewController.h"
#import "LoginViewController.h"
2021-09-14 21:01:09 +08:00
#import "BaseNavigationController.h"
#import "LoginBindPhoneViewController.h"
#import "LoginFullInfoViewController.h"
2021-09-16 17:21:52 +08:00
#import "XplanFBFlutterViewContainer.h"
2021-09-16 19:30:22 +08:00
#import "XPMineViewController.h"
2021-11-26 20:25:23 +08:00
#import "SessionListViewController.h"
2022-02-21 20:06:09 +08:00
#import "XPHomeViewController.h"
2021-12-03 17:07:21 +08:00
#import "XPMiniRoomView.h"
2021-12-07 11:08:43 +08:00
#import "XPTeenagerAlertView.h"
#import "XPRoomViewController.h"
#import "XPNobleUpgradeLevelView.h"
2022-06-02 18:53:45 +08:00
#import "XPNewUserGreetRoomAlertView.h"
///Present
2021-09-07 23:05:43 +08:00
#import "MainPresenter.h"
#import "MainProtocol.h"
#import "RoomHostDelegate.h"
2022-06-02 18:53:45 +08:00
UIKIT_EXTERN NSString * kUserCompleteInfoFinishKey;
NSString * const kUserFirstLoginKey = @"kUserFirstLoginKey";
@interface TabbarViewController () <BaseMvpProtocol, MainProtocol, NIMLoginManagerDelegate, NIMSystemNotificationManagerDelegate>
2021-09-07 23:05:43 +08:00
@property (nonatomic, strong) MainPresenter *presenter;
///
@property (nonatomic,strong) XPMiniRoomView *roomMineView;
2021-09-07 23:05:43 +08:00
@end
@implementation TabbarViewController
- (void)viewDidLoad {
[super viewDidLoad];
2021-09-07 23:05:43 +08:00
[self configTheme];
[self initTabs:NO];
2021-12-11 16:15:40 +08:00
[[ClientConfig shareConfig] clientInit];
[[NIMSDK sharedSDK].loginManager addDelegate:self];
2021-11-01 17:17:56 +08:00
[self.presenter juliandAdCallBackApi];
[self.view addSubview:self.roomMineView];
[[NSNotificationCenter defaultCenter] addObserverForName:kRoomMiniNotificationKey object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
[self configRoomMiniNView:note.userInfo];
}];
2022-06-02 18:53:45 +08:00
[[NSNotificationCenter defaultCenter] addObserverForName:kUserCompleteInfoFinishKey object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
[self completeUserInfoFinish:note.object];
}];
2021-09-07 23:05:43 +08:00
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
[self.presenter autoLogin];
if ([XPRoomMiniManager shareManager].getRoomInfo == nil) {
[self.roomMineView hiddenRoomMiniView];
}
2021-09-07 23:05:43 +08:00
}
- (MainPresenter *)presenter {
if (_presenter == nil) {
_presenter = [[MainPresenter alloc] init];
[_presenter attatchView:self];
}
return _presenter;
}
/** tokenticket
1.
2.
3. VP
*/
- (void)autoLoginSuccess {
[self.presenter loginNIM];
[self.presenter getUserInfo];
///
[self.presenter checkTranscation];
}
/// 12
/// ticket
/// BaseMvpPresenter1415
- (void)getUserInfoSuccess:(UserInfoModel *)userInfo {
if (!userInfo.isBindPhone && [ClientConfig shareConfig].iosPhoneBind) {
2021-11-30 18:28:21 +08:00
LoginBindPhoneViewController * bindPhoneVC = [[LoginBindPhoneViewController alloc] init];
BaseNavigationController * nav = [[BaseNavigationController alloc] initWithRootViewController:bindPhoneVC];
nav.modalPresentationStyle = UIModalPresentationFullScreen;
[self.navigationController presentViewController:nav animated:YES completion:nil];
return;
}
if (userInfo.nick == nil || userInfo.avatar == nil) {
[self completeUserInfo];
return;
}
[self initTabs:YES];
2022-06-02 18:53:45 +08:00
[self initQuickEnterRoom];
2021-12-07 11:08:43 +08:00
[self showTeenagerAlertView:userInfo];
[[NIMSDK sharedSDK].systemNotificationManager addDelegate:self];
}
2022-06-02 18:53:45 +08:00
- (void)checkInviteUserInfoSuccess:(InviteUserInfoModel *)inviteInfo {
if (inviteInfo && inviteInfo.isInRoom) {
[XPRoomViewController openRoom:inviteInfo.roomUid fromNick:inviteInfo.inviteNick fromType:inviteInfo.fromType fromUid:inviteInfo.inviteUid viewController:self];
} else { //
///
[self.presenter getNewUserGreetInfo];
}
}
- (void)getNewUserGreetInfoSucces:(NewUserGreetModel *)greetInfo {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:kUserFirstLoginKey];
if (greetInfo.sayHello) {
XPNewUserGreetRoomAlertView * alertView = [[XPNewUserGreetRoomAlertView alloc] init];
alertView.greetInfo = greetInfo;
alertView.currentVC = self;
TTPopupService * config = [[TTPopupService alloc] init];
config.contentView = alertView;
config.shouldDismissOnBackgroundTouch = NO;
config.maskBackgroundAlpha = 0.8;
[TTPopup popupWithConfig:config];
} else {
[self.presenter getShortCutRecommendRoom];
}
}
- (void)getShortCutRecommendRoomSuccces:(NSString *)roomUid {
if (roomUid.length > 0) {
[XPRoomViewController openRoom:roomUid viewController:self];
}
}
#pragma mark - BaseMvpProtocol
2021-09-07 23:05:43 +08:00
- (void)tokenInvalid {
LoginViewController *lvc = [[LoginViewController alloc] init];
BaseNavigationController * nav = [[BaseNavigationController alloc] initWithRootViewController:lvc];
nav.modalPresentationStyle = UIModalPresentationFullScreen;
[self.navigationController presentViewController:nav animated:YES completion:nil];
2021-09-07 23:05:43 +08:00
}
- (void)completeUserInfo {
LoginFullInfoViewController * bindPhoneVC = [[LoginFullInfoViewController alloc] init];
BaseNavigationController * nav = [[BaseNavigationController alloc] initWithRootViewController:bindPhoneVC];
nav.modalPresentationStyle = UIModalPresentationFullScreen;
[self.navigationController presentViewController:nav animated:YES completion:nil];
2021-09-14 21:01:09 +08:00
}
#pragma mark - NIMLoginManagerDelegate
- (void)onAutoLoginFailed:(NSError *)error {
// autoLogin 417
if (error.code == 417) {
@weakify(self);
AccountModel* accountModel = [AccountInfoStorage instance].getCurrentAccountInfo;
[[NIMSDK sharedSDK].loginManager login:accountModel.uid token:accountModel.netEaseToken completion:^(NSError * _Nullable error) {
if (error) {
@strongify(self);
[self.presenter logout];
}
}];
return;
}
[self.presenter logout];
2021-09-07 23:05:43 +08:00
}
- (void)onKickout:(NIMLoginKickoutResult *)result {
[XCHUDTool showErrorWithMessage:@"您已被踢下线,若非正常行为,请及时修改密码"];
UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([rootViewController presentedViewController]) { //present dismiss
[[rootViewController presentedViewController] dismissViewControllerAnimated:YES completion:^{
if ([[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController.viewControllers.count > 1) {
[[[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController popToRootViewControllerAnimated:YES];
}
if ([[UIApplication sharedApplication].delegate.window.rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabVC = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
if (tabVC.selectedViewController.navigationController) {
[tabVC.selectedViewController.navigationController popToRootViewControllerAnimated:YES];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[tabVC setSelectedIndex:0];
});
}
}];
}else { //present rootvcpush navvc pop
if ([[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController.viewControllers.count > 1) {
[[[XCCurrentVCStackManager shareManager] getCurrentVC].navigationController popToRootViewControllerAnimated:YES];
}
if ([[UIApplication sharedApplication].delegate.window.rootViewController isKindOfClass:[UITabBarController class]]) {
UITabBarController *tabVC = (UITabBarController *)[UIApplication sharedApplication].delegate.window.rootViewController;
if (tabVC.selectedViewController) {
if ([tabVC.selectedViewController isKindOfClass:[UINavigationController class]]) {
[tabVC.selectedViewController popToRootViewControllerAnimated:YES];
} else {
[tabVC.selectedViewController.navigationController popToRootViewControllerAnimated:YES];
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[tabVC setSelectedIndex:0];
});
}
}
}
if ([XPRoomMiniManager shareManager].getRoomInfo) {
[[RtcManager instance] exitRoom];
[[NIMSDK sharedSDK].chatroomManager exitChatroom:[NSString stringWithFormat:@"%ld", [XPRoomMiniManager shareManager].getRoomInfo.roomId] completion:nil];
[self.roomMineView hiddenRoomMiniView];
}
[self.presenter logout];
2021-10-21 12:01:21 +08:00
}
2021-09-07 23:05:43 +08:00
- (void)configTheme {
2021-12-17 19:31:26 +08:00
self.view.backgroundColor = [ThemeColor tabbarViewColor];
[[UITabBar appearance] setBackgroundImage:[UIImage imageWithColor:[ThemeColor tabbarViewColor] size:CGSizeMake(KScreenWidth, kTabBarHeight)]];
2021-09-07 23:05:43 +08:00
[[UITabBar appearance] setShadowImage:[[UIImage alloc]init]];
if (@available(iOS 10.0, *)) {
[[UITabBar appearance] setUnselectedItemTintColor:[ThemeColor tabbarNormalColor]];
2021-09-07 23:05:43 +08:00
}
}
- (void)initTabs:(BOOL)logined {
2022-04-26 10:16:50 +08:00
self.viewControllers = nil;
2022-05-09 22:18:42 +08:00
NSArray *normalImageNames = @[@"tab_gameHome_normal",@"tab_game_normal",@"tab_message_normal", @"tab_mine_normal"];
NSArray *selectImageNames = @[@"tab_gameHome_selected",@"tab_game_selected",@"tab_message_selected", @"tab_mine_selected"];
NSArray *tabLabel = @[@"派对",@"赛事",@"消息", @"我的"];
2021-09-07 23:05:43 +08:00
UIViewController *game;
2021-11-26 20:25:23 +08:00
UIViewController *msg;
UIViewController *me;
2021-11-29 21:40:11 +08:00
UIViewController * home;
if (logined) {
XplanFBFlutterViewContainer *fvcGame = XplanFBFlutterViewContainer.new;
#ifdef DEBUG
[fvcGame setName:@"debug" uniqueId:nil params:nil];
#else
[fvcGame setName:@"/" uniqueId:nil params:nil];
#endif
game = fvcGame;
2021-11-26 20:25:23 +08:00
msg = [[SessionListViewController alloc] init];
me = [[XPMineViewController alloc] init];
2021-11-29 21:40:11 +08:00
2022-02-21 20:06:09 +08:00
home = [[XPHomeViewController alloc] init];
} else {
game = [[BaseViewController alloc]init];
msg = [[SessionListViewController alloc]init];
me = [[BaseViewController alloc]init];
2021-11-29 21:40:11 +08:00
home = [[BaseViewController alloc] init];
}
2021-11-29 21:40:11 +08:00
[self createTabBarItem:home title:tabLabel[0] image:normalImageNames[0] selectedImage:selectImageNames[0]];
[self createTabBarItem:game title:tabLabel[1] image:normalImageNames[1] selectedImage:selectImageNames[1]];
[self createTabBarItem:msg title:tabLabel[2] image:normalImageNames[2] selectedImage:selectImageNames[2]];
[self createTabBarItem:me title:tabLabel[3] image:normalImageNames[3] selectedImage:selectImageNames[3]];
2022-05-09 22:18:42 +08:00
self.viewControllers = @[home,game,msg,me];
2021-09-18 16:04:50 +08:00
self.selectedIndex = 0;
2021-09-07 23:05:43 +08:00
}
2021-09-16 17:21:52 +08:00
- (BaseNavigationController *)createTabBarItem:(UIViewController *)itemVc title:(NSString *)title image:(NSString *)image selectedImage:(NSString *)selectedImage{
2021-09-07 23:05:43 +08:00
itemVc.title = title;
itemVc.tabBarItem.image = [[UIImage imageNamed:image] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
itemVc.tabBarItem.selectedImage = [[UIImage imageNamed:selectedImage] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
2021-12-17 19:31:26 +08:00
[itemVc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[ThemeColor mainTextColor]} forState:UIControlStateSelected];
[itemVc.tabBarItem setTitleTextAttributes:@{NSForegroundColorAttributeName:[ThemeColor tabbarNormalColor]} forState:UIControlStateNormal];
2021-09-16 17:21:52 +08:00
BaseNavigationController *nav = [[BaseNavigationController alloc] initWithRootViewController:itemVc];
return nav;
2021-09-07 23:05:43 +08:00
}
2021-09-15 18:41:40 +08:00
- (void)showSuccessToast:(NSString *)msg {
[XCHUDTool showSuccessWithMessage:msg];
2021-09-15 18:41:40 +08:00
}
- (void)showErrorToast:(NSString *)msg {
[XCHUDTool showErrorWithMessage:msg];
2021-09-15 18:41:40 +08:00
}
- (void)showLoading {
[XCHUDTool showLoading];
2021-09-15 18:41:40 +08:00
}
- (void)hideHUD {
[XCHUDTool hideHUD];
2021-09-15 18:41:40 +08:00
}
#pragma mark -
- (void)configRoomMiniNView:(NSDictionary *)dic {
UserInfoModel * userInfo = [UserInfoModel modelWithDictionary:dic[@"userInfo"]];
RoomInfoModel * roomInfo = [RoomInfoModel modelWithDictionary:dic[@"roomInfo"]];
NSMutableDictionary * microQueue = dic[@"microQueue"];
[self.roomMineView configRoomMiniView:roomInfo userInfo:userInfo micQueue:microQueue];
2021-12-03 17:07:21 +08:00
}
2021-12-07 11:08:43 +08:00
#pragma mark -
- (void)showTeenagerAlertView:(UserInfoModel *)userInfo {
if (!userInfo || userInfo.uid <=0) return; ///
if (userInfo.parentMode) return;//
NSString * teenagerKey = [NSString stringWithFormat:@"%@_%ld", kTeenagerAlertDatekey, userInfo.uid];
NSDate * oldDate = [[NSUserDefaults standardUserDefaults] objectForKey:teenagerKey];
BOOL isSameDay = [[NSCalendar currentCalendar] isDateInToday:oldDate];
if (isSameDay) return;
2021-12-08 17:29:00 +08:00
XPTeenagerAlertView * teenagerView = [[XPTeenagerAlertView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth - 45 * 2, 260)];
2021-12-07 11:08:43 +08:00
teenagerView.controller = self;
[TTPopup popupView:teenagerView style:TTPopupStyleAlert];
[[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:teenagerKey];
}
2022-06-02 18:53:45 +08:00
#pragma mark -
- (void)initQuickEnterRoom {
BOOL isNotFirstLogin = [[NSUserDefaults standardUserDefaults] boolForKey:kUserFirstLoginKey];
2022-06-07 16:16:27 +08:00
isNotFirstLogin = NO;
2022-06-02 18:53:45 +08:00
if (isNotFirstLogin) {
[self.presenter getShortCutRecommendRoom];
} else {
///
[self.presenter getNewUserGreetInfo];
}
}
/// linkedMe
- (void)completeUserInfoFinish:(NSString *)inviteCode {
if (inviteCode && inviteCode.length > 0) {
///
[self.presenter checkInviteUserInfo:inviteCode];
} else {
///
[self.presenter getNewUserGreetInfo];
}
}
#pragma mark -NIMSystemNotificationManagerDelegate
- (void)onReceiveCustomSystemNotification:(NIMCustomSystemNotification *)notification {
if (notification.receiverType == NIMSessionTypeP2P) {
if (notification.content != nil) {
NSData *jsonData = [notification.content dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
if(err) {
NSLog(@"json解析失败%@",err);
return;
}
if ([dic[@"first"] intValue] == CustomMessageType_Noble_VIP && [dic[@"second"] intValue] == Custom_Message_Sub_Noble_LevelUp_User) { //
if ([dic isKindOfClass:[NSDictionary class]]) {
[self receiveNobleLevelUp:dic];
}
} else if ([dic[@"first"] integerValue] == CustomMessageType_First_VisitorRecord){//访
AttachmentModel *attachment = [AttachmentModel modelWithJSON:notification.content];
XPMineVisitorUnReadModel *model = [XPMineVisitorUnReadModel modelWithJSON:attachment.data];
if ([model isKindOfClass:XPMineVisitorUnReadModel.class]) {
[[NSNotificationCenter defaultCenter] postNotificationName:kVisitorUnReadCountNotificationKey object:model];
}
}
}
}
}
- (void)receiveNobleLevelUp:(NSDictionary *)data {
XPNobleUpgradeLevelView *view = [[XPNobleUpgradeLevelView alloc] initWithFrame:CGRectMake(0, 0, 300, 285 + 22 + 44)];
NobleLevelUpModel *receiveInfo = [NobleLevelUpModel modelWithDictionary:data[@"data"]];
view.levelUpInfo = receiveInfo;
[TTPopup popupView:view style:TTPopupStyleAlert];
}
#pragma mark - Getters And Setters
- (XPMiniRoomView *)roomMineView {
if (!_roomMineView) {
_roomMineView = [[XPMiniRoomView alloc] init];
_roomMineView.controller = self;
_roomMineView.hidden = YES;
}
return _roomMineView;
}
2021-09-07 23:05:43 +08:00
@end