From 5615968a813939d00a5ce3898b2eb33600a9e0c3 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 10 Apr 2024 17:19:18 -0400 Subject: [PATCH] fixes #135, fixes #136, fixes #137, fixes #138, fixes #139, fixes #140 fixes #141 --- .../UI/CompareMenus/CompareMenusButton.swift | 76 +++++-------------- .../CompareMenusEateryViewController.swift | 8 +- .../CompareMenusFilterViewController.swift | 15 +++- .../CompareMenusSheetViewController.swift | 1 + .../CompareMenusViewController.swift | 5 +- .../EateryFilterViewController.swift | 20 ++++- .../UI/EateryFilter/PillFiltersView.swift | 13 +++- .../EateryScreen/EateryModelController.swift | 8 +- .../UI/HomeScreen/HomeModelController.swift | 13 ++-- 9 files changed, 78 insertions(+), 81 deletions(-) diff --git a/Eatery Blue/UI/CompareMenus/CompareMenusButton.swift b/Eatery Blue/UI/CompareMenus/CompareMenusButton.swift index b327d21b..44dd844d 100644 --- a/Eatery Blue/UI/CompareMenus/CompareMenusButton.swift +++ b/Eatery Blue/UI/CompareMenus/CompareMenusButton.swift @@ -11,13 +11,12 @@ class CompareMenusButton: UIButton { // MARK: - Properties (data) + private var buttonCallback: ((UIButton) -> Void)? private var isCollapsed: Bool = true - private var largeButtonCallback: ((UIButton) -> Void)? - private var smallButtonCallback: ((UIButton) -> Void)? // MARK: - Properties (view) - private let button = UIButton() + private let compareImageView = UIImageView() private let textView = UILabel() // MARK: - init @@ -43,25 +42,21 @@ class CompareMenusButton: UIButton { layer.shadowOffset = .zero layer.shadowRadius = 2 - addSubview(button) - setUpButton() + addSubview(compareImageView) + setUpCompareImageView() addSubview(textView) setUpTextView() - self.addTarget(self, action: #selector(largeButtonTouchUpInside), for: .touchUpInside) + self.addTarget(self, action: #selector(buttonTouchUpInside), for: .touchUpInside) self.addTarget(self, action: #selector(buttonTouchDown), for: .touchDown) self.addTarget(self, action: #selector(buttonTouchUpOutside), for: .touchUpOutside) } - private func setUpButton() { - button.backgroundColor = UIColor.Eatery.blue - button.setImage(UIImage(named: "CompareMenus"), for: .normal) - button.layer.cornerRadius = 56 / 2 - - button.addTarget(self, action: #selector(smallButtonTouchUpInside), for: .touchUpInside) - button.addTarget(self, action: #selector(buttonTouchDown), for: .touchDown) - button.addTarget(self, action: #selector(buttonTouchUpOutside), for: .touchUpOutside) + private func setUpCompareImageView() { + compareImageView.backgroundColor = UIColor.Eatery.blue + compareImageView.image = UIImage(named: "CompareMenus") + compareImageView.layer.cornerRadius = 56 / 2 } private func setUpTextView() { @@ -77,53 +72,30 @@ class CompareMenusButton: UIButton { make.size.equalTo(56) } - button.snp.makeConstraints { make in + compareImageView.snp.makeConstraints { make in make.size.equalTo(24) make.leading.equalToSuperview().inset(16) make.centerY.equalToSuperview() } textView.snp.makeConstraints { make in - make.leading.equalTo(button.snp.trailing).offset(12) + make.leading.equalTo(compareImageView.snp.trailing).offset(12) make.centerY.equalToSuperview() } } - func smallButtonPress(_ callback: ((UIButton) -> Void)?) { - self.smallButtonCallback = callback - } - - func largeButtonPress(_ callback: ((UIButton) -> Void)?) { - self.largeButtonCallback = callback - } - - @objc private func smallButtonTouchUpInside(_ sender: UIButton) { - DispatchQueue.main.asyncAfter(deadline: .now()) { [weak self] in - guard let self else { return } - - smallButtonCallback?(sender) - } - - UIView.animate(withDuration: 0.15, delay: 0.15, options: .beginFromCurrentState) { [weak self] in - guard let self else { return } - - if isCollapsed { - transform = .identity - } else { - sender.transform = .identity - } - } + func buttonPress(_ callback: ((UIButton) -> Void)?) { + self.buttonCallback = callback } - @objc private func largeButtonTouchUpInside(_ sender: UIButton) { - if isCollapsed { return } + @objc private func buttonTouchUpInside(_ sender: UIButton) { DispatchQueue.main.asyncAfter(deadline: .now()) { [weak self] in guard let self else { return } - largeButtonCallback?(sender) + buttonCallback?(sender) } - UIView.animate(withDuration: 0.15, delay: 0.15, options: .beginFromCurrentState) { + UIView.animate(withDuration: 0.15, delay: 0, options: .beginFromCurrentState) { sender.transform = .identity } } @@ -132,23 +104,16 @@ class CompareMenusButton: UIButton { UIView.animate(withDuration: 0.15, delay: 0, options: .beginFromCurrentState) { [weak self] in guard let self else { return } - if isCollapsed { - transform = CGAffineTransform(scaleX: 0.95, y: 0.95) - } else { - sender.transform = CGAffineTransform(scaleX: 0.95, y: 0.95) - } + let transformPercentage = isCollapsed ? 0.9 : 0.95 + transform = CGAffineTransform(scaleX: transformPercentage, y: transformPercentage) } } @objc private func buttonTouchUpOutside(_ sender: UIButton) { - UIView.animate(withDuration: 0.15, delay: 0.15, options: .beginFromCurrentState) { [weak self] in + UIView.animate(withDuration: 0.15, delay: 0, options: .beginFromCurrentState) { [weak self] in guard let self else { return } - if isCollapsed { - transform = .identity - } else { - sender.transform = .identity - } + transform = .identity } } @@ -164,6 +129,7 @@ class CompareMenusButton: UIButton { animate { [weak self] in guard let self else { return } + textView.layer.opacity = 1 self.superview?.layoutIfNeeded() } diff --git a/Eatery Blue/UI/CompareMenus/CompareMenusEateryViewController.swift b/Eatery Blue/UI/CompareMenus/CompareMenusEateryViewController.swift index 10cd1ce1..8380d1a7 100644 --- a/Eatery Blue/UI/CompareMenus/CompareMenusEateryViewController.swift +++ b/Eatery Blue/UI/CompareMenus/CompareMenusEateryViewController.swift @@ -344,10 +344,10 @@ class CompareMenusEateryViewController: UIViewController { if categoryViews.isEmpty { categoryView.clipsToBounds = true categoryView.layer.cornerRadius = 10 - categoryView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] - } - - if isLast { + if !isLast { + categoryView.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner] + } + } else if isLast { categoryView.clipsToBounds = true categoryView.layer.cornerRadius = 10 categoryView.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMinXMaxYCorner] diff --git a/Eatery Blue/UI/CompareMenus/CompareMenusFilterViewController.swift b/Eatery Blue/UI/CompareMenus/CompareMenusFilterViewController.swift index 3fde7666..335905bf 100644 --- a/Eatery Blue/UI/CompareMenus/CompareMenusFilterViewController.swift +++ b/Eatery Blue/UI/CompareMenus/CompareMenusFilterViewController.swift @@ -19,6 +19,17 @@ class CompareMenusFilterViewController: EateryFilterViewController { super.viewDidLoad() setUpSelected() + anyFilterTap { [weak self] in + guard let self else { return } + + filter.selected = false + } + + // Moving "Favorites" button to the 5th position. + filtersView.moveButton(from: 999, to: 4) + // "moveButton" handles out of binds index to bounds. Because "Favorites" + // button is always last, a large from will ensure this doesn't + // break if more filters are added } private func setUpSelected() { @@ -40,10 +51,6 @@ class CompareMenusFilterViewController: EateryFilterViewController { } override func updateFilterButtonsFromState(animated: Bool) { - if filter.selected { - removeAllFilters() - } - super.updateFilterButtonsFromState(animated: animated) selected.setHighlighted(filter.selected) } diff --git a/Eatery Blue/UI/CompareMenus/CompareMenusSheetViewController.swift b/Eatery Blue/UI/CompareMenus/CompareMenusSheetViewController.swift index d0658c29..611ef48e 100644 --- a/Eatery Blue/UI/CompareMenus/CompareMenusSheetViewController.swift +++ b/Eatery Blue/UI/CompareMenus/CompareMenusSheetViewController.swift @@ -90,6 +90,7 @@ class CompareMenusSheetViewController: SheetViewController { compareNowButton.setTitle("Compare now", for: .normal) compareNowButton.setTitleColor(UIColor(named: "Gray03"), for: .disabled) compareNowButton.setTitleColor(.white, for: .normal) + compareNowButton.titleLabel?.font = .systemFont(ofSize: 18, weight: .semibold) compareNowButton.backgroundColor = UIColor(named: "Gray00") compareNowButton.isEnabled = false diff --git a/Eatery Blue/UI/CompareMenus/CompareMenusViewController.swift b/Eatery Blue/UI/CompareMenus/CompareMenusViewController.swift index 2d943508..dae49f8c 100644 --- a/Eatery Blue/UI/CompareMenus/CompareMenusViewController.swift +++ b/Eatery Blue/UI/CompareMenus/CompareMenusViewController.swift @@ -35,7 +35,8 @@ class CompareMenusViewController: UIViewController { override func viewDidLoad() { view.backgroundColor = .white - + view.clipsToBounds = true + addChild(pageController) view.addSubview(pageController.view) @@ -77,7 +78,7 @@ class CompareMenusViewController: UIViewController { navigationController?.popViewController(animated: true) let selectionViewController = CompareMenusSheetViewController(parentNavigationController: navigationController, allEateries: allEateries , selectedEateries: comparedEateries, selectedOn: true) selectionViewController.setUpSheetPresentation() - navigationController?.present(selectionViewController, animated: true) + tabBarController?.present(selectionViewController, animated: true) } } diff --git a/Eatery Blue/UI/EateryFilter/EateryFilterViewController.swift b/Eatery Blue/UI/EateryFilter/EateryFilterViewController.swift index 6b678771..6f1362db 100644 --- a/Eatery Blue/UI/EateryFilter/EateryFilterViewController.swift +++ b/Eatery Blue/UI/EateryFilter/EateryFilterViewController.swift @@ -23,6 +23,8 @@ class EateryFilterViewController: UIViewController { private let paymentMethods = PillFilterButtonView() private let favorites = PillFilterButtonView() + private var allFiltersCallback: (() -> Void)? + var filter = EateryFilter() let filtersView = PillFiltersView() @@ -62,11 +64,13 @@ class EateryFilterViewController: UIViewController { filtersView.addButton(favorites) setUpFavorites() } - + private func setUpNorth() { north.label.text = "North" north.tap { [weak self] _ in guard let self else { return } + + allFiltersCallback?() filter.north.toggle() updateFilterButtonsFromState(animated: true) delegate?.eateryFilterViewController(self, filterDidChange: filter) @@ -80,6 +84,8 @@ class EateryFilterViewController: UIViewController { west.label.text = "West" west.tap { [weak self] _ in guard let self else { return } + + allFiltersCallback?() filter.west.toggle() updateFilterButtonsFromState(animated: true) delegate?.eateryFilterViewController(self, filterDidChange: filter) @@ -93,6 +99,8 @@ class EateryFilterViewController: UIViewController { central.label.text = "Central" central.tap { [weak self] _ in guard let self else { return } + + allFiltersCallback?() filter.central.toggle() updateFilterButtonsFromState(animated: true) delegate?.eateryFilterViewController(self, filterDidChange: filter) @@ -106,6 +114,8 @@ class EateryFilterViewController: UIViewController { under10Minutes.label.text = "Under 10 min" under10Minutes.tap { [weak self] _ in guard let self else { return } + + allFiltersCallback?() filter.under10MinutesEnabled.toggle() updateFilterButtonsFromState(animated: true) delegate?.eateryFilterViewController(self, filterDidChange: filter) @@ -120,6 +130,8 @@ class EateryFilterViewController: UIViewController { paymentMethods.imageView.isHidden = false paymentMethods.tap { [weak self] _ in guard let self else { return } + + allFiltersCallback?() let viewController = PaymentMethodsFilterSheetViewController() viewController.setUpSheetPresentation() viewController.setSelectedPaymentMethods(filter.paymentMethods, animated: false) @@ -136,6 +148,8 @@ class EateryFilterViewController: UIViewController { favorites.label.text = "Favorites" favorites.tap { [weak self] _ in guard let self else { return } + + allFiltersCallback?() filter.favoriteEnabled.toggle() updateFilterButtonsFromState(animated: true) delegate?.eateryFilterViewController(self, filterDidChange: filter) @@ -145,6 +159,10 @@ class EateryFilterViewController: UIViewController { } } + func anyFilterTap(_ callback: (() -> Void)?) { + self.allFiltersCallback = callback + } + private func setUpConstraints() { filtersView.snp.makeConstraints { make in make.edges.equalToSuperview() diff --git a/Eatery Blue/UI/EateryFilter/PillFiltersView.swift b/Eatery Blue/UI/EateryFilter/PillFiltersView.swift index 938fb588..a6505887 100644 --- a/Eatery Blue/UI/EateryFilter/PillFiltersView.swift +++ b/Eatery Blue/UI/EateryFilter/PillFiltersView.swift @@ -61,5 +61,16 @@ class PillFiltersView: UIView { func addButton(_ buttonView: PillFilterButtonView, at: Int) { stackView.insertArrangedSubview(buttonView, at: at) } - + + func moveButton(from: Int, to: Int) { + var boundedFrom = max(min(from, stackView.arrangedSubviews.count - 1), 0) + var boundedTo = max(min(to, stackView.arrangedSubviews.count - 1), 0) + let movedView = stackView.arrangedSubviews[boundedFrom] + stackView.arrangedSubviews[boundedFrom].removeFromSuperview() + if boundedTo >= stackView.arrangedSubviews.count { + stackView.addArrangedSubview(movedView) + } else { + stackView.insertArrangedSubview(movedView, at: boundedTo) + } + } } diff --git a/Eatery Blue/UI/EateryScreen/EateryModelController.swift b/Eatery Blue/UI/EateryScreen/EateryModelController.swift index 3eddf229..dbc218dd 100644 --- a/Eatery Blue/UI/EateryScreen/EateryModelController.swift +++ b/Eatery Blue/UI/EateryScreen/EateryModelController.swift @@ -114,17 +114,13 @@ class EateryModelController: EateryViewController { } private func setUpCompareMenusButton() { - compareMenusButton.largeButtonPress { [weak self] _ in + compareMenusButton.buttonPress { [weak self] _ in guard let self, let eatery else { return } + let viewController = CompareMenusSheetViewController(parentNavigationController: navigationController, allEateries: allEateries, selectedEateries: [eatery]) viewController.setUpSheetPresentation() tabBarController?.present(viewController, animated: true) } - - compareMenusButton.smallButtonPress { [weak self] _ in - guard let self else { return } - compareMenusButton.toggle() - } } private func addButtons(_ eatery: Eatery) { diff --git a/Eatery Blue/UI/HomeScreen/HomeModelController.swift b/Eatery Blue/UI/HomeScreen/HomeModelController.swift index f999cf66..43836482 100644 --- a/Eatery Blue/UI/HomeScreen/HomeModelController.swift +++ b/Eatery Blue/UI/HomeScreen/HomeModelController.swift @@ -79,8 +79,9 @@ class HomeModelController: HomeViewController { compareMenusOnboarding.compareMenusButton.tap { [weak self] _ in guard let self else { return } - compareMenusOnboarding.dismiss() - compareMenusButton.expand() + let viewController = CompareMenusSheetViewController(parentNavigationController: navigationController, allEateries: allEateries, selectedEateries: []) + viewController.setUpSheetPresentation() + tabBarController?.present(viewController, animated: true) } } @@ -111,17 +112,13 @@ class HomeModelController: HomeViewController { } private func setUpCompareMenusButton() { - compareMenusButton.largeButtonPress { [weak self] _ in + compareMenusButton.buttonPress { [weak self] _ in guard let self else { return } + let viewController = CompareMenusSheetViewController(parentNavigationController: navigationController, allEateries: allEateries, selectedEateries: []) viewController.setUpSheetPresentation() tabBarController?.present(viewController, animated: true) } - - compareMenusButton.smallButtonPress { [weak self] _ in - guard let self else { return } - compareMenusButton.toggle() - } } private func setUpUserLocationSubscription() {