diff --git a/.vscode/settings.json b/.vscode/settings.json index 199b1d12..748c946b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,6 +10,7 @@ "autoreleasepool", "Autoresizing", "Bugly", + "Commont", "MSRTL", "NIMSDK", "Nonnull", diff --git a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h index 5ec21bb9..64158903 100644 --- a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h +++ b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.h @@ -10,7 +10,7 @@ #import "EventRoomModel.h" #import "EventConfigModel.h" #import "WalletInfoModel.h" - +#import "HomeBannerInfoModel.h" NS_ASSUME_NONNULL_BEGIN @protocol CreateEventPresenterProcotol @@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)deleteEventSuccess:(NSInteger)eventId; - (void)deleteEventFailure:(NSString *)msg; -- (void)officialEventListSuccess:(EventRoomListModel *)listModel; +- (void)officialEventListSuccess:(NSArray *)listModel; - (void)officialEventListFailure:(NSString *)msg; diff --git a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m index e3ddbd83..e0f1f20d 100644 --- a/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m +++ b/YuMi/Modules/YMNewHome/Presenter/CreateEventPresenter.m @@ -30,10 +30,9 @@ } - (void)loadOfficialEvents { - // TODO: 补充官方活动数据 / 调整创建活动时,选择开始时间的 bug [Api homeBanner:[self createHttpCompletion:^(BaseModel * _Nonnull data) { if ([[self getView] respondsToSelector:@selector(officialEventListSuccess:)]) { - [[self getView] officialEventListSuccess:[EventConfigModel modelWithJSON:data.data]]; + [[self getView] officialEventListSuccess:[HomeBannerInfoModel modelsWithArray:data.data]]; } } fail:^(NSInteger code, NSString * _Nullable msg) { if ([[self getView] respondsToSelector:@selector(officialEventListFailure:)]) { diff --git a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m index 1651e64b..b1624e3e 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m +++ b/YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m @@ -12,6 +12,7 @@ @property (nonatomic, strong) NSDate *selectedDate; // StartTime 相关 @property (nonatomic, strong) NSArray *durationsOptions; +@property (nonatomic, strong) NSDate *defaultSelectedDate; @end @implementation CreateEventPickerContainerView { @@ -187,7 +188,6 @@ NSMutableArray *months = [NSMutableArray array]; NSMutableArray *days = [NSMutableArray array]; - NSMutableArray *hours = [NSMutableArray array]; NSDate *iter = start; while ([iter compare:end] != NSOrderedDescending) { @@ -195,21 +195,64 @@ 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]; + iter = [calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:iter options:0]; } self.monthArray = months; self.dayArray = days; - self.hourArray = hours; + + // 设置初始选中的月和日 + NSDateComponents *startComp = [calendar components:NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour fromDate:start]; + NSInteger initialMonthIndex = [months indexOfObject:[NSString stringWithFormat:@"%02ld", (long)startComp.month]]; + NSInteger initialDayIndex = [days indexOfObject:[NSString stringWithFormat:@"%02ld", (long)startComp.day]]; + + // 根据是否是明天来生成小时数组 + [self updateHourArrayForDate:start]; + + // 设置选中的初始值 + dispatch_async(dispatch_get_main_queue(), ^{ + [self.pickerView selectRow:initialMonthIndex inComponent:0 animated:NO]; + [self.pickerView selectRow:initialDayIndex inComponent:1 animated:NO]; + [self.pickerView selectRow:0 inComponent:2 animated:NO]; + }); + self.selectedDate = start; } +- (void)updateHourArrayForDate:(NSDate *)date { + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSDate *now = [NSDate date]; + + // 判断选中的日期是否是明天 + NSDateComponents *dateComp = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:date]; + NSDateComponents *tomorrowComp = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:now options:0]]; + + BOOL isTomorrow = dateComp.year == tomorrowComp.year && + dateComp.month == tomorrowComp.month && + dateComp.day == tomorrowComp.day; + + NSMutableArray *hours = [NSMutableArray array]; + + if (isTomorrow) { + // 如果是明天,从当前小时开始 + NSInteger currentHour = [[calendar components:NSCalendarUnitHour fromDate:now] hour]; + for (NSInteger i = currentHour; i <= 23; i++) { + [hours addObject:[NSString stringWithFormat:@"%02ld:00", (long)i]]; + } + } else { + // 如果不是明天,显示全部小时 + for (NSInteger i = 0; i <= 23; i++) { + [hours addObject:[NSString stringWithFormat:@"%02ld:00", (long)i]]; + } + } + + self.hourArray = hours; +} + - (void)showInView:(UIView *)parentView initialDate:(NSDate *)date config:(EventConfigModel *)config @@ -223,6 +266,28 @@ if (type == CreateEventPickerTypeStartTime) { [self buildStartTimeSourceWithInitialDate:date]; _titleLabel.text = YMLocalizedString(@"20.20.59_text_15"); + + // 保存默认选中的日期 + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSInteger monthIdx = [self.pickerView selectedRowInComponent:0]; + NSInteger dayIdx = [self.pickerView selectedRowInComponent:1]; + NSInteger hourIdx = [self.pickerView selectedRowInComponent:2]; + + NSDateComponents *nowComp = [calendar components:NSCalendarUnitYear fromDate:[NSDate date]]; + NSInteger year = nowComp.year; + NSInteger month = [self.monthArray[monthIdx] integerValue]; + NSInteger day = [self.dayArray[dayIdx] integerValue]; + NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue]; + + NSDateComponents *selComp = [[NSDateComponents alloc] init]; + selComp.year = year; + selComp.month = month; + selComp.day = day; + selComp.hour = hour; + selComp.minute = 0; + self.defaultSelectedDate = [calendar dateFromComponents:selComp]; + self.selectedDate = self.defaultSelectedDate; + } else if (type == CreateEventPickerTypeDuration) { [self buildDurationDataSource]; _titleLabel.text = YMLocalizedString(@"20.20.59_text_16"); @@ -270,19 +335,34 @@ case CreateEventPickerTypeStartTime: { NSInteger monthIdx = [pickerView selectedRowInComponent:0]; NSInteger dayIdx = [pickerView selectedRowInComponent:1]; - NSInteger hourIdx = [pickerView selectedRowInComponent:2]; + NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *nowComp = [calendar components:NSCalendarUnitYear fromDate:[NSDate date]]; NSInteger year = nowComp.year; NSInteger month = [self.monthArray[monthIdx] integerValue]; NSInteger day = [self.dayArray[dayIdx] integerValue]; - NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue]; + + // 创建选中的日期 NSDateComponents *selComp = [[NSDateComponents alloc] init]; selComp.year = year; selComp.month = month; selComp.day = day; - selComp.hour = hour; + selComp.hour = 0; selComp.minute = 0; + NSDate *selectedDate = [calendar dateFromComponents:selComp]; + + // 更新小时数组 + if (component < 2) { // 只有在月份或日期改变时才更新小时 + [self updateHourArrayForDate:selectedDate]; + [pickerView reloadComponent:2]; + [pickerView selectRow:0 inComponent:2 animated:YES]; + } + + // 获取当前选中的小时 + NSInteger hourIdx = [pickerView selectedRowInComponent:2]; + NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue]; + selComp.hour = hour; + self.selectedDate = [calendar dateFromComponents:selComp]; } break; @@ -346,19 +426,23 @@ case CreateEventPickerTypeStartTime: { NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; - resultString = [formatter stringFromDate:self.selectedDate]; + + // 使用默认选中日期或用户选择的日期 + NSDate *dateToUse = self.selectedDate ?: self.defaultSelectedDate; + resultString = [formatter stringFromDate:dateToUse]; + self.onConfirmDate(dateToUse, resultString, durationMinutes); } break; case CreateEventPickerTypeDuration: { NSInteger selectedRow = [self.pickerView selectedRowInComponent:0]; resultString = self.durationsOptions[selectedRow][@"title"]; durationMinutes = [self.durationsOptions[selectedRow][@"minutes"] integerValue]; + self.onConfirmDate(self.selectedDate, resultString, durationMinutes); } break; default: break; } - self.onConfirmDate(self.selectedDate, resultString, durationMinutes); } [self dismiss]; } diff --git a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m index 9fa5f143..a4b928da 100644 --- a/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m +++ b/YuMi/Modules/YMNewHome/View/CreateEventViewControllerV2.m @@ -180,7 +180,10 @@ static const CGFloat kSectionSpacing = 20.0; - (void)createEventSuccess { [XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"20.20.59_text_34")]; - [self.navigationController popViewControllerAnimated:NO]; + [self.navigationController popViewControllerAnimated:YES]; + if (self.createSuccess) { + self.createSuccess(); + } } - (void)createEventFailure:(NSString *)msg { diff --git a/YuMi/Modules/YMNewHome/View/EventCenterViewController.h b/YuMi/Modules/YMNewHome/View/EventCenterViewController.h index ceafa15c..a9a48520 100644 --- a/YuMi/Modules/YMNewHome/View/EventCenterViewController.h +++ b/YuMi/Modules/YMNewHome/View/EventCenterViewController.h @@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN @interface EventCenterViewController : MvpViewController -@property (nonatomic,copy) NSArray *officialEventModels; + @end diff --git a/YuMi/Modules/YMNewHome/View/EventCenterViewController.m b/YuMi/Modules/YMNewHome/View/EventCenterViewController.m index e8c7990a..844e423e 100644 --- a/YuMi/Modules/YMNewHome/View/EventCenterViewController.m +++ b/YuMi/Modules/YMNewHome/View/EventCenterViewController.m @@ -32,6 +32,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { @interface EventCenterViewController () + @property (nonatomic, strong) NSMutableArray *officialDatasource; @property (nonatomic, strong) NSMutableArray *eventSquareDatasource; @property (nonatomic, strong) NSMutableArray *myCreateEventDatasource; @@ -72,7 +73,8 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { [self setupBottomButton]; // 设置初始状态下 createButton 的显示状态 - self.createButton.hidden = (self.currentIndex == 0); + self.createButton.hidden = YES; + [self.presenter loadOfficialEvents]; } #pragma mark - Setup UI @@ -177,8 +179,8 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { } #pragma mark - Setup Data -- (void)setOfficialEventModels:(NSArray *)officialEventModels { - _officialDatasource = officialEventModels.mutableCopy; +- (void)setOfficialDatasource:(NSMutableArray *)officialDatasource { + _officialDatasource = officialDatasource; //#if DEBUG //#else // NSPredicate *predicate = [NSPredicate predicateWithFormat:@"activityShow == %@", @(1)]; @@ -187,7 +189,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { // 处理空数据状态 if (_officialDatasource.count == 0) { - self.officialTableView.mj_header.hidden = YES; + self.officialTableView.mj_header.hidden = NO; self.officialTableView.mj_footer.hidden = YES; } else { self.officialTableView.mj_header.hidden = NO; @@ -205,7 +207,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { - (void)switchToIndex:(NSInteger)index animated:(BOOL)animated { if (index == self.currentIndex) return; - + // 更新按钮状态 self.tabButtons[self.currentIndex].selected = NO; self.tabButtons[index].selected = YES; @@ -238,10 +240,25 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { 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]; + switch (index) { + case 0: + if (self.officialDatasource.count == 0) { + [self.presenter loadOfficialEvents]; + } + break; + case 1: + if (self.eventSquareDatasource.count == 0) { + [self.presenter loadEventSquare:self.eventSquareTableViewPage]; + } + break; + case 2: + if (self.myCreateEventDatasource.count == 0 && self.mySubEventDatasource.count == 0) { + [self.presenter loadMyEvents]; + } + break; + + default: + break; } } @@ -252,17 +269,9 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { @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; - } + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self.eventSquareTableView.mj_header beginRefreshing]; + [self.myEventTableView.mj_header beginRefreshing]; }); }]; } @@ -367,8 +376,11 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { @kWeakify(self); if (tableView == self.officialTableView) { if (self.officialDatasource.count == 0) { -// EventCenterEmptyCell *cell = - return [EventCenterEmptyCell cellFor:tableView customID:kOfficialEmptyID atIndexPath:indexPath]; + EventCenterEmptyCell *cell = [EventCenterEmptyCell cellFor:tableView customID:kOfficialEmptyID atIndexPath:indexPath]; + // 设置空状态的提示文本 +// [cell updateWithTitle:YMLocalizedString(@"20.20.59_text_37") +// subTitle:msg]; + return cell; } EventCenterOfficialCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterOfficialCell class])]; @@ -553,6 +565,17 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { #pragma mark - CreateEventPresenterProcotol +- (void)officialEventListSuccess:(NSArray *)listModels { + [self setOfficialDatasource:listModels.mutableCopy]; + [self.officialTableView.mj_header endRefreshing]; +} + +- (void)officialEventListFailure:(NSString *)msg { + [self.officialTableView.mj_header endRefreshing]; + // 清空数据源并刷新表格,触发显示空状态 + [self setOfficialDatasource:[NSMutableArray array]]; +} + - (void)eventSquareListSuccess:(NSArray *)list { if (self.eventSquareTableViewPage == 1) { [self.eventSquareDatasource removeAllObjects]; @@ -638,6 +661,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { } } [self.eventSquareTableView reloadData]; + [self.myEventTableView.mj_header beginRefreshing]; break; case 2: for (EventItemModel *m in self.mySubEventDatasource) { @@ -655,6 +679,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { } } [self.myEventTableView reloadData]; + [self.eventSquareTableView.mj_header beginRefreshing]; break; default: @@ -702,6 +727,12 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) { _officialTableView.contentInset = kOfficialTableViewContentInset(); _officialTableView.scrollIndicatorInsets = kOfficialTableViewContentInset(); [EventCenterEmptyCell registerTo:_officialTableView withCustomID:kOfficialEmptyID]; + + // 添加下拉刷新 + __weak typeof(self) weakSelf = self; + _officialTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ + [weakSelf.presenter loadOfficialEvents]; + }]; } return _officialTableView; } diff --git a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m index a3914616..2d5bf712 100644 --- a/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m +++ b/YuMi/Modules/YMNewHome/View/XPNewHomeViewController.m @@ -797,7 +797,6 @@ XPHomeRecommendOtherRoomViewDelegate> case 1: { EventCenterViewController *vc = [[EventCenterViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; - vc.officialEventModels = self.headView.bannerList; } break; default: diff --git a/YuMi/main.m b/YuMi/main.m index ea73a6b7..d405dd0c 100644 --- a/YuMi/main.m +++ b/YuMi/main.m @@ -17,3 +17,4 @@ int main(int argc, char * argv[]) { return UIApplicationMain(argc, argv, nil, appDelegateClassName); } +