Skip to content

Commit 5ba220b

Browse files
author
Thibault Wittemberg
committed
FlowContributor: .contribute(withNext:)
1 parent eeb06af commit 5ba220b

File tree

6 files changed

+55
-6
lines changed

6 files changed

+55
-6
lines changed

RxFlow.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
1A8FBDFE1FF8337800389464 /* Flow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A8FBDF11FF8337800389464 /* Flow.swift */; };
2727
1AF8549D1FF8328D00271B52 /* RxFlow.h in Headers */ = {isa = PBXBuildFile; fileRef = 1AF8548F1FF8328D00271B52 /* RxFlow.h */; settings = {ATTRIBUTES = (Public, ); }; };
2828
741801AC21CB31C200D25B4B /* FlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 741801AB21CB31C200D25B4B /* FlowCoordinator.swift */; };
29+
74319EE8231C300A002294F3 /* FlowContributorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74319EE7231C300A002294F3 /* FlowContributorTests.swift */; };
2930
749B02E822066518001BEBBB /* RxBlocking.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 749B02E722066518001BEBBB /* RxBlocking.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
3031
749B02EB22066538001BEBBB /* Reusable.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 749B02E922066537001BEBBB /* Reusable.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
3132
749B02EC22066538001BEBBB /* RxTest.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 749B02EA22066538001BEBBB /* RxTest.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
@@ -93,6 +94,7 @@
9394
1AF8548F1FF8328D00271B52 /* RxFlow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxFlow.h; sourceTree = "<group>"; };
9495
1AF854901FF8328D00271B52 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9596
741801AB21CB31C200D25B4B /* FlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowCoordinator.swift; sourceTree = "<group>"; };
97+
74319EE7231C300A002294F3 /* FlowContributorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlowContributorTests.swift; sourceTree = "<group>"; };
9698
749B02E722066518001BEBBB /* RxBlocking.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxBlocking.framework; path = Carthage/Build/iOS/RxBlocking.framework; sourceTree = "<group>"; };
9799
749B02E922066537001BEBBB /* Reusable.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Reusable.framework; path = Carthage/Build/iOS/Reusable.framework; sourceTree = "<group>"; };
98100
749B02EA22066538001BEBBB /* RxTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxTest.framework; path = Carthage/Build/iOS/RxTest.framework; sourceTree = "<group>"; };
@@ -165,6 +167,7 @@
165167
children = (
166168
1A8FBE791FF9783100389464 /* Info.plist */,
167169
1A1627CF2186786800952EFC /* TestData */,
170+
74319EE7231C300A002294F3 /* FlowContributorTests.swift */,
168171
749B02FB220688EC001BEBBB /* FlowCoordinatorTests.swift */,
169172
749B02F72206852D001BEBBB /* Flow+PresentableTests.swift */,
170173
1A1627C8217D517700952EFC /* Rx+PausableTests.swift */,
@@ -347,6 +350,7 @@
347350
1A1627CC217D597400952EFC /* SyncronizableTests.swift in Sources */,
348351
749B02FC220688EC001BEBBB /* FlowCoordinatorTests.swift in Sources */,
349352
1A1627CE218677C000952EFC /* UIViewController+PresentableTests.swift in Sources */,
353+
74319EE8231C300A002294F3 /* FlowContributorTests.swift in Sources */,
350354
1A1627C9217D517700952EFC /* Rx+PausableTests.swift in Sources */,
351355
749B02F82206852D001BEBBB /* Flow+PresentableTests.swift in Sources */,
352356
1A1627D3218679A500952EFC /* TestUIViewController.swift in Sources */,

RxFlow/FlowContributor.swift

+9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ public enum FlowContributor {
1818
case forwardToCurrentFlow(withStep: Step)
1919
/// the "withStep" step will be forwarded to the parent flow
2020
case forwardToParentFlow(withStep: Step)
21+
22+
/// Shortcut static func that returns a .contribute(withNextPresentable: _, withNextStepper: _)
23+
/// in case we have a single actor that is a Presentable and also a Stepper
24+
///
25+
/// - Parameter nextPresentableAndStepper
26+
/// - Returns: .contribute(withNextPresentable: withNext, withNextStepper: withNext)
27+
public static func contribute(withNext nextPresentableAndStepper: Presentable & Stepper) -> FlowContributor {
28+
return .contribute(withNextPresentable: nextPresentableAndStepper, withNextStepper: nextPresentableAndStepper)
29+
}
2130
}
2231

2332
/// typealias to allow compliance with older versions of RxFlow. NextFlowItems should be replaced by FlowContributors

RxFlowDemo/RxFlowDemo/Flows/OnboardingFlow.swift

+1-2
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ class OnboardingFlow: Flow {
5151
let settingsLoginViewController = SettingsLoginViewController.instantiate()
5252
settingsLoginViewController.title = "Login"
5353
self.rootViewController.pushViewController(settingsLoginViewController, animated: false)
54-
return .one(flowContributor: .contribute(withNextPresentable: settingsLoginViewController,
55-
withNextStepper: settingsLoginViewController))
54+
return .one(flowContributor: .contribute(withNext: settingsLoginViewController))
5655
}
5756

5857
private func navigationToApiScreen() -> FlowContributors {

RxFlowDemo/RxFlowDemo/Flows/SettingsFlow.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ class SettingsFlow: Flow {
8888
}
8989

9090
return .multiple(flowContributors: [
91-
.contribute(withNextPresentable: settingsListViewController, withNextStepper: settingsListViewController),
92-
.contribute(withNextPresentable: settingsLoginViewController, withNextStepper: settingsLoginViewController),
91+
.contribute(withNext: settingsListViewController),
92+
.contribute(withNext: settingsLoginViewController),
9393
.forwardToCurrentFlow(withStep: DemoStep.alert("Demo of multiple Flow Contributor"))
9494
])
9595
}
@@ -98,7 +98,7 @@ class SettingsFlow: Flow {
9898
let settingsLoginViewController = SettingsLoginViewController.instantiate()
9999
settingsLoginViewController.title = "Login"
100100
self.rootViewController.showDetailViewController(settingsLoginViewController, sender: nil)
101-
return .one(flowContributor: .contribute(withNextPresentable: settingsLoginViewController, withNextStepper: settingsLoginViewController))
101+
return .one(flowContributor: .contribute(withNext: settingsLoginViewController))
102102
}
103103

104104
private func navigateToApiKeyScreen() -> FlowContributors {

RxFlowDemo/RxFlowDemo/Flows/WishlistFlow.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ class WishlistFlow: Flow {
105105
private func navigateToAbout() -> FlowContributors {
106106
let viewController = SettingsAboutViewController.instantiate()
107107
self.rootViewController.present(viewController, animated: true)
108-
return .one(flowContributor: .contribute(withNextPresentable: viewController, withNextStepper: viewController))
108+
return .one(flowContributor: .contribute(withNext: viewController))
109109
}
110110

111111
@objc func logoutIsRequired() {
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// FlowContributorTests.swift
3+
// RxFlowTests
4+
//
5+
// Created by Thibault Wittemberg on 2019-09-01.
6+
// Copyright © 2019 RxSwiftCommunity. All rights reserved.
7+
//
8+
9+
@testable import RxFlow
10+
import RxRelay
11+
import RxSwift
12+
import XCTest
13+
14+
class MockPresentableAndStepper: Presentable, Stepper {
15+
let rxVisible = Observable<Bool>.never()
16+
let rxDismissed = Single<Void>.never()
17+
let steps = PublishRelay<Step>()
18+
}
19+
20+
final class FlowContributorTests: XCTestCase {
21+
22+
func testContributeWithNext_returnsContributeWithNextPresentable_andNextStepper() {
23+
// Given: a single class for Presentable and Stepper
24+
let nextPresentableAndStepper = MockPresentableAndStepper()
25+
26+
// When applying FlowContributor.contribute(withNext:)
27+
let contributor = FlowContributor.contribute(withNext: nextPresentableAndStepper)
28+
29+
// Then: FlowContributor.contribute(withNext:) is a shortcut to FlowContributor.contribute(nextPresentable:, nextStepper)
30+
if case let FlowContributor.contribute(nextPresentable, nextStepper) = contributor {
31+
XCTAssert((nextPresentable as! MockPresentableAndStepper) === nextPresentableAndStepper)
32+
XCTAssert((nextStepper as! MockPresentableAndStepper) === nextPresentableAndStepper)
33+
} else {
34+
XCTFail("FlowContributor.contribute(withNext:) should be a shortcut to FlowContributor.contribute(nextPresentable:, nextStepper)")
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)