From c537e5e798e5116888f14a6644b1ba6f136f888f Mon Sep 17 00:00:00 2001 From: Justin Swart Date: Wed, 19 Feb 2020 11:20:03 -0800 Subject: [PATCH 1/2] Pop project pamphlet to root VC after project is backed --- .../Controllers/ProjectPamphletViewController.swift | 6 ++++++ Library/ViewModels/ProjectPamphletViewModel.swift | 6 ++++++ .../ViewModels/ProjectPamphletViewModelTests.swift | 13 +++++++++++++ 3 files changed, 25 insertions(+) diff --git a/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift b/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift index ecfa94d9b4..0a1ca3a089 100644 --- a/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift +++ b/Kickstarter-iOS/Views/Controllers/ProjectPamphletViewController.swift @@ -164,6 +164,12 @@ public final class ProjectPamphletViewController: UIViewController, MessageBanne self?.messageBannerViewController?.showBanner(with: .success, message: message) }) } + + self.viewModel.outputs.popToRootViewController + .observeForControllerAction() + .observeValues { [weak self] in + self?.navigationController?.popToRootViewController(animated: false) + } } public override func willTransition( diff --git a/Library/ViewModels/ProjectPamphletViewModel.swift b/Library/ViewModels/ProjectPamphletViewModel.swift index 4885e5d0f4..da59ee2a09 100644 --- a/Library/ViewModels/ProjectPamphletViewModel.swift +++ b/Library/ViewModels/ProjectPamphletViewModel.swift @@ -50,6 +50,9 @@ public protocol ProjectPamphletViewModelOutputs { /// Emits a project and refTag to be used to navigate to the reward selection screen. var goToRewards: Signal<(Project, RefTag?), Never> { get } + /// Emits when the navigation stack should be popped to the root view controller. + var popToRootViewController: Signal<(), Never> { get } + /// Emits two booleans that determine if the navigation bar should be hidden, and if it should be animated. var setNavigationBarHiddenAnimated: Signal<(Bool, Bool), Never> { get } @@ -70,6 +73,8 @@ public final class ProjectPamphletViewModel: ProjectPamphletViewModelType, Proje public init() { let isLoading = MutableProperty(false) + self.popToRootViewController = self.didBackProjectProperty.signal.ignoreValues() + let freshProjectAndRefTagEvent = self.configDataProperty.signal.skipNil() .takePairWhen(Signal.merge( self.viewDidLoadProperty.signal.mapConst(true), @@ -263,6 +268,7 @@ public final class ProjectPamphletViewModel: ProjectPamphletViewModelType, Proje public let dismissManagePledgeAndShowMessageBannerWithMessage: Signal public let goToManagePledge: Signal public let goToRewards: Signal<(Project, RefTag?), Never> + public let popToRootViewController: Signal<(), Never> public let setNavigationBarHiddenAnimated: Signal<(Bool, Bool), Never> public let setNeedsStatusBarAppearanceUpdate: Signal<(), Never> public let topLayoutConstraintConstant: Signal diff --git a/Library/ViewModels/ProjectPamphletViewModelTests.swift b/Library/ViewModels/ProjectPamphletViewModelTests.swift index a6fd106a2a..157b4d60be 100644 --- a/Library/ViewModels/ProjectPamphletViewModelTests.swift +++ b/Library/ViewModels/ProjectPamphletViewModelTests.swift @@ -27,6 +27,7 @@ final class ProjectPamphletViewModelTests: TestCase { private let setNavigationBarAnimated = TestObserver() private let setNeedsStatusBarAppearanceUpdate = TestObserver<(), Never>() private let topLayoutConstraintConstant = TestObserver() + private let popToRootViewController = TestObserver<(), Never>() internal override func setUp() { super.setUp() @@ -64,6 +65,7 @@ final class ProjectPamphletViewModelTests: TestCase { self.vm.outputs.goToManagePledge.observe(self.goToManageViewPledge.observer) self.vm.outputs.goToRewards.map(first).observe(self.goToRewardsProject.observer) self.vm.outputs.goToRewards.map(second).observe(self.goToRewardsRefTag.observer) + self.vm.outputs.popToRootViewController.observe(self.popToRootViewController.observer) self.vm.outputs.setNavigationBarHiddenAnimated.map(first) .observe(self.setNavigationBarHidden.observer) self.vm.outputs.setNavigationBarHiddenAnimated.map(second) @@ -1011,6 +1013,17 @@ final class ProjectPamphletViewModelTests: TestCase { } } + func testPopToRootViewController() { + self.vm.inputs.configureWith(projectOrParam: .left(.template), refTag: nil) + self.vm.inputs.viewDidLoad() + + self.popToRootViewController.assertDidNotEmitValue() + + self.vm.inputs.didBackProject() + + self.popToRootViewController.assertValueCount(1) + } + // MARK: - Functions private func configureInitialState(_ projectOrParam: Either) { From f9e245a08535cf272bae7df58d3e4549382dcd1c Mon Sep 17 00:00:00 2001 From: Justin Swart Date: Wed, 19 Feb 2020 11:22:18 -0800 Subject: [PATCH 2/2] Alphabetize --- Library/ViewModels/ProjectPamphletViewModelTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Library/ViewModels/ProjectPamphletViewModelTests.swift b/Library/ViewModels/ProjectPamphletViewModelTests.swift index 157b4d60be..9372d3c7c7 100644 --- a/Library/ViewModels/ProjectPamphletViewModelTests.swift +++ b/Library/ViewModels/ProjectPamphletViewModelTests.swift @@ -23,11 +23,11 @@ final class ProjectPamphletViewModelTests: TestCase { private let goToManageViewPledge = TestObserver() private let goToRewardsProject = TestObserver() private let goToRewardsRefTag = TestObserver() + private let popToRootViewController = TestObserver<(), Never>() private let setNavigationBarHidden = TestObserver() private let setNavigationBarAnimated = TestObserver() private let setNeedsStatusBarAppearanceUpdate = TestObserver<(), Never>() private let topLayoutConstraintConstant = TestObserver() - private let popToRootViewController = TestObserver<(), Never>() internal override func setUp() { super.setUp()