From 4abb686790b042e1458ec6914259fe4a8be0d2cb Mon Sep 17 00:00:00 2001 From: edwinQQQ Date: Sat, 28 Dec 2024 15:41:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=E9=A6=96=E9=A1=B5=20?= =?UTF-8?q?tab=20=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91=20=EF=BD=9C=20?= =?UTF-8?q?=E8=A1=A5=E5=85=A8=20side=20menu=20=E6=8E=A7=E5=88=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91=20|=20=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=2020=20mic?= =?UTF-8?q?=20=EF=BD=9C=20=E9=83=A8=E5=88=86=E5=B0=8F=E9=9C=80=E6=B1=82=20?= =?UTF-8?q?=EF=BD=9C=20=E4=BC=98=E5=8C=96=E6=88=BF=E9=97=B4=E8=81=8A?= =?UTF-8?q?=E5=A4=A9=E6=B0=94=E6=B3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- YuMi.xcodeproj/project.pbxproj | 38 + .../xcshareddata/xcschemes/YuMi.xcscheme | 7 + YuMi/Appdelegate/AppDelegate.m | 24 +- .../room_mode_card_bg.imageset/Contents.json | 21 + .../矩形 2979@3x.png | Bin 0 -> 192079 bytes .../Contents.json | 21 + .../头像@2x@3x.png | Bin 0 -> 5118 bytes .../room_mode_help.imageset/Contents.json | 21 + .../room_mode_help.imageset/返回 1@3x.png | Bin 0 -> 2826 bytes .../Contents.json | 21 + .../切图 62@3x(1).png | Bin 0 -> 4095 bytes .../Contents.json | 21 + .../切图 62@3x(5).png | Bin 0 -> 3896 bytes .../Contents.json | 21 + .../切图 62@3x(2).png | Bin 0 -> 4985 bytes .../Contents.json | 21 + .../切图 62@3x(6).png | Bin 0 -> 4715 bytes .../Contents.json | 21 + .../切图 61@3x.png | Bin 0 -> 6828 bytes .../Contents.json | 21 + .../切图 62@3x(8).png | Bin 0 -> 6522 bytes .../Contents.json | 21 + .../切图 62@3x(3).png | Bin 0 -> 5836 bytes .../Contents.json | 21 + .../切图 62@3x(7).png | Bin 0 -> 5485 bytes .../Contents.json | 21 + .../切图 62@3x.png | Bin 0 -> 4767 bytes .../room_mode_mic_9_on.imageset/Contents.json | 21 + .../切图 62@3x(4).png | Bin 0 -> 4538 bytes .../1.0.34/star_white.imageset/Contents.json | 21 + .../1.0.34/star_white.imageset/星形 12@3x.png | Bin 0 -> 1204 bytes .../1.0.34/star_yellow.imageset/Contents.json | 21 + .../1.0.34/star_yellow.imageset/星形 4@3x.png | Bin 0 -> 1112 bytes YuMi/CustomUI/EmptyDataView.h | 16 + YuMi/CustomUI/EmptyDataView.m | 20 + .../ShoppingMall/MyDressingDataModel.m | 1 + .../Modules/YMMessage/Model/AttachmentModel.h | 9 + .../GiveDiamond/View/XPMineGiveDiamondVC.m | 68 +- .../MineInfo/XPMineUserDataViewController.h | 2 +- .../MineInfo/XPMineUserDataViewController.m | 4 + .../MineInfo/XPMineUserInfoViewController.m | 21 +- .../YMMine/View/XPMineViewController.m | 4 + .../YMNewHome/Model/HomePlayRoomModel.h | 2 + .../Presenter/XPHomeContainerPresenter.m | 2 +- .../Cell/XPNewHomePartyCollectionViewCell.m | 18 +- .../View/Cell/XPNewHomePartyTableViewCell.m | 17 +- .../View/XPHomeRecommendViewController.m | 5 +- .../YMNewHome/View/XPNewHomeViewController.m | 77 +- YuMi/Modules/YMRoom/Model/RoomInfoModel.h | 6 + .../Modules/YMRoom/Model/RoomLevelInfoModel.h | 61 + .../Modules/YMRoom/Model/RoomLevelInfoModel.m | 36 + YuMi/Modules/YMRoom/RoomResourceManager.h | 33 + YuMi/Modules/YMRoom/RoomResourceManager.m | 192 +++ .../View/ActivityContainerView/RoomSideMenu.h | 2 + .../View/ActivityContainerView/RoomSideMenu.m | 335 +++-- .../ArrangeMic/Model/XPArrangeMicInfoModel.h | 2 + .../View/XPArrangeMicViewController.m | 22 +- .../XPRoomMenuContainerView.m | 1 + .../View/XPNetImageYYLabel.h | 1 + .../View/XPNetImageYYLabel.m | 42 + .../View/XPRoomMessageTableViewCell.m | 116 +- .../View/XPRoomMoreMenuViewController.m | 12 +- .../View/RoomHeaderView/RoomHeaderView.h | 1 + .../View/RoomHeaderView/RoomHeaderView.m | 24 +- .../YMRoom/View/RoomMode/RoomModePresenter.h | 30 + .../YMRoom/View/RoomMode/RoomModePresenter.m | 66 + .../View/RoomMode/RoomModeViewController.h | 18 + .../View/RoomMode/RoomModeViewController.m | 1151 +++++++++++++++++ .../YMRoom/View/SendGiftView/Api/Api+Gift.h | 4 + .../YMRoom/View/SendGiftView/Api/Api+Gift.m | 5 + .../YMRoom/View/Setting/Api/Api+RoomSetting.h | 7 + .../YMRoom/View/Setting/Api/Api+RoomSetting.m | 5 + .../View/XPRoomInviteUserViewController.h | 5 +- .../View/XPRoomInviteUserViewController.m | 99 +- .../YMRoom/View/StageView/AnchorStageView.m | 4 + .../View/StageView/FifteenMicStageView.m | 4 +- .../StageView/MicroView/MicroNobleWaveView.h | 3 +- .../StageView/MicroView/MicroNobleWaveView.m | 12 + .../View/StageView/MicroView/MicroView.m | 39 +- .../StageView/MicroView/SocialMicroView.m | 1 + .../View/StageView/NineteenMicStageView.m | 42 +- .../Modules/YMRoom/View/StageView/StageView.m | 78 +- .../YMRoom/View/StageView/TenMicStageView.m | 4 +- .../View/StageView/TwentyMicStageView.m | 4 +- .../YMRoom/View/UserCard/Api/Api+UserCard.h | 6 + .../YMRoom/View/UserCard/Api/Api+UserCard.m | 4 + .../View/UserCard/Model/XPUserCardItemModel.h | 6 +- .../UserCard/Presenter/XPUserCardPresenter.h | 10 + .../UserCard/Presenter/XPUserCardPresenter.m | 48 +- .../View/UserRoomCardViewController.m | 200 ++- .../YMRoom/View/XPRoomViewController.m | 85 +- .../YMTabbar/View/TabbarViewController.m | 38 +- YuMi/Structure/MVP/Api/Api.h | 2 + YuMi/Structure/MVP/Api/Api.m | 4 + YuMi/ar.lproj/Localizable.strings | 18 +- YuMi/en.lproj/Localizable.strings | 18 +- YuMi/tr.lproj/Localizable.strings | 18 +- YuMi/zh-Hant.lproj/Localizable.strings | 18 +- 98 files changed, 3209 insertions(+), 383 deletions(-) create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_card_bg.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_card_bg.imageset/矩形 2979@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_default_skin.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_default_skin.imageset/头像@2x@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_help.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_help.imageset/返回 1@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_off.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_off.imageset/切图 62@3x(1).png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_on.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_on.imageset/切图 62@3x(5).png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_off.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_off.imageset/切图 62@3x(2).png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_on.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_on.imageset/切图 62@3x(6).png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_off.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_off.imageset/切图 61@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_on.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_on.imageset/切图 62@3x(8).png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_off.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_off.imageset/切图 62@3x(3).png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_on.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_on.imageset/切图 62@3x(7).png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_off.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_off.imageset/切图 62@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_on.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_on.imageset/切图 62@3x(4).png create mode 100644 YuMi/Assets.xcassets/1.0.34/star_white.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/star_white.imageset/星形 12@3x.png create mode 100644 YuMi/Assets.xcassets/1.0.34/star_yellow.imageset/Contents.json create mode 100644 YuMi/Assets.xcassets/1.0.34/star_yellow.imageset/星形 4@3x.png create mode 100644 YuMi/CustomUI/EmptyDataView.h create mode 100644 YuMi/CustomUI/EmptyDataView.m create mode 100644 YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.h create mode 100644 YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.m create mode 100644 YuMi/Modules/YMRoom/RoomResourceManager.h create mode 100644 YuMi/Modules/YMRoom/RoomResourceManager.m create mode 100644 YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.h create mode 100644 YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.m create mode 100644 YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.h create mode 100644 YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.m diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index 9dec9286..162a7a92 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -498,6 +498,8 @@ 23FF428E2AAB2D3A0055733C /* XPCandyTreeBuyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23FF428D2AAB2D3A0055733C /* XPCandyTreeBuyView.m */; }; 4C1892992CF84349004D4426 /* RoomCahtCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1892982CF84349004D4426 /* RoomCahtCell.m */; }; 4C44BD5D2D151B5C00F321FA /* RoomSideMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C44BD5C2D151B5C00F321FA /* RoomSideMenu.m */; }; + 4C5527BC2D1BDCDE00833FFD /* RoomLevelInfoModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5527BB2D1BDCDE00833FFD /* RoomLevelInfoModel.m */; }; + 4C5527BF2D1C099500833FFD /* RoomResourceManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5527BE2D1C099500833FFD /* RoomResourceManager.m */; }; 4C5C37232D0C1C7900BA9AB8 /* RegionListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C5C37222D0C1C7900BA9AB8 /* RegionListViewController.m */; }; 4C6C92C02D1172D9000A4693 /* RegionListInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6C92BF2D1172D9000A4693 /* RegionListInfo.m */; }; 4C6E1F752CEAEC3C0073D0A3 /* ShoppingMallTagView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6E1F742CEAEC3C0073D0A3 /* ShoppingMallTagView.m */; }; @@ -505,6 +507,9 @@ 4C6E1F7C2CEB25B10073D0A3 /* ShoppingMallItemPreview.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C6E1F7B2CEB25B10073D0A3 /* ShoppingMallItemPreview.m */; }; 4C71C69F2D069D2B00ECCA24 /* GiftAnimationHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C71C69E2D069D2B00ECCA24 /* GiftAnimationHelper.m */; }; 4C71C6A22D06DB3D00ECCA24 /* GiftAnimationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C71C6A12D06DB3D00ECCA24 /* GiftAnimationManager.m */; }; + 4C7989EC2D19392E006AE07B /* EmptyDataView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7989EB2D19392E006AE07B /* EmptyDataView.m */; }; + 4C7989EF2D195277006AE07B /* RoomModeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7989EE2D195277006AE07B /* RoomModeViewController.m */; }; + 4C7989F32D1952DA006AE07B /* RoomModePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7989F22D1952DA006AE07B /* RoomModePresenter.m */; }; 4C815A172CFEB758002A46A6 /* SuperBlockViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C815A162CFEB758002A46A6 /* SuperBlockViewController.m */; }; 4CC6195A2CEC7770008C1EE8 /* MyDressingDataPresent.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC619592CEC7770008C1EE8 /* MyDressingDataPresent.m */; }; 4CC6195D2CEC996E008C1EE8 /* MyDressingDataModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6195C2CEC996E008C1EE8 /* MyDressingDataModel.m */; }; @@ -2594,6 +2599,10 @@ 4C1892982CF84349004D4426 /* RoomCahtCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomCahtCell.m; sourceTree = ""; }; 4C44BD5B2D151B5C00F321FA /* RoomSideMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomSideMenu.h; sourceTree = ""; }; 4C44BD5C2D151B5C00F321FA /* RoomSideMenu.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomSideMenu.m; sourceTree = ""; }; + 4C5527BA2D1BDCDE00833FFD /* RoomLevelInfoModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomLevelInfoModel.h; sourceTree = ""; }; + 4C5527BB2D1BDCDE00833FFD /* RoomLevelInfoModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomLevelInfoModel.m; sourceTree = ""; }; + 4C5527BD2D1C099500833FFD /* RoomResourceManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomResourceManager.h; sourceTree = ""; }; + 4C5527BE2D1C099500833FFD /* RoomResourceManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomResourceManager.m; sourceTree = ""; }; 4C5C37212D0C1C7900BA9AB8 /* RegionListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RegionListViewController.h; sourceTree = ""; }; 4C5C37222D0C1C7900BA9AB8 /* RegionListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RegionListViewController.m; sourceTree = ""; }; 4C6C92BE2D1172D9000A4693 /* RegionListInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RegionListInfo.h; sourceTree = ""; }; @@ -2608,6 +2617,12 @@ 4C71C69E2D069D2B00ECCA24 /* GiftAnimationHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiftAnimationHelper.m; sourceTree = ""; }; 4C71C6A02D06DB3D00ECCA24 /* GiftAnimationManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GiftAnimationManager.h; sourceTree = ""; }; 4C71C6A12D06DB3D00ECCA24 /* GiftAnimationManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GiftAnimationManager.m; sourceTree = ""; }; + 4C7989EA2D19392E006AE07B /* EmptyDataView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EmptyDataView.h; sourceTree = ""; }; + 4C7989EB2D19392E006AE07B /* EmptyDataView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EmptyDataView.m; sourceTree = ""; }; + 4C7989ED2D195277006AE07B /* RoomModeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomModeViewController.h; sourceTree = ""; }; + 4C7989EE2D195277006AE07B /* RoomModeViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomModeViewController.m; sourceTree = ""; }; + 4C7989F12D1952DA006AE07B /* RoomModePresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RoomModePresenter.h; sourceTree = ""; }; + 4C7989F22D1952DA006AE07B /* RoomModePresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomModePresenter.m; sourceTree = ""; }; 4C815A152CFEB758002A46A6 /* SuperBlockViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SuperBlockViewController.h; sourceTree = ""; }; 4C815A162CFEB758002A46A6 /* SuperBlockViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SuperBlockViewController.m; sourceTree = ""; }; 4CC619582CEC7770008C1EE8 /* MyDressingDataPresent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyDressingDataPresent.h; sourceTree = ""; }; @@ -5225,6 +5240,8 @@ 4CEB9EA92D097E8400443480 /* MoliAvatar.m */, 4CEB9EAB2D09AA0400443480 /* SexAgeLabel.h */, 4CEB9EAC2D09AA0400443480 /* SexAgeLabel.m */, + 4C7989EA2D19392E006AE07B /* EmptyDataView.h */, + 4C7989EB2D19392E006AE07B /* EmptyDataView.m */, ); path = CustomUI; sourceTree = ""; @@ -6639,6 +6656,17 @@ path = UIViewGradientLayer; sourceTree = ""; }; + 4C7989F02D195293006AE07B /* RoomMode */ = { + isa = PBXGroup; + children = ( + 4C7989ED2D195277006AE07B /* RoomModeViewController.h */, + 4C7989EE2D195277006AE07B /* RoomModeViewController.m */, + 4C7989F12D1952DA006AE07B /* RoomModePresenter.h */, + 4C7989F22D1952DA006AE07B /* RoomModePresenter.m */, + ); + path = RoomMode; + sourceTree = ""; + }; 54283CE22CE48884009729B5 /* ShoppingMall */ = { isa = PBXGroup; children = ( @@ -7527,6 +7555,8 @@ 54E82EAD2CA9293C00C931D9 /* BoomInfoModel.m */, 544879EE2CD22D4B00D58DC1 /* CustomRoomBGItemModel.h */, 544879EF2CD22D4B00D58DC1 /* CustomRoomBGItemModel.m */, + 4C5527BA2D1BDCDE00833FFD /* RoomLevelInfoModel.h */, + 4C5527BB2D1BDCDE00833FFD /* RoomLevelInfoModel.m */, ); path = Model; sourceTree = ""; @@ -10462,6 +10492,8 @@ E8AEAED8271413530017FCE0 /* View */, E80487612717DD92008595F2 /* Presenter */, E80487622717DDAE008595F2 /* Protocol */, + 4C5527BD2D1C099500833FFD /* RoomResourceManager.h */, + 4C5527BE2D1C099500833FFD /* RoomResourceManager.m */, ); path = YMRoom; sourceTree = ""; @@ -10521,6 +10553,7 @@ E8AEAED5271412EC0017FCE0 /* XPRoomViewController.m */, 5458319B2C2AE09300364026 /* XPRoomTypeSelectionViewController.h */, 5458319C2C2AE09300364026 /* XPRoomTypeSelectionViewController.m */, + 4C7989F02D195293006AE07B /* RoomMode */, ); path = View; sourceTree = ""; @@ -11779,6 +11812,7 @@ E8EEB90326FC31DC007C6EBA /* XPMineUserInfoProtocol.h in Sources */, E8232603274E4AA0003A3332 /* ThemeColor+UserCard.m in Sources */, E87A24F1272935920086A794 /* XPMessageRemoteExtModel.m in Sources */, + 4C5527BC2D1BDCDE00833FFD /* RoomLevelInfoModel.m in Sources */, E8D34D5028080362009C4835 /* XPMineDataGiftTableViewCell.m in Sources */, E87C54BE2823CC5B0051AA11 /* XPMineResetLoginPwdPresenter.m in Sources */, 237852A42C082A9800E360AC /* MSRoomGameSendTextView.m in Sources */, @@ -11854,6 +11888,7 @@ 2305EEF62AD67E5500AD403C /* PIRoomPhotoAlbumItemCell.m in Sources */, E85E7B3C2A4EB0D300B6D00A /* XPGuildSuperAdminRoomCollectionViewCell.m in Sources */, 237700EC2BC914B400D661F1 /* UISwipeGestureRecognizer+MSRTL.m in Sources */, + 4C5527BF2D1C099500833FFD /* RoomResourceManager.m in Sources */, 23D321E82ADFED10006B259C /* PIRoomSendRedPacketItemVC.m in Sources */, E85E7B2A2A4EB0D300B6D00A /* XPGuildTimeMonthPickerView.m in Sources */, E87E62782A3F5907002F68C9 /* XPNewHomePartyTableViewCell.m in Sources */, @@ -11920,6 +11955,7 @@ 239D0FAB2BFCB88D002977CE /* XPRoomFunctionContainerView.m in Sources */, E82109B026F1D83500FC3319 /* LoginBindPhonePresent.m in Sources */, E81C1B1F27705F7A0020D1E4 /* XPArrangeMicViewController.m in Sources */, + 4C7989F32D1952DA006AE07B /* RoomModePresenter.m in Sources */, E8B825C726EA0D9A009E8E9F /* LoginVerifCodeProtocol.h in Sources */, 23E9EAAE2A84C9B800B792F2 /* XPMineUserInfoTagView.m in Sources */, 236B2E4E2AA07D06003967A8 /* Api+LittleGame.m in Sources */, @@ -12067,6 +12103,7 @@ 189DD53426DE255300AB55B1 /* TabbarViewController.m in Sources */, 23C9DFC92B84917B00B51558 /* PIRoomActivityChoosePlayCell.m in Sources */, 9BA3B40B293DCDFD0071DF1C /* XPVersionUpdateModel.m in Sources */, + 4C7989EC2D19392E006AE07B /* EmptyDataView.m in Sources */, 23C9DFCF2B85E21E00B51558 /* PIGuildSingleRoomIncomeCell.m in Sources */, 18EE401A2754BA9F00A452BF /* NIMMessageMaker.m in Sources */, E8EEB91D26FC9D58007C6EBA /* XPMineUserInfoDateView.m in Sources */, @@ -12223,6 +12260,7 @@ 18AAF3F0279EA59300CD7DAD /* MessageContentTextClickable.m in Sources */, E8C6FFCC27548120004DC9F0 /* Api+Home.m in Sources */, E8778AF52988EF2B00CF139B /* XPSessionSayHelloTableViewCell.m in Sources */, + 4C7989EF2D195277006AE07B /* RoomModeViewController.m in Sources */, 23FF257C2ABD68020064E904 /* XPGiftFreeItemCell.m in Sources */, 236B2E532AA08757003967A8 /* LittleGameStageView.m in Sources */, 186A534E26FC6ED900D67B2C /* TTPopupService.m in Sources */, diff --git a/YuMi.xcodeproj/xcshareddata/xcschemes/YuMi.xcscheme b/YuMi.xcodeproj/xcshareddata/xcschemes/YuMi.xcscheme index 1d06cb71..bcccb8e0 100644 --- a/YuMi.xcodeproj/xcshareddata/xcschemes/YuMi.xcscheme +++ b/YuMi.xcodeproj/xcshareddata/xcschemes/YuMi.xcscheme @@ -50,6 +50,13 @@ ReferencedContainer = "container:YuMi.xcodeproj"> + + + + VAPLogLevelDebug) { +// va_list argList; +// va_start(argList, format); +// NSString* message = [[NSString alloc] initWithFormat:format arguments:argList]; +// file = [NSString stringWithUTF8String:file].lastPathComponent.UTF8String; +// NSLog(@"<%@> %s(%@):%s [%@] - %@",@(level), file, @(line), func, module, message); +// va_end(argList); +// } +} + - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; @@ -43,7 +64,8 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; self.window.rootViewController = launchScreenVC; [self.window makeKeyAndVisible]; - + [VAPView registerHWDLog:qg_VAP_Logger_handler]; + ///初始化一些 sdk配置 [self initThirdConfig]; [self initUM:application launchOptions:launchOptions]; diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_card_bg.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_card_bg.imageset/Contents.json new file mode 100644 index 00000000..1b915620 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_card_bg.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "矩形 2979@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_card_bg.imageset/矩形 2979@3x.png b/YuMi/Assets.xcassets/1.0.34/room_mode_card_bg.imageset/矩形 2979@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f65a8bde7be0e4f7582df7e6fa7bfe6b82dc1b70 GIT binary patch literal 192079 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 z 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%0DEf!HLlfGZh!6eFl;r0&? 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_help.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_help.imageset/Contents.json new file mode 100644 index 00000000..2d60b8b8 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_help.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "返回 1@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_help.imageset/返回 1@3x.png b/YuMi/Assets.xcassets/1.0.34/room_mode_help.imageset/返回 1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..1f8eab7eb83ba3788837cdf8e887ec30747ba531 GIT binary patch literal 2826 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 J{;`X{{S%2JsKo#P literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_on.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_on.imageset/Contents.json new file mode 100644 index 00000000..e2ed3eb7 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_on.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 62@3x(5).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_on.imageset/切图 62@3x(5).png b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_10_on.imageset/切图 62@3x(5).png new file mode 100644 index 0000000000000000000000000000000000000000..2ad213af7d36f7ef9baec1f2db8f7b704c797caf GIT binary patch literal 3896 zcmeI#=T{S19|!OxM3NPOpn?^NAie2>h!`P3f`DiMK|o4C#1dHpN(oYu(4>QcSe6o{ zD@_nYX%P#$)JIxGg-DT-fFXoP2r19_oPF_}=ReqU_RXC+bLPz4`}e1P3i|$26y(~T;Cf?suuUDy$`t9T*->jUw2}94-WH(W^c@xS(uD* z*l*EL1jbJloU{o7M?NhCfjfRjQeQPgpwKt5AfPp&f*=!+);PG?`3;bFa0KFA!yobL z2qO$8A+HV+>kow|`+N3UDZ#fPk*|9_Vlf9GQ0#%~nTPNMIRs+jVio4$b}*#qzFUYB z^z{aKa&}JEn9=4OiDT6wq2!72&Nu-4}OQbm~FJCsG~@;h5V>y&vdwKfr!wpklC*)F?x2Wmlt z4f!ZN4vjH0@#ROqXL3Ylh31fN-GrK{MK*tpa1beyYsR+o8d{mUghK-n{QCC%s8hrx z(rN9$?}*v^l;(mqGXv#acn`Z zTpOZ4+Ai55+a(kksMX%4R%C|^jZ4|ayGVAd1oAZ;R}fnwb46Z_IGGFOJ1&4EyAWq- zv|-yy3*-~pOI-NRuJ!lYnP*ut`BC;0hA9rxIy~tX;pv!1K1NZGI9~NuMI!Q z*{yXd&=;@R?DK}CWfA;Yx;lh592Q&?&>mfgA@7ujOXDO+rnvzp2>zhHoIW z!nXtHBEQ+!7jv}S@Q&03U(ts(ir;5ti@Lvoz=SjdTBWtHxd8g8OY@dl$YJ^f$z zp@o;bNOqlyQ=j#-y2FU!A>!Kev`;P+gRuxzN$0G#E#{~mI@0_?SN2Hrhz5~3(fDb0 ziDxpTmS%=eqR+1pEP;{AWIr$O@fh&rD7^HEpA%c~wYhSXK^{#5nR%l5Ust8R8kGC4h9`#h)9;2c+%p-N2k;Y3|!WxezAPLfV)%JmJ?_epny zC;D@HmfLGk>5|HHPUB;AU93PGqGjaB?N>rX!*GGY10)b0Tsm=2vQftx6Pjr!5l$a^ zhwdQNpj!39Uviu&RbvB3MDqO<9=NVH#HlaHVR!wV?=Tp1-z8pCm6Xk*tuZ}#eY9ZZYg)sOTs*?*T4$@v8WK}NY^P_0 zi*D_N_F~w&=M8SQV2BnS2o_!Kr97ur;7_G9PnuSynW91-lz2_sl0=bmZM!smnnUXz zxMZ*6@yv?v3J%qZ!yGjiUvzovZ+hW6{oc0XF#ApmMaeayZe_hJ_Qazq8&IqWNG@_n zIQA8gW#`JyY)!?Gf#jl_qtyL?EZaY*x6uYk2Z3)h^Hr7h16g*Tpq!|F%a=<15Y(3m zzYkJ%9AYIOTrUAJKg~Ls%i=3d#K#;EWjw*po zAkc&dZq7Q8wGH*MZ-Z#Fv@!JzBI83)?x1NlUDU+3nzOa1bvIhxT1gSgp+!<3#W*1^ zi^XE6e4}-vy)dq3%FdTs^693c)YB4+#^Xt>7v?wv1OAj63N;nx_N$l`HGi%;L?w9= zv!-h^TMd~6bCT;gy0-UC(=*?kY#}%6B#g~tUdDLPpBVFL{4*VAUdqJ17K+ldK6?Nc zjY0e%LGG)V16t5T{@Phfyau?V;I+$r|iToI2>O%*j92X zek@FagG)o$l$jrV7`9eSEnz$x8~ehxY6=wKK{G`>E@=$}H_P|0M$gtk|zp&X2*l=@H z+Lm8<&t5cRNRRy7@!y*m6G74B>(IBw%f5NPf!xBk|>PpwF=Kr|$#WZ=G=|b5|Uox}!WmiRs{$QEGg~s*QVX%)B3vSyXe)*Cd zzyN?A&L}1TMd;bALc2aTQTB=7&M1?3w7v@yIBY9X(yGQS19(}^N0=IfkDXiby%1e{ zN}OWx3azyN+Kp67CiNRC*fTz-U1n*cjy!$E9kT;c6oOr5XgBFferpdIn>bU~9g`(I zzj$}#FSlX};;)mvCU2D*py!(3sMa}t`=!X&Tm5#Aq2g4+x(7 ziC-u@Kd%B5B2r=keY?=O9PijahSK$FdigT3-@p88zYDLoIKAlK7uf5VR-E!o>XPSh7V`W{2Nc3ql4JdR5>}^CmYhb*F zSJO&2^8feb-NPg-@o8hG!=wuZE4TDluAzk)HtdXSCZpXQ7ZlJ^bZ6xjTY;IrebMxu z6XjNbuRyBMBNXM2iiI-%(Q4^A1#Qa`?nCFa8~Yj9qYfE?M`Sl`=9wr}{-jorha#-* zUH+BghAW*Mhq;qg>LReWa-@ujNLyhm&*b)HE;s{Qw)Ud^L}$$wb2U_TdklkBM(&!p4)%oi-ezho18jX=il(Aq@gDK4wFmXI1k)K}F-K zzA)}^Ea)I1a>^lkh~^&Tn21~LH0H{ KY|Syhxc>l67#->W literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_off.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_off.imageset/Contents.json new file mode 100644 index 00000000..c758c01b --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_off.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 62@3x(2).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_off.imageset/切图 62@3x(2).png b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_off.imageset/切图 62@3x(2).png new file mode 100644 index 0000000000000000000000000000000000000000..d57edaa5b51a906530109a739e4726cab09013a3 GIT binary patch literal 4985 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_on.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_on.imageset/Contents.json new file mode 100644 index 00000000..f660fd33 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_on.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 62@3x(6).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_on.imageset/切图 62@3x(6).png b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_15_on.imageset/切图 62@3x(6).png new file mode 100644 index 0000000000000000000000000000000000000000..ef2eedee9543c89197f14e09ec62156de45b3b8b GIT binary patch literal 4715 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 Y?wb$OLq;yp-y@i{g`IhYnRo2p0fwT?`Tzg` literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_off.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_off.imageset/Contents.json new file mode 100644 index 00000000..63a9d067 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_off.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 61@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_off.imageset/切图 61@3x.png b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_off.imageset/切图 61@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..eeebbab4ebe184b2eebcdfe276c71f62e8fa4396 GIT binary patch literal 6828 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 FzW}E1V1NJs literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_on.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_on.imageset/Contents.json new file mode 100644 index 00000000..2ce7be32 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_on.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 62@3x(8).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_on.imageset/切图 62@3x(8).png b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_19_on.imageset/切图 62@3x(8).png new file mode 100644 index 0000000000000000000000000000000000000000..624b9e9de5c2c969790a8984b899fdafd1f20ac7 GIT binary patch literal 6522 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_on.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_on.imageset/Contents.json new file mode 100644 index 00000000..a87d9ca4 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_on.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 62@3x(7).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_on.imageset/切图 62@3x(7).png b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_20_on.imageset/切图 62@3x(7).png new file mode 100644 index 0000000000000000000000000000000000000000..3bc07343de2b9540c08bb83d5b6dfd992af1d03a GIT binary patch literal 5485 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 GivBmY3Vl@o literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_off.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_off.imageset/Contents.json new file mode 100644 index 00000000..5b6f1c4c --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_off.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 62@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_off.imageset/切图 62@3x.png b/YuMi/Assets.xcassets/1.0.34/room_mode_mic_9_off.imageset/切图 62@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f36e0b1ef2b4772cdaf6ad25a814f7e277287668 GIT binary patch literal 4767 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 literal 0 HcmV?d00001 diff --git a/YuMi/Assets.xcassets/1.0.34/star_white.imageset/Contents.json b/YuMi/Assets.xcassets/1.0.34/star_white.imageset/Contents.json new file mode 100644 index 00000000..5ade9895 --- /dev/null +++ b/YuMi/Assets.xcassets/1.0.34/star_white.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "星形 12@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/1.0.34/star_white.imageset/星形 12@3x.png b/YuMi/Assets.xcassets/1.0.34/star_white.imageset/星形 12@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..5e481ff91af9c32960fcdcf99b50a1b6c3e5d052 GIT binary patch literal 1204 zcmV;l1WWsgP)Px(Zb?KzR9HvtnN4gPMHI*18+YX-I0Awc3#my;lgi#*Cr(j%sQ3^d6sadbYB?1O zg+qxD1ulG4d<2BxP^Gj~voqY2r4mRL9}yo8@!Inz zQ#DoU*vYOp2{|wqTkALP|C=|nGjE=m0yY4g%jMR)uDh3+Hvy=ZQl6-*s~c! zGKd5R>8$$Nw!HzsQD(lS%-0v8Q0U=UEOtJKMj$`{!f~8uW-rvM zF4YPd2+(nyn3VDy5j9l-_)Q4W8IQ+*T5&)Cnr+)d%)DhGaR8@^#p1SPGWmBckTplp zvaIdQ{2md777+|M zvEw*R0Jam+n|=h!Z53oB5;@e?);6iQ7xT3sU^<d0DZ7_aRA02n2rqmfADL~Cp7B&SlTn5Jn5iRg|B z$CX#dOKqnTjI+gJai@yj5oUgfh{RH>1oS6`5C_<{?LUa9F`%>M>i(w!{Dp{aST2Qt zet%U{{1!7m9?;Qpbw9%6t;)Hf-Cr5B%5b5x_yiFrHxMOXu`e zN8RY?==GYWy$?WT$t%4tN@hOgy6yvAU0uJ=&g4~qDvFs*W+M@OL`3UWc)BM5+;14h z*R#=^7eV#lGUP5I@|CwO!C?AyT|Yb*t|Fj%m`R~;EiF^! z##QsdOeXUZfS0{^4{F2A&+EGWdL=(q0WHhAm6^{575CB~z-^{!e(4KvY;3G06bemv z5eRBiDwSG0J3BA@4_Ip?Yl>hdli3VF)m@go0l3{X&5G;2>PwQ%X1A0|rIX7}r;aQk z?v2OeL%!CaZQHwp-hsUiZsun9h-sSd`U12p>se;5xHowf_G$;T&{U~dit0uft2Nj%AvZ$oGcUypLch6f45My zEX!&YLfkX6W%UA3u-DA7m#X9u4u^MibaYg#9af!Um3C#b*>wP3lu~YGW|x^ikWzjE z;M>8$!O8yqeoucfsABuX#Kg7ve15%@@<}36gKl8v<3fnNu~_WK@-%C95dQ+n9@>Rv SFGHIE0000Px(5=lfsR9HvtnN5sSRTRg6|JNxpB7&GeOkjZal_FvcA`9Y2z?ex`sR_73QFMXC zh`RBE_#LAQ0*XXfhzPnNYLpEGG%<*o7(Wt21~YA6D;9$Z@uPwUn6~ejJ_a)k?eJb7 zGqUh*d(Qd)?z#8fd+w=-Im{5An*v*hX#qwjVkeHRCtWN__;Dl@$GPEa#Z-oxwjpjl zHBqEzS>9TSdb^PE082Bo)Dk^llbQqQcl^Zl znw>j3>VRhRljJMA5KD#?H}-I9+%ny8@b7jY+s>f%xyy0vT_AA*;X1}jWs5sT4bb|s zGjVDk0yl;dHF`*Jx7^~fQ1*k2B4^OPou6dz#82m-WvD=3uMc(imrE!>o zG4?{UjrO~0U_W9ULG*&{!_hZGKO_aqcWBNO#-8rR=ROFotcwg28vPX5L43B+S=&ih zxgzVEnZEpooxY0()|AZ{( z{)+7C5fX?O*7!|UNWY2kNW4fR}zK0)F$)kNP`Z(+%S-n@&%YU3*#&ZGBJR#@d+ee5QqrBE-aPA>f`1)-2 zn%08@@7z_GMXK9kPexje>unhf*Ay`LXnL=k#F$gPz%{Xj!v)CEd3v6v{d{t$dCPjx za_;lUUI-UIrj_)JGTy7rq6`B#>lRc$5K}swdm?eG()ll=0eb0a_>{vb#I$ngl3P6T zKVaK=Y%7C@-G%g9PurqV94&F1viYX_z4b@prI+BdJBm)*w$fe7c)OzQ!F*~BDBc@5 zEV1;UGTuAU0CTCQkeZ%NVRb{>nLVv+>9vS}?s{a8hZc!rXxgBx*XZ?}H-@`O+5s#K zC}bk>wgp&lAHr-)%l@A@iO(-c`w`of@%9gfvRvj4@RuPLBc=w;_2#3Fv`QK8?PwWn zv_R@?M|2OV4I2%~y`bIr{-?UOlpiizR!ntK*PR2cl*P!#4YKz!_K{#ktKMPjC2rJ) zx$F#_+H;te;#i~U^FDsZC)7H==YvBPy%_E + +NS_ASSUME_NONNULL_BEGIN + +@interface EmptyDataView : UIView + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/CustomUI/EmptyDataView.m b/YuMi/CustomUI/EmptyDataView.m new file mode 100644 index 00000000..9b461dd1 --- /dev/null +++ b/YuMi/CustomUI/EmptyDataView.m @@ -0,0 +1,20 @@ +// +// EmptyDataView.m +// YuMi +// +// Created by P on 2024/12/23. +// + +#import "EmptyDataView.h" + +@implementation EmptyDataView + +/* +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. +- (void)drawRect:(CGRect)rect { + // Drawing code +} +*/ + +@end diff --git a/YuMi/Modules/ShoppingMall/MyDressingDataModel.m b/YuMi/Modules/ShoppingMall/MyDressingDataModel.m index 4066ef0d..89ff4d13 100644 --- a/YuMi/Modules/ShoppingMall/MyDressingDataModel.m +++ b/YuMi/Modules/ShoppingMall/MyDressingDataModel.m @@ -151,6 +151,7 @@ myDressingNameplate.pic = model.nameplateImage; myDressingNameplate.name = model.nameplateName; myDressingNameplate.used = model.isUsing; + myDressingNameplate.expireDays = model.expireDays; myDressingNameplate.expireTime = model.expireTime; myDressingNameplate.hasExpired = model.isExpired; myDressingNameplate.id = model.nId.integerValue; diff --git a/YuMi/Modules/YMMessage/Model/AttachmentModel.h b/YuMi/Modules/YMMessage/Model/AttachmentModel.h index 5cf3dd2c..201e688d 100644 --- a/YuMi/Modules/YMMessage/Model/AttachmentModel.h +++ b/YuMi/Modules/YMMessage/Model/AttachmentModel.h @@ -139,6 +139,9 @@ typedef NS_ENUM(NSUInteger, CustomMessageType) { ///房間背景更新 CustomMessageType_Custom_Room_Background = 113, + + ///房间等级更新 + CustomMessageType_RoomLevel_Update = 114, }; @@ -739,6 +742,12 @@ typedef NS_ENUM(NSUInteger, CustomMessageTypeCustomRoomBackground) { Custom_Message_Sub_Custom_Room_Background = 1131 }; +///房间等级更新 +typedef NS_ENUM(NSUInteger, CustomMessageTypeRoomLevelUpdate) { + ///所有房间 + Custom_Message_Sub_RoomLevel_Update = 1141 +}; + @interface AttachmentModel : PIBaseModel @property (nonatomic, strong) id data; // Must be NSMutable Type diff --git a/YuMi/Modules/YMMine/View/GiveDiamond/View/XPMineGiveDiamondVC.m b/YuMi/Modules/YMMine/View/GiveDiamond/View/XPMineGiveDiamondVC.m index 93a4bcb9..75648269 100644 --- a/YuMi/Modules/YMMine/View/GiveDiamond/View/XPMineGiveDiamondVC.m +++ b/YuMi/Modules/YMMine/View/GiveDiamond/View/XPMineGiveDiamondVC.m @@ -26,6 +26,16 @@ @interface XPMineGiveDiamondVC () @property (nonatomic,strong) UITableView *tableView; + +@property(nonatomic, strong) UIView *infoContainer; +@property(nonatomic, strong) NetImageView *avatarImageView; +@property(nonatomic, strong) UILabel *nameLabel; +@property(nonatomic, strong) NetImageView *icon1ImageView; +@property(nonatomic, strong) NetImageView *icon2ImageView; +@property(nonatomic, strong) UILabel *idLabel; +@property(nonatomic, strong) UIStackView *starsStack; +@property(nonatomic, strong) UIButton *helpButton; + ///搜索 @property (nonatomic,strong) XPMineGiveDiamondSearchView *searchView; ///数据源 @@ -196,14 +206,58 @@ } return _tagView; } -/* -#pragma mark - Navigation -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. +- (UIView *)infoContainer { + if (!_infoContainer) { + _infoContainer = [[UIView alloc] init]; + [_infoContainer setCornerRadius:10]; + } + return _infoContainer; +} + +- (NetImageView *)avatarImageView { + if (!_avatarImageView) { + _avatarImageView = [[NetImageView alloc] init]; + _avatarImageView.contentMode = UIViewContentModeScaleAspectFill; + } + return _avatarImageView; +} + +- (UILabel *)nameLabel { + if (!_nameLabel) { + _nameLabel = [UILabel labelInitWithText:@"" font:kFontSemibold(15) textColor:UIColorFromRGB(0x313131)]; + } + return _nameLabel; +} + +- (UILabel *)idLabel { + if (!_idLabel) { + _idLabel = [UILabel labelInitWithText:@"" font:kFontRegular(13) textColor:UIColorFromRGB(0x7b7b7d)]; + } + return _idLabel; +} + +- (NetImageView *)icon1ImageView { + if (!_icon1ImageView) { + _icon1ImageView = [[NetImageView alloc] init]; + _icon1ImageView.contentMode = UIViewContentModeScaleAspectFill; + } + return _icon1ImageView; +} + +- (NetImageView *)icon2ImageView { + if (!_icon2ImageView) { + _icon2ImageView = [[NetImageView alloc] init]; + _icon2ImageView.contentMode = UIViewContentModeScaleAspectFill; + } + return _icon2ImageView; +} + +- (UIButton *)helpButton { + if (!_helpButton) { + + } + return _helpButton; } -*/ @end diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h index d296d727..c439183c 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.h @@ -38,7 +38,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic,weak) id delegate; - (void)submitGameOrder:(XPMineGamePartnerInfoModel *)model round:(NSInteger)round; - +- (void)reloadView; @end diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m index 87db1e90..23317cef 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserDataViewController.m @@ -236,6 +236,10 @@ typedef enum : NSUInteger { inning:round]; } +- (void)reloadView { + [self.tableView reloadData]; +} + #pragma mark - UITableViewDelegate And UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return SectionTypeCount; diff --git a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m index 378c12b9..8687131a 100644 --- a/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m +++ b/YuMi/Modules/YMMine/View/MineInfo/XPMineUserInfoViewController.m @@ -246,15 +246,18 @@ HWDMP4PlayDelegate> @kWeakify(self); [TTPopup alertWithConfig:config confirmHandler:^{ @kStrongify(self); + @kWeakify(self); if (isRemove) { [[NIMSDK sharedSDK].userManager removeFromBlackBlackList:uid completion:^(NSError * _Nullable error) { if (error == nil) { + @kStrongify(self); [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoViewController6")]; } }]; } else { [[NIMSDK sharedSDK].userManager addToBlackList:uid completion:^(NSError * _Nullable error) { if (error == nil) { + @kStrongify(self); [self showSuccessToast:YMLocalizedString(@"XPMineUserInfoViewController7")]; } }]; @@ -302,6 +305,11 @@ HWDMP4PlayDelegate> } - (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index { +// if (index == 0) { +// return self.userDataVC; +// } else { +// return self.userMomentVC; +// } if (index == 0) { return isMSRTL() ? self.userMomentVC : self.userDataVC; } else { @@ -394,10 +402,15 @@ HWDMP4PlayDelegate> self.headerHeight = [XPMineUserInfoHeaderView headerHeight:userInfo]; [self.pagingView reloadData]; - if(isMSRTL()){ - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.titleView selectItemAtIndex:0]; + self.userMomentVC.view.hidden = YES; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.titleView selectItemAtIndex:1]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.titleView selectItemAtIndex:0]; + [self.userDataVC reloadView]; + self.userMomentVC.view.hidden = NO; + }); }); } @@ -582,7 +595,7 @@ HWDMP4PlayDelegate> _titleView.titleSelectedFont = kFontMedium(18); _titleView.titleLabelAnchorPointStyle = JXCategoryTitleLabelAnchorPointStyleCenter; _titleView.contentScrollViewClickTransitionAnimationEnabled = NO; - _titleView.defaultSelectedIndex = isMSRTL() ? 1 : 0; + _titleView.defaultSelectedIndex = 0;//isMSRTL() ? 1 : 0; _titleView.averageCellSpacingEnabled = NO; _titleView.contentEdgeInsetLeft = 15; _titleView.titles = self.titles; diff --git a/YuMi/Modules/YMMine/View/XPMineViewController.m b/YuMi/Modules/YMMine/View/XPMineViewController.m index edfe7324..683fc555 100644 --- a/YuMi/Modules/YMMine/View/XPMineViewController.m +++ b/YuMi/Modules/YMMine/View/XPMineViewController.m @@ -586,6 +586,10 @@ UIKIT_EXTERN NSString *kRequestTicket; [self.functionArray removeAllObjects]; [self.functionArray addObjectsFromArray:items]; + +#if DEBUG + self.isHavePermission = YES; +#endif for (XPMineFunctionItemModel * _Nonnull obj in self.functionArray) { if(obj.skipType == XPMineItemType_My_Gift && self.isHavePermission == NO){ [self.functionArray removeObject:obj]; diff --git a/YuMi/Modules/YMNewHome/Model/HomePlayRoomModel.h b/YuMi/Modules/YMNewHome/Model/HomePlayRoomModel.h index f941fd33..7cd11efd 100644 --- a/YuMi/Modules/YMNewHome/Model/HomePlayRoomModel.h +++ b/YuMi/Modules/YMNewHome/Model/HomePlayRoomModel.h @@ -74,6 +74,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy) NSString *roomBoomVapUrl; @property (nonatomic, copy) NSString *regionFlag; +@property(nonatomic, copy) NSString *roomLevelIcon; @end @@ -90,6 +91,7 @@ NS_ASSUME_NONNULL_BEGIN + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m b/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m index 20909066..918618fa 100644 --- a/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m +++ b/YuMi/Modules/YMNewHome/Presenter/XPHomeContainerPresenter.m @@ -134,7 +134,7 @@ [Api getHomeTabsCompletion:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { @kStrongify(self); if (code == 200) { - NSArray * array = [PIHomeCategoryTitleModel modelsWithArray:data.data]; + NSArray *array = [PIHomeCategoryTitleModel modelsWithArray:data.data]; for (PIHomeCategoryTitleModel *model in array) { model.checkedWidth = [UILabel getWidthWithText:model.name height:kGetScaleWidth(44) font:kFontSemibold(16)]; model.noCheckedWidth = [UILabel getWidthWithText:model.name height:kGetScaleWidth(44) font:kFontRegular(14)]; diff --git a/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyCollectionViewCell.m b/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyCollectionViewCell.m index 0b29edac..9def99d4 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyCollectionViewCell.m +++ b/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyCollectionViewCell.m @@ -11,7 +11,6 @@ @interface XPNewHomePartyCollectionViewCell() ///背景 @property(nonatomic,strong) NetImageView *avatarView; - ///榜单 @property(nonatomic,strong) NetImageView *rankImageView; ///类型 @@ -34,6 +33,8 @@ @property (nonatomic, strong) NetImageView *flagImage; +@property (nonatomic, strong) NetImageView *levelImageView; + @end @implementation XPNewHomePartyCollectionViewCell -(instancetype)initWithFrame:(CGRect)frame{ @@ -82,6 +83,8 @@ [self.contentView addSubview:self.avatarView]; [self.contentView addSubview:self.tagImageView]; [self.contentView addSubview:self.rankImageView]; + + [self.contentView addSubview:self.levelImageView]; [self.avatarView addSubview:self.pkImageView]; [self.contentView addSubview:self.nameLabel]; @@ -160,11 +163,17 @@ make.trailing.mas_equalTo(-kGetScaleWidth(6)); make.bottom.equalTo(self.avatarView.mas_bottom).mas_offset(-kGetScaleWidth(6)); }]; + + [self.levelImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.top.mas_equalTo(self.avatarView); + make.size.mas_equalTo(CGSizeMake(40, 16)); + }]; } - (void)setRoomInfo:(HomePlayRoomModel *)roomInfo{ _roomInfo = roomInfo; _avatarView.imageUrl = _roomInfo.avatar; + self.levelImageView.imageUrl = roomInfo.roomLevelIcon; switch (roomInfo.homeRoomType) { case 1:{ @@ -354,4 +363,11 @@ } return _subLabel; } + +- (NetImageView *)levelImageView{ + if(!_levelImageView){ + _levelImageView = [[NetImageView alloc]init]; + } + return _levelImageView; +} @end diff --git a/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyTableViewCell.m b/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyTableViewCell.m index ff95c79c..a467d66a 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyTableViewCell.m +++ b/YuMi/Modules/YMNewHome/View/Cell/XPNewHomePartyTableViewCell.m @@ -51,6 +51,7 @@ @property(nonatomic,strong) NetImageView *charmView; @property(nonatomic,strong) NSDateFormatter *dateFormatter; +@property(nonatomic, strong) NetImageView *levelIcon; @end @@ -74,16 +75,10 @@ [self.bgView addSubview:self.gameBgView]; [self.bgView addSubview:self.gameIconView]; [self.bgView addSubview:self.greenView]; - - - - + [self.bgView addSubview:self.tagView]; [self.bgView addSubview:self.audioView]; [self.bgView addSubview:self.chatBtn]; - - - [self.bgView addSubview:self.titleLabel]; [self.bgView addSubview:self.birthdayView]; @@ -372,6 +367,14 @@ } return _charmView; } + +- (NetImageView *)levelIcon{ + if(!_levelIcon){ + _levelIcon = [[NetImageView alloc]init]; + } + return _levelIcon; +} + - (NSDateFormatter *)dateFormatter { if (!_dateFormatter) { _dateFormatter = [[NSDateFormatter alloc] init]; diff --git a/YuMi/Modules/YMNewHome/View/XPHomeRecommendViewController.m b/YuMi/Modules/YMNewHome/View/XPHomeRecommendViewController.m index c9f0cd49..7764e506 100644 --- a/YuMi/Modules/YMNewHome/View/XPHomeRecommendViewController.m +++ b/YuMi/Modules/YMNewHome/View/XPHomeRecommendViewController.m @@ -231,9 +231,11 @@ UIKIT_EXTERN NSString * const kShieldingNotification; #pragma mark - XPHomeGameViewDelegate - (void)xpHomeGameViewChooseGameWithGameModel:(LittleGameInfoModel *)gameModel{ - NSString * uid = [AccountInfoStorage instance].getUid; + NSString *uid = [AccountInfoStorage instance].getUid; [self showLoading]; + @kWeakify(self); [Api getRoomInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + @kStrongify(self); if (code == 200) { RoomInfoModel * roomInfo = [RoomInfoModel modelWithJSON:data.data]; if(roomInfo.isReselect){ @@ -370,7 +372,6 @@ UIKIT_EXTERN NSString * const kShieldingNotification; } self.pi_playAudioCell = cell; - NSString *fileName = [[roomModel.userVoice componentsSeparatedByString:@"/"] lastObject]; NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) xpSafeObjectAtIndex:0] stringByAppendingPathComponent:@"kMineSoundCard"]; NSString *fullPath = [filePath stringByAppendingPathComponent:fileName]; diff --git a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m index 2eb9c9dc..1e8e8401 100644 --- a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m +++ b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m @@ -147,13 +147,14 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; self.backgroundColor = [[ClientConfig shareConfig] bgColor]; [self addSubview:self.tabCollectionView]; + [self addSubview:self.arrowButton]; + [self.tabCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.bottom.mas_equalTo(self); make.leading.mas_equalTo(0); make.trailing.mas_equalTo(self).offset(-15); }]; - [self addSubview:self.arrowButton]; [self.arrowButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self); make.size.mas_equalTo(CGSizeMake(24, 24)); @@ -161,15 +162,26 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; }]; _gradientMask = [[UIView alloc] init]; - [_gradientMask addGradientBackgroundWithColors:@[ - UIColorRGBAlpha(0xffffff, 0), - [[ClientConfig shareConfig] bgColor], - ] startPoint:CGPointMake(0, 0.5) endPoint:CGPointMake(0.3, 0.5) cornerRadius:0]; + NSArray *colorArr = @[[UIColor colorWithWhite:1 alpha:0.0], + [[ClientConfig shareConfig] bgColor]]; + if (isMSRTL()) { + colorArr = @[[[ClientConfig shareConfig] bgColor], + [UIColor colorWithWhite:1 alpha:0.0]]; + [_gradientMask addGradientBackgroundWithColors:colorArr + startPoint:CGPointMake(0.7, 0.5) + endPoint:CGPointMake(1.0, 0.5) + cornerRadius:0]; + } else { + [_gradientMask addGradientBackgroundWithColors:colorArr + startPoint:CGPointMake(0.2, 0.5) + endPoint:CGPointMake(0.4, 0.5) + cornerRadius:0]; + } [self insertSubview:self.gradientMask belowSubview:self.arrowButton]; [self.gradientMask mas_makeConstraints:^(MASConstraintMaker *make) { - make.trailing.mas_equalTo(self.arrowButton); + make.leading.mas_equalTo(self.arrowButton).offset(-20); + make.trailing.mas_equalTo(self); make.top.bottom.mas_equalTo(self); - make.width.mas_equalTo(30); }]; } @@ -183,13 +195,6 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; } - (void)setTabArray:(NSArray *)tabArray { -// NSMutableArray *temp = @[].mutableCopy; -// for (PIHomeCategoryTitleModel *model in tabArray) { -// if (![NSString isEmpty:model.regionId]) { -// [temp addObject:model]; -// } -// } - _tabArray = tabArray; if (46 * _tabArray.count + 12 * (_tabArray.count-1) > KScreenWidth-30) { self.gradientMask.hidden = NO; @@ -212,7 +217,6 @@ UIKIT_EXTERN NSString * const kOpenRoomNotification; - (void)updateIndex:(NSInteger)index { [self.tabCollectionView selectItemAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] animated:YES scrollPosition:UICollectionViewScrollPositionNone]; -// [self.tabCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES]; } #pragma mark - @@ -302,6 +306,9 @@ XPHomeRecommendViewControllerDelegate> @property (nonatomic, copy) NSArray *bannerInfoList; @property (nonatomic, copy) NSArray *secondBannerInfoList; +@property(nonatomic, assign) NSInteger maxReloadTagsLimitCount; +@property(nonatomic, assign) NSInteger reloadTagsLimitCount; + @end @implementation XPNewHomeViewController @@ -328,6 +335,9 @@ XPHomeRecommendViewControllerDelegate> - (void)viewDidLoad { [super viewDidLoad]; if(self.isEmpty == NO){ + self.maxReloadTagsLimitCount = 5; + self.reloadTagsLimitCount = 0; + [self initSubViews]; [self initSubViewConstraints]; @@ -343,7 +353,6 @@ XPHomeRecommendViewControllerDelegate> - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - [self.pagingView.mainTableView.mj_header beginRefreshing]; } - (void)viewWillDisappear:(BOOL)animated { @@ -380,7 +389,10 @@ XPHomeRecommendViewControllerDelegate> self.type = 0; self.view.backgroundColor = [UIColor clearColor]; [self.view addSubview:self.pagingView]; - [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(openRoomNotification:) name:kOpenRoomNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(openRoomNotification:) + name:kOpenRoomNotification + object:nil]; if([[AccountInfoStorage instance] getUid].length == 0){ return; @@ -405,6 +417,7 @@ XPHomeRecommendViewControllerDelegate> [self.navigationController pushViewController:sessionVC animated:YES]; [ClientConfig shareConfig].pushChatId = nil; } + MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(headerRefresh)]; header.stateLabel.font = [UIFont systemFontOfSize:10.0]; header.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:10.0]; @@ -426,9 +439,11 @@ XPHomeRecommendViewControllerDelegate> [self.pagingView.mainTableView.mj_header endRefreshing]; [self.pagingView.mainTableView.mj_footer endRefreshing]; } + -(void)logOut{ [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(requestCheckIp) object:nil]; } + -(void)headerRefresh{ [self.presenter getHomeTopData]; [self.presenter getHomeRanks]; @@ -442,6 +457,10 @@ XPHomeRecommendViewControllerDelegate> @kStrongify(self); [self handleTapBannerItem:itemModel]; }]; + +// if (self.tagModelList.count == 0) { + [self.presenter getHomeTagList]; +// } } -(void)openRoomNotification:(NSNotification *)notification{ @@ -462,7 +481,6 @@ XPHomeRecommendViewControllerDelegate> }else{ [ClientConfig shareConfig].chatId = nil; } - } return; } @@ -642,9 +660,12 @@ XPHomeRecommendViewControllerDelegate> ///获取所有的tag成功 - (void)getHomeTagListSuccess:(NSArray *)array{ if(array.count == 0) { - [self.pagingView.mainTableView.mj_header endRefreshing]; + [self getHomeTagListFailure]; return; } + + self.reloadTagsLimitCount = 0; + NSMutableArray *list = [NSMutableArray new]; NSMutableArray *titleArray = [NSMutableArray array]; for (PIHomeCategoryTitleModel *model in array) { @@ -667,6 +688,24 @@ XPHomeRecommendViewControllerDelegate> - (void)getHomeTagListFailure { [self.pagingView.mainTableView.mj_header endRefreshing]; + [self tryReloadTags]; +} + +- (void)tryReloadTags { + if (self.reloadTagsLimitCount >= self.maxReloadTagsLimitCount) { + return; + } + self.reloadTagsLimitCount += 1; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.pagingView.mainTableView.mj_header beginRefreshing]; + }); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.presenter getHomeTagList]; + }); +} + +- (void)displayEmpatyDataView { + } - (void)homeChatPickSuccess:(NSString *)uid { diff --git a/YuMi/Modules/YMRoom/Model/RoomInfoModel.h b/YuMi/Modules/YMRoom/Model/RoomInfoModel.h index 5dcba229..255daca1 100644 --- a/YuMi/Modules/YMRoom/Model/RoomInfoModel.h +++ b/YuMi/Modules/YMRoom/Model/RoomInfoModel.h @@ -17,6 +17,8 @@ typedef NS_ENUM(NSInteger, RoomType) { RoomType_MiniGame = 7,//小游戏房 RoomType_10Mic = 8,//10 个麦位 RoomType_15Mic = 9,//15 个麦位 + RoomType_19Mic = 19,//19 个麦位 + RoomType_20Mic = 20,//20 个麦位 }; typedef NS_ENUM(NSInteger, RoomModeType){ @@ -180,6 +182,10 @@ typedef NS_ENUM(NSInteger, RoomDatingStateChangeType) { /// 右下角的配置项 @property (nonatomic, strong) RoomBottomEntranceModel *rightBottomIconConfig; +@property(nonatomic, copy) NSString *roomLevelIcon; //房间等级图标 +@property(nonatomic, assign) NSInteger usedMicSkinId; //使用中的麦位皮肤id +@property(nonatomic, assign) NSInteger usedMicEffectId; //使用中的麦位特效id + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.h b/YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.h new file mode 100644 index 00000000..60cbe8a2 --- /dev/null +++ b/YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.h @@ -0,0 +1,61 @@ +// +// RoomLevelInfoModel.h +// YuMi +// +// Created by P on 2024/12/25. +// + +#import "PIBaseModel.h" + +NS_ASSUME_NONNULL_BEGIN + +typedef enum : NSUInteger { + MicResourceType_Skin = 1, + MicResourceType_Effect = 2, +} MicResourceType; + +@interface RoomMicInfoModel : PIBaseModel + +// 房间内选择 mode 页面使用 +//@property(nonatomic, copy) NSString *status; +//@property(nonatomic, copy) NSString *dressUrl; +//@property(nonatomic, copy) NSString *createTime; +//@property(nonatomic, copy) NSString *updateTime; + +// 通用参数 +@property(nonatomic, copy) NSString *id; +@property(nonatomic, assign) NSInteger reachLevel; +@property(nonatomic, assign) MicResourceType dressType; + +// API:client/resource 使用 +@property(nonatomic, copy) NSString *normalMicLockUrl; +@property(nonatomic, copy) NSString *bossMicLockUrl; +@property(nonatomic, copy) NSString *normalMicUrl; +@property(nonatomic, copy) NSString *bossMicUrl; + ++ (RoomMicInfoModel *)emptySkinModel; ++ (RoomMicInfoModel *)emptyEffectModel; + +@end + +@interface RoomLevelInfoModel : PIBaseModel + +@property(nonatomic, assign) NSInteger roomVal; +@property(nonatomic, assign) NSInteger usedMicSkinId; +@property(nonatomic, assign) NSInteger usedMicEffectId; + +@property(nonatomic, assign) NSInteger nextLevel; +@property(nonatomic, assign) NSInteger nextLevelExp; +@property(nonatomic, assign) NSInteger currentLevel; +@property(nonatomic, assign) NSInteger currentLevelExp; +@property(nonatomic, copy) NSString *currentLevelIcon; + +@property(nonatomic, assign) NSInteger managerLimitNum; +@property(nonatomic, assign) NSInteger currentManagerNum; + +@property(nonatomic, copy) NSArray *micSkins; +@property(nonatomic, copy) NSArray *micEffects; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.m b/YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.m new file mode 100644 index 00000000..14737a12 --- /dev/null +++ b/YuMi/Modules/YMRoom/Model/RoomLevelInfoModel.m @@ -0,0 +1,36 @@ +// +// RoomLevelInfoModel.m +// YuMi +// +// Created by P on 2024/12/25. +// + +#import "RoomLevelInfoModel.h" + +@implementation RoomMicInfoModel + ++ (RoomMicInfoModel *)emptySkinModel { + RoomMicInfoModel *model = [[RoomMicInfoModel alloc] init]; + model.id = @"-1"; + model.dressType = MicResourceType_Skin; + return model; +} + ++ (RoomMicInfoModel *)emptyEffectModel { + RoomMicInfoModel *model = [[RoomMicInfoModel alloc] init]; + model.id = @"-1"; + model.dressType = MicResourceType_Effect; + return model; +} + +@end + +@implementation RoomLevelInfoModel ++ (NSDictionary *)objectClassInArray { + return @{ + @"micSkins":RoomMicInfoModel.class, + @"micEffects":RoomMicInfoModel.class, + }; +} + +@end diff --git a/YuMi/Modules/YMRoom/RoomResourceManager.h b/YuMi/Modules/YMRoom/RoomResourceManager.h new file mode 100644 index 00000000..0e4a9928 --- /dev/null +++ b/YuMi/Modules/YMRoom/RoomResourceManager.h @@ -0,0 +1,33 @@ +// +// RoomResourceManager.h +// YuMi +// +// Created by P on 2024/12/25. +// + +#import + +@class SVGAVideoEntity; + +NS_ASSUME_NONNULL_BEGIN + +@interface RoomResourceManager : NSObject + ++ (instancetype)sharedManager; + +- (void)cacheAPIData:(id)data; + +- (NSString *)loadMicNormalSkin:(NSString *)skinID isForLock:(BOOL)isLock; +- (NSString *)loadMicBossSkin:(NSString *)skinID isForLock:(BOOL)isLock; +- (SVGAVideoEntity *)loadMicSVGAVideo:(NSString *)effectID; + +- (void)updateCurrentSkinID:(NSInteger )skinID effectID:(NSInteger)effectID; + +- (UIImage *)loadMicBossSkinForLock:(BOOL)isLock; +- (UIImage *)loadMicNormalSKinForLock:(BOOL)isLock; +- (SVGAVideoEntity *)loadMicEffect; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/RoomResourceManager.m b/YuMi/Modules/YMRoom/RoomResourceManager.m new file mode 100644 index 00000000..a7d1c18c --- /dev/null +++ b/YuMi/Modules/YMRoom/RoomResourceManager.m @@ -0,0 +1,192 @@ +// +// RoomResourceManager.m +// YuMi +// +// Created by P on 2024/12/25. +// + +#import "RoomResourceManager.h" + +#import +#import "SDWebImageManager.h" +#import "RoomLevelInfoModel.h" + +@interface RoomResourceManager() + +@property (nonatomic, strong) NSOperationQueue *svgaParseOperationQueue; + +@property(nonatomic, copy) NSArray *roomMicInfos; +@property(nonatomic, strong) NSMutableDictionary *micSkins; +@property(nonatomic, strong) NSMutableDictionary *micBossSkins; +@property(nonatomic, strong) NSMutableDictionary *micNormalSkins; +@property(nonatomic, strong) NSMutableDictionary *micBossLockSkins; +@property(nonatomic, strong) NSMutableDictionary *micNormalLockSkins; +@property(nonatomic, strong) NSMutableDictionary *micEffectVideoItems; + +@property(nonatomic, assign) NSInteger currentSkinID; +@property(nonatomic, assign) NSInteger currentEffectID; + +@end + +@implementation RoomResourceManager + ++ (instancetype)sharedManager { + static RoomResourceManager *sharedManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedManager = [[self alloc] init]; + // 初始化操作队列 + sharedManager.svgaParseOperationQueue = [[NSOperationQueue alloc] init]; + sharedManager.svgaParseOperationQueue.maxConcurrentOperationCount = 1; // 串行执行 + + sharedManager.micSkins = [NSMutableDictionary dictionary]; + sharedManager.micEffectVideoItems = [NSMutableDictionary dictionary]; + sharedManager.micBossSkins = [NSMutableDictionary dictionary]; + sharedManager.micNormalSkins = [NSMutableDictionary dictionary]; + sharedManager.micBossLockSkins = [NSMutableDictionary dictionary]; + sharedManager.micNormalLockSkins = [NSMutableDictionary dictionary]; + }); + return sharedManager; +} + +- (void)cacheAPIData:(id)data { + if (!data) { + return; + } + if ([data isKindOfClass:[NSDictionary class]] ) { + NSArray *array = data[@"roomMicDressList"]; + + self.roomMicInfos = [RoomMicInfoModel modelsWithArray:array]; + for (RoomMicInfoModel *micInfo in self.roomMicInfos) { + switch (micInfo.dressType) { + case MicResourceType_Skin: { + [self preloadNormalSkin:micInfo.bossMicUrl forID:micInfo.id isForLock:NO isForBoss:YES]; + [self preloadNormalSkin:micInfo.normalMicUrl forID:micInfo.id isForLock:NO isForBoss:NO]; + [self preloadNormalSkin:micInfo.bossMicLockUrl forID:micInfo.id isForLock:YES isForBoss:YES]; + [self preloadNormalSkin:micInfo.normalMicLockUrl forID:micInfo.id isForLock:YES isForBoss:NO]; + } + break; + case MicResourceType_Effect: { + @kWeakify(self); + NSBlockOperation *preloadOperation = [NSBlockOperation blockOperationWithBlock:^{ + @kStrongify(self); + SVGAParser *p = [[SVGAParser alloc] init]; + @kWeakify(self); + [p parseWithURL:[NSURL URLWithString:micInfo.normalMicUrl] completionBlock:^(SVGAVideoEntity * _Nullable videoItem) { + @kStrongify(self); + [self.micEffectVideoItems setObject:videoItem forKey:micInfo.id]; + } failureBlock:nil]; + }]; +#if DEBUG + preloadOperation.completionBlock = ^{ + NSLog(@"Preload SVGA Task completed for URL: %@", micInfo.normalMicUrl); + }; +#endif + [self.svgaParseOperationQueue addOperation:preloadOperation]; + } + break; + + default: + break; + } + } + } +} + +- (void)preloadNormalSkin:(NSString *)url + forID:(NSString *)skinID + isForLock:(BOOL)isForLock + isForBoss:(BOOL)isForBoss { + @kWeakify(self); + NSBlockOperation *preloadOperation = [NSBlockOperation blockOperationWithBlock:^{ +// SVGAParser *p = [[SVGAParser alloc] init]; + @kStrongify(self); + @kWeakify(self); + [[SDWebImageManager sharedManager] loadImageWithURL:[NSURL URLWithString:url] + options:SDWebImageRetryFailed | SDWebImageHighPriority | SDWebImageHighPriority + progress:nil + completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) { + if (image) { + @kStrongify(self); + if (isForLock) { + if (isForBoss) { + [self.micBossLockSkins setObject:image forKey:skinID]; + } else { + [self.micNormalLockSkins setObject:image forKey:skinID]; + } + } else { + if (isForBoss) { + [self.micBossSkins setObject:image forKey:skinID]; + } else { + [self.micNormalSkins setObject:image forKey:skinID]; + } + } + } + }]; + }]; +#if DEBUG + preloadOperation.completionBlock = ^{ + NSLog(@"Preload Image Task completed for URL: %@", url); + }; +#endif + [self.svgaParseOperationQueue addOperation:preloadOperation]; +} + +- (NSString *)loadMicNormalSkin:(NSString *)skinID isForLock:(BOOL)isLock { + RoomMicInfoModel *micInfo = [self.micSkins objectForKey:skinID]; + if (micInfo) { + return isLock ? micInfo.normalMicLockUrl : micInfo.normalMicUrl; + } + return @""; +} + +- (NSString *)loadMicBossSkin:(NSString *)skinID isForLock:(BOOL)isLock { + RoomMicInfoModel *micInfo = [self.micSkins objectForKey:skinID]; + if (micInfo) { + return isLock ? micInfo.bossMicLockUrl : micInfo.bossMicUrl; + } + return @""; +} + +- (SVGAVideoEntity *)loadMicSVGAVideo:(NSString *)effectID { + SVGAVideoEntity *entity = [self.micEffectVideoItems objectForKey:effectID]; + return entity; +} + +- (void)updateCurrentSkinID:(NSInteger )skinID effectID:(NSInteger)effectID { + self.currentSkinID = skinID; + self.currentEffectID = effectID; +} + +//- (NSString *)loadMicNormalSkinForLock:(BOOL)isLock { +// return [self loadMicNormalSkin:@(self.currentSkinID).stringValue +// isForLock:isLock]; +//} +// +//- (NSString *)loadMicBossSkinForLock:(BOOL)isLock { +// return [self loadMicBossSkin:@(self.currentSkinID).stringValue +// isForLock:isLock]; +//} + +- (UIImage *)loadMicBossSkinForLock:(BOOL)isLock { + if (isLock) { + return [self.micBossLockSkins objectForKey:@(self.currentSkinID).stringValue]; + } else { + return [self.micBossSkins objectForKey:@(self.currentSkinID).stringValue]; + } +} + +- (UIImage *)loadMicNormalSKinForLock:(BOOL)isLock { + if (isLock) { + return [self.micNormalLockSkins objectForKey:@(self.currentSkinID).stringValue]; + } else { + return [self.micNormalSkins objectForKey:@(self.currentSkinID).stringValue]; + } +} + +- (SVGAVideoEntity *)loadMicEffect { + return [self loadMicSVGAVideo:@(self.currentEffectID).stringValue]; +} + +@end + diff --git a/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.h b/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.h index c2e1474f..8f2794e6 100644 --- a/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.h +++ b/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.h @@ -26,6 +26,8 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithDelegate:(id)delegate; - (void)updateView; +- (void)displayForMiniGame; +- (void)displayExpandButton:(BOOL)displayButton; - (void)updateForBoomDetailArray:(NSArray *)models; @end diff --git a/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.m b/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.m index c024f651..71fed7e3 100644 --- a/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.m +++ b/YuMi/Modules/YMRoom/View/ActivityContainerView/RoomSideMenu.m @@ -15,9 +15,12 @@ #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" @@ -28,11 +31,14 @@ #import "XPSailingViewController.h" #import "XCCurrentVCStackManager.h" #import "XPCandyTreeViewController.h" +#import "XPFirstRechargeSuccessView.h" #import "XPArrangeMicViewController.h" +#import "PIRoomActivityWebView.h" +#import "XPTreasureFairyViewController.h" UIKIT_EXTERN NSString *kShowFirstRechargeView; -@interface RoomSideMenu () +@interface RoomSideMenu () @property(nonatomic, strong) NSMutableArray *menuItemViews; @property (nonatomic, strong) RACSubject *menuItemViewsSubject; // 数据源信号 @@ -43,8 +49,8 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; @property(nonatomic, strong) UIButton *configEntranceMenuButton; @property(nonatomic, strong) UIButton *pkMenuButton; @property (nonatomic,strong) UIImageView *joinView; +@property(nonatomic,strong) PIRoomEnterRedPacketView *redPacketView; -@property (nonatomic, strong) UITableView *tableView; @property(nonatomic, strong) UIScrollView *scrollView; @property (nonatomic,strong) SDCycleScrollView *cycleScrollView; @property (nonatomic, weak) id hostDelegate; @@ -57,9 +63,13 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; @property (nonatomic, strong) NetImageView *loader_url_1; @property (nonatomic, strong) NetImageView *loader_url_2; +@property(nonatomic, strong) UIButton *expandButton; + +@property(nonatomic, assign) BOOL isExpand; + @end -// TODO: 补充红包视图 | 调整顺序 | 调整大小 | 支持收起展开 +// TODO: 补充红包视图 @implementation RoomSideMenu @@ -71,9 +81,6 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; - (instancetype)initWithDelegate:(id)delegate { self = [super init]; if (self) { -#if DEBUG - self.backgroundColor = [UIColor orangeColor]; -#endif self.menuItemViews = @[].mutableCopy; self.menuItemViewsSubject = [RACSubject subject]; self.hostDelegate = delegate; @@ -87,6 +94,7 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; - (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); @@ -98,6 +106,12 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; make.leading.trailing.bottom.equalTo(self); }]; + [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)); + }]; + @kWeakify(self); [self.menuItemViewsSubject subscribeNext:^(NSArray * _Nullable x) { @kStrongify(self); @@ -127,6 +141,16 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; [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; + } + }]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.menuItemViewsSubject sendNext:self.menuItemViews]; }); @@ -141,6 +165,16 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; } } +- (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 *)models { _boomModels = models; if (!models || models.count == 0) { @@ -160,8 +194,9 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; // 处理到顶级后可能找不到数据的异常 self.boomView.boomModel = [models lastObject]; } - - [self updateMenuItem:self.boomView isRemove:NO]; + if ((self.isExpand && self.expandButton.hidden == NO) || self.expandButton.hidden) { + [self updateMenuItem:self.boomView isRemove:NO]; + } } - (void)updateScrollView:(NSArray *)data { @@ -169,7 +204,8 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; [self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // 设置 contentSize - CGFloat width = self.scrollView.bounds.size.width; + CGFloat inset = 15; + CGFloat width = self.scrollView.bounds.size.width - 30; self.scrollView.contentSize = CGSizeMake(self.scrollView.bounds.size.width, MAX(self.scrollView.bounds.size.height, width * data.count)); @@ -178,7 +214,8 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; for (UIView *view in data) { [self.scrollView addSubview:view]; yOffset -= width; - view.frame = CGRectMake(0, yOffset, width, width); + view.frame = CGRectMake(inset, yOffset, width, width); + [view layoutIfNeeded]; } // 滚动到底部 @@ -208,8 +245,6 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; self.playList = [NSMutableArray arrayWithArray:playModels]; self.activityList = [NSMutableArray arrayWithArray:activityModels]; self.littleGameList = [NSMutableArray arrayWithArray:littleGameModels]; - - [self dealWithData]; [self onRoomUpdate]; return nil; @@ -360,6 +395,14 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; } } +- (void)setRedPacketList:(NSMutableArray *)redPacketList{ + _redPacketList = redPacketList; + self.redPacketView.redPacketList = redPacketList; + if(self.openRedPacketHandle){ + self.openRedPacketHandle(nil,self.hostDelegate.getRoomInfo.type,YES); + } +} + #pragma mark - User Response - (void)displayBoomInfoProgress { BoomInfoViewController *vc = [[BoomInfoViewController alloc] init]; @@ -435,7 +478,28 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; XPArrangeMicViewController * arrangeMicVC = [[XPArrangeMicViewController alloc] initWithInfo:info]; [self.hostDelegate.getCurrentNav presentViewController:arrangeMicVC animated:YES completion:nil]; }]; +} +- (void)didTapExpand { + self.isExpand = !self.isExpand; + + [self.menuItemViews removeAllObjects]; + [self.menuItemViewsSubject sendNext:self.menuItemViews]; + + if (self.isExpand) { + [self.expandButton setImage:kImage(@"side_menu_close") forState:UIControlStateNormal]; + [self mas_updateConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(kGetScaleWidth(260)); + }]; + + } else { + [self.expandButton setImage:kImage(@"side_menu_open") forState:UIControlStateNormal]; + [self mas_updateConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(kGetScaleWidth(160)); + }]; + } + [self layoutIfNeeded]; + [self onRoomUpdate]; } #pragma mark - Room Delegate @@ -444,54 +508,105 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; } - (void)onRoomUpdate { - RoomInfoModel * roomInfo = self.hostDelegate.getRoomInfo; - - [self updateConfigEntranceButtons:roomInfo]; - - if (roomInfo.roomModeType != RoomModeType_Open_PK_Mode) { - [self updateMenuItem:self.pkMenuButton isRemove:YES]; - } else { - [self updateMenuItem:self.pkMenuButton isRemove:NO]; - } - + RoomInfoModel *roomInfo = self.hostDelegate.getRoomInfo; + switch (roomInfo.type) { case RoomType_MiniGame: + [self displayForMiniGame]; + [self updateCycleView]; + break; + case RoomType_19Mic: + case RoomType_20Mic: { + [self.menuItemViews removeAllObjects]; + [self.menuItemViewsSubject sendNext:self.menuItemViews]; + + [self displayExpandButton:YES]; + + [self dealWithData]; + if (self.isExpand) { + [self loadPKView:roomInfo]; + [self loadJoinView:roomInfo]; + [self updateConfigEntranceButtons:roomInfo]; + [self updateMenuItem:self.boomView isRemove:NO]; + } + self.scrollView.hidden = NO; + self.cycleScrollView.hidden = YES; + } break; default: { - [self updateCycleView]; + [self displayExpandButton:NO]; - 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 * _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]; - } + [self dealWithData]; + [self loadPKView:roomInfo]; + [self loadJoinView:roomInfo]; + [self loadRedPacket:roomInfo]; + [self updateConfigEntranceButtons:roomInfo]; + [self updateMenuItem:self.boomView isRemove:NO]; + + self.scrollView.hidden = NO; + self.cycleScrollView.hidden = NO; } break; } -#if DEBUG - [self updateMenuItem:self.pkMenuButton isRemove:NO]; - [self updateMenuItem:self.joinView isRemove:NO]; -#endif + if(self.openRedPacketHandle){ + self.openRedPacketHandle(nil,self.hostDelegate.getRoomInfo.type,YES); + } +} + +- (void)loadRedPacket:(RoomInfoModel *)roomInfo { + self.redPacketView.type = roomInfo.type; + self.redPacketView.redPacketList = self.redPacketList; + [self updateMenuItem:self.redPacketView isRemove:NO]; +} + +- (void)loadPKView:(RoomInfoModel *)roomInfo { + if (roomInfo.roomModeType == RoomModeType_Open_PK_Mode && + (roomInfo.type == RoomType_Anchor || roomInfo.roomModeType == RoomModeType_Open_Blind)) { + [self updateMenuItem:self.pkMenuButton isRemove:NO]; + } +} + +- (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 * _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; + if (attachment.first == CustomMessageType_First_Recharge_Reward && attachment.second == Custom_Message_Sub_Room_First_Recharge_Reward) { + FirstRechargeModel *model = [FirstRechargeModel modelWithJSON:attachment.data]; + XPFirstRechargeSuccessView * firstRechargeView= [[XPFirstRechargeSuccessView alloc] init]; + firstRechargeView.rechargeInfo = model; + [TTPopup popupView:firstRechargeView style:TTPopupStyleAlert]; + } + } } - (void)handleNIMTextMessage:(NIMMessage *)message { @@ -499,23 +614,43 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; } - (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 - UITableViewDataSource - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - // Return number of menu items - return 5; // Adjust based on your needs -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MenuCell"]; - - // Configure cell based on index - // Add your menu items here - - return cell; +#pragma mark- PIRoomEnterRedPacketViewDelegate +-(void)openRedPacketWithModel:(XPRedPacketModel *)redModel{ + if(self.openRedPacketHandle){ + self.openRedPacketHandle(redModel,self.hostDelegate.getRoomInfo.type,NO); + } } #pragma mark - SDCycleScrollViewDelegate @@ -551,11 +686,31 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; } 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); + }]; + } } } @@ -588,23 +743,9 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; #pragma mark - Getters -- (UITableView *)tableView { - if (!_tableView) { - _tableView = [[UITableView alloc] init]; - _tableView.delegate = self; - _tableView.dataSource = self; - _tableView.transform = CGAffineTransformMakeScale(1, -1); - _tableView.backgroundColor = [UIColor clearColor]; - _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"MenuCell"]; - } - return _tableView; -} - - (UIScrollView *)scrollView { if (!_scrollView) { _scrollView = [[UIScrollView alloc] init]; - _scrollView.backgroundColor = [UIColor greenColor]; } return _scrollView; } @@ -617,6 +758,7 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; b.imageView.contentMode = UIViewContentModeScaleAspectFit; b.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; b.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; + b.tag = 101; _gambleMenuButton = b; } return _gambleMenuButton; @@ -630,6 +772,7 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; b.imageView.contentMode = UIViewContentModeScaleAspectFit; b.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; b.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; + b.tag = 102; _configEntranceMenuButton = b; } return _configEntranceMenuButton; @@ -638,9 +781,10 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; - (UIButton *)pkMenuButton { if (!_pkMenuButton) { UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; - [b setImage:[UIImage imageNamed:@"room_pk_panel_mini_icon"] forState:UIControlStateNormal]; + [b setBackgroundImage:[UIImage imageNamed:@"room_pk_panel_mini_icon"] forState:UIControlStateNormal]; [b addTarget:self action:@selector(didTapPKMenuButton) forControlEvents:UIControlEventTouchUpInside]; - b.imageView.contentMode = UIViewContentModeScaleAspectFill; + b.imageEdgeInsets = UIEdgeInsetsMake(4, 4, 4, 4); + b.tag = 105; _pkMenuButton = b; } return _pkMenuButton; @@ -671,6 +815,7 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; _boomView.userInteractionEnabled = YES; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(displayBoomInfoProgress)]; [_boomView addGestureRecognizer:tap]; + _boomView.tag = 103; } return _boomView; } @@ -683,6 +828,7 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; _joinView.contentMode = UIViewContentModeScaleAspectFit; UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapJoinDatingRecognizer)]; [_joinView addGestureRecognizer:tap]; + _joinView.tag = 104; } return _joinView; } @@ -701,4 +847,23 @@ UIKIT_EXTERN NSString *kShowFirstRechargeView; 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.delegate = self; + } + return _redPacketView; +} + @end diff --git a/YuMi/Modules/YMRoom/View/ArrangeMic/Model/XPArrangeMicInfoModel.h b/YuMi/Modules/YMRoom/View/ArrangeMic/Model/XPArrangeMicInfoModel.h index 091c9668..e42d8091 100644 --- a/YuMi/Modules/YMRoom/View/ArrangeMic/Model/XPArrangeMicInfoModel.h +++ b/YuMi/Modules/YMRoom/View/ArrangeMic/Model/XPArrangeMicInfoModel.h @@ -36,6 +36,8 @@ typedef NS_ENUM(NSInteger, ArrangeMicType) { @property (nonatomic,copy) NSString * nick; ///排麦的类型 @property (nonatomic,assign) ArrangeMicType type; + +@property(nonatomic, assign) NSInteger roomType; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/ArrangeMic/View/XPArrangeMicViewController.m b/YuMi/Modules/YMRoom/View/ArrangeMic/View/XPArrangeMicViewController.m index bccae14b..d3d24c51 100644 --- a/YuMi/Modules/YMRoom/View/ArrangeMic/View/XPArrangeMicViewController.m +++ b/YuMi/Modules/YMRoom/View/ArrangeMic/View/XPArrangeMicViewController.m @@ -251,11 +251,23 @@ if (result.count > 0) { for (NSString *key in result) { MicroQueueModel *microQueue = [self.micQueue objectForKey:key]; - MicroStateModel * micstatus= microQueue.microState; - if (![key isEqualToString:@"-1"] && !microQueue.userInfo && micstatus.posState == MicroPosStateType_Lock) { - return key; - break; - } + MicroStateModel *micstatus= microQueue.microState; + if (self.userInfo.roomType == 3) { // == RoomType_Game + if (![key isEqualToString:@"-1"] && !microQueue.userInfo && micstatus.posState == MicroPosStateType_Lock) { + return key; + break; + } + } else if (self.userInfo.roomType == 19) { + if (![key isEqualToString:@"6"] && !microQueue.userInfo && micstatus.posState == MicroPosStateType_Lock) { + return key; + break; + } + } else { + if (!microQueue.userInfo && micstatus.posState == MicroPosStateType_Lock) { + return key; + break; + } + } } } } diff --git a/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m b/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m index a0e94a99..3ee4ad70 100644 --- a/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m +++ b/YuMi/Modules/YMRoom/View/MenuContainerView/XPRoomMenuContainerView.m @@ -198,6 +198,7 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey; info.micQueue = [self.delegate 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; + info.roomType = roomInfo.type; XPArrangeMicViewController * arrangeMicVC = [[XPArrangeMicViewController alloc] initWithInfo:info]; [self.delegate.getCurrentNav presentViewController:arrangeMicVC animated:YES completion:nil]; }]; diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.h b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.h index 442c6455..512ffce7 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.h +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.h @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN */ @interface XPNetImageYYLabel : YYLabel +@property(nonatomic, copy) void(^updateLayoutSize)(CGSize size); @end diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m index 4a3289fb..591224ce 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPNetImageYYLabel.m @@ -27,6 +27,8 @@ YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:maxSize text:attributedTextCopy]; + + for (NSUInteger i = 0; i < layout.attachments.count; i++) { YYTextAttachment *attachment = [layout.attachments xpSafeObjectAtIndex:i]; @@ -49,6 +51,24 @@ attributedTextCopy = [self updateNetImageAttribute:imageView attributes:attributedTextCopy range:range]; + if (self.updateLayoutSize) { + if (isMSRTL()) { + CGSize size = [attributedTextCopy boundingRectWithSize:maxSize + options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin + context:nil].size; + self.updateLayoutSize(size); +#if DEBUG + NSLog(@" ;;;; content ! size: %@ ||| %@", attributedTextCopy.string, [NSValue valueWithCGSize:size]); +#endif + }else { + YYTextLayout *lastlayout = [YYTextLayout layoutWithContainerSize:maxSize + text:attributedTextCopy]; + self.updateLayoutSize(lastlayout.textBoundingSize); +#if DEBUG + NSLog(@"content ! size: %@ ||| %@", attributedTextCopy.string, [NSValue valueWithCGSize:layout.textBoundingSize]); +#endif + } + } } else { @kWeakify(self); [imageView loadImage:^(UIImage * _Nonnull image, NSURL * _Nonnull url) { @@ -76,6 +96,28 @@ attributes:attributedText range:range]; [super setAttributedText:updatedAttributes]; + + CGSize maxSize = CGSizeMake(kRoomMessageMaxWidth - 24, MAXFLOAT); + YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:maxSize + text:updatedAttributes]; + if (isMSRTL()) { + CGSize size = [updatedAttributes boundingRectWithSize:maxSize + options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin + context:nil].size; +#if DEBUG + NSLog(@"---- ;;;; content ! size: %@ ||| %@", updatedAttributes.string, [NSValue valueWithCGSize:size]); +#endif + if (self.updateLayoutSize) { + self.updateLayoutSize(size); + } + } else { +#if DEBUG + NSLog(@"---- content ! size: %@ ||| %@", updatedAttributes.string, [NSValue valueWithCGSize:layout.textBoundingSize]); +#endif + if (self.updateLayoutSize) { + self.updateLayoutSize(layout.textBoundingSize); + } + } } - (NSMutableAttributedString*)updateNetImageAttribute:(NetImageView*)imageView diff --git a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m index 479a945f..fd067970 100644 --- a/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m +++ b/YuMi/Modules/YMRoom/View/MessageContainerView/View/XPRoomMessageTableViewCell.m @@ -36,7 +36,7 @@ - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { [self initSubViews]; - [self initSubViewConstraints]; +// [self initSubViewConstraints]; } return self; } @@ -59,10 +59,16 @@ - (void)initSubViewConstraints { [self.bubbleImageView mas_makeConstraints:^(MASConstraintMaker *make) { +// make.leading.mas_equalTo(self.contentLabel).offset(-16); +// make.top.mas_equalTo(self.contentLabel).offset(0); +// make.bottom.mas_equalTo(self.contentLabel).offset(10); +// make.trailing.mas_equalTo(self.contentLabel).offset(20); + + make.centerY.mas_equalTo(self.contentLabel); + make.height.mas_equalTo(self.contentLabel).multipliedBy(1.2); make.leading.mas_equalTo(self.contentLabel).offset(-16); - make.top.mas_equalTo(self.contentLabel).offset(0); - make.bottom.mas_equalTo(self.contentLabel).offset(10); - make.trailing.mas_equalTo(self.contentLabel).offset(20); + make.trailing.mas_equalTo(self.contentLabel).offset(16); +// make.size.mas_equalTo(self.contentLabel).multipliedBy(1.2); }]; [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { @@ -137,6 +143,7 @@ -(void)clickBtnAction{ } + #pragma mark - Getters And Setters - (void)setMessageInfo:(XPMessageInfoModel *)messageInfo { if ([messageInfo.content isEqualToAttributedString:_messageInfo.content]) { @@ -149,21 +156,21 @@ if (self.isLeftBigImage) { self.leftBigImageView.imageUrl = messageInfo.boomImageUrl; } else { - [self updateLayout]; +// [self updateLayout]; } } } -- (void)updateLayout { - if ([NSString isEmpty:self.messageInfo.bubbleImageUrl]) { - [self updateLayoutWithoutBubble]; - }else { - [self updateLayoutWithBubble]; - } - - [self.contentView setNeedsLayout]; - [self.contentView layoutIfNeeded]; -} +//- (void)updateLayout { +// if ([NSString isEmpty:self.messageInfo.bubbleImageUrl]) { +// [self updateLayoutWithoutBubble:![NSString isEmpty:self.messageInfo.bubbleImageUrl]]; +// }else { +// [self updateLayoutWithBubble]; +// } +// +// [self.contentView setNeedsLayout]; +// [self.contentView layoutIfNeeded]; +//} - (void)updateLayoutWithBubble { // self.blurEffectView.hidden = !self.messageInfo.isHiddenBubble; @@ -176,44 +183,73 @@ self.bubbleImageView.image = [self resizableImage:cutImage]; }]; - [self.contentLabel mas_remakeConstraints:^(MASConstraintMaker *make) { - make.leading.mas_equalTo(self.messageInfo.contentLeftMargin); - make.top.mas_equalTo(0);//self.messageInfo.contentTopMargin); - make.bottom.mas_equalTo(- self.messageInfo.cellBottomMargin); -// make.width.mas_equalTo([self RTLLabelWidth]); - // 设置宽度限制 - make.width.mas_lessThanOrEqualTo([self RTLLabelWidth]).priority(UILayoutPriorityDefaultHigh); // 优先使用宽度限制 - make.trailing.mas_lessThanOrEqualTo(self.contentView).offset(-self.messageInfo.contentLeftMargin).priority(UILayoutPriorityRequired); // 当宽度到达边缘时,使用右间距 - }]; +// [self.contentLabel mas_remakeConstraints:^(MASConstraintMaker *make) { +// make.leading.mas_equalTo(self.messageInfo.contentLeftMargin); +// make.top.mas_equalTo(0);//self.messageInfo.contentTopMargin); +// make.bottom.mas_equalTo(- self.messageInfo.cellBottomMargin); +//// make.width.mas_equalTo([self RTLLabelWidth]); +// // 设置宽度限制 +// make.width.mas_lessThanOrEqualTo([self RTLLabelWidth]).priority(UILayoutPriorityDefaultHigh); // 优先使用宽度限制 +// make.trailing.mas_lessThanOrEqualTo(self.contentView).offset(-self.messageInfo.contentLeftMargin).priority(UILayoutPriorityRequired); // 当宽度到达边缘时,使用右间距 +// }]; - [self.bubbleImageView mas_remakeConstraints:^(MASConstraintMaker *make) { - make.center.mas_equalTo(self.contentLabel); - make.size.mas_equalTo(self.contentLabel).multipliedBy(1.1); - }]; +// [self.bubbleImageView mas_remakeConstraints:^(MASConstraintMaker *make) { +// make.center.mas_equalTo(self.contentLabel); +// make.size.mas_equalTo(self.contentLabel).multipliedBy(1.2); +// }]; } -- (void)updateLayoutWithoutBubble { +- (void)updateLayoutWithoutBubble:(BOOL)hasBubble layoutSize:(CGSize)size { // self.blurEffectView.hidden = NO; - self.bubbleImageView.image = [UIImage imageWithColor:[DJDKMIMOMColor messageBubbleColor]]; + [self.contentLabel mas_remakeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.messageInfo.contentTopMargin); make.bottom.mas_equalTo(-self.messageInfo.cellBottomMargin); make.leading.mas_equalTo(self.messageInfo.contentLeftMargin); // make.width.mas_equalTo([self RTLLabelWidth]); // 设置宽度限制 - make.width.mas_lessThanOrEqualTo([self RTLLabelWidth]).priority(UILayoutPriorityDefaultHigh); // 优先使用宽度限制 +// make.width.mas_lessThanOrEqualTo([self RTLLabelWidth]).priority(UILayoutPriorityDefaultHigh); // 优先使用宽度限制 + make.width.mas_lessThanOrEqualTo(size.width).priority(UILayoutPriorityDefaultHigh); // 优先使用宽度限制 // 设置右间距 make.trailing.mas_lessThanOrEqualTo(self.contentView).offset(-self.messageInfo.contentLeftMargin).priority(UILayoutPriorityRequired); // 当宽度到达边缘时,使用右间距 }]; - - [self.bubbleImageView mas_remakeConstraints:^(MASConstraintMaker *make) { - make.top.bottom.mas_equalTo(self.contentLabel); - make.leading.mas_equalTo(self.contentLabel).offset(-self.messageInfo.contentLeftMargin); - make.trailing.mas_equalTo(self.contentLabel).offset(self.messageInfo.contentLeftMargin); - }]; + + if (hasBubble) { + @kWeakify(self); + [self.bubbleImageView loadImageWithUrl:self.messageInfo.bubbleImageUrl + completion:^(UIImage * _Nonnull image, NSURL * _Nonnull url) { + @kStrongify(self); + UIImage *image1 = [UIImage imageWithCGImage:image.CGImage scale:2.0 orientation:UIImageOrientationUp]; + UIImage *cutImage = [image1 cropRightAndBottomPixels:2]; + self.bubbleImageView.image = [self resizableImage:cutImage]; + [self.bubbleImageView mas_remakeConstraints:^(MASConstraintMaker *make) { +// make.center.mas_equalTo(self.contentLabel); +// make.size.mas_equalTo(self.contentLabel).multipliedBy(1.2); +// make.centerY.mas_equalTo(self.contentLabel); +// make.height.mas_equalTo(size.height).multipliedBy(1.2); + make.top.bottom.mas_equalTo(self.contentLabel).inset(-4); + make.leading.trailing.mas_equalTo(self.contentLabel).inset(-16); +// make.leading.mas_equalTo(self.contentLabel).offset(-16); +// make.trailing.mas_equalTo(self.contentLabel).offset(16); + }]; + }]; + } else { + self.bubbleImageView.image = [UIImage imageWithColor:[DJDKMIMOMColor messageBubbleColor]]; + [self.bubbleImageView mas_remakeConstraints:^(MASConstraintMaker *make) { +// make.top.bottom.mas_equalTo(self.contentLabel).inset(-4); +// make.leading.trailing.mas_equalTo(self.contentLabel).inset(-16); + make.top.bottom.mas_equalTo(self.contentLabel); + make.leading.mas_equalTo(self.contentLabel).offset(-self.messageInfo.contentLeftMargin); + make.trailing.mas_equalTo(self.contentLabel).offset(self.messageInfo.contentLeftMargin); + }]; + } } - (CGSize)RTLLabelSize { + CGSize maxSize = CGSizeMake(kRoomMessageMaxWidth - 24, MAXFLOAT); + YYTextLayout *layout = [YYTextLayout layoutWithContainerSize:maxSize + text:self.contentLabel.attributedText]; + return layout.textBoundingSize; return [self.contentLabel.attributedText boundingRectWithSize:CGSizeMake(kRoomMessageMaxWidth, 0) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin context:nil].size; @@ -264,6 +300,12 @@ _contentLabel.preferredMaxLayoutWidth = kRoomMessageMaxWidth ; _contentLabel.numberOfLines = 0; _contentLabel.userInteractionEnabled = YES; + @kWeakify(self); + [_contentLabel setUpdateLayoutSize:^(CGSize size) { + @kStrongify(self); + [self updateLayoutWithoutBubble:![NSString isEmpty:self.messageInfo.bubbleImageUrl] + layoutSize:size]; + }]; } return _contentLabel; } diff --git a/YuMi/Modules/YMRoom/View/MoreView/View/XPRoomMoreMenuViewController.m b/YuMi/Modules/YMRoom/View/MoreView/View/XPRoomMoreMenuViewController.m index 771466b3..a07e49c0 100644 --- a/YuMi/Modules/YMRoom/View/MoreView/View/XPRoomMoreMenuViewController.m +++ b/YuMi/Modules/YMRoom/View/MoreView/View/XPRoomMoreMenuViewController.m @@ -45,6 +45,8 @@ #import "XPMoreMenuProtocol.h" #import "CustomRoomBGContentViewController.h" +#import "RoomModeViewController.h" + UIKIT_EXTERN NSString * const kRoomGiftEffectUpdateNotificationKey; @@ -501,9 +503,13 @@ UIKIT_EXTERN NSString * const kRoomGiftEffectUpdateNotificationKey; break; case RoomMoreMenuType_Room_Type_Setting: { [self dismissViewControllerAnimated:NO completion:nil]; - XPRoomTypeSelectionViewController *micSelectionVC = [[XPRoomTypeSelectionViewController alloc] init]; - micSelectionVC.model = self.hostDelegate.getRoomInfo; - [self.hostDelegate.getCurrentNav pushViewController:micSelectionVC animated:YES]; + RoomModeViewController *vc = [[RoomModeViewController alloc] init]; + vc.roomInfo = self.hostDelegate.getRoomInfo; + [self.hostDelegate.getCurrentNav pushViewController:vc animated:YES]; + +// XPRoomTypeSelectionViewController *micSelectionVC = [[XPRoomTypeSelectionViewController alloc] init]; +// micSelectionVC.model = self.hostDelegate.getRoomInfo; +// [self.hostDelegate.getCurrentNav pushViewController:micSelectionVC animated:YES]; } break; case RoomMoreMenuType_Room_Type_Background: { diff --git a/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.h b/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.h index 09ef8bd0..6d5eaa54 100644 --- a/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.h +++ b/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.h @@ -13,6 +13,7 @@ NS_ASSUME_NONNULL_BEGIN @interface RoomHeaderView : UIView - (void)showSharePanel; +- (void)updateLevel:(NSString *)levelIcon; - (instancetype)initWithDelegate:(id)delegate; @end diff --git a/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.m b/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.m index a06673de..f04293b7 100644 --- a/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.m +++ b/YuMi/Modules/YMRoom/View/RoomHeaderView/RoomHeaderView.m @@ -49,6 +49,7 @@ @property(nonatomic,strong) NetImageView *avatarView; ///房间名字 @property (nonatomic,strong) MarqueeLabel *titleLabel; +@property(nonatomic, strong) NetImageView *levelImageView; ///礼物特效 @property (nonatomic,strong) UIImageView *giftEffectImageView; ///锁房标识 @@ -171,6 +172,7 @@ [self.titleStackView addArrangedSubview:self.titleLabel]; [self.titleStackView addArrangedSubview:self.giftEffectImageView]; [self.titleStackView addArrangedSubview:self.lockRoomImageView]; + [self.titleStackView addArrangedSubview:self.levelImageView]; } - (void)initSubViewConstraints { @@ -230,13 +232,21 @@ make.size.mas_equalTo(CGSizeMake(20,20)); }]; + [self.levelImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.size.mas_equalTo(CGSizeMake(40,16)); + }]; + [self.backBtn mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(15); make.height.width.mas_equalTo(20); make.centerY.mas_equalTo(self.settingButton); }]; - } + +- (void)updateLevel:(NSString *)levelIcon { + self.levelImageView.imageUrl = levelIcon; +} + #pragma mark - RoomGuestDelegate - (void)onRoomEntered { [self handleRoomInfoChange:NO]; @@ -262,6 +272,8 @@ self.collectButton.selected = roomInfo.isRoomFans; // 收藏后,房间数据没有及时更新到 room info,此时不需读 room info 状态 } self.lockRoomImageView.hidden = roomInfo.roomPwd.length <= 0; + self.levelImageView.hidden = [NSString isEmpty:roomInfo.roomLevelIcon]; + self.levelImageView.imageUrl = roomInfo.roomLevelIcon; } } @@ -269,8 +281,6 @@ #pragma mark - Event Response - (void)showSharePanel { - - XPShareItem *cycle = [XPShareItem itemWitTag:XPShareItemTagFaceBook title:@"FaceBook" imageName:@"share_fb" disableImageName:@"share_fb"]; XPShareItem *wechat = [XPShareItem itemWitTag:XPShareItemTagLine title:@"Line" imageName:@"share_line" disableImageName:@"share_line"]; XPShareItem *qq = [XPShareItem itemWitTag:XPShareItemTagCopyLink title:YMLocalizedString(@"RoomHeaderView3") imageName:@"share_copy_link" disableImageName:@"share_copy_link"]; @@ -582,4 +592,12 @@ } return _avatarView; } + +- (NetImageView *)levelImageView{ + if(!_levelImageView){ + _levelImageView = [[NetImageView alloc]init]; + } + return _levelImageView; +} + @end diff --git a/YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.h b/YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.h new file mode 100644 index 00000000..6580633b --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.h @@ -0,0 +1,30 @@ +// +// RoomModePresenter.h +// YuMi +// +// Created by P on 2024/12/23. +// + +#import "BaseMvpPresenter.h" + +#import "RoomInfoModel.h" +#import "RoomLevelInfoModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface RoomModePresenter : BaseMvpPresenter + +- (void)loadRoomLevelInfo:(NSInteger)roomUid + success:(void(^)(RoomLevelInfoModel *model))success + failure:(void(^)(NSError *error))failure; + +- (void)updateRoomMode:(RoomType)type + micSkinID:(NSInteger)micSkinID + micEffectID:(NSInteger)micEffectID + forRoom:(RoomInfoModel *)roomInfo + success:(void(^)(void))success + failure:(void(^)(NSError *error))failure; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.m b/YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.m new file mode 100644 index 00000000..be0de131 --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomMode/RoomModePresenter.m @@ -0,0 +1,66 @@ +// +// RoomModePresenter.m +// YuMi +// +// Created by P on 2024/12/23. +// + +#import "RoomModePresenter.h" + +#import "Api+RoomSetting.h" + +@implementation RoomModePresenter + +- (void)loadRoomLevelInfo:(NSInteger)roomUid + success:(void(^)(RoomLevelInfoModel *model))success + failure:(void(^)(NSError *error))failure { + [Api roomLevelInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if (success) { + RoomLevelInfoModel *model = [RoomLevelInfoModel modelWithJSON:data.data]; + NSMutableArray *tempArray_micSkin = @[[RoomMicInfoModel emptySkinModel]].mutableCopy; + [tempArray_micSkin addObjectsFromArray:model.micSkins]; + NSMutableArray *tempArray_micEffect = @[[RoomMicInfoModel emptyEffectModel]].mutableCopy; + [tempArray_micEffect addObjectsFromArray:model.micEffects]; + model.micEffects = tempArray_micEffect.copy; + model.micSkins = tempArray_micSkin.copy; + success(model); + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if (failure) { + failure([NSError errorWithDomain:msg code:code userInfo:nil]); + } + } showLoading:YES errorToast:YES] roomUid:@(roomUid).stringValue]; +} + +- (void)updateRoomMode:(RoomType)type + micSkinID:(NSInteger)micSkinID + micEffectID:(NSInteger)micEffectID + forRoom:(RoomInfoModel *)roomInfo + success:(void(^)(void))success + failure:(void(^)(NSError *error))failure { + NSMutableDictionary * params = [NSMutableDictionary dictionary]; + NSString * ticket = [AccountInfoStorage instance].getTicket; + [params setObject:ticket forKey:@"ticket"]; + [params setObject:@(roomInfo.uid).stringValue forKey:@"uid"]; + [params setObject:[NSString stringWithFormat:@"%ld", roomInfo.uid] forKey:@"roomUid"]; + if (roomInfo.title.length > 0) { + [params setObject:roomInfo.title forKey:@"title"]; + } + + [params setObject:@(micSkinID) forKey:@"usedMicSkinId"]; + [params setObject:@(micEffectID) forKey:@"usedMicEffectId"]; + + [params setObject:@(type) forKey:@"type"]; + + [Api ownerUpdateRoomInfo:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if (success) { + success(); + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if (failure) { + failure([NSError errorWithDomain:msg code:code userInfo:nil]); + } + } showLoading:YES errorToast:YES] params:params]; +} + +@end diff --git a/YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.h b/YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.h new file mode 100644 index 00000000..1de7df7f --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.h @@ -0,0 +1,18 @@ +// +// RoomModeViewController.h +// YuMi +// +// Created by P on 2024/12/23. +// + +#import "MvpViewController.h" +@class RoomInfoModel; +NS_ASSUME_NONNULL_BEGIN + +@interface RoomModeViewController : MvpViewController + +@property(nonatomic, strong) RoomInfoModel *roomInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.m b/YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.m new file mode 100644 index 00000000..8e7858e3 --- /dev/null +++ b/YuMi/Modules/YMRoom/View/RoomMode/RoomModeViewController.m @@ -0,0 +1,1151 @@ +// +// RoomModeViewController.m +// YuMi +// +// Created by P on 2024/12/23. +// + +#import "RoomModeViewController.h" + +#import + +#import "RoomModePresenter.h" +#import "RoomResourceManager.h" + +@interface RoomModeCollectionCell : UICollectionViewCell +@property(nonatomic, strong) RoomMicInfoModel *micInfoModel; +@property(nonatomic, strong) UIView *statusView; +@property(nonatomic, strong) NetImageView *imageView; +@property(nonatomic, strong) SVGAImageView *svgaImageView; +@property(nonatomic, strong) SVGAParser *parser; +@property(nonatomic, strong) UILabel *nameLabel; + ++ (void)registerTo:(UICollectionView *)collectionView; ++ (RoomModeCollectionCell *)cellFro:(UICollectionView *)collectionView indexPath:(NSIndexPath *)indexPath displayName:(BOOL)displayName; + +@end + +@implementation RoomModeCollectionCell + ++ (void)registerTo:(UICollectionView *)collectionView { + [collectionView registerClass:[self class] forCellWithReuseIdentifier:@"RoomModeCollectionCell"]; +} + ++ (RoomModeCollectionCell *)cellFro:(UICollectionView *)collectionView indexPath:(NSIndexPath *)indexPath displayName:(BOOL)displayName { + RoomModeCollectionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"RoomModeCollectionCell" forIndexPath:indexPath]; + cell.nameLabel.hidden = !displayName; + return cell; +} + +- (void)dealloc +{ + if (_svgaImageView) { + [self.svgaImageView stopAnimation]; + } +} + +- (void)setMicInfoModel:(RoomMicInfoModel *)micInfoModel { + _micInfoModel = micInfoModel; + + if ([micInfoModel.id isEqualToString:@"-1"]) { + if (micInfoModel.dressType == MicResourceType_Skin) { + self.imageView.image = kImage(@"room_mode_default_skin"); + }else { + self.imageView.backgroundColor = [UIColor colorWithWhite:1 alpha:0.5]; + [self.imageView setCornerRadius:20 + corners:kCALayerMaxXMaxYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner + borderWidth:1 + borderColor:[UIColor whiteColor]]; + } + } else { + if (micInfoModel.dressType == MicResourceType_Skin) { + self.imageView.imageUrl = micInfoModel.normalMicUrl; + } else { + [self playSVGA:micInfoModel.normalMicUrl]; + } + } +} + +- (void)playSVGA:(NSString *)path{ + if (!_svgaImageView) { + [self.contentView addSubview:self.svgaImageView]; + [self.svgaImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.imageView); + }]; + } + @kWeakify(self); + [self.parser parseWithURL:[NSURL URLWithString:path] completionBlock:^(SVGAVideoEntity * _Nullable videoItem) { + @kStrongify(self); + self.svgaImageView.loops = INT_MAX; + self.svgaImageView.clearsAfterStop = YES; + self.svgaImageView.videoItem = videoItem; + [self.svgaImageView startAnimation]; + } failureBlock:^(NSError * _Nullable error) { }]; +} + +- (void)prepareForReuse { + [super prepareForReuse]; + +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self.contentView addSubview:self.statusView]; + [self.statusView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.leading.trailing.mas_equalTo(self.contentView); + make.height.mas_equalTo(87); + }]; + + [self.contentView addSubview:self.nameLabel]; + [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.statusView.mas_bottom).offset(4); + make.leading.trailing.mas_equalTo(self.statusView); + make.height.mas_equalTo(18); + }]; + + [self.contentView addSubview:self.imageView]; + [self.imageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.mas_equalTo(self.statusView); + make.width.height.mas_equalTo(self.statusView.mas_height).multipliedBy(0.7); + }]; + } + return self; +} + +- (void)setSelected:(BOOL)selected { + self.statusView.backgroundColor = selected ? UIColorFromRGB(0xFF8C03) : UIColorFromRGB(0x1b1b1d); + self.nameLabel.textColor = [UIColor colorWithWhite:1 alpha:selected ? 1 : 0.5]; +} + +- (UIView *)statusView { + if (!_statusView) { + _statusView = [[UIView alloc] init]; + _statusView.backgroundColor = UIColorFromRGB(0x1b1b1d); + [_statusView setCornerRadius:12]; + } + return _statusView; +} + +- (UILabel *)nameLabel { + if (!_nameLabel) { + _nameLabel = [UILabel labelInitWithText:@"?" font:kFontRegular(18) textColor:[UIColor whiteColor]]; + _nameLabel.textAlignment = NSTextAlignmentCenter; + } + return _nameLabel; +} + +- (NetImageView *)imageView { + if (!_imageView) { + _imageView = [[NetImageView alloc] init]; + _imageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _imageView; +} + +- (SVGAImageView *)svgaImageView { + if (!_svgaImageView) { + _svgaImageView = [[SVGAImageView alloc] init]; + _svgaImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _svgaImageView; +} + +- (SVGAParser *)parser{ + if(!_parser){ + _parser = [SVGAParser new]; + } + return _parser; +} + +@end + +@interface RoomModeOwnerCard : UITableViewCell +@property(nonatomic, strong) RoomInfoModel *roomInfo; +@property(nonatomic, strong) RoomLevelInfoModel *LevelInfo; +@property(nonatomic, strong) UIImageView *backgroundImageView; +@property(nonatomic, strong) NetImageView *avatarImage; +@property(nonatomic, strong) UILabel *nameLabel; +@property(nonatomic, strong) NetImageView *levelImage; +@property(nonatomic, strong) UILabel *valueLabel; +@property(nonatomic, strong) UILabel *adminLabel; +@property(nonatomic, strong) UILabel *currentLevelLabel; +@property(nonatomic, strong) UILabel *nextLevelLabel; +@property(nonatomic, strong) UIProgressView *expProgressView; +@property(nonatomic, strong) UILabel *expToNextLabel; + ++ (void)registerTo:(UITableView *)tableView; ++ (RoomModeOwnerCard *)cellFro:(UITableView *)tableView + indexPath:(NSIndexPath *)indexPath + roomInfo:(RoomInfoModel *)roomInfo + levelInfo:(RoomLevelInfoModel *)levelInfo; +@end + +@implementation RoomModeOwnerCard + ++ (CGFloat)cellHeight { + return 7 + 176 + 0; +} + ++ (void)registerTo:(UITableView *)tableView { + [tableView registerClass:[self class] forCellReuseIdentifier:@"RoomModeOwnerCard"]; +} + ++ (RoomModeOwnerCard *)cellFro:(UITableView *)tableView + indexPath:(NSIndexPath *)indexPath + roomInfo:(RoomInfoModel *)roomInfo + levelInfo:(RoomLevelInfoModel *)levelInfo { + RoomModeOwnerCard *card = [tableView dequeueReusableCellWithIdentifier:@"RoomModeOwnerCard" forIndexPath:indexPath]; + card.selectionStyle = UITableViewCellSelectionStyleNone; + card.backgroundColor = [UIColor clearColor]; + card.contentView.backgroundColor = [UIColor clearColor]; + card.roomInfo = roomInfo; + card.LevelInfo = levelInfo; + return card; +} + +- (void)setRoomInfo:(RoomInfoModel *)roomInfo { + _roomInfo = roomInfo; + self.avatarImage.imageUrl = roomInfo.avatar; + self.nameLabel.text = roomInfo.nick; +} + +- (void)setLevelInfo:(RoomLevelInfoModel *)LevelInfo { + _LevelInfo = LevelInfo; + self.levelImage.imageUrl = LevelInfo.currentLevelIcon; + self.expProgressView.progress = (LevelInfo.roomVal - LevelInfo.currentLevelExp) * 100.0 / (LevelInfo.nextLevelExp - LevelInfo.currentLevel) / 100.0; + + self.valueLabel.text = [NSString stringWithFormat:@"%@%@", YMLocalizedString(@"1.0.33_text_6"), @(LevelInfo.roomVal)]; + self.nextLevelLabel.text = [NSString stringWithFormat:@"%@%@", YMLocalizedString(@"1.0.33_text_9"), @(LevelInfo.nextLevel)]; + self.currentLevelLabel.text = [NSString stringWithFormat:@"%@%@", YMLocalizedString(@"1.0.33_text_9"), @(LevelInfo.currentLevel)]; + self.expToNextLabel.text = [NSString stringWithFormat:@"%@%@", YMLocalizedString(@"1.0.33_text_8"), @(LevelInfo.nextLevelExp - LevelInfo.roomVal)]; + self.adminLabel.text = [NSString stringWithFormat:@"%@%@/%@", YMLocalizedString(@"1.0.33_text_7"), @(LevelInfo.currentManagerNum), @(LevelInfo.managerLimitNum)]; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self.contentView addSubview:self.backgroundImageView]; + [self.backgroundImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.contentView).offset(7); + make.leading.trailing.mas_equalTo(self.contentView).inset(15); + make.height.mas_equalTo(176); + }]; + + [self.contentView addSubview:self.avatarImage]; + [self.avatarImage mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.top.mas_equalTo(self.backgroundImageView).offset(18); + make.size.mas_equalTo(CGSizeMake(79, 79)); + }]; + + [self.contentView addSubview:self.nameLabel]; + [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.avatarImage); + make.leading.mas_equalTo(self.avatarImage.mas_trailing).offset(12); + make.trailing.mas_equalTo(self.backgroundImageView); + make.height.mas_equalTo(22); + }]; + + [self.contentView addSubview:self.levelImage]; + [self.levelImage mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.nameLabel.mas_bottom).offset(1); + make.leading.mas_equalTo(self.nameLabel); + make.size.mas_equalTo(CGSizeMake(52, 20)); + }]; + + [self.contentView addSubview:self.valueLabel]; + [self.valueLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.levelImage.mas_bottom).offset(1); + make.leading.mas_equalTo(self.nameLabel); + make.height.mas_equalTo(18); + }]; + + [self.contentView addSubview:self.adminLabel]; + [self.adminLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.valueLabel.mas_bottom).offset(1); + make.leading.mas_equalTo(self.nameLabel); + make.height.mas_equalTo(18); + }]; + + [self.contentView addSubview:self.currentLevelLabel]; + [self.currentLevelLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(self.avatarImage); + make.top.mas_equalTo(self.avatarImage.mas_bottom).offset(12); + make.size.mas_equalTo(CGSizeMake(40, 17)); + }]; + + [self.contentView addSubview:self.nextLevelLabel]; + [self.nextLevelLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.trailing.mas_equalTo(self.backgroundImageView).offset(-16); + make.top.mas_equalTo(self.avatarImage.mas_bottom).offset(12); + make.size.mas_equalTo(CGSizeMake(40, 17)); + }]; + + [self.contentView addSubview:self.expProgressView]; + [self.expProgressView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(self.currentLevelLabel); + make.trailing.mas_equalTo(self.nextLevelLabel); + make.top.mas_equalTo(self.currentLevelLabel.mas_bottom).offset(4); + make.height.mas_equalTo(6); + }]; + + [self.contentView addSubview:self.expToNextLabel]; + [self.expToNextLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.backgroundImageView); + make.bottom.mas_equalTo(self.backgroundImageView).offset(-16); + make.height.mas_equalTo(18); + }]; + } + return self; +} + +- (UIImageView *)backgroundImageView { + if (!_backgroundImageView) { + _backgroundImageView = [[UIImageView alloc] initWithImage:kImage(@"room_mode_card_bg")]; + } + return _backgroundImageView; +} + +- (NetImageView *)avatarImage { + if (!_avatarImage) { + _avatarImage = [[NetImageView alloc] init]; + [_avatarImage setCornerRadius:8 + corners:kCALayerMaxXMaxYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner + borderWidth:1 borderColor:[UIColor whiteColor]]; + } + return _avatarImage; +} + +- (UILabel *)nameLabel { + if (!_nameLabel) { + _nameLabel = [UILabel labelInitWithText:@"" font:kFontMedium(16) textColor:[UIColor whiteColor]]; + } + return _nameLabel; +} + +- (NetImageView *)levelImage { + if (!_levelImage) { + _levelImage = [[NetImageView alloc] init]; + } + return _levelImage; +} + +- (UILabel *)valueLabel { + if (!_valueLabel) { + _valueLabel = [UILabel labelInitWithText:YMLocalizedString(@"1.0.33_text_6") font:kFontRegular(12) textColor:[UIColor colorWithWhite:1 alpha:0.8]]; + } + return _valueLabel; +} + +- (UILabel *)adminLabel { + if (!_adminLabel) { + _adminLabel = [UILabel labelInitWithText:YMLocalizedString(@"1.0.33_text_7") font:kFontRegular(12) textColor:[UIColor colorWithWhite:1 alpha:0.8]]; + } + return _adminLabel; +} + +- (UILabel *)currentLevelLabel { + if (!_currentLevelLabel) { + _currentLevelLabel = [UILabel labelInitWithText:YMLocalizedString(@"1.0.33_text_9") font:kFontMedium(12) textColor:[UIColor whiteColor]]; + } + return _currentLevelLabel; +} + +- (UILabel *)nextLevelLabel { + if (!_nextLevelLabel) { + _nextLevelLabel = [UILabel labelInitWithText:YMLocalizedString(@"1.0.33_text_9") font:kFontMedium(12) textColor:[UIColor whiteColor]]; + _nextLevelLabel.textAlignment = NSTextAlignmentRight; + } + return _nextLevelLabel; +} + +- (UIProgressView *)expProgressView { + if (!_expProgressView) { + _expProgressView = [[UIProgressView alloc] init]; + _expProgressView.progressTintColor = [UIColor whiteColor]; + _expProgressView.trackTintColor = [UIColor colorWithWhite:1 alpha:0.2]; + _expProgressView.progress = 0.0; + } + return _expProgressView; +} + +- (UILabel *)expToNextLabel { + if (!_expToNextLabel) { + _expToNextLabel = [UILabel labelInitWithText:YMLocalizedString(@"1.0.33_text_8") font:kFontRegular(12) textColor:[UIColor colorWithWhite:1 alpha:0.8]]; + } + return _expToNextLabel; +} + +@end + +@interface RoomModeTypeCard : UITableViewCell + +@property(nonatomic, strong) UICollectionView *collectionView; + +@property(nonatomic, assign) RoomType type; +@property(nonatomic, copy)NSArray *dataSource; +@property(nonatomic, copy) void(^updateSelectedType)(RoomType type); ++ (void)registerTo:(UITableView *)tableView; ++ (RoomModeTypeCard *)cellFro:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath dataSource:(NSArray *)dataSource currentType:(RoomType)type; + +@end + +@implementation RoomModeTypeCard + ++ (CGFloat)cellHeight:(NSInteger)cellCount { + NSInteger line = cellCount/3 + cellCount%3; + return MAX(0, line) * (87 + 4 + 18) + MAX(0, line-1) * 10; +} + ++ (void)registerTo:(UITableView *)tableView { + [tableView registerClass:[self class] forCellReuseIdentifier:@"RoomModeTypeCard"]; +} + ++ (RoomModeTypeCard *)cellFro:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath dataSource:(NSArray *)dataSource currentType:(RoomType)type { + RoomModeTypeCard *card = [tableView dequeueReusableCellWithIdentifier:@"RoomModeTypeCard" forIndexPath:indexPath]; + card.selectionStyle = UITableViewCellSelectionStyleNone; + card.backgroundColor = [UIColor clearColor]; + card.contentView.backgroundColor = [UIColor clearColor]; + card.dataSource = dataSource; + card.type = type; + [card.collectionView reloadData]; + + NSInteger row = 0; + switch (type) { + case RoomType_Game: + row = 0; + break; + case RoomType_10Mic: + row = 1; + break; + case RoomType_15Mic: + row = 2; + break; + case RoomType_19Mic: + row = 4; + break; + case RoomType_20Mic: + row = 3; + break; + + default: + break; + } + + [card.collectionView selectItemAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0] animated:NO scrollPosition:UICollectionViewScrollPositionNone]; + + return card; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self.contentView addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.contentView).inset(15); + make.top.bottom.mas_equalTo(self.contentView); + }]; + } + return self; +} + +- (void)setDataSource:(NSArray *)dataSource { + _dataSource = dataSource; + [self.collectionView reloadData]; +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.dataSource.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + RoomModeCollectionCell *cell = [RoomModeCollectionCell cellFro:collectionView indexPath:indexPath displayName:YES]; + NSDictionary *dic = [self.dataSource xpSafeObjectAtIndex:indexPath.row]; + if (dic) { + cell.selected = [[dic objectForKey:@"isUses"] boolValue]; + NSString *imageName = [NSString stringWithFormat:@"room_mode_mic_%@_%@", [dic objectForKey:@"type"], cell.isSelected ? @"on" : @"off"]; + + cell.imageView.image = kImage(imageName); + cell.nameLabel.text = [dic objectForKey:@"name"]; + } + + return cell; +} + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + if (_updateSelectedType) { + RoomType selectedType = RoomType_Game; + switch (indexPath.row) { + case 0: + selectedType = RoomType_Game; + break; + case 1: + selectedType = RoomType_10Mic; + break; + case 2: + selectedType = RoomType_15Mic; + break; + case 3: + selectedType = RoomType_20Mic; + break; + case 4: + selectedType = RoomType_19Mic; + break; + + default: + break; + } + self.updateSelectedType(selectedType); + } +} + +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.itemSize = CGSizeMake((KScreenWidth - 31 - 14)/3, 87 + 4 + 18); + layout.minimumLineSpacing = 10; + layout.minimumInteritemSpacing = 4; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.delegate = self; + _collectionView.dataSource = self; + _collectionView.backgroundColor = [UIColor clearColor]; + _collectionView.scrollEnabled = NO; + [RoomModeCollectionCell registerTo:_collectionView]; + } + return _collectionView; +} + +@end + + +@interface RoomModeMicSkinCard : UITableViewCell + +@property(nonatomic, assign) NSInteger usedID; +@property(nonatomic, assign) NSInteger roomLevel; +@property(nonatomic, strong) UICollectionView *collectionView; +@property(nonatomic, strong) NSMutableArray *skins; + +@property(nonatomic, copy) void(^updateSelectedSkinID)(NSString *skinID); + ++ (void)registerTo:(UITableView *)tableView; ++ (RoomModeMicSkinCard *)cellFro:(UITableView *)tableView + indexPath:(NSIndexPath *)indexPath + skins:(NSArray *)skins + usedID:(NSInteger)usedID + roomLevel:(NSInteger)roomLevel; + +@end + +@implementation RoomModeMicSkinCard + ++ (CGFloat)cellHeight:(NSInteger)cellCount { + NSInteger line = cellCount/3 + cellCount%3; + return MAX(0, line) * (87) + MAX(0, line-1) * 10; +} + ++ (void)registerTo:(UITableView *)tableView { + [tableView registerClass:[self class] forCellReuseIdentifier:@"RoomModeMicSkinCard"]; +} ++ (RoomModeMicSkinCard *)cellFro:(UITableView *)tableView + indexPath:(NSIndexPath *)indexPath + skins:(NSArray *)skins + usedID:(NSInteger)usedID + roomLevel:(NSInteger)roomLevel { + RoomModeMicSkinCard *card = [tableView dequeueReusableCellWithIdentifier:@"RoomModeMicSkinCard" forIndexPath:indexPath]; + card.selectionStyle = UITableViewCellSelectionStyleNone; + card.backgroundColor = [UIColor clearColor]; + card.contentView.backgroundColor = [UIColor clearColor]; + + card.usedID = usedID; + card.roomLevel = roomLevel; + card.skins = skins.mutableCopy; + if (skins.count > 0) { + [card.collectionView reloadData]; + [card manualSelectedCell]; + } + + return card; +} + +- (void)manualSelectedCell { + __block NSInteger row = 0; + [self.skins enumerateObjectsUsingBlock:^(RoomMicInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj.id isEqualToString:@(self.usedID).stringValue]) { + row = idx; + *stop = YES; + } + }]; + + [self.collectionView selectItemAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0] + animated:NO + scrollPosition:UICollectionViewScrollPositionNone]; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self.contentView addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.contentView).inset(15); + make.top.bottom.mas_equalTo(self.contentView); + }]; + [self.collectionView reloadData]; + } + return self; +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.skins.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + RoomModeCollectionCell *cell = [RoomModeCollectionCell cellFro:collectionView indexPath:indexPath displayName:NO]; + cell.micInfoModel = [self.skins xpSafeObjectAtIndex:indexPath.row]; + return cell; +} + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + RoomMicInfoModel *model = [self.skins xpSafeObjectAtIndex:indexPath.row]; + if ([model.id isEqualToString:@(self.usedID).stringValue] || (model.id.integerValue == -1 && self.usedID == 0)) { + return; + } + if (model.reachLevel <= self.roomLevel) { + if (self.updateSelectedSkinID) { + self.updateSelectedSkinID(model.id); + } + } else { + [self manualSelectedCell]; + [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"1.0.33_text_15")]; + } +} + +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.itemSize = CGSizeMake((KScreenWidth - 31 - 14)/3, 87); + layout.minimumLineSpacing = 10; + layout.minimumInteritemSpacing = 4; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.delegate = self; + _collectionView.dataSource = self; + _collectionView.backgroundColor = [UIColor clearColor]; + _collectionView.scrollEnabled = NO; + [RoomModeCollectionCell registerTo:_collectionView]; + } + return _collectionView; +} + +@end + +@interface RoomModeMicEffectCard : UITableViewCell +@property(nonatomic, assign) NSInteger usedID; +@property(nonatomic, assign) NSInteger roomLevel; +@property(nonatomic, strong) NSMutableArray *effects; +@property(nonatomic, strong) UICollectionView *collectionView; +@property(nonatomic, copy) void(^updateSelectedEffectID)(NSString *effectID); + ++ (void)registerTo:(UITableView *)tableView; ++ (RoomModeMicEffectCard *)cellFro:(UITableView *)tableView + indexPath:(NSIndexPath *)indexPath + effects:(NSArray *)effects + usedID:(NSInteger)usedID + roomLevel:(NSInteger)roomLevel ; + +@end + +@implementation RoomModeMicEffectCard + ++ (CGFloat)cellHeight:(NSInteger)cellCount { + NSInteger line = cellCount/3 + cellCount%3; + return MAX(0, line) * (87) + MAX(0, line-1) * 10; +} + ++ (void)registerTo:(UITableView *)tableView { + [tableView registerClass:[self class] forCellReuseIdentifier:@"RoomModeMicEffectCard"]; +} ++ (RoomModeMicEffectCard *)cellFro:(UITableView *)tableView + indexPath:(NSIndexPath *)indexPath + effects:(NSArray *)effects + usedID:(NSInteger)usedID + roomLevel:(NSInteger)roomLevel { + RoomModeMicEffectCard *card = [tableView dequeueReusableCellWithIdentifier:@"RoomModeMicEffectCard" forIndexPath:indexPath]; + card.selectionStyle = UITableViewCellSelectionStyleNone; + card.backgroundColor = [UIColor clearColor]; + card.contentView.backgroundColor = [UIColor clearColor]; + + card.usedID = usedID; + card.roomLevel = roomLevel; + card.effects = effects.mutableCopy; + if (effects.count > 0) { + [card.collectionView reloadData]; + [card manualSelectedCell]; + } + + return card; +} + +- (void)manualSelectedCell { + __block NSInteger row = 0; + [self.effects enumerateObjectsUsingBlock:^(RoomMicInfoModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj.id isEqualToString:@(self.usedID).stringValue]) { + row = idx; + *stop = YES; + } + }]; + + [self.collectionView selectItemAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0] animated:NO scrollPosition:UICollectionViewScrollPositionNone]; +} + +- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self.contentView addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.contentView).inset(15); + make.top.bottom.mas_equalTo(self.contentView); + }]; + [self.collectionView reloadData]; + } + return self; +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.effects.count; +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + RoomModeCollectionCell *cell = [RoomModeCollectionCell cellFro:collectionView indexPath:indexPath displayName:NO]; + cell.micInfoModel = [self.effects xpSafeObjectAtIndex:indexPath.row]; + return cell; +} + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + RoomMicInfoModel *model = [self.effects xpSafeObjectAtIndex:indexPath.row]; + if ([model.id isEqualToString:@(self.usedID).stringValue] || (model.id.integerValue == -1 && self.usedID == 0)) { + return; + } + if (model.reachLevel <= self.roomLevel) { + if (self.updateSelectedEffectID) { + self.updateSelectedEffectID(model.id); + } + } else { + [self manualSelectedCell]; + [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"1.0.33_text_15")]; + } +} + +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.itemSize = CGSizeMake((KScreenWidth - 31 - 14)/3, 87); + layout.minimumLineSpacing = 10; + layout.minimumInteritemSpacing = 4; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.delegate = self; + _collectionView.dataSource = self; + _collectionView.backgroundColor = [UIColor clearColor]; + _collectionView.scrollEnabled = NO; + [RoomModeCollectionCell registerTo:_collectionView]; + } + return _collectionView; +} + +@end + +@interface RoomModeViewController () + +@property(nonatomic, strong) RoomLevelInfoModel *levelInfo; + +@property(nonatomic, assign) RoomType originalRoomType; +@property(nonatomic, assign) RoomType updatedRoomType; +@property(nonatomic, copy) NSString *updatedMicSkinID; +@property(nonatomic, copy) NSString *updatedMicEffectID; + +@property(nonatomic, strong) UIButton *useButton; +@property(nonatomic, strong) UITableView *tableView; + +@property(nonatomic, strong) NSMutableArray *typeDataSource; +@property(nonatomic, strong) NSMutableArray *micSkinDataSource; +@property(nonatomic, strong) NSMutableArray *micEffectDataSource; + +@end + +// TODO: 补充缓存的使用 / 补充跳转到 web + +@implementation RoomModeViewController + +- (RoomModePresenter *)createPresenter { + return [[RoomModePresenter alloc] init]; +} + +- (BOOL)isHiddenNavBar { + return YES; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.typeDataSource = @[ + @{@"type":@(9), @"name":YMLocalizedString(@"1.0.33_text_10"), @"isUsed":@(YES)}, + @{@"type":@(10), @"name":YMLocalizedString(@"1.0.33_text_11"), @"isUsed":@(NO)}, + @{@"type":@(15), @"name":YMLocalizedString(@"1.0.33_text_12"), @"isUsed":@(NO)}, + @{@"type":@(20), @"name":YMLocalizedString(@"1.0.33_text_13"), @"isUsed":@(NO)}, + @{@"type":@(19), @"name":YMLocalizedString(@"1.0.33_text_14"), @"isUsed":@(NO)}, + ].mutableCopy; + self.micSkinDataSource = @[].mutableCopy; + self.micEffectDataSource = @[].mutableCopy; + + [self setupUI]; + + [self loadRoomLevelInfo]; +} + +#pragma mark - +- (void)setupUI { + self.view.backgroundColor = [UIColor blackColor]; + [self setupNavigationBar]; + [self setupTableView]; + [self setupUseButton]; +} + +- (void)setupNavigationBar { + UILabel *titleLabel = [self titleLabel]; + UIButton *backButton = [self backButton]; + UIButton *helpButton = [self helpButton]; + [self.view addSubview:titleLabel]; + [self.view addSubview:backButton]; + [self.view addSubview:helpButton]; + + [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerX.mas_equalTo(self.view); + make.top.mas_equalTo(self.view).offset(kStatusBarHeight); + make.height.mas_equalTo(22); + }]; + + [backButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.mas_equalTo(self.view).offset(16); + make.centerY.mas_equalTo(titleLabel); + make.size.mas_equalTo(CGSizeMake(22, 22)); + }]; + + [helpButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.trailing.mas_equalTo(self.view).offset(-16); + make.centerY.mas_equalTo(titleLabel); + make.width.height.mas_equalTo(44); + }]; +} + +- (void)setupTableView { + [self.view addSubview:self.tableView]; + [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.view).offset(kNavigationHeight); + make.leading.trailing.mas_equalTo(self.view); + make.bottom.mas_equalTo(self.view).offset(-(kSafeAreaBottomHeight + 40)); + }]; +} + +- (void)setupUseButton { + [self.view addSubview:self.useButton]; + [self.useButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.bottom.mas_equalTo(self.view).offset(-kSafeAreaBottomHeight); + make.leading.trailing.mas_equalTo(self.view).inset(15); + make.height.mas_equalTo(40); + }]; +} + +#pragma mark - +- (void)didTapBack { + [self.navigationController popViewControllerAnimated:YES]; +} + +- (void)didTapHelp { + +} + +- (void)didTapUse { + [self updateRoomMode]; +} + +#pragma mark - +- (void)loadRoomLevelInfo { + self.updatedRoomType = self.roomInfo.type; + self.originalRoomType = self.roomInfo.type; + self.updatedMicSkinID = @(self.roomInfo.usedMicSkinId).stringValue; + self.updatedMicEffectID = @(self.roomInfo.usedMicEffectId).stringValue; + + @kWeakify(self); + [self.presenter loadRoomLevelInfo:self.roomInfo.uid + success:^(RoomLevelInfoModel * _Nonnull model) { + @kStrongify(self); + + self.levelInfo = model; + [self.tableView reloadData]; + } failure:^(NSError * _Nonnull error) { + + }]; +} + +- (void)updateRoomMode { + if (self.updatedRoomType < self.originalRoomType) { + @kWeakify(self); + [TTPopup alertWithMessage:YMLocalizedString(@"XPRoomTypeSelectionViewController3") + confirmHandler:^{ + @kStrongify(self); + [self requestRoomUpdate]; + } cancelHandler:^{}]; + } else { + [self requestRoomUpdate]; + } +} + +- (void)requestRoomUpdate { + @kWeakify(self); + [self.presenter updateRoomMode:self.updatedRoomType + micSkinID:self.updatedMicSkinID.integerValue + micEffectID:self.updatedMicEffectID.integerValue + forRoom:self.roomInfo + success:^{ + @kStrongify(self); + [self.navigationController popViewControllerAnimated:YES]; + } failure:^(NSError * _Nonnull error) { + + }]; +} + +#pragma mark - UITableView DataSource & Delegate +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + return 4; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { + switch (section) { + case 0: + return 0; + break; + case 1: + case 2: + case 3: + return 66; + break; + + default: + return 0; + break; + } +} + +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { + NSString *content = @""; + switch (section) { + case 1: + content = YMLocalizedString(@"1.0.33_text_2"); + break; + case 2: + content = YMLocalizedString(@"1.0.33_text_3"); + break; + case 3: + content = YMLocalizedString(@"1.0.33_text_4"); + break; + case 0: + default: + content = @""; + break; + } + + UILabel *label = [UILabel labelInitWithText:content + font:kFontMedium(16) + textColor:[UIColor whiteColor]]; + + UIView *headerView = [[UIView alloc] init]; + [headerView addSubview:label]; + [label mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(headerView); + make.leading.mas_equalTo(15); + make.height.mas_equalTo(22); + }]; + + return headerView; +} + +//- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { +// switch (section) { +// case 0: +// return @""; +// break; +// case 1: +// return YMLocalizedString(@"1.0.33_text_2"); +// break; +// case 2: +// return YMLocalizedString(@"1.0.33_text_3"); +// break; +// case 3: +// return YMLocalizedString(@"1.0.33_text_4"); +// break; +// +// default: +// return @""; +// break; +// } +//} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + switch (section) { + case 0: + return 1; + break; + case 1: + case 2: + case 3: + return 1; + break; + default: + return 0; + break; + } + return 1; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + switch (indexPath.section) { + case 0: + return [RoomModeOwnerCard cellHeight]; + break; + case 1: + return [RoomModeTypeCard cellHeight:4]; + break; + case 2: { + if (self.levelInfo) { + return [RoomModeMicSkinCard cellHeight:self.levelInfo.micSkins.count]; + } else { + return 10; + } + } + break; + case 3: + if (self.levelInfo) { + return [RoomModeMicEffectCard cellHeight:self.levelInfo.micEffects.count]; + } else { + return 10; + } + break; + default: + return 0; + break; + } +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + switch (indexPath.section) { + case 0: { + RoomModeOwnerCard *cell = [RoomModeOwnerCard cellFro:tableView + indexPath:indexPath + roomInfo:self.roomInfo + levelInfo:self.levelInfo]; + return cell; + } + break; + case 1: { + RoomModeTypeCard *cell = [RoomModeTypeCard cellFro:tableView + indexPath:indexPath + dataSource:self.typeDataSource.copy + currentType:self.roomInfo.type]; + @kWeakify(self); + [cell setUpdateSelectedType:^(RoomType type) { + @kStrongify(self); + self.updatedRoomType = type; + }]; + return cell; + } + break; + case 2: { + RoomModeMicSkinCard *cell = [RoomModeMicSkinCard cellFro:tableView + indexPath:indexPath + skins:self.levelInfo.micSkins + usedID:self.updatedMicSkinID.integerValue + roomLevel:self.levelInfo.currentLevel]; + @kWeakify(self); + [cell setUpdateSelectedSkinID:^(NSString *skinID) { + @kStrongify(self); + self.updatedMicSkinID = skinID; + }]; + return cell; + } + break; + case 3: { + RoomModeMicEffectCard *cell = [RoomModeMicEffectCard cellFro:tableView + indexPath:indexPath + effects:self.levelInfo.micEffects + usedID:self.updatedMicEffectID.integerValue + roomLevel:self.levelInfo.currentLevel]; + @kWeakify(self); + [cell setUpdateSelectedEffectID:^(NSString *effectID) { + @kStrongify(self); + self.updatedMicEffectID = effectID; + }]; + return cell; + } + break; + + default: + return [UITableViewCell new]; + break; + } +} + +#pragma mark - +- (UIButton *)backButton { + UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; + [b setImage:[kImage(@"common_nav_back_white") ms_SetImageForRTL] + forState:UIControlStateNormal]; + [b addTarget:self + action:@selector(didTapBack) + forControlEvents:UIControlEventTouchUpInside]; + return b; +} + +- (UILabel *)titleLabel { + UILabel *label = [[UILabel alloc] init]; + label.textAlignment = NSTextAlignmentCenter; + label.font = kFontMedium(17); + label.text = YMLocalizedString(@"1.0.33_text_1"); + label.textColor = UIColorFromRGB(0xD9E7F7); + return label; +} + +- (UIButton *)helpButton { + UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; + [b setImage:kImage(@"room_mode_help") forState:UIControlStateNormal]; + + [b addTarget:self action:@selector(didTapHelp) forControlEvents:UIControlEventTouchUpInside]; + return b; +} + +- (UITableView *)tableView { + if (!_tableView) { + _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, kNavigationHeight, KScreenWidth, KScreenHeight - kNavigationHeight) style:UITableViewStyleGrouped]; + _tableView.delegate = self; + _tableView.dataSource = self; + _tableView.backgroundColor = [UIColor clearColor]; + _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + [RoomModeOwnerCard registerTo:_tableView]; + [RoomModeTypeCard registerTo:_tableView]; + [RoomModeMicSkinCard registerTo:_tableView]; + [RoomModeMicEffectCard registerTo:_tableView]; + + UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 60)]; + _tableView.tableFooterView = footer; + } + return _tableView; +} + +- (UIButton *)useButton { + if (!_useButton) { + _useButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_useButton addGradientBackgroundWithColors:@[UIColorFromRGB(0xE29030), UIColorFromRGB(0xfcc074)] + startPoint:CGPointMake(0, 0.5) + endPoint:CGPointMake(1, 0.5) + cornerRadius:20]; + [_useButton setTitle:YMLocalizedString(@"1.0.33_text_5") forState:UIControlStateNormal]; + [_useButton addTarget:self action:@selector(didTapUse) forControlEvents:UIControlEventTouchUpInside]; + } + return _useButton; +} + +@end diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.h b/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.h index 53239a37..3c5bbfc1 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.h +++ b/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.h @@ -87,6 +87,10 @@ NS_ASSUME_NONNULL_BEGIN /// 请求新礼物动效缓存列表 /// @param complection 完成 +(void)requestCacheGiftDynamicEffectList:(HttpRequestHelperCompletion)complection; + + +/// 拉取房间资源 ++ (void)requestRoomResource:(HttpRequestHelperCompletion)complection; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.m b/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.m index 01bdc7f7..764124ba 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/Api/Api+Gift.m @@ -42,6 +42,11 @@ NSString * fang = @"resource/effect"; [self makeRequest:fang method:HttpRequestHelperMethodGET completion:complection, __FUNCTION__, nil]; } + ++ (void)requestRoomResource:(HttpRequestHelperCompletion)complection{ + [self makeRequest:@"client/resource" method:HttpRequestHelperMethodGET completion:complection, __FUNCTION__, nil]; +} + /// 请求福袋全服礼物全服记录 /// @param complection 完成 + (void)requestLuckGiftServerBagRecord:(HttpRequestHelperCompletion)complection { diff --git a/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.h b/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.h index 6a0919d8..513b96d1 100644 --- a/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.h +++ b/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.h @@ -82,6 +82,13 @@ NS_ASSUME_NONNULL_BEGIN /// @param uid 操作人的uid /// @param roomUid 房主的uid + (void)openRoomGiftValue:(HttpRequestHelperCompletion)completion uid:(NSString *)uid roomUid:(NSString *)roomUid; + + +/// 房间等级基本信息 +/// @param completion 完成 +/// @param roomUid 房主 UID ++ (void)roomLevelInfo:(HttpRequestHelperCompletion)completion roomUid:(NSString *)roomUid; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.m b/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.m index 6c3e2509..dec53a8e 100644 --- a/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.m +++ b/YuMi/Modules/YMRoom/View/Setting/Api/Api+RoomSetting.m @@ -119,4 +119,9 @@ NSString * fang = [NSString stringFromBase64String:@"cm9vbS9naWZ0L3ZhbHVlL29wZW4="];///room/gift/value/open [self makeRequest:fang method:HttpRequestHelperMethodPOST completion:completion, __FUNCTION__, uid, roomUid, nil]; } + ++ (void)roomLevelInfo:(HttpRequestHelperCompletion)completion roomUid:(NSString *)roomUid { + [self makeRequest:@"/room/level/info" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, roomUid, nil]; +} + @end diff --git a/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.h b/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.h index d97ba04b..29e09fd7 100644 --- a/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.h +++ b/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.h @@ -6,7 +6,6 @@ // 抱用户上麦控制器 #import "BaseViewController.h" - NS_ASSUME_NONNULL_BEGIN @interface XPRoomInviteUserViewController : BaseViewController @@ -18,6 +17,10 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic,copy) NSString *roomId; ///坑位信息 @property (nonatomic,copy) NSString *position; +///当前房主的 UID +@property(nonatomic, copy) NSString *roomUid; + +@property(nonatomic, assign) NSInteger roomType; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.m b/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.m index 6152dc11..8ed869bc 100644 --- a/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.m +++ b/YuMi/Modules/YMRoom/View/Setting/View/XPRoomInviteUserViewController.m @@ -18,6 +18,7 @@ #import "Api.h" #import "NSArray+Safe.h" ///Model +#import "RoomInfoModel.h" #import "UserInfoModel.h" #import "MicroQueueModel.h" #import "AttachmentModel.h" @@ -82,11 +83,17 @@ self.lastMember= nil; self.tmpLastMember = nil; [self.datasource removeAllObjects]; + @kWeakify(self); [[self fetchChatRoomQueue] subscribeNext:^(id _Nullable x) { + @kStrongify(self); + @kWeakify(self); NSArray * queueArray = x; [[self loadChatRoomRegularMemberList] subscribeNext:^(id _Nullable x) { + @kStrongify(self); + @kWeakify(self); NSArray * regularList = x; [regularList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + @kStrongify(self); NIMChatroomMember * member = obj; if (member.type == NIMTeamMemberTypeOwner) { [self.datasource insertObject:member atIndex:0]; @@ -96,6 +103,7 @@ }]; [[self loadChatRoomTmpMemberList] subscribeNext:^(id _Nullable x) { + @kStrongify(self); NSArray * tmpList = x; [self.datasource addObjectsFromArray:tmpList]; for (NSInteger i = (self.datasource.count - 1); i >= 0; i--) { @@ -298,48 +306,65 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if (self.datasource.count > 0) { NIMChatroomMember * member = [self.datasource xpSafeObjectAtIndex:indexPath.row]; - if ([AccountInfoStorage instance].getUid.integerValue == member.userId.integerValue) { - [Api getUserInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { - if (code == 200) { - UserInfoModel * userInfo = [UserInfoModel modelWithJSON:data.data]; - NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; - request.key = self.position; - request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; - request.roomId = self.roomId; - request.transient = YES; - [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { - if (error == nil) { - [self.navigationController popViewControllerAnimated:YES]; - } else { - [self showErrorToast:error.description]; - } - }]; - } - - } uid:member.userId]; - } else { - NSMutableDictionary * dic = [NSMutableDictionary dictionary]; - [dic setValue:@(self.position.integerValue) forKey:@"micPosition"]; - [dic setValue:@(member.userId.integerValue) forKey:@"uid"]; - AttachmentModel *attachement = [[AttachmentModel alloc]init]; - attachement.first = CustomMessageType_Queue; - attachement.second = Custom_Message_Sub_Queue_Invite; - attachement.data = dic; - - NIMMessage *message = [[NIMMessage alloc]init]; - NIMCustomObject *object = [[NIMCustomObject alloc] init]; - object.attachment = attachement; - message.messageObject = object; - //构造会话 - NIMSession *session = [NIMSession session:self.roomId type:NIMSessionTypeChatroom]; - [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; - [self.navigationController popViewControllerAnimated:YES]; - } + if (self.roomType == RoomType_19Mic && self.position.integerValue == 6 ) { + @kWeakify(self); + [Api requestBossMicUp:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + @kStrongify(self); + if (code == 200) { + [self handleUpMicAction:member]; + } else { + [XNDJTDDLoadingTool showErrorWithMessage:msg]; + } + } roomUid:self.roomUid uid:member.userId]; + } else { + [self handleUpMicAction:member]; + } } } +- (void)handleUpMicAction:(NIMChatroomMember *)member { + if ([AccountInfoStorage instance].getUid.integerValue == member.userId.integerValue) { + [Api getUserInfo:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200) { + UserInfoModel * userInfo = [UserInfoModel modelWithJSON:data.data]; + NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; + request.key = self.position; + request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; + request.roomId = self.roomId; + request.transient = YES; + [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { + if (error == nil) { + [self.navigationController popViewControllerAnimated:YES]; + } else { + [self showErrorToast:error.description]; + } + }]; + } + + } uid:member.userId]; + } else { + NSMutableDictionary * dic = [NSMutableDictionary dictionary]; + [dic setValue:@(self.position.integerValue) forKey:@"micPosition"]; + [dic setValue:@(member.userId.integerValue) forKey:@"uid"]; + AttachmentModel *attachement = [[AttachmentModel alloc]init]; + attachement.first = CustomMessageType_Queue; + attachement.second = Custom_Message_Sub_Queue_Invite; + attachement.data = dic; + + NIMMessage *message = [[NIMMessage alloc]init]; + NIMCustomObject *object = [[NIMCustomObject alloc] init]; + object.attachment = attachement; + message.messageObject = object; + //构造会话 + NIMSession *session = [NIMSession session:self.roomId type:NIMSessionTypeChatroom]; + [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; + [self.navigationController popViewControllerAnimated:YES]; + } +} + #pragma mark - Event Response - (void)backButtonAction:(UIButton *)sender { [self.navigationController popViewControllerAnimated:YES]; diff --git a/YuMi/Modules/YMRoom/View/StageView/AnchorStageView.m b/YuMi/Modules/YMRoom/View/StageView/AnchorStageView.m index 66505c8e..eefbeb8e 100644 --- a/YuMi/Modules/YMRoom/View/StageView/AnchorStageView.m +++ b/YuMi/Modules/YMRoom/View/StageView/AnchorStageView.m @@ -187,7 +187,9 @@ TTActionSheetConfig *inviteMic = [TTActionSheetConfig normalTitle:YMLocalizedString(@"AnchorStageView4") clickAction:^{ XPRoomInviteUserViewController * inviteUserMicVC = [[XPRoomInviteUserViewController alloc] init]; inviteUserMicVC.roomId = roomId; + inviteUserMicVC.roomUid = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid]; inviteUserMicVC.position = position; + inviteUserMicVC.roomType = self.hostDelegate.getRoomInfo.type; inviteUserMicVC.blindDateVipUid = roomInfo.blindDateVipUid; [self.hostDelegate.getCurrentNav pushViewController:inviteUserMicVC animated:YES]; }]; @@ -198,6 +200,8 @@ TTActionSheetConfig *inviteMic = [TTActionSheetConfig normalTitle:YMLocalizedString(@"AnchorStageView4") clickAction:^{ XPRoomInviteUserViewController * inviteUserMicVC = [[XPRoomInviteUserViewController alloc] init]; inviteUserMicVC.roomId = roomId; + inviteUserMicVC.roomUid = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid]; + inviteUserMicVC.roomType = self.hostDelegate.getRoomInfo.type; inviteUserMicVC.position = position; inviteUserMicVC.blindDateVipUid = roomInfo.blindDateVipUid; [self.hostDelegate.getCurrentNav pushViewController:inviteUserMicVC animated:YES]; diff --git a/YuMi/Modules/YMRoom/View/StageView/FifteenMicStageView.m b/YuMi/Modules/YMRoom/View/StageView/FifteenMicStageView.m index dd57b936..a0d0c49a 100644 --- a/YuMi/Modules/YMRoom/View/StageView/FifteenMicStageView.m +++ b/YuMi/Modules/YMRoom/View/StageView/FifteenMicStageView.m @@ -6,7 +6,7 @@ // #import "FifteenMicStageView.h" -#import "ArabMicroView.h" +#import "SocialMicroView.h" //第一行距离顶部 #define firstRowTopMargin 60 // 房主头像宽 58 + 光圈 5 @@ -39,7 +39,7 @@ if (microView) { return microView; } - return [[ArabMicroView alloc] init]; + return [[SocialMicroView alloc] init]; } - (CGRect)rectForViewAtIndex:(NSInteger)index { diff --git a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.h b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.h index 76b51cbd..9f749f6f 100644 --- a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.h +++ b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.h @@ -6,13 +6,14 @@ // #import - +@class SVGAVideoEntity; NS_ASSUME_NONNULL_BEGIN @interface MicroNobleWaveView : UIView ///开始展示声波动画 - (void)startWaveAnimationWithUrl:(NSString *)url; +- (void)startWaveAnimationWithVideoItem:(SVGAVideoEntity *)videoItem; @end diff --git a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.m b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.m index 764fd638..d19badf2 100644 --- a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.m +++ b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroNobleWaveView.m @@ -53,9 +53,21 @@ }]; } +- (void)startWaveAnimationWithVideoItem:(SVGAVideoEntity *)videoItem { + if (self.isAnimationing) { + [self stopWaveAnimation]; + } + self.svgDisplayView.loops = 1; + self.svgDisplayView.clearsAfterStop = YES; + self.svgDisplayView.videoItem = videoItem; + self.isAnimationing = YES; + [self.svgDisplayView startAnimation]; +} + ///结束声波动画 - (void)stopWaveAnimation { self.isAnimationing = NO; + [self.svgDisplayView stopAnimation]; } #pragma mark - Private Method diff --git a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m index e8134d19..b8a3a04d 100644 --- a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m +++ b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m @@ -25,6 +25,7 @@ #import "ClientConfig.h" ///Model #import "RoomFaceInfoModel.h" +#import "RoomResourceManager.h" #define kScpaces 13 @@ -266,12 +267,16 @@ - (void)userSpeaking { UserInfoModel * userInfo = self.microModel.userInfo; - - if (!userInfo.micCircle.length) { +#if DEBUG + userInfo.micCircle = @""; +#endif + if (userInfo.micCircle.length) { + [self.nobleWaveView startWaveAnimationWithUrl:userInfo.micCircle]; + } else if ([[RoomResourceManager sharedManager] loadMicEffect]) { + [self.nobleWaveView startWaveAnimationWithVideoItem:[[RoomResourceManager sharedManager] loadMicEffect]]; + } else { [self.animationView startWaveAnimation]; - return; } - [self.nobleWaveView startWaveAnimationWithUrl:userInfo.micCircle]; } - (void)showingFace:(RoomFaceSendInfoModel *)receiveInfo{ @@ -401,9 +406,25 @@ self.micStateImageView.hidden = micState.micState == MicroMicStateType_Open; UIImage *image; if (micState.posState == MicroPosStateType_Free) { - image = [UIImage imageNamed:@"room_position_normal"]; + if (micState.position + 1 + micState.indexOffset == 8 && self.roomInfo.type == RoomType_19Mic) { + image = [[RoomResourceManager sharedManager] loadMicBossSkinForLock:NO]; + } else { + image = [[RoomResourceManager sharedManager] loadMicNormalSKinForLock:NO]; + } + + if (!image) { + image = [UIImage imageNamed:@"room_position_normal"]; + } } else { - image = [UIImage imageNamed:@"room_position_lock"]; + if (micState.position + 1 + micState.indexOffset == 8 && self.roomInfo.type == RoomType_19Mic) { + image = [[RoomResourceManager sharedManager] loadMicBossSkinForLock:YES]; + } else { + image = [[RoomResourceManager sharedManager] loadMicNormalSKinForLock:YES]; + } + + if (!image) { + image = [UIImage imageNamed:@"room_position_lock"]; + } } [self.avatarImageView updateConfigPlaceHolder:image]; CGSize scaledToSize = CGSizeMake(self.frame.size.width, self.frame.size.width); @@ -451,7 +472,7 @@ } else { self.nickLabel.textColor = [DJDKMIMOMColor positionNickColor]; } - if (self.microModel.microState.position == -1) { + if (self.roomInfo.type == RoomType_Anchor && self.microModel.microState.position == -1) { [self.stackView mas_remakeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self); make.top.mas_equalTo(self.avatarImageView.mas_bottom).offset(10); @@ -463,7 +484,7 @@ } else { self.nickLabel.textColor = [DJDKMIMOMColor positionNickColor]; self.avatarImageView.image = nil; - if (self.microModel.microState.position == -1) { + if (self.roomInfo.type == RoomType_Anchor && self.microModel.microState.position == -1) { self.nickLabel.hidden = YES; } } @@ -487,7 +508,7 @@ self.headWearImageView.hidden = YES; } - if (self.microModel.microState.position == -1) { + if (self.roomInfo.type == RoomType_Anchor && self.microModel.microState.position == -1) { [self.giftValueView removeFromSuperview]; [self.stackView addArrangedSubview:self.giftValueView]; } diff --git a/YuMi/Modules/YMRoom/View/StageView/MicroView/SocialMicroView.m b/YuMi/Modules/YMRoom/View/StageView/MicroView/SocialMicroView.m index 40809223..9b814012 100644 --- a/YuMi/Modules/YMRoom/View/StageView/MicroView/SocialMicroView.m +++ b/YuMi/Modules/YMRoom/View/StageView/MicroView/SocialMicroView.m @@ -18,6 +18,7 @@ @implementation SocialMicroView - (void)configMicroView:(MicroQueueModel *)model { + model.microState.indexOffset = 1; self.position = model.microState.position; [super configMicroView:model]; // MicroStateModel * micState = model.microState; diff --git a/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m b/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m index 61a52f53..5217c41a 100644 --- a/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m +++ b/YuMi/Modules/YMRoom/View/StageView/NineteenMicStageView.m @@ -6,7 +6,7 @@ // #import "NineteenMicStageView.h" -#import "ArabMicroView.h" +#import "SocialMicroView.h" //第一行距离顶部 #define firstRowTopMargin 60 @@ -40,7 +40,7 @@ static const NSInteger kMicCountPerRow = 5; - (UIView *)microViewForIndex:(NSInteger)index { UIView *microView = [super microViewForIndex:index]; - return microView ?: [[ArabMicroView alloc] init]; + return microView ?: [[SocialMicroView alloc] init]; } - (CGRect)rectForViewAtIndex:(NSInteger)index { @@ -53,39 +53,39 @@ static const NSInteger kMicCountPerRow = 5; return [self calculateRectForRow:0 column:index columnsInRow:5]; } - // 第二行(4列,居中) - if (index >= 5 && index < 9) { + // 第二行(4列,左侧) + if (index >= 5 && index < 7) { return [self calculateRectForRow:1 column:index - 5 columnsInRow:4]; } + // Boos(第 8 个麦位,居中,尺寸为2倍) + if (index == 7) { + CGFloat x = (KScreenWidth - mcWidth * 1.24) / 2; // 水平方向居中 + CGFloat y = firstRowTopMargin + 1 * (mcHeight + lineMargin) + mcHeight/2; + return CGRectMake(x, y, mcWidth * 1.24, mcHeight * 1.24); + } + + // 第二行(4列,右侧) + if (index > 7 && index < 10) { + return [self calculateRectForRow:1 column:index - 6 columnsInRow:4]; + } + // 第三行(4列,居中) - if (index >= 9 && index < 13) { - return [self calculateRectForRow:2 column:index - 9 columnsInRow:4]; + if (index >= 10 && index < 14) { + return [self calculateRectForRow:2 column:index - 10 columnsInRow:4]; } // 第四行(5列) - if (index >= 13 && index < 18) { - return [self calculateRectForRow:3 column:index - 13 columnsInRow:5]; + if (index >= 14 && index < 19) { + return [self calculateRectForRow:3 column:index - 14 columnsInRow:5]; } - // 第五行(最后一个麦位,居中,尺寸为2倍) - if (index == 18) { - CGFloat x = (KScreenWidth - mcWidth * 1.5) / 2; // 水平方向居中 -// CGFloat y = firstRowTopMargin + (mcHeight + lineMargin) * 2 - mcHeight; // 垂直方向在第 2 和第 3 行交界 - CGFloat y = firstRowTopMargin + 1 * (mcHeight + lineMargin) + mcHeight/2; - return CGRectMake(x, y, mcWidth * 1.5, mcHeight * 1.5); - } + return CGRectZero; } - (CGRect)calculateRectForRow:(NSInteger)row column:(NSInteger)column columnsInRow:(NSInteger)columnsInRow { -// CGFloat totalWidth = columnsInRow * mcWidth + (columnsInRow - 1) * marginH; // 当前行的总宽度 -// CGFloat startX = (KScreenWidth - totalWidth) / 2; // 居中计算起点 -// CGFloat x = startX + column * (mcWidth + marginH); -// CGFloat y = firstRowTopMargin + row * (mcHeight + lineMargin); -// return CGRectMake(x, y, mcWidth, mcHeight); - CGFloat totalWidth = columnsInRow * mcWidth + (columnsInRow - 1) * marginH; // 当前行的总宽度 CGFloat startX = (KScreenWidth - totalWidth) / 2; // 居中计算起点 CGFloat x = 0; diff --git a/YuMi/Modules/YMRoom/View/StageView/StageView.m b/YuMi/Modules/YMRoom/View/StageView/StageView.m index ce1e9d18..2cfbd415 100644 --- a/YuMi/Modules/YMRoom/View/StageView/StageView.m +++ b/YuMi/Modules/YMRoom/View/StageView/StageView.m @@ -661,9 +661,8 @@ }]; } } - - } + - (void)handleNIMCustomMessage:(NIMMessage *)message { NIMCustomObject *obj = (NIMCustomObject *)message.messageObject; if (obj.attachment != nil && [obj.attachment isKindOfClass:[AttachmentModel class]]) { @@ -809,7 +808,6 @@ [view showingFace:receiveInfo]; } } - } #pragma mark - StageViewDelegate - 留给子 View 重写的模板方法 @@ -832,7 +830,6 @@ } if (targetUid && targetUid.length > 0) { - XPUserCardInfoModel * model = [[XPUserCardInfoModel alloc] init]; model.uid = targetUid; model.position = position; @@ -871,19 +868,42 @@ [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"StageView4")]; return; } - NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; - request.key = up; - request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; - request.roomId = roomId; - request.transient = YES; - [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { - if (isFromDownMic) { - self.isUpingMic = NO; - } - if (error) { - - } - }]; + + if (roomInfo.type == RoomType_19Mic && micModel.microState.position == 6 ) { + [Api requestBossMicUp:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200) { + NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; + request.key = up; + request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; + request.roomId = roomId; + request.transient = YES; + [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { + if (isFromDownMic) { + self.isUpingMic = NO; + } + if (error) { + + } + }]; + } else { + [XNDJTDDLoadingTool showErrorWithMessage:msg]; + } + } roomUid:@(roomInfo.uid).stringValue uid:uid]; + } else { + NIMChatroomQueueUpdateRequest *request = [[NIMChatroomQueueUpdateRequest alloc]init]; + request.key = up; + request.value = [[self userInfoToQueueExt:userInfo] toJSONString]; + request.roomId = roomId; + request.transient = YES; + [[NIMSDK sharedSDK].chatroomManager updateChatroomQueueObject:request completion:^(NSError * _Nullable error) { + if (isFromDownMic) { + self.isUpingMic = NO; + } + if (error) { + + } + }]; + } }; /** @@ -910,10 +930,26 @@ TTActionSheetConfig *upMic = [TTActionSheetConfig normalTitle:upTitle clickAction:^{ NSString* selfUid = [NSString stringWithFormat:@"%ld", (long)self.hostDelegate.getUserInfo.uid]; UIView* microView = [self findMicroViewByUid:selfUid]; - if (microView) { - nimDownQueue([self indexToPosition:microView.tag], position); + + if (roomInfo.type == RoomType_19Mic && micModel.microState.position == 6 ) { + @kWeakify(self); + [Api requestBossMicUp:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200) { + if (microView) { + nimDownQueue([self indexToPosition:microView.tag], position); + } else { + nimUpQueue(position, NO); + } + } else { + [XNDJTDDLoadingTool showErrorWithMessage:msg]; + } + } roomUid:@(roomInfo.uid).stringValue uid:uid]; } else { - nimUpQueue(position, NO); + if (microView) { + nimDownQueue([self indexToPosition:microView.tag], position); + } else { + nimUpQueue(position, NO); + } } }]; @@ -952,7 +988,9 @@ XPRoomInviteUserViewController * inviteUserMicVC = [[XPRoomInviteUserViewController alloc] init]; inviteUserMicVC.isManagerOrOwner = ([position isEqualToString:@"-1"] && roomInfo.roomModeType == RoomModeType_Open_Blind); inviteUserMicVC.roomId = roomId; + inviteUserMicVC.roomType = self.hostDelegate.getRoomInfo.type; inviteUserMicVC.position = position; + inviteUserMicVC.roomUid = [NSString stringWithFormat:@"%ld", self.hostDelegate.getRoomInfo.uid]; inviteUserMicVC.blindDateVipUid = roomInfo.blindDateVipUid; [self.hostDelegate.getCurrentNav pushViewController:inviteUserMicVC animated:YES]; }]; diff --git a/YuMi/Modules/YMRoom/View/StageView/TenMicStageView.m b/YuMi/Modules/YMRoom/View/StageView/TenMicStageView.m index ca43d918..a42c5c1d 100644 --- a/YuMi/Modules/YMRoom/View/StageView/TenMicStageView.m +++ b/YuMi/Modules/YMRoom/View/StageView/TenMicStageView.m @@ -6,7 +6,7 @@ // #import "TenMicStageView.h" -#import "ArabMicroView.h" +#import "SocialMicroView.h" //第一行距离顶部 #define firstRowTopMargin 60 // 房主头像宽 58 + 光圈 5 @@ -38,7 +38,7 @@ if (microView) { return microView; } - ArabMicroView *v = [[ArabMicroView alloc] init]; + SocialMicroView *v = [[SocialMicroView alloc] init]; return v; } diff --git a/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m b/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m index 71c7186a..50b4434d 100644 --- a/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m +++ b/YuMi/Modules/YMRoom/View/StageView/TwentyMicStageView.m @@ -6,7 +6,7 @@ // #import "TwentyMicStageView.h" -#import "ArabMicroView.h" +#import "SocialMicroView.h" //第一行距离顶部 #define firstRowTopMargin 60 @@ -44,7 +44,7 @@ static const NSInteger kMicCountPerRow = 5; - (UIView *)microViewForIndex:(NSInteger)index { UIView *microView = [super microViewForIndex:index]; - return microView ?: [[ArabMicroView alloc] init]; + return microView ?: [[SocialMicroView alloc] init]; } - (CGRect)rectForViewAtIndex:(NSInteger)index { diff --git a/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.h b/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.h index f6ef6e2e..1e258176 100644 --- a/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.h +++ b/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.h @@ -54,6 +54,12 @@ NS_ASSUME_NONNULL_BEGIN /// @param opt 1: 设置为管理员;2:设置普通等级用户;-1:设为黑名单用户;-2:设为禁言用户 /// @param isSet true 设置,false 取消设置 + (void)superAdminHandleUser:(HttpRequestHelperCompletion)completion roomUid:(NSString *)roomUid targetUid:(NSString *)targetUid opt:(NSString *)opt isSet:(NSNumber *)isSet; + + +/// 校验是否可以继续设置管理员数量 +/// @param completion 完成 +/// @param roomUid 房主的uid ++ (void)checkManageNum:(HttpRequestHelperCompletion)completion roomUid:(NSString *)roomUid; @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.m b/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.m index c986a461..f880aeb0 100644 --- a/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.m +++ b/YuMi/Modules/YMRoom/View/UserCard/Api/Api+UserCard.m @@ -59,4 +59,8 @@ [self makeRequest:@"super/set/chatroom/role" method:HttpRequestHelperMethodPOST completion:completion, __FUNCTION__, roomUid, targetUid, opt,isSet, nil]; } ++ (void)checkManageNum:(HttpRequestHelperCompletion)completion roomUid:(NSString *)roomUid { + [self makeRequest:@"room/checkManageNum" method:HttpRequestHelperMethodPOST completion:completion, __FUNCTION__, roomUid, nil]; +} + @end diff --git a/YuMi/Modules/YMRoom/View/UserCard/Model/XPUserCardItemModel.h b/YuMi/Modules/YMRoom/View/UserCard/Model/XPUserCardItemModel.h index 38bc5218..edc8c373 100644 --- a/YuMi/Modules/YMRoom/View/UserCard/Model/XPUserCardItemModel.h +++ b/YuMi/Modules/YMRoom/View/UserCard/Model/XPUserCardItemModel.h @@ -56,12 +56,12 @@ typedef NS_ENUM(NSUInteger, UserCardItemType){ ///是否可以点击 @property (nonatomic,assign) BOOL isEnable; - - - ///状态 @property (nonatomic,assign) BOOL status; +/// 是否 boss 位 +@property(nonatomic, assign) bool isBoss; + @property (nonatomic,copy) NSString *uid; diff --git a/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.h b/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.h index 51586117..ccbefebe 100644 --- a/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.h +++ b/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.h @@ -89,6 +89,16 @@ NS_ASSUME_NONNULL_BEGIN /// @param opt 1: 设置为管理员;2:设置普通等级用户;-1:设为黑名单用户;-2:设为禁言用户 /// @param roomUid 房主的uid - (void)superAdminHandleUser:(NSString *)targetUid opt:(NSString *)opt roomUid:(NSString *)roomUid isSet:(BOOL)isSet; + + +/// 校验是否可以继续设置管理员数量 +/// @param roomUID 房间 UID +/// @param success 请求成功 +/// @param failure 请求失败 +- (void)checkManagerLimit:(NSString *)roomUID success:(void(^)(void))success failure:(void(^)(NSError *error))failure; + +- (void)bossMicUp:(NSString *)roomUID targetUid:(NSString *)targetUid success:(void(^)(void))success failure:(void(^)(NSError *error))failure; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m b/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m index d9722977..64172ef1 100644 --- a/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m +++ b/YuMi/Modules/YMRoom/View/UserCard/Presenter/XPUserCardPresenter.m @@ -10,6 +10,7 @@ #import #import ///Tool +#import "Api.h" #import "Api+UserCard.h" #import "AccountInfoStorage.h" ///Model @@ -179,18 +180,17 @@ item.title = YMLocalizedString(@"XPUserCardPresenter0"); } else { switch (roomInfo.type) { - case RoomType_Game: - item.title = YMLocalizedString(@"XPUserCardPresenter1"); - break; +// case RoomType_Game: +// item.title = YMLocalizedString(@"XPUserCardPresenter1"); +// break; case RoomType_Anchor: item.title = YMLocalizedString(@"XPMoreMenuPresenter12"); break; default: - item.title = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardPresenter4"), i]; + item.title = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardPresenter4"), i+1]; break; } } -// item.title = roomInfo.roomModeType == RoomModeType_Open_Blind ? YMLocalizedString(@"XPUserCardPresenter0") : YMLocalizedString(@"XPUserCardPresenter1"); item.imageName = roomInfo.leaveMode ? @"usercard_invite_micro_owner_disable" : @"room_user_position_owner"; if (roomInfo.leaveMode) { item.isEnable = NO; @@ -203,18 +203,22 @@ item.title = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardPresenter3"), i]; } } else { - item.title = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardPresenter4"), i]; + item.title = [NSString stringWithFormat:YMLocalizedString(@"XPUserCardPresenter4"), i+1]; } - } // targetMember.type != NIMChatroomMemberTypeCreator - MicroQueueModel * micModel = [micQueue objectForKey:[NSString stringWithFormat:@"%d", i -1]]; - if ((micModel && micModel.userInfo && micModel.userInfo.uid > 0) || micModel.microState.position == -1) { + MicroQueueModel * micModel = [micQueue objectForKey:[NSString stringWithFormat:@"%d", i - 1]]; + if ((micModel && micModel.userInfo && micModel.userInfo.uid > 0) || (micModel.microState.position == -1 && roomInfo.type == RoomType_Game)) { item.isEnable = NO; item.imageName = @"room_user_position_used"; } else { item.isEnable = YES; - item.imageName = @"room_user_position_empty"; + if (roomInfo.type == RoomType_19Mic && micModel.microState.position == 6) { + item.isBoss = YES; + item.imageName = @"room_user_position_owner"; + } else { + item.imageName = @"room_user_position_empty"; + } } item.position = [NSString stringWithFormat:@"%d", (i - 1)]; [self.functionArray addObject:item]; @@ -606,6 +610,30 @@ }] roomUid:roomUid targetUid:targetUid opt:opt isSet:@(isSet)]; } +- (void)checkManagerLimit:(NSString *)roomUID success:(void(^)(void))success failure:(void(^)(NSError *error))failure { + [Api checkManageNum:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if (success) { + success(); + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if (failure) { + failure([NSError errorWithDomain:msg code:code userInfo:nil]); + } + } showLoading:YES errorToast:YES] roomUid:roomUID]; +} + +- (void)bossMicUp:(NSString *)roomUID targetUid:(NSString *)targetUid success:(void(^)(void))success failure:(void(^)(NSError *error))failure { + [Api requestBossMicUp:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if (success) { + success(); + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if (failure) { + failure([NSError errorWithDomain:msg code:code userInfo:nil]); + } + } showLoading:YES errorToast:YES] roomUid:roomUID uid:targetUid]; +} + #pragma mark - Private Method ///获取房间角色 - (RACSignal *)rac_queryChatRoomMember:(NSString *)uid roomId:(NSString *)roomId{ diff --git a/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m b/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m index fc5d66ef..54b35d87 100644 --- a/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m +++ b/YuMi/Modules/YMRoom/View/UserCard/View/UserRoomCardViewController.m @@ -29,14 +29,92 @@ #import "SuperBlockViewController.h" #import "XPSkillCardPlayerManager.h" +// TODO: 移除房主位 | 19 mic Boss 位判断 | 全麦位 svga 压力测试 -@interface CustomLayout : UICollectionViewLayout + +@interface Custom19MicLayout : UICollectionViewLayout @property (nonatomic, strong) NSMutableArray *attributesArray; @end -@implementation CustomLayout +@implementation Custom19MicLayout + +- (void)prepareLayout { + [super prepareLayout]; + + self.attributesArray = [NSMutableArray array]; + + CGFloat collectionWidth = self.collectionView.bounds.size.width; + CGFloat itemWidth = 50.0; // 每个 item 的宽度 + CGFloat itemHeight = 50.0 + 4 + 17; // 每个 item 的高度 + CGFloat spacing = 20.0; // 每个 item 之间的水平间距 + CGFloat rowSpacing = 20.0; // 每行之间的垂直间距 + CGFloat yOffset = 0; + + // 预定义每行的元素布局规则 + NSArray *> *layoutRows = @[ + @[@1, @1, @1, @1, @1], // 第 1 行: 居中排列 5 个元素 + @[@1, @1, @1, @1, @1], // 第 2 行: 两边元素对称排列 +// @[@0, @0, @1], // 第 3 行: 居中 1 个元素 + @[@1, @1, @0, @1, @1], // 第 4 行: 两边对称排列 + @[@1, @1, @1, @1, @1] // 第 5 行: 居中排列 5 个元素 + ]; + + NSInteger itemIndex = 0; // 当前 item 索引 + + for (NSArray *row in layoutRows) { + // 计算当前行的总宽度 + NSInteger itemCount = row.count; + CGFloat totalItemWidth = itemCount * itemWidth + (itemCount - 1) * spacing; + + // 计算行的 xOffset 让内容整体居中 + CGFloat xOffset = (collectionWidth - totalItemWidth) / 2.0; + + for (NSNumber *isItem in row) { + if ([isItem boolValue]) { // 如果该位置有 item + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:itemIndex inSection:0]; + UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; + if (itemIndex == 7) { + // 中央特殊处理 + attributes.frame = CGRectMake(xOffset-(itemWidth * 0.1), yOffset+itemWidth*2/3, itemWidth*1.2, itemHeight*1.2); + [self.attributesArray addObject:attributes]; + } else { + // 设置每个 item 的位置 + attributes.frame = CGRectMake(xOffset, yOffset, itemWidth, itemHeight); + [self.attributesArray addObject:attributes]; + } + // 更新 item 索引 + itemIndex++; + } + + // 更新 xOffset,无论是否有 item 都需要移动 + xOffset += itemWidth + spacing; + } + + // 每一行的 yOffset 往下移动 + yOffset += itemHeight + rowSpacing; + } +} + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { + return self.attributesArray; +} + +- (CGSize)collectionViewContentSize { + return CGSizeMake(self.collectionView.bounds.size.width, 400); // 设置总内容高度 +} + +@end + + +@interface Custom9MicLayout : UICollectionViewLayout + +@property (nonatomic, strong) NSMutableArray *attributesArray; + +@end + +@implementation Custom9MicLayout - (void)prepareLayout { [super prepareLayout]; @@ -49,32 +127,12 @@ CGFloat itemHeight = 50.0 + 4 + 17; // 每个 item 的高度 CGFloat spacing = 48.0; // 每个 item 之间的间距 - CGFloat xOffset = 0; +// CGFloat xOffset = 0; CGFloat yOffset = 0; for (NSInteger section = 0; section < sectionCount; section++) { NSInteger itemCount = [self.collectionView numberOfItemsInSection:section]; -// for (NSInteger item = 0; item < itemCount; item++) { -// NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section]; -// UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; -// -// // 根据行数和索引设置位置 -// if (section == 0 && item == 0) { -// xOffset = collectionWidth / 2 - itemWidth / 2; // 第一行居中 -// yOffset = 10; -// } else if (section == 1) { -// xOffset = item * (itemWidth + spacing) + 10 + 20; -// yOffset = itemHeight + 17 + 14; // 第二行向下偏移 -// } else if (section == 2) { -// xOffset = item * (itemWidth + spacing) + 10 + 20; -// yOffset = itemHeight * 2 + 17 + 24; // 第三行向下偏移 -// } -// -// attributes.frame = CGRectMake(xOffset, yOffset, itemWidth, itemHeight); -// [self.attributesArray addObject:attributes]; -// } - // 计算当前行的总宽度 = 所有 items 宽度 + 间距 CGFloat totalItemWidth = itemCount * itemWidth + (itemCount - 1) * spacing; @@ -205,7 +263,10 @@ - (void)setDataSource:(NSArray *)dataSource { _dataSource = dataSource; if (dataSource.count == 9) { - CustomLayout *customLayout = [[CustomLayout alloc] init]; + Custom9MicLayout *customLayout = [[Custom9MicLayout alloc] init]; + self.collectionView.collectionViewLayout = customLayout; + } else if (dataSource.count == 19) { + Custom19MicLayout *customLayout = [[Custom19MicLayout alloc] init]; self.collectionView.collectionViewLayout = customLayout; } [self.collectionView reloadData]; @@ -250,14 +311,6 @@ return self.dataSource.count; } -//- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { -// if (self.dataSource.count == 9) { -// -// }else { -// return collectionView.collectionViewLayout.si; -// } -//} - - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UserRoomMicPositionCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"UserRoomMicPositionCell" forIndexPath:indexPath]; @@ -298,6 +351,8 @@ default: break; } + } else if (self.dataSource.count == 19) { + self.handleTapPosition([self.dataSource xpSafeObjectAtIndex:indexPath.row]); } else { self.handleTapPosition([self.dataSource xpSafeObjectAtIndex:indexPath.row]); } @@ -1162,10 +1217,22 @@ } break; case UserCardItemType_Manager: { - if ([self isSuperUser]) { - [self.presenter superAdminHandleUser:self.cardInfo.uid opt:@"1" roomUid:roomUid isSet:!item.isSelect]; + if (item.isSelect) { + @kWeakify(self); + [self.presenter checkManagerLimit:roomUid success:^{ + @kStrongify(self); + if ([self isSuperUser]) { + [self.presenter superAdminHandleUser:self.cardInfo.uid opt:@"1" roomUid:roomUid isSet:!item.isSelect]; + } else { + [self.presenter makeUserManager:self.cardInfo.uid roomId:roomId enable:!item.isSelect]; + } + } failure:^(NSError * _Nonnull error) {}]; } else { - [self.presenter makeUserManager:self.cardInfo.uid roomId:roomId enable:!item.isSelect]; + if ([self isSuperUser]) { + [self.presenter superAdminHandleUser:self.cardInfo.uid opt:@"1" roomUid:roomUid isSet:!item.isSelect]; + } else { + [self.presenter makeUserManager:self.cardInfo.uid roomId:roomId enable:!item.isSelect]; + } } } break; @@ -1229,6 +1296,12 @@ case RoomType_15Mic: micCount = 15; break; + case RoomType_19Mic: + micCount = 19; + break; + case RoomType_20Mic: + micCount = 20; + break; default: micCount = 9; break; @@ -1343,34 +1416,55 @@ } - (void)handleInviteMicro:(XPUserCardItemModel *)item { - NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + if ([AccountInfoStorage instance].getUid.integerValue == self.userInfoModel.uid) { + NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; [self.presenter upMicro:roomId position:item.position userInfo:self.userInfoModel]; } else { if (self.cardInfo.roomInfo.leaveMode && - [item.position isEqualToString:@"-1"]) { + item.isEnable == NO +// [item.position isEqualToString:@"-1"] + ) { return; } - NSMutableDictionary * dic = [NSMutableDictionary dictionary]; - [dic setValue:@(item.position.integerValue) forKey:@"micPosition"]; - [dic setValue:@(self.userInfoModel.uid) forKey:@"uid"]; - AttachmentModel *attachement = [[AttachmentModel alloc]init]; - attachement.first = CustomMessageType_Queue; - attachement.second = Custom_Message_Sub_Queue_Invite; - attachement.data = dic; - - NIMMessage *message = [[NIMMessage alloc]init]; - NIMCustomObject *object = [[NIMCustomObject alloc] init]; - object.attachment = attachement; - message.messageObject = object; - //构造会话 - NIMSession *session = [NIMSession session:roomId type:NIMSessionTypeChatroom]; - [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; - [self dismissViewControllerAnimated:YES completion:nil]; + if (item.isBoss) { + @kWeakify(self); + [self.presenter bossMicUp:@(self.cardInfo.roomInfo.uid).stringValue + targetUid:self.cardInfo.uid + success:^{ + @kStrongify(self); + [self buildUpMicMessage:item]; + } failure:^(NSError * _Nonnull error) { }]; + } else { + [self buildUpMicMessage:item]; + } } } +- (void)buildUpMicMessage:(XPUserCardItemModel *)item { + NSString * roomId = [NSString stringWithFormat:@"%ld", self.cardInfo.roomInfo.roomId]; + NSMutableDictionary * dic = [NSMutableDictionary dictionary]; + [dic setValue:@(item.position.integerValue) forKey:@"micPosition"]; + [dic setValue:@(self.userInfoModel.uid) forKey:@"uid"]; + AttachmentModel *attachement = [[AttachmentModel alloc]init]; + attachement.first = CustomMessageType_Queue; + attachement.second = Custom_Message_Sub_Queue_Invite; + attachement.data = dic; + + NIMMessage *message = [[NIMMessage alloc]init]; + NIMCustomObject *object = [[NIMCustomObject alloc] init]; + object.attachment = attachement; + message.messageObject = object; + //构造会话 + NIMSession *session = [NIMSession session:roomId type:NIMSessionTypeChatroom]; + [[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:nil]; + [self dismissViewControllerAnimated:YES completion:^{ + [[NSNotificationCenter defaultCenter] postNotificationName:@"PopAfterUserCardAction" object:nil]; + }]; + +} + - (void)handleAtUser:(XPUserCardItemModel *)item { [[NSNotificationCenter defaultCenter] postNotificationName:@"PopAfterUserCardAction" object:nil]; diff --git a/YuMi/Modules/YMRoom/View/XPRoomViewController.m b/YuMi/Modules/YMRoom/View/XPRoomViewController.m index d0306908..0e6f7317 100644 --- a/YuMi/Modules/YMRoom/View/XPRoomViewController.m +++ b/YuMi/Modules/YMRoom/View/XPRoomViewController.m @@ -41,7 +41,6 @@ #import "XPUserCardInfoModel.h" ///View #import "BaseNavigationController.h" -#import "XPRoomActivityContainerView.h" #import "XPRoomBackContainerView.h" #import "XPRoomMenuContainerView.h" #import "XPRoomQuickMessageContainView.h" @@ -94,6 +93,7 @@ #import "XPSendGiftView.h" #import "RoomSideMenu.h" +#import "RoomResourceManager.h" UIKIT_EXTERN NSString * const kRoomGiftEffectUpdateNotificationKey; UIKIT_EXTERN NSString * const kRoomMiniNotificationKey; @@ -553,6 +553,14 @@ XPCandyTreeInsufficientBalanceViewDelegate> }]; } +- (void)__layoutNineteenMicStage { + [self.stageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.leading.trailing.mas_equalTo(self.view); + make.top.mas_equalTo(self.roomHeaderView.mas_bottom); + make.height.mas_equalTo(self.stageView.hightForStageView); + }]; +} + - (void)__layoutFifteenMicStage { [self.stageView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.mas_equalTo(self.view); @@ -829,11 +837,13 @@ XPCandyTreeInsufficientBalanceViewDelegate> - (Class)stageViewClassForRoomInfo:(RoomInfoModel *)roomInfo { if (roomInfo.roomModeType == RoomModeType_Open_Blind) { return [DatingStageView class]; - } else if (roomInfo.datingState == RoomDatingStateChangeType_Close && + } + if (roomInfo.datingState == RoomDatingStateChangeType_Close && ![self.stageView isKindOfClass:[SocialStageView class]]) { return [SocialStageView class]; - } else if (roomInfo.type == RoomType_Anchor) { - if (roomInfo.roomModeType == RoomModeType_Open_AcrossRoomPK_mode && + } + if (roomInfo.type == RoomType_Anchor) { + if (roomInfo.roomModeType == RoomModeType_Open_AcrossRoomPK_mode && ![self.stageView isKindOfClass:[AnchorPKStageView class]]) { return [AnchorPKStageView class]; } else if (roomInfo.roomModeType == RoomModeType_Normal_Mode && @@ -842,13 +852,12 @@ XPCandyTreeInsufficientBalanceViewDelegate> } } else if (roomInfo.type == RoomType_MiniGame) { return [LittleGameScrollStageView class]; + } else if (roomInfo.type == RoomType_19Mic) { + return [NineteenMicStageView class]; + } else if (roomInfo.type == RoomType_20Mic) { + return [TwentyMicStageView class]; } else if (roomInfo.type == RoomType_15Mic) { -//#if DEBUG -// return [NineteenMicStageView class]; -// return [TwentyMicStageView class]; -//#endif return [FifteenMicStageView class]; - } else if (roomInfo.type == RoomType_10Mic) { return [TenMicStageView class]; } else if (roomInfo.hadChangeRoomType && ![self.stageView isKindOfClass:[SocialStageView class]]) { @@ -895,6 +904,7 @@ XPCandyTreeInsufficientBalanceViewDelegate> make.trailing.mas_equalTo(self.sideMenu.mas_leading).offset(-10); }]; + [self.sideMenu displayForMiniGame]; [self.sideMenu mas_remakeConstraints:^(MASConstraintMaker *make) { make.trailing.mas_equalTo(self.view); make.bottom.mas_equalTo(self.quickMessageContainerView.mas_top).offset(-5); @@ -916,12 +926,26 @@ XPCandyTreeInsufficientBalanceViewDelegate> make.trailing.mas_equalTo(self.sideMenu.mas_leading).offset(-10); }]; - [self.sideMenu mas_remakeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(self.messageContainerView); - make.trailing.mas_equalTo(self.view); - make.bottom.mas_equalTo(self.quickMessageContainerView.mas_top).offset(-5); - make.width.mas_equalTo(87); - }]; + if (self.roomInfo.type == RoomType_19Mic || self.roomInfo.type == RoomType_20Mic) { +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ +// [self.sideMenu displayExpandButton:YES]; +// }); + + [self.sideMenu mas_remakeConstraints:^(MASConstraintMaker *make) { + make.trailing.mas_equalTo(self.view); + make.height.mas_equalTo(160); + make.bottom.mas_equalTo(self.quickMessageContainerView.mas_top).offset(-5); + make.width.mas_equalTo(87); + }]; + } else { +// [self.sideMenu displayExpandButton:NO]; + [self.sideMenu mas_remakeConstraints:^(MASConstraintMaker *make) { + make.top.mas_equalTo(self.messageContainerView); + make.trailing.mas_equalTo(self.view); + make.bottom.mas_equalTo(self.quickMessageContainerView.mas_top).offset(-5); + make.width.mas_equalTo(87); + }]; + }\ } break; } @@ -981,6 +1005,10 @@ XPCandyTreeInsufficientBalanceViewDelegate> return; } _roomInfo = roomInfo; + + [[RoomResourceManager sharedManager] updateCurrentSkinID:roomInfo.usedMicSkinId + effectID:roomInfo.usedMicEffectId]; + [self.sideMenu updateView]; } @@ -1878,15 +1906,18 @@ XPCandyTreeInsufficientBalanceViewDelegate> } else { if (self.roomInfo.type == RoomType_Anchor) { [self changeStageViewOnAnchorRoom]; + } else if (self.roomInfo.type == RoomType_20Mic) { + [self __layoutTwentyMicStage]; + [self changeStageViewOnRoomUpdate]; + [self.twentyMicStageView onRoomUpdate]; + } else if (self.roomInfo.type == RoomType_19Mic) { + [self __layoutNineteenMicStage]; + [self changeStageViewOnRoomUpdate]; + [self.nineteenMicStageView onRoomUpdate]; } else if (self.roomInfo.type == RoomType_15Mic) { [self __layoutFifteenMicStage]; [self changeStageViewOnRoomUpdate]; -//#if DEBUG -// [self.twentyMicStageView onRoomUpdate]; -// [self.nineteenMicStageView onRoomUpdate]; -//#else [self.fifteenMicStageView onRoomUpdate]; -//#endif } else if (self.roomInfo.type == RoomType_10Mic) { [self __layoutTenMicStage]; [self changeStageViewOnRoomUpdate]; @@ -2074,7 +2105,6 @@ XPCandyTreeInsufficientBalanceViewDelegate> } } else if (attachment.first == CustomMessageType_Custom_Room_Background) { if (attachment.second == Custom_Message_Sub_Custom_Room_Background) { - // TODO: 更新 背景 if ([attachment.data isKindOfClass:[NSDictionary class]]) { NSString *url = attachment.data[@"url"]; if (![NSString isEmpty:url]) { @@ -2082,7 +2112,18 @@ XPCandyTreeInsufficientBalanceViewDelegate> [self.backContainerView onRoomUpdate]; } } - + } + } else if (attachment.first == CustomMessageType_RoomLevel_Update) { + if (attachment.second == Custom_Message_Sub_RoomLevel_Update) { + if ([attachment.data isKindOfClass:[NSDictionary class]]) { + NSString *url = attachment.data[@"roomLevelIcon"]; + NSNumber *roomLevel = attachment.data[@"roomLevel"]; + if (![NSString isEmpty:url] && roomLevel.integerValue > self.roomHeaderView.tag) { + self.roomHeaderView.tag = roomLevel.integerValue; + [self.roomHeaderView updateLevel:url]; + self.roomInfo.roomLevelIcon = url; + } + } } } [self.messageContainerView handleNIMCustomMessage:message]; diff --git a/YuMi/Modules/YMTabbar/View/TabbarViewController.m b/YuMi/Modules/YMTabbar/View/TabbarViewController.m index 7dff207e..e1ad04a8 100644 --- a/YuMi/Modules/YMTabbar/View/TabbarViewController.m +++ b/YuMi/Modules/YMTabbar/View/TabbarViewController.m @@ -95,6 +95,8 @@ #import "RoomBoomManager.h" #import "RoomBoomBannerAnimation.h" +#import "RoomResourceManager.h" + NSString * const kUserFirstLoginKey = @"kUserFirstLoginKey"; NSString * const kHadLaunchApp = @"kHadLaunchApp"; NSString * const kLastShowAnchorCardTime = @"kLastShowAnchorCardTime"; @@ -133,6 +135,8 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; ///房间外的飘屏 @property(nonatomic,strong) PIFullScreenBannerAnimation *roomAnimation; +@property(nonatomic, assign) NSInteger retryCount; + @end @implementation TabbarViewController @@ -237,6 +241,7 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; - (void)autoLoginSuccess { [self.presenter loginNIM]; [self.presenter getUserInfo]; + [[UploadFile share]initQCloud]; ///检查更新 @@ -247,6 +252,7 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; [self.presenter checkInviteUserInfo:self.inviteCode]; } [self requestGiftList]; + [self cacheRoomResource]; XPAdImageTool.shareImageTool.isImLogin = YES; @@ -381,8 +387,6 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; } ///缓存礼物特效 -(void)requestGiftList{ - [self removeOldVersionCacheFromOldMethod]; - @kWeakify(self); AFNetworkReachabilityManager *networkManager = [AFNetworkReachabilityManager sharedManager]; [networkManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { @@ -413,25 +417,19 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; [networkManager startMonitoring]; } --(void)removeOldVersionCacheFromOldMethod{ - //MARK: 删除旧数据缓存,预计 2 个版本后可以删除此方法 - NSString *svgaFileName = @"/GiftSvga"; - NSString *svgaFilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:svgaFileName]; - if ([[NSFileManager defaultManager] fileExistsAtPath:svgaFilePath]) { - BOOL isSuccess = [[NSFileManager defaultManager]removeItemAtPath:svgaFilePath error:nil]; - if(isSuccess == YES){ - NSLog(@"删除成功"); +- (void)cacheRoomResource { + [Api requestRoomResource:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) { + if (code == 200) { + [[RoomResourceManager sharedManager] cacheAPIData:data.data]; + } else { + if (self.retryCount <= 5) { + self.retryCount += 1; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * self.retryCount * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self cacheRoomResource]; + }); + } } - } - - NSString *mp4FileName = @"/GiftMp4"; - NSString *mp4FilePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:mp4FileName]; - if ([[NSFileManager defaultManager] fileExistsAtPath:mp4FilePath]) { - BOOL isSuccess = [[NSFileManager defaultManager]removeItemAtPath:mp4FilePath error:nil]; - if(isSuccess == YES){ - NSLog(@"删除成功"); - } - } + }]; } - (void)checkInviteUserInfoSuccess:(InviteUserInfoModel *)inviteInfo { diff --git a/YuMi/Structure/MVP/Api/Api.h b/YuMi/Structure/MVP/Api/Api.h index 1be436d0..89a68083 100644 --- a/YuMi/Structure/MVP/Api/Api.h +++ b/YuMi/Structure/MVP/Api/Api.h @@ -94,6 +94,8 @@ NS_ASSUME_NONNULL_BEGIN + (void)requestAllRegionInfoCompletion:(HttpRequestHelperCompletion)completion; ++ (void)requestBossMicUp:(HttpRequestHelperCompletion)completion roomUid:(NSString *)roomUid uid:(NSString *)uid; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Structure/MVP/Api/Api.m b/YuMi/Structure/MVP/Api/Api.m index 3655c1e5..f426097d 100644 --- a/YuMi/Structure/MVP/Api/Api.m +++ b/YuMi/Structure/MVP/Api/Api.m @@ -144,4 +144,8 @@ [self makeRequest:@"regionInfo/listAll" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, nil]; } ++ (void)requestBossMicUp:(HttpRequestHelperCompletion)completion roomUid:(NSString *)roomUid uid:(NSString *)uid { + [self makeRequest:@"room/bossMic/up" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, roomUid, uid, nil]; +} + @end diff --git a/YuMi/ar.lproj/Localizable.strings b/YuMi/ar.lproj/Localizable.strings index c0623f97..2328794f 100644 --- a/YuMi/ar.lproj/Localizable.strings +++ b/YuMi/ar.lproj/Localizable.strings @@ -2212,7 +2212,7 @@ ineHeadView12" = "الحمل"; "XPArrangeMicViewController7" = "عدد الأشخاص في قائمة الانتظار حاليًا: %@"; "XPArrangeMicViewController8" = "ترتيبي في قائمة الانتظار: %ld"; "XPArrangeMicViewController9" = "يجب عليك التسجيل لتصبح في قائمة الانتظار~"; -"XPArrangeMicViewController10" = "إلغاء التسجيل"; +"XPArrangeMicViewController10" = "التسجيل"; "XPArrangeMicViewController11" = "إلغاء التسجيل"; "XPArrangeMicViewController12" = "لا يوجد مساحة شاغرة في الميكروفون"; "XPArrangeMicViewController14" = "سجل الآن لتكون أول من يصبح في قائمة الانتظار"; @@ -4036,3 +4036,19 @@ ineHeadView12" = "الحمل"; "1.0.31_text_2" = "قائمة الدول/المناطق"; //"1.0.31_text_3" = "Selective cardiography"; "1.0.31_text_4" = "موقف الميكروفون"; + +"1.0.33_text_1" = "Room Mode"; +"1.0.33_text_2" = "Room Type"; +"1.0.33_text_3" = "Mic Skin"; +"1.0.33_text_4" = "Mic Effect"; +"1.0.33_text_5" = "Use"; +"1.0.33_text_6" = "Room Value:"; +"1.0.33_text_7" = "Room Admind:"; +"1.0.33_text_8" = "Distance to Next Lv:"; +"1.0.33_text_9" = "Lv."; +"1.0.33_text_10" = "Classic"; +"1.0.33_text_11" = "Party"; +"1.0.33_text_12" = "Carnival"; +"1.0.33_text_13" = "Celebration"; +"1.0.33_text_14" = "Unique"; +"1.0.33_text_15" = "房間等級不夠,不能使用該皮膚。"; diff --git a/YuMi/en.lproj/Localizable.strings b/YuMi/en.lproj/Localizable.strings index 5b6ff710..8c38e7bf 100644 --- a/YuMi/en.lproj/Localizable.strings +++ b/YuMi/en.lproj/Localizable.strings @@ -1944,7 +1944,7 @@ "XPArrangeMicViewController7" = "Current number of people in line:%@"; "XPArrangeMicViewController8" = "My position in the queue:%ld"; "XPArrangeMicViewController9" = "Must sign up to get in line~"; -"XPArrangeMicViewController10" = "Cancel Sign-up"; +"XPArrangeMicViewController10" = "Sign-up"; "XPArrangeMicViewController11" = "Cancel Sign-up"; "XPArrangeMicViewController12" = "No more slots available on the mic"; "XPArrangeMicViewController14" = "Sign up now and you'll be the first in line"; @@ -3829,3 +3829,19 @@ "1.0.31_text_2" = "Country/Region List"; //"1.0.31_text_3" = "Selective cardiography"; "1.0.31_text_4" = "Mic Position"; + +"1.0.33_text_1" = "Room Mode"; +"1.0.33_text_2" = "Room Type"; +"1.0.33_text_3" = "Mic Skin"; +"1.0.33_text_4" = "Mic Effect"; +"1.0.33_text_5" = "Use"; +"1.0.33_text_6" = "Room Value:"; +"1.0.33_text_7" = "Room Admind:"; +"1.0.33_text_8" = "Distance to Next Lv:"; +"1.0.33_text_9" = "Lv."; +"1.0.33_text_10" = "Classic"; +"1.0.33_text_11" = "Party"; +"1.0.33_text_12" = "Carnival"; +"1.0.33_text_13" = "Celebration"; +"1.0.33_text_14" = "Unique"; +"1.0.33_text_15" = "房間等級不夠,不能使用該皮膚。"; diff --git a/YuMi/tr.lproj/Localizable.strings b/YuMi/tr.lproj/Localizable.strings index 36b58614..34707830 100644 --- a/YuMi/tr.lproj/Localizable.strings +++ b/YuMi/tr.lproj/Localizable.strings @@ -1535,7 +1535,7 @@ "XPArrangeMicViewController7" = "Şu anda sıraya kayıtlı kişi sayısı:%@"; "XPArrangeMicViewController8" = "Sıramda yerim:%ld"; "XPArrangeMicViewController9" = "Sıraya girmek için kaydolun"; -"XPArrangeMicViewController10" = "Kaydı iptal et"; +"XPArrangeMicViewController10" = "Iptal et"; "XPArrangeMicViewController11" = "Kaydı iptal et"; "XPArrangeMicViewController12" = "Mikrofonda boş yer yok"; "XPArrangeMicViewController14" = "Hemen kaydolun, sıranın ilk sırası siz olun"; @@ -3615,3 +3615,19 @@ "1.0.31_text_2" = "Ülke/Bölge Listesi"; //"1.0.31_text_3" = "Selective cardiography"; "1.0.31_text_4" = "Mikrofon pozisyonu"; + +"1.0.33_text_1" = "Room Mode"; +"1.0.33_text_2" = "Room Type"; +"1.0.33_text_3" = "Mic Skin"; +"1.0.33_text_4" = "Mic Effect"; +"1.0.33_text_5" = "Use"; +"1.0.33_text_6" = "Room Value:"; +"1.0.33_text_7" = "Room Admind:"; +"1.0.33_text_8" = "Distance to Next Lv:"; +"1.0.33_text_9" = "Lv."; +"1.0.33_text_10" = "Classic"; +"1.0.33_text_11" = "Party"; +"1.0.33_text_12" = "Carnival"; +"1.0.33_text_13" = "Celebration"; +"1.0.33_text_14" = "Unique"; +"1.0.33_text_15" = "房間等級不夠,不能使用該皮膚。"; diff --git a/YuMi/zh-Hant.lproj/Localizable.strings b/YuMi/zh-Hant.lproj/Localizable.strings index 3430ffb5..7f85234b 100644 --- a/YuMi/zh-Hant.lproj/Localizable.strings +++ b/YuMi/zh-Hant.lproj/Localizable.strings @@ -1563,7 +1563,7 @@ "XPArrangeMicViewController7" = "當前排麥的人數:%@"; "XPArrangeMicViewController8" = "我在隊列中排列位置:%ld"; "XPArrangeMicViewController9" = "報名才能排麥哦~"; -"XPArrangeMicViewController10" = "取消報名"; +"XPArrangeMicViewController10" = "報名"; "XPArrangeMicViewController11" = "取消報名"; "XPArrangeMicViewController12" = "麥上無空位了"; "XPArrangeMicViewController14" = "立即報名,你就是排麥第一人啦"; @@ -3487,3 +3487,19 @@ "1.0.31_text_2" = "國家/地區列表"; //"1.0.31_text_3" = "Selective cardiography"; "1.0.31_text_4" = "選擇麥位"; + +"1.0.33_text_1" = "Room Mode"; +"1.0.33_text_2" = "Room Type"; +"1.0.33_text_3" = "Mic Skin"; +"1.0.33_text_4" = "Mic Effect"; +"1.0.33_text_5" = "Use"; +"1.0.33_text_6" = "Room Value:"; +"1.0.33_text_7" = "Room Admind:"; +"1.0.33_text_8" = "Distance to Next Lv:"; +"1.0.33_text_9" = "Lv."; +"1.0.33_text_10" = "Classic"; +"1.0.33_text_11" = "Party"; +"1.0.33_text_12" = "Carnival"; +"1.0.33_text_13" = "Celebration"; +"1.0.33_text_14" = "Unique"; +"1.0.33_text_15" = "房間等級不夠,不能使用該皮膚。";