From 40d4356524f640d810b113f80ce74e7e484726a9 Mon Sep 17 00:00:00 2001 From: Scott Clampet <110618242+scottkicks@users.noreply.github.com> Date: Thu, 29 Aug 2024 09:22:36 -0700 Subject: [PATCH] [NO TICKET] Rewards Load Before Shipping Locations Have Loaded (#2136) * only show rewards once shipping locations have loaded and shimmer view has gone away * cleanup unused delegate conformance * add a comment to explain that this loading state is temporary and will be investigated as tech debt --- .../ConfirmDetailsViewController.swift | 5 ++++- .../PledgeShippingLocationViewController.swift | 7 ++++--- .../Controllers/PledgeViewController.swift | 5 ++++- .../RewardAddOnSelectionViewController.swift | 2 +- ...ippingRewardsCollectionViewController.swift | 18 +++++++++++++++++- ...ithShippingRewardsCollectionViewModel.swift | 12 ++++++++++++ 6 files changed, 42 insertions(+), 7 deletions(-) diff --git a/Kickstarter-iOS/Features/ConfirmDetails/Controllers/ConfirmDetailsViewController.swift b/Kickstarter-iOS/Features/ConfirmDetails/Controllers/ConfirmDetailsViewController.swift index e19d6873dd..9e102e83e8 100644 --- a/Kickstarter-iOS/Features/ConfirmDetails/Controllers/ConfirmDetailsViewController.swift +++ b/Kickstarter-iOS/Features/ConfirmDetails/Controllers/ConfirmDetailsViewController.swift @@ -360,7 +360,10 @@ extension ConfirmDetailsViewController: PledgeShippingLocationViewControllerDele self.viewModel.inputs.shippingRuleSelected(shippingRule) } - func pledgeShippingLocationViewControllerLayoutDidUpdate(_: PledgeShippingLocationViewController) {} + func pledgeShippingLocationViewControllerLayoutDidUpdate( + _: PledgeShippingLocationViewController, + _: Bool + ) {} func pledgeShippingLocationViewControllerFailedToLoad(_: PledgeShippingLocationViewController) {} } diff --git a/Kickstarter-iOS/Features/PledgeShippingLocation/PledgeShippingLocationViewController.swift b/Kickstarter-iOS/Features/PledgeShippingLocation/PledgeShippingLocationViewController.swift index e2929706c3..a075ef9ae4 100644 --- a/Kickstarter-iOS/Features/PledgeShippingLocation/PledgeShippingLocationViewController.swift +++ b/Kickstarter-iOS/Features/PledgeShippingLocation/PledgeShippingLocationViewController.swift @@ -10,7 +10,8 @@ protocol PledgeShippingLocationViewControllerDelegate: AnyObject { didSelect shippingRule: ShippingRule ) func pledgeShippingLocationViewControllerLayoutDidUpdate( - _ viewController: PledgeShippingLocationViewController + _ viewController: PledgeShippingLocationViewController, + _ shimmerLoadingViewIsHidden: Bool ) func pledgeShippingLocationViewControllerFailedToLoad( _ viewController: PledgeShippingLocationViewController @@ -134,9 +135,9 @@ final class PledgeShippingLocationViewController: UIViewController { self.viewModel.outputs.shippingLocationButtonTitle ) .observeForUI() - .observeValues { [weak self] _ in + .observeValues { [weak self] _, _, _, shimmerLoadingViewIsHidden, _ in guard let self = self else { return } - self.delegate?.pledgeShippingLocationViewControllerLayoutDidUpdate(self) + self.delegate?.pledgeShippingLocationViewControllerLayoutDidUpdate(self, shimmerLoadingViewIsHidden) } self.viewModel.outputs.notifyDelegateOfSelectedShippingRule diff --git a/Kickstarter-iOS/Features/PledgeView/Controllers/PledgeViewController.swift b/Kickstarter-iOS/Features/PledgeView/Controllers/PledgeViewController.swift index a87b622b75..3a823820ab 100644 --- a/Kickstarter-iOS/Features/PledgeView/Controllers/PledgeViewController.swift +++ b/Kickstarter-iOS/Features/PledgeView/Controllers/PledgeViewController.swift @@ -622,7 +622,10 @@ extension PledgeViewController: PledgeShippingLocationViewControllerDelegate { self.viewModel.inputs.shippingRuleSelected(shippingRule) } - func pledgeShippingLocationViewControllerLayoutDidUpdate(_: PledgeShippingLocationViewController) {} + func pledgeShippingLocationViewControllerLayoutDidUpdate( + _: PledgeShippingLocationViewController, + _: Bool + ) {} func pledgeShippingLocationViewControllerFailedToLoad(_: PledgeShippingLocationViewController) {} } diff --git a/Kickstarter-iOS/Features/RewardAddOnSelection/Controller/RewardAddOnSelectionViewController.swift b/Kickstarter-iOS/Features/RewardAddOnSelection/Controller/RewardAddOnSelectionViewController.swift index 9639754ec6..4af0236d26 100644 --- a/Kickstarter-iOS/Features/RewardAddOnSelection/Controller/RewardAddOnSelectionViewController.swift +++ b/Kickstarter-iOS/Features/RewardAddOnSelection/Controller/RewardAddOnSelectionViewController.swift @@ -255,7 +255,7 @@ extension RewardAddOnSelectionViewController: PledgeShippingLocationViewControll self.viewModel.inputs.shippingRuleSelected(shippingRule) } - func pledgeShippingLocationViewControllerLayoutDidUpdate(_: PledgeShippingLocationViewController) { + func pledgeShippingLocationViewControllerLayoutDidUpdate(_: PledgeShippingLocationViewController, _: Bool) { self.tableView.ksr_sizeHeaderFooterViewsToFit() } diff --git a/Kickstarter-iOS/Features/RewardsCollection/Controller/WithShippingRewardsCollectionViewController.swift b/Kickstarter-iOS/Features/RewardsCollection/Controller/WithShippingRewardsCollectionViewController.swift index b029eed907..611ee17361 100644 --- a/Kickstarter-iOS/Features/RewardsCollection/Controller/WithShippingRewardsCollectionViewController.swift +++ b/Kickstarter-iOS/Features/RewardsCollection/Controller/WithShippingRewardsCollectionViewController.swift @@ -76,6 +76,7 @@ final class WithShippingRewardsCollectionViewController: UICollectionViewControl _ = self.collectionView |> \.dataSource .~ self.dataSource + |> \.isHidden .~ true _ = (self.headerView, self.view) |> ksr_addSubviewToParent() @@ -200,6 +201,15 @@ final class WithShippingRewardsCollectionViewController: UICollectionViewControl } } + self.viewModel.outputs.rewardsCollectionViewIsHidden + .observeForUI() + .observeValues { [weak self] shimmerLoadingViewIsHidden in + guard let self else { return } + + self.collectionView.isHidden = !shimmerLoadingViewIsHidden + self.collectionView.layoutIfNeeded() + } + self.viewModel.outputs.rewardsCollectionViewFooterIsHidden .observeForUI() .observeValues { [weak self] isHidden in @@ -410,7 +420,13 @@ extension WithShippingRewardsCollectionViewController: PledgeShippingLocationVie self.viewModel.inputs.shippingRuleSelected(shippingRule) } - func pledgeShippingLocationViewControllerLayoutDidUpdate(_: PledgeShippingLocationViewController) {} + func pledgeShippingLocationViewControllerLayoutDidUpdate( + _: PledgeShippingLocationViewController, + _ shimmerLoadingViewIsHidden: Bool + ) { + self.viewModel.inputs.pledgeShippingLocationViewControllerDidUpdate(shimmerLoadingViewIsHidden) + } + func pledgeShippingLocationViewControllerFailedToLoad(_: PledgeShippingLocationViewController) { self.viewModel.inputs.shippingLocationViewDidFailToLoad() } diff --git a/Library/ViewModels/WithShippingRewardsCollectionViewModel.swift b/Library/ViewModels/WithShippingRewardsCollectionViewModel.swift index 8fb1408ae2..2ba3221347 100644 --- a/Library/ViewModels/WithShippingRewardsCollectionViewModel.swift +++ b/Library/ViewModels/WithShippingRewardsCollectionViewModel.swift @@ -6,6 +6,7 @@ import UIKit public protocol WithShippingRewardsCollectionViewModelInputs { func configure(with project: Project, refTag: RefTag?, context: RewardsCollectionViewContext) func confirmedEditReward() + func pledgeShippingLocationViewControllerDidUpdate(_ shimmerLoadingViewIsHidden: Bool) func rewardCellShouldShowDividerLine(_ show: Bool) func rewardSelected(with rewardId: Int) func shippingLocationViewDidFailToLoad() @@ -25,6 +26,7 @@ public protocol WithShippingRewardsCollectionViewModelOutputs { var goToPledge: Signal { get } var navigationBarShadowImageHidden: Signal { get } var reloadDataWithValues: Signal<[RewardCardViewData], Never> { get } + var rewardsCollectionViewIsHidden: Signal { get } var rewardsCollectionViewFooterIsHidden: Signal { get } var scrollToBackedRewardIndexPath: Signal { get } var shippingLocationViewHidden: Signal { get } @@ -201,6 +203,10 @@ public final class WithShippingRewardsCollectionViewModel: WithShippingRewardsCo goToPledgeBackedConfirmed ) + /// Temporary loading state solution. Proper designs will be explored in this ticket [mbl-1678](https://kickstarter.atlassian.net/browse/MBL-1678) + self.rewardsCollectionViewIsHidden = self.pledgeShippingLocationViewControllerDidUpdateProperty.signal + .map { $0 } + self.rewardsCollectionViewFooterIsHidden = self.traitCollectionChangedProperty.signal .skipNil() .map { isFalse($0.verticalSizeClass == .regular) } @@ -323,6 +329,11 @@ public final class WithShippingRewardsCollectionViewModel: WithShippingRewardsCo self.confirmedEditRewardProperty.value = () } + private let pledgeShippingLocationViewControllerDidUpdateProperty = MutableProperty(false) + public func pledgeShippingLocationViewControllerDidUpdate(_ shimmerLoadingViewIsHidden: Bool) { + self.pledgeShippingLocationViewControllerDidUpdateProperty.value = shimmerLoadingViewIsHidden + } + private let rewardCellShouldShowDividerLineProperty = MutableProperty(false) public func rewardCellShouldShowDividerLine(_ show: Bool) { self.rewardCellShouldShowDividerLineProperty.value = show @@ -375,6 +386,7 @@ public final class WithShippingRewardsCollectionViewModel: WithShippingRewardsCo public let goToPledge: Signal public let navigationBarShadowImageHidden: Signal public let reloadDataWithValues: Signal<[RewardCardViewData], Never> + public let rewardsCollectionViewIsHidden: Signal public let rewardsCollectionViewFooterIsHidden: Signal public let scrollToBackedRewardIndexPath: Signal public var shippingLocationViewHidden: Signal