Skip to content

Commit 99663cc

Browse files
committed
Handle dismiss
1 parent 0a92483 commit 99663cc

File tree

6 files changed

+54
-28
lines changed

6 files changed

+54
-28
lines changed

WooCommerce/Classes/Extensions/UIViewController+Navigation.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ extension UIViewController {
66
/// A VC added to an existing navigation controller is dismissed when `isMovingFromParent` is `true`.
77
/// For any other scenario `isBeingDismissed` will do.
88
var isBeingDismissedInAnyWay: Bool {
9-
isMovingFromParent || isBeingDismissed || navigationController?.isBeingDismissed == true
9+
isMovingFromParent ||
10+
isBeingDismissed ||
11+
navigationController?.isBeingDismissed == true ||
12+
navigationController?.isMovingFromParent == true
1013
}
1114

1215
/// Async/await version of the UIKit `dismiss(animated:)`.

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

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ import Yosemite
33

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

109
init(site: Site) {
@@ -19,16 +18,25 @@ final class ProductDetailWebCoordinator: NSObject, ProductDetailCoordinator {
1918
return UIViewController()
2019
}
2120

22-
let viewModel = WPAdminWebViewModel(title: product.name, initialURL: url)
21+
let viewModel = AdminWebViewModel(title: product.name, initialURL: url) { [onDismiss] in
22+
onDismiss?()
23+
}
2324
let webViewController = AuthenticatedWebViewController(viewModel: viewModel)
2425

2526
return webViewController
2627
}
28+
}
29+
30+
fileprivate class AdminWebViewModel: WPAdminWebViewModel {
31+
var onDismiss: (() -> Void)?
32+
33+
init(title: String, initialURL: URL, onDismiss: (() -> Void)?) {
34+
self.onDismiss = onDismiss
35+
super.init(title: title, initialURL: initialURL)
36+
}
2737

28-
@objc
29-
private func dismissWebView() {
30-
let completion = onDismiss
31-
onDismiss = nil
32-
completion?()
38+
override func handleDismissal() {
39+
onDismiss?()
40+
super.handleDismissal()
3341
}
3442
}

WooCommerce/Classes/Routing/ProductDetail/ProductDetailCoordinatorFactoryProtocol.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,19 @@ import Yosemite
22

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

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

13-
private let stores: StoresManager
14-
15-
init(stores: StoresManager = ServiceLocator.stores) {
16-
self.stores = stores
17-
}
18-
19-
func webCoordinator() -> ProductDetailCoordinator {
20-
return ProductDetailWebCoordinator(site: stores.sessionManager.defaultSite!)
13+
func webCoordinator(site: Site) -> ProductDetailWebCoordinator {
14+
return ProductDetailWebCoordinator(site: site)
2115
}
2216

23-
func nativeCoordinator() -> ProductDetailCoordinator {
17+
func nativeCoordinator() -> ProductDetailNativeCoordinator {
2418
return ProductDetailNativeCoordinator()
2519
}
2620
}

WooCommerce/Classes/Routing/ProductDetail/ProductDetailNavigator.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,15 @@ final class ProductDetailNavigator {
2222

2323
private let ciabChecker: CIABEligibilityCheckerProtocol
2424
private let coordinatorFactory: ProductDetailCoordinatorFactoryProtocol
25+
private let stores: StoresManager
2526

2627
init(ciabChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker(),
27-
coordinatorFactory: ProductDetailCoordinatorFactoryProtocol = ProductDetailCoordinatorFactory.default) {
28+
coordinatorFactory: ProductDetailCoordinatorFactoryProtocol = ProductDetailCoordinatorFactory.default,
29+
stores: StoresManager = ServiceLocator.stores,
30+
) {
2831
self.ciabChecker = ciabChecker
2932
self.coordinatorFactory = coordinatorFactory
33+
self.stores = stores
3034
}
3135

3236
/// Builds the destination `UIViewController` for the given product.
@@ -39,11 +43,14 @@ final class ProductDetailNavigator {
3943
func makeDestination(product: Product,
4044
presentationStyle: Presentation = .push,
4145
isReadOnly: Bool,
46+
onDismissWeb: (() -> Void)? = nil,
4247
onDelete: (() -> Void)? = nil) -> UIViewController {
4348

4449
let coordinator: ProductDetailCoordinator
4550
if shouldOpenInWeb(product: product) {
46-
coordinator = coordinatorFactory.webCoordinator()
51+
let webCoordinator = coordinatorFactory.webCoordinator(site: stores.sessionManager.defaultSite!)
52+
webCoordinator.onDismiss = onDismissWeb
53+
coordinator = webCoordinator
4754
} else {
4855
coordinator = coordinatorFactory.nativeCoordinator()
4956
}
@@ -57,6 +64,6 @@ final class ProductDetailNavigator {
5764
}
5865

5966
private func shouldOpenInWeb(product: Product) -> Bool {
60-
return ciabChecker.isCurrentSiteCIAB && product.productType == .booking
67+
return /*ciabChecker.isCurrentSiteCIAB &&*/ product.productType == .booking
6168
}
6269
}

WooCommerce/Classes/ViewRelated/Products/ProductsSplitViewCoordinator.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,15 @@ private extension ProductsSplitViewCoordinator {
122122
}
123123

124124
func showProductForm(product: Product) {
125-
let viewController = ProductDetailNavigator.shared.makeDestination(product: product,
126-
isReadOnly: false,
127-
onDelete: { [weak self] in
128-
self?.onSecondaryProductFormDeletion()
129-
})
125+
let viewController = ProductDetailNavigator.shared.makeDestination(
126+
product: product,
127+
isReadOnly: false,
128+
onDismissWeb: { [weak self] in
129+
self?.resyncProducts()
130+
},
131+
onDelete: { [weak self] in
132+
self?.onSecondaryProductFormDeletion()
133+
})
130134

131135
showSecondaryView(contentType: .productForm(product: product),
132136
viewController: viewController,
@@ -195,6 +199,11 @@ private extension ProductsSplitViewCoordinator {
195199
}
196200
}
197201

202+
func resyncProducts() {
203+
guard let productsViewController = primaryNavigationController.topViewController as? ProductsViewController else { return }
204+
productsViewController.resync()
205+
}
206+
198207
func showEmptyViewOrFirstProduct() {
199208
showEmptyView()
200209
switch primaryNavigationController.topViewController {

WooCommerce/Classes/ViewRelated/Products/ProductsViewController.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,11 @@ final class ProductsViewController: UIViewController, GhostableViewController {
303303
func startProductCreation() {
304304
addProduct(sourceBarButtonItem: addProductButton, isFirstProduct: false)
305305
}
306+
307+
func resync() {
308+
tableView.reloadData()
309+
paginationTracker.resync()
310+
}
306311
}
307312

308313
// MARK: - Navigation Bar Actions

0 commit comments

Comments
 (0)