Skip to content

Commit

Permalink
Payment methods (#457)
Browse files Browse the repository at this point in the history
  • Loading branch information
Scollaco authored and justinswart committed Nov 8, 2018
1 parent 3dea5eb commit 6f90116
Show file tree
Hide file tree
Showing 75 changed files with 1,135 additions and 37 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icon--amex.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icon--diners.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icon--discover.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icon--generic.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icon--jcb.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icon--mastercard.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "icon--visa.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "original"
}
}
Binary file not shown.
22 changes: 22 additions & 0 deletions Kickstarter-iOS/DataSources/PaymentMethodsDataSource.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import KsApi
import Library
import UIKit

final class PaymentMethodsDataSource: ValueCellDataSource {

func load(creditCards: [GraphUserCreditCard.CreditCard]) {

self.set(values: creditCards,
cellClass: CreditCardCell.self,
inSection: 0)
}

override func configureCell(tableCell cell: UITableViewCell, withValue value: Any) {
switch (cell, value) {
case let (cell as CreditCardCell, value as GraphUserCreditCard.CreditCard):
cell.configureWith(value: value)
default:
assertionFailure("Unrecognized (cell, viewModel) combo.")
}
}
}
21 changes: 21 additions & 0 deletions Kickstarter-iOS/DataSources/PaymentMethodsDataSourceTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import XCTest
@testable import Kickstarter_Framework
@testable import Library
@testable import KsApi
import Prelude

internal final class PaymentMethodsDataSourceTests: XCTestCase {

let dataSource = PaymentMethodsDataSource()
let tableView = UITableView(frame: .zero)

func testDataSource() {

let cards = GraphUserCreditCard.template.storedCards.nodes
self.dataSource.load(creditCards: cards)

XCTAssertEqual(7, self.dataSource.tableView(self.tableView, numberOfRowsInSection: 0))

XCTAssertEqual("CreditCardCell", self.dataSource.reusableId(item: 0, section: 0))
}
}
2 changes: 2 additions & 0 deletions Kickstarter-iOS/Library/Nib.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import UIKit
public enum Nib: String {
case BackerDashboardEmptyStateCell
case BackerDashboardProjectCell
case CreditCardCell
case DiscoveryPostcardCell
case DiscoveryProjectCategoryView
case FindFriendsCell
case LiveStreamNavTitleView
case LoadingBarButtonItemView
case PaymentMethodsFooterView
case RewardCell
case SettingsCurrencyCell
case SettingsCurrencyPickerCell
Expand Down
3 changes: 2 additions & 1 deletion Kickstarter-iOS/Library/Storyboard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,17 @@ public enum Storyboard: String {
case Login
case Main
case Messages
case PaymentMethods
case Profile
case ProjectActivity
case ProjectPamphlet
case RewardPledge
case Search
case Settings
case SettingsAccount
case SettingsNewsletters
case SettingsNotifications
case SettingsPrivacy
case SettingsNewsletters
case Thanks
case Update
case UpdateDraft
Expand Down
50 changes: 50 additions & 0 deletions Kickstarter-iOS/Views/Cells/CreditCardCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import KsApi
import Library
import Prelude
import ReactiveSwift
import UIKit

internal final class CreditCardCell: UITableViewCell, ValueCell {

private let viewModel: CreditCardCellViewModelType = CreditCardCellViewModel()

@IBOutlet fileprivate weak var cardImageView: UIImageView!
@IBOutlet fileprivate weak var cardNumberLabel: UILabel!
@IBOutlet fileprivate weak var expirationDateLabel: UILabel!
@IBOutlet fileprivate weak var separatorView: UIView!

public func configureWith(value card: GraphUserCreditCard.CreditCard) {
self.viewModel.inputs.configureWith(creditCard: card)
}

override func bindStyles() {
super.bindStyles()

_ = self.cardImageView
|> \.contentMode .~ .scaleAspectFit

_ = self.cardNumberLabel
|> settingsTitleLabelStyle

_ = self.expirationDateLabel
|> settingsDescriptionLabelStyle

_ = self.separatorView
|> separatorStyle
}

override func bindViewModel() {
super.bindViewModel()

self.cardNumberLabel.rac.text = self.viewModel.outputs.cardNumberText
self.expirationDateLabel.rac.text = self.viewModel.outputs.expirationDateText

self.viewModel.outputs.cardImage
.observeForUI()
.observeValues { [weak self] image in
guard let _self = self else { return }
_ = _self.cardImageView
?|> \.image .~ image
}
}
}
107 changes: 107 additions & 0 deletions Kickstarter-iOS/Views/Controllers/PaymentMethodsViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import KsApi
import Library
import Prelude
import UIKit

internal final class PaymentMethodsViewController: UIViewController {

private let dataSource = PaymentMethodsDataSource()
private let viewModel: PaymentMethodsViewModelType = PaymentMethodsViewModel()

@IBOutlet private weak var headerLabel: UILabel!
@IBOutlet private weak var tableView: UITableView!

public static func instantiate() -> PaymentMethodsViewController {
return Storyboard.Settings.instantiate(PaymentMethodsViewController.self)
}

override func viewDidLoad() {
super.viewDidLoad()

self.tableView.dataSource = self.dataSource
self.tableView.delegate = self
self.tableView.register(nib: .CreditCardCell)
self.tableView.registerHeaderFooter(nib: .PaymentMethodsFooterView)

self.viewModel.inputs.viewDidLoad()
self.navigationItem.rightBarButtonItem = UIBarButtonItem(
title: Strings.discovery_favorite_categories_buttons_edit(),
style: .plain,
target: self,
action: nil
)
}

override func bindStyles() {
super.bindStyles()

_ = self
|> settingsViewControllerStyle
|> UIViewController.lens.title %~ { _ in
Strings.Payment_methods()
}

_ = self.headerLabel
|> settingsDescriptionLabelStyle
|> \.text %~ { _ in
Strings.Any_payment_methods_you_saved_to_Kickstarter()
}

_ = self.tableView
|> \.backgroundColor .~ .clear
|> \.estimatedRowHeight .~ Styles.grid(13)
|> \.allowsSelection .~ false
|> \.separatorStyle .~ .none
}

override func bindViewModel() {
super.bindViewModel()

self.viewModel.outputs.paymentMethods
.observeForUI()
.observeValues { [weak self] result in
self?.dataSource.load(creditCards: result)
self?.tableView.reloadData()
}

self.viewModel.outputs.goToAddCardScreen
.observeForUI()
.observeValues { [weak self] in
self?.goToAddCardScreen()
}
}

private func goToAddCardScreen() {
let vc = AddNewCardViewController.instantiate()
let nav = UINavigationController(rootViewController: vc)
nav.modalPresentationStyle = .formSheet

self.present(nav, animated: true, completion: nil)
}
}

extension PaymentMethodsViewController: UITableViewDelegate {

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.1
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return Styles.grid(13)
}

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let footer = tableView.dequeueReusableHeaderFooterView(
withIdentifier: Nib.PaymentMethodsFooterView.rawValue
) as? PaymentMethodsFooterView
footer?.delegate = self
return footer
}
}

extension PaymentMethodsViewController: PaymentMethodsFooterViewDelegate {

internal func paymentMethodsFooterViewDidTapAddNewCardButton(_ footerView: PaymentMethodsFooterView) {
self.viewModel.inputs.paymentMethodsFooterViewDidTapAddNewCardButton()
}
}

0 comments on commit 6f90116

Please sign in to comment.