// // XPRoomBottomMenuView.m // xplan-ios // // Created by 冯硕 on 2021/10/11. // #import "XPRoomMenuContainerView.h" ///Third #import ///Tool #import "AccountInfoStorage.h" #import "TTPopup.h" #import "RtcManager.h" ///Model #import "XPRoomMenuItem.h" #import "MicroQueueModel.h" #import "UserInfoModel.h" #import "MicroStateModel.h" #import "RoomInfoModel.h" #import "AttachmentModel.h" ///View #import "XPRoomSendTextView.h" #import "XPSendGiftView.h" #import "SessionListViewController.h" #import "XPRoomMoreMenuViewController.h" @interface XPRoomMenuContainerView () /// @property (nonatomic,strong) UIStackView *stackView; ///输入框 @property (nonatomic,strong) UIButton *inputButton; ///麦 @property (nonatomic,strong) UIButton *micButton; ///声音 @property (nonatomic,strong) UIButton *voiceButton; ///表情 @property (nonatomic,strong) UIButton *faceButton; ///私聊 @property (nonatomic,strong) UIButton *messageButton; ///更多 @property (nonatomic,strong) UIButton *moreButton; ///礼物 @property (nonatomic,strong) UIButton *giftButton; ///排麦 @property (nonatomic,strong) UIButton *arrangeMicButton; ///占位的 @property (nonatomic,strong) UIView * placeHolderView; ///代理 @property (nonatomic,weak) id delegate; @end @implementation XPRoomMenuContainerView - (instancetype)initWithDelegate:(id)delegate { self = [super init]; if (self) { self.delegate = delegate; [self initSubViews]; [self initSubViewConstraints]; } return self; } #pragma mark - Response - (void)menuButtonAction:(UIButton *)sender { XPRoomMenuItemType type = sender.tag; switch (type) { case XPRoomMenuItemType_Input: [XPRoomSendTextView showTextView:self.superview delegate:self.delegate]; break; case XPRoomMenuItemType_Mic: { [RtcManager instance].localMuted = !self.micButton.isSelected; self.micButton.selected = [RtcManager instance].isLocalMuted; } break; case XPRoomMenuItemType_Voice: { [RtcManager instance].remoteMuted = !self.voiceButton.isSelected; self.voiceButton.selected = [RtcManager instance].isRemoteMuted; } break; case XPRoomMenuItemType_Gift: { NSString * roomUid = [NSString stringWithFormat:@"%ld", [self.delegate getRoomInfo].uid]; XPSendGiftView * giftView = [[XPSendGiftView alloc] initWithType:SendGiftType_Room uid:roomUid]; giftView.delegate = self.delegate; NSArray * giftUses = [self configGiftUsers:[self.delegate getMicroQueue]]; [giftView configGiftUsers:giftUses]; [TTPopup popupView:giftView style:TTPopupStyleActionSheet]; } break; case XPRoomMenuItemType_Message: { SessionListViewController * sessionList = [[SessionListViewController alloc] initWithType:SessionListOpenTypeRoom]; [self.delegate.getCurrentNav pushViewController:sessionList animated:YES]; } break; case XPRoomMenuItemType_More: { XPRoomMoreMenuViewController * moreMenuVC = [[XPRoomMoreMenuViewController alloc] initRoomInfo:self.delegate.getRoomInfo]; [self.delegate.getCurrentNav presentViewController:moreMenuVC animated:YES completion:nil]; } case XPRoomMenuItemType_ArrangeMic:{ self.arrangeMicButton.selected = NO; NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init]; request.roomId = [NSString stringWithFormat:@"%ld", self.delegate.getRoomInfo.roomId]; request.userIds = @[[AccountInfoStorage instance].getUid]; [[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray * _Nullable members) { NIMChatroomMember * member; if (error == nil) { member = members.firstObject; } RoomInfoModel * roomInfo = self.delegate.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.delegate getMicroQueue]; info.isManager = (member.type == NIMChatroomMemberTypeCreator || member.type == NIMChatroomMemberTypeManager); XPArrangeMicViewController * arrangeMicVC = [[XPArrangeMicViewController alloc] initWithInfo:info]; [self.delegate.getCurrentNav presentViewController:arrangeMicVC animated:YES completion:nil]; }]; } break; default: break; } } #pragma mark - Private Method - (void)initSubViews { [self addSubview:self.stackView]; [self.stackView addArrangedSubview:self.inputButton]; [self.stackView addArrangedSubview:self.micButton]; [self.stackView addArrangedSubview:self.voiceButton]; [self.stackView addArrangedSubview:self.faceButton]; [self.stackView addArrangedSubview:self.arrangeMicButton]; [self.stackView addArrangedSubview:self.messageButton]; [self.stackView addArrangedSubview:self.moreButton]; [self.stackView addArrangedSubview:self.placeHolderView]; [self.stackView addArrangedSubview:self.giftButton]; } - (void)initSubViewConstraints { [self.stackView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.mas_equalTo(self).inset(15); make.top.bottom.mas_equalTo(self); }]; [self.inputButton mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(100, 30)); }]; [self.giftButton mas_makeConstraints:^(MASConstraintMaker *make) { make.size.mas_equalTo(CGSizeMake(38, 38)); }]; } - (NSArray *)configGiftUsers:(NSMutableDictionary *)queue { NSMutableArray * array = [NSMutableArray array]; for (MicroQueueModel * microModel in queue.allValues) { if (microModel.userInfo && microModel.userInfo.uid >0) { UserInfoModel * userInfo = microModel.userInfo; XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init]; userModel.avatar = userInfo.avatar; userModel.position = [NSString stringWithFormat:@"%d", microModel.microState.position]; userModel.uid = userInfo.uid; [array addObject:userModel]; } } if (self.delegate.getRoomInfo.leaveMode) { RoomInfoModel * roomInfo= self.delegate.getRoomInfo; XPGiftUserInfoModel * userModel = [[XPGiftUserInfoModel alloc] init]; userModel.avatar = roomInfo.avatar; userModel.position = @"-1"; userModel.uid = roomInfo.uid; [array addObject:userModel]; } return array; } - (MicroQueueModel *)findMySelfMicro:(NSMutableDictionary *)queue { NSString * uid = [AccountInfoStorage instance].getUid; for (MicroQueueModel * microModel in queue.allValues) { if (microModel.userInfo && microModel.userInfo.uid == uid.integerValue) { return microModel; } } return nil; } #pragma mark - RoomGuestDelegate - (void)onMicroQueueUpdate:(NSMutableDictionary *)queue { MicroQueueModel * model = [self findMySelfMicro:queue]; if (model) { self.micButton.hidden = NO; self.micButton.selected = model.microState.micState == MicroMicStateType_Close ? YES : [RtcManager instance].isLocalMuted; self.micButton.enabled = model.microState.micState == MicroMicStateType_Open; } else { self.micButton.hidden = YES; } } - (void)onRoomUpdate { RoomInfoModel * roomInfo = self.delegate.getRoomInfo; self.moreButton.hidden = roomInfo.uid == [AccountInfoStorage instance].getUid.integerValue ? NO : YES; self.arrangeMicButton.hidden = roomInfo.roomModeType != RoomModeType_Open_Micro_Mode; } - (void)handleNIMCustomMessage:(AttachmentModel *)attachment { if (attachment.first == CustomMessageType_Arrange_Mic) { if (attachment.second == Custom_Message_Sub_Arrange_Mic_Non_Empty || attachment.second == Custom_Message_Sub_Arrange_Mic_Empty) { NIMChatroomMembersByIdsRequest *request = [[NIMChatroomMembersByIdsRequest alloc]init]; request.roomId = [NSString stringWithFormat:@"%ld", self.delegate.getRoomInfo.roomId]; request.userIds = @[[AccountInfoStorage instance].getUid]; [[NIMSDK sharedSDK].chatroomManager fetchChatroomMembersByIds:request completion:^(NSError * _Nullable error, NSArray * _Nullable members) { NIMChatroomMember * member; if (error == nil) { member = members.firstObject; } if (member.type == NIMChatroomMemberTypeCreator || member.type == NIMChatroomMemberTypeManager) { self.arrangeMicButton.selected = attachment.second == Custom_Message_Sub_Arrange_Mic_Non_Empty; }; }]; } } } #pragma mark - Getters And Setters - (UIButton *)inputButton { if (!_inputButton) { _inputButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_inputButton setTitle:@"说点什么..." forState:UIControlStateNormal]; [_inputButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; _inputButton.titleLabel.font = [UIFont systemFontOfSize:15]; _inputButton.layer.masksToBounds = YES; _inputButton.layer.cornerRadius = 15; [_inputButton setBackgroundImage:[UIImage imageNamed:@"room_menu_input_bg"] forState:UIControlStateNormal]; _inputButton.tag = XPRoomMenuItemType_Input; [_inputButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; } return _inputButton; } - (UIButton *)micButton { if (!_micButton) { _micButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_micButton setImage:[UIImage imageNamed:@"room_menu_mic_open"] forState:UIControlStateNormal]; [_micButton setImage:[UIImage imageNamed:@"room_menu_mic_close"] forState:UIControlStateSelected]; [_micButton setImage:[UIImage imageNamed:@"room_menu_mic_close"] forState:UIControlStateDisabled | UIControlStateSelected]; _micButton.tag = XPRoomMenuItemType_Mic; [_micButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; _micButton.hidden = YES; } return _micButton; } - (UIButton *)voiceButton { if (!_voiceButton) { _voiceButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_voiceButton setImage:[UIImage imageNamed:@"room_menu_voice_open"] forState:UIControlStateNormal]; [_voiceButton setImage:[UIImage imageNamed:@"room_menu_voice_close"] forState:UIControlStateSelected]; _voiceButton.tag = XPRoomMenuItemType_Voice; [_voiceButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; } return _voiceButton; } - (UIButton *)faceButton { if (!_faceButton) { _faceButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_faceButton setImage:[UIImage imageNamed:@"room_menu_face"] forState:UIControlStateNormal]; [_faceButton setImage:[UIImage imageNamed:@"room_menu_face"] forState:UIControlStateSelected]; _faceButton.tag = XPRoomMenuItemType_Face; [_faceButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; _faceButton.hidden = YES; } return _faceButton; } - (UIButton *)messageButton { if (!_messageButton) { _messageButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_messageButton setImage:[UIImage imageNamed:@"room_menu_message"] forState:UIControlStateNormal]; [_messageButton setImage:[UIImage imageNamed:@"room_menu_new_message"] forState:UIControlStateSelected]; _messageButton.tag = XPRoomMenuItemType_Message; [_messageButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; } return _messageButton; } - (UIButton *)moreButton { if (!_moreButton) { _moreButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_moreButton setImage:[UIImage imageNamed:@"room_menu_more"] forState:UIControlStateNormal]; [_moreButton setImage:[UIImage imageNamed:@"room_menu_more"] forState:UIControlStateSelected]; _moreButton.tag = XPRoomMenuItemType_More; [_moreButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; } return _moreButton; } - (UIButton *)giftButton { if (!_giftButton) { _giftButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_giftButton setImage:[UIImage imageNamed:@"room_menu_gift"] forState:UIControlStateNormal]; [_giftButton setImage:[UIImage imageNamed:@"room_menu_gift"] forState:UIControlStateSelected]; _giftButton.tag = XPRoomMenuItemType_Gift; [_giftButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; } return _giftButton; } - (UIView *)placeHolderView { if (!_placeHolderView) { _placeHolderView = [[UIView alloc] init]; _placeHolderView.backgroundColor = [UIColor clearColor]; [_placeHolderView setContentHuggingPriority:UILayoutPriorityDragThatCanResizeScene forAxis:UILayoutConstraintAxisHorizontal]; } return _placeHolderView; } - (UIStackView *)stackView { if (!_stackView) { _stackView = [[UIStackView alloc] init]; _stackView.axis = UILayoutConstraintAxisHorizontal; _stackView.distribution = UIStackViewDistributionFill; _stackView.alignment = UIStackViewAlignmentCenter; _stackView.spacing = 8; } return _stackView; } - (UIButton *)arrangeMicButton { if (!_arrangeMicButton) { _arrangeMicButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_arrangeMicButton setImage:[UIImage imageNamed:@"room_menu_arrange_mic"] forState:UIControlStateNormal]; [_arrangeMicButton setImage:[UIImage imageNamed:@"room_menu_arrange_mic_new"] forState:UIControlStateSelected]; _arrangeMicButton.tag = XPRoomMenuItemType_ArrangeMic; [_arrangeMicButton addTarget:self action:@selector(menuButtonAction:) forControlEvents:UIControlEventTouchUpInside]; _arrangeMicButton.hidden = YES; } return _arrangeMicButton; } @end