1024 lines
37 KiB
Objective-C
1024 lines
37 KiB
Objective-C
//
|
||
// RoomSideMenu.m
|
||
// YuMi
|
||
//
|
||
// Created by P on 2024/12/20.
|
||
//
|
||
|
||
#import "RoomSideMenu.h"
|
||
|
||
#import <NIMSDK/NIMSDK.h>
|
||
#import <ReactiveObjC/ReactiveObjC.h>
|
||
#import <SDCycleScrollView/SDCycleScrollView.h>
|
||
|
||
#import "Api+Room.h"
|
||
#import "Api+LittleGame.h"
|
||
|
||
#import "AttachmentModel.h"
|
||
#import "RoomBoomManager.h"
|
||
#import "RoomBoomEntryView.h"
|
||
#import "FirstRechargeModel.h"
|
||
#import "LittleGameInfoModel.h"
|
||
#import "PIRoomEnterRedPacketView.h"
|
||
|
||
#import "MSRoomGameWebVC.h"
|
||
#import "MSRoomMenuGameVC.h"
|
||
#import "RoomAnimationView.h"
|
||
#import "XPWebViewController.h"
|
||
#import "XPRoomViewController.h"
|
||
#import "PIRoomActivityWebView.h"
|
||
#import "BoomInfoViewController.h"
|
||
#import "XPSailingViewController.h"
|
||
#import "XCCurrentVCStackManager.h"
|
||
#import "XPCandyTreeViewController.h"
|
||
#import "XPArrangeMicViewController.h"
|
||
|
||
#import "RoomLuckyPackageInfoModel.h"
|
||
#import "LuckyPackageLogicManager.h"
|
||
#import "OpenLuckyPackageEntranceView.h"
|
||
|
||
|
||
static CGFloat const kMenuItemSpacing = 4.0f;
|
||
static CGFloat const kMenuItemInset = 15.0f;
|
||
static CGFloat const kExpandedHeight = 260.0f;
|
||
static CGFloat const kNormalHeight = 160.0f;
|
||
|
||
@interface RoomSideMenu ()<SDCycleScrollViewDelegate, PIRoomEnterRedPacketViewDelegate>
|
||
|
||
@property(nonatomic, strong) NSMutableArray *menuItemViews;
|
||
@property (nonatomic, strong) RACSubject *menuItemViewsSubject; // 数据源信号
|
||
|
||
///游戏菜单按钮
|
||
@property(nonatomic, strong) UIButton *gambleMenuButton;
|
||
/// 配置的入口,逻辑由 API 返回数据决定
|
||
@property(nonatomic, strong) UIButton *configEntranceMenuButton;
|
||
@property(nonatomic, strong) UIButton *pkMenuButton;
|
||
@property (nonatomic,strong) UIImageView *joinView;
|
||
@property(nonatomic,strong) PIRoomEnterRedPacketView *redPacketView;
|
||
|
||
@property(nonatomic, strong) OpenLuckyPackageEntranceView *giftEntranceButton;
|
||
|
||
@property(nonatomic, strong) UIScrollView *scrollView;
|
||
@property(nonatomic, strong) UIStackView *scrollContainStack;
|
||
@property (nonatomic,strong) SDCycleScrollView *cycleScrollView;
|
||
@property (nonatomic, weak) id<RoomHostDelegate> hostDelegate;
|
||
@property (nonatomic, strong) NSMutableArray<ActivityInfoModel *> *activityList;
|
||
@property (nonatomic, assign) BOOL isLoadActivity;
|
||
|
||
@property (nonatomic, strong) RoomBoomEntryView *boomView;
|
||
@property (nonatomic, copy) NSArray <BoomDetailModel *> *boomModels;
|
||
|
||
@property (nonatomic, strong) NetImageView *loader_url_1;
|
||
@property (nonatomic, strong) NetImageView *loader_url_2;
|
||
|
||
@property(nonatomic, strong) UIButton *expandButton;
|
||
|
||
@property(nonatomic, assign) BOOL isExpand;
|
||
|
||
@property(nonatomic, strong) RoomLuckyPackageInfoModel *luckyPackageModel;
|
||
|
||
@property(nonatomic, assign) BOOL isRequestingActivityList;
|
||
@property(nonatomic, assign) RoomType currentRoomType;
|
||
|
||
@end
|
||
|
||
@implementation RoomSideMenu
|
||
|
||
- (void)dealloc {
|
||
self.scrollView.delegate = nil;
|
||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||
[[RoomBoomManager sharedManager] removeEventListenerForTarget:self];
|
||
}
|
||
|
||
- (instancetype)initWithDelegate:(id<RoomHostDelegate>)delegate {
|
||
self = [super init];
|
||
if (self) {
|
||
self.hostDelegate = delegate;
|
||
self.menuItemViews = @[].mutableCopy;
|
||
|
||
[self setupViews];
|
||
[self setupBoomManager];
|
||
[self setupMenuItemUpdateRAC];
|
||
}
|
||
return self;
|
||
}
|
||
|
||
#pragma mark - Setup
|
||
- (void)setupViews {
|
||
[self addSubview:self.cycleScrollView];
|
||
[self addSubview:self.scrollView];
|
||
[self addSubview:self.expandButton];
|
||
|
||
[self.cycleScrollView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.leading.trailing.equalTo(self);
|
||
make.height.mas_equalTo(self.cycleScrollView.mas_width);
|
||
}];
|
||
|
||
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.mas_equalTo(self).offset(88);
|
||
make.leading.trailing.bottom.mas_equalTo(self);
|
||
}];
|
||
|
||
[self.scrollView addSubview:self.scrollContainStack];
|
||
[self.scrollContainStack mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
// make.edges.mas_equalTo(self.scrollView);
|
||
make.top.left.bottom.equalTo(self.scrollView);
|
||
make.width.equalTo(self.scrollView); // 保证宽度与 scrollView 一致
|
||
}];
|
||
|
||
[self.expandButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.bottom.mas_equalTo(self.scrollView.mas_top);
|
||
make.trailing.mas_equalTo(self.scrollView).offset(-4);
|
||
make.size.mas_equalTo(CGSizeMake(32, 32));
|
||
}];
|
||
}
|
||
|
||
- (void)setupMenuItemUpdateRAC {
|
||
self.menuItemViewsSubject = [RACSubject subject];
|
||
@kWeakify(self);
|
||
[self.menuItemViewsSubject subscribeNext:^(NSArray * _Nullable x) {
|
||
@kStrongify(self);
|
||
[self updateScrollView: x];
|
||
}];
|
||
}
|
||
|
||
- (void)setupBoomManager {
|
||
@kWeakify(self);
|
||
[[RoomBoomManager sharedManager] registerBoomProgressUpdate:^(id _Nonnull sth) {
|
||
@kStrongify(self);
|
||
if ([sth isKindOfClass:[BoomDetailModel class]]) {
|
||
self.boomView.boomModel = (BoomDetailModel *)sth;
|
||
}
|
||
} target:self];
|
||
}
|
||
|
||
- (void)updateMenuItem:(UIView *)itemView
|
||
isRemove:(BOOL)isRemove {
|
||
if (itemView.tag == 0) {
|
||
return;
|
||
}
|
||
if (isRemove) {
|
||
if (itemView.superview == nil) {
|
||
return;
|
||
}
|
||
if ([self.menuItemViews containsObject:itemView]) {
|
||
[self.menuItemViews removeObject:itemView];
|
||
}
|
||
} else {
|
||
if ([self.menuItemViews containsObject:itemView]) {
|
||
return;
|
||
}
|
||
[self.menuItemViews addObject:itemView];
|
||
}
|
||
|
||
[self.menuItemViews sortUsingComparator:^NSComparisonResult(UIView * _Nonnull obj1, UIView * _Nonnull obj2) {
|
||
if (obj1.tag < obj2.tag) {
|
||
return NSOrderedAscending;
|
||
} else if (obj1.tag > obj2.tag) {
|
||
return NSOrderedDescending;
|
||
} else {
|
||
return NSOrderedSame;
|
||
}
|
||
}];
|
||
|
||
[self.menuItemViewsSubject sendNext:self.menuItemViews];
|
||
}
|
||
|
||
#pragma mark - Methods
|
||
- (void)updateView {
|
||
if (self.isLoadActivity) {
|
||
[self configLittleGameActivity];
|
||
} else {
|
||
if (!self.isRequestingActivityList) {
|
||
[self requestActivityList];
|
||
}
|
||
}
|
||
}
|
||
|
||
- (void)displayForMiniGame {
|
||
self.cycleScrollView.hidden = NO;
|
||
self.expandButton.hidden = YES;
|
||
self.scrollView.hidden = YES;
|
||
}
|
||
|
||
- (void)displayExpandButton:(BOOL)displayButton {
|
||
self.expandButton.hidden = !displayButton;
|
||
}
|
||
|
||
- (void)updateForBoomDetailArray:(NSArray <BoomDetailModel*> *)models {
|
||
_boomModels = models;
|
||
if (!models || ![models isKindOfClass:[NSArray class]] || models.count == 0) {
|
||
return;
|
||
}
|
||
|
||
BOOL hasBoom = NO;
|
||
for (BoomDetailModel *boom in models) {
|
||
if (boom.currLevel == 1) {
|
||
hasBoom = YES;
|
||
self.boomView.boomModel = boom;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (!hasBoom) {
|
||
// 处理到顶级后可能找不到数据的异常
|
||
self.boomView.boomModel = [models lastObject];
|
||
}
|
||
if ((self.isExpand && self.expandButton.hidden == NO) || self.expandButton.hidden) {
|
||
[self updateMenuItem:self.boomView isRemove:NO];
|
||
self.boomView.hidden = NO;
|
||
}
|
||
}
|
||
|
||
- (void)updateScrollView:(NSArray *)data {
|
||
// 清除 stackView 现有的所有子视图
|
||
for (UIView *view in self.scrollContainStack.arrangedSubviews) {
|
||
[self.scrollContainStack removeArrangedSubview:view];
|
||
[view removeFromSuperview];
|
||
}
|
||
|
||
// 如果数据为空,直接返回
|
||
if (data.count == 0) {
|
||
return;
|
||
}
|
||
|
||
NSArray *reverseData = [data reverseObjectEnumerator].allObjects;
|
||
NSInteger count = data.count;
|
||
|
||
NSMutableArray *dataItems = @[].mutableCopy;
|
||
switch (self.currentRoomType) {
|
||
case RoomType_Room:
|
||
case RoomType_10Mic:
|
||
case RoomType_15Mic:
|
||
if (iPhoneXSeries) {
|
||
for (NSInteger i=count; i<5; i++) {
|
||
UIView *emptyView = [[UIView alloc] init];
|
||
[dataItems addObject:emptyView];
|
||
}
|
||
}
|
||
break;
|
||
case RoomType_MiniGame:
|
||
break;
|
||
default:
|
||
if (self.isExpand && iPhoneXSeries) {
|
||
UIView *emptyView = [[UIView alloc] init];
|
||
[dataItems addObject:emptyView];
|
||
}
|
||
break;
|
||
}
|
||
|
||
[dataItems addObjectsFromArray:reverseData];
|
||
data = dataItems.copy;
|
||
|
||
// 添加新的菜单项视图到 stackView 中
|
||
CGFloat offsetY = -(self.scrollView.bounds.size.width - 30);
|
||
for (UIView *view in data) {
|
||
[self.scrollContainStack addArrangedSubview:view];
|
||
// 如果需要固定每个菜单项的高度,可以为每个 view 添加高度约束
|
||
[view mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.height.mas_equalTo(self.scrollView.bounds.size.width - 30);
|
||
}];
|
||
if (data.count > 1) {
|
||
offsetY += self.scrollView.bounds.size.width - 30;
|
||
}
|
||
}
|
||
|
||
// 注意:使用 UIStackView 后,无需手动计算 contentSize,
|
||
// 系统会根据 stackView 的内容自动更新 scrollView 的滚动范围。
|
||
[self setNeedsLayout];
|
||
[self layoutIfNeeded];
|
||
dispatch_async(dispatch_get_main_queue(), ^{
|
||
if (self.scrollView.contentSize.height > self.scrollView.bounds.size.height) {
|
||
[self.scrollView setContentOffset:CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height) animated:NO];
|
||
}
|
||
});
|
||
}
|
||
|
||
- (void)configLittleGameActivity {
|
||
[self updateCycleView];
|
||
}
|
||
|
||
- (void)requestActivityList {
|
||
self.isRequestingActivityList = YES;
|
||
|
||
RACSubject* playRAC = [RACSubject subject];
|
||
RACSubject* activityRAC = [RACSubject subject];
|
||
RACSubject* littleGameRAC = [RACSubject subject];
|
||
|
||
@kWeakify(self);
|
||
[[RACSignal combineLatest:@[playRAC,
|
||
activityRAC,
|
||
littleGameRAC]
|
||
reduce:^id(NSArray<ActivityInfoModel*> *playModels,
|
||
NSArray <ActivityInfoModel *>*activityModels,
|
||
NSArray<LittleGameInfoModel*> *littleGameModels){
|
||
@kStrongify(self);
|
||
self.playList = [NSMutableArray arrayWithArray:playModels];
|
||
self.activityList = [NSMutableArray arrayWithArray:activityModels];
|
||
self.littleGameList = [NSMutableArray arrayWithArray:littleGameModels];
|
||
self.isRequestingActivityList = NO;
|
||
[self onRoomUpdate];
|
||
return nil;
|
||
}] subscribeError:^(NSError * _Nullable error) {
|
||
[XNDJTDDLoadingTool showErrorWithMessage:error.domain];
|
||
}];
|
||
|
||
[self loadGames:playRAC];
|
||
[self loadActivities:activityRAC];
|
||
[self loadLittleGames:littleGameRAC];
|
||
|
||
[self requestLuckyPackage];
|
||
}
|
||
|
||
- (void)loadGames:(RACSubject *)racSubject {
|
||
RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo;
|
||
NSString * roomId = [NSString stringWithFormat:@"%ld", roomInfo.uid];
|
||
[Api getPlayList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
if (code == 200) {
|
||
NSArray <ActivityInfoModel *>* array = [ActivityInfoModel modelsWithArray:data.data];
|
||
[racSubject sendNext:array];
|
||
[racSubject sendCompleted];
|
||
} else {
|
||
[racSubject sendError:[NSError errorWithDomain:[NSString isEmpty:msg] ? @"" : msg code:code userInfo:nil]];
|
||
}
|
||
} roomId:roomId];
|
||
}
|
||
|
||
- (void)loadActivities:(RACSubject *)racSubject {
|
||
RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo;
|
||
NSString * roomId = [NSString stringWithFormat:@"%ld", roomInfo.uid];
|
||
[Api roomActivityList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
if (code == 200) {
|
||
NSArray <ActivityInfoModel *>* array = [ActivityInfoModel modelsWithArray:data.data];
|
||
[racSubject sendNext:array];
|
||
[racSubject sendCompleted];
|
||
} else {
|
||
[racSubject sendError:[NSError errorWithDomain:[NSString isEmpty:msg] ? @"" : msg code:code userInfo:nil]];
|
||
}
|
||
} roomId:roomId];
|
||
}
|
||
|
||
- (void)loadLittleGames:(RACSubject *)racSubject {
|
||
RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo;
|
||
NSString * roomUid = [NSString stringWithFormat:@"%ld", roomInfo.uid];
|
||
[Api getLittleGameList:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||
if (code == 200) {
|
||
NSArray * array = [LittleGameInfoModel modelsWithArray:data.data];
|
||
[racSubject sendNext:array];
|
||
[racSubject sendCompleted];
|
||
} else {
|
||
[racSubject sendError:[NSError errorWithDomain:[NSString isEmpty:msg] ? @"" : msg code:code userInfo:nil]];
|
||
}
|
||
}
|
||
roomUid:roomUid];
|
||
}
|
||
|
||
- (void)requestLuckyPackage {
|
||
@kWeakify(self);
|
||
[[LuckyPackageLogicManager sharedInstance] requestRoomLuckyPackageAPI:self.hostDelegate.getRoomInfo.uid success:^(RoomLuckyPackageInfoModel * _Nonnull model) {
|
||
@kStrongify(self);
|
||
self.luckyPackageModel = model;
|
||
[self.giftEntranceButton updateEntrance:model];
|
||
[self loadLuckyPackage];
|
||
}];
|
||
|
||
[[LuckyPackageLogicManager sharedInstance] registerLuckyPackageUpdate:^(RoomLuckyPackageInfoModel * _Nullable model) {
|
||
@kStrongify(self);
|
||
self.luckyPackageModel = model;
|
||
[self.giftEntranceButton updateEntrance:model];
|
||
[self loadLuckyPackage];
|
||
}];
|
||
}
|
||
|
||
-(void)dealWithData{
|
||
self.isLoadActivity = YES;
|
||
self.cycleScrollView.hidden = NO;
|
||
|
||
if (self.playList.count > 0 || self.littleGameList.count >0) {
|
||
[self updateMenuItem:self.gambleMenuButton isRemove:NO];
|
||
}
|
||
|
||
if (self.hostDelegate.getRoomInfo.type == RoomType_MiniGame) {
|
||
[self configLittleGameActivity];
|
||
} else {
|
||
[self updateCycleView];
|
||
}
|
||
}
|
||
|
||
- (void)updateConfigEntranceButtons:(RoomInfoModel *)roomInfo {
|
||
RoomBottomEntranceModel *model = roomInfo.rightBottomIconConfig;
|
||
if (!model) {
|
||
return;
|
||
}
|
||
|
||
@kWeakify(self);
|
||
if (![NSString isEmpty:model.icon2Url]) {
|
||
[self.loader_url_2 loadImageWithUrl:model.icon2Url
|
||
completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) {
|
||
@kStrongify(self);
|
||
[self.gambleMenuButton setImage:image
|
||
forState:UIControlStateNormal];
|
||
}];
|
||
}
|
||
|
||
if (![NSString isEmpty:model.icon1Url]) {
|
||
[self.loader_url_1 loadImageWithUrl:model.icon1Url
|
||
completion:^(UIImage * _Nullable image, NSURL * _Nonnull url) {
|
||
@kStrongify(self);
|
||
[self.configEntranceMenuButton setImage:image
|
||
forState:UIControlStateNormal];
|
||
[self updateMenuItem:self.configEntranceMenuButton isRemove:NO];
|
||
}];
|
||
} else {
|
||
if (_configEntranceMenuButton) {
|
||
[self updateMenuItem:self.configEntranceMenuButton isRemove:NO];
|
||
}
|
||
}
|
||
}
|
||
|
||
- (void)updateCycleView {
|
||
NSMutableArray *picArray = [NSMutableArray array];
|
||
for (ActivityInfoModel *model in self.activityList) {
|
||
[picArray addObject:model.icon ?: @""];
|
||
}
|
||
|
||
self.cycleScrollView.imageURLStringsGroup = picArray;
|
||
if (picArray.count > 1) {
|
||
[self.cycleScrollView setAutoScroll:YES];
|
||
self.cycleScrollView.autoScrollTimeInterval = 3;
|
||
} else {
|
||
[self.cycleScrollView setAutoScroll:NO];
|
||
}
|
||
}
|
||
|
||
- (void)openURL:(NSString *)urlString {
|
||
RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo;
|
||
XPWebViewController *vc = [[XPWebViewController alloc] initWithRoomUID:@(roomInfo.uid).stringValue];
|
||
vc.url = urlString;
|
||
[self.hostDelegate.getCurrentNav pushViewController:vc animated:YES];
|
||
}
|
||
|
||
- (void)openBaiShunGame:(RoomBottomEntranceModel *)model {
|
||
if ([self.hostDelegate isKindOfClass:[XPRoomViewController class]]){
|
||
ActivityInfoModel *activityModel = [[ActivityInfoModel alloc] init];
|
||
activityModel.skipContent = model.skipUrl;
|
||
activityModel.skipType = ActivitySkipType_Web;
|
||
activityModel.showType = 1;
|
||
activityModel.code = @"BAISHUN";
|
||
activityModel.ruleValue = model.reserve;
|
||
if (activityModel.gameModel) {
|
||
MSRoomGameWebVC *vc = [[MSRoomGameWebVC alloc] initWithDelegate:self.hostDelegate
|
||
gameModel:activityModel];
|
||
vc.view.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
|
||
XPRoomViewController *roomVC = (XPRoomViewController *)self.hostDelegate;
|
||
[roomVC addChildViewController:vc];
|
||
RoomAnimationView *animationView;
|
||
for (id obj in self.hostDelegate.getSuperView.subviews) {
|
||
if ([obj isKindOfClass:[RoomAnimationView class]]){
|
||
animationView = obj;
|
||
break;
|
||
}
|
||
}
|
||
[self.hostDelegate.getSuperView addSubview:vc.view];
|
||
vc.view.tag = 913;
|
||
}
|
||
}
|
||
}
|
||
|
||
- (void)setRedPacketList:(NSMutableArray *)redPacketList{
|
||
_redPacketList = redPacketList;
|
||
self.redPacketView.redPacketList = redPacketList;
|
||
if(self.openRedPacketHandle){
|
||
self.openRedPacketHandle(nil,self.hostDelegate.getRoomInfo.type,YES);
|
||
}
|
||
if (self.redPacketList.count > 0) {
|
||
[self updateMenuItem:self.redPacketView isRemove:NO];
|
||
}
|
||
}
|
||
|
||
#pragma mark - User Response
|
||
- (void)displayBoomInfoProgress {
|
||
BoomInfoViewController *vc = [[BoomInfoViewController alloc] init];
|
||
vc.roomUid = self.hostDelegate.getRoomInfo.uid;
|
||
vc.partitionId = self.hostDelegate.getUserInfo.partitionId;
|
||
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
|
||
[self.hostDelegate.getCurrentNav presentViewController:vc animated:YES completion:nil];
|
||
|
||
@kWeakify(self);
|
||
[vc setShowGiftPanel:^{
|
||
@kStrongify(self);
|
||
if (self.showSendGiftView) {
|
||
self.showSendGiftView();
|
||
}
|
||
}];
|
||
}
|
||
|
||
- (void)didTapGameMenuButton {
|
||
MSRoomMenuGameVC *vc = [[MSRoomMenuGameVC alloc] initWithDelegate:self.hostDelegate roomMenuType:MSRoomMenuTypeGame];
|
||
vc.modalPresentationStyle = UIModalPresentationOverFullScreen;
|
||
[self.hostDelegate.getCurrentNav presentViewController:vc animated:YES completion:nil];
|
||
@kWeakify(self);
|
||
[vc setUpdatePlayListAndGameList:^(NSArray * _Nonnull playList, NSArray * _Nonnull gameList) {
|
||
@kStrongify(self);
|
||
self.playList = playList.mutableCopy;
|
||
self.littleGameList = gameList.mutableCopy;
|
||
}];
|
||
}
|
||
|
||
- (void)didTapConfigEntranceButton {
|
||
RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo;
|
||
RoomBottomEntranceModel *model = roomInfo.rightBottomIconConfig;
|
||
|
||
if (!model || model.skipUrl.length == 0) {
|
||
return;
|
||
}
|
||
|
||
switch (model.skipType) {
|
||
case 1:
|
||
[self openURL:model.skipUrl];
|
||
break;
|
||
case 2:
|
||
[self openBaiShunGame:model];
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
- (void)didTapPKMenuButton {
|
||
[self.hostDelegate showPKPanel];
|
||
}
|
||
|
||
- (void)didTapJoinDatingRecognizer {
|
||
if (self.hostDelegate.getRoomInfo.roomModeType == RoomModeType_Open_PK_Mode && self.hostDelegate.isRoomPKPlaying) {
|
||
[XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"XPRoomActivityContainerView2")];
|
||
return;
|
||
}
|
||
NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init];
|
||
request.roomId = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.roomId];
|
||
request.userIds = @[[AccountInfoStorage instance].getUid];
|
||
@kWeakify(self);
|
||
[[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray<NIMChatroomMember *> * _Nullable members) {
|
||
@kStrongify(self);
|
||
NIMChatroomMember * member;
|
||
if (error == nil) {
|
||
member = members.firstObject;
|
||
}
|
||
RoomInfoModel * roomInfo = self.hostDelegate.getRoomInfo;
|
||
XPArrangeMicInfoModel * info = [[XPArrangeMicInfoModel alloc] init];
|
||
info.roomUid = [NSString stringWithFormat:@"%ld", roomInfo.uid];
|
||
info.roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId];
|
||
info.nick = roomInfo.nick;
|
||
info.roomAvatar = roomInfo.avatar;
|
||
info.roomTitle = roomInfo.title;
|
||
info.micQueue = [self.hostDelegate getMicroQueue];
|
||
info.isManager = (member.type == NIMChatroomMemberTypeCreator || member.type == NIMChatroomMemberTypeManager);
|
||
info.type = roomInfo.roomModeType == RoomModeType_Open_Blind ? ArrangeMicType_Dating : roomInfo.roomModeType == RoomModeType_Open_PK_Mode ? ArrangeMicType_Room_PK : ArrangeMicType_Normal;
|
||
XPArrangeMicViewController * arrangeMicVC = [[XPArrangeMicViewController alloc] initWithInfo:info];
|
||
[self.hostDelegate.getCurrentNav presentViewController:arrangeMicVC animated:YES completion:nil];
|
||
}];
|
||
}
|
||
|
||
- (void)didTapGiftEntrance {
|
||
|
||
}
|
||
|
||
- (void)didTapExpand {
|
||
self.isExpand = !self.isExpand;
|
||
|
||
if (self.isExpand) {
|
||
[self.expandButton setImage:kImage(@"side_menu_close") forState:UIControlStateNormal];
|
||
[self mas_updateConstraints:^(MASConstraintMaker *make) {
|
||
make.height.mas_equalTo(kGetScaleWidth(kExpandedHeight));
|
||
}];
|
||
} else {
|
||
[self.expandButton setImage:kImage(@"side_menu_open") forState:UIControlStateNormal];
|
||
[self mas_updateConstraints:^(MASConstraintMaker *make) {
|
||
make.height.mas_equalTo(kGetScaleWidth(kNormalHeight));
|
||
}];
|
||
}
|
||
|
||
[self layoutIfNeeded];
|
||
[self setNeedsLayout];
|
||
[self onRoomUpdate];
|
||
}
|
||
|
||
#pragma mark - Room Delegate
|
||
- (void)onRoomEntered {
|
||
|
||
}
|
||
|
||
- (void)onRoomMiniEntered {
|
||
[self onRoomUpdate];
|
||
}
|
||
|
||
- (void)onRoomUpdate {
|
||
RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo;
|
||
|
||
[self.menuItemViews removeAllObjects];
|
||
|
||
self.currentRoomType = roomInfo.type;
|
||
|
||
switch (roomInfo.type) {
|
||
case RoomType_MiniGame:
|
||
[self displayForMiniGame];
|
||
[self updateCycleView];
|
||
break;
|
||
case RoomType_19Mic:
|
||
case RoomType_20Mic: {
|
||
[self displayExpandButton:YES];
|
||
[self dealWithData];
|
||
[self handleBoomItem];
|
||
if (self.isExpand) {
|
||
[self loadPKView:roomInfo];
|
||
[self loadJoinView:roomInfo];
|
||
[self updateConfigEntranceButtons:roomInfo];
|
||
[self loadLuckyPackage];
|
||
}
|
||
self.scrollView.hidden = NO;
|
||
self.cycleScrollView.hidden = YES;
|
||
}
|
||
break;
|
||
default: {
|
||
[self displayExpandButton:NO];
|
||
|
||
[self dealWithData];
|
||
[self loadLuckyPackage];
|
||
[self loadPKView:roomInfo];
|
||
[self loadJoinView:roomInfo];
|
||
[self loadRedPacket:roomInfo];
|
||
[self updateConfigEntranceButtons:roomInfo];
|
||
[self handleBoomItem];
|
||
|
||
self.scrollView.hidden = NO;
|
||
self.cycleScrollView.hidden = NO;
|
||
}
|
||
break;
|
||
}
|
||
|
||
if(self.openRedPacketHandle){
|
||
self.openRedPacketHandle(nil,self.hostDelegate.getRoomInfo.type,YES);
|
||
}
|
||
if (self.menuItemViews.count == 0) {
|
||
[self displayExpandButton:NO];
|
||
}
|
||
self.scrollView.hidden = (self.menuItemViews.count == 0);
|
||
}
|
||
|
||
- (void)handleBoomItem {
|
||
if (self.boomModels.count > 0) {
|
||
[self updateMenuItem:self.boomView isRemove:NO];
|
||
self.boomView.hidden = NO;
|
||
} else {
|
||
self.boomView.hidden = YES;
|
||
[self updateMenuItem:self.boomView isRemove:YES];
|
||
}
|
||
}
|
||
|
||
- (void)loadRedPacket:(RoomInfoModel *)roomInfo {
|
||
if (self.redPacketList.count > 0) {
|
||
self.redPacketView.type = roomInfo.type;
|
||
self.redPacketView.redPacketList = self.redPacketList;
|
||
[self updateMenuItem:self.redPacketView isRemove:NO];
|
||
}
|
||
}
|
||
|
||
- (void)loadLuckyPackage {
|
||
if (self.luckyPackageModel) {
|
||
[self updateMenuItem:self.giftEntranceButton isRemove:self.luckyPackageModel.redEnvelopeListVoList.count == 0];
|
||
}
|
||
}
|
||
|
||
- (void)loadPKView:(RoomInfoModel *)roomInfo {
|
||
if (roomInfo.type == RoomType_Anchor || roomInfo.roomModeType == RoomModeType_Open_Blind) {
|
||
[self updateMenuItem:self.pkMenuButton isRemove:YES];
|
||
} else {
|
||
if (roomInfo.roomModeType == RoomModeType_Open_PK_Mode) {
|
||
[self updateMenuItem:self.pkMenuButton isRemove:NO];
|
||
} else {
|
||
[self updateMenuItem:self.pkMenuButton isRemove:YES];
|
||
}
|
||
}
|
||
}
|
||
|
||
- (void)loadJoinView:(RoomInfoModel *)roomInfo {
|
||
if (roomInfo.roomModeType == RoomModeType_Open_Blind ||
|
||
roomInfo.roomModeType == RoomModeType_Open_PK_Mode ||
|
||
roomInfo.roomModeType == RoomModeType_Open_Micro_Mode) {
|
||
if (roomInfo.roomModeType == RoomModeType_Open_PK_Mode ) {
|
||
self.joinView.image = [UIImage getLanguageImage:@"room_pk_normal_member_enter"];
|
||
} else {
|
||
self.joinView.image = [UIImage getLanguageImage:@"room_mode_dating_enter"];
|
||
}
|
||
NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init];
|
||
request.roomId = [NSString stringWithFormat:@"%ld", roomInfo.roomId];
|
||
request.userIds = @[[AccountInfoStorage instance].getUid];
|
||
@kWeakify(self);
|
||
[[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray<NIMChatroomMember *> * _Nullable members) {
|
||
@kStrongify(self);
|
||
if (error == nil) {
|
||
NIMChatroomMember * member = members.firstObject;
|
||
if (member.type == NIMTeamMemberTypeOwner || member.type == NIMTeamMemberTypeManager) {
|
||
[self updateMenuItem:self.joinView isRemove:YES];
|
||
return;
|
||
}
|
||
}
|
||
[self updateMenuItem:self.joinView isRemove:NO];
|
||
}];
|
||
} else {
|
||
[self updateMenuItem:self.joinView isRemove:YES];
|
||
}
|
||
}
|
||
|
||
- (void)handleNIMCustomMessage:(NIMMessage *)message {
|
||
NIMCustomObject *obj = (NIMCustomObject *)message.messageObject;
|
||
if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) {
|
||
AttachmentModel *attachment = (AttachmentModel *)obj.attachment;
|
||
switch (attachment.first) {
|
||
case CustomMessageType_First_Recharge_Reward: {
|
||
if (attachment.second == Custom_Message_Sub_Room_First_Recharge_Reward) {
|
||
}
|
||
}
|
||
break;
|
||
case CustomMessageType_RedPacket: {
|
||
if (attachment.second == Custom_Message_Sub_LuckyPackage) {
|
||
[[LuckyPackageLogicManager sharedInstance] receiveNewPostLuckyPackage:attachment];
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
- (void)handleNIMTextMessage:(NIMMessage *)message {
|
||
|
||
}
|
||
|
||
- (void)handleNIMNotificationMessage:(NIMMessage *)message {
|
||
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
|
||
NIMChatroomNotificationContent *content = (NIMChatroomNotificationContent *)notiMsg.content;
|
||
switch (content.eventType) {
|
||
case NIMChatroomEventTypeAddManager:
|
||
{
|
||
if (self.hostDelegate.getRoomInfo.roomModeType == RoomModeType_Open_Blind || self.hostDelegate.getRoomInfo.roomModeType == RoomModeType_Open_PK_Mode) {
|
||
for (NIMChatroomNotificationMember * member in content.targets) {
|
||
if (member.userId.intValue == [AccountInfoStorage instance].getUid.integerValue) {
|
||
[self updateMenuItem:self.joinView isRemove:YES];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case NIMChatroomEventTypeRemoveManager:
|
||
{
|
||
if (self.hostDelegate.getRoomInfo.roomModeType == RoomModeType_Open_Blind || self.hostDelegate.getRoomInfo.roomModeType == RoomModeType_Open_PK_Mode) {
|
||
for (NIMChatroomNotificationMember * member in content.targets) {
|
||
if (member.userId.intValue == [AccountInfoStorage instance].getUid.integerValue) {
|
||
[self updateMenuItem:self.joinView isRemove:NO];
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
#pragma mark- PIRoomEnterRedPacketViewDelegate
|
||
-(void)openRedPacketWithModel:(XPRedPacketModel *)redModel{
|
||
if(self.openRedPacketHandle){
|
||
self.openRedPacketHandle(redModel,self.hostDelegate.getRoomInfo.type,NO);
|
||
}
|
||
}
|
||
|
||
#pragma mark - SDCycleScrollViewDelegate
|
||
- (void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didSelectItemAtIndex:(NSInteger)index {
|
||
NSArray *imageUrlList = cycleScrollView.imageURLStringsGroup;
|
||
|
||
if (self.hostDelegate.getRoomInfo.type == RoomType_MiniGame) {
|
||
[self jumpPlayActionWithIndex:index imageUrlList:imageUrlList];
|
||
return;
|
||
}
|
||
|
||
NSString *picUrl = [imageUrlList xpSafeObjectAtIndex:index];
|
||
if ([NSString isEmpty:picUrl]) {
|
||
return;
|
||
}
|
||
|
||
NSMutableArray *infoList = @[].mutableCopy;
|
||
ActivityInfoModel * info;
|
||
for (ActivityInfoModel * getInfo in self.activityList) {
|
||
if([getInfo.icon isEqualToString:picUrl]){
|
||
info = getInfo;
|
||
}
|
||
if(getInfo.skipType == ActivitySkipType_Web){
|
||
[infoList addObject:getInfo];
|
||
}
|
||
}
|
||
if (info == nil) {
|
||
return;
|
||
}
|
||
|
||
if ([info.code isEqualToString:@"FIRST_CHARGE"]) {
|
||
[self firstRechargeTapRecognizer];
|
||
} else if ([info.code isEqualToString:@"FIND_LOVE"]) {
|
||
[self lookLoveTapRecognizer];
|
||
} else if ([info.code isEqualToString:@"NAUTICAL_ADVENTURE"]) {
|
||
[self sailTapRecognizer];
|
||
} else {
|
||
if (info.skipType == ActivitySkipType_Room) {
|
||
[self.hostDelegate exitRoom];
|
||
[XPRoomViewController openRoom:info.skipContent viewController:kWindow.rootViewController];
|
||
} else if(info.skipType == ActivitySkipType_Web) {
|
||
PIRoomActivityWebView * webView = [[PIRoomActivityWebView alloc]initWithFrame:CGRectMake(0, KScreenHeight, KScreenWidth, KScreenHeight)];
|
||
webView.roomUid = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid];
|
||
webView.url = info.skipContent;
|
||
webView.infoList = infoList;
|
||
[kWindow addSubview:webView];
|
||
[UIView animateWithDuration:0.2 animations:^{
|
||
webView.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
|
||
}];
|
||
}
|
||
}
|
||
}
|
||
|
||
-(void)jumpPlayActionWithIndex:(NSInteger)index imageUrlList:(NSArray *)imageUrlList {
|
||
|
||
}
|
||
|
||
- (void)firstRechargeTapRecognizer {
|
||
|
||
}
|
||
|
||
- (void)lookLoveTapRecognizer {
|
||
XPCandyTreeViewController * candyTreeVC = [[XPCandyTreeViewController alloc] initWithDelegate:self.hostDelegate];
|
||
candyTreeVC.view.frame = CGRectMake(0, KScreenHeight, KScreenWidth, KScreenHeight);
|
||
[[XCCurrentVCStackManager shareManager].getCurrentVC.view addSubview:candyTreeVC.view];
|
||
[[XCCurrentVCStackManager shareManager].getCurrentVC addChildViewController:candyTreeVC];
|
||
[candyTreeVC.navigationController setNavigationBarHidden:YES animated:NO];
|
||
[UIView animateWithDuration:0.1 animations:^{
|
||
candyTreeVC.view.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
|
||
}completion:^(BOOL finished) {
|
||
|
||
}];
|
||
}
|
||
|
||
- (void)sailTapRecognizer {
|
||
NSString * roomUid = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid];
|
||
XPSailingViewController * sailingVC = [[XPSailingViewController alloc] initWithRoomUid:roomUid];
|
||
[self.hostDelegate.getCurrentNav presentViewController:sailingVC animated:YES completion:nil];
|
||
}
|
||
|
||
|
||
#pragma mark - Getters
|
||
- (UIScrollView *)scrollView {
|
||
if (!_scrollView) {
|
||
_scrollView = [[UIScrollView alloc] init];
|
||
}
|
||
return _scrollView;
|
||
}
|
||
|
||
- (UIStackView *)scrollContainStack {
|
||
if (!_scrollContainStack) {
|
||
_scrollContainStack = [[UIStackView alloc] init];
|
||
_scrollContainStack.axis = UILayoutConstraintAxisVertical;
|
||
_scrollContainStack.alignment = UIStackViewAlignmentFill;
|
||
_scrollContainStack.distribution = UIStackViewDistributionEqualSpacing;
|
||
_scrollContainStack.spacing = kMenuItemSpacing;
|
||
}
|
||
return _scrollContainStack;
|
||
}
|
||
|
||
- (UIButton *)gambleMenuButton {
|
||
if (!_gambleMenuButton) {
|
||
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
[b setImage:[UIImage imageNamed:@"ms_room_game_button"] forState:UIControlStateNormal];
|
||
[b addTarget:self action:@selector(didTapGameMenuButton) forControlEvents:UIControlEventTouchUpInside];
|
||
b.imageView.contentMode = UIViewContentModeScaleAspectFit;
|
||
b.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
|
||
b.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
|
||
b.tag = 101;
|
||
_gambleMenuButton = b;
|
||
}
|
||
return _gambleMenuButton;
|
||
}
|
||
|
||
- (UIButton *)configEntranceMenuButton {
|
||
if (!_configEntranceMenuButton) {
|
||
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
[b setImage:[UIImage imageNamed:@"ms_room_game_add_coin"] forState:UIControlStateNormal];
|
||
[b addTarget:self action:@selector(didTapConfigEntranceButton) forControlEvents:UIControlEventTouchUpInside];
|
||
b.imageView.contentMode = UIViewContentModeScaleAspectFit;
|
||
b.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
|
||
b.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
|
||
b.tag = 102;
|
||
_configEntranceMenuButton = b;
|
||
}
|
||
return _configEntranceMenuButton;
|
||
}
|
||
|
||
- (UIButton *)pkMenuButton {
|
||
if (!_pkMenuButton) {
|
||
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
[b setBackgroundImage:[UIImage imageNamed:@"room_pk_panel_mini_icon"] forState:UIControlStateNormal];
|
||
[b addTarget:self action:@selector(didTapPKMenuButton) forControlEvents:UIControlEventTouchUpInside];
|
||
b.imageEdgeInsets = UIEdgeInsetsMake(kMenuItemSpacing, kMenuItemSpacing, kMenuItemSpacing, kMenuItemSpacing);
|
||
b.tag = 105;
|
||
_pkMenuButton = b;
|
||
}
|
||
return _pkMenuButton;
|
||
}
|
||
|
||
- (SDCycleScrollView *)cycleScrollView {
|
||
if (!_cycleScrollView) {
|
||
_cycleScrollView = [SDCycleScrollView cycleScrollViewWithFrame:CGRectZero delegate:self placeholderImage:nil];
|
||
_cycleScrollView.backgroundColor = [UIColor purpleColor];
|
||
_cycleScrollView.pageControlAliment = SDCycleScrollViewPageContolAlimentCenter;
|
||
_cycleScrollView.currentPageDotColor = [UIColor whiteColor];
|
||
_cycleScrollView.pageDotColor = [UIColor colorWithWhite:1 alpha:0.2];
|
||
_cycleScrollView.pageControlDotSize = CGSizeMake(5, 2);
|
||
_cycleScrollView.pageControlStyle = SDCycleScrollViewPageContolStyleClassic;
|
||
_cycleScrollView.currentPageDotImage = [UIImage imageNamed:@"room_activity_banner_select"];
|
||
_cycleScrollView.pageDotImage = [UIImage imageNamed:@"room_activity_banner_normal"];
|
||
_cycleScrollView.backgroundColor = [UIColor colorWithWhite:1 alpha:0.00];
|
||
_cycleScrollView.bannerImageViewContentMode = UIViewContentModeScaleAspectFit;
|
||
_cycleScrollView.pageControlBottomOffset = -10;
|
||
_cycleScrollView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight;
|
||
}
|
||
return _cycleScrollView;
|
||
}
|
||
|
||
- (RoomBoomEntryView *)boomView {
|
||
if (!_boomView) {
|
||
_boomView = [[RoomBoomEntryView alloc] init];
|
||
_boomView.userInteractionEnabled = YES;
|
||
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(displayBoomInfoProgress)];
|
||
[_boomView addGestureRecognizer:tap];
|
||
_boomView.tag = 103;
|
||
_boomView.hidden = YES;
|
||
}
|
||
return _boomView;
|
||
}
|
||
|
||
- (UIImageView *)joinView {
|
||
if (!_joinView) {
|
||
_joinView = [[UIImageView alloc] init];
|
||
_joinView.image = [UIImage getLanguageImage:@"room_mode_dating_enter"];
|
||
_joinView.userInteractionEnabled = YES;
|
||
_joinView.contentMode = UIViewContentModeScaleAspectFit;
|
||
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapJoinDatingRecognizer)];
|
||
[_joinView addGestureRecognizer:tap];
|
||
_joinView.tag = 104;
|
||
}
|
||
return _joinView;
|
||
}
|
||
|
||
- (NetImageView *)loader_url_1 {
|
||
if (!_loader_url_1) {
|
||
_loader_url_1 = [[NetImageView alloc] init];
|
||
}
|
||
return _loader_url_1;
|
||
}
|
||
|
||
- (NetImageView *)loader_url_2 {
|
||
if (!_loader_url_2) {
|
||
_loader_url_2 = [[NetImageView alloc] init];
|
||
}
|
||
return _loader_url_2;
|
||
}
|
||
|
||
- (UIButton *)expandButton {
|
||
if (!_expandButton) {
|
||
_expandButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
[_expandButton setImage:kImage(@"side_menu_open") forState:UIControlStateNormal];
|
||
[_expandButton addTarget:self action:@selector(didTapExpand) forControlEvents:UIControlEventTouchUpInside];
|
||
_expandButton.hidden = YES;
|
||
}
|
||
return _expandButton;
|
||
}
|
||
|
||
- (PIRoomEnterRedPacketView *)redPacketView{
|
||
if(!_redPacketView){
|
||
_redPacketView = [[PIRoomEnterRedPacketView alloc]initWithFrame:CGRectZero];
|
||
_redPacketView.hidden = YES;
|
||
_redPacketView.tag = 106;
|
||
_redPacketView.delegate = self;
|
||
}
|
||
return _redPacketView;
|
||
}
|
||
|
||
- (OpenLuckyPackageEntranceView *)giftEntranceButton {
|
||
if (!_giftEntranceButton) {
|
||
_giftEntranceButton = [[OpenLuckyPackageEntranceView alloc] init];
|
||
_giftEntranceButton.tag = 107;
|
||
}
|
||
return _giftEntranceButton;
|
||
}
|
||
|
||
@end
|