diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.h index b5914fea2c..97184ce75c 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.h @@ -29,6 +29,7 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, readonly, nullable) NSString *title; @property(nonatomic, readonly, nullable) NSString *subtitle; +@property(nonatomic, readonly, nullable) NSString *coordinates; @property(nonatomic, readonly, nullable) NSString *address; @property(nonatomic, readonly, nullable) NSString *pricing; @property(nonatomic, readonly, nullable) NSNumber *rawPricing; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.mm index 943e7c06a1..06be0f691b 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.mm @@ -66,6 +66,7 @@ static PlacePageDataHotelType convertHotelType(std::optional (Void) in + s.backgroundColor = colors.white + s.cornerRadius = 10 + s.clip = true + } + + theme.add(styleName: "PPNavigationBarView") { (s) -> (Void) in + s.backgroundColor = colors.white + s.shadowColor = UIColor.black + s.shadowOffset = CGSize(width: 0, height: -1) + s.shadowOpacity = 1 + s.shadowOpacity = 0.6 + s.clip = false + } + + theme.add(styleName: "PPBackgroundView") { (s) -> (Void) in + s.backgroundColor = colors.white + s.cornerRadius = 10 + s.shadowColor = UIColor.black + s.shadowOffset = CGSize(width: 0, height: 1) + s.shadowOpacity = 0.6 + s.shadowRadius = 2 + } + + theme.add(styleName: "PPCloseButton") { (s) -> (Void) in + s.tintColor = colors.blackDividers + } } } diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Contents.json b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Contents.json new file mode 100644 index 0000000000..4d58903fb9 --- /dev/null +++ b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Vector.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Vector@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Vector@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector.png b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector.png new file mode 100644 index 0000000000..b7f8a1fcaa Binary files /dev/null and b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector.png differ diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector@2x.png b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector@2x.png new file mode 100644 index 0000000000..ef070358af Binary files /dev/null and b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector@2x.png differ diff --git a/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector@3x.png b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector@3x.png new file mode 100644 index 0000000000..6d8cd89949 Binary files /dev/null and b/iphone/Maps/Images.xcassets/Place Page/ic_clear_24.imageset/Vector@3x.png differ diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 71054e573a..b53d72b926 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -644,6 +644,10 @@ 99B6A74E2362F5CD002C94CB /* PromoCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B6A74D2362F5CD002C94CB /* PromoCoordinator.swift */; }; 99B6A77F23684573002C94CB /* PromoDiscoveryBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B6A77E23684573002C94CB /* PromoDiscoveryBuilder.swift */; }; 99C6532223F2F506004322F3 /* IPlacePageLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99C6532123F2F506004322F3 /* IPlacePageLayout.swift */; }; + 99C964292428C0F700E41723 /* PlacePageHeaderPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99C964232428C0F700E41723 /* PlacePageHeaderPresenter.swift */; }; + 99C9642B2428C0F700E41723 /* PlacePageHeaderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99C964252428C0F700E41723 /* PlacePageHeaderViewController.swift */; }; + 99C9642C2428C0F700E41723 /* PlacePageHeaderBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99C964262428C0F700E41723 /* PlacePageHeaderBuilder.swift */; }; + 99C964302428C27A00E41723 /* PlacePageHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99C9642F2428C27A00E41723 /* PlacePageHeaderView.swift */; }; 99CB34962369C281001D28AD /* FirstLaunchBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34952369C281001D28AD /* FirstLaunchBuilder.swift */; }; 99CB34982369C291001D28AD /* FirstLaunchPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34972369C291001D28AD /* FirstLaunchPresenter.swift */; }; 99CB34B02369DF2E001D28AD /* WhatsNewPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99CB34AB2369DF2E001D28AD /* WhatsNewPresenter.swift */; }; @@ -1707,6 +1711,10 @@ 99B6A74D2362F5CD002C94CB /* PromoCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoCoordinator.swift; sourceTree = ""; }; 99B6A77E23684573002C94CB /* PromoDiscoveryBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PromoDiscoveryBuilder.swift; sourceTree = ""; }; 99C6532123F2F506004322F3 /* IPlacePageLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPlacePageLayout.swift; sourceTree = ""; }; + 99C964232428C0F700E41723 /* PlacePageHeaderPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageHeaderPresenter.swift; sourceTree = ""; }; + 99C964252428C0F700E41723 /* PlacePageHeaderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageHeaderViewController.swift; sourceTree = ""; }; + 99C964262428C0F700E41723 /* PlacePageHeaderBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageHeaderBuilder.swift; sourceTree = ""; }; + 99C9642F2428C27A00E41723 /* PlacePageHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageHeaderView.swift; sourceTree = ""; }; 99CB34952369C281001D28AD /* FirstLaunchBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstLaunchBuilder.swift; sourceTree = ""; }; 99CB34972369C291001D28AD /* FirstLaunchPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FirstLaunchPresenter.swift; sourceTree = ""; }; 99CB34AB2369DF2E001D28AD /* WhatsNewPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WhatsNewPresenter.swift; sourceTree = ""; }; @@ -3804,6 +3812,7 @@ 99A906D823F6F7030005872B /* WikiDescriptionViewController.swift */, 478F6FA523C4521F00054A53 /* MoreReviewsViewController.swift */, 4726254821C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift */, + 99C964222428C0D500E41723 /* PlacePageHeader */, 993DF0C223F6BD0600AC231A /* ElevationDetails */, 99DEF9D523E420D2006BFD21 /* ElevationProfile */, ); @@ -3820,6 +3829,17 @@ path = Layouts; sourceTree = ""; }; + 99C964222428C0D500E41723 /* PlacePageHeader */ = { + isa = PBXGroup; + children = ( + 99C964232428C0F700E41723 /* PlacePageHeaderPresenter.swift */, + 99C964252428C0F700E41723 /* PlacePageHeaderViewController.swift */, + 99C964262428C0F700E41723 /* PlacePageHeaderBuilder.swift */, + 99C9642F2428C27A00E41723 /* PlacePageHeaderView.swift */, + ); + path = PlacePageHeader; + sourceTree = ""; + }; 99CB34AA2369DF23001D28AD /* WhatsNew */ = { isa = PBXGroup; children = ( @@ -5257,6 +5277,7 @@ F6E407D01FC45EF5001F7821 /* MWMDiscoveryController.mm in Sources */, F6E2FDEC1E097BA00083EBEC /* MWMOpeningHoursAddClosedTableViewCell.mm in Sources */, 34BBD64C1F826DB10070CA50 /* AuthorizationViewController.swift in Sources */, + 99C964292428C0F700E41723 /* PlacePageHeaderPresenter.swift in Sources */, F6E2FE101E097BA00083EBEC /* MWMOpeningHoursTableViewCell.mm in Sources */, 47C8789D22DF662700A772DA /* SubscriptionExpiredViewController.swift in Sources */, 6741A9B01BF340DE002C974C /* MapsAppDelegate.mm in Sources */, @@ -5343,6 +5364,7 @@ 47E3C7292111E614008B3B27 /* FadeInAnimatedTransitioning.swift in Sources */, 34AB667D1FC5AA330078E451 /* MWMRoutePreview.mm in Sources */, 993DF11B23F6BDB100AC231A /* UIViewRenderer.swift in Sources */, + 99C964302428C27A00E41723 /* PlacePageHeaderView.swift in Sources */, B33D21AC20DA515800BAD749 /* MWMCategoryInfoCell.mm in Sources */, 473CBF9B2164DD470059BD54 /* SettingsTableViewSelectableProgressCell.swift in Sources */, 47E3C72D2111E6A2008B3B27 /* FadeTransitioning.swift in Sources */, @@ -5390,6 +5412,8 @@ F6EBB26F1FD7E33300B69B6A /* DiscoveryNoResultsCell.swift in Sources */, 47D0026721999DA900F651A2 /* PendingTransactionsHandler.swift in Sources */, 993DF10A23F6BDB100AC231A /* UISwitchRenderer.swift in Sources */, + 99C9642C2428C0F700E41723 /* PlacePageHeaderBuilder.swift in Sources */, + 99C9642B2428C0F700E41723 /* PlacePageHeaderViewController.swift in Sources */, F6FE3C391CC50FFD00A73196 /* MWMPlaceDoesntExistAlert.m in Sources */, F6E2FDFE1E097BA00083EBEC /* MWMOpeningHoursClosedSpanTableViewCell.mm in Sources */, F6E2FEDC1E097BA00083EBEC /* MWMSearchManager+Filter.mm in Sources */, diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderBuilder.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderBuilder.swift new file mode 100644 index 0000000000..cdd6f2ea76 --- /dev/null +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderBuilder.swift @@ -0,0 +1,16 @@ +class PlacePageHeaderBuilder { + static func build(data: PlacePagePreviewData, + delegate: PlacePageHeaderViewControllerDelegate?, + headerType: PlacePageHeaderPresenter.HeaderType) -> PlacePageHeaderViewController { + let storyboard = UIStoryboard.instance(.placePage) + let viewController = storyboard.instantiateViewController(ofType: PlacePageHeaderViewController.self); + let presenter = PlacePageHeaderPresenter(view: viewController, + placePagePreviewData: data, + delegate: delegate, + headerType: headerType) + + viewController.presenter = presenter + + return viewController + } +} diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderPresenter.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderPresenter.swift new file mode 100644 index 0000000000..fdd903d3e4 --- /dev/null +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderPresenter.swift @@ -0,0 +1,54 @@ +protocol PlacePageHeaderPresenterProtocol: class { + func configure() + func onClosePress() + func onExpandPress() +} + +protocol PlacePageHeaderViewControllerDelegate: AnyObject { + func previewDidPressClose() + func previewDidPressExpand() +} + +class PlacePageHeaderPresenter { + enum HeaderType { + case flexible + case fixed + } + + private weak var view: PlacePageHeaderViewProtocol? + private let placePagePreviewData: PlacePagePreviewData + private weak var delegate: PlacePageHeaderViewControllerDelegate? + private let headerType: HeaderType + + init(view: PlacePageHeaderViewProtocol, + placePagePreviewData: PlacePagePreviewData, + delegate: PlacePageHeaderViewControllerDelegate?, + headerType: HeaderType) { + self.view = view + self.delegate = delegate + self.placePagePreviewData = placePagePreviewData + self.headerType = headerType + } +} + +extension PlacePageHeaderPresenter: PlacePageHeaderPresenterProtocol { + func configure() { + view?.setTitle(placePagePreviewData.title ?? "") + switch headerType { + case .flexible: + view?.setViewStyle("PPHeaderView") + view?.setExpandButtonEnabled(true) + case .fixed: + view?.setViewStyle("PPNavigationBarView") + view?.setExpandButtonEnabled(false) + } + } + + func onClosePress() { + delegate?.previewDidPressClose() + } + + func onExpandPress() { + delegate?.previewDidPressExpand() + } +} diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderView.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderView.swift new file mode 100644 index 0000000000..7336e8ce3d --- /dev/null +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderView.swift @@ -0,0 +1,10 @@ +class PlacePageHeaderView: UIView { + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + for subview in subviews { + if !subview.isHidden && subview.isUserInteractionEnabled && subview.point(inside: convert(point, to: subview), with: event) { + return true + } + } + return false + } +} diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderViewController.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderViewController.swift new file mode 100644 index 0000000000..a4a23eae77 --- /dev/null +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageHeader/PlacePageHeaderViewController.swift @@ -0,0 +1,40 @@ +protocol PlacePageHeaderViewProtocol: class { + var presenter: PlacePageHeaderPresenterProtocol? { get set } + func setTitle(_ title: String) + func setViewStyle(_ style: String) + func setExpandButtonEnabled(_ val: Bool) +} + +class PlacePageHeaderViewController: UIViewController { + var presenter: PlacePageHeaderPresenterProtocol? + + @IBOutlet private var titleLabel: UILabel! + @IBOutlet private var expandButton: UIButton! + + override func viewDidLoad() { + super.viewDidLoad() + presenter?.configure() + } + + @IBAction func onExpandButtonPressed(_ sender: Any) { + presenter?.onExpandPress() + } + + @IBAction private func onCloseButtonPressed(_ sender: Any) { + presenter?.onClosePress() + } +} + +extension PlacePageHeaderViewController: PlacePageHeaderViewProtocol { + func setTitle(_ title: String) { + titleLabel.text = title + } + + func setViewStyle(_ style: String) { + view.setStyleAndApply(style) + } + + func setExpandButtonEnabled(_ val: Bool) { + expandButton.isHidden = !val + } +} diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePagePreviewViewController.swift b/iphone/Maps/UI/PlacePage/Components/PlacePagePreviewViewController.swift index 9662565754..e25d2315cc 100644 --- a/iphone/Maps/UI/PlacePage/Components/PlacePagePreviewViewController.swift +++ b/iphone/Maps/UI/PlacePage/Components/PlacePagePreviewViewController.swift @@ -11,8 +11,6 @@ protocol PlacePagePreviewViewControllerDelegate: AnyObject { class PlacePagePreviewViewController: UIViewController { @IBOutlet var stackView: UIStackView! - @IBOutlet var titleLabel: UILabel! - @IBOutlet var titleContainerView: UIStackView! @IBOutlet var popularView: UIView! @IBOutlet var subtitleLabel: UILabel! @IBOutlet var subtitleContainerView: UIStackView! @@ -34,7 +32,6 @@ class PlacePagePreviewViewController: UIViewController { @IBOutlet var scheduleContainerView: UIStackView! @IBOutlet var searchSimilarContainerView: UIStackView! - @IBOutlet var titleDirectionView: DirectionView! @IBOutlet var subtitleDirectionView: DirectionView! @IBOutlet var addressDirectionView: DirectionView! @@ -53,19 +50,22 @@ class PlacePagePreviewViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() + let subtitleString = NSMutableAttributedString() + if placePagePreviewData.isPopular { + subtitleString.append(NSAttributedString(string: L("popular_place"), + attributes: [.foregroundColor : UIColor.linkBlue(), + .font : UIFont.regular14()])) + } - if let title = placePagePreviewData.title { - titleLabel.text = title - directionView = titleDirectionView - } else { - titleContainerView.isHidden = true - } - if let subtitle = placePagePreviewData.subtitle { - subtitleLabel.text = subtitle - directionView = subtitleDirectionView - } else { - subtitleContainerView.isHidden = true + if let subtitle = placePagePreviewData.subtitle ?? placePagePreviewData.coordinates { + subtitleString.append(NSAttributedString(string: placePagePreviewData.isPopular ? " • " + subtitle : subtitle, + attributes: [.foregroundColor : UIColor.blackSecondaryText(), + .font : UIFont.regular14()])) } + + directionView = subtitleDirectionView + subtitleLabel.attributedText = subtitleString + if let address = placePagePreviewData.address { addressLabel.text = address directionView = addressDirectionView @@ -78,7 +78,6 @@ class PlacePagePreviewViewController: UIViewController { } else { priceLabel.isHidden = true } - popularView.isHidden = !placePagePreviewData.isPopular searchSimilarContainerView.isHidden = placePagePreviewData.hotelType == .none configSchedule() configUgc() diff --git a/iphone/Maps/UI/PlacePage/PlacePage.storyboard b/iphone/Maps/UI/PlacePage/PlacePage.storyboard index bb7c2be8a1..89a458cdea 100644 --- a/iphone/Maps/UI/PlacePage/PlacePage.storyboard +++ b/iphone/Maps/UI/PlacePage/PlacePage.storyboard @@ -22,37 +22,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -126,20 +96,11 @@ - - + + - - - + - - - - - + - + - +