Skip to content

Commit

Permalink
[MBL-1599] Adds the Shipping Dropdown Selector to the Rewards Carouse…
Browse files Browse the repository at this point in the history
…l. (#2095)

* WIP: populate shipping countries using the project's rewards

* No longer using individually passed in Rewards

* update PledgeShippingLocationViewModelTests

* add PledgeShippingLocationViewController to Rewards screen

* update snapshots + clean up

* snapshot test updates

* new orthogonals

* formatting clean up
  • Loading branch information
scottkicks authored Jul 16, 2024
1 parent 864066d commit e495aca
Show file tree
Hide file tree
Showing 281 changed files with 431 additions and 76 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ final class PledgeViewControllerTests: TestCase {
let project = Project.template
|> \.availableCardTypes .~ [CreditCardType.discover.rawValue]

combos(Language.allLanguages, Device.allCases).forEach { language, device in
orthogonalCombos(Language.allLanguages, Device.allCases).forEach { language, device in
withEnvironment(apiService: mockService, currentUser: User.template, language: language) {
let controller = PledgeViewController.instantiate()

Expand Down Expand Up @@ -112,7 +112,7 @@ final class PledgeViewControllerTests: TestCase {
func testView_PledgeContext_NeedsConversion_IsFalse() {
let response = UserEnvelope<GraphUser>(me: self.userWithCards)
let mockService = MockService(fetchGraphUserResult: .success(response))
combos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
.forEach { language, device, currentUser in
withEnvironment(apiService: mockService, currentUser: currentUser, language: language) {
let controller = PledgeViewController.instantiate()
Expand Down Expand Up @@ -164,7 +164,7 @@ final class PledgeViewControllerTests: TestCase {
|> Project.lens.stats.currentCurrency .~ Project.Country.gb.currencyCode
|> Project.lens.stats.currentCurrencyRate .~ .some(2.0)

combos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
.forEach { language, device, currentUser in
withEnvironment(apiService: mockService, currentUser: currentUser, language: language) {
let controller = PledgeViewController.instantiate()
Expand Down Expand Up @@ -395,7 +395,7 @@ final class PledgeViewControllerTests: TestCase {
|> Backing.lens.amount .~ 700.0
)

combos(Language.allLanguages, [Device.phone4_7inch, Device.pad]).forEach { language, device in
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad]).forEach { language, device in
withEnvironment(apiService: mockService, currentUser: .template, language: language) {
let controller = PledgeViewController.instantiate()
let data = PledgeViewData(
Expand Down Expand Up @@ -444,7 +444,7 @@ final class PledgeViewControllerTests: TestCase {
let response = UserEnvelope<GraphUser>(me: self.userWithCards)
let mockService = MockService(fetchGraphUserResult: .success(response))

combos(Language.allLanguages, [Device.phone4_7inch, Device.pad]).forEach { language, device in
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad]).forEach { language, device in
withEnvironment(apiService: mockService, currentUser: .template, language: language) {
let controller = PledgeViewController.instantiate()
let data = PledgeViewData(
Expand Down Expand Up @@ -487,7 +487,7 @@ final class PledgeViewControllerTests: TestCase {

let reward = Reward.template

combos(Language.allLanguages, Device.allCases).forEach { language, device in
orthogonalCombos(Language.allLanguages, Device.allCases).forEach { language, device in
withEnvironment(apiService: mockService, currentUser: User.template, language: language) {
let controller = PledgeViewController.instantiate()
let data = PledgeViewData(
Expand Down Expand Up @@ -518,7 +518,7 @@ final class PledgeViewControllerTests: TestCase {
let reward = Reward.template
|> (Reward.lens.shipping .. Reward.Shipping.lens.enabled) .~ true

combos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
.forEach { language, device, currentUser in
withEnvironment(language: language) {
let controller = PledgeViewController.instantiate()
Expand Down Expand Up @@ -554,7 +554,7 @@ final class PledgeViewControllerTests: TestCase {
let reward = Reward.template
|> (Reward.lens.shipping .. Reward.Shipping.lens.enabled) .~ true

combos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
.forEach { language, device, currentUser in
withEnvironment(language: language) {
let controller = PledgeViewController.instantiate()
Expand Down Expand Up @@ -592,7 +592,7 @@ final class PledgeViewControllerTests: TestCase {
|> (Reward.lens.shipping .. Reward.Shipping.lens.preference) .~ .local
|> Reward.lens.localPickup .~ Location.losAngeles

combos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
.forEach { language, device, currentUser in
withEnvironment(language: language) {
let controller = PledgeViewController.instantiate()
Expand Down Expand Up @@ -645,7 +645,7 @@ final class PledgeViewControllerTests: TestCase {
context: .pledge
)

combos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
orthogonalCombos(Language.allLanguages, [Device.phone4_7inch, Device.pad], [nil, User.template])
.forEach { language, device, currentUser in
withEnvironment(language: language) {
let controller = PledgeViewController.instantiate()
Expand Down
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ final class RewardsCollectionViewController: UICollectionViewController {
|> \.translatesAutoresizingMaskIntoConstraints .~ false
}()

/// The bottom-up modal for selecting a new shipping location
private lazy var pledgeShippingLocationViewController = {
PledgeShippingLocationViewController.instantiate()
|> \.delegate .~ self
|> \.view.layoutMargins .~ .init(all: Styles.grid(3))
}()

private let layout: UICollectionViewFlowLayout = {
UICollectionViewFlowLayout()
|> \.minimumLineSpacing .~ Styles.grid(3)
Expand Down Expand Up @@ -66,14 +73,19 @@ final class RewardsCollectionViewController: UICollectionViewController {
_ = self
|> \.extendedLayoutIncludesOpaqueBars .~ true

if featurePostCampaignPledgeEnabled() {
_ = (self.headerView, self.view)
|> ksr_addSubviewToParent()
}

_ = self.collectionView
|> \.dataSource .~ self.dataSource

_ = (self.headerView, self.view)
|> ksr_addSubviewToParent()

/// Adding this to the CollectionView Header's rootStackView from here so that we can handle the shipping view's delegates from this view controller.
_ = ([self.pledgeShippingLocationViewController.view], self.headerView.rootStackView)
|> ksr_addArrangedSubviewsToStackView()

self.addChild(self.pledgeShippingLocationViewController)
self.pledgeShippingLocationViewController.didMove(toParent: self)

_ = (self.rewardsCollectionFooterView, self.view)
|> ksr_addSubviewToParent()

Expand Down Expand Up @@ -131,6 +143,7 @@ final class RewardsCollectionViewController: UICollectionViewController {
|> checkoutBackgroundStyle

_ = self.headerView
|> \.backgroundColor .~ .ksr_alert
|> \.layoutMargins .~ .init(all: Styles.grid(3))

_ = self.collectionView
Expand Down Expand Up @@ -213,6 +226,17 @@ final class RewardsCollectionViewController: UICollectionViewController {
.observeValues { [weak self] title, message in
self?.showEditRewardConfirmationPrompt(title: title, message: message)
}

// MARK: - Shipping Location Outputs

self.pledgeShippingLocationViewController.view.rac.hidden = self.viewModel.outputs
.shippingLocationViewHidden

self.viewModel.outputs.configureShippingLocationViewWithData
.observeForUI()
.observeValues { [weak self] data in
self?.pledgeShippingLocationViewController.configureWith(value: data)
}
}

// MARK: - Functions
Expand All @@ -221,24 +245,16 @@ final class RewardsCollectionViewController: UICollectionViewController {
_ = self.collectionView
|> \.translatesAutoresizingMaskIntoConstraints .~ false

if featurePostCampaignPledgeEnabled() {
self.headerView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
self.headerView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true
self.headerView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
}

NSLayoutConstraint.activate([
self.headerView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
self.headerView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
self.headerView.topAnchor.constraint(equalTo: self.view.topAnchor),
self.rewardsCollectionFooterView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
self.rewardsCollectionFooterView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
self.rewardsCollectionFooterView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
self.collectionView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
self.collectionView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
self.collectionView.topAnchor
.constraint(
equalTo: featurePostCampaignPledgeEnabled()
? self.headerView.bottomAnchor
: self.view.topAnchor
)
self.collectionView.topAnchor.constraint(equalTo: self.headerView.bottomAnchor)
])

self.collectionViewBottomConstraintFooterView = self.collectionView.bottomAnchor
Expand Down Expand Up @@ -368,6 +384,18 @@ extension RewardsCollectionViewController: RewardCellDelegate {
}
}

// MARK: - PledgeShippingLocationViewControllerDelegate

extension RewardsCollectionViewController: PledgeShippingLocationViewControllerDelegate {
func pledgeShippingLocationViewController(
_: PledgeShippingLocationViewController,
didSelect _: ShippingRule
) {}

func pledgeShippingLocationViewControllerLayoutDidUpdate(_: PledgeShippingLocationViewController) {}
func pledgeShippingLocationViewControllerFailedToLoad(_: PledgeShippingLocationViewController) {}
}

// MARK: Styles

private var collectionViewStyle: CollectionViewStyle = { collectionView -> UICollectionView in
Expand Down
Loading

0 comments on commit e495aca

Please sign in to comment.