@@ -36,14 +36,13 @@ class OrdersViewController: UIViewController {
3636 return ResultsController < StorageOrder > ( storageManager: storageManager, sectionNameKeyPath: " normalizedAgeAsString " , sortedBy: [ descriptor] )
3737 } ( )
3838
39- /// ResultsController: Surrounds us. Binds the galaxy together. And also, keeps the UITableView <> (Stored) OrderStatuses in sync.
39+ /// ResultsController: Handles all things order status
4040 ///
4141 private lazy var statusResultsController : ResultsController < StorageOrderStatus > = {
4242 let storageManager = AppDelegate . shared. storageManager
43- let predicate = NSPredicate ( format: " siteID == %lld " , StoresManager . shared. sessionManager. defaultStoreID ?? Int . min)
4443 let descriptor = NSSortDescriptor ( key: " slug " , ascending: true )
4544
46- return ResultsController < StorageOrderStatus > ( storageManager: storageManager, matching : predicate , sortedBy: [ descriptor] )
45+ return ResultsController < StorageOrderStatus > ( storageManager: storageManager, sortedBy: [ descriptor] )
4746 } ( )
4847
4948 /// SyncCoordinator: Keeps tracks of which pages have been refreshed, and encapsulates the "What should we sync now" logic.
@@ -66,6 +65,12 @@ class OrdersViewController: UIViewController {
6665 }
6766 }
6867
68+ /// The current list of order statuses for the default site
69+ ///
70+ private var currentSiteStatuses : [ OrderStatus ] {
71+ return statusResultsController. fetchedObjects
72+ }
73+
6974 /// Keep track of the (Autosizing Cell's) Height. This helps us prevent UI flickers, due to sizing recalculations.
7075 ///
7176 private var estimatedRowHeights = [ IndexPath: CGFloat] ( )
@@ -118,19 +123,22 @@ class OrdersViewController: UIViewController {
118123
119124 refreshTitle ( )
120125 refreshResultsPredicate ( )
126+ refreshStatusPredicate ( )
121127 registerTableViewCells ( )
122128
123129 configureSyncingCoordinator ( )
124130 configureNavigation ( )
125131 configureTableView ( )
126- configureResultsController ( )
132+ configureResultsControllers ( )
127133
128134 startListeningToNotifications ( )
129135 }
130136
131137 override func viewWillAppear( _ animated: Bool ) {
132138 super. viewWillAppear ( animated)
133139
140+ syncOrderStatus ( )
141+ resetStatusFilterIfNeeded ( )
134142 syncingCoordinator. synchronizeFirstPage ( )
135143 if AppRatingManager . shared. shouldPromptForAppReview ( ) {
136144 displayRatingPrompt ( )
@@ -164,7 +172,7 @@ private extension OrdersViewController {
164172 navigationItem. title = title
165173 }
166174
167- /// Setup: Filtering
175+ /// Setup: Order filtering
168176 ///
169177 func refreshResultsPredicate( ) {
170178 resultsController. predicate = {
@@ -184,6 +192,12 @@ private extension OrdersViewController {
184192 tableView. reloadData ( )
185193 }
186194
195+ /// Setup: Order status predicate
196+ ///
197+ func refreshStatusPredicate( ) {
198+ statusResultsController. predicate = NSPredicate ( format: " siteID == %lld " , StoresManager . shared. sessionManager. defaultStoreID ?? Int . min)
199+ }
200+
187201 /// Setup: Navigation Item
188202 ///
189203 func configureNavigation( ) {
@@ -225,9 +239,12 @@ private extension OrdersViewController {
225239
226240 /// Setup: Results Controller
227241 ///
228- func configureResultsController( ) {
242+ func configureResultsControllers( ) {
243+ // Orders FRC
229244 resultsController. startForwardingEvents ( to: tableView)
230245 try ? resultsController. performFetch ( )
246+
247+ // Order status FRC
231248 try ? statusResultsController. performFetch ( )
232249 }
233250
@@ -285,6 +302,8 @@ extension OrdersViewController {
285302 /// Runs whenever the default Account is updated.
286303 ///
287304 @objc func defaultAccountWasUpdated( ) {
305+ statusFilter = nil
306+ refreshStatusPredicate ( )
288307 syncingCoordinator. resetInternalState ( )
289308 }
290309}
@@ -316,7 +335,7 @@ extension OrdersViewController {
316335 self ? . statusFilter = nil
317336 }
318337
319- for orderStatus in statusResultsController . fetchedObjects {
338+ for orderStatus in currentSiteStatuses {
320339 actionSheet. addDefaultActionWithTitle ( orderStatus. name) { [ weak self] _ in
321340 self ? . statusFilter = orderStatus
322341 }
@@ -331,6 +350,7 @@ extension OrdersViewController {
331350
332351 @IBAction func pullToRefresh( sender: UIRefreshControl ) {
333352 WooAnalytics . shared. track ( . ordersListPulledToRefresh)
353+ syncOrderStatus ( )
334354 syncingCoordinator. synchronizeFirstPage {
335355 sender. endRefreshing ( )
336356 }
@@ -373,6 +393,24 @@ private extension OrdersViewController {
373393 let action = OrderAction . resetStoredOrders ( onCompletion: onCompletion)
374394 StoresManager . shared. dispatch ( action)
375395 }
396+
397+ /// Reset the current status filter if needed (e.g. when changing stores and the currently
398+ /// selected filter does not exist in the new store)
399+ ///
400+ func resetStatusFilterIfNeeded( ) {
401+ guard let statusFilter = statusFilter else {
402+ // "All" is the current filter so bail
403+ return
404+ }
405+ guard currentSiteStatuses. isEmpty == false else {
406+ self . statusFilter = nil
407+ return
408+ }
409+
410+ if currentSiteStatuses. contains ( statusFilter) == false {
411+ self . statusFilter = nil
412+ }
413+ }
376414}
377415
378416
@@ -411,6 +449,26 @@ extension OrdersViewController: SyncingCoordinatorDelegate {
411449
412450 StoresManager . shared. dispatch ( action)
413451 }
452+
453+ func syncOrderStatus( onCompletion: ( ( Error ? ) -> Void ) ? = nil ) {
454+ guard let siteID = StoresManager . shared. sessionManager. defaultStoreID else {
455+ onCompletion ? ( nil )
456+ return
457+ }
458+
459+ // First, let's verify our FRC predicate is up to date
460+ refreshStatusPredicate ( )
461+
462+ let action = OrderStatusAction . retrieveOrderStatuses ( siteID: siteID) { [ weak self] ( _, error) in
463+ if let error = error {
464+ DDLogError ( " ⛔️ Order List — Error synchronizing order statuses: \( error) " )
465+ }
466+ self ? . resetStatusFilterIfNeeded ( )
467+ onCompletion ? ( error)
468+ }
469+
470+ StoresManager . shared. dispatch ( action)
471+ }
414472}
415473
416474
@@ -472,6 +530,7 @@ private extension OrdersViewController {
472530 let message = NSLocalizedString ( " Unable to refresh list " , comment: " Refresh Action Failed " )
473531 let actionTitle = NSLocalizedString ( " Retry " , comment: " Retry Action " )
474532 let notice = Notice ( title: message, feedbackType: . error, actionTitle: actionTitle) { [ weak self] in
533+ self ? . syncOrderStatus ( )
475534 self ? . sync ( pageNumber: pageNumber, pageSize: pageSize)
476535 }
477536
@@ -557,8 +616,7 @@ private extension OrdersViewController {
557616 }
558617
559618 func lookUpOrderStatus( for order: Order ) -> OrderStatus ? {
560- let listAll = statusResultsController. fetchedObjects
561- for orderStatus in listAll where orderStatus. slug == order. statusKey {
619+ for orderStatus in currentSiteStatuses where orderStatus. slug == order. statusKey {
562620 return orderStatus
563621 }
564622
0 commit comments