diff --git a/.vscode/settings.json b/.vscode/settings.json index 1ba43bd1..199b1d12 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,11 +8,13 @@ ], "cSpell.words": [ "autoreleasepool", + "Autoresizing", "Bugly", "MSRTL", "NIMSDK", "Nonnull", "NSEC", + "Procotol", "Subview", "Superview", "Uids" diff --git a/YuMi.xcodeproj/project.pbxproj b/YuMi.xcodeproj/project.pbxproj index efb6753f..ca3e3d55 100644 --- a/YuMi.xcodeproj/project.pbxproj +++ b/YuMi.xcodeproj/project.pbxproj @@ -489,6 +489,7 @@ 23FF42762AA6E1480055733C /* XPHomeRecommendOtherRoomView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23FF42752AA6E1480055733C /* XPHomeRecommendOtherRoomView.m */; }; 23FF42792AA6E19C0055733C /* HomeMenuSourceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 23FF42782AA6E19C0055733C /* HomeMenuSourceModel.m */; }; 23FF428E2AAB2D3A0055733C /* XPCandyTreeBuyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 23FF428D2AAB2D3A0055733C /* XPCandyTreeBuyView.m */; }; + 4C1119722DD7218300C18416 /* MyEventsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1119712DD7218300C18416 /* MyEventsViewController.m */; }; 4C1392932D6D963700A6DFB5 /* SubRechargersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1392922D6D963600A6DFB5 /* SubRechargersViewController.m */; }; 4C1392962D6DA22B00A6DFB5 /* RechargerTransferHistoryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1392952D6DA22B00A6DFB5 /* RechargerTransferHistoryViewController.m */; }; 4C1392992D6DB4CD00A6DFB5 /* MoliMoneyLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1392982D6DB4CD00A6DFB5 /* MoliMoneyLabel.m */; }; @@ -497,6 +498,7 @@ 4C1892992CF84349004D4426 /* RoomCahtCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1892982CF84349004D4426 /* RoomCahtCell.m */; }; 4C1A141B2DCB4AB700B6D0CA /* ChatFaceVo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A141A2DCB4AB700B6D0CA /* ChatFaceVo.m */; }; 4C3475C42DD1FE590099B984 /* CreateEventSelectRoomViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3475C32DD1FE590099B984 /* CreateEventSelectRoomViewController.m */; }; + 4C3851992DD5F4D50089CFCC /* EventConfigModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3851982DD5F4D50089CFCC /* EventConfigModel.m */; }; 4C38C2AD2D84064400CFA4A8 /* LoginInputItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C38C2AC2D84064300CFA4A8 /* LoginInputItemView.m */; }; 4C38C2B02D84070600CFA4A8 /* AccountBindingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C38C2AF2D84070600CFA4A8 /* AccountBindingViewController.m */; }; 4C44BD5D2D151B5C00F321FA /* RoomSideMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C44BD5C2D151B5C00F321FA /* RoomSideMenu.m */; }; @@ -523,7 +525,6 @@ 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 */; }; - 4C85DB7E2DCDD70400FD9839 /* CreateEventViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C85DB7D2DCDD70400FD9839 /* CreateEventViewController.m */; }; 4C85DB812DCDD83E00FD9839 /* CreateEventPresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C85DB802DCDD83E00FD9839 /* CreateEventPresenter.m */; }; 4C85DB842DCDDD6800FD9839 /* CreateEventViewControllerV2.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C85DB832DCDDD6800FD9839 /* CreateEventViewControllerV2.m */; }; 4C864A022D55F4F600191AE0 /* LuckyPackagePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C864A012D55F4F600191AE0 /* LuckyPackagePresenter.m */; }; @@ -549,6 +550,7 @@ 4CC312272D79A10100F57A07 /* ShareProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC312262D79A10100F57A07 /* ShareProvider.m */; }; 4CC6195A2CEC7770008C1EE8 /* MyDressingDataPresent.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC619592CEC7770008C1EE8 /* MyDressingDataPresent.m */; }; 4CC6195D2CEC996E008C1EE8 /* MyDressingDataModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6195C2CEC996E008C1EE8 /* MyDressingDataModel.m */; }; + 4CCB809F2DD5DFDF00C756D3 /* EventRoomModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCB809E2DD5DFDF00C756D3 /* EventRoomModel.m */; }; 4CCFDA002DD59038009BD2FD /* EventCenterEmptyCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFD9FF2DD59038009BD2FD /* EventCenterEmptyCell.m */; }; 4CCFDA032DD59211009BD2FD /* Api+EventCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFDA022DD59211009BD2FD /* Api+EventCenter.m */; }; 4CCFDA062DD5C127009BD2FD /* EventItemModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFDA052DD5C127009BD2FD /* EventItemModel.m */; }; @@ -2632,6 +2634,8 @@ 23FF42782AA6E19C0055733C /* HomeMenuSourceModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeMenuSourceModel.m; sourceTree = ""; }; 23FF428C2AAB2D3A0055733C /* XPCandyTreeBuyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XPCandyTreeBuyView.h; sourceTree = ""; }; 23FF428D2AAB2D3A0055733C /* XPCandyTreeBuyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XPCandyTreeBuyView.m; sourceTree = ""; }; + 4C1119702DD7218300C18416 /* MyEventsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyEventsViewController.h; sourceTree = ""; }; + 4C1119712DD7218300C18416 /* MyEventsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyEventsViewController.m; sourceTree = ""; }; 4C1392912D6D963600A6DFB5 /* SubRechargersViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SubRechargersViewController.h; sourceTree = ""; }; 4C1392922D6D963600A6DFB5 /* SubRechargersViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SubRechargersViewController.m; sourceTree = ""; }; 4C1392942D6DA22B00A6DFB5 /* RechargerTransferHistoryViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RechargerTransferHistoryViewController.h; sourceTree = ""; }; @@ -2646,6 +2650,8 @@ 4C1A141A2DCB4AB700B6D0CA /* ChatFaceVo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatFaceVo.m; sourceTree = ""; }; 4C3475C22DD1FE590099B984 /* CreateEventSelectRoomViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CreateEventSelectRoomViewController.h; sourceTree = ""; }; 4C3475C32DD1FE590099B984 /* CreateEventSelectRoomViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CreateEventSelectRoomViewController.m; sourceTree = ""; }; + 4C3851972DD5F4D50089CFCC /* EventConfigModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EventConfigModel.h; sourceTree = ""; }; + 4C3851982DD5F4D50089CFCC /* EventConfigModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EventConfigModel.m; sourceTree = ""; }; 4C38C2AB2D84064300CFA4A8 /* LoginInputItemView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LoginInputItemView.h; sourceTree = ""; }; 4C38C2AC2D84064300CFA4A8 /* LoginInputItemView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LoginInputItemView.m; sourceTree = ""; }; 4C38C2AE2D84070600CFA4A8 /* AccountBindingViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccountBindingViewController.h; sourceTree = ""; }; @@ -2696,8 +2702,6 @@ 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 = ""; }; - 4C85DB7C2DCDD70400FD9839 /* CreateEventViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CreateEventViewController.h; sourceTree = ""; }; - 4C85DB7D2DCDD70400FD9839 /* CreateEventViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CreateEventViewController.m; sourceTree = ""; }; 4C85DB7F2DCDD83E00FD9839 /* CreateEventPresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CreateEventPresenter.h; sourceTree = ""; }; 4C85DB802DCDD83E00FD9839 /* CreateEventPresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CreateEventPresenter.m; sourceTree = ""; }; 4C85DB822DCDDD6800FD9839 /* CreateEventViewControllerV2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CreateEventViewControllerV2.h; sourceTree = ""; }; @@ -2746,6 +2750,8 @@ 4CC619592CEC7770008C1EE8 /* MyDressingDataPresent.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyDressingDataPresent.m; sourceTree = ""; }; 4CC6195B2CEC996E008C1EE8 /* MyDressingDataModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyDressingDataModel.h; sourceTree = ""; }; 4CC6195C2CEC996E008C1EE8 /* MyDressingDataModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyDressingDataModel.m; sourceTree = ""; }; + 4CCB809D2DD5DFDF00C756D3 /* EventRoomModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EventRoomModel.h; sourceTree = ""; }; + 4CCB809E2DD5DFDF00C756D3 /* EventRoomModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EventRoomModel.m; sourceTree = ""; }; 4CCFD9FE2DD59038009BD2FD /* EventCenterEmptyCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EventCenterEmptyCell.h; sourceTree = ""; }; 4CCFD9FF2DD59038009BD2FD /* EventCenterEmptyCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EventCenterEmptyCell.m; sourceTree = ""; }; 4CCFDA012DD59211009BD2FD /* Api+EventCenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Api+EventCenter.h"; sourceTree = ""; }; @@ -10096,12 +10102,12 @@ 541DD9542C1EDEFB00B616C4 /* XPHomePagingViewController.m */, 4CBDC4222DC0B078005A75B9 /* EventCenterViewController.h */, 4CBDC4232DC0B078005A75B9 /* EventCenterViewController.m */, - 4C85DB7C2DCDD70400FD9839 /* CreateEventViewController.h */, - 4C85DB7D2DCDD70400FD9839 /* CreateEventViewController.m */, 4C85DB822DCDDD6800FD9839 /* CreateEventViewControllerV2.h */, 4C85DB832DCDDD6800FD9839 /* CreateEventViewControllerV2.m */, 4C3475C22DD1FE590099B984 /* CreateEventSelectRoomViewController.h */, 4C3475C32DD1FE590099B984 /* CreateEventSelectRoomViewController.m */, + 4C1119702DD7218300C18416 /* MyEventsViewController.h */, + 4C1119712DD7218300C18416 /* MyEventsViewController.m */, ); path = View; sourceTree = ""; @@ -10146,6 +10152,10 @@ 54C389662C24464600FD47B1 /* HomeMineRoomModel.m */, 4CCFDA042DD5C127009BD2FD /* EventItemModel.h */, 4CCFDA052DD5C127009BD2FD /* EventItemModel.m */, + 4CCB809D2DD5DFDF00C756D3 /* EventRoomModel.h */, + 4CCB809E2DD5DFDF00C756D3 /* EventRoomModel.m */, + 4C3851972DD5F4D50089CFCC /* EventConfigModel.h */, + 4C3851982DD5F4D50089CFCC /* EventConfigModel.m */, ); path = Model; sourceTree = ""; @@ -12268,6 +12278,7 @@ E824544E26F5BC1A00BE8163 /* XPMineModifPayPwdView.m in Sources */, E86E79CD28A4E045006DAF48 /* MessageContentRiskAlertView.m in Sources */, E855515B280559FE005F293F /* NSDate+DateUtils.m in Sources */, + 4C3851992DD5F4D50089CFCC /* EventConfigModel.m in Sources */, 544879F02CD22D4B00D58DC1 /* CustomRoomBGItemModel.m in Sources */, E8664EE327E47711000171BA /* XPRoomPKRecordNickView.m in Sources */, E8C1CD7327D8A16500376F83 /* XPRoomFaceTool.m in Sources */, @@ -12717,6 +12728,7 @@ 235A45232B04BEB6009753F5 /* PIBaseModel.m in Sources */, E8DEC9A82764A68B0078CB70 /* Api+MoreMenu.m in Sources */, 9B86D87A2817DD8400494FCD /* XPRoomEnterHideTipView.m in Sources */, + 4CCB809F2DD5DFDF00C756D3 /* EventRoomModel.m in Sources */, 23FE47E12BB41CF200F09D23 /* PINobleCenterListReusableView.m in Sources */, 4CE746D52D92C1080094E496 /* BravoGiftWinningFlagView.m in Sources */, E8AC721026F43955007D6E91 /* UIImageConstant.m in Sources */, @@ -12953,7 +12965,6 @@ E85E7BB92A4ED89F00B6D00A /* XPIncomeRecordGoldDetailsHeadView.m in Sources */, E84A2EAB2A528A4100D6AF8A /* XPIncomeRecordGoldDetailsPickViewView.m in Sources */, E82107812987D7F300DE7040 /* MessageMonentsModel.m in Sources */, - 4C85DB7E2DCDD70400FD9839 /* CreateEventViewController.m in Sources */, E81366E726F0A49E0076364C /* NSString+Utils.m in Sources */, 23194DD22AD14BF000649F51 /* DDFileLogger.m in Sources */, E8EEB90126FC31B6007C6EBA /* XPMineUserInfoPresenter.m in Sources */, @@ -13332,6 +13343,7 @@ E875FA8727D619820086ED04 /* ClientDataModel.m in Sources */, 9BFB10222897D68400B3985E /* XPTabAnchorCardModel.m in Sources */, E8B846DC26FDE24300A777FE /* RechargeListModel.m in Sources */, + 4C1119722DD7218300C18416 /* MyEventsViewController.m in Sources */, 9B1B7292280010E8003FACE9 /* Api+FansTeam.m in Sources */, 4C815A172CFEB758002A46A6 /* SuperBlockViewController.m in Sources */, E8A3539728FE7C250014A784 /* XPWishGiftPresenter.m in Sources */, diff --git a/YuMi/Assets.xcassets/1.0.15/luck_gift_flag.imageset/1@3x.png b/YuMi/Assets.xcassets/1.0.15/luck_gift_flag.imageset/1@3x.png index 8c6e0bca..44c44cee 100644 Binary files a/YuMi/Assets.xcassets/1.0.15/luck_gift_flag.imageset/1@3x.png and b/YuMi/Assets.xcassets/1.0.15/luck_gift_flag.imageset/1@3x.png differ diff --git a/YuMi/Assets.xcassets/20.20.59/event_arrow_black.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/event_arrow_black.imageset/Contents.json new file mode 100644 index 00000000..db10580d --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/event_arrow_black.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 25@3x (1).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/event_arrow_black.imageset/切图 25@3x (1).png b/YuMi/Assets.xcassets/20.20.59/event_arrow_black.imageset/切图 25@3x (1).png new file mode 100644 index 00000000..04955bfe Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/event_arrow_black.imageset/切图 25@3x (1).png differ diff --git a/YuMi/Assets.xcassets/20.20.59/event_delete.imageset/Contents.json b/YuMi/Assets.xcassets/20.20.59/event_delete.imageset/Contents.json new file mode 100644 index 00000000..efe82bf0 --- /dev/null +++ b/YuMi/Assets.xcassets/20.20.59/event_delete.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "切图 68@3x (3).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YuMi/Assets.xcassets/20.20.59/event_delete.imageset/切图 68@3x (3).png b/YuMi/Assets.xcassets/20.20.59/event_delete.imageset/切图 68@3x (3).png new file mode 100644 index 00000000..2d7578b3 Binary files /dev/null and b/YuMi/Assets.xcassets/20.20.59/event_delete.imageset/切图 68@3x (3).png differ diff --git a/YuMi/Config/ClientConfig.m b/YuMi/Config/ClientConfig.m index 6c1fd483..dae162ab 100644 --- a/YuMi/Config/ClientConfig.m +++ b/YuMi/Config/ClientConfig.m @@ -76,7 +76,7 @@ model.faceInitData = faceInitData; if (faceInitData) { [XPRoomFaceTool shareFaceTool].version = [NSString stringWithFormat:@"%@",faceInitData[@"version"]]; - [XPRoomFaceTool shareFaceTool].zipMd5 = [[NSString stringWithFormat:@"%@",faceInitData[@"zipMd5"]] uppercaseString]; + [XPRoomFaceTool shareFaceTool].zipMd5 = [[NSString stringWithFormat:@"%@",faceInitData[@"zipMd5"]] uppercaseString]; [XPRoomFaceTool shareFaceTool].zipUrl = [NSString stringWithFormat:@"%@",faceInitData[@"zipUrl"]]; ///表情的数据保存本地 [[XPRoomFaceTool shareFaceTool] saveFaceInfoList:faceInitData]; diff --git a/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m b/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m index c2bc860e..a760b61f 100644 --- a/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m +++ b/YuMi/Modules/YMMessage/View/Session/Cell/MessageCell.m @@ -54,10 +54,10 @@ 消息背景 */ @property (nonatomic, strong) UIView * messageBackground; -@property (nonatomic, strong) MASConstraint * messageBackgroundLeft; -@property (nonatomic, strong) MASConstraint * messageBackgroundRight; -@property (nonatomic, strong) MASConstraint * messageBackgroundLeftAvatar; -@property (nonatomic, strong) MASConstraint * messageBackgroundRightAvatar; +@property (nonatomic, strong) MASConstraint * bgLeadingToOtherAvatarTrailing; +@property (nonatomic, strong) MASConstraint * bgTrailingToMeAvatarLeading; +@property (nonatomic, strong) MASConstraint * bgLeadingToOtherAvatarLeading; +@property (nonatomic, strong) MASConstraint * bgTrailingToMeAvatarTrailing; /** 消息内容实体 */ @@ -108,11 +108,13 @@ }]; [self.messageBackground mas_makeConstraints:^(MASConstraintMaker *make) { - self.messageBackgroundLeft = make.leading.mas_equalTo(self.leftAvatar.mas_trailing).offset(15).priorityHigh(); - self.messageBackgroundRight = make.trailing.mas_equalTo(self.rightAvatar.mas_leading).offset(-15).priorityHigh(); - self.messageBackgroundLeftAvatar = make.leading.mas_equalTo(self.leftAvatar.mas_leading).priorityHigh(); - self.messageBackgroundRightAvatar = make.trailing.mas_equalTo(self.rightAvatar.mas_trailing).priorityHigh(); + self.bgLeadingToOtherAvatarTrailing = make.leading.mas_equalTo(self.contentView).offset(75).priorityHigh(); + self.bgTrailingToMeAvatarLeading = make.trailing.mas_equalTo(self.contentView).offset(-75).priorityHigh(); + self.bgLeadingToOtherAvatarLeading = make.leading.mas_equalTo(self.contentView).offset(15).priorityHigh(); + self.bgTrailingToMeAvatarTrailing = make.trailing.mas_equalTo(self.contentView).offset(-15).priorityHigh(); make.top.mas_equalTo(self).offset(20); + // 添加最大宽度约束,确保消息背景不会超出右侧边缘 + make.width.lessThanOrEqualTo(self.contentView.mas_width).multipliedBy(0.75); }]; [self.failButton mas_makeConstraints:^(MASConstraintMaker *make) { @@ -220,33 +222,21 @@ self.leftAvatar.hidden = YES; self.rightAvatar.hidden = NO; - if ([classStr isEqualToString:@"AgentMessageTableViewCell"]) { - [self.messageBackgroundLeft uninstall]; - [self.messageBackgroundLeftAvatar install]; - [self.messageBackgroundRight install]; - [self.messageBackgroundRightAvatar uninstall]; - } else { - [self.messageBackgroundLeft install]; - [self.messageBackgroundLeftAvatar uninstall]; - [self.messageBackgroundRight install]; - [self.messageBackgroundRightAvatar uninstall]; - } + [self.bgLeadingToOtherAvatarTrailing uninstall]; + [self.bgLeadingToOtherAvatarLeading uninstall]; + [self.bgTrailingToMeAvatarLeading install]; + [self.bgTrailingToMeAvatarTrailing uninstall]; + self.rightAvatar.imageUrl = avatarUrl; } else { self.leftAvatar.hidden = NO; self.rightAvatar.hidden = YES; - if ([classStr isEqualToString:@"AgentMessageTableViewCell"]) { - [self.messageBackgroundLeft install]; - [self.messageBackgroundLeftAvatar uninstall]; - [self.messageBackgroundRight uninstall]; - [self.messageBackgroundRightAvatar install]; - } else { - [self.messageBackgroundLeft install]; - [self.messageBackgroundRight install]; - [self.messageBackgroundLeftAvatar uninstall]; - [self.messageBackgroundRightAvatar uninstall]; - } + [self.bgLeadingToOtherAvatarTrailing install]; + [self.bgTrailingToMeAvatarLeading uninstall]; + [self.bgLeadingToOtherAvatarLeading uninstall]; + [self.bgTrailingToMeAvatarTrailing uninstall]; + self.leftAvatar.imageUrl = avatarUrl; } @@ -274,8 +264,8 @@ //MARK: 不太理解原来的 layout 关系,对开黑卡特殊处理 if ([classStr isEqualToString:@"MessageGameOrderView"]) { [self.messageBackground mas_remakeConstraints:^(MASConstraintMaker *make) { - self.messageBackgroundLeft = make.leading.mas_equalTo(self.leftAvatar.mas_trailing).offset(15); - self.messageBackgroundRight = make.trailing.mas_equalTo(self.rightAvatar.mas_leading).offset(-15); + self.bgLeadingToOtherAvatarTrailing = make.leading.mas_equalTo(self.contentView).offset(75); + self.bgTrailingToMeAvatarLeading = make.trailing.mas_equalTo(self.contentView).offset(-75); make.top.mas_equalTo(self).offset(20); make.height.mas_equalTo(98 + MESSAGE_PADDING); }]; @@ -285,9 +275,9 @@ }]; } else { [self.messageContent mas_makeConstraints:^(MASConstraintMaker *make) { -// make.edges.mas_equalTo(self.messageBackground); - make.top.bottom.mas_equalTo(self.messageBackground); - make.size.mas_equalTo(self.messageBackground); + make.edges.mas_equalTo(self.messageBackground); +// make.top.bottom.mas_equalTo(self.messageBackground); +// make.size.mas_equalTo(self.messageBackground); }]; } diff --git a/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.m b/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.m index e3dc51a7..974b28dc 100644 --- a/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.m +++ b/YuMi/Modules/YMMessage/View/Session/Cell/PublicEventTableViewCell.m @@ -7,9 +7,12 @@ #import "PublicEventTableViewCell.h" #import "MessagePublicEventModel.h" +#import "XPRoomViewController.h" +#import "XCCurrentVCStackManager.h" @interface PublicEventTableViewCell () +@property (nonatomic, strong) MessagePublicEventModel *model; @property (nonatomic, strong) NetImageView *topImageView; @property (nonatomic, strong) UIImageView *roomIcon; @property (nonatomic, strong) UILabel *roomIDLabel; @@ -65,13 +68,23 @@ } - (void)didTapJoinButton { - + [XPRoomViewController openRoom:@(self.model.roomUid).stringValue + viewController:[XCCurrentVCStackManager shareManager].getCurrentVC]; } - (void)render:(MessageBaseModel *)message { if ([message isKindOfClass:[MessagePublicEventModel class]]) { MessagePublicEventModel *model = (MessagePublicEventModel *)message; - NSLog(@"%@", model); + self.model = model; +// NSLog(@"%@", model); + self.topImageView.imageUrl = model.eventBanner; + self.roomIDLabel.text = [NSString stringWithFormat:YMLocalizedString(@"XPMineGuildViewController6"), + @(model.roomErbanNO)]; + if ([AccountInfoStorage instance].getUid.integerValue == model.roomUid) { + self.eventDescLabel.text = YMLocalizedString(@"20.20.59_text_26"); + } else { + self.eventDescLabel.text = YMLocalizedString(@"20.20.59_text_27"); + } } } @@ -96,7 +109,7 @@ - (UILabel *)roomIDLabel { if (!_roomIDLabel) { - _roomIDLabel = [UILabel labelInitWithText:YMLocalizedString(@"XPMineGuildViewController6") + _roomIDLabel = [UILabel labelInitWithText:@"" font:kFontRegular(13) textColor:UIColorFromRGB(0x313131)]; } @@ -105,7 +118,7 @@ - (UILabel *)eventDescLabel { if (!_eventDescLabel) { - _eventDescLabel = [UILabel labelInitWithText:@"Your Event is about to start! Your fans and subscribers have been notified!" + _eventDescLabel = [UILabel labelInitWithText:@"" font:kFontMedium(14) textColor:UIColorFromRGB(0x313131)]; _eventDescLabel.numberOfLines = 0; diff --git a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/AgentMessageModel.m b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/AgentMessageModel.m index 50ccd0d3..ad1a1ba5 100644 --- a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/AgentMessageModel.m +++ b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/AgentMessageModel.m @@ -26,9 +26,6 @@ NSDictionary *data = attachment.data; if (data) { AgentMessageModel *model = [AgentMessageModel modelWithJSON:data]; -//#if DEBUG -// model.url = @"/guildMember/quitAudit?uid\\u003d3456\\u0026"; -//#endif self.url = model.url; self.title = model.title; self.content = model.content; diff --git a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.h b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.h index ef9e859d..448c0e75 100644 --- a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.h +++ b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.h @@ -17,7 +17,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy) NSString *eventTopic; @property (nonatomic, copy) NSString *eventDetail; @property (nonatomic, assign) NSInteger type; -@property (nonatomic, assign) NSInteger roomErbanNo; +@property (nonatomic, assign) NSInteger roomErbanNO; @end diff --git a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.m b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.m index eb477aa9..2b507755 100644 --- a/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.m +++ b/YuMi/Modules/YMMessage/View/Session/Content/SesssionModel/MessagePublicEventModel.m @@ -6,7 +6,7 @@ // #import "MessagePublicEventModel.h" - +#import "AttachmentModel.h" @implementation MessagePublicEventModel - (instancetype)initWithMessage:(NIMMessage *)message { @@ -14,8 +14,34 @@ self.message = message; self.isHiddenAvatar = NO; self.messageType = SessionMessageType_Custom; - // TODO: 计算高度 - self.height = 230; + + NIMCustomObject *obj = (NIMCustomObject *)message.messageObject; + AttachmentModel *attachment = (AttachmentModel *)obj.attachment; + NSDictionary *data = attachment.data; + if (data) { + MessagePublicEventModel *model = [MessagePublicEventModel modelWithJSON:data]; + self.eventBanner = model.eventBanner; + self.roomUid = model.roomUid; + self.id = model.id; + self.eventTopic = model.eventTopic; + self.eventDetail = model.eventDetail; + self.type = model.type; + self.roomErbanNO = model.roomErbanNO; + } +// CGSize maxSize = CGSizeMake(260, CGFLOAT_MAX); +// +// // 使用 NSString 的 boundingRectWithSize 方法来计算高度 +// CGRect textRect = [self.eventTopic boundingRectWithSize:maxSize +// options:NSStringDrawingUsesLineFragmentOrigin +// attributes:@{NSFontAttributeName: kFontMedium(14)} +// context:nil]; +// CGFloat bannerHeight = 86; +// CGFloat contentHeight = textRect.size.height; +// CGFloat buttonHeight = 43; +// +// self.height = bannerHeight + contentHeight + buttonHeight + 28 + 28; + + self.height = 240; } return self; } diff --git a/YuMi/Modules/YMMessage/View/Session/SessionViewController.m b/YuMi/Modules/YMMessage/View/Session/SessionViewController.m index 83f2bd97..dd2dbeb6 100644 --- a/YuMi/Modules/YMMessage/View/Session/SessionViewController.m +++ b/YuMi/Modules/YMMessage/View/Session/SessionViewController.m @@ -235,10 +235,10 @@ #pragma mark - cell的样式 - (MessageBaseModel *)modeTransformMessage:(NIMMessage *)message { MessageBaseModel * model; -#if DEBUG - model = [[MessagePublicEventModel alloc] initWithMessage:message]; - return model; -#endif +//#if DEBUG +// model = [[MessagePublicEventModel alloc] initWithMessage:message]; +// return model; +//#endif switch (message.messageType) { case NIMMessageTypeText: model = [[MessageTextModel alloc] initWithMessage:message]; @@ -267,16 +267,6 @@ MessageBaseModel * model; NIMCustomObject *obj = (NIMCustomObject *)message.messageObject; AttachmentModel *attachment = (AttachmentModel *)obj.attachment; -// if (attachment.first == CustomMessageType_System_message) { -// switch (attachment.second) { -// case Custom_Message_Sub_System_message: -// model = [[AgentMessageModel alloc] initWithMessage:message]; -// break; -// -// default: -// break; -// } -// } NSInteger first = attachment.first; NSInteger second = attachment.second; diff --git a/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.h b/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.h index 9fe9d3c9..0dd8db20 100644 --- a/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.h +++ b/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.h @@ -11,6 +11,7 @@ NS_ASSUME_NONNULL_BEGIN @class UserInfoModel; @interface XPMineBlackListTableViewCell : UITableViewCell @property (nonatomic,strong) UserInfoModel *userInfo; +@property (nonatomic, copy)void(^handleTapRemove)(UserInfoModel *userInfo); @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.m b/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.m index f3f78589..a7647039 100644 --- a/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.m +++ b/YuMi/Modules/YMMine/View/Cell/XPMineBlackListTableViewCell.m @@ -19,23 +19,26 @@ @property (nonatomic,strong) NetImageView *avatarImageView; ///昵称 @property (nonatomic,strong) UILabel *nickLabel; +@property (nonatomic, strong) UIButton *removeButton; @end @implementation XPMineBlackListTableViewCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { - [self initSubViews]; - [self initSubViewConstraints]; - } - return self; + if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + [self initSubViews]; + [self initSubViewConstraints]; + } + return self; } + #pragma mark - Private Method - (void)initSubViews { self.backgroundColor = [DJDKMIMOMColor appCellBackgroundColor]; self.selectionStyle = UITableViewCellSelectionStyleNone; [self.contentView addSubview:self.avatarImageView]; [self.contentView addSubview:self.nickLabel]; + [self.contentView addSubview:self.removeButton]; } - (void)initSubViewConstraints { @@ -50,7 +53,21 @@ make.trailing.mas_lessThanOrEqualTo(self.contentView).offset(-5); make.centerY.mas_equalTo(self.contentView); }]; + + [self.removeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.trailing.mas_equalTo(self.contentView).offset(-8); + make.centerY.mas_equalTo(self.contentView); + make.height.mas_equalTo(30); + make.width.mas_greaterThanOrEqualTo(60); + }]; } + +- (void)didTapRemove { + if (_handleTapRemove) { + self.handleTapRemove(self.userInfo); + } +} + #pragma mark - Getters And Setters - (void)setUserInfo:(UserInfoModel *)userInfo { _userInfo = userInfo; @@ -81,4 +98,22 @@ return _nickLabel; } +- (UIButton *)removeButton { + if (!_removeButton) { + _removeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_removeButton.titleLabel setFont:kFontRegular(13)]; + [_removeButton setTitle:YMLocalizedString(@"XPMineBlackListViewController1") forState:UIControlStateNormal]; + [_removeButton setTitleColor:UIColorFromRGB(0xfcc074) forState:UIControlStateNormal]; + [_removeButton setCornerRadius:15 + corners:kCALayerMaxXMaxYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner + borderWidth:1 + borderColor:UIColorFromRGB(0xfcc074)]; + _removeButton.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10); + _removeButton.titleLabel.lineBreakMode = NSLineBreakByClipping; + _removeButton.clipsToBounds = NO; + [_removeButton addTarget:self action:@selector(didTapRemove) forControlEvents:UIControlEventTouchUpInside]; + } + return _removeButton; +} + @end diff --git a/YuMi/Modules/YMMine/View/Setting/XPMineBlackListViewController.m b/YuMi/Modules/YMMine/View/Setting/XPMineBlackListViewController.m index cea34679..bcdf9ecc 100644 --- a/YuMi/Modules/YMMine/View/Setting/XPMineBlackListViewController.m +++ b/YuMi/Modules/YMMine/View/Setting/XPMineBlackListViewController.m @@ -70,6 +70,16 @@ if (self.datasource.count > 0) { XPMineBlackListTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineBlackListTableViewCell class])]; cell.userInfo = [self.datasource xpSafeObjectAtIndex:indexPath.row]; + @kWeakify(self); + [cell setHandleTapRemove:^(UserInfoModel * _Nonnull userInfo) { + @kStrongify(self); + [[NIMSDK sharedSDK].userManager removeFromBlackBlackList:[NSString stringWithFormat:@"%ld", userInfo.uid] completion:^(NSError * _Nullable error) { + if (error == nil) { + [self.datasource removeObject:userInfo]; + [self.tableView reloadData]; + } + }]; + }]; return cell; } XPMineFriendEmptyTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([XPMineFriendEmptyTableViewCell class])]; diff --git a/YuMi/Modules/YMNewHome/Api/Api+EventCenter.h b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.h index 2eca4c7c..d9ab2498 100644 --- a/YuMi/Modules/YMNewHome/Api/Api+EventCenter.h +++ b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.h @@ -11,6 +11,10 @@ NS_ASSUME_NONNULL_BEGIN @interface Api(EventCenter) +/// 活動配置 ++ (void)usereventGoldConfig:(HttpRequestHelperCompletion)complection + uid:(NSString *)uid; + /// 活动广场列表 + (void)usereventSquare:(HttpRequestHelperCompletion)complection page:(NSNumber *)page @@ -28,6 +32,49 @@ NS_ASSUME_NONNULL_BEGIN pageSize:(NSNumber *)pageSize uid:(NSString *)uid; +/// 房间列表 ++ (void)roomRoleListRoom:(HttpRequestHelperCompletion)complection; + + +/// <#Description#> +/// - Parameters: +/// - complection: complete block +/// - eventBanner: 活动图片 +/// - eventDetail: 活动描述内容 +/// - eventDuration: 活动时长 +/// - eventStartTimeStr: 活动开始时间,格式(yyyy-MM-dd HH:mm:ss) +/// - eventTopic: 活动标题 +/// - noticeFans: 是否通知用户粉丝,0-否,1-是 +/// - payBanner: 是否上传首页第二Banner0-否,1-是 +/// - payGoldNum: 上传首页第二Banner付款金币数 +/// - roomUid: 房间uid +/// - uid: 用户uid ++ (void)usereventPublish:(HttpRequestHelperCompletion)complection + eventBanner:(NSString *)eventBanner + eventDetail:(NSString *)eventDetail + eventDuration:(NSNumber *)eventDuration + eventStartTimeStr:(NSString *)eventStartTimeStr + eventTopic:(NSString *)eventTopic + noticeFans:(NSNumber *)noticeFans + payBanner:(NSNumber *)payBanner + payGoldNum:(NSNumber *)payGoldNum + roomUid:(NSString *)roomUid + uid:(NSString *)uid; + +/// 订阅活动 +/// - Parameters: +/// - complection: complete +/// - eventId: 活动 id +/// - subStatus: 订阅状态 0-取消订阅,1-订阅 +/// - uid: uid ++ (void)usereventSub:(HttpRequestHelperCompletion)complection + eventId:(NSNumber *)eventId + subStatus:(NSNumber *)subStatus + uid:(NSString *)uid; + +/// 删除活动 ++ (void)usereventDel:(HttpRequestHelperCompletion)complection eventId:(NSNumber *)eventId; + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/Api/Api+EventCenter.m b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.m index c7a326c9..44171355 100644 --- a/YuMi/Modules/YMNewHome/Api/Api+EventCenter.m +++ b/YuMi/Modules/YMNewHome/Api/Api+EventCenter.m @@ -9,6 +9,14 @@ @implementation Api(EventCenter) +/// 活動配置 ++ (void)usereventGoldConfig:(HttpRequestHelperCompletion)complection + uid:(NSString *)uid{ + [self makeRequest:@"userevent/goldConfig" + method:HttpRequestHelperMethodGET + completion:complection, __FUNCTION__, uid, nil]; +} + /// 活动广场列表 + (void)usereventSquare:(HttpRequestHelperCompletion)complection page:(NSNumber *)page @@ -38,4 +46,41 @@ completion:complection, __FUNCTION__, page, pageSize, uid, nil]; } +/// 房间列表 ++ (void)roomRoleListRoom:(HttpRequestHelperCompletion)complection { + [self makeRequest:@"roomrole/listroom" + method:HttpRequestHelperMethodGET + completion:complection, __FUNCTION__, nil]; +} + ++ (void)usereventPublish:(HttpRequestHelperCompletion)complection + eventBanner:(NSString *)eventBanner + eventDetail:(NSString *)eventDetail + eventDuration:(NSNumber *)eventDuration + eventStartTimeStr:(NSString *)eventStartTimeStr + eventTopic:(NSString *)eventTopic + noticeFans:(NSNumber *)noticeFans + payBanner:(NSNumber *)payBanner + payGoldNum:(NSNumber *)payGoldNum + roomUid:(NSString *)roomUid + uid:(NSString *)uid { + [self makeRequest:@"/userevent/publish" + method:HttpRequestHelperMethodPOST + completion:complection, __FUNCTION__, eventBanner, eventDetail, eventDuration, eventStartTimeStr, eventTopic, noticeFans, payBanner, payGoldNum, roomUid, uid, nil]; +} + ++ (void)usereventSub:(HttpRequestHelperCompletion)complection + eventId:(NSNumber *)eventId + subStatus:(NSNumber *)subStatus + uid:(NSString *)uid { + [self makeRequest:@"userevent/sub" method:HttpRequestHelperMethodPOST completion:complection, + __FUNCTION__, eventId, subStatus, uid, nil]; +} + ++ (void)usereventDel:(HttpRequestHelperCompletion)complection eventId:(NSNumber *)eventId { + [self makeRequest:@"userevent/del" + method:HttpRequestHelperMethodPOST + completion:complection, __FUNCTION__, eventId, nil]; +} + @end diff --git a/YuMi/Modules/YMNewHome/Model/EventConfigModel.h b/YuMi/Modules/YMNewHome/Model/EventConfigModel.h new file mode 100644 index 00000000..8cd49bcc --- /dev/null +++ b/YuMi/Modules/YMNewHome/Model/EventConfigModel.h @@ -0,0 +1,21 @@ +// +// EventConfigModel.h +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "PIBaseModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface EventConfigModel : PIBaseModel + +@property (nonatomic, assign) NSInteger latestDay; +@property (nonatomic, assign) NSInteger earliestBeginHour; +@property (nonatomic, assign) NSInteger goldNum; +@property (nonatomic, copy) NSArray *durations; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/Model/EventConfigModel.m b/YuMi/Modules/YMNewHome/Model/EventConfigModel.m new file mode 100644 index 00000000..08d10ff5 --- /dev/null +++ b/YuMi/Modules/YMNewHome/Model/EventConfigModel.m @@ -0,0 +1,12 @@ +// +// EventConfigModel.m +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "EventConfigModel.h" + +@implementation EventConfigModel + +@end diff --git a/YuMi/Modules/YMNewHome/Model/EventItemModel.h b/YuMi/Modules/YMNewHome/Model/EventItemModel.h index e9911ebf..35390075 100644 --- a/YuMi/Modules/YMNewHome/Model/EventItemModel.h +++ b/YuMi/Modules/YMNewHome/Model/EventItemModel.h @@ -34,6 +34,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) NSTimeInterval createTime; // 创建时间戳 @property (nonatomic, copy) NSString *gender; +@property (nonatomic, copy) NSString *nick; @end diff --git a/YuMi/Modules/YMNewHome/Model/EventRoomModel.h b/YuMi/Modules/YMNewHome/Model/EventRoomModel.h new file mode 100644 index 00000000..ebd3b53d --- /dev/null +++ b/YuMi/Modules/YMNewHome/Model/EventRoomModel.h @@ -0,0 +1,26 @@ +// +// EventRoomModel.h +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "PIBaseModel.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface EventRoomModel : PIBaseModel +@property (nonatomic, copy) NSString *roomName; +@property (nonatomic, assign) NSInteger roomUid; +@property (nonatomic, assign) NSInteger erbanNo; +@property (nonatomic, copy) NSString *avatar; +@end + +@interface EventRoomListModel : PIBaseModel + +@property (nonatomic, strong) EventRoomModel *selfRoom; +@property (nonatomic, copy) NSArray *manageRooms; + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/Model/EventRoomModel.m b/YuMi/Modules/YMNewHome/Model/EventRoomModel.m new file mode 100644 index 00000000..3da16d40 --- /dev/null +++ b/YuMi/Modules/YMNewHome/Model/EventRoomModel.m @@ -0,0 +1,25 @@ +// +// EventRoomModel.m +// YuMi +// +// Created by P on 2025/5/15. +// + +#import "EventRoomModel.h" + +@implementation EventRoomModel + + + +@end + +@implementation EventRoomListModel + ++ (NSDictionary *)objectClassInArray { + return @{ + @"selfRoom": [EventRoomModel class], + @"manageRooms": [EventRoomModel class], + }; +} + +@end diff --git a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h index d4fbb288..d037f75e 100644 --- a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h +++ b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h @@ -7,34 +7,59 @@ #import "BaseMvpPresenter.h" #import "EventItemModel.h" +#import "EventRoomModel.h" +#import "EventConfigModel.h" NS_ASSUME_NONNULL_BEGIN @protocol CreateEventPresenterProcotol @optional + +- (void)loadCongfigSuccess:(EventConfigModel *)model; +- (void)loadCongfigFailure:(NSString *)msg; + - (void)eventSquareListSuccess:(NSArray *)list; - (void)eventSquareListFailure:(NSString *)msg; -- (void)myCreateEventListSuccess:(NSArray *)list; +- (void)myCreateEventListSuccess:(NSArray *)list; - (void)myCreateEventListFailure:(NSString *)msg; -- (void)mySubEventListSuccess:(NSArray *)list; +- (void)mySubEventListSuccess:(NSArray *)list; - (void)mySubEventListFailure:(NSString *)msg; +- (void)myEventListFailure:(NSString *)msg; + +- (void)myRoomListSuccess:(EventRoomListModel *)listModel; +- (void)myRoomListFailure:(NSString *)msg; + +- (void)createEventSuccess; +- (void)createEventFailure:(NSString *)msg; + +- (void)eventSubActionSuccess:(BOOL)isSub eventId:(NSInteger)eventId; +- (void)eventSubActionFailure:(NSString *)msg; + +- (void)deleteEventSuccess:(NSInteger)eventId; +- (void)deleteEventFailure:(NSString *)msg; @end @interface CreateEventPresenter : BaseMvpPresenter +- (void)loadConfig; - (void)loadEventSquare:(NSInteger)page; - (void)loadMyCreateEvents:(NSInteger)page; - (void)loadMySubEvents:(NSInteger)page; +- (void)loadMyEvents; +- (void)loadMyRooms; + +- (void)deleteEvent:(NSInteger)eventId; + +- (void)subEvent:(BOOL)isSub eventId:(NSInteger)eventId; - (void)createEventWithTitle:(NSString *)title - image:(UIImage *)image - uploadToHome:(BOOL)uploadToHome - roomId:(NSString *)roomId - startTime:(NSDate *)startTime + image:(NSString *)imagePath + uploadToHome:(BOOL)uploadToHome + startTime:(NSString *)startTime duration:(NSInteger)duration content:(NSString *)content notifyFans:(BOOL)notifyFans; diff --git a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m index 8836371c..7ee0d78a 100644 --- a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m +++ b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m @@ -8,6 +8,8 @@ #import "CreateEventPresenter.h" #import "Api+EventCenter.h" +#import + @interface CreateEventPresenter() @end @@ -15,6 +17,19 @@ @implementation CreateEventPresenter // Maybe 用一个方法 + 枚举指来指代一个功能类型的 api call? +- (void)loadConfig { + [Api usereventGoldConfig:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(loadCongfigSuccess:)]) { + [[self getView] loadCongfigSuccess:[EventConfigModel modelWithJSON:data.data]]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(loadCongfigFailure:)]) { + [[self getView] loadCongfigFailure:msg]; + } + } showLoading:YES errorToast:YES] + uid:[AccountInfoStorage instance].getUid]; +} + - (void)loadEventSquare:(NSInteger)page { [Api usereventSquare:[self createHttpCompletion:^(BaseModel * _Nonnull data) { if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) { @@ -29,11 +44,11 @@ - (void)loadMyCreateEvents:(NSInteger)page { [Api usereventMySquare:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) { - [[self getView] myCreateEventListSuccess:@[]]; + if ([[self getView] respondsToSelector:@selector(myCreateEventListSuccess:)]) { + [[self getView] myCreateEventListSuccess:[EventItemModel modelsWithArray:data.data]]; } } fail:^(NSInteger code, NSString * _Nullable msg) { - if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) { + if ([[self getView] respondsToSelector:@selector(myCreateEventListFailure:)]) { [[self getView] myCreateEventListFailure:msg]; } } showLoading:YES errorToast:YES] @@ -44,12 +59,12 @@ - (void)loadMySubEvents:(NSInteger)page { [Api usereventMySub:[self createHttpCompletion:^(BaseModel * _Nonnull data) { - if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) { - [[self getView] mySubEventListSuccess:@[]]; + if ([[self getView] respondsToSelector:@selector(mySubEventListSuccess:)]) { + [[self getView] mySubEventListSuccess:[EventItemModel modelsWithArray:data.data]]; } } fail:^(NSInteger code, NSString * _Nullable msg) { - if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) { - [[self getView] myCreateEventListFailure:msg]; + if ([[self getView] respondsToSelector:@selector(mySubEventListFailure:)]) { + [[self getView] mySubEventListFailure:msg]; } } showLoading:YES errorToast:YES] page:@(page) @@ -57,54 +72,123 @@ uid:[AccountInfoStorage instance].getUid]; } +- (void)loadMyEvents { + RACSubject *create = [RACSubject subject]; + RACSubject *sub = [RACSubject subject]; + + @kWeakify(self); + [[RACSignal combineLatest:@[create, sub] reduce:^id(NSArray * creates, + NSArray * subs){ + @kStrongify(self); + if ([[self getView] respondsToSelector:@selector(myCreateEventListSuccess:)]) { + [[self getView] myCreateEventListSuccess:creates]; + } + if ([[self getView] respondsToSelector:@selector(mySubEventListSuccess:)]) { + [[self getView] mySubEventListSuccess:subs]; + } + + return nil; + }] subscribeError:^(NSError * _Nullable error) { + @kStrongify(self); + [[self getView] myEventListFailure:error.domain]; + }]; + + [Api usereventMySquare:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + NSArray *array = [EventItemModel modelsWithArray:data.data]; + if (array.count > 4) { + array = [array subarrayWithRange:NSMakeRange(0, 4)]; + } + [create sendNext:array]; + [create sendCompleted]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + [create sendError:[NSError errorWithDomain:msg code:code userInfo:nil]]; + [create sendCompleted]; + } showLoading:YES errorToast:YES] + page:@(1) + pageSize:@20 + uid:[AccountInfoStorage instance].getUid]; + + [Api usereventMySub:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + NSArray *array = [EventItemModel modelsWithArray:data.data]; + [sub sendNext:array]; + [sub sendCompleted]; + } fail:^(NSInteger code, NSString * _Nullable msg) { + [sub sendError:[NSError errorWithDomain:msg code:code userInfo:nil]]; + [sub sendCompleted]; + } showLoading:YES errorToast:YES] + page:@(1) + pageSize:@20 + uid:[AccountInfoStorage instance].getUid]; + +} + +- (void)loadMyRooms { + [Api roomRoleListRoom:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(myRoomListSuccess:)]) { + [[self getView] myRoomListSuccess:[EventRoomListModel modelWithJSON:data.data]]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(myRoomListFailure:)]) { + [[self getView] myRoomListFailure:msg]; + } + } showLoading:YES errorToast:YES]]; +} + +- (void)deleteEvent:(NSInteger)eventId { + [Api usereventDel:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(deleteEventSuccess:)]) { + [[self getView] deleteEventSuccess:eventId]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(deleteEventFailure:)]) { + [[self getView] deleteEventFailure:msg]; + } + } showLoading:YES errorToast:YES] eventId:@(eventId)]; +} + +- (void)subEvent:(BOOL)isSub + eventId:(NSInteger)eventId { + [Api usereventSub:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(eventSubActionSuccess: eventId:)]) { + [[self getView] eventSubActionSuccess:isSub eventId:eventId]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(eventSubActionFailure:)]) { + [[self getView] eventSubActionFailure:msg]; + } + } showLoading:YES errorToast:YES] + eventId:@(eventId) + subStatus:isSub ? @(1) : @(0) + uid:[AccountInfoStorage instance].getUid]; +} + - (void)createEventWithTitle:(NSString *)title - image:(UIImage *)image + image:(NSString *)imagePath uploadToHome:(BOOL)uploadToHome - roomId:(NSString *)roomId - startTime:(NSDate *)startTime + startTime:(NSString *)startTime duration:(NSInteger)duration content:(NSString *)content notifyFans:(BOOL)notifyFans { - // 输入验证 - if (title.length == 0) { -// [[self getView] showError:@"请输入活动标题"]; - return; - } - if (!image) { -// [[self getView] showError:@"请选择活动横幅图片"]; - return; - } - - if (roomId.length == 0) { -// [[self getView] showError:@"请选择房间"]; - return; - } - - if (!startTime) { -// [[self getView] showError:@"请选择开始时间"]; - return; - } - - if (duration <= 0) { -// [[self getView] showError:@"请选择活动时长"]; - return; - } - - if (content.length == 0) { -// [[self getView] showError:@"请输入活动内容"]; - return; - } - - // TODO: 调用网络接口创建活动 - // 1. 上传图片 - // 2. 创建活动 - // 3. 如果uploadToHome为YES,将横幅上传到主页 - - // 模拟网络请求成功 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ -// [[self getView] showCreateSuccess]; - }); + [Api usereventPublish:[self createHttpCompletion:^(BaseModel * _Nonnull data) { + if ([[self getView] respondsToSelector:@selector(createEventSuccess)]) { + [[self getView] createEventSuccess]; + } + } fail:^(NSInteger code, NSString * _Nullable msg) { + if ([[self getView] respondsToSelector:@selector(createEventFailure:)]) { + [[self getView] createEventFailure:msg]; + } + } showLoading:YES errorToast:YES] + eventBanner:imagePath + eventDetail:content + eventDuration:@(duration) + eventStartTimeStr:startTime + eventTopic:title + noticeFans:@(notifyFans) + payBanner:@(uploadToHome) + payGoldNum:@(1000) // TODO: load gold from config + roomUid:[AccountInfoStorage instance].getUid + uid:[AccountInfoStorage instance].getUid]; } @end diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h index 76c307e8..8ed5b14d 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h @@ -3,7 +3,9 @@ @interface EventCenterEmptyCell : UITableViewCell + (CGFloat)cellHeight; -+ (void)registerTo:(UITableView *)tableView; -+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; - ++ (void)registerTo:(UITableView *)tableView withCustomID:(NSString *)cid; ++ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView + customID:(NSString *)cid + atIndexPath:(NSIndexPath *)indexPath; +- (void)updateTitle:(NSString *)title; @end diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m index 6244f046..9aa126ec 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m @@ -2,6 +2,7 @@ @implementation EventCenterEmptyCell { + NSString *cid; UILabel *titleLabel; UIImageView *ufoImageView; } @@ -10,13 +11,21 @@ return 170; } -+ (void)registerTo:(UITableView *)tableView { ++ (void)registerTo:(UITableView *)tableView withCustomID:(NSString *)cid{ + if ([NSString isEmpty:cid]) { + cid = NSStringFromClass([self class]); + } [tableView registerClass:[self class] - forCellReuseIdentifier:NSStringFromClass([self class])]; + forCellReuseIdentifier:cid]; } -+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { - return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath]; ++ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView + customID:(NSString *)cid + atIndexPath:(NSIndexPath *)indexPath; { + if ([NSString isEmpty:cid]) { + cid = NSStringFromClass([self class]); + } + return [tableView dequeueReusableCellWithIdentifier:cid forIndexPath:indexPath]; } - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { @@ -45,4 +54,8 @@ return self; } -@end +- (void)updateTitle:(NSString *)title { + titleLabel.text = title; +} + +@end diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h index 47d34c42..be03f535 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h @@ -6,12 +6,21 @@ // #import -#import "EventItemModel.h" +@class EventItemModel; + +typedef enum : NSUInteger { + EventCellAction_participate, + EventCellAction_sub, + EventCellAction_unsub, + EventCellAction_delete +} EventCellActions; NS_ASSUME_NONNULL_BEGIN @interface EventCenterEventCell : UITableViewCell +@property (nonatomic, copy) void(^statusButtonDidTap)(EventItemModel *model, EventCellActions action); + + (CGFloat)cellHeight; + (void)registerTo:(UITableView *)tableView; + (EventCenterEventCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; diff --git a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m index b5b3291b..2eee9b5d 100644 --- a/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m +++ b/YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m @@ -6,7 +6,7 @@ // #import "EventCenterEventCell.h" - +#import "EventItemModel.h" @interface EventCenterEventCell() @property (nonatomic, strong) EventItemModel *model; @@ -25,6 +25,8 @@ @property (nonatomic, strong) UIButton *statusButton; +@property (nonatomic, assign) EventCellActions action; + @end @implementation EventCenterEventCell @@ -129,6 +131,14 @@ make.trailing.mas_equalTo(self.subLabel.mas_leading).offset(-1); make.size.mas_equalTo(CGSizeMake(14, 14)); }]; + + [self.contentView addSubview:self.statusButton]; + [self.statusButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(self.avatarImageView); + make.trailing.mas_equalTo(self.bgImageView).offset(-13); + make.height.mas_equalTo(26); + make.width.mas_greaterThanOrEqualTo(26); + }]; } return self; } @@ -137,11 +147,117 @@ _model = model; self.bgImageView.imageUrl = model.eventBanner; self.avatarImageView.imageUrl = model.roomAvatar; - self.nameLabel.text = @"123"; + self.nameLabel.text = model.nick; self.idLabel.text = [NSString stringWithFormat:@"ID:%@", @(model.roomErbanNo)]; self.eventDescLabel.text = model.eventTopic; - self.timeLabel.text = @(model.eventStartTime).stringValue; self.subLabel.text = @(model.subNum).stringValue; + + BOOL needUpdateStatus = YES; + if (model.uid == [AccountInfoStorage instance].getUid.integerValue) { + switch (model.eventStatus) { + case 0: + case 2: + case 4: + needUpdateStatus = NO; + [self statusButtonUpdateToDelete]; + break; + + default: + break; + } + } + + + switch (model.liveStatus) { + case 1: + { + if (needUpdateStatus) { + if (model.subStatus) { + [self statusButtonUpdateToUnSub]; + } else { + [self statusButtonUpdateToSub]; + } + } + + self.timeLabel.text = [NSString stringWithFormat:@"%@:%@", + YMLocalizedString(@"20.20.59_text_15"), + model.eventStartTimeStr]; + } + break; + case 2: + if (needUpdateStatus) { + [self statusButtonUpdateToPatricipate]; + } + + self.timeLabel.text = YMLocalizedString(@"20.20.59_text_24"); + break; + case 3: + if (needUpdateStatus) { + if (model.subStatus) { + [self statusButtonUpdateToUnSub]; + } else { + [self statusButtonUpdateToSub]; + } + } + + self.timeLabel.text = YMLocalizedString(@"20.20.59_text_25"); + break; + + default: + break; + } +} + +- (void)statusButtonUpdateToSub { + self.action = EventCellAction_sub; + [self.statusButton setImage:kImage(@"event_ring_sub") forState:UIControlStateNormal]; + [self.statusButton setTitle:YMLocalizedString(@"20.20.59_text_5") forState:UIControlStateNormal]; + + // 恢复默认insets + [self resetStatusButtonInsets]; +} + +- (void)statusButtonUpdateToUnSub { + self.action = EventCellAction_unsub; + [self.statusButton setImage:kImage(@"event_ring_unsub") forState:UIControlStateNormal]; + [self.statusButton setTitle:YMLocalizedString(@"20.20.59_text_6") forState:UIControlStateNormal]; + + // 恢复默认insets + [self resetStatusButtonInsets]; +} + +- (void)statusButtonUpdateToPatricipate { + self.action = EventCellAction_participate; + [self.statusButton setImage:kImage(@"room_icon") forState:UIControlStateNormal]; + [self.statusButton setTitle:YMLocalizedString(@"20.20.59_text_7") forState:UIControlStateNormal]; + + // 恢复默认insets + [self resetStatusButtonInsets]; +} + +- (void)statusButtonUpdateToDelete { + self.action = EventCellAction_delete; + [self.statusButton setImage:kImage(@"event_delete") forState:UIControlStateNormal]; + [self.statusButton setTitle:@"" forState:UIControlStateNormal]; + + // 重置insets,解决图片压缩问题 + self.statusButton.contentEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0); + self.statusButton.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0); + self.statusButton.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 0); +} + +// 添加重置按钮内边距的方法 +- (void)resetStatusButtonInsets { + CGFloat imageTitleSpacing = 4.0; + self.statusButton.contentEdgeInsets = UIEdgeInsetsMake(0, 8, 0, 8); + self.statusButton.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, imageTitleSpacing); + self.statusButton.titleEdgeInsets = UIEdgeInsetsMake(0, -imageTitleSpacing, 0, 0); +} + +- (void)didTapStatusButton { + if (self.statusButtonDidTap) { + self.statusButtonDidTap(self.model, self.action); + } } #pragma mark - @@ -238,7 +354,24 @@ - (UIView *)blackMask { UIView *v = [[UIView alloc] init]; v.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6]; + [v setCornerRadius:8]; return v; } +- (UIButton *)statusButton { + if (!_statusButton) { + _statusButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_statusButton addTarget:self + action:@selector(didTapStatusButton) + forControlEvents:UIControlEventTouchUpInside]; + [_statusButton setCornerRadius:13]; + [_statusButton setBackgroundColor:[UIColor whiteColor]]; + [_statusButton.titleLabel setFont:kFontMedium(13)]; + [_statusButton setTitleColor:UIColorFromRGB(0x313131) forState:UIControlStateNormal]; + + // 将边距设置移到resetStatusButtonInsets方法中,初始化时不设置 + // contentEdgeInsets、imageEdgeInsets和titleEdgeInsets会在对应的状态更新方法中设置 + } + return _statusButton; +} @end diff --git a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h index 72b0660e..83d1452f 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h +++ b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h @@ -1,5 +1,5 @@ #import "UIKit/UIKit.h" - +@class EventConfigModel; typedef NS_ENUM(NSInteger, CreateEventPickerType) { CreateEventPickerTypeDuration = 0, CreateEventPickerTypeStartTime = 1 @@ -8,5 +8,10 @@ typedef NS_ENUM(NSInteger, CreateEventPickerType) { @interface CreateEventPickerContainerView : UIView @property (nonatomic, assign) CreateEventPickerType pickerType; @property (nonatomic, copy) void (^onConfirmDate)(NSDate *date, NSString *resultString); -- (void)showInView:(UIView *)parentView initialDate:(NSDate *)date pickerType:(CreateEventPickerType)type onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm; -@end + +- (void)showInView:(UIView *)parentView + initialDate:(NSDate *)date + config:(EventConfigModel *)config + pickerType:(CreateEventPickerType)type + onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm; +@end diff --git a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m index 3d9eb086..f353fb5b 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m +++ b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m @@ -1,6 +1,7 @@ #import "CreateEventPickerContainerView.h" - +#import "EventConfigModel.h" @interface CreateEventPickerContainerView () +@property (nonatomic, strong) EventConfigModel *configModel; @property (nonatomic, strong) UIPickerView *pickerView; @property (nonatomic, strong) NSDate *minDate; @property (nonatomic, strong) NSDate *maxDate; @@ -47,7 +48,7 @@ // OK 按钮 _okButton = [UIButton buttonWithType:UIButtonTypeSystem]; [_okButton setTitle:@"OK" forState:UIControlStateNormal]; - [_okButton setTitleColor:UIColorFromRGB(0xe29030) forState:UIControlStateNormal]; + [_okButton setTitleColor:UIColorFromRGB(0xff8c03) forState:UIControlStateNormal]; _okButton.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium]; [_okButton addTarget:self action:@selector(okTapped) forControlEvents:UIControlEventTouchUpInside]; [_pickerBg addSubview:_okButton]; @@ -66,11 +67,11 @@ // 布局 [_pickerBg mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.bottom.equalTo(self); - make.height.mas_equalTo(300); + make.height.mas_equalTo(320); }]; [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(_pickerBg).offset(16); + make.top.equalTo(_pickerBg).offset(8); make.centerX.equalTo(_pickerBg); }]; @@ -94,52 +95,101 @@ } #pragma mark - Public Methods +- (NSDictionary *)formatTimeWithString:(NSString *)minutesString { + // 将字符串转换为整数 + NSInteger minutes = [minutesString integerValue]; + + NSMutableDictionary *result = [NSMutableDictionary dictionary]; + + if (minutes < 60) { + // 小于60分钟,直接显示分钟 + result[@"title"] = [NSString stringWithFormat:@"%@分钟", minutesString]; + result[@"minutes"] = minutesString; + } else if (minutes < 1440) { + // 大于等于60分钟且小于24小时(1440分钟) + double hours = minutes / 60.0; + if (fmod(hours, 1) == 0) { + // 如果能整除,不显示小数点 + result[@"title"] = [NSString stringWithFormat:@"%ld小时", (long)hours]; + } else { + // 如果不能整除,保留一位小数 + result[@"title"] = [NSString stringWithFormat:@"%.1f小时", hours]; + } + result[@"minutes"] = minutesString; + } else { + // 大于等于24小时 + double days = minutes / 1440.0; + if (fmod(days, 1) == 0) { + // 如果能整除,不显示小数点 + result[@"title"] = [NSString stringWithFormat:@"%ld天", (long)days]; + } else { + // 如果不能整除,保留一位小数 + result[@"title"] = [NSString stringWithFormat:@"%.1f天", days]; + } + result[@"minutes"] = minutesString; + } + + return result; +} + - (void)buildDurationDataSource { - self.durationsOptions = @[ - @{@"title": @"30分钟", @"minutes": @30}, - @{@"title": @"1小时", @"minutes": @60}, - @{@"title": @"2小时", @"minutes": @120}, - @{@"title": @"3小时", @"minutes": @180}, - @{@"title": @"4小时", @"minutes": @240}, - @{@"title": @"6小时", @"minutes": @360}, - @{@"title": @"12小时", @"minutes": @720}, - @{@"title": @"1天", @"minutes": @1440}, - @{@"title": @"2天", @"minutes": @2880}, - @{@"title": @"3天", @"minutes": @4320} - ]; + NSMutableArray *arr = [NSMutableArray array]; + for (NSString *duration in self.configModel.durations) { + [arr addObject:[self formatTimeWithString:duration]]; + } + self.durationsOptions = arr.copy; } - (void)buildStartTimeSourceWithInitialDate:(NSDate *)date { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *now = [NSDate date]; - NSDate *start = [calendar dateByAddingUnit:NSCalendarUnitHour value:1 toDate:now options:0]; - NSDateComponents *comp = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:start]; + + // 最早:当前时间+24小时 + NSDate *start = [calendar dateByAddingUnit:NSCalendarUnitHour + value:24 + toDate:now + options:0]; + + // 最晚:当前时间+1个月 + NSDateComponents *comp = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:now]; comp.month += 1; NSDate *end = [calendar dateFromComponents:comp]; + self.minDate = start; self.maxDate = end; + NSMutableArray *months = [NSMutableArray array]; NSMutableArray *days = [NSMutableArray array]; NSMutableArray *hours = [NSMutableArray array]; + NSDate *iter = start; - while ([iter compare:end] == NSOrderedAscending) { + while ([iter compare:end] != NSOrderedDescending) { NSDateComponents *c = [calendar components:NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour fromDate:iter]; + NSString *monthStr = [NSString stringWithFormat:@"%02ld", (long)c.month]; NSString *dayStr = [NSString stringWithFormat:@"%02ld", (long)c.day]; NSString *hourStr = [NSString stringWithFormat:@"%02ld:00", (long)c.hour]; + if (![months containsObject:monthStr]) [months addObject:monthStr]; if (![days containsObject:dayStr]) [days addObject:dayStr]; if (![hours containsObject:hourStr]) [hours addObject:hourStr]; + iter = [calendar dateByAddingUnit:NSCalendarUnitHour value:1 toDate:iter options:0]; } + self.monthArray = months; self.dayArray = days; self.hourArray = hours; self.selectedDate = start; } -- (void)showInView:(UIView *)parentView initialDate:(NSDate *)date pickerType:(CreateEventPickerType)type onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm{ +- (void)showInView:(UIView *)parentView + initialDate:(NSDate *)date + config:(EventConfigModel *)config + pickerType:(CreateEventPickerType)type + onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm{ self.pickerType = type; + self.configModel = config; self.onConfirmDate = onConfirm; if (type == CreateEventPickerTypeStartTime) { [self buildStartTimeSourceWithInitialDate:date]; @@ -222,7 +272,7 @@ }); } -- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component { +- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { NSInteger selectedRow = [pickerView selectedRowInComponent:component]; BOOL isSelectedRow = selectedRow == row; NSString *content = @""; @@ -240,12 +290,48 @@ break; } - return [[NSAttributedString alloc] initWithString:content attributes:@{ - NSFontAttributeName: isSelectedRow ? kFontMedium(15) : kFontRegular(14), - NSForegroundColorAttributeName: isSelectedRow ? UIColorFromRGB(0x313131) : UIColorFromRGB(0x7b7b7d) - }]; + UILabel *label = (UILabel *)view; + if (!label) { + label = [[UILabel alloc] init]; + label.textAlignment = NSTextAlignmentCenter; + label.backgroundColor = [UIColor clearColor]; + } + + label.text = content; + label.font = isSelectedRow ? kFontMedium(15) : kFontRegular(12); + label.textColor = isSelectedRow ? UIColorFromRGB(0x313131) : UIColorFromRGB(0x7b7b7d); + + return label; } +- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component { + return 30; // 设置行高 +} + +//- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component { +// NSInteger selectedRow = [pickerView selectedRowInComponent:component]; +// BOOL isSelectedRow = selectedRow == row; +// NSString *content = @""; +// switch (self.pickerType) { +// case CreateEventPickerTypeStartTime: { +// if (component == 0) content = self.monthArray[row]; +// if (component == 1) content = self.dayArray[row]; +// if (component == 2) content = self.hourArray[row]; +// } +// break; +// case CreateEventPickerTypeDuration: +// content = self.durationsOptions[row][@"title"]; +// break; +// default: +// break; +// } +// +// return [[NSAttributedString alloc] initWithString:content attributes:@{ +// NSFontAttributeName: isSelectedRow ? kFontMedium(12) : kFontRegular(12), +// NSForegroundColorAttributeName: isSelectedRow ? UIColorFromRGB(0x313131) : UIColorFromRGB(0x7b7b7d) +// }]; +//} + //- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { // __block UILabel *label = (UILabel *)view; //// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ @@ -291,7 +377,7 @@ switch (self.pickerType) { case CreateEventPickerTypeStartTime: { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - formatter.dateFormat = @"yyyy-MM-dd-HH:mm"; + formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; resultString = [formatter stringFromDate:self.selectedDate]; } break; diff --git a/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.h b/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.h index 744a106a..6826189f 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.h +++ b/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.h @@ -6,11 +6,13 @@ // #import "MvpViewController.h" - +@class EventRoomModel; NS_ASSUME_NONNULL_BEGIN @interface CreateEventSelectRoomViewController : MvpViewController +@property (nonatomic, copy) void(^didSelectedRoom)(EventRoomModel *roomModel); + @end NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m b/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m index c496f433..23fffa08 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m +++ b/YuMi/Modules/YMNewHome/View/CreateEventSelectRoomViewController.m @@ -8,57 +8,6 @@ #import "CreateEventSelectRoomViewController.h" #import "CreateEventPresenter.h" #import "EventCenterEmptyCell.h" -@interface CreateEventSelectRoomEmptyCell : UITableViewCell - -+ (CGFloat)cellHeight; -+ (void)registerTo:(UITableView *)tableView; -+ (CreateEventSelectRoomEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; - -@end - -@implementation CreateEventSelectRoomEmptyCell -{ - UILabel *titleLabel; - UIImageView *ufoImageView; -} - -+ (CGFloat)cellHeight { - return 170; -} - -+ (void)registerTo:(UITableView *)tableView { - [tableView registerClass:[self class] - forCellReuseIdentifier:NSStringFromClass([self class])]; -} - -+ (CreateEventSelectRoomEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { - return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath]; -} - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { - titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"20.20.59_text_19") - font:kFontRegular(14) - textColor:UIColorFromRGB(0xafb1b3)]; - ufoImageView = [[UIImageView alloc] initWithImage:kImage(@"common_empty_UFO")]; - [self.contentView addSubview:ufoImageView]; - [self.contentView addSubview:titleLabel]; - [ufoImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self.contentView); - make.top.mas_equalTo(16); - make.size.mas_equalTo(CGSizeMake(110, 110)); - }]; - [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self.contentView); - make.top.mas_equalTo(ufoImageView.mas_bottom).offset(16); - make.height.mas_equalTo(20); - }]; - } - return self; -} - - -@end @interface CreateEventSelectRoomCell : UITableViewCell { @@ -71,12 +20,16 @@ + (void)registerTo:(UITableView *)tableView; + (CreateEventSelectRoomCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; +- (void)updateCell:(EventRoomModel *)model; + @end @implementation CreateEventSelectRoomCell - +{ + EventRoomModel *cellModel; +} + (CGFloat)cellHeight { - return 78; + return 64; } + (void)registerTo:(UITableView *)tableView { @@ -90,6 +43,11 @@ - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { + + self.selectionStyle = UITableViewCellSelectionStyleNone; + self.separatorInset = UIEdgeInsetsZero; + self.contentView.backgroundColor = [UIColor whiteColor]; + NetImageConfig * config = [[NetImageConfig alloc] init]; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; config.imageType = ImageTypeUserIcon; @@ -111,34 +69,40 @@ [nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(avatar).offset(4); - make.leading.mas_equalTo(avatar).offset(11); + make.leading.mas_equalTo(avatar.mas_trailing).offset(11); make.height.mas_equalTo(21); }]; [idLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.mas_equalTo(avatar).offset(-4); - make.leading.mas_equalTo(avatar).offset(11); + make.leading.mas_equalTo(avatar.mas_trailing).offset(11); make.height.mas_equalTo(18); }]; } return self; } +- (void)updateCell:(EventRoomModel *)model { + cellModel = model; + avatar.imageUrl = model.avatar; + nameLabel.text = model.roomName; + idLabel.text = [NSString stringWithFormat:@"ID:%@", @(model.erbanNo)]; +} + @end -@interface CreateEventSelectRoomViewController () +@interface CreateEventSelectRoomViewController () { UITableView *tableView; } -@property (nonatomic, strong) NSMutableArray *myRooms; -@property (nonatomic, strong) NSMutableArray *adminRooms; +@property (nonatomic, strong) EventRoomListModel *model; @end @implementation CreateEventSelectRoomViewController -- (__kindof id)presenter { +- (CreateEventPresenter *)createPresenter { return [CreateEventPresenter new]; } @@ -146,10 +110,10 @@ [super viewDidLoad]; self.title = YMLocalizedString(@"20.20.59_text_14"); - self.myRooms = [NSMutableArray array]; - self.adminRooms = [NSMutableArray array]; [self setupUI]; + + [self.presenter loadMyRooms]; } - (void)setupUI { @@ -158,12 +122,22 @@ tableView.dataSource = self; tableView.separatorInset = UIEdgeInsetsZero; tableView.backgroundColor = [UIColor whiteColor]; + tableView.separatorStyle = UITableViewCellSeparatorStyleNone; [CreateEventSelectRoomCell registerTo:tableView]; -// [CreateEventSelectRoomEmptyCell registerTo:tableView]; - [EventCenterEmptyCell registerTo:tableView]; + [EventCenterEmptyCell registerTo:tableView withCustomID:@""]; [self.view addSubview:tableView]; } +#pragma mark - CreateEventPresenterProcotol +- (void)myRoomListSuccess:(EventRoomListModel *)listModel { + _model = listModel; + [tableView reloadData]; +} + +- (void)myRoomListFailure:(NSString *)msg { + +} + #pragma mark - Delegate & DataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 2; @@ -172,10 +146,10 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (section) { case 0: - return self.myRooms.count == 0 ? 1 : self.myRooms.count; + return 1; break; case 1: - return self.adminRooms.count == 0 ? 1 : self.adminRooms.count; + return self.model.manageRooms.count == 0 ? 1 : self.model.manageRooms.count; break; default: return 0; @@ -206,11 +180,11 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { switch (indexPath.section) { case 0: { - return self.myRooms.count == 0 ? [CreateEventSelectRoomEmptyCell cellHeight] : [CreateEventSelectRoomCell cellHeight]; + return self.model.selfRoom == nil ? [EventCenterEmptyCell cellHeight] : [CreateEventSelectRoomCell cellHeight]-10; } break; case 1: { - return self.adminRooms.count == 0 ? [CreateEventSelectRoomEmptyCell cellHeight] : [CreateEventSelectRoomCell cellHeight]; + return self.model.manageRooms.count == 0 ? [EventCenterEmptyCell cellHeight] : [CreateEventSelectRoomCell cellHeight]; } break; default: @@ -223,18 +197,20 @@ UITableViewCell *cell = [UITableViewCell new]; switch (indexPath.section) { case 0: { - if (self.myRooms.count == 0) { - cell = [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; + if (self.model.selfRoom == nil) { + cell = [EventCenterEmptyCell cellFor:tableView customID:@"" atIndexPath:indexPath]; } else { cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath]; + [(CreateEventSelectRoomCell *)cell updateCell:self.model.selfRoom]; } } break; case 1: { - if (self.adminRooms.count == 0) { - cell = [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; + if (self.model.manageRooms.count == 0) { + cell = [EventCenterEmptyCell cellFor:tableView customID:@"" atIndexPath:indexPath]; } else { cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath]; + [(CreateEventSelectRoomCell *)cell updateCell:[self.model.manageRooms xpSafeObjectAtIndex:indexPath.row]]; } } break; @@ -246,10 +222,41 @@ return cell; } +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + + if (self.didSelectedRoom) { + switch (indexPath.section) { + case 0: + self.didSelectedRoom(self.model.selfRoom); + break; + case 1: + self.didSelectedRoom([self.model.manageRooms xpSafeObjectAtIndex:indexPath.row]); + break; + default: + break; + } + } + + [self.navigationController popViewControllerAnimated:YES]; +} + #pragma mark - - (UIView *)sectionHeaderTitle:(NSString *)title { UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 30)]; view.backgroundColor = UIColorFromRGB(0xf2f3f7); + + if ([title isEqualToString:YMLocalizedString(@"20.20.59_text_21")]) { +// view.backgroundColor = [UIColor whiteColor]; + UILabel *label = [UILabel labelInitWithText:title font:kFontSemibold(14) textColor:UIColorFromRGB(0x313131)]; + [view addSubview:label]; + [label mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(view); + make.leading.mas_equalTo(16); + }]; + return view; + } + UILabel *label = [UILabel labelInitWithText:title font:kFontSemibold(14) textColor:UIColorFromRGB(0x313131)]; [view addSubview:label]; [label mas_makeConstraints:^(MASConstraintMaker *make) { diff --git a/YuMi/Modules/YMNewHome/View/CreateEventViewController.h b/YuMi/Modules/YMNewHome/View/CreateEventViewController.h deleted file mode 100644 index 5518a5d9..00000000 --- a/YuMi/Modules/YMNewHome/View/CreateEventViewController.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// CreateEventViewController.h -// YuMi -// -// Created by P on 2025/5/9. -// - -#import "MvpViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface CreateEventViewController : MvpViewController - -- (void)showRoomSelectionView; -- (void)showTimeSelectionView; -- (void)showDurationSelectionView; -- (void)showCreateSuccess; -- (void)showError:(NSString *)errorMessage; - -@end - -NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/View/CreateEventViewController.m b/YuMi/Modules/YMNewHome/View/CreateEventViewController.m deleted file mode 100644 index 5f498a9b..00000000 --- a/YuMi/Modules/YMNewHome/View/CreateEventViewController.m +++ /dev/null @@ -1,253 +0,0 @@ -// -// CreateEventViewController.m -// YuMi -// -// Created by P on 2025/5/9. -// - -#import "CreateEventViewController.h" -#import "CreateEventPresenter.h" -#import - -@interface CreateEventViewController () - -@property (nonatomic, strong) UIScrollView *scrollView; -@property (nonatomic, strong) UIView *contentView; -@property (nonatomic, strong) UITextField *titleTextField; -@property (nonatomic, strong) UIImageView *bannerImageView; -@property (nonatomic, strong) UISwitch *uploadSwitch; -@property (nonatomic, strong) UIButton *roomSelectButton; -@property (nonatomic, strong) UIButton *startTimeButton; -@property (nonatomic, strong) UIButton *durationButton; -@property (nonatomic, strong) UITextView *contentTextView; -@property (nonatomic, strong) UISwitch *notifyFansSwitch; -@property (nonatomic, strong) UIButton *createButton; - -@end - -@implementation CreateEventViewController - -- (__kindof id)presenter { - return [[CreateEventPresenter alloc] init]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - self.view.backgroundColor = [UIColor whiteColor]; - self.title = @"创建活动"; - - [self setupUI]; -} - -#pragma mark - UI Setup - -- (void)setupUI { - // 添加scrollView - self.scrollView = [[UIScrollView alloc] init]; - [self.view addSubview:self.scrollView]; - [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.equalTo(self.view); - }]; - - // 添加contentView - self.contentView = [[UIView alloc] init]; - [self.scrollView addSubview:self.contentView]; - [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.equalTo(self.scrollView); - make.width.equalTo(self.scrollView); - }]; - - // 标题输入框 - self.titleTextField = [[UITextField alloc] init]; - self.titleTextField.placeholder = @"活动标题"; - self.titleTextField.font = [UIFont systemFontOfSize:16]; - [self.contentView addSubview:self.titleTextField]; - [self.titleTextField mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.contentView.mas_top).offset(20); - make.left.equalTo(self.contentView).offset(16); - make.right.equalTo(self.contentView).offset(-16); - make.height.mas_equalTo(44); - }]; - - // 横幅图片 - self.bannerImageView = [[UIImageView alloc] init]; - self.bannerImageView.backgroundColor = [UIColor lightGrayColor]; - self.bannerImageView.contentMode = UIViewContentModeScaleAspectFill; - self.bannerImageView.clipsToBounds = YES; - self.bannerImageView.userInteractionEnabled = YES; - [self.contentView addSubview:self.bannerImageView]; - [self.bannerImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.titleTextField.mas_bottom).offset(20); - make.left.equalTo(self.contentView).offset(16); - make.right.equalTo(self.contentView).offset(-16); - make.height.mas_equalTo(200); - }]; - - UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(selectBannerImage)]; - [self.bannerImageView addGestureRecognizer:tapGesture]; - - // 上传到主页开关 - UILabel *uploadLabel = [[UILabel alloc] init]; - uploadLabel.text = @"上传横幅到主页(消耗1000)"; - uploadLabel.font = [UIFont systemFontOfSize:14]; - [self.contentView addSubview:uploadLabel]; - - self.uploadSwitch = [[UISwitch alloc] init]; - [self.contentView addSubview:self.uploadSwitch]; - - [uploadLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.bannerImageView.mas_bottom).offset(20); - make.left.equalTo(self.contentView).offset(16); - }]; - - [self.uploadSwitch mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerY.equalTo(uploadLabel); - make.right.equalTo(self.contentView).offset(-16); - }]; - - // 选择房间按钮 - self.roomSelectButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [self.roomSelectButton setTitle:@"选择房间" forState:UIControlStateNormal]; - [self.contentView addSubview:self.roomSelectButton]; - [self.roomSelectButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(uploadLabel.mas_bottom).offset(20); - make.left.equalTo(self.contentView).offset(16); - make.right.equalTo(self.contentView).offset(-16); - make.height.mas_equalTo(44); - }]; - - // 开始时间按钮 - self.startTimeButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [self.startTimeButton setTitle:@"开始时间" forState:UIControlStateNormal]; - [self.contentView addSubview:self.startTimeButton]; - [self.startTimeButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.roomSelectButton.mas_bottom).offset(20); - make.left.equalTo(self.contentView).offset(16); - make.right.equalTo(self.contentView).offset(-16); - make.height.mas_equalTo(44); - }]; - - // 时长选择按钮 - self.durationButton = [UIButton buttonWithType:UIButtonTypeSystem]; - [self.durationButton setTitle:@"时长" forState:UIControlStateNormal]; - [self.contentView addSubview:self.durationButton]; - [self.durationButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.startTimeButton.mas_bottom).offset(20); - make.left.equalTo(self.contentView).offset(16); - make.right.equalTo(self.contentView).offset(-16); - make.height.mas_equalTo(44); - }]; - - // 活动内容输入框 - self.contentTextView = [[UITextView alloc] init]; - self.contentTextView.font = [UIFont systemFontOfSize:14]; - self.contentTextView.layer.borderWidth = 0.5; - self.contentTextView.layer.borderColor = [UIColor lightGrayColor].CGColor; - self.contentTextView.layer.cornerRadius = 4; - [self.contentView addSubview:self.contentTextView]; - [self.contentTextView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.durationButton.mas_bottom).offset(20); - make.left.equalTo(self.contentView).offset(16); - make.right.equalTo(self.contentView).offset(-16); - make.height.mas_equalTo(100); - }]; - - // 通知粉丝开关 - UILabel *notifyLabel = [[UILabel alloc] init]; - notifyLabel.text = @"通知我的粉丝"; - notifyLabel.font = [UIFont systemFontOfSize:14]; - [self.contentView addSubview:notifyLabel]; - - self.notifyFansSwitch = [[UISwitch alloc] init]; - [self.contentView addSubview:self.notifyFansSwitch]; - - [notifyLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.contentTextView.mas_bottom).offset(20); - make.left.equalTo(self.contentView).offset(16); - }]; - - [self.notifyFansSwitch mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerY.equalTo(notifyLabel); - make.right.equalTo(self.contentView).offset(-16); - make.bottom.equalTo(self.contentView).offset(-80); - }]; - - // 创建按钮 - self.createButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [self.createButton setTitle:@"创建活动" forState:UIControlStateNormal]; - [self.createButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - self.createButton.backgroundColor = [UIColor systemBlueColor]; - self.createButton.layer.cornerRadius = 20; - [self.view addSubview:self.createButton]; - [self.createButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom).offset(-20); - make.centerX.equalTo(self.view); - make.width.mas_equalTo(195); - make.height.mas_equalTo(40); - }]; - - [self.createButton addTarget:self action:@selector(createButtonTapped) forControlEvents:UIControlEventTouchUpInside]; -} - -#pragma mark - Actions - -- (void)selectBannerImage { - UIImagePickerController *picker = [[UIImagePickerController alloc] init]; - picker.delegate = self; - picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; - [self presentViewController:picker animated:YES completion:nil]; -} - -- (void)createButtonTapped { - CreateEventPresenter *presenter = (CreateEventPresenter *)self.presenter; - [presenter createEventWithTitle:self.titleTextField.text - image:self.bannerImageView.image - uploadToHome:self.uploadSwitch.isOn - roomId:self.roomSelectButton.titleLabel.text - startTime:[NSDate date] // 这里需要根据实际选择的时间设置 - duration:60 // 这里需要根据实际选择的时长设置 - content:self.contentTextView.text - notifyFans:self.notifyFansSwitch.isOn]; -} - -#pragma mark - View Protocol Methods - -- (void)showRoomSelectionView { - // TODO: 显示房间选择视图 -} - -- (void)showTimeSelectionView { - // TODO: 显示时间选择视图 -} - -- (void)showDurationSelectionView { - // TODO: 显示时长选择视图 -} - -- (void)showCreateSuccess { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"成功" message:@"活动创建成功" preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { - [self.navigationController popViewControllerAnimated:YES]; - }]]; - [self presentViewController:alert animated:YES completion:nil]; -} - -- (void)showError:(NSString *)errorMessage { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:errorMessage preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]]; - [self presentViewController:alert animated:YES completion:nil]; -} - -#pragma mark - UIImagePickerControllerDelegate - -- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - UIImage *selectedImage = info[UIImagePickerControllerOriginalImage]; - self.bannerImageView.image = selectedImage; - [picker dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { - [picker dismissViewControllerAnimated:YES completion:nil]; -} - -@end diff --git a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.h b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.h index d4c4128a..9c84c59f 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.h +++ b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.h @@ -11,6 +11,8 @@ NS_ASSUME_NONNULL_BEGIN @interface CreateEventViewControllerV2 : MvpViewController +@property (nonatomic, copy) void(^createSuccess)(); + @property (nonatomic, strong) UIScrollView *scrollView; @property (nonatomic, strong) UIView *contentView; diff --git a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m index a3663711..ccc39337 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m +++ b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m @@ -9,112 +9,20 @@ #import #import +#import + +#import "UploadFile.h" +#import "CreateEventPresenter.h" #import "CreateEventPickerContainerView.h" #import "CreateEventSelectRoomViewController.h" +#import "UIImage+Utils.h" #define MAX_EVENT_TITLE_LENGTH 20 #define MAX_EVENT_CONTENT_LENGTH 100 +@interface CreateEventViewControllerV2 () -//@interface CreateEventPickerContainerView : UIView -//@property (nonatomic, copy) void (^onConfirm)(NSInteger hour, NSInteger min); -//@property (nonatomic, assign) NSInteger selectedHour; -//@property (nonatomic, assign) NSInteger selectedMin; -//@property (nonatomic, strong) UIPickerView *pickerView; -//- (void)showInView:(UIView *)parentView initialHour:(NSInteger)hour initialMin:(NSInteger)min; -//- (void)dismiss; -//@end -// -//@implementation CreateEventPickerContainerView { -// UIView *_pickerBg; -// UILabel *_titleLabel; -// UIButton *_okButton; -//} -//- (instancetype)init { -// self = [super initWithFrame:CGRectZero]; -// if (self) { -// self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3]; -// _pickerBg = [[UIView alloc] init]; -// _pickerBg.backgroundColor = [UIColor whiteColor]; -// _pickerBg.layer.cornerRadius = 16; -// _pickerBg.clipsToBounds = YES; -// [self addSubview:_pickerBg]; -// [_pickerBg mas_makeConstraints:^(MASConstraintMaker *make) { -// make.left.right.equalTo(self); -// make.bottom.equalTo(self.mas_bottom); -// make.height.mas_equalTo(300); -// }]; -// _titleLabel = [[UILabel alloc] init]; -// _titleLabel.text = YMLocalizedString(@"20.20.59_text_16"); -// _titleLabel.font = kFontMedium(16); -// _titleLabel.textAlignment = NSTextAlignmentCenter; -// [_pickerBg addSubview:_titleLabel]; -// [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { -// make.top.equalTo(_pickerBg.mas_top).offset(16); -// make.centerX.equalTo(_pickerBg); -// }]; -// _okButton = [UIButton buttonWithType:UIButtonTypeCustom]; -// [_okButton setTitle:@"OK" forState:UIControlStateNormal]; -// [_okButton setTitleColor:UIColorFromRGB(0xe29030) forState:UIControlStateNormal]; -// _okButton.titleLabel.font = kFontMedium(16); -// [_okButton addTarget:self action:@selector(okTapped) forControlEvents:UIControlEventTouchUpInside]; -// [_pickerBg addSubview:_okButton]; -// [_okButton mas_makeConstraints:^(MASConstraintMaker *make) { -// make.centerY.equalTo(_titleLabel); -// make.trailing.equalTo(_pickerBg.mas_trailing).offset(-20); -// }]; -// self.pickerView = [[UIPickerView alloc] init]; -// self.pickerView.dataSource = self; -// self.pickerView.delegate = self; -// [_pickerBg addSubview:self.pickerView]; -// [self.pickerView mas_makeConstraints:^(MASConstraintMaker *make) { -// make.left.right.bottom.equalTo(_pickerBg); -// make.top.equalTo(_titleLabel.mas_bottom).offset(8); -// }]; -// UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss)]; -// [self addGestureRecognizer:tap]; -// tap.cancelsTouchesInView = NO; -// } -// return self; -//} -//- (void)showInView:(UIView *)parentView initialHour:(NSInteger)hour initialMin:(NSInteger)min { -// self.selectedHour = hour; -// self.selectedMin = min; -// self.frame = parentView.bounds; -// [parentView addSubview:self]; -// self.alpha = 0; -// [self.pickerView selectRow:hour inComponent:0 animated:NO]; -// [self.pickerView selectRow:min/30 inComponent:1 animated:NO]; -// [UIView animateWithDuration:0.25 animations:^{ -// self.alpha = 1; -// }]; -//} -//- (void)dismiss { -// [UIView animateWithDuration:0.25 animations:^{ -// self.alpha = 0; -// } completion:^(BOOL finished) { -// [self removeFromSuperview]; -// }]; -//} -//- (void)okTapped { -// if (self.onConfirm) self.onConfirm(self.selectedHour, self.selectedMin); -// [self dismiss]; -//} -//// UIPickerViewDataSource -//- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; } -//- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { -// if (component == 0) return 7; -// return 2; -//} -//// UIPickerViewDelegate - -//- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { -// if (component == 0) self.selectedHour = row; -// else self.selectedMin = row * 30; -// [pickerView reloadComponent:component]; -//} -//@end - -@interface CreateEventViewControllerV2 () +@property (nonatomic, strong) EventConfigModel *configModel; +@property (nonatomic, strong) EventRoomModel *selectRoomModel; @property (nonatomic, strong) UIImage *selectedImage; //@property (nonatomic, strong) UIView *durationPickerContainerView; @@ -127,7 +35,7 @@ // 添加私有方法声明 - (UIButton *)createUploadBannerButtonWithTitle:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName tag:(NSInteger)tag; - (void)setupDatePicker; // 新增:设置日期选择器 -- (void)showDatePicker; // 新增:显示日期选择器 + - (void)hideDatePicker; // 新增:隐藏日期选择器 - (void)datePickerDoneTapped; // 新增:日期选择器确定按钮点击事件 - (void)datePickerCancelTapped; // 新增:日期选择器取消按钮点击事件 @@ -145,14 +53,16 @@ static const CGFloat kHorizontalPadding = 16.0; static const CGFloat kVerticalPadding = 10.0; static const CGFloat kSectionSpacing = 20.0; +- (CreateEventPresenter *)createPresenter { + return [CreateEventPresenter new]; +} + - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.title = @"Create Event"; [self setupUI]; -// [self setupDatePicker]; // 新增:调用日期选择器设置方法 -// [self setupDurationPicker]; // 新增:调用时长选择器设置方法 [self updateEventTitleCharCount]; [self updateEventContentCharCount]; @@ -170,6 +80,8 @@ static const CGFloat kSectionSpacing = 20.0; // 设置 scrollView delegate self.scrollView.delegate = self; + + [self.presenter loadConfig]; } - (void)dealloc { @@ -211,7 +123,6 @@ static const CGFloat kSectionSpacing = 20.0; UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; UIVisualEffectView *visualView = [[UIVisualEffectView alloc]initWithEffect:blurEffect]; -// visualView.frame = CGRectMake(0, KScreenHeight - 46, KScreenWidth, 46); [self.view addSubview:visualView]; // Create Event Button (fixed at bottom) @@ -243,7 +154,6 @@ static const CGFloat kSectionSpacing = 20.0; [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop); make.bottom.leading.trailing.equalTo(self.view); -// make.bottom.equalTo(self.createEventButton.mas_top).offset(-10); // Space above button }]; [self.contentView mas_makeConstraints:^(MASConstraintMaker *make) { @@ -265,6 +175,26 @@ static const CGFloat kSectionSpacing = 20.0; [super viewDidLayoutSubviews]; } +#pragma mark - CreateEventPresenterProcotol +- (void)loadCongfigSuccess:(EventConfigModel *)model { + _configModel = model; + self.uploadBannerLabel.text = [NSString stringWithFormat:YMLocalizedString(@"20.20.59_text_11"), + @(model.goldNum)]; +} + +- (void)loadCongfigFailure:(NSString *)msg { + [self.navigationController popViewControllerAnimated:YES]; +} + +- (void)createEventSuccess { + [XNDJTDDLoadingTool hideHUD]; + [self.navigationController popViewControllerAnimated:NO]; +} + +- (void)createEventFailure:(NSString *)msg { + [XNDJTDDLoadingTool hideHUD]; +} + #pragma mark - Helper Methods - (UIButton *)createUploadBannerButtonWithTitle:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName tag:(NSInteger)tag { @@ -357,12 +287,20 @@ static const CGFloat kSectionSpacing = 20.0; - (void)eventBannerTapped { NSLog(@"Event Banner Tapped"); if (@available(iOS 14, *)) { - PHPickerConfiguration *config = [[PHPickerConfiguration alloc] init]; - config.filter = [PHPickerFilter imagesFilter]; - config.selectionLimit = 1; - PHPickerViewController *picker = [[PHPickerViewController alloc] initWithConfiguration:config]; - picker.delegate = self; - [self presentViewController:picker animated:YES completion:nil]; + // 使用TZImagePickerController来选择并裁剪图片 + TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:self]; + imagePickerVc.allowCrop = YES; + + // 获取eventBannerImageView的实际尺寸比例 + CGFloat viewWidth = self.view.frame.size.width - (kHorizontalPadding * 2 - 2); + CGFloat viewHeight = kGetScaleWidth(118); + CGFloat cropWidth = MIN(viewWidth, KScreenWidth); + CGFloat cropHeight = (viewHeight / viewWidth) * cropWidth; + + // 设置裁剪框的尺寸 + imagePickerVc.cropRect = CGRectMake((KScreenWidth-cropWidth)/2, (KScreenHeight - cropHeight) / 2, cropWidth, cropHeight); + + [self presentViewController:imagePickerVc animated:YES completion:nil]; } else { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; @@ -376,18 +314,24 @@ static const CGFloat kSectionSpacing = 20.0; CreateEventSelectRoomViewController *vc = [[CreateEventSelectRoomViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; - - // Placeholder: Show a room selection UI (e.g., UIPickerView or new VC) - // For now, just update the label -// self.selectRoomPlaceholderLabel.text = @"Room A"; -// self.selectRoomPlaceholderLabel.textColor = [UIColor blackColor]; -// [self checkCreateEventButtonState]; + @kWeakify(self); + [vc setDidSelectedRoom:^(EventRoomModel * _Nonnull roomModel) { + @kStrongify(self); + self.selectRoomModel = roomModel; + self.selectRoomPlaceholderLabel.text = roomModel.roomName; + self.selectRoomPlaceholderLabel.textColor = [UIColor blackColor]; + [self checkCreateEventButtonState]; + }]; } - (void)selectStartTimeTapped { CreateEventPickerContainerView *view = [CreateEventPickerContainerView new]; __weak typeof(self) weakSelf = self; - [view showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeStartTime onConfirm:^(NSDate *date, NSString *resultString) { + [view showInView:self.view + initialDate:[NSDate date] + config:self.configModel + pickerType:CreateEventPickerTypeStartTime + onConfirm:^(NSDate *date, NSString *resultString) { weakSelf.startTimePlaceholderLabel.text = resultString; [weakSelf checkCreateEventButtonState]; }]; @@ -396,7 +340,11 @@ static const CGFloat kSectionSpacing = 20.0; - (void)selectDurationTapped { CreateEventPickerContainerView *view = [CreateEventPickerContainerView new]; __weak typeof(self) weakSelf = self; - [view showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeDuration onConfirm:^(NSDate *date, NSString *resultString) { + [view showInView:self.view + initialDate:[NSDate date] + config:self.configModel + pickerType:CreateEventPickerTypeDuration + onConfirm:^(NSDate *date, NSString *resultString) { weakSelf.durationPlaceholderLabel.text = resultString; [weakSelf checkCreateEventButtonState]; }]; @@ -427,9 +375,40 @@ static const CGFloat kSectionSpacing = 20.0; NSLog(@"Title: %@, Upload: %d, Room: %@, Start: %@, Duration: %@, Content: %@, Notify: %d", title, uploadToHomepage, selectedRoom, startTime, duration, content, notifyFans); - // TODO: Call presenter or service to create event + // TODO: 1. 补充 loading; 2. duration 使用 config 内容;3. start time 使用 picker 内容 + + @kWeakify(self); + [self uploadCover:bannerImage + finish:^(NSString *path) { + @kStrongify(self); + [self.presenter createEventWithTitle:title + image:path + uploadToHome:uploadToHomepage + startTime:startTime + duration:30 + content:content + notifyFans:notifyFans]; + }]; + } +- (void)uploadCover:(UIImage *)cover finish:(void(^)(NSString *path))finish { + [XNDJTDDLoadingTool showLoading]; + NSData *data = UIImageJPEGRepresentation(cover, 0.7); + NSString *format = [UIImage getImageTypeWithImageData:data]; + NSString *name = [NSString stringWithFormat:@"banner/%@.%@",[NSString createUUID],format]; + + [[UploadFile share]QCloudUploadImage:data named:name success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) { + [XNDJTDDLoadingTool hideHUD]; + if (finish) { + finish(key); + } + } failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) { + [XNDJTDDLoadingTool showErrorWithMessage:message]; + }]; +} + + #pragma mark - UITextFieldDelegate - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { @@ -470,6 +449,7 @@ static const CGFloat kSectionSpacing = 20.0; } - (void)uploadBannerButtonTapped:(UIButton *)sender { + // TODO: 补充钱包判断 if (sender == self.uploadBannerYesButton) { if (!self.uploadBannerYesButton.selected) { // 避免重复设置 self.uploadBannerYesButton.selected = YES; @@ -491,9 +471,15 @@ static const CGFloat kSectionSpacing = 20.0; - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *selectedImage = info[UIImagePickerControllerOriginalImage]; if (selectedImage) { - self.selectedImage = selectedImage; - self.eventBannerImageView.image = selectedImage; - self.eventBannerCamearImageView.hidden = NO; // Hide placeholder once image is selected + // 对于iOS 14以下版本,选择图片后手动裁剪 + CGFloat viewWidth = self.view.frame.size.width - (kHorizontalPadding * 2 - 2); + CGFloat viewHeight = kGetScaleWidth(118); + CGSize cropSize = CGSizeMake(viewWidth, viewHeight); + + UIImage *croppedImage = [selectedImage cutImage:cropSize]; + self.selectedImage = croppedImage; + self.eventBannerImageView.image = croppedImage; + self.eventBannerCamearImageView.hidden = NO; } [picker dismissViewControllerAnimated:YES completion:nil]; [self checkCreateEventButtonState]; @@ -507,41 +493,10 @@ static const CGFloat kSectionSpacing = 20.0; - (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray *)results API_AVAILABLE(ios(14)) { [picker dismissViewControllerAnimated:YES completion:nil]; - if (results.count == 0) { - [self checkCreateEventButtonState]; - return; - } - PHPickerResult *result = results.firstObject; - if ([result.itemProvider canLoadObjectOfClass:[UIImage class]]) { - [result.itemProvider loadObjectOfClass:[UIImage class] completionHandler:^(__kindof id _Nullable object, NSError * _Nullable error) { - if ([object isKindOfClass:[UIImage class]]) { - dispatch_async(dispatch_get_main_queue(), ^{ - self.selectedImage = (UIImage *)object; - self.eventBannerImageView.image = (UIImage *)object; - self.eventBannerCamearImageView.hidden = NO; // Hide placeholder - [self checkCreateEventButtonState]; - }); - } else { - dispatch_async(dispatch_get_main_queue(), ^{ - [self checkCreateEventButtonState]; - }); - } - }]; - } else { - [self checkCreateEventButtonState]; - } + // 我们使用TZImagePickerController代替了PHPickerViewController,这个方法不再需要 + [self checkCreateEventButtonState]; } -/* -#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. -} -*/ - #pragma mark - Date Picker Methods - (void)setupDatePicker { @@ -591,24 +546,6 @@ static const CGFloat kSectionSpacing = 20.0; }]; } -- (void)showDatePicker { - CreateEventPickerContainerView *picker = [[CreateEventPickerContainerView alloc] init]; - [picker showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeStartTime onConfirm:^(NSDate *date, NSString *resultString) { - - }]; - - -// if (!_datePickerContainerView) { -// [self setupDatePicker]; -// } -// [self.view bringSubviewToFront:self.datePickerContainerView]; -// self.datePickerContainerView.hidden = NO; -// self.datePickerContainerView.alpha = 0; -// [UIView animateWithDuration:0.3 animations:^{ -// self.datePickerContainerView.alpha = 1; -// }]; -} - - (void)hideDatePicker { [UIView animateWithDuration:0.3 animations:^{ self.datePickerContainerView.alpha = 0; @@ -620,12 +557,10 @@ static const CGFloat kSectionSpacing = 20.0; - (void)datePickerDoneTapped { self.selectedStartTime = self.datePicker.date; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"]; // Customize format as needed + [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; // Customize format as needed NSString *formattedDate = [dateFormatter stringFromDate:self.selectedStartTime]; self.startTimePlaceholderLabel.text = formattedDate; - // If you have a placeholder color, change it back to normal text color - // self.startTimePlaceholderLabel.textColor = [UIColor blackColor]; [self hideDatePicker]; } @@ -706,8 +641,8 @@ static const CGFloat kSectionSpacing = 20.0; [self.eventBannerImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.eventBannerLabel.mas_bottom).offset(kVerticalPadding); - make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding); - make.height.mas_equalTo(118); // Adjust height as needed + make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding-1); + make.height.mas_equalTo(kGetScaleWidth(118)); // Adjust height as needed }]; [self.eventBannerCamearImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.trailing.equalTo(self.eventBannerImageView); @@ -718,13 +653,15 @@ static const CGFloat kSectionSpacing = 20.0; #pragma mark - Upload Banner Section - (void)setupUploadBannerSection { self.uploadBannerLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_11")]; + [self.contentView addSubview:self.uploadBannerLabel]; self.uploadBannerYesButton = [self createUploadBannerButtonWithTitle:YMLocalizedString(@"20.20.59_text_12") imageName:@"event_non_select" selectedImageName:@"event_selected" tag:0]; - self.uploadBannerYesButton.selected = YES; + self.uploadBannerYesButton.selected = NO; [self.uploadBannerYesButton addTarget:self action:@selector(uploadBannerButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; [self.contentView addSubview:self.uploadBannerYesButton]; + self.uploadBannerNoButton = [self createUploadBannerButtonWithTitle:YMLocalizedString(@"20.20.59_text_13") imageName:@"event_non_select" selectedImageName:@"event_selected" tag:1]; - self.uploadBannerNoButton.selected = NO; + self.uploadBannerNoButton.selected = YES; [self.uploadBannerNoButton addTarget:self action:@selector(uploadBannerButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; [self.contentView addSubview:self.uploadBannerNoButton]; @@ -852,6 +789,7 @@ static const CGFloat kSectionSpacing = 20.0; } - (void)checkCreateEventButtonState { + NSString *placeholder = YMLocalizedString(@"XPAnchorPKTableViewCell2"); BOOL hasTitle = self.eventTitleTextField.text.length > 0; BOOL hasBanner = self.selectedImage != nil; @@ -877,6 +815,7 @@ static const CGFloat kSectionSpacing = 20.0; __weak typeof(self) weakSelf = self; [self.durationPickerView showInView:self.view initialDate:[NSDate date] + config:self.configModel pickerType:CreateEventPickerTypeDuration onConfirm:^(NSDate *date, NSString *resultString) { weakSelf.durationPlaceholderLabel.text = resultString; @@ -919,4 +858,15 @@ static const CGFloat kSectionSpacing = 20.0; [self checkCreateEventButtonState]; } +#pragma mark - TZImagePickerControllerDelegate +- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray *)infos { + if (photos.count > 0) { + UIImage *croppedImage = photos.firstObject; + self.selectedImage = croppedImage; + self.eventBannerImageView.image = croppedImage; + self.eventBannerCamearImageView.hidden = NO; + [self checkCreateEventButtonState]; + } +} + @end diff --git a/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h b/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h deleted file mode 100644 index 157f9ce1..00000000 --- a/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h +++ /dev/null @@ -1,7 +0,0 @@ -@interface EventCenterEmptyCell : UITableViewCell - -+ (CGFloat)cellHeight; -+ (void)registerTo:(UITableView *)tableView; -+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath; - -@end \ No newline at end of file diff --git a/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m b/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m deleted file mode 100644 index 7f168ed4..00000000 --- a/YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m +++ /dev/null @@ -1,44 +0,0 @@ -#import "EventCenterEmptyCell.h" - -@implementation EventCenterEmptyCell -{ - UILabel *titleLabel; - UIImageView *ufoImageView; -} - -+ (CGFloat)cellHeight { - return 170; -} - -+ (void)registerTo:(UITableView *)tableView { - [tableView registerClass:[self class] - forCellReuseIdentifier:NSStringFromClass([self class])]; -} - -+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath { - return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath]; -} - -- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { - titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"20.20.59_text_19") - font:kFontRegular(14) - textColor:UIColorFromRGB(0xafb1b3)]; - ufoImageView = [[UIImageView alloc] initWithImage:kImage(@"common_empty_UFO")]; - [self.contentView addSubview:ufoImageView]; - [self.contentView addSubview:titleLabel]; - [ufoImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self.contentView); - make.top.mas_equalTo(16); - make.size.mas_equalTo(CGSizeMake(110, 110)); - }]; - [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.mas_equalTo(self.contentView); - make.top.mas_equalTo(ufoImageView.mas_bottom).offset(16); - make.height.mas_equalTo(20); - }]; - } - return self; -} - -@end \ No newline at end of file diff --git a/YuMi/Modules/YMNewHome/View/EventCenterViewController.m b/YuMi/Modules/YMNewHome/View/EventCenterViewController.m index 85e5bee1..72379117 100644 --- a/YuMi/Modules/YMNewHome/View/EventCenterViewController.m +++ b/YuMi/Modules/YMNewHome/View/EventCenterViewController.m @@ -16,6 +16,19 @@ #import "EventCenterEventCell.h" #import "XPWebViewController.h" #import "XPRoomViewController.h" +#import "MyEventsViewController.h" +#import "XPRoomViewController.h" + +static NSString *kOfficialEmptyID = @"official empty"; +static NSString *kSquareEmptyID = @"square empty"; +static NSString *kMyEmptyID = @"my empty"; + +static UIEdgeInsets kEventTableViewContentInset(void) { + return UIEdgeInsetsMake(-10, 0, 100 + kSafeAreaBottomHeight, 0); +} +static UIEdgeInsets kOfficialTableViewContentInset(void) { + return UIEdgeInsetsMake(0, 0, 100 + kSafeAreaBottomHeight, 0); +} @interface EventCenterViewController () @@ -72,7 +85,9 @@ make.height.mas_equalTo(44); }]; - NSArray *titles = @[YMLocalizedString(@"20.20.59_text_2"), YMLocalizedString(@"20.20.59_text_3"), YMLocalizedString(@"20.20.59_text_4")]; + NSArray *titles = @[YMLocalizedString(@"20.20.59_text_2"), + YMLocalizedString(@"20.20.59_text_3"), + YMLocalizedString(@"20.20.59_text_4")]; NSMutableArray *buttons = [NSMutableArray array]; CGFloat buttonWidth = UIScreen.mainScreen.bounds.size.width / titles.count; @@ -164,8 +179,11 @@ #pragma mark - Setup Data - (void)setOfficialEventModels:(NSArray *)officialEventModels { _officialDatasource = officialEventModels.mutableCopy; -// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"activityShow == %@", @(1)]; -// [_officialDatasource filterUsingPredicate:predicate]; +#if DEBUG +#else + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"activityShow == %@", @(1)]; + [_officialDatasource filterUsingPredicate:predicate]; +#endif // 处理空数据状态 if (_officialDatasource.count == 0) { @@ -218,21 +236,118 @@ // 根据当前选中的tab控制createButton的显示状态 self.createButton.hidden = (index == 0); + + // 加载数据逻辑 + if (index == 1 && self.eventSquareDatasource.count == 0) { + [self.presenter loadEventSquare:self.eventSquareTableViewPage]; + } else if (index == 2 && self.myCreateEventDatasource.count == 0 && self.mySubEventDatasource.count == 0) { + [self.presenter loadMyEvents]; + } } - (void)didTapCreateButton { CreateEventViewControllerV2 *createEventVC = [[CreateEventViewControllerV2 alloc] init]; [self.navigationController pushViewController:createEventVC animated:YES]; + + @kWeakify(self); + [createEventVC setCreateSuccess:^{ + @kStrongify(self); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + switch (self.currentIndex) { + case 1: + [self.eventSquareTableView.mj_header beginRefreshing]; + break; + case 2: + [self.myEventTableView.mj_header beginRefreshing]; + break; + default: + break; + } + }); + }]; +} + +- (void)didTapMyCreateEventSeactionTitle { + MyEventsViewController *vc = [[MyEventsViewController alloc] init]; + [self.navigationController pushViewController:vc + animated:YES]; +} + +- (void)handleCellStatusButtonDidTap:(EventItemModel *)model action:(EventCellActions)action { + switch (action) { + case EventCellAction_participate: + [XPRoomViewController openRoom:@(model.roomUid).stringValue + viewController:self]; + break; + case EventCellAction_sub: + [self.presenter subEvent:model.subStatus ? NO : YES + eventId:model.id]; + break; + case EventCellAction_unsub: + [self.presenter subEvent:model.subStatus ? NO : YES + eventId:model.id]; + break; + case EventCellAction_delete: + [self.presenter deleteEvent:model.id]; + default: + break; + } } #pragma mark - UITableViewDataSource +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { + if (tableView == self.myEventTableView) { + return 2; + } + return 1; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { + if (tableView == self.myEventTableView) { + return 60; + } + return 0; +} + +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { + if (tableView == self.myEventTableView) { + UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 60)]; + v.backgroundColor = [UIColor whiteColor]; + UILabel *title = [UILabel labelInitWithText:section == 0 ? YMLocalizedString(@"20.20.59_text_4") : YMLocalizedString(@"20.20.59_text_22") + font:kFontSemibold(18) + textColor:UIColorFromRGB(0x313131)]; + [v addSubview:title]; + [title mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(v); + make.leading.mas_equalTo(15); + }]; + + if (section == 0) { + UIImageView *arrow = [[UIImageView alloc] initWithImage:kImage(@"event_arrow_black")]; + arrow.userInteractionEnabled = YES; + [v addSubview:arrow]; + [arrow mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.mas_equalTo(v); + make.trailing.mas_equalTo(-15); + make.size.mas_equalTo(CGSizeMake(22, 22)); + }]; + + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self + action:@selector(didTapMyCreateEventSeactionTitle)]; + [arrow addGestureRecognizer:tap]; + } + + return v; + } + return nil; +} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (tableView == self.officialTableView) { return self.officialDatasource.count > 0 ? self.officialDatasource.count : 1; } else if (tableView == self.eventSquareTableView) { return self.eventSquareDatasource.count > 0 ? self.eventSquareDatasource.count : 1; - } else { + } else if (tableView == self.myEventTableView) { switch (section) { case 0: return self.myCreateEventDatasource.count > 0 ? self.myCreateEventDatasource.count : 1; @@ -245,35 +360,72 @@ break; } } + return 0; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + @kWeakify(self); if (tableView == self.officialTableView) { if (self.officialDatasource.count == 0) { - return [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; +// EventCenterEmptyCell *cell = + return [EventCenterEmptyCell cellFor:tableView customID:kOfficialEmptyID atIndexPath:indexPath]; } + EventCenterOfficialCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; if (!cell) { cell = [[EventCenterOfficialCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; } cell.cellModel = [self.officialDatasource xpSafeObjectAtIndex:indexPath.row]; return cell; - } else { - if ((tableView == self.eventSquareTableView && self.eventSquareDatasource.count == 0) || - (tableView == self.myEventTableView && self.myCreateEventDatasource.count == 0)) { - return [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath]; + } else if (tableView == self.eventSquareTableView) { + if (self.eventSquareDatasource.count == 0) { + return [EventCenterEmptyCell cellFor:tableView customID:kSquareEmptyID atIndexPath:indexPath]; } + EventCenterEventCell *cell = [EventCenterEventCell cellFor:tableView atIndexPath:indexPath]; - if (tableView == self.eventSquareTableView) { - EventItemModel *model = [self.eventSquareDatasource xpSafeObjectAtIndex:indexPath.row]; - [cell updateCell:model]; - } - if ((tableView == self.eventSquareTableView && self.eventSquareDatasource.count > indexPath.row) || - (tableView == self.myEventTableView && self.myCreateEventDatasource.count > indexPath.row)) { - // cell.model = tableView == self.eventSquareTableView ? self.eventSquareDatasource[indexPath.row] : self.myEventDatasource[indexPath.row]; - } + EventItemModel *model = [self.eventSquareDatasource xpSafeObjectAtIndex:indexPath.row]; + [cell updateCell:model]; + [cell setStatusButtonDidTap:^(EventItemModel * _Nonnull model, EventCellActions action) { + @kStrongify(self); + [self handleCellStatusButtonDidTap:model action:action]; + }]; + return cell; + } else if (tableView == self.myEventTableView) { + switch (indexPath.section) { + case 0: { + if (self.myCreateEventDatasource.count == 0) { + return [EventCenterEmptyCell cellFor:tableView customID:kMyEmptyID atIndexPath:indexPath]; + } + EventCenterEventCell *cell = [EventCenterEventCell cellFor:tableView atIndexPath:indexPath]; + EventItemModel *model = [self.myCreateEventDatasource xpSafeObjectAtIndex:indexPath.row]; + [cell updateCell:model]; + [cell setStatusButtonDidTap:^(EventItemModel * _Nonnull model, EventCellActions action) { + @kStrongify(self); + [self handleCellStatusButtonDidTap:model action:action]; + }]; + return cell; + } + break; + case 1: { + if (self.mySubEventDatasource.count == 0) { + return [EventCenterEmptyCell cellFor:tableView customID:kMyEmptyID atIndexPath:indexPath]; + } + EventCenterEventCell *cell = [EventCenterEventCell cellFor:tableView atIndexPath:indexPath]; + EventItemModel *model = [self.mySubEventDatasource xpSafeObjectAtIndex:indexPath.row]; + [cell updateCell:model]; + [cell setStatusButtonDidTap:^(EventItemModel * _Nonnull model, EventCellActions action) { + @kStrongify(self); + [self handleCellStatusButtonDidTap:model action:action]; + }]; + return cell; + } + break; + default: + break; + } } + return [UITableViewCell new]; } #pragma mark - UITableViewDelegate @@ -284,16 +436,16 @@ } if (tableView == self.eventSquareTableView) { - return self.eventSquareDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150; + return self.eventSquareDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 140; } if (tableView == self.myEventTableView) { switch (indexPath.section) { case 0: - return self.myCreateEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150; + return self.myCreateEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 140; break; case 1: - return self.mySubEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150; + return self.mySubEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 140; break; default: return 0; @@ -339,8 +491,23 @@ if (model) { [self toEventDetail:model.id]; } - } else if (tableView == self.myEventTableView && self.myCreateEventDatasource.count > indexPath.row) { - // 处理我的活动点击 + } else if (tableView == self.myEventTableView) { + EventItemModel *model; + switch (indexPath.section) { + case 0: { + model = [self.myCreateEventDatasource xpSafeObjectAtIndex:indexPath.row]; + } + break; + case 1: { + model = [self.mySubEventDatasource xpSafeObjectAtIndex:indexPath.row];\ + } + break; + default: + break; + } + if (model) { + [self toEventDetail:model.id]; + } } } @@ -378,6 +545,8 @@ // 首次切换到活动广场,加载数据 if (index == 1 && self.eventSquareDatasource.count == 0) { [self.presenter loadEventSquare:self.eventSquareTableViewPage]; + } else if (index == 2 && self.myCreateEventDatasource == 0 && self.mySubEventDatasource == 0) { + [self.presenter loadMyEvents]; } } } @@ -415,22 +584,94 @@ [self.eventSquareTableView.mj_footer setHidden:YES]; } -- (void)myCreateEventListSuccess:(NSArray *)list { +- (void)myCreateEventListSuccess:(NSArray *)list { + [self.myEventTableView.mj_header endRefreshing]; + self.myCreateEventDatasource = list.mutableCopy; + [self.myEventTableView reloadData]; } - (void)myCreateEventListFailure:(NSString *)msg { - [self.eventSquareTableView.mj_header endRefreshing]; - [self.eventSquareTableView.mj_footer setHidden:YES]; + [self.myEventTableView.mj_header endRefreshing]; + [self.myEventTableView.mj_footer setHidden:YES]; } -- (void)mySubEventListSuccess:(NSArray *)list { +- (void)mySubEventListSuccess:(NSArray *)list { + [self.myEventTableView.mj_header endRefreshing]; + if (self.myEventTableViewPage == 1) { + self.mySubEventDatasource = list.mutableCopy; + } else { + [self.mySubEventDatasource addObjectsFromArray:list]; + } + [self.myEventTableView reloadData]; + + if (list.count < 20) { + [self.myEventTableView.mj_footer endRefreshingWithNoMoreData]; + } else { + [self.myEventTableView.mj_footer endRefreshing]; + } } - (void)mySubEventListFailure:(NSString *)msg { - [self.eventSquareTableView.mj_header endRefreshing]; - [self.eventSquareTableView.mj_footer setHidden:YES]; + [self.myEventTableView.mj_header endRefreshing]; + [self.myEventTableView.mj_footer setHidden:YES]; +} + +- (void)eventSubActionSuccess:(BOOL)isSub eventId:(NSInteger)eventId { + switch (self.currentIndex) { + case 1: + for (EventItemModel *m in self.eventSquareDatasource) { + if (m.id == eventId) { + m.subStatus = isSub; + break; + } + } + [self.eventSquareTableView reloadData]; + break; + case 2: + for (EventItemModel *m in self.mySubEventDatasource) { + if (m.id == eventId) { + m.subStatus = isSub; + break; + } + } + for (EventItemModel *m in self.myCreateEventDatasource) { + if (m.id == eventId) { + m.subStatus = isSub; + break; + } + } + [self.myEventTableView reloadData]; + break; + + default: + break; + } +} + +- (void)eventSubActionFailure:(NSString *)msg { + +} + +- (void)deleteEventSuccess:(NSInteger)eventId { + for (EventItemModel *m in self.mySubEventDatasource) { + if (m.id == eventId) { + [self.mySubEventDatasource removeObject:m]; + break; + } + } + for (EventItemModel *m in self.myCreateEventDatasource) { + if (m.id == eventId) { + [self.myCreateEventDatasource removeObject:m]; + break; + } + } + [self.myEventTableView reloadData]; +} + +- (void)deleteEventFailure:(NSString *)msg { + } #pragma mark - Lazy Loading @@ -446,20 +687,9 @@ _officialTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } [_officialTableView registerClass:[EventCenterOfficialCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; - [EventCenterEmptyCell registerTo:_officialTableView]; - - _officialTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ - // 下拉刷新 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.officialTableView.mj_header endRefreshing]; - }); - }]; - _officialTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ - // 上拉加载更多 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.officialTableView.mj_footer endRefreshing]; - }); - }]; + _officialTableView.contentInset = kOfficialTableViewContentInset(); + _officialTableView.scrollIndicatorInsets = kOfficialTableViewContentInset(); + [EventCenterEmptyCell registerTo:_officialTableView withCustomID:kOfficialEmptyID]; } return _officialTableView; } @@ -474,8 +704,7 @@ if (@available(iOS 11.0, *)) { _eventSquareTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } - [_eventSquareTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])]; - [EventCenterEmptyCell registerTo:_eventSquareTableView]; + [EventCenterEmptyCell registerTo:_eventSquareTableView withCustomID:kSquareEmptyID]; [EventCenterEventCell registerTo:_eventSquareTableView]; __weak typeof(self) weakSelf = self; @@ -488,6 +717,9 @@ // 上拉加载更多 [(CreateEventPresenter *)weakSelf.presenter loadEventSquare:weakSelf.eventSquareTableViewPage]; }]; + + _eventSquareTableView.contentInset = kEventTableViewContentInset(); + _eventSquareTableView.scrollIndicatorInsets = kEventTableViewContentInset(); } return _eventSquareTableView; } @@ -502,25 +734,23 @@ if (@available(iOS 11.0, *)) { _myEventTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } - [_myEventTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])]; - [EventCenterEmptyCell registerTo:_myEventTableView]; + [EventCenterEmptyCell registerTo:_myEventTableView withCustomID:kMyEmptyID]; [EventCenterEventCell registerTo:_myEventTableView]; - + + __weak typeof(self) weakSelf = self; _myEventTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ // 下拉刷新 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.myEventTableView.mj_header endRefreshing]; - if (self.myCreateEventDatasource.count == 0) { - self.myEventTableView.mj_footer.hidden = YES; - } - }); + weakSelf.myEventTableViewPage = 1; + [weakSelf.presenter loadMyEvents]; }]; _myEventTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ // 上拉加载更多 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.myEventTableView.mj_footer endRefreshing]; - }); + weakSelf.myEventTableViewPage += 1; + [weakSelf.presenter loadMySubEvents:weakSelf.myEventTableViewPage]; }]; + + _myEventTableView.contentInset = kEventTableViewContentInset(); + _myEventTableView.scrollIndicatorInsets = kEventTableViewContentInset(); } return _myEventTableView; } diff --git a/YuMi/Modules/YMNewHome/View/MyEventsViewController.h b/YuMi/Modules/YMNewHome/View/MyEventsViewController.h new file mode 100644 index 00000000..60c55b81 --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/MyEventsViewController.h @@ -0,0 +1,16 @@ +// +// MyEventsViewController.h +// YuMi +// +// Created by P on 2025/5/16. +// + +#import "MvpViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface MyEventsViewController : MvpViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/YuMi/Modules/YMNewHome/View/MyEventsViewController.m b/YuMi/Modules/YMNewHome/View/MyEventsViewController.m new file mode 100644 index 00000000..f2d92ee2 --- /dev/null +++ b/YuMi/Modules/YMNewHome/View/MyEventsViewController.m @@ -0,0 +1,126 @@ +// +// MyEventsViewController.m +// YuMi +// +// Created by P on 2025/5/16. +// + +#import "MyEventsViewController.h" +#import "CreateEventPresenter.h" +#import "EventCenterEmptyCell.h" +#import "EventCenterEventCell.h" +#import "XPWebViewController.h" + +@interface MyEventsViewController () + +@property (nonatomic, assign) NSInteger page; +@property (nonatomic, strong) UITableView *myEventTableView; +@property (nonatomic, strong) NSMutableArray *datasource; + +@end + +@implementation MyEventsViewController + +- (CreateEventPresenter *)createPresenter { + return [[CreateEventPresenter alloc] init]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.title = YMLocalizedString(@"20.20.59_text_4"); + + [self.view addSubview:self.myEventTableView]; + [self.myEventTableView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.mas_equalTo(self.view); + }]; + + [self.myEventTableView.mj_header beginRefreshing]; +} + +#pragma mark - +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return self.datasource.count == 0 ? 1 : self.datasource.count; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return self.datasource.count == 0 ? [EventCenterEmptyCell cellHeight] : [EventCenterEventCell cellHeight]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + if (self.datasource.count == 0) { + return [EventCenterEmptyCell cellFor:tableView customID:@"" atIndexPath:indexPath]; + } + EventCenterEventCell *cell = [EventCenterEventCell cellFor:tableView atIndexPath:indexPath]; + EventItemModel *model = [self.datasource xpSafeObjectAtIndex:indexPath.row]; + [cell updateCell:model]; + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + EventItemModel *model = [self.datasource xpSafeObjectAtIndex:indexPath.row]; + if (model) { + XPWebViewController * webVC = [[XPWebViewController alloc] initWithRoomUID:nil]; + webVC.url = [NSString stringWithFormat:@"%@%@", + URLWithType(kEventDetailPath), + @(model.id)]; + [self.navigationController pushViewController:webVC animated:YES]; + } +} + +#pragma mark - CreateEventPresenterProcotol +- (void)myCreateEventListSuccess:(NSArray *)list { + if (self.page > 1) { + [self.datasource addObjectsFromArray:list]; + } else { + self.datasource = list.mutableCopy; + + // 首次加载完成后,根据数据量添加footer + if (!self.myEventTableView.mj_footer) { + __weak typeof(self) weakSelf = self; + MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ + // 上拉加载更多 + weakSelf.page += 1; + [weakSelf.presenter loadMyCreateEvents:weakSelf.page]; + }]; + [footer setTitle:YMLocalizedString(@"20.20.59_text_23") forState:MJRefreshStateNoMoreData]; + self.myEventTableView.mj_footer = footer; + } + } + [self.myEventTableView reloadData]; + + [self.myEventTableView.mj_header endRefreshing]; + if (list.count < 20) { + [self.myEventTableView.mj_footer endRefreshingWithNoMoreData]; + } else { + [self.myEventTableView.mj_footer resetNoMoreData]; + } +} + +- (void)myCreateEventListFailure:(NSString *)msg { + +} + +#pragma mark - +- (UITableView *)myEventTableView { + if (!_myEventTableView) { + _myEventTableView = [[UITableView alloc] init]; + _myEventTableView.backgroundColor = [UIColor whiteColor]; + _myEventTableView.delegate = self; + _myEventTableView.dataSource = self; + _myEventTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + if (@available(iOS 11.0, *)) { + _myEventTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + [EventCenterEmptyCell registerTo:_myEventTableView withCustomID:@""]; + [EventCenterEventCell registerTo:_myEventTableView]; + __weak typeof(self) weakSelf = self; + _myEventTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ + // 下拉刷新 + weakSelf.page = 1; + [weakSelf.presenter loadMyCreateEvents:weakSelf.page]; + }]; + } + return _myEventTableView; +} +@end diff --git a/YuMi/Modules/YMRoom/View/FaceView/View/Cell/XPRoomFaceTitleCollectionViewCell.m b/YuMi/Modules/YMRoom/View/FaceView/View/Cell/XPRoomFaceTitleCollectionViewCell.m index 8130d4a5..74e68102 100644 --- a/YuMi/Modules/YMRoom/View/FaceView/View/Cell/XPRoomFaceTitleCollectionViewCell.m +++ b/YuMi/Modules/YMRoom/View/FaceView/View/Cell/XPRoomFaceTitleCollectionViewCell.m @@ -15,8 +15,8 @@ #import "ChatFaceVo.h" @interface XPRoomFaceTitleCollectionViewCell () -///标题 -@property (nonatomic,strong) UILabel *titleLabel; + +@property (nonatomic, strong) UIView *selectedBG; @property (nonatomic, strong) NetImageView *imageView; @end @@ -34,57 +34,61 @@ - (void)prepareForReuse { [super prepareForReuse]; - if (self.titleModel.tabModel){ - self.imageView.hidden = NO; - } else { - self.imageView.hidden = YES; - } +} + +- (void)setSelected:(BOOL)selected { + [super setSelected:selected]; + + // 根据选中状态显示或隐藏selectedBG + self.selectedBG.hidden = !selected; } #pragma mark - Private Method - (void)initSubViews { - [self.contentView addSubview:self.titleLabel]; + [self.contentView addSubview:self.selectedBG]; [self.contentView addSubview:self.imageView]; + + // 默认隐藏选中背景 + self.selectedBG.hidden = YES; } - (void)initSubViewConstraints { - [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + [self.selectedBG mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.contentView); }]; [self.imageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(self.contentView); + make.edges.mas_equalTo(self.contentView).insets(UIEdgeInsetsMake(4, 4, 4, 4)); }]; } #pragma mark - Getters And Setters - (void)setTitleModel:(RoomFaceTitleItemModel *)titleModel { _titleModel = titleModel; - self.titleLabel.hidden = titleModel.tabModel; - self.imageView.hidden = !titleModel.tabModel; if (titleModel.tabModel) { [self.imageView setImageUrl:titleModel.tabModel.tabUrl]; } else { - if (titleModel) { - self.titleLabel.text = titleModel.title; - self.titleLabel.textColor = titleModel.isSelect ? [DJDKMIMOMColor appMainColor] : [UIColor whiteColor]; - } + self.imageView.image = kImage(@"鸭子"); } -} - -- (UILabel *)titleLabel { - if (!_titleLabel) { - _titleLabel = [[UILabel alloc] init]; - _titleLabel.font = [UIFont systemFontOfSize:14]; - _titleLabel.textAlignment = NSTextAlignmentCenter; - } - return _titleLabel; + + // 根据model的isSelect属性更新选中状态UI + self.selectedBG.hidden = !titleModel.isSelect; } - (NetImageView *)imageView { if (!_imageView) { _imageView = [[NetImageView alloc] init]; + _imageView.contentMode = UIViewContentModeScaleAspectFit; } return _imageView; } +- (UIView *)selectedBG { + if (!_selectedBG) { + _selectedBG = [[UIView alloc] init]; + _selectedBG.backgroundColor = UIColorFromRGB(0x272727); + [_selectedBG setCornerRadius:8]; + } + return _selectedBG; +} + @end diff --git a/YuMi/Modules/YMRoom/View/FaceView/View/XPRoomFaceViewController.m b/YuMi/Modules/YMRoom/View/FaceView/View/XPRoomFaceViewController.m index acbcacf8..395627d0 100644 --- a/YuMi/Modules/YMRoom/View/FaceView/View/XPRoomFaceViewController.m +++ b/YuMi/Modules/YMRoom/View/FaceView/View/XPRoomFaceViewController.m @@ -37,12 +37,9 @@ @property (nonatomic,strong) UIView * contentView; ///最外层的容器 @property (nonatomic,strong) UIStackView *stackView; -///标题的容器 -@property (nonatomic,strong) UIStackView *titleStackView; ///列表 @property (nonatomic,strong) UICollectionView *titleCollectionView; -///VIP特权 -@property (nonatomic,strong) UIButton *noblePrivilButton; + ///列表 @property (nonatomic,strong) UICollectionView *faceCollectionView; ///分页控件 @@ -86,14 +83,14 @@ [self.presenter getUserInfo]; if ([XPRoomFaceTool shareFaceTool].faceDirectory) { [self.presenter getRoomNormalFace]; - [self.presenter getRoomNobelFace]; +// [self.presenter getRoomNobelFace]; } else { [self showLoading]; [[XPRoomFaceTool shareFaceTool] downFaceDataCompletion:^(NSString * _Nonnull path) { [self hideHUD]; if (path.length > 0) { [self.presenter getRoomNormalFace]; - [self.presenter getRoomNobelFace]; +// [self.presenter getRoomNobelFace]; } else { [self showErrorToast:YMLocalizedString(@"XPRoomFaceViewController0")]; } @@ -108,12 +105,9 @@ [self.contentView addSubview:self.stackView]; - [self.stackView addArrangedSubview:self.titleStackView]; + [self.stackView addArrangedSubview:self.titleCollectionView]; [self.stackView addArrangedSubview:self.faceCollectionView]; [self.stackView addArrangedSubview:self.pageView]; - - [self.titleStackView addArrangedSubview:self.titleCollectionView]; -// [self.titleStackView addArrangedSubview:self.noblePrivilButton]; NSArray *faceTabs = [[XPRoomFaceTool shareFaceTool] loadFaceTabs]; for (ChatFaceResponse *tab in faceTabs) { @@ -157,8 +151,8 @@ }]; - [self.titleStackView mas_makeConstraints:^(MASConstraintMaker *make) { - make.height.mas_equalTo(53); + [self.titleCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.mas_equalTo(36); }]; [self.pageView mas_makeConstraints:^(MASConstraintMaker *make) { @@ -170,15 +164,6 @@ [self.faceCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(collectionViewHeight); }]; - -// [self.noblePrivilButton mas_makeConstraints:^(MASConstraintMaker *make) { -// make.size.mas_equalTo(CGSizeMake(84, 26)); -// }]; - - [self.titleCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.mas_equalTo(108); - make.height.mas_equalTo(28); - }]; } - (void)updatePageViewState:(NSArray *)array { @@ -301,14 +286,7 @@ #pragma mark - UICollectionViewDelegate And UICollectionViewDatasource - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { if (collectionView == self.titleCollectionView) { - RoomFaceTitleItemModel * itemModel = [self.titleList xpSafeObjectAtIndex:indexPath.row]; - if (itemModel.tabModel) { - return CGSizeMake(34, 34); - } else { - CGSize size = [itemModel.title boundingRectWithSize:CGSizeMake(120, CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading | NSStringDrawingTruncatesLastVisibleLine - attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:13]} context:nil].size; - return CGSizeMake(size.width + 10, size.height); - } + return CGSizeMake(34, 34); } else if (collectionView == self.faceCollectionView) { CGFloat itemWidth = (CGFloat)(KScreenWidth - 15 * 2 - 10 * 4) / (CGFloat)5; return CGSizeMake(itemWidth, itemWidth + 20); @@ -362,6 +340,7 @@ - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { if (collectionView == self.titleCollectionView) { + RoomFaceTitleItemModel * titleModel = [self.titleList xpSafeObjectAtIndex:indexPath.row]; self.selectTitleItem = titleModel; [self.titleCollectionView reloadData]; @@ -456,35 +435,6 @@ return _stackView; } -- (UIStackView *)titleStackView { - if (!_titleStackView) { - _titleStackView = [[UIStackView alloc] init]; - _titleStackView.axis = UILayoutConstraintAxisHorizontal; - _titleStackView.distribution = UIStackViewDistributionFill; - _titleStackView.alignment = UIStackViewAlignmentBottom; - _titleStackView.spacing = 10; - CAShapeLayer * layer = [CAShapeLayer layer]; - UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, KScreenWidth, 53) byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight cornerRadii:CGSizeMake(12, 12)]; - layer.path = path.CGPath; - _titleStackView.layer.masksToBounds = YES; - _titleStackView.layer.mask = layer;; - } - return _titleStackView; -} - -- (UIButton *)noblePrivilButton { - if (!_noblePrivilButton) { - _noblePrivilButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_noblePrivilButton setImage:[UIImage imageNamed:@"room_face_nobel_privil"] forState:UIControlStateNormal]; - [_noblePrivilButton setImage:[UIImage imageNamed:@"room_face_nobel_privil"] forState:UIControlStateSelected]; - [_noblePrivilButton addTarget:self action:@selector(noblePrivilButtonAction:) forControlEvents:UIControlEventTouchUpInside]; - _noblePrivilButton.hidden = YES; - [_noblePrivilButton setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; - } - return _noblePrivilButton; -} - - - (UICollectionView *)titleCollectionView{ if (!_titleCollectionView) { MSBaseRTLFlowLayout *layout = [[MSBaseRTLFlowLayout alloc] init]; @@ -530,12 +480,8 @@ normalItem.title= YMLocalizedString(@"XPRoomFaceViewController2"); normalItem.isSelect = YES; normalItem.faceType = RoomFaceTitleItemType_Normal; - - RoomFaceTitleItemModel * nobelItem = [[RoomFaceTitleItemModel alloc] init]; - nobelItem.title= YMLocalizedString(@"XPRoomFaceViewController3"); - nobelItem.isSelect = NO; - nobelItem.faceType = RoomFaceTitleItemType_Nobel; - _titleList = @[normalItem, nobelItem].mutableCopy; + + _titleList = @[normalItem].mutableCopy; } return _titleList; } diff --git a/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m b/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m index 35b3373e..38898718 100644 --- a/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m +++ b/YuMi/Modules/YMRoom/View/SendGiftView/View/Cell/XPGiftItemCollectionViewCell.m @@ -107,9 +107,9 @@ }]; [self.giftImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.mas_equalTo(self.contentView).offset(18); + make.top.mas_equalTo(self.contentView).offset(4); make.centerX.mas_equalTo(self.contentView); - make.size.mas_equalTo(CGSizeMake(48, 48)); + make.size.mas_equalTo(CGSizeMake(62, 62)); }]; [self.giftNameLabel mas_makeConstraints:^(MASConstraintMaker *make) { diff --git a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m index cd138fbf..76b1ac37 100644 --- a/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m +++ b/YuMi/Modules/YMRoom/View/StageView/MicroView/MicroView.m @@ -913,11 +913,7 @@ _faceSvgaImageView.userInteractionEnabled = YES; _faceSvgaImageView.autoPlay = YES; _faceSvgaImageView.clearsAfterStop = YES; -#if DEBUG _faceSvgaImageView.loops = 1; -#else - _faceSvgaImageView.loops = 1; -#endif } return _faceSvgaImageView; } diff --git a/YuMi/Modules/YMTabbar/View/TabbarViewController.m b/YuMi/Modules/YMTabbar/View/TabbarViewController.m index c65d0e42..91c0964f 100644 --- a/YuMi/Modules/YMTabbar/View/TabbarViewController.m +++ b/YuMi/Modules/YMTabbar/View/TabbarViewController.m @@ -197,44 +197,64 @@ UIKIT_EXTERN NSString *kTabShowAnchorCardKey; - (void)registerSocialCallBack { // 注册分享回调事件 - [[SocialShareManager sharedManager] setHandleJumpToRoom:^(NSString * _Nonnull roomID) { - if (![NSString isEmpty:roomID]) { - //判断是否在房间 - __block BOOL isInRoom = NO; - __block XPRoomViewController *currentRoom; - [[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - if ([obj isKindOfClass:[XPRoomViewController class]]) { - currentRoom = obj; - *stop = YES; - isInRoom = YES; - } - }]; + + [[SocialShareManager sharedManager] setHandleJumpToRoom:^(ShareItmeInfo * _Nonnull shareItem) { + switch (shareItem.shareType) { + case 1: { // 跳转到房间 + NSString *roomID = shareItem.targetUid; + if (![NSString isEmpty:roomID]) { + //判断是否在房间 + __block BOOL isInRoom = NO; + __block XPRoomViewController *currentRoom; + [[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController.viewControllers enumerateObjectsUsingBlock:^(__kindof UIViewController * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + if ([obj isKindOfClass:[XPRoomViewController class]]) { + currentRoom = obj; + *stop = YES; + isInRoom = YES; + } + }]; - // 如果有 mini 房间 - if (isInRoom == NO && [XPRoomMiniManager shareManager].getRoomInfo) { - @kWeakify(self); - [TTPopup alertWithMessage:YMLocalizedString(@"Combo_10") confirmHandler:^{ - @kStrongify(self); - [[RtcManager instance] exitRoom]; - [[NIMSDK sharedSDK].chatroomManager exitChatroom:[NSString stringWithFormat:@"%ld", [XPRoomMiniManager shareManager].getRoomInfo.roomId] completion:nil]; - [self.roomMineView hiddenRoomMiniView]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // 如果有 mini 房间 + if (isInRoom == NO && [XPRoomMiniManager shareManager].getRoomInfo) { + @kWeakify(self); + [TTPopup alertWithMessage:YMLocalizedString(@"Combo_10") confirmHandler:^{ + @kStrongify(self); + [[RtcManager instance] exitRoom]; + [[NIMSDK sharedSDK].chatroomManager exitChatroom:[NSString stringWithFormat:@"%ld", [XPRoomMiniManager shareManager].getRoomInfo.roomId] completion:nil]; + [self.roomMineView hiddenRoomMiniView]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [XPRoomViewController openRoom:roomID + viewController:[XCCurrentVCStackManager shareManager].getCurrentVC]; + }); + } cancelHandler:^{}]; + } else if (isInRoom && ![currentRoom isSameRoom:roomID]) { + [TTPopup alertWithMessage:YMLocalizedString(@"Combo_10") confirmHandler:^{ + [currentRoom exitRoom]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [XPRoomViewController openRoom:roomID + viewController:[XCCurrentVCStackManager shareManager].getCurrentVC]; + }); + } cancelHandler:^{}]; + } else { [XPRoomViewController openRoom:roomID viewController:[XCCurrentVCStackManager shareManager].getCurrentVC]; - }); - } cancelHandler:^{}]; - } else if (isInRoom && ![currentRoom isSameRoom:roomID]) { - [TTPopup alertWithMessage:YMLocalizedString(@"Combo_10") confirmHandler:^{ - [currentRoom exitRoom]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [XPRoomViewController openRoom:roomID - viewController:[XCCurrentVCStackManager shareManager].getCurrentVC]; - }); - } cancelHandler:^{}]; - } else { - [XPRoomViewController openRoom:roomID - viewController:[XCCurrentVCStackManager shareManager].getCurrentVC]; + } + } } + + break; + case 2: // 跳转到活动 + { + XPWebViewController * webVC = [[XPWebViewController alloc] initWithRoomUID:nil]; + webVC.url = [NSString stringWithFormat:@"%@%@", + URLWithType(kEventDetailPath), + shareItem.targetId]; + [self.navigationController pushViewController:webVC animated:YES]; + } + break; + + default: + break; } }]; } diff --git a/YuMi/Modules/YMWeb/XPWebViewController.m b/YuMi/Modules/YMWeb/XPWebViewController.m index c7bf9d4c..b7d99ab7 100644 --- a/YuMi/Modules/YMWeb/XPWebViewController.m +++ b/YuMi/Modules/YMWeb/XPWebViewController.m @@ -17,7 +17,7 @@ #import #import "XCCurrentVCStackManager.h" #import "XPMineUserInfoViewController.h" - +#import "ShareHelder.h" #import "Api+Mine.h" #import "YuMi-swift.h" #import "RechargeStorage.h" @@ -127,6 +127,7 @@ NSString * const kJSGoToExchangeGold = @"goToExchangeGold"; NSString * const kJSOpenPayment = @"openPayment"; NSString * const kJSOpenPaymentCallback = @"openPaymentCallback"; NSString * const kJSVerifyCaptchaCallBack = @"closeToVerify"; +NSString * const kJSShowShareCallBack = @"showShareAction"; @implementation XPWebViewController @@ -373,8 +374,8 @@ NSString * const kJSVerifyCaptchaCallBack = @"closeToVerify"; ///测试环境只要有host就执行,方便h5连接本地调试 BOOL condition = currentUrl != nil && [currentUrl containsString:API_HOST_URL]; #ifdef DEBUG - // NSLog(@"-- -- - -- - - | -- -- - -- - -%@", response); - // NSLog(@"-- -- - -- - -%@: %@", message.name, message.body); + NSLog(@"-- -- - -- - - | -- -- - -- - -%@", response); + NSLog(@"-- -- - -- - -%@: %@", message.name, message.body); condition = currentUrl != nil; #endif if(condition) { @@ -567,19 +568,27 @@ NSString * const kJSVerifyCaptchaCallBack = @"closeToVerify"; self.savePhotoDic = bodyDic; [self showShareSavePhote]; } - }else if([message.name isEqualToString:kJSGoToExchangeGold]){ + } else if([message.name isEqualToString:kJSGoToExchangeGold]){ XPIncomeRecordVC *incomeRecordVC = [XPIncomeRecordVC new]; [[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController pushViewController:incomeRecordVC animated:YES]; - }else if([message.name isEqualToString:kJSOpenPayment]) { + } else if([message.name isEqualToString:kJSOpenPayment]) { [self handleOpenPayment:message.body]; } else if([message.name isEqualToString:kJSVerifyCaptchaCallBack]) { [self handleCaptchaResult:[message.body integerValue] == 1]; + } else if([message.name isEqualToString:kJSShowShareCallBack]) { + [self handleShareActioin]; } } }]; } #pragma mark - +- (void)handleShareActioin { + [ShareHelder shareImage:kImage(@"share_icon") //self.hostDelegate.getRoomInfo.avatar + url:self.url + fromController:[XCCurrentVCStackManager shareManager].getCurrentVC]; +} + - (void)handleCaptchaResult:(BOOL)reuslt { if (_verifyCaptcha) { self.verifyCaptcha(reuslt); @@ -983,6 +992,7 @@ NSString * const kJSVerifyCaptchaCallBack = @"closeToVerify"; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPayment]; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSOpenPaymentCallback]; [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSVerifyCaptchaCallBack]; + [_pi_userContentController addScriptMessageHandler:weakScriptMessageDelegate name:kJSShowShareCallBack]; } return _pi_userContentController; diff --git a/YuMi/Structure/MVP/Api/Api.m b/YuMi/Structure/MVP/Api/Api.m index 0d70004b..8d942cc6 100644 --- a/YuMi/Structure/MVP/Api/Api.m +++ b/YuMi/Structure/MVP/Api/Api.m @@ -149,7 +149,7 @@ } + (void)shareGetInfo:(HttpRequestHelperCompletion)completion code:(NSString *)code { - [self makeRequest:@"share/getInfo"// [NSString stringWithFormat:@"share/getInfo?code=%@", code] + [self makeRequest:@"share/getInfo" method:HttpRequestHelperMethodGET completion:completion, __FUNCTION__, diff --git a/YuMi/Tools/Share/SocialShareManager.h b/YuMi/Tools/Share/SocialShareManager.h index f4359bfa..7d08fa99 100644 --- a/YuMi/Tools/Share/SocialShareManager.h +++ b/YuMi/Tools/Share/SocialShareManager.h @@ -9,9 +9,18 @@ NS_ASSUME_NONNULL_BEGIN +@interface ShareItmeInfo : PIBaseModel + +@property(nonatomic, copy) NSString *shareId; +@property(nonatomic, copy) NSString *uid; +@property(nonatomic, copy) NSString *targetUid; +@property(nonatomic, copy) NSString *targetId; +@property(nonatomic, assign) NSInteger shareType; // 1. 房间; 2. 活动 +@end + @interface SocialShareManager : NSObject -@property(nonatomic, copy, nullable) void(^handleJumpToRoom)(NSString *roomID); +@property(nonatomic, copy, nullable) void(^handleJumpToRoom)(ShareItmeInfo *shareItem); + (instancetype)sharedManager; - (void)handleURL:(NSURL *)url; diff --git a/YuMi/Tools/Share/SocialShareManager.m b/YuMi/Tools/Share/SocialShareManager.m index c121c037..7a47f32a 100644 --- a/YuMi/Tools/Share/SocialShareManager.m +++ b/YuMi/Tools/Share/SocialShareManager.m @@ -8,13 +8,7 @@ #import "SocialShareManager.h" #import "Api.h" -@interface ShareItmeInfo : PIBaseModel -@property(nonatomic, copy) NSString *shareId; -@property(nonatomic, copy) NSString *uid; -@property(nonatomic, copy) NSString *targetUid; - -@end @implementation ShareItmeInfo @@ -99,7 +93,7 @@ if (code == 200) { self.shareItem = [ShareItmeInfo modelWithJSON:data.data]; if (self.handleJumpToRoom) { - self.handleJumpToRoom(self.shareItem.targetUid); + self.handleJumpToRoom(self.shareItem); [self cleanCache]; } } diff --git a/YuMi/ar.lproj/Localizable.strings b/YuMi/ar.lproj/Localizable.strings index 97e068c6..f3f61266 100644 --- a/YuMi/ar.lproj/Localizable.strings +++ b/YuMi/ar.lproj/Localizable.strings @@ -4173,13 +4173,13 @@ ineHeadView12" = "الحمل"; "20.20.59_text_2" = "Offical"; "20.20.59_text_3" = "Event Square"; "20.20.59_text_4" = "My Events"; -"20.20.59_text_5" = "Sub"; -"20.20.59_text_6" = "Unsub"; -"20.20.59_text_7" = "Participate"; +"20.20.59_text_5" = " Sub"; +"20.20.59_text_6" = " Unsub"; +"20.20.59_text_7" = " Participate"; "20.20.59_text_8" = "Create Event"; "20.20.59_text_9" = "Event Title"; "20.20.59_text_10" = "Event Banner"; -"20.20.59_text_11" = "Upload Banner to Homepage(Costs 1000)"; +"20.20.59_text_11" = "Upload Banner to Homepage(Costs %@)"; "20.20.59_text_12" = "YES"; "20.20.59_text_13" = "NO"; "20.20.59_text_14" = "Select Room"; @@ -4188,3 +4188,9 @@ ineHeadView12" = "الحمل"; "20.20.59_text_17" = "Event Content"; "20.20.59_text_18" = "Notify My Fans"; "20.20.59_text_19" = "No rooms available~"; +"20.20.59_text_22" = "My Sub"; +"20.20.59_text_23" = "Only the data of the last 30 days is displayed"; +"20.20.59_text_24" = "Event starting"; +"20.20.59_text_25" = "Event ended"; +"20.20.59_text_26" = "Your Event is about to start! Your fans and subscribers have been notified!"; +"20.20.59_text_27" = "The Event you followed is about to start—click to join now!!!"; diff --git a/YuMi/en.lproj/Localizable.strings b/YuMi/en.lproj/Localizable.strings index d1b9fce2..8626432b 100644 --- a/YuMi/en.lproj/Localizable.strings +++ b/YuMi/en.lproj/Localizable.strings @@ -3958,13 +3958,13 @@ "20.20.59_text_2" = "Offical"; "20.20.59_text_3" = "Event Square"; "20.20.59_text_4" = "My Events"; -"20.20.59_text_5" = "Sub"; -"20.20.59_text_6" = "Unsub"; -"20.20.59_text_7" = "Participate"; +"20.20.59_text_5" = " Sub"; +"20.20.59_text_6" = " Unsub"; +"20.20.59_text_7" = " Participate"; "20.20.59_text_8" = "Create Event"; "20.20.59_text_9" = "Event Title"; "20.20.59_text_10" = "Event Banner"; -"20.20.59_text_11" = "Upload Banner to Homepage(Costs 1000)"; +"20.20.59_text_11" = "Upload Banner to Homepage(Costs %@)"; "20.20.59_text_12" = "YES"; "20.20.59_text_13" = "NO"; "20.20.59_text_14" = "Select Room"; @@ -3973,3 +3973,9 @@ "20.20.59_text_17" = "Event Content"; "20.20.59_text_18" = "Notify My Fans"; "20.20.59_text_19" = "No rooms available~"; +"20.20.59_text_22" = "My Sub"; +"20.20.59_text_23" = "Only the data of the last 30 days is displayed"; +"20.20.59_text_24" = "Event starting"; +"20.20.59_text_25" = "Event ended"; +"20.20.59_text_26" = "Your Event is about to start! Your fans and subscribers have been notified!"; +"20.20.59_text_27" = "The Event you followed is about to start—click to join now!!!"; diff --git a/YuMi/tr.lproj/Localizable.strings b/YuMi/tr.lproj/Localizable.strings index e9f5ffe5..fefb28f5 100644 --- a/YuMi/tr.lproj/Localizable.strings +++ b/YuMi/tr.lproj/Localizable.strings @@ -3751,13 +3751,13 @@ "20.20.59_text_2" = "Offical"; "20.20.59_text_3" = "Event Square"; "20.20.59_text_4" = "My Events"; -"20.20.59_text_5" = "Sub"; -"20.20.59_text_6" = "Unsub"; -"20.20.59_text_7" = "Participate"; +"20.20.59_text_5" = " Sub"; +"20.20.59_text_6" = " Unsub"; +"20.20.59_text_7" = " Participate"; "20.20.59_text_8" = "Create Event"; "20.20.59_text_9" = "Event Title"; "20.20.59_text_10" = "Event Banner"; -"20.20.59_text_11" = "Upload Banner to Homepage(Costs 1000)"; +"20.20.59_text_11" = "Upload Banner to Homepage(Costs %@)"; "20.20.59_text_12" = "YES"; "20.20.59_text_13" = "NO"; "20.20.59_text_14" = "Select Room"; @@ -3766,3 +3766,9 @@ "20.20.59_text_17" = "Event Content"; "20.20.59_text_18" = "Notify My Fans"; "20.20.59_text_19" = "No rooms available~"; +"20.20.59_text_22" = "My Sub"; +"20.20.59_text_23" = "Only the data of the last 30 days is displayed"; +"20.20.59_text_24" = "Event starting"; +"20.20.59_text_25" = "Event ended"; +"20.20.59_text_26" = "Your Event is about to start! Your fans and subscribers have been notified!"; +"20.20.59_text_27" = "The Event you followed is about to start—click to join now!!!"; diff --git a/YuMi/zh-Hant.lproj/Localizable.strings b/YuMi/zh-Hant.lproj/Localizable.strings index 557a43d3..ec788536 100644 --- a/YuMi/zh-Hant.lproj/Localizable.strings +++ b/YuMi/zh-Hant.lproj/Localizable.strings @@ -3622,14 +3622,14 @@ "20.20.59_text_1" = "老年人活動中心"; "20.20.59_text_2" = "Offical"; "20.20.59_text_3" = "Event Square"; -"20.20.59_text_4" = "My Events"; -"20.20.59_text_5" = "Sub"; -"20.20.59_text_6" = "Unsub"; -"20.20.59_text_7" = "Participate"; +"20.20.59_text_4" = "My Event"; +"20.20.59_text_5" = " Sub"; +"20.20.59_text_6" = " Unsub"; +"20.20.59_text_7" = " Participate"; "20.20.59_text_8" = "Create Event"; "20.20.59_text_9" = "Event Title"; "20.20.59_text_10" = "Event Banner"; -"20.20.59_text_11" = "Upload Banner to Homepage(Costs 1000)"; +"20.20.59_text_11" = "Upload Banner to Homepage(Costs %@)"; "20.20.59_text_12" = "YES"; "20.20.59_text_13" = "NO"; "20.20.59_text_14" = "Select Room"; @@ -3640,3 +3640,9 @@ "20.20.59_text_19" = "No rooms available~"; "20.20.59_text_20" = "My Rooms"; "20.20.59_text_21" = "Admin Rooms"; +"20.20.59_text_22" = "My Sub"; +"20.20.59_text_23" = "Only the data of the last 30 days is displayed"; +"20.20.59_text_24" = "Event starting"; +"20.20.59_text_25" = "Event ended"; +"20.20.59_text_26" = "Your Event is about to start! Your fans and subscribers have been notified!"; +"20.20.59_text_27" = "The Event you followed is about to start—click to join now!!!";