From 1c11f9daa50664d4ade22f1196c5a36c36b8b1c2 Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Tue, 1 Oct 2019 13:11:00 -0700 Subject: [PATCH 1/8] Move view model property to the top of the properties list --- .../Views/Controllers/ManagePledgeViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift index e9c27129ad..e072c7fc25 100644 --- a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift @@ -6,6 +6,8 @@ import UIKit final class ManagePledgeViewController: UIViewController { // MARK: - Properties + private let viewModel: ManagePledgeViewModelType = ManagePledgeViewModel() + private lazy var closeButton: UIBarButtonItem = { UIBarButtonItem( image: UIImage(named: "icon--cross"), @@ -40,8 +42,6 @@ final class ManagePledgeViewController: UIViewController { |> \.translatesAutoresizingMaskIntoConstraints .~ false }() - private let viewModel = ManagePledgeViewModel() - static func instantiate(with project: Project, reward: Reward) -> ManagePledgeViewController { let manageViewPledgeVC = ManagePledgeViewController.instantiate() manageViewPledgeVC.viewModel.inputs.configureWith(project, reward: reward) From c915ee3732b4e4a192741153faec579948872110 Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Tue, 1 Oct 2019 13:11:55 -0700 Subject: [PATCH 2/8] Prepare reward received vm --- Kickstarter.xcodeproj/project.pbxproj | 18 ++++--- ...ageViewPledgeRewardReceivedViewModel.swift | 52 ++++++++++++++++++ ...ewPledgeRewardReceivedViewModelTests.swift | 53 +++++++++++++++++++ 3 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift create mode 100644 Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift diff --git a/Kickstarter.xcodeproj/project.pbxproj b/Kickstarter.xcodeproj/project.pbxproj index 1f54010f16..191595c8d6 100644 --- a/Kickstarter.xcodeproj/project.pbxproj +++ b/Kickstarter.xcodeproj/project.pbxproj @@ -114,6 +114,8 @@ 3767EDB122CFFF2B0088E8E4 /* ShippingRulesViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3767EDB022CFFF2B0088E8E4 /* ShippingRulesViewModel.swift */; }; 3767EDB322CFFF380088E8E4 /* ShippingRulesViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3767EDB222CFFF380088E8E4 /* ShippingRulesViewModelTests.swift */; }; 3772A4C6229C9E2000EDDC6F /* String+Attributed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3772A4C5229C9E2000EDDC6F /* String+Attributed.swift */; }; + 3777F2F72343C7900030BEF5 /* ManageViewPledgeRewardReceivedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3777F2F62343C7900030BEF5 /* ManageViewPledgeRewardReceivedViewModel.swift */; }; + 3777F2F92343C7AB0030BEF5 /* ManageViewPledgeRewardReceivedViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3777F2F82343C7AB0030BEF5 /* ManageViewPledgeRewardReceivedViewModelTests.swift */; }; 3780C8622208F8C8002117D1 /* SettingsTextInputCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3780C8602208F8C1002117D1 /* SettingsTextInputCell.swift */; }; 378CA24622C4449F004E3C86 /* CountryLenses.swift in Sources */ = {isa = PBXBuildFile; fileRef = 378CA24522C4449F004E3C86 /* CountryLenses.swift */; }; 379C00012242DAFF00F6F0C2 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 379CFFF12242DAC400F6F0C2 /* WebViewController.swift */; }; @@ -309,10 +311,10 @@ 8A072D3A230223B200BA1538 /* UIImage+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A072D39230223B200BA1538 /* UIImage+Color.swift */; }; 8A142EBD23354BFD00FB43AB /* AddNewCardIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A142EBC23354BFD00FB43AB /* AddNewCardIntent.swift */; }; 8A23EF0822F11470001262E1 /* RewardCardContainerViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A23EF0722F11470001262E1 /* RewardCardContainerViewTests.swift */; }; - 8A73EAD9233B00A500FF9051 /* NSMutableAttributedString+SetFontKeepingTraits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A73EAD8233B00A500FF9051 /* NSMutableAttributedString+SetFontKeepingTraits.swift */; }; - 8A73EADE233BE12D00FF9051 /* NSMutableAttributedString+SetFontKeepingTraitsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A73EADD233BE12D00FF9051 /* NSMutableAttributedString+SetFontKeepingTraitsTests.swift */; }; 8A73EACF2339528000FF9051 /* PledgeCreditCardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A73EACE2339528000FF9051 /* PledgeCreditCardViewModel.swift */; }; 8A73EAD12339732900FF9051 /* PledgeCreditCardViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A73EAD02339732900FF9051 /* PledgeCreditCardViewModelTests.swift */; }; + 8A73EAD9233B00A500FF9051 /* NSMutableAttributedString+SetFontKeepingTraits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A73EAD8233B00A500FF9051 /* NSMutableAttributedString+SetFontKeepingTraits.swift */; }; + 8A73EADE233BE12D00FF9051 /* NSMutableAttributedString+SetFontKeepingTraitsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A73EADD233BE12D00FF9051 /* NSMutableAttributedString+SetFontKeepingTraitsTests.swift */; }; 8A8099EB22E213F100373E66 /* RewardCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A8099E922E213F100373E66 /* RewardCardView.swift */; }; 8A8099EC22E213F100373E66 /* RewardCardContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A8099EA22E213F100373E66 /* RewardCardContainerView.swift */; }; 8A8099F122E2142C00373E66 /* RewardCardViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A8099ED22E2142C00373E66 /* RewardCardViewModel.swift */; }; @@ -1477,6 +1479,8 @@ 3767EDB022CFFF2B0088E8E4 /* ShippingRulesViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingRulesViewModel.swift; sourceTree = ""; }; 3767EDB222CFFF380088E8E4 /* ShippingRulesViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShippingRulesViewModelTests.swift; sourceTree = ""; }; 3772A4C5229C9E2000EDDC6F /* String+Attributed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Attributed.swift"; sourceTree = ""; }; + 3777F2F62343C7900030BEF5 /* ManageViewPledgeRewardReceivedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManageViewPledgeRewardReceivedViewModel.swift; sourceTree = ""; }; + 3777F2F82343C7AB0030BEF5 /* ManageViewPledgeRewardReceivedViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManageViewPledgeRewardReceivedViewModelTests.swift; sourceTree = ""; }; 3780C8602208F8C1002117D1 /* SettingsTextInputCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsTextInputCell.swift; sourceTree = ""; }; 378CA24522C4449F004E3C86 /* CountryLenses.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountryLenses.swift; sourceTree = ""; }; 379CFFEA2242DAC200F6F0C2 /* UIImageView+URL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIImageView+URL.swift"; sourceTree = ""; }; @@ -1673,10 +1677,10 @@ 8A072D39230223B200BA1538 /* UIImage+Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Color.swift"; sourceTree = ""; }; 8A142EBC23354BFD00FB43AB /* AddNewCardIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddNewCardIntent.swift; sourceTree = ""; }; 8A23EF0722F11470001262E1 /* RewardCardContainerViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewardCardContainerViewTests.swift; sourceTree = ""; }; - 8A73EAD8233B00A500FF9051 /* NSMutableAttributedString+SetFontKeepingTraits.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMutableAttributedString+SetFontKeepingTraits.swift"; sourceTree = ""; }; - 8A73EADD233BE12D00FF9051 /* NSMutableAttributedString+SetFontKeepingTraitsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMutableAttributedString+SetFontKeepingTraitsTests.swift"; sourceTree = ""; }; 8A73EACE2339528000FF9051 /* PledgeCreditCardViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PledgeCreditCardViewModel.swift; sourceTree = ""; }; 8A73EAD02339732900FF9051 /* PledgeCreditCardViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PledgeCreditCardViewModelTests.swift; sourceTree = ""; }; + 8A73EAD8233B00A500FF9051 /* NSMutableAttributedString+SetFontKeepingTraits.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMutableAttributedString+SetFontKeepingTraits.swift"; sourceTree = ""; }; + 8A73EADD233BE12D00FF9051 /* NSMutableAttributedString+SetFontKeepingTraitsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMutableAttributedString+SetFontKeepingTraitsTests.swift"; sourceTree = ""; }; 8A8099E922E213F100373E66 /* RewardCardView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RewardCardView.swift; sourceTree = ""; }; 8A8099EA22E213F100373E66 /* RewardCardContainerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RewardCardContainerView.swift; sourceTree = ""; }; 8A8099ED22E2142C00373E66 /* RewardCardViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RewardCardViewModel.swift; sourceTree = ""; }; @@ -3565,10 +3569,10 @@ A7ED1F931E831C5C00BFFA01 /* LoginViewModelTests.swift */, D65BF350232FE88300B15B25 /* ManagePledgeSummaryViewModel.swift */, D65BF352233023E400B15B25 /* ManagePledgeSummaryViewModelTests.swift */, - D67DF563232ABB950051D207 /* ManageViewPledgeViewModel.swift */, - D61440FD23200F09002A6507 /* ManageViewPledgeViewModelTests.swift */, D67DF563232ABB950051D207 /* ManagePledgeViewModel.swift */, D61440FD23200F09002A6507 /* ManagePledgeViewModelTests.swift */, + 3777F2F62343C7900030BEF5 /* ManageViewPledgeRewardReceivedViewModel.swift */, + 3777F2F82343C7AB0030BEF5 /* ManageViewPledgeRewardReceivedViewModelTests.swift */, D04AAC1B218BB70C00CF713E /* MessageBannerViewModel.swift */, D04AAC11218BB70A00CF713E /* MessageBannerViewModelTests.swift */, A7F4419B1D005A9400FE6FC5 /* MessageCellViewModel.swift */, @@ -4774,6 +4778,7 @@ A7EDEE571D83453F00780B34 /* PKPaymentAuthorizationViewController+Helpers.swift in Sources */, D0237C2622BD7B540092C792 /* PledgeSummaryViewModel.swift in Sources */, 01A7A4C01C9690220036E553 /* UITextField+LocalizedPlaceholderKey.swift in Sources */, + 3777F2F72343C7900030BEF5 /* ManageViewPledgeRewardReceivedViewModel.swift in Sources */, 0176E13B1C9742FD009CA092 /* UIBarButtonItem.swift in Sources */, D63BBD35217FAB85007E01F0 /* PaymentMethodsViewModel.swift in Sources */, 8001D4C91D415692009E6667 /* UpdateDraftStyles.swift in Sources */, @@ -4860,6 +4865,7 @@ A7ED1FDE1E831C5C00BFFA01 /* DiscoveryExpandableRowCellViewModelTests.swift in Sources */, D6534D3E22E789B900E9D279 /* PledgePaymentMethodsViewModelTests.swift in Sources */, A7ED1FC41E831C5C00BFFA01 /* ProjectActivitySuccessCellViewModelTests.swift in Sources */, + 3777F2F92343C7AB0030BEF5 /* ManageViewPledgeRewardReceivedViewModelTests.swift in Sources */, A7ED1FE31E831C5C00BFFA01 /* FindFriendsFaceookConnectCellViewModelTests.swift in Sources */, D04AACAF218BB72100CF713E /* SettingsViewModelTests.swift in Sources */, A7ED1FDA1E831C5C00BFFA01 /* DeprecatedRewardPledgeViewModelTests.swift in Sources */, diff --git a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift new file mode 100644 index 0000000000..65309eb694 --- /dev/null +++ b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift @@ -0,0 +1,52 @@ +import Foundation +import KsApi +import Prelude +import ReactiveSwift + +public protocol ManageViewPledgeRewardReceivedViewModelInputs { + func configureWith(_ project: Project) + func viewDidLoad() +} + +public protocol ManageViewPledgeRewardReceivedViewModelOutputs { + var rewardReceived: Signal { get } +} + +public protocol ManageViewPledgeRewardReceivedViewModelType { + var inputs: ManageViewPledgeRewardReceivedViewModelInputs { get } + var outputs: ManageViewPledgeRewardReceivedViewModelOutputs { get } +} + +public class ManageViewPledgeRewardReceivedViewModel: + ManageViewPledgeRewardReceivedViewModelType, + ManageViewPledgeRewardReceivedViewModelInputs, +ManageViewPledgeRewardReceivedViewModelOutputs { + public init() { + let project = Signal.combineLatest( + self.configureWithProjectProperty.signal, + self.viewDidLoadSignal + ) + .map(first) + .skipNil() + + self.rewardReceived = project + .map { $0.personalization.backing?.backerCompleted } + .map { $0.coalesceWith(false) } + } + + private let configureWithProjectProperty = MutableProperty(nil) + public func configureWith(_ project: Project) { + self.configureWithProjectProperty.value = project + } + + private let (viewDidLoadSignal, viewDidLoadObserver) = Signal<(), Never>.pipe() + public func viewDidLoad() { + self.viewDidLoadObserver.send(value: ()) + } + + + public let rewardReceived: Signal + + public var inputs: ManageViewPledgeRewardReceivedViewModelInputs { return self } + public var outputs: ManageViewPledgeRewardReceivedViewModelOutputs { return self } +} diff --git a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift new file mode 100644 index 0000000000..f407cb8452 --- /dev/null +++ b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift @@ -0,0 +1,53 @@ +import Foundation +@testable import KsApi +@testable import Library +import Prelude +import ReactiveExtensions +import ReactiveExtensions_TestHelpers +import ReactiveSwift +import XCTest + +final class ManageViewPledgeRewardReceivedViewModelTests: TestCase { + let vm: ManageViewPledgeRewardReceivedViewModelType = ManageViewPledgeRewardReceivedViewModel() + + let rewardReceived = TestObserver() + + override func setUp() { + super.setUp() + + self.vm.outputs.rewardReceived.observe(self.rewardReceived.observer) + } + + func testRewardReceived_NoBacking() { + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ nil + + self.vm.inputs.configureWith(project) + + self.rewardReceived.assertValues([false]) + } + + func testRewardReceived_NotReceived() { + let backing = Backing.template + |> Backing.lens.backerCompleted .~ false + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project) + + self.rewardReceived.assertValues([false]) + } + + func testRewardReceived_Received() { + let backing = Backing.template + |> Backing.lens.backerCompleted .~ true + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project) + + self.rewardReceived.assertValues([true]) + } +} From f4367793bb22e1cc232fc7633262436f72702cba Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Tue, 1 Oct 2019 13:12:39 -0700 Subject: [PATCH 3/8] Hook up reward received view model --- .../ManagePledgeViewController.swift | 6 ++++ ...ewPledgeRewardReceivedViewController.swift | 32 +++++++++++++++++++ .../ViewModels/ManagePledgeViewModel.swift | 15 +++++---- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift index e072c7fc25..f3fda9c353 100644 --- a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift @@ -118,6 +118,12 @@ final class ManagePledgeViewController: UIViewController { self?.pledgeSummaryView.configureWith(project) } + self.viewModel.outputs.configureRewardReceivedWithProject + .observeForControllerAction() + .observeValues { [weak self] project in + self?.rewardReceivedViewController.configureWith(project: project) + } + self.viewModel.outputs.configureRewardSummaryView .observeForUI() .observeValues { _ in } diff --git a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift index d38d953525..7301128dcd 100644 --- a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift @@ -1,8 +1,28 @@ import Library +import KsApi import Prelude import UIKit final class ManageViewPledgeRewardReceivedViewController: ToggleViewController { + // MARK: - Properties + + private let viewModel: ManageViewPledgeRewardReceivedViewModelType + = ManageViewPledgeRewardReceivedViewModel() + + // MARK: - Lifecycle + + override func viewDidLoad() { + super.viewDidLoad() + + self.viewModel.inputs.viewDidLoad() + } + + // MARK: - Configuration + + public func configureWith(project: Project) { + self.viewModel.inputs.configureWith(project) + } + // MARK: - Styles override func bindStyles() { @@ -15,4 +35,16 @@ final class ManageViewPledgeRewardReceivedViewController: ToggleViewController { _ = self.toggle |> checkoutSwitchControlStyle } + + // MARK: - View model + + override func bindViewModel() { + super.bindViewModel() + + self.viewModel.outputs.rewardReceived + .observeForUI() + .observeValues { [weak self] isOn in + self?.toggle.isOn = isOn + } + } } diff --git a/Library/ViewModels/ManagePledgeViewModel.swift b/Library/ViewModels/ManagePledgeViewModel.swift index 430761948a..67ebaae039 100644 --- a/Library/ViewModels/ManagePledgeViewModel.swift +++ b/Library/ViewModels/ManagePledgeViewModel.swift @@ -21,13 +21,13 @@ public protocol ManagePledgeViewModelInputs { public protocol ManagePledgeViewModelOutputs { var configurePaymentMethodView: Signal { get } var configurePledgeSummaryView: Signal { get } + var configureRewardReceivedWithProject: Signal { get } var configureRewardSummaryView: Signal { get } var goToCancelPledge: Signal<(Project, Backing), Never> { get } var goToChangePaymentMethod: Signal { get } var goToContactCreator: Signal { get } var goToRewards: Signal { get } var goToUpdatePledge: Signal<(Project, Reward), Never> { get } - var showActionSheetMenuWithOptions: Signal<[ManagePledgeAlertAction], Never> { get } var title: Signal { get } } @@ -43,6 +43,11 @@ public final class ManagePledgeViewModel: let projectAndReward = self.projectAndRewardSignal .takeWhen(self.viewDidLoadSignal.ignoreValues()) + let project = projectAndReward.map(first) + let backing = project + .map { $0.personalization.backing } + .skipNil() + self.title = projectAndReward .map(first) .map(navigationBarTitle(with:)) @@ -53,14 +58,11 @@ public final class ManagePledgeViewModel: self.configurePledgeSummaryView = projectAndReward .map(first) + self.configureRewardReceivedWithProject = project + self.configureRewardSummaryView = projectAndReward .map(second) - let project = projectAndReward.map(first) - let backing = project - .map { $0.personalization.backing } - .skipNil() - self.showActionSheetMenuWithOptions = project .takeWhen(self.menuButtonTappedSignal) .map { project -> [ManagePledgeAlertAction] in @@ -116,6 +118,7 @@ public final class ManagePledgeViewModel: public let configurePaymentMethodView: Signal public let configurePledgeSummaryView: Signal + public let configureRewardReceivedWithProject: Signal public let configureRewardSummaryView: Signal public let goToCancelPledge: Signal<(Project, Backing), Never> public let goToChangePaymentMethod: Signal From c9c4b386d11a4fa3f9f163cbb0bd6eab9214be4f Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Tue, 1 Oct 2019 13:13:07 -0700 Subject: [PATCH 4/8] Update snapshot tests --- ...dgeRewardReceivedViewControllerTests.swift | 32 +++++++++++++++--- ...View_Toggle_Off_lang_en_device_pad@2x.png} | Bin ...le_Off_lang_en_device_phone4_7inch@2x.png} | Bin ...le_Off_lang_en_device_phone5_8inch@2x.png} | Bin ...tView_Toggle_On_lang_en_device_pad@2x.png} | Bin ...gle_On_lang_en_device_phone4_7inch@2x.png} | Bin ...gle_On_lang_en_device_phone5_8inch@2x.png} | Bin .../testView_lang_en_device_pad@2x.png | Bin 12823 -> 0 bytes ...estView_lang_en_device_phone4_7inch@2x.png | Bin 10542 -> 0 bytes ...estView_lang_en_device_phone5_8inch@2x.png | Bin 10542 -> 0 bytes 10 files changed, 27 insertions(+), 5 deletions(-) rename Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/{testView_lang_en_device_pad_toggle_false@2x.png => testView_Toggle_Off_lang_en_device_pad@2x.png} (100%) rename Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/{testView_lang_en_device_phone4_7inch_toggle_false@2x.png => testView_Toggle_Off_lang_en_device_phone4_7inch@2x.png} (100%) rename Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/{testView_lang_en_device_phone5_8inch_toggle_false@2x.png => testView_Toggle_Off_lang_en_device_phone5_8inch@2x.png} (100%) rename Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/{testView_lang_en_device_pad_toggle_true@2x.png => testView_Toggle_On_lang_en_device_pad@2x.png} (100%) rename Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/{testView_lang_en_device_phone4_7inch_toggle_true@2x.png => testView_Toggle_On_lang_en_device_phone4_7inch@2x.png} (100%) rename Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/{testView_lang_en_device_phone5_8inch_toggle_true@2x.png => testView_Toggle_On_lang_en_device_phone5_8inch@2x.png} (100%) delete mode 100644 Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_pad@2x.png delete mode 100644 Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone4_7inch@2x.png delete mode 100644 Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone5_8inch@2x.png diff --git a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewControllerTests.swift b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewControllerTests.swift index f8cf209f2f..b8fb42b479 100644 --- a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewControllerTests.swift +++ b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewControllerTests.swift @@ -1,5 +1,7 @@ @testable import Kickstarter_Framework +@testable import KsApi @testable import Library +import Prelude import UIKit final class ManageViewPledgeRewardReceivedViewControllerTests: TestCase { @@ -17,20 +19,40 @@ final class ManageViewPledgeRewardReceivedViewControllerTests: TestCase { super.tearDown() } - func testView() { + func testView_Toggle_Off() { let devices = [Device.phone4_7inch, Device.phone5_8inch, Device.pad] - let toggleStates = [true, false] - combos([Language.en], devices, toggleStates).forEach { language, device, toggleState in + combos([Language.en], devices).forEach { language, device in withEnvironment(language: language) { let controller = ManageViewPledgeRewardReceivedViewController.instantiate() - controller.toggle.setOn(toggleState, animated: false) + controller.configureWith(project: .template) let (parent, _) = traitControllers(device: device, orientation: .portrait, child: controller) parent.view.frame.size.height = 60 FBSnapshotVerifyView( - parent.view, identifier: "lang_\(language)_device_\(device)_toggle_\(toggleState)" + parent.view, identifier: "lang_\(language)_device_\(device)" + ) + } + } + } + + func testView_Toggle_On() { + let devices = [Device.phone4_7inch, Device.phone5_8inch, Device.pad] + combos([Language.en], devices).forEach { language, device in + withEnvironment(language: language) { + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ .template + + let controller = ManageViewPledgeRewardReceivedViewController.instantiate() + controller.configureWith(project: project) + + let (parent, _) = traitControllers(device: device, orientation: .portrait, child: controller) + + parent.view.frame.size.height = 60 + + FBSnapshotVerifyView( + parent.view, identifier: "lang_\(language)_device_\(device)" ) } } diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_pad_toggle_false@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_Off_lang_en_device_pad@2x.png similarity index 100% rename from Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_pad_toggle_false@2x.png rename to Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_Off_lang_en_device_pad@2x.png diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone4_7inch_toggle_false@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_Off_lang_en_device_phone4_7inch@2x.png similarity index 100% rename from Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone4_7inch_toggle_false@2x.png rename to Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_Off_lang_en_device_phone4_7inch@2x.png diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone5_8inch_toggle_false@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_Off_lang_en_device_phone5_8inch@2x.png similarity index 100% rename from Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone5_8inch_toggle_false@2x.png rename to Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_Off_lang_en_device_phone5_8inch@2x.png diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_pad_toggle_true@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_On_lang_en_device_pad@2x.png similarity index 100% rename from Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_pad_toggle_true@2x.png rename to Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_On_lang_en_device_pad@2x.png diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone4_7inch_toggle_true@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_On_lang_en_device_phone4_7inch@2x.png similarity index 100% rename from Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone4_7inch_toggle_true@2x.png rename to Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_On_lang_en_device_phone4_7inch@2x.png diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone5_8inch_toggle_true@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_On_lang_en_device_phone5_8inch@2x.png similarity index 100% rename from Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone5_8inch_toggle_true@2x.png rename to Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_Toggle_On_lang_en_device_phone5_8inch@2x.png diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_pad@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_pad@2x.png deleted file mode 100644 index 0ee24eb8c317a071e80d4042ca9e0c791fc6bdbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12823 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 Ym5J!I+41v2r+|R*rK|d-7o4L13$4sGq5uE@ diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone4_7inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone4_7inch@2x.png deleted file mode 100644 index de02f231558a7eb6f70dcc780c0964169201a702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10542 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 diff --git a/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone5_8inch@2x.png b/Screenshots/_64/Kickstarter_Framework_iOSTests.ManageViewPledgeRewardReceivedViewControllerTests/testView_lang_en_device_phone5_8inch@2x.png deleted file mode 100644 index de02f231558a7eb6f70dcc780c0964169201a702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10542 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 From bffa468d553e1cbd24acd40bcbdea66bf43cb1cb Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Tue, 1 Oct 2019 14:47:53 -0700 Subject: [PATCH 5/8] Hook up toggle to actual api call --- ...ewPledgeRewardReceivedViewController.swift | 8 +++++ ...ageViewPledgeRewardReceivedViewModel.swift | 36 ++++++++++++++++++- ...ewPledgeRewardReceivedViewModelTests.swift | 30 ++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift index 7301128dcd..0c9301c4c8 100644 --- a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift @@ -14,9 +14,17 @@ final class ManageViewPledgeRewardReceivedViewController: ToggleViewController { override func viewDidLoad() { super.viewDidLoad() + self.toggle.addTarget(self, action: #selector(toggleValueDidChange(_:)), for: .valueChanged) + self.viewModel.inputs.viewDidLoad() } + // MARK: - Actions + + @objc private func toggleValueDidChange(_ toggle: UISwitch) { + self.viewModel.inputs.rewardReceivedToggleTapped(isOn: toggle.isOn) + } + // MARK: - Configuration public func configureWith(project: Project) { diff --git a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift index 65309eb694..255d708825 100644 --- a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift +++ b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift @@ -5,6 +5,7 @@ import ReactiveSwift public protocol ManageViewPledgeRewardReceivedViewModelInputs { func configureWith(_ project: Project) + func rewardReceivedToggleTapped(isOn: Bool) func viewDidLoad() } @@ -29,9 +30,37 @@ ManageViewPledgeRewardReceivedViewModelOutputs { .map(first) .skipNil() - self.rewardReceived = project + let backer = project + .map { _ in AppEnvironment.current.currentUser } + .skipNil() + + let rewardReceivedEvent = Signal.combineLatest( + project, + backer + ) + .takePairWhen(self.rewardReceivedToggleTappedProperty.signal) + .map(unpack) + .switchMap { project, backer, received in + AppEnvironment.current.apiService.backingUpdate( + forProject: project, forUser: backer, received: received + ) + .ksr_delay(AppEnvironment.current.apiDelayInterval, on: AppEnvironment.current.scheduler) + .materialize() + } + + let markedReceivedBacking = rewardReceivedEvent.values().map { $0 } + + let initialRewardReceived = project .map { $0.personalization.backing?.backerCompleted } .map { $0.coalesceWith(false) } + + let updatedRewardReceived = markedReceivedBacking + .map { $0.backerCompleted.coalesceWith(false) } + + self.rewardReceived = Signal.merge( + initialRewardReceived, + updatedRewardReceived + ) } private let configureWithProjectProperty = MutableProperty(nil) @@ -39,6 +68,11 @@ ManageViewPledgeRewardReceivedViewModelOutputs { self.configureWithProjectProperty.value = project } + private let rewardReceivedToggleTappedProperty = MutableProperty(false) + public func rewardReceivedToggleTapped(isOn: Bool) { + self.rewardReceivedToggleTappedProperty.value = isOn + } + private let (viewDidLoadSignal, viewDidLoadObserver) = Signal<(), Never>.pipe() public func viewDidLoad() { self.viewDidLoadObserver.send(value: ()) diff --git a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift index f407cb8452..24e66b9290 100644 --- a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift +++ b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModelTests.swift @@ -23,6 +23,7 @@ final class ManageViewPledgeRewardReceivedViewModelTests: TestCase { |> Project.lens.personalization .. Project.Personalization.lens.backing .~ nil self.vm.inputs.configureWith(project) + self.vm.inputs.viewDidLoad() self.rewardReceived.assertValues([false]) } @@ -35,6 +36,7 @@ final class ManageViewPledgeRewardReceivedViewModelTests: TestCase { |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing self.vm.inputs.configureWith(project) + self.vm.inputs.viewDidLoad() self.rewardReceived.assertValues([false]) } @@ -47,7 +49,35 @@ final class ManageViewPledgeRewardReceivedViewModelTests: TestCase { |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing self.vm.inputs.configureWith(project) + self.vm.inputs.viewDidLoad() self.rewardReceived.assertValues([true]) } + + func testRewardReceived_Toggle() { + let backing = Backing.template + |> Backing.lens.backerCompleted .~ false + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + withEnvironment(apiService: MockService(backingUpdate: .template), currentUser: User.template) { + self.vm.inputs.configureWith(project) + self.vm.inputs.viewDidLoad() + + self.rewardReceived.assertValues([false]) + + self.vm.inputs.rewardReceivedToggleTapped(isOn: true) + + self.scheduler.advance(by: AppEnvironment.current.apiDelayInterval) + + self.rewardReceived.assertValues([false, true]) + + self.vm.inputs.rewardReceivedToggleTapped(isOn: false) + + self.scheduler.advance(by: AppEnvironment.current.apiDelayInterval) + + self.rewardReceived.assertValues([false, true, false]) + } + } } From e0b2eb9b79d641be7a40af5a64aa990b845465ad Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Tue, 1 Oct 2019 15:40:31 -0700 Subject: [PATCH 6/8] Hide reward received toggle section appropriately --- .../ManagePledgeViewController.swift | 10 +- .../ProjectPamphletViewController.swift | 11 +- .../ViewModels/ManagePledgeViewModel.swift | 5 + .../ManagePledgeViewModelTests.swift | 160 ++++++++++++++++++ 4 files changed, 175 insertions(+), 11 deletions(-) diff --git a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift index f3fda9c353..8f10950614 100644 --- a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift @@ -42,13 +42,6 @@ final class ManagePledgeViewController: UIViewController { |> \.translatesAutoresizingMaskIntoConstraints .~ false }() - 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() { @@ -100,6 +93,9 @@ final class ManagePledgeViewController: UIViewController { override func bindViewModel() { super.bindViewModel() + self.rewardReceivedViewController.view.rac.hidden = + self.viewModel.outputs.rewardReceivedViewControllerViewIsHidden + self.viewModel.outputs.title .observeForUI() .observeValues { [weak self] title in diff --git a/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift b/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift index c415dbb313..1a41b9bcbf 100644 --- a/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift @@ -207,14 +207,17 @@ public final class ProjectPamphletViewController: UIViewController { } private func goToManageViewPledge(project: Project, reward: Reward, refTag _: RefTag?) { - let managePledgeViewController = ManagePledgeViewController.instantiate(with: project, reward: reward) + let vc = ManagePledgeViewController.instantiate() + vc.configureWith(project: project, reward: reward) + + let nc = RewardPledgeNavigationController(rootViewController: vc) - let nav = RewardPledgeNavigationController(rootViewController: managePledgeViewController) if AppEnvironment.current.device.userInterfaceIdiom == .pad { - _ = nav + _ = nc |> \.modalPresentationStyle .~ .formSheet } - self.present(nav, animated: true) + + self.present(nc, animated: true) } private func goToDeprecatedManagePledge(project: Project, reward: Reward, refTag _: RefTag?) { diff --git a/Library/ViewModels/ManagePledgeViewModel.swift b/Library/ViewModels/ManagePledgeViewModel.swift index 67ebaae039..7d01a555d1 100644 --- a/Library/ViewModels/ManagePledgeViewModel.swift +++ b/Library/ViewModels/ManagePledgeViewModel.swift @@ -28,6 +28,7 @@ public protocol ManagePledgeViewModelOutputs { var goToContactCreator: Signal { get } var goToRewards: Signal { get } var goToUpdatePledge: Signal<(Project, Reward), Never> { get } + var rewardReceivedViewControllerViewIsHidden: Signal { get } var showActionSheetMenuWithOptions: Signal<[ManagePledgeAlertAction], Never> { get } var title: Signal { get } } @@ -93,6 +94,9 @@ public final class ManagePledgeViewModel: self.goToChangePaymentMethod = self.menuOptionSelectedSignal .filter { $0 == .changePaymentMethod } .ignoreValues() + + self.rewardReceivedViewControllerViewIsHidden = projectAndReward + .map { project, reward in reward.isNoReward || project.personalization.backing?.status != .collected } } private let (projectAndRewardSignal, projectAndRewardObserver) = Signal<(Project, Reward), Never>.pipe() @@ -125,6 +129,7 @@ public final class ManagePledgeViewModel: public let goToContactCreator: Signal public let goToRewards: Signal public let goToUpdatePledge: Signal<(Project, Reward), Never> + public let rewardReceivedViewControllerViewIsHidden: Signal public let showActionSheetMenuWithOptions: Signal<[ManagePledgeAlertAction], Never> public let title: Signal diff --git a/Library/ViewModels/ManagePledgeViewModelTests.swift b/Library/ViewModels/ManagePledgeViewModelTests.swift index 846bb1d685..aee7c31cfd 100644 --- a/Library/ViewModels/ManagePledgeViewModelTests.swift +++ b/Library/ViewModels/ManagePledgeViewModelTests.swift @@ -19,6 +19,7 @@ internal final class ManagePledgeViewModelTests: TestCase { private let goToRewards = TestObserver() private let goToUpdatePledgeProject = TestObserver() private let goToUpdatePledgeReward = TestObserver() + private let rewardReceivedViewControllerViewIsHidden = TestObserver() private let showActionSheetMenuWithOptions = TestObserver<[ManagePledgeAlertAction], Never>() private let title = TestObserver() @@ -38,6 +39,9 @@ internal final class ManagePledgeViewModelTests: TestCase { self.vm.outputs.goToRewards.observe(self.goToRewards.observer) self.vm.outputs.goToUpdatePledge.map(first).observe(self.goToUpdatePledgeProject.observer) self.vm.outputs.goToUpdatePledge.map(second).observe(self.goToUpdatePledgeReward.observer) + self.vm.outputs.rewardReceivedViewControllerViewIsHidden.observe( + self.rewardReceivedViewControllerViewIsHidden.observer + ) self.vm.outputs.showActionSheetMenuWithOptions.observe(self.showActionSheetMenuWithOptions.observer) } @@ -191,4 +195,160 @@ internal final class ManagePledgeViewModelTests: TestCase { self.goToUpdatePledgeProject.assertValues([Project.template]) self.goToUpdatePledgeReward.assertValues([Reward.template]) } + + func testRewardReceivedViewControllerIsHidden_NoReward_Canceled() { + let backing = Backing.template + |> Backing.lens.status .~ .canceled + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: Reward.noReward) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_NoReward_Collected() { + let backing = Backing.template + |> Backing.lens.status .~ .collected + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: Reward.noReward) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_NoReward_Dropped() { + let backing = Backing.template + |> Backing.lens.status .~ .dropped + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: Reward.noReward) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_NoReward_Errored() { + let backing = Backing.template + |> Backing.lens.status .~ .errored + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: Reward.noReward) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_NoReward_Pledged() { + let backing = Backing.template + |> Backing.lens.status .~ .pledged + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: Reward.noReward) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_NoReward_Preauth() { + let backing = Backing.template + |> Backing.lens.status .~ .preauth + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: Reward.noReward) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_Reward_Canceled() { + let backing = Backing.template + |> Backing.lens.status .~ .preauth + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: .template) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_Reward_Collected() { + let backing = Backing.template + |> Backing.lens.status .~ .collected + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: .template) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([false]) + } + + func testRewardReceivedViewControllerIsHidden_Reward_Dropped() { + let backing = Backing.template + |> Backing.lens.status .~ .dropped + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: .template) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_Reward_Errored() { + let backing = Backing.template + |> Backing.lens.status .~ .errored + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: .template) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_Reward_Pledged() { + let backing = Backing.template + |> Backing.lens.status .~ .pledged + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: .template) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } + + func testRewardReceivedViewControllerIsHidden_Reward_Preauth() { + let backing = Backing.template + |> Backing.lens.status .~ .preauth + + let project = Project.template + |> Project.lens.personalization .. Project.Personalization.lens.backing .~ backing + + self.vm.inputs.configureWith(project, reward: .template) + self.vm.inputs.viewDidLoad() + + self.rewardReceivedViewControllerViewIsHidden.assertValues([true]) + } } From 7ecdd46d724f62140f8288fa70f129317250645c Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Tue, 1 Oct 2019 15:51:38 -0700 Subject: [PATCH 7/8] Format code --- .../Views/Controllers/ManagePledgeViewController.swift | 2 +- .../ManageViewPledgeRewardReceivedViewController.swift | 10 +++++++--- .../Controllers/ProjectPamphletViewController.swift | 2 +- .../ManageViewPledgeRewardReceivedViewModel.swift | 3 +-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift index 08cd98f214..c280b2c7ab 100644 --- a/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManagePledgeViewController.swift @@ -115,7 +115,7 @@ final class ManagePledgeViewController: UIViewController { .observeForControllerAction() .observeValues { [weak self] project in self?.rewardReceivedViewController.configureWith(project: project) - } + } self.viewModel.outputs.configureRewardSummaryView .observeForUI() diff --git a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift index 0c9301c4c8..71e884c45e 100644 --- a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift @@ -1,5 +1,5 @@ -import Library import KsApi +import Library import Prelude import UIKit @@ -14,7 +14,11 @@ final class ManageViewPledgeRewardReceivedViewController: ToggleViewController { override func viewDidLoad() { super.viewDidLoad() - self.toggle.addTarget(self, action: #selector(toggleValueDidChange(_:)), for: .valueChanged) + self.toggle.addTarget( + self, + action: #selector(ManageViewPledgeRewardReceivedViewController.toggleValueDidChange(_:)), + for: .valueChanged + ) self.viewModel.inputs.viewDidLoad() } @@ -53,6 +57,6 @@ final class ManageViewPledgeRewardReceivedViewController: ToggleViewController { .observeForUI() .observeValues { [weak self] isOn in self?.toggle.isOn = isOn - } + } } } diff --git a/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift b/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift index 1a41b9bcbf..c1fd009287 100644 --- a/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift @@ -216,7 +216,7 @@ public final class ProjectPamphletViewController: UIViewController { _ = nc |> \.modalPresentationStyle .~ .formSheet } - + self.present(nc, animated: true) } diff --git a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift index 255d708825..529a5dd253 100644 --- a/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift +++ b/Library/ViewModels/ManageViewPledgeRewardReceivedViewModel.swift @@ -21,7 +21,7 @@ public protocol ManageViewPledgeRewardReceivedViewModelType { public class ManageViewPledgeRewardReceivedViewModel: ManageViewPledgeRewardReceivedViewModelType, ManageViewPledgeRewardReceivedViewModelInputs, -ManageViewPledgeRewardReceivedViewModelOutputs { + ManageViewPledgeRewardReceivedViewModelOutputs { public init() { let project = Signal.combineLatest( self.configureWithProjectProperty.signal, @@ -78,7 +78,6 @@ ManageViewPledgeRewardReceivedViewModelOutputs { self.viewDidLoadObserver.send(value: ()) } - public let rewardReceived: Signal public var inputs: ManageViewPledgeRewardReceivedViewModelInputs { return self } From de9c7dc0b832445c3ae497d8de7dc5ab71dc46c5 Mon Sep 17 00:00:00 2001 From: Pavel Dusatko Date: Thu, 3 Oct 2019 10:31:14 -0700 Subject: [PATCH 8/8] Use reactive extension instead of observing value change --- .../ManageViewPledgeRewardReceivedViewController.swift | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift index 71e884c45e..3ccc6e62fa 100644 --- a/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ManageViewPledgeRewardReceivedViewController.swift @@ -53,10 +53,6 @@ final class ManageViewPledgeRewardReceivedViewController: ToggleViewController { override func bindViewModel() { super.bindViewModel() - self.viewModel.outputs.rewardReceived - .observeForUI() - .observeValues { [weak self] isOn in - self?.toggle.isOn = isOn - } + self.toggle.rac.on = self.viewModel.outputs.rewardReceived } }