Skip to content

Commit 2bab8e0

Browse files
authored
Merge pull request #6972 from woocommerce/issue/6381-orders-secondary-column
Order Split View: Show the first item in the secondary column if possible
2 parents 15815b8 + c80d5a7 commit 2bab8e0

File tree

3 files changed

+63
-5
lines changed

3 files changed

+63
-5
lines changed

WooCommerce/Classes/ViewRelated/Orders/OrderListViewController.swift

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,16 @@ final class OrderListViewController: UIViewController, GhostableViewController {
103103

104104
/// Callback closure when an order is selected
105105
///
106-
private var switchDetailsHandler: (OrderDetailsViewModel) -> Void
106+
private var switchDetailsHandler: (OrderDetailsViewModel?) -> Void
107107

108108
/// Currently selected index path in the table view
109109
///
110110
private var selectedIndexPath: IndexPath?
111111

112+
/// Currently selected order ID in the table view
113+
///
114+
private var selectedOrderID: Int64?
115+
112116
private lazy var isSplitViewInOrdersTabEnabled: Bool = ServiceLocator.featureFlagService.isFeatureFlagEnabled(.splitViewInOrdersTab)
113117

114118
// MARK: - View Lifecycle
@@ -118,7 +122,7 @@ final class OrderListViewController: UIViewController, GhostableViewController {
118122
init(siteID: Int64,
119123
title: String,
120124
viewModel: OrderListViewModel,
121-
switchDetailsHandler: @escaping (OrderDetailsViewModel) -> Void) {
125+
switchDetailsHandler: @escaping (OrderDetailsViewModel?) -> Void) {
122126
self.siteID = siteID
123127
self.viewModel = viewModel
124128
self.switchDetailsHandler = switchDetailsHandler
@@ -222,7 +226,13 @@ private extension OrderListViewController {
222226

223227
/// Update the `dataSource` whenever there is a new snapshot.
224228
viewModel.snapshot.sink { [weak self] snapshot in
225-
self?.dataSource.apply(snapshot)
229+
guard let self = self else { return }
230+
self.dataSource.apply(snapshot)
231+
232+
if self.isSplitViewInOrdersTabEnabled, self.splitViewController?.isCollapsed == false {
233+
self.checkSelectedItem()
234+
}
235+
226236
}.store(in: &cancellables)
227237

228238
/// Update the top banner when needed
@@ -412,6 +422,41 @@ private extension OrderListViewController {
412422
tableView.selectRow(at: selectedIndexPath, animated: false, scrollPosition: .none)
413423
}
414424
}
425+
426+
/// Checks to see if the selected item is still at the same index in the list and resets its state if not.
427+
///
428+
func checkSelectedItem() {
429+
guard let indexPath = selectedIndexPath, let orderID = selectedOrderID else {
430+
return selectFirstItemIfPossible()
431+
}
432+
433+
guard let objectID = dataSource.itemIdentifier(for: indexPath),
434+
let orderDetailsViewModel = viewModel.detailsViewModel(withID: objectID) else {
435+
return selectFirstItemIfPossible()
436+
}
437+
438+
if orderDetailsViewModel.order.orderID != orderID {
439+
selectFirstItemIfPossible()
440+
}
441+
}
442+
443+
/// Attempts setting the first item in the list as selected if there's any item at all.
444+
/// Otherwise, triggers closure to remove the current selected item from the split view's secondary column.
445+
///
446+
func selectFirstItemIfPossible() {
447+
let firstIndexPath = IndexPath(row: 0, section: 0)
448+
guard let objectID = dataSource.itemIdentifier(for: firstIndexPath),
449+
let orderDetailsViewModel = viewModel.detailsViewModel(withID: objectID),
450+
state != .empty else {
451+
selectedOrderID = nil
452+
selectedIndexPath = nil
453+
return switchDetailsHandler(nil)
454+
}
455+
selectedOrderID = orderDetailsViewModel.order.orderID
456+
selectedIndexPath = firstIndexPath
457+
switchDetailsHandler(orderDetailsViewModel)
458+
highlightSelectedRowIfNeeded()
459+
}
415460
}
416461

417462

@@ -548,6 +593,7 @@ extension OrderListViewController: UITableViewDelegate {
548593
let order = orderDetailsViewModel.order
549594
ServiceLocator.analytics.track(.orderOpen, withProperties: ["id": order.orderID,
550595
"status": order.status.rawValue])
596+
selectedOrderID = order.orderID
551597

552598
if isSplitViewInOrdersTabEnabled {
553599
switchDetailsHandler(orderDetailsViewModel)

WooCommerce/Classes/ViewRelated/Orders/OrdersRootViewController.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,18 @@ final class OrdersRootViewController: UIViewController {
165165

166166
/// This is to update the order detail in split view
167167
///
168-
private func handleSwitchingDetails(viewModel: OrderDetailsViewModel) {
168+
private func handleSwitchingDetails(viewModel: OrderDetailsViewModel?) {
169+
guard let viewModel = viewModel else {
170+
let emptyStateViewController = EmptyStateViewController(style: .basic)
171+
let config = EmptyStateViewController.Config.simple(
172+
message: .init(string: Localization.emptyOrderDetails),
173+
image: .emptySearchResultsImage
174+
)
175+
emptyStateViewController.configure(config)
176+
splitViewController?.showDetailViewController(UINavigationController(rootViewController: emptyStateViewController), sender: nil)
177+
return
178+
}
179+
169180
let orderDetailsViewController = OrderDetailsViewController(viewModel: viewModel)
170181
let orderDetailsNavigationController = WooNavigationController(rootViewController: orderDetailsViewController)
171182

@@ -386,5 +397,7 @@ private extension OrdersRootViewController {
386397
)
387398
static let accessibilityLabelAddSimplePayment = NSLocalizedString("Add simple payments order",
388399
comment: "Navigates to a screen to create a simple payments order")
400+
static let emptyOrderDetails = NSLocalizedString("No order selected",
401+
comment: "Message on the detail view of the Orders tab before any order is selected")
389402
}
390403
}

WooCommerce/Classes/ViewRelated/Orders/OrdersSplitViewWrapperController.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ private extension OrdersSplitViewWrapperController {
5050
let ordersNavigationController = WooTabNavigationController()
5151
ordersNavigationController.viewControllers = [ordersViewController]
5252

53-
// workaround to remove extra space at the bottom when embedded in spit view
5453
let emptyStateViewController = EmptyStateViewController(style: .basic)
5554
let config = EmptyStateViewController.Config.simple(
5655
message: .init(string: Localization.emptyOrderDetails),

0 commit comments

Comments
 (0)