@@ -69,6 +69,8 @@ final class DashboardViewModel: ObservableObject {
6969
7070 @Published private( set) var isEligibleForInbox = false
7171
72+ @Published private( set) var isEligibleForStock = false
73+
7274 @Published var showingCustomization = false
7375
7476 @Published private( set) var showNewCardsNotice = false
@@ -83,6 +85,7 @@ final class DashboardViewModel: ObservableObject {
8385 private let userDefaults : UserDefaults
8486 private let storageManager : StorageManagerType
8587 private let inboxEligibilityChecker : InboxEligibilityChecker
88+ private let siteIsCIABEligibilityChecker : CIABEligibilityCheckerProtocol
8689 private let usageTracksEventEmitter : StoreStatsUsageTracksEventEmitter
8790 private let blazeLocalNotificationScheduler : BlazeLocalNotificationScheduler
8891 private let tapToPayAwarenessMomentDeterminer : TapToPayAwarenessMomentDetermining
@@ -118,6 +121,7 @@ final class DashboardViewModel: ObservableObject {
118121 blazeEligibilityChecker: BlazeEligibilityCheckerProtocol = BlazeEligibilityChecker ( ) ,
119122 inboxEligibilityChecker: InboxEligibilityChecker = InboxEligibilityUseCase ( ) ,
120123 googleAdsEligibilityChecker: GoogleAdsEligibilityChecker = DefaultGoogleAdsEligibilityChecker ( ) ,
124+ siteIsCIABEligibilityChecker: CIABEligibilityCheckerProtocol = CIABEligibilityChecker ( ) ,
121125 localNotificationScheduler: BlazeLocalNotificationScheduler ? = nil ,
122126 tapToPayAwarenessMomentDeterminer: TapToPayAwarenessMomentDetermining = TapToPayAwarenessMomentDeterminer ( ) ) {
123127 self . siteID = siteID
@@ -147,6 +151,7 @@ final class DashboardViewModel: ObservableObject {
147151 )
148152
149153 self . inboxEligibilityChecker = inboxEligibilityChecker
154+ self . siteIsCIABEligibilityChecker = siteIsCIABEligibilityChecker
150155 self . usageTracksEventEmitter = usageTracksEventEmitter
151156
152157 self . blazeLocalNotificationScheduler = localNotificationScheduler ?? DefaultBlazeLocalNotificationScheduler ( siteID: siteID,
@@ -164,6 +169,7 @@ final class DashboardViewModel: ObservableObject {
164169 self ? . onInAppFeedbackCardAction ( )
165170 }
166171
172+ observeStockEligibility ( )
167173 configureOrdersResultController ( )
168174 setupDashboardCards ( )
169175 observeWPCOMSiteSuspendedState ( )
@@ -187,6 +193,7 @@ final class DashboardViewModel: ObservableObject {
187193 canShowBlaze: blazeCampaignDashboardViewModel. canShowInDashboard,
188194 canShowGoogle: googleAdsDashboardCardViewModel. canShowOnDashboard,
189195 canShowInbox: isEligibleForInbox,
196+ canShowStock: isEligibleForStock,
190197 hasOrders: hasOrders)
191198
192199 await reloadCardsWithBackgroundUpdateSupportIfNeeded ( )
@@ -487,18 +494,20 @@ private extension DashboardViewModel {
487494private extension DashboardViewModel {
488495 func observeValuesForDashboardCards( ) {
489496 storeOnboardingViewModel. $canShowInDashboard
490- . combineLatest ( blazeCampaignDashboardViewModel. $canShowInDashboard)
497+ . combineLatest ( blazeCampaignDashboardViewModel. $canShowInDashboard,
498+ $isEligibleForStock)
491499 . combineLatest ( googleAdsDashboardCardViewModel. $canShowOnDashboard,
492500 $hasOrders,
493501 $isEligibleForInbox)
494502 . receive ( on: DispatchQueue . main)
495503 . sink { [ weak self] combinedResult in
496504 guard let self else { return }
497- let ( ( canShowOnboarding, canShowBlaze) , canShowGoogle, hasOrders, isEligibleForInbox) = combinedResult
505+ let ( ( canShowOnboarding, canShowBlaze, canShowStock ) , canShowGoogle, hasOrders, isEligibleForInbox) = combinedResult
498506 updateDashboardCards ( canShowOnboarding: canShowOnboarding,
499507 canShowBlaze: canShowBlaze,
500508 canShowGoogle: canShowGoogle,
501509 canShowInbox: isEligibleForInbox,
510+ canShowStock: canShowStock,
502511 hasOrders: hasOrders)
503512 }
504513 . store ( in: & subscriptions)
@@ -531,6 +540,26 @@ private extension DashboardViewModel {
531540 isEligibleForInbox = inboxEligibilityChecker. isEligibleForInbox ( siteID: siteID)
532541 }
533542
543+ func observeStockEligibility( ) {
544+ stores. site
545+ . removeDuplicates ( )
546+ . map { [ weak self] in
547+ guard
548+ let self,
549+ let site = $0
550+ else {
551+ return false
552+ }
553+
554+ return siteIsCIABEligibilityChecker
555+ . isFeatureSupported (
556+ . productsStockDashboardCard,
557+ for: site
558+ )
559+ }
560+ . assign ( to: & $isEligibleForStock)
561+ }
562+
534563 func configureOrdersResultController( ) {
535564 func refreshHasOrders( ) {
536565 /// Upon logging out, `CoreDataManager` clears the storage triggering data change.
@@ -586,6 +615,7 @@ private extension DashboardViewModel {
586615 canShowGoogle: Bool ,
587616 canShowAnalytics: Bool ,
588617 canShowLastOrders: Bool ,
618+ canShowStock: Bool ,
589619 canShowInbox: Bool ) -> [ DashboardCard ] {
590620 var cards = [ DashboardCard] ( )
591621
@@ -616,7 +646,14 @@ private extension DashboardViewModel {
616646 enabled: false ) )
617647 cards. append ( DashboardCard ( type: . reviews, availability: . show, enabled: false ) )
618648 cards. append ( DashboardCard ( type: . coupons, availability: . show, enabled: false ) )
619- cards. append ( DashboardCard ( type: . stock, availability: . show, enabled: false ) )
649+
650+ cards. append (
651+ DashboardCard (
652+ type: . stock,
653+ availability: canShowStock ? . show : . hide,
654+ enabled: false
655+ )
656+ )
620657
621658 // When not available, Last orders cards need to be hidden from Dashboard, but appear on Customize as "Unavailable"
622659 cards. append ( DashboardCard ( type: . lastOrders,
@@ -634,6 +671,7 @@ private extension DashboardViewModel {
634671 canShowBlaze: Bool ,
635672 canShowGoogle: Bool ,
636673 canShowInbox: Bool ,
674+ canShowStock: Bool ,
637675 hasOrders: Bool ) {
638676
639677 let canShowAnalytics = hasOrders
@@ -645,6 +683,7 @@ private extension DashboardViewModel {
645683 canShowGoogle: canShowGoogle,
646684 canShowAnalytics: canShowAnalytics,
647685 canShowLastOrders: canShowLastOrders,
686+ canShowStock: canShowStock,
648687 canShowInbox: canShowInbox)
649688
650689 // Next, get saved cards and preserve existing enabled state for all available cards.
0 commit comments