Skip to content

Commit 3448c7a

Browse files
committed
Split web and native coordinator
1 parent 99663cc commit 3448c7a

File tree

8 files changed

+36
-43
lines changed

8 files changed

+36
-43
lines changed

WooCommerce/Classes/Routing/ProductDetail/Coordinator/ProductDetailCoordinator.swift

Lines changed: 0 additions & 11 deletions
This file was deleted.

WooCommerce/Classes/Routing/ProductDetail/Coordinator/ProductDetailNativeCoordinator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import UIKit
33

44
/// Coordinator for the **native** product detail/editor flow.
55
/// Delegates VC construction to `ProductDetailsFactory` and applies the requested presentation style.
6-
class ProductDetailNativeCoordinator: ProductDetailCoordinator {
6+
class ProductDetailNativeCoordinator {
77

88
func viewController(
99
product: Product,

WooCommerce/Classes/Routing/ProductDetail/Coordinator/ProductDetailWebCoordinator.swift

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,20 @@ import UIKit
22
import Yosemite
33

44
/// Coordinator for the **admin web** product detail/editor flow.
5-
final class ProductDetailWebCoordinator: NSObject, ProductDetailCoordinator {
6-
var onDismiss: (() -> Void)?
7-
private let site: Site
5+
class ProductDetailWebCoordinator: NSObject {
6+
private let site: Site?
87

9-
init(site: Site) {
8+
init(site: Site?) {
109
self.site = site
1110
}
1211

13-
func viewController(product: Product,
14-
presentationStyle: ProductDetailNavigator.Presentation,
15-
isReadOnly: Bool,
16-
onDelete: (() -> Void)? = nil) -> UIViewController {
12+
func viewController(product: Product, onDismiss: @escaping () -> Void) -> UIViewController {
1713
guard let url = ProductAdminURLProvider.editURL(for: product, site: site) else {
1814
return UIViewController()
1915
}
2016

2117
let viewModel = AdminWebViewModel(title: product.name, initialURL: url) { [onDismiss] in
22-
onDismiss?()
18+
onDismiss()
2319
}
2420
let webViewController = AuthenticatedWebViewController(viewModel: viewModel)
2521

@@ -28,15 +24,15 @@ final class ProductDetailWebCoordinator: NSObject, ProductDetailCoordinator {
2824
}
2925

3026
fileprivate class AdminWebViewModel: WPAdminWebViewModel {
31-
var onDismiss: (() -> Void)?
27+
let onDismiss: (() -> Void)
3228

33-
init(title: String, initialURL: URL, onDismiss: (() -> Void)?) {
29+
init(title: String, initialURL: URL, onDismiss: @escaping () -> Void) {
3430
self.onDismiss = onDismiss
3531
super.init(title: title, initialURL: initialURL)
3632
}
3733

3834
override func handleDismissal() {
39-
onDismiss?()
35+
onDismiss()
4036
super.handleDismissal()
4137
}
4238
}

WooCommerce/Classes/Routing/ProductDetail/ProductAdminURLProvider.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import Foundation
44
/// Builds canonical admin edit URLs for products.
55
enum ProductAdminURLProvider {
66

7-
static func editURL(for product: Product, site: Site) -> URL? {
8-
guard let base = site.adminURLWithFallback() else { return nil }
7+
static func editURL(for product: Product, site: Site?) -> URL? {
8+
guard let base = site?.adminURLWithFallback() else { return nil }
99

1010
var components = URLComponents(url: base, resolvingAgainstBaseURL: false)!
1111
components.queryItems = [

WooCommerce/Classes/Routing/ProductDetail/ProductDetailCoordinatorFactoryProtocol.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import Yosemite
22

33
/// Factory for producing coordinators used by the navigator.
44
protocol ProductDetailCoordinatorFactoryProtocol {
5-
func webCoordinator(site: Site) -> ProductDetailWebCoordinator
5+
func webCoordinator(site: Site?) -> ProductDetailWebCoordinator
66
func nativeCoordinator() -> ProductDetailNativeCoordinator
77
}
88

99
/// Default coordinator factory that wires production dependencies.
1010
class ProductDetailCoordinatorFactory: ProductDetailCoordinatorFactoryProtocol {
1111
static let `default` = ProductDetailCoordinatorFactory()
1212

13-
func webCoordinator(site: Site) -> ProductDetailWebCoordinator {
13+
func webCoordinator(site: Site?) -> ProductDetailWebCoordinator {
1414
return ProductDetailWebCoordinator(site: site)
1515
}
1616

WooCommerce/Classes/Routing/ProductDetail/ProductDetailNavigator.swift

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,24 +46,25 @@ final class ProductDetailNavigator {
4646
onDismissWeb: (() -> Void)? = nil,
4747
onDelete: (() -> Void)? = nil) -> UIViewController {
4848

49-
let coordinator: ProductDetailCoordinator
49+
let viewController: UIViewController
5050
if shouldOpenInWeb(product: product) {
51-
let webCoordinator = coordinatorFactory.webCoordinator(site: stores.sessionManager.defaultSite!)
52-
webCoordinator.onDismiss = onDismissWeb
53-
coordinator = webCoordinator
54-
} else {
55-
coordinator = coordinatorFactory.nativeCoordinator()
56-
}
51+
let coordinator = coordinatorFactory.webCoordinator(site: stores.sessionManager.defaultSite)
52+
viewController = coordinator.viewController(product: product) {
53+
onDismissWeb?()
54+
}
5755

58-
let viewController = coordinator.viewController(product: product,
56+
} else {
57+
let coordinator = coordinatorFactory.nativeCoordinator()
58+
viewController = coordinator.viewController(product: product,
5959
presentationStyle: presentationStyle,
6060
isReadOnly: isReadOnly,
6161
onDelete: onDelete)
62+
}
6263

6364
return viewController
6465
}
6566

6667
private func shouldOpenInWeb(product: Product) -> Bool {
67-
return /*ciabChecker.isCurrentSiteCIAB &&*/ product.productType == .booking
68+
return ciabChecker.isCurrentSiteCIAB && product.productType == .booking
6869
}
6970
}

WooCommerce/WooCommerceTests/Mocks/MockProductDetailCoordinator.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,14 @@ import UIKit
22
import Yosemite
33
@testable import WooCommerce
44

5-
struct MockProductDetailCoordinator: ProductDetailCoordinator {
6-
func viewController(product: Product,
5+
class MockProductDetailWebCoordinator: ProductDetailWebCoordinator {
6+
override func viewController(product: Product, onDismiss: @escaping () -> Void) -> UIViewController {
7+
UIViewController()
8+
}
9+
}
10+
11+
class MockProductDetailNativeCoordinator: ProductDetailNativeCoordinator {
12+
override func viewController(product: Product,
713
presentationStyle: ProductDetailNavigator.Presentation,
814
isReadOnly: Bool,
915
onDelete: (() -> Void)?) -> UIViewController {
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
@testable import WooCommerce
2+
import Yosemite
23

34
class MockProductDetailCoordinatorFactory: ProductDetailCoordinatorFactoryProtocol {
45
private(set) var createdWebCoordiantor = false
56
private(set) var createdNativeCoordiantor = false
67

7-
func webCoordinator() -> ProductDetailCoordinator {
8+
func webCoordinator(site: Site?) -> ProductDetailWebCoordinator {
89
createdWebCoordiantor = true
9-
return MockProductDetailCoordinator()
10+
return MockProductDetailWebCoordinator(site: Site.fake())
1011
}
1112

12-
func nativeCoordinator() -> ProductDetailCoordinator {
13+
func nativeCoordinator() -> ProductDetailNativeCoordinator {
1314
createdNativeCoordiantor = true
14-
return MockProductDetailCoordinator()
15+
return MockProductDetailNativeCoordinator()
1516
}
1617
}

0 commit comments

Comments
 (0)