Files
peko-ios/YuMi/Modules/YMRoom/View/RoomSideMenu/RoomSideMenu.m

1035 lines
38 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// 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 "Api+TreasureFairy.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 "XPTreasureFairyViewController.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_Game:
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];
}];
[[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.code isEqualToString:@"SEIZE_TREASURE"]) {
XPTreasureFairyViewController * fairyVC = [[XPTreasureFairyViewController alloc] initWithdelegate:self.hostDelegate];
fairyVC.roomUid =[NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid];
fairyVC.view.frame = CGRectMake(0, KScreenHeight, KScreenWidth, KScreenHeight);
[[XCCurrentVCStackManager shareManager].getCurrentVC addChildViewController:fairyVC];
[[XCCurrentVCStackManager shareManager].getCurrentVC.view addSubview:fairyVC.view];
[UIView animateWithDuration:0.2 animations:^{
fairyVC.view.frame = CGRectMake(0, 0, KScreenWidth, KScreenHeight);
}completion:^(BOOL finished) {
}];
} 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