diff --git a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm index 19fc5484b7..2835e98aeb 100644 --- a/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm +++ b/iphone/Maps/Classes/Widgets/MWMMapDownloadDialog.mm @@ -132,10 +132,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatDownload, - kStatIsAuto : kStatYes, - kStatFrom : kStatMap, - kStatScenario : kStatDownload + kStatAction: kStatDownload, + kStatIsAuto: kStatYes, + kStatFrom: kStatMap, + kStatScenario: kStatDownload }]; m_autoDownloadCountryId = m_countryId; [MWMStorage downloadNode:m_countryId @@ -149,20 +149,21 @@ using namespace storage; [self showDownloadRequest]; } break; - } - case NodeStatus::Downloading: - if (nodeAttrs.m_downloadingProgress.second != 0) - [self showDownloading:static_cast(nodeAttrs.m_downloadingProgress.first) / - nodeAttrs.m_downloadingProgress.second]; - break; - case NodeStatus::InQueue: [self showInQueue]; break; - case NodeStatus::Undefined: - case NodeStatus::Error: - if (p.IsAutoRetryDownloadFailed()) - [self showError:nodeAttrs.m_error]; - break; - case NodeStatus::OnDisk: - case NodeStatus::OnDiskOutOfDate: [self removeFromSuperview]; break; + } + case NodeStatus::Downloading: + if (nodeAttrs.m_downloadingProgress.second != 0) + [self showDownloading:static_cast(nodeAttrs.m_downloadingProgress.first) / + nodeAttrs.m_downloadingProgress.second]; + break; + case NodeStatus::Applying: + case NodeStatus::InQueue: [self showInQueue]; break; + case NodeStatus::Undefined: + case NodeStatus::Error: + if (p.IsAutoRetryDownloadFailed()) + [self showError:nodeAttrs.m_error]; + break; + case NodeStatus::OnDisk: + case NodeStatus::OnDiskOutOfDate: [self removeFromSuperview]; break; } } else @@ -208,10 +209,10 @@ using namespace storage; auto const retryBlock = ^{ [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatRetry, - kStatIsAuto : kStatNo, - kStatFrom : kStatMap, - kStatScenario : kStatDownload + kStatAction: kStatRetry, + kStatIsAuto: kStatNo, + kStatFrom: kStatMap, + kStatScenario: kStatDownload }]; [self showInQueue]; [MWMStorage retryDownloadNode:self->m_countryId]; @@ -297,10 +298,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatRetry, - kStatIsAuto : kStatNo, - kStatFrom : kStatMap, - kStatScenario : kStatDownload + kStatAction: kStatRetry, + kStatIsAuto: kStatNo, + kStatFrom: kStatMap, + kStatScenario: kStatDownload }]; [self showInQueue]; [MWMStorage retryDownloadNode:m_countryId]; @@ -328,10 +329,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatDownload, - kStatIsAuto : kStatNo, - kStatFrom : kStatMap, - kStatScenario : kStatDownload + kStatAction: kStatDownload, + kStatIsAuto: kStatNo, + kStatFrom: kStatMap, + kStatScenario: kStatDownload }]; [MWMStorage downloadNode:m_countryId onSuccess:^{ diff --git a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.mm b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.mm index a54815a783..4da3e2a637 100644 --- a/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.mm +++ b/iphone/Maps/UI/Downloader/Cells/MWMMapDownloaderTableViewCell.mm @@ -77,10 +77,10 @@ size = isModeDownloaded ? nodeAttrs.m_downloadingMwmSize : nodeAttrs.m_mwmSize - nodeAttrs.m_downloadingMwmSize; break; + case storage::NodeStatus::Applying: case storage::NodeStatus::InQueue: case storage::NodeStatus::Partly: - size = isModeDownloaded ? nodeAttrs.m_localMwmSize - : nodeAttrs.m_mwmSize; + size = isModeDownloaded ? nodeAttrs.m_localMwmSize : nodeAttrs.m_mwmSize; break; case storage::NodeStatus::OnDisk: size = isModeDownloaded ? nodeAttrs.m_mwmSize : 0; break; } @@ -102,7 +102,8 @@ MWMCircularProgressStateVec const affectedStates = {MWMCircularProgressStateNormal, MWMCircularProgressStateSelected}; NSString * imageName = [self isKindOfClass:[MWMMapDownloaderLargeCountryTableViewCell class]] - ? @"ic_folder" : @"ic_download"; + ? @"ic_folder" + : @"ic_download"; [progress setImageName:imageName forStates:affectedStates]; [progress setColoring:coloring forStates:affectedStates]; progress.state = MWMCircularProgressStateNormal; @@ -114,6 +115,7 @@ progress.progress = kMaxProgress * static_cast(prg.first) / prg.second; break; } + case NodeStatus::Applying: case NodeStatus::InQueue: progress.state = MWMCircularProgressStateSpinner; break; case NodeStatus::Undefined: case NodeStatus::Error: progress.state = MWMCircularProgressStateFailed; break; @@ -169,6 +171,7 @@ case NodeStatus::Error: [delegate retryDownloadNode:m_countryId]; break; case NodeStatus::OnDiskOutOfDate: [delegate updateNode:m_countryId]; break; case NodeStatus::Downloading: + case NodeStatus::Applying: case NodeStatus::InQueue: [delegate cancelNode:m_countryId]; break; case NodeStatus::OnDisk: break; } diff --git a/iphone/Maps/UI/Downloader/MWMBaseMapDownloaderViewController.mm b/iphone/Maps/UI/Downloader/MWMBaseMapDownloaderViewController.mm index ece38a2400..fc723f54de 100644 --- a/iphone/Maps/UI/Downloader/MWMBaseMapDownloaderViewController.mm +++ b/iphone/Maps/UI/Downloader/MWMBaseMapDownloaderViewController.mm @@ -23,16 +23,14 @@ namespace { - -typedef NS_OPTIONS(NSUInteger, ActionButtons) -{ - NoAction = 0, - ShowOnMapAction = 1 << 1, - DownloadAction = 1 << 2, - UpdateAction = 1 << 3, +typedef NS_OPTIONS(NSUInteger, ActionButtons) { + NoAction = 0, + ShowOnMapAction = 1 << 1, + DownloadAction = 1 << 2, + UpdateAction = 1 << 3, CancelDownloadAction = 1 << 4, - RetryDownloadAction = 1 << 5, - DeleteAction = 1 << 6 + RetryDownloadAction = 1 << 5, + DeleteAction = 1 << 6 }; NSString * const kAllMapsLabelFormat = @"%@ (%@)"; @@ -326,16 +324,15 @@ using namespace storage; self.allMapsView.hidden = hide; [self.view layoutIfNeeded]; self.allMapsViewBottomOffset.constant = hide ? self.allMapsView.height : 0.0; - [UIView animateWithDuration:kDefaultAnimationDuration animations:^ - { - self.allMapsView.alpha = hide ? 0.0 : 1.0; - [self.view layoutIfNeeded]; - } - completion:^(BOOL finished) - { - if (hide) - self.allMapsView.hidden = hide; - }]; + [UIView animateWithDuration:kDefaultAnimationDuration + animations:^{ + self.allMapsView.alpha = hide ? 0.0 : 1.0; + [self.view layoutIfNeeded]; + } + completion:^(BOOL finished) { + if (hide) + self.allMapsView.hidden = hide; + }]; } - (IBAction)allMapsAction @@ -346,10 +343,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatUpdate, - kStatIsAuto : kStatNo, - kStatFrom : kStatDownloader, - kStatScenario : kStatUpdateAll + kStatAction: kStatUpdate, + kStatIsAuto: kStatNo, + kStatFrom: kStatDownloader, + kStatScenario: kStatUpdateAll }]; [MWMStorage updateNode:parentCountryId]; } @@ -489,8 +486,7 @@ using namespace storage; break; case NodeStatus::Downloading: case NodeStatus::InQueue: - buttons |= CancelDownloadAction; - break; + case NodeStatus::Applying: buttons |= CancelDownloadAction; break; case NodeStatus::OnDiskOutOfDate: buttons |= ShowOnMapAction; buttons |= UpdateAction; @@ -632,10 +628,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatDownload, - kStatIsAuto : kStatNo, - kStatFrom : kStatDownloader, - kStatScenario : kStatDownload + kStatAction: kStatDownload, + kStatIsAuto: kStatNo, + kStatFrom: kStatDownloader, + kStatScenario: kStatDownload }]; self.skipCountryEventProcessing = YES; [MWMStorage downloadNode:countryId onSuccess:nil]; @@ -647,10 +643,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatRetry, - kStatIsAuto : kStatNo, - kStatFrom : kStatDownloader, - kStatScenario : kStatDownload + kStatAction: kStatRetry, + kStatIsAuto: kStatNo, + kStatFrom: kStatDownloader, + kStatScenario: kStatDownload }]; self.skipCountryEventProcessing = YES; [MWMStorage retryDownloadNode:countryId]; @@ -662,10 +658,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatUpdate, - kStatIsAuto : kStatNo, - kStatFrom : kStatDownloader, - kStatScenario : kStatUpdate + kStatAction: kStatUpdate, + kStatIsAuto: kStatNo, + kStatFrom: kStatDownloader, + kStatScenario: kStatUpdate }]; self.skipCountryEventProcessing = YES; [MWMStorage updateNode:countryId]; @@ -677,10 +673,10 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatDelete, - kStatIsAuto : kStatNo, - kStatFrom : kStatDownloader, - kStatScenario : kStatDelete + kStatAction: kStatDelete, + kStatIsAuto: kStatNo, + kStatFrom: kStatDownloader, + kStatScenario: kStatDelete }]; self.skipCountryEventProcessing = YES; [MWMStorage deleteNode:countryId]; @@ -701,8 +697,8 @@ using namespace storage; { [Statistics logEvent:kStatDownloaderMapAction withParameters:@{ - kStatAction : kStatExplore, - kStatFrom : kStatDownloader, + kStatAction: kStatExplore, + kStatFrom: kStatDownloader, }]; [self.navigationController popToRootViewControllerAnimated:YES]; [MWMStorage showNode:countryId]; diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm index f44defa293..c28de6b9f4 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm @@ -57,7 +57,7 @@ void logSponsoredEvent(MWMPlacePageData * data, NSString * eventName) } [Statistics logEvent:eventName withParameters:stat atLocation:[MWMLocationManager lastLocation]]; -} + } } // namespace @interface MWMPlacePageManager () const kMetaInfoCells = { {MetainfoRows::Internet, [MWMPlacePageInfoCell class]}}; } // namespace -@interface MWMPlacePageLayout () +@interface MWMPlacePageLayout () @property(weak, nonatomic) MWMPlacePageData * data; @@ -231,6 +231,7 @@ map const kMetaInfoCells = { break; } case NodeStatus::InQueue: + case NodeStatus::Applying: { self.actionBar.isAreaNotDownloaded = YES; self.actionBar.downloadingState = MWMCircularProgressStateSpinner; @@ -312,253 +313,279 @@ map const kMetaInfoCells = { case Sections::Preview: { return [self.previewLayoutHelper cellForRowAtIndexPath:indexPath withData:data]; - } - case Sections::Bookmark: - { - Class cls = [MWMBookmarkCell class]; - auto c = static_cast( - [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configureWithText:data.bookmarkDescription - updateCellDelegate:self - editBookmarkDelegate:delegate - isHTML:data.isHTMLDescription]; - return c; - } - case Sections::Metainfo: - { - auto const row = data.metainfoRows[indexPath.row]; - switch (row) - { - case MetainfoRows::OpeningHours: - case MetainfoRows::ExtendedOpeningHours: - { - auto const & metaInfo = data.metainfoRows; - NSAssert(std::find(metaInfo.cbegin(), metaInfo.cend(), MetainfoRows::OpeningHours) != - metaInfo.cend(), - @"OpeningHours is not available"); - return [self.openingHoursLayoutHelper cellForRowAtIndexPath:indexPath]; } - case MetainfoRows::Phone: - case MetainfoRows::Address: - case MetainfoRows::Website: - case MetainfoRows::Email: - case MetainfoRows::Cuisine: - case MetainfoRows::Operator: - case MetainfoRows::Internet: - case MetainfoRows::Coordinate: + case Sections::Bookmark: { - Class cls = kMetaInfoCells.at(row); - auto c = static_cast( + Class cls = [MWMBookmarkCell class]; + auto c = static_cast( [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithRow:row data:data]; + [c configureWithText:data.bookmarkDescription + updateCellDelegate:self + editBookmarkDelegate:delegate + isHTML:data.isHTMLDescription]; return c; } - case MetainfoRows::LocalAdsCustomer: - case MetainfoRows::LocalAdsCandidate: + case Sections::Metainfo: { - Class cls = [MWMPlacePageButtonCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls - indexPath:indexPath]); - [c configWithTitle:[data stringForRow:row] action:^{ [delegate openLocalAdsURL]; } isInsetButton:NO]; - return c; - } - } - } - case Sections::Ad: - { - Class cls = [MWMPlacePageTaxiCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - auto const & taxiProviders = [data taxiProviders]; - NSAssert(!taxiProviders.empty(), @"TaxiProviders can not be empty"); - auto const & provider = taxiProviders.front(); - auto type = MWMPlacePageTaxiProviderTaxi; - switch (provider) - { - case taxi::Provider::Uber: type = MWMPlacePageTaxiProviderUber; break; - case taxi::Provider::Yandex: type = MWMPlacePageTaxiProviderYandex; break; - case taxi::Provider::Maxim: type = MWMPlacePageTaxiProviderMaxim; break; - } - [c configWithType:type delegate:delegate]; - self.taxiCell = c; - return c; - } - case Sections::Buttons: - { - Class cls = [MWMPlacePageButtonCell class]; - auto c = static_cast( - [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - auto const row = data.buttonsRows[indexPath.row]; - - [c configForRow:row withAction:^{ + auto const row = data.metainfoRows[indexPath.row]; switch (row) { - case ButtonsRows::AddPlace: [delegate addPlace]; break; - case ButtonsRows::EditPlace: [delegate editPlace]; break; - case ButtonsRows::AddBusiness: [delegate addBusiness]; break; - case ButtonsRows::HotelDescription: [delegate book:YES]; break; - case ButtonsRows::Other: NSAssert(false, @"Incorrect row"); + case MetainfoRows::OpeningHours: + case MetainfoRows::ExtendedOpeningHours: + { + auto const & metaInfo = data.metainfoRows; + NSAssert(std::find(metaInfo.cbegin(), metaInfo.cend(), MetainfoRows::OpeningHours) != + metaInfo.cend(), + @"OpeningHours is not available"); + return [self.openingHoursLayoutHelper cellForRowAtIndexPath:indexPath]; } - }]; - // Hotel description button is always enabled. - c.enabled = self.buttonsSectionEnabled || (row == ButtonsRows::HotelDescription); - return c; - } - case Sections::SpecialProjects: - { - switch (data.specialProjectRows[indexPath.row]) + case MetainfoRows::Phone: + case MetainfoRows::Address: + case MetainfoRows::Website: + case MetainfoRows::Email: + case MetainfoRows::Cuisine: + case MetainfoRows::Operator: + case MetainfoRows::Internet: + case MetainfoRows::Coordinate: + { + Class cls = kMetaInfoCells.at(row); + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithRow:row data:data]; + return c; + } + case MetainfoRows::LocalAdsCustomer: + case MetainfoRows::LocalAdsCandidate: + { + Class cls = [MWMPlacePageButtonCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithTitle:[data stringForRow:row] + action:^{ + [delegate openLocalAdsURL]; + } + isInsetButton:NO]; + return c; + } + } + } + case Sections::Ad: { - case SpecialProject::Viator: - { - Class cls = [MWMPPViatorCarouselCell class]; - auto c = static_cast( + Class cls = [MWMPlacePageTaxiCell class]; + auto c = static_cast( [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWith:data.viatorItems delegate:delegate]; - self.viatorCell = c; + auto const & taxiProviders = [data taxiProviders]; + NSAssert(!taxiProviders.empty(), @"TaxiProviders can not be empty"); + auto const & provider = taxiProviders.front(); + auto type = MWMPlacePageTaxiProviderTaxi; + switch (provider) + { + case taxi::Provider::Uber: type = MWMPlacePageTaxiProviderUber; break; + case taxi::Provider::Yandex: type = MWMPlacePageTaxiProviderYandex; break; + case taxi::Provider::Maxim: type = MWMPlacePageTaxiProviderMaxim; break; + } + [c configWithType:type delegate:delegate]; + self.taxiCell = c; return c; } - } - } - case Sections::HotelPhotos: - { - Class cls = [MWMPPHotelCarouselCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWith:data.photos delegate:delegate]; - return c; - } - case Sections::HotelFacilities: - { - auto const row = data.hotelFacilitiesRows[indexPath.row]; - switch (row) - { - case HotelFacilitiesRow::Regular: - { - Class cls = [MWMPPFacilityCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWith:@(data.facilities[indexPath.row].m_name.c_str())]; - return c; - } - case HotelFacilitiesRow::ShowMore: - Class cls = [MWMPlacePageButtonCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithTitle:L(@"booking_show_more") action:^{ [delegate showAllFacilities]; } isInsetButton:NO]; - return c; - } - } - case Sections::HotelReviews: - { - auto const row = data.hotelReviewsRows[indexPath.row]; - switch (row) - { - case HotelReviewsRow::Header: - { - Class cls = [MWMPPReviewHeaderCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithRating:data.bookingRating numberOfReviews:data.numberOfHotelReviews]; - return c; - } - case HotelReviewsRow::Regular: - { - Class cls = [MWMPPReviewCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithReview:data.hotelReviews[indexPath.row - 1]]; - return c; - } - case HotelReviewsRow::ShowMore: - { - Class cls = [MWMPlacePageButtonCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - - [c configWithTitle:L(@"reviews_on_bookingcom") action:^{ [delegate showAllReviews]; } isInsetButton:NO]; - return c; - } - } - } - case Sections::HotelDescription: - { - auto const row = data.descriptionRows[indexPath.row]; - switch (row) - { - case HotelDescriptionRow::Regular: - { - Class cls = [MWMPPHotelDescriptionCell class]; - auto c = static_cast( - [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWith:data.hotelDescription delegate:self]; - return c; - } - case HotelDescriptionRow::ShowMore: - { - Class cls = [MWMPlacePageButtonCell class]; - auto c = static_cast([tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithTitle:L(@"more_on_bookingcom") action:^{ [delegate book:YES];; } isInsetButton:NO]; - return c; - } - } - } - case Sections::UGCRating: - { - Class cls = [MWMUGCSummaryRatingCell class]; - auto c = static_cast( - [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - auto ugc = data.ugc; - [c configWithReviewsCount:[ugc totalReviewsCount] - summaryRating:[ugc summaryRating] - ratings:[ugc ratings]]; - return c; - } - case Sections::UGCAddReview: - { - Class cls = [MWMUGCAddReviewCell class]; - auto c = static_cast( - [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - c.onRateTap = ^(MWMRatingSummaryViewValueType value) { - [delegate showUGCAddReview:value fromPreview:NO]; - }; - return c; - } - case Sections::UGCReviews: - { - auto ugc = data.ugc; - auto const & reviewRows = ugc.reviewRows; - using namespace ugc::view_model; - auto onUpdate = ^{ - [tableView refresh]; - }; - - switch (reviewRows[indexPath.row]) - { - case ReviewRow::YourReview: - { - Class cls = [MWMUGCYourReviewCell class]; - auto c = static_cast( - [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithYourReview:static_cast([ugc reviewWithIndex:indexPath.row]) - onUpdate:onUpdate]; - return c; - } - case ReviewRow::Review: - { - Class cls = [MWMUGCReviewCell class]; - auto c = static_cast( - [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithReview:static_cast([ugc reviewWithIndex:indexPath.row]) - onUpdate:onUpdate]; - return c; - } - case ReviewRow::MoreReviews: + case Sections::Buttons: { Class cls = [MWMPlacePageButtonCell class]; auto c = static_cast( [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); - [c configWithTitle:L(@"placepage_more_reviews_button") - action:^{ - [delegate openReviews:ugc]; - } - isInsetButton:NO]; + auto const row = data.buttonsRows[indexPath.row]; + + [c configForRow:row + withAction:^{ + switch (row) + { + case ButtonsRows::AddPlace: [delegate addPlace]; break; + case ButtonsRows::EditPlace: [delegate editPlace]; break; + case ButtonsRows::AddBusiness: [delegate addBusiness]; break; + case ButtonsRows::HotelDescription: [delegate book:YES]; break; + case ButtonsRows::Other: NSAssert(false, @"Incorrect row"); + } + }]; + // Hotel description button is always enabled. + c.enabled = self.buttonsSectionEnabled || (row == ButtonsRows::HotelDescription); return c; } + case Sections::SpecialProjects: + { + switch (data.specialProjectRows[indexPath.row]) + { + case SpecialProject::Viator: + { + Class cls = [MWMPPViatorCarouselCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWith:data.viatorItems delegate:delegate]; + self.viatorCell = c; + return c; + } + } + } + case Sections::HotelPhotos: + { + Class cls = [MWMPPHotelCarouselCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWith:data.photos delegate:delegate]; + return c; + } + case Sections::HotelFacilities: + { + auto const row = data.hotelFacilitiesRows[indexPath.row]; + switch (row) + { + case HotelFacilitiesRow::Regular: + { + Class cls = [MWMPPFacilityCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWith:@(data.facilities[indexPath.row].m_name.c_str())]; + return c; + } + case HotelFacilitiesRow::ShowMore: + Class cls = [MWMPlacePageButtonCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithTitle:L(@"booking_show_more") + action:^{ + [delegate showAllFacilities]; + } + isInsetButton:NO]; + return c; + } + } + case Sections::HotelReviews: + { + auto const row = data.hotelReviewsRows[indexPath.row]; + switch (row) + { + case HotelReviewsRow::Header: + { + Class cls = [MWMPPReviewHeaderCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithRating:data.bookingRating numberOfReviews:data.numberOfHotelReviews]; + return c; + } + case HotelReviewsRow::Regular: + { + Class cls = [MWMPPReviewCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithReview:data.hotelReviews[indexPath.row - 1]]; + return c; + } + case HotelReviewsRow::ShowMore: + { + Class cls = [MWMPlacePageButtonCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + + [c configWithTitle:L(@"reviews_on_bookingcom") + action:^{ + [delegate showAllReviews]; + } + isInsetButton:NO]; + return c; + } + } + } + case Sections::HotelDescription: + { + auto const row = data.descriptionRows[indexPath.row]; + switch (row) + { + case HotelDescriptionRow::Regular: + { + Class cls = [MWMPPHotelDescriptionCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWith:data.hotelDescription delegate:self]; + return c; + } + case HotelDescriptionRow::ShowMore: + { + Class cls = [MWMPlacePageButtonCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithTitle:L(@"more_on_bookingcom") + action:^{ + [delegate book:YES]; + ; + } + isInsetButton:NO]; + return c; + } + } + } + case Sections::UGCRating: + { + Class cls = [MWMUGCSummaryRatingCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + auto ugc = data.ugc; + [c configWithReviewsCount:[ugc totalReviewsCount] + summaryRating:[ugc summaryRating] + ratings:[ugc ratings]]; + return c; + } + case Sections::UGCAddReview: + { + Class cls = [MWMUGCAddReviewCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + c.onRateTap = ^(MWMRatingSummaryViewValueType value) { + [delegate showUGCAddReview:value fromPreview:NO]; + }; + return c; + } + case Sections::UGCReviews: + { + auto ugc = data.ugc; + auto const & reviewRows = ugc.reviewRows; + using namespace ugc::view_model; + auto onUpdate = ^{ + [tableView refresh]; + }; + + switch (reviewRows[indexPath.row]) + { + case ReviewRow::YourReview: + { + Class cls = [MWMUGCYourReviewCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithYourReview:static_cast([ugc reviewWithIndex:indexPath.row]) + onUpdate:onUpdate]; + return c; + } + case ReviewRow::Review: + { + Class cls = [MWMUGCReviewCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithReview:static_cast([ugc reviewWithIndex:indexPath.row]) + onUpdate:onUpdate]; + return c; + } + case ReviewRow::MoreReviews: + { + Class cls = [MWMPlacePageButtonCell class]; + auto c = static_cast( + [tableView dequeueReusableCellWithCellClass:cls indexPath:indexPath]); + [c configWithTitle:L(@"placepage_more_reviews_button") + action:^{ + [delegate openReviews:ugc]; + } + isInsetButton:NO]; + return c; + } + } } - } } } @@ -604,7 +631,7 @@ map const kMetaInfoCells = { checkCell(self.viatorCell, ^{ self.viatorCell = nil; - + auto viatorItems = data.viatorItems; if (viatorItems.count == 0) { @@ -693,7 +720,7 @@ map const kMetaInfoCells = { data.sectionsAreReadyCallback = ^(NSRange const & range, MWMPlacePageData * d, BOOL isSection) { if (![self.data isEqual:d]) return; - + auto tv = self.placePageView.tableView; if (isSection) { [tv insertSections:[NSIndexSet indexSetWithIndexesInRange:range] @@ -704,7 +731,7 @@ map const kMetaInfoCells = { NSMutableArray * indexPaths = [@[] mutableCopy]; for (auto i = 1; i < range.length + 1; i++) [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:range.location]]; - + [tv insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic]; } };