@@ -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)
0 commit comments