Skip to content

Commit

Permalink
[NT-205] Manage pledge reward section (#868)
Browse files Browse the repository at this point in the history
  • Loading branch information
Scollaco authored Oct 9, 2019
1 parent 46ed810 commit c1a2d59
Show file tree
Hide file tree
Showing 36 changed files with 353 additions and 124 deletions.
66 changes: 66 additions & 0 deletions Kickstarter-iOS/Views/Controllers/ManagePledgeRewardView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import KsApi
import Library
import Prelude
import UIKit

final class ManagePledgeRewardView: UIView {
// MARK: - Properties

private lazy var rewardView: RewardCardView = {
RewardCardView(frame: .zero)
}()

private lazy var rootStackView: UIStackView = { UIStackView(frame: .zero) }()
private lazy var titleLabel: UILabel = { UILabel(frame: .zero) }()

// MARK: - Life cycle

override init(frame: CGRect) {
super.init(frame: frame)

self.configureViews()
self.bindStyles()
}

required init?(coder _: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

// MARK: - Configuration

public func configure(with value: (Project, Either<Reward, Backing>)) {
self.rewardView.configure(with: value, context: .pledgeView)
}

private func configureViews() {
_ = ([self.titleLabel, self.rewardView], self.rootStackView)
|> ksr_addArrangedSubviewsToStackView()

_ = (self.rootStackView, self)
|> ksr_addSubviewToParent()
|> ksr_constrainViewToEdgesInParent()
}

// MARK: - Styles

override func bindStyles() {
super.bindStyles()

_ = self.rewardView
|> checkoutBackgroundStyle

_ = self.rootStackView
|> checkoutCardStackViewStyle

_ = self.titleLabel
|> titleLabelStyle
}
}

// MARK: - Styles

private let titleLabelStyle: LabelStyle = { label in
label
|> checkoutTitleLabelStyle
|> \.text %~ { _ in Strings.Selected_reward() }
}
82 changes: 69 additions & 13 deletions Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ import UIKit
final class ManagePledgeViewController: UIViewController, MessageBannerViewControllerPresenting {
// MARK: - Properties

private let viewModel: ManagePledgeViewModelType = ManagePledgeViewModel()

private lazy var closeButton: UIBarButtonItem = {
UIBarButtonItem(
image: UIImage(named: "icon--cross"),
Expand All @@ -28,16 +26,47 @@ final class ManagePledgeViewController: UIViewController, MessageBannerViewContr

internal var messageBannerViewController: MessageBannerViewController?

private lazy var pledgeSummaryView: ManagePledgeSummaryView = { ManagePledgeSummaryView(frame: .zero) }()
private lazy var paymentMethodSectionSeparator: UIView = {
UIView(frame: .zero)
|> \.translatesAutoresizingMaskIntoConstraints .~ false
}()

private lazy var paymentMethodView: ManagePledgePaymentMethodView = {
ManagePledgePaymentMethodView(frame: .zero)
}()

private lazy var paymentMethodViews = {
[self.paymentMethodView, self.paymentMethodSectionSeparator]
}()

private lazy var pledgeSummaryView: ManagePledgeSummaryView = { ManagePledgeSummaryView(frame: .zero) }()

private lazy var pledgeSummarySectionViews = {
[self.pledgeSummaryView, self.pledgeSummarySectionSeparator]
}()

private lazy var pledgeSummarySectionSeparator: UIView = {
UIView(frame: .zero)
|> \.translatesAutoresizingMaskIntoConstraints .~ false
}()

private lazy var rewardView: ManagePledgeRewardView = {
ManagePledgeRewardView(frame: .zero)
}()

private lazy var rewardReceivedViewController: ManageViewPledgeRewardReceivedViewController = {
ManageViewPledgeRewardReceivedViewController.instantiate()
}()

private lazy var rewardSectionSeparator: UIView = {
UIView(frame: .zero)
|> \.translatesAutoresizingMaskIntoConstraints .~ false
}()

private lazy var rewardSectionViews = {
[self.rewardView, self.rewardSectionSeparator]
}()

private lazy var rootScrollView: UIScrollView = {
UIScrollView(frame: .zero)
|> \.translatesAutoresizingMaskIntoConstraints .~ false
Expand All @@ -48,6 +77,19 @@ final class ManagePledgeViewController: UIViewController, MessageBannerViewContr
|> \.translatesAutoresizingMaskIntoConstraints .~ false
}()

private lazy var sectionSeparatorViews = {
[self.pledgeSummarySectionSeparator, self.paymentMethodSectionSeparator, self.rewardSectionSeparator]
}()

private let viewModel: ManagePledgeViewModelType = ManagePledgeViewModel()

static func instantiate(with project: Project, reward: Reward) -> ManagePledgeViewController {
let manageViewPledgeVC = ManagePledgeViewController.instantiate()
manageViewPledgeVC.viewModel.inputs.configureWith(project, reward: reward)

return manageViewPledgeVC
}

// MARK: - Lifecycle

override func viewDidLoad() {
Expand Down Expand Up @@ -85,6 +127,9 @@ final class ManagePledgeViewController: UIViewController, MessageBannerViewContr

_ = self.rootStackView
|> checkoutRootStackViewStyle

_ = self.sectionSeparatorViews
||> separatorStyleDark
}

// MARK: - View model
Expand Down Expand Up @@ -123,7 +168,9 @@ final class ManagePledgeViewController: UIViewController, MessageBannerViewContr

self.viewModel.outputs.configureRewardSummaryView
.observeForUI()
.observeValues { _ in }
.observeValues { [weak self] in
self?.rewardView.configure(with: $0)
}

self.viewModel.outputs.showActionSheetMenuWithOptions
.observeForControllerAction()
Expand Down Expand Up @@ -180,6 +227,13 @@ final class ManagePledgeViewController: UIViewController, MessageBannerViewContr
NSLayoutConstraint.activate([
self.rootStackView.widthAnchor.constraint(equalTo: self.rootScrollView.widthAnchor)
])

self.sectionSeparatorViews.forEach { view in
_ = view.heightAnchor.constraint(equalToConstant: 1)
|> \.isActive .~ true

view.setContentCompressionResistancePriority(.required, for: .vertical)
}
}

// MARK: Functions
Expand All @@ -193,17 +247,19 @@ final class ManagePledgeViewController: UIViewController, MessageBannerViewContr
|> ksr_addSubviewToParent()
|> ksr_constrainViewToEdgesInParent()

_ = ([self.pledgeSummaryView, self.paymentMethodView], self.rootStackView)
|> ksr_addArrangedSubviewsToStackView()

[self.rewardReceivedViewController].forEach { viewController in
self.addChild(viewController)
let childViews: [UIView] = [
self.pledgeSummarySectionViews,
self.paymentMethodViews,
self.rewardSectionViews,
[self.rewardReceivedViewController.view]
]
.flatMap { $0 }

_ = ([viewController.view], self.rootStackView)
|> ksr_addArrangedSubviewsToStackView()
_ = (childViews, self.rootStackView)
|> ksr_addArrangedSubviewsToStackView()

viewController.didMove(toParent: self)
}
self.addChild(self.rewardReceivedViewController)
self.rewardReceivedViewController.didMove(toParent: self)
}

// MARK: Actions
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
@testable import Kickstarter_Framework
@testable import KsApi
@testable import Library
import Prelude
import UIKit

final class ManagePledgeViewControllerTests: TestCase {
override func setUp() {
super.setUp()

AppEnvironment.pushEnvironment(mainBundle: Bundle.framework)
UIView.setAnimationsEnabled(false)
}

override func tearDown() {
AppEnvironment.popEnvironment()
UIView.setAnimationsEnabled(true)

super.tearDown()
}

func testView() {
combos(Language.allLanguages, [Device.phone4_7inch, Device.pad]).forEach { language, device in
withEnvironment(language: language) {
let reward = Reward.template
|> Reward.lens.shipping.enabled .~ true
let backing = Backing.template
|> Backing.lens.reward .~ reward
let backedProject = Project.cosmicSurgery
|> Project.lens.personalization.backing .~ backing

let controller = ManagePledgeViewController.instantiate()
controller.configureWith(project: backedProject, reward: Reward.template)
let (parent, _) = traitControllers(device: device, orientation: .portrait, child: controller)
parent.view.frame.size.height = 1_200

self.scheduler.run()

FBSnapshotVerifyView(parent.view, identifier: "lang_\(language)_device_\(device)")
}
}
}
}

This file was deleted.

5 changes: 4 additions & 1 deletion Kickstarter-iOS/Views/RewardCardContainerView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ public final class RewardCardContainerView: UIView {
|> roundedStyle(cornerRadius: Styles.grid(3))
|> \.layoutMargins .~ .init(all: Styles.grid(3))

_ = self.rewardCardView
|> checkoutWhiteBackgroundStyle

_ = self.gradientView
|> \.backgroundColor .~ .clear
|> \.startPoint .~ .zero
Expand Down Expand Up @@ -108,7 +111,7 @@ public final class RewardCardContainerView: UIView {

internal func configure(with value: (project: Project, reward: Either<Reward, Backing>)) {
self.viewModel.inputs.configureWith(project: value.project, rewardOrBacking: value.reward)
self.rewardCardView.configure(with: value)
self.rewardCardView.configure(with: value, context: RewardCardViewContext.rewardsCollectionView)
}

// MARK: - Private Helpers
Expand Down
Loading

0 comments on commit c1a2d59

Please sign in to comment.