@@ -12,9 +12,11 @@ final class DashboardViewController: UIViewController {
1212
1313 private let siteID : Int64
1414
15- private let dashboardUIFactory : DashboardUIFactory
1615 @Published private var dashboardUI : DashboardUI ?
1716
17+ private lazy var deprecatedStatsViewController = DeprecatedDashboardStatsViewController ( )
18+ private lazy var storeStatsAndTopPerformersViewController = StoreStatsAndTopPerformersViewController ( siteID: siteID, dashboardViewModel: viewModel)
19+
1820 // Used to enable subtitle with store name
1921 private var shouldShowStoreNameAsSubtitle : Bool = false
2022
@@ -88,13 +90,14 @@ final class DashboardViewController: UIViewController {
8890 return view
8991 } ( )
9092
93+ private let viewModel : DashboardViewModel = . init( )
94+
9195 private var subscriptions = Set < AnyCancellable > ( )
9296
9397 // MARK: View Lifecycle
9498
9599 init ( siteID: Int64 ) {
96100 self . siteID = siteID
97- dashboardUIFactory = DashboardUIFactory ( siteID: siteID)
98101 super. init ( nibName: nil , bundle: nil )
99102 configureTabBarItem ( )
100103 }
@@ -112,13 +115,16 @@ final class DashboardViewController: UIViewController {
112115 observeSiteForUIUpdates ( )
113116 observeBottomJetpackBenefitsBannerVisibilityUpdates ( )
114117 observeNavigationBarHeightForStoreNameLabelVisibility ( )
118+ observeStatsVersionForDashboardUIUpdates ( )
119+ Task { @MainActor in
120+ await reloadDashboardUIStatsVersion ( forced: true )
121+ }
115122 }
116123
117124 override func viewWillAppear( _ animated: Bool ) {
118125 super. viewWillAppear ( animated)
119126 // Reset title to prevent it from being empty right after login
120127 configureTitle ( )
121- reloadDashboardUIStatsVersion ( forced: false )
122128 }
123129
124130 override func viewDidLayoutSubviews( ) {
@@ -256,11 +262,23 @@ private extension DashboardViewController {
256262 }
257263 }
258264
259- func reloadDashboardUIStatsVersion( forced: Bool ) {
260- dashboardUIFactory. reloadDashboardUI ( onUIUpdate: { [ weak self] dashboardUI in
265+ func reloadDashboardUIStatsVersion( forced: Bool ) async {
266+ await storeStatsAndTopPerformersViewController. reloadData ( forced: forced)
267+ }
268+
269+ func observeStatsVersionForDashboardUIUpdates( ) {
270+ viewModel. $statsVersion. removeDuplicates ( ) . sink { [ weak self] statsVersion in
271+ guard let self = self else { return }
272+ let dashboardUI : DashboardUI
273+ switch statsVersion {
274+ case . v3:
275+ dashboardUI = self . deprecatedStatsViewController
276+ case . v4:
277+ dashboardUI = self . storeStatsAndTopPerformersViewController
278+ }
261279 dashboardUI. scrollDelegate = self
262- self ? . onDashboardUIUpdate ( forced: forced , updatedDashboardUI: dashboardUI)
263- } )
280+ self . onDashboardUIUpdate ( forced: false , updatedDashboardUI: dashboardUI)
281+ } . store ( in : & subscriptions )
264282 }
265283
266284 /// Display the error banner at the top of the dashboard content (below the site title)
@@ -300,8 +318,10 @@ extension DashboardViewController: DashboardUIScrollDelegate {
300318private extension DashboardViewController {
301319 func onDashboardUIUpdate( forced: Bool , updatedDashboardUI: DashboardUI ) {
302320 defer {
303- // Reloads data of the updated dashboard UI at the end.
304- reloadData ( forced: forced)
321+ Task { @MainActor [ weak self] in
322+ // Reloads data of the updated dashboard UI at the end.
323+ await self ? . reloadData ( forced: true )
324+ }
305325 }
306326
307327 // Optimistically hide the error banner any time the dashboard UI updates (not just pull to refresh)
@@ -327,7 +347,7 @@ private extension DashboardViewController {
327347 dashboardUI = updatedDashboardUI
328348
329349 updatedDashboardUI. onPullToRefresh = { [ weak self] in
330- self ? . pullToRefresh ( )
350+ await self ? . pullToRefresh ( )
331351 }
332352 updatedDashboardUI. displaySyncingError = { [ weak self] in
333353 self ? . showTopBannerView ( )
@@ -399,20 +419,20 @@ private extension DashboardViewController {
399419 show ( settingsViewController, sender: self )
400420 }
401421
402- func pullToRefresh( ) {
422+ func pullToRefresh( ) async {
403423 ServiceLocator . analytics. track ( . dashboardPulledToRefresh)
404- reloadDashboardUIStatsVersion ( forced: true )
424+ await reloadDashboardUIStatsVersion ( forced: true )
405425 }
406426}
407427
408428// MARK: - Private Helpers
409429//
410430private extension DashboardViewController {
411- func reloadData( forced: Bool ) {
431+ @MainActor
432+ func reloadData( forced: Bool ) async {
412433 DDLogInfo ( " ♻️ Requesting dashboard data be reloaded... " )
413- dashboardUI? . reloadData ( forced: forced, completion: { [ weak self] in
414- self ? . configureTitle ( )
415- } )
434+ await dashboardUI? . reloadData ( forced: forced)
435+ configureTitle ( )
416436 }
417437
418438 func observeSiteForUIUpdates( ) {
@@ -424,7 +444,9 @@ private extension DashboardViewController {
424444 return
425445 }
426446 self . updateUI ( site: site)
427- self . reloadData ( forced: true )
447+ Task { @MainActor [ weak self] in
448+ await self ? . reloadData ( forced: true )
449+ }
428450 } . store ( in: & subscriptions)
429451 }
430452
0 commit comments