Skip to content

Commit 249aab1

Browse files
committed
Implement site blaze eligibility observe in BlazeCampaignDashboardViewModel
1 parent 15f0388 commit 249aab1

File tree

1 file changed

+32
-15
lines changed

1 file changed

+32
-15
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/Blaze/BlazeCampaignDashboardViewModel.swift

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
7373
private let storageManager: StorageManagerType
7474
private let analytics: Analytics
7575

76-
private var isSiteEligibleForBlaze = false
76+
@Published private var isSiteEligibleForBlaze = false
7777
private let blazeEligibilityChecker: BlazeEligibilityCheckerProtocol
7878

7979
/// Blaze campaign ResultsController.
@@ -103,12 +103,13 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
103103
)
104104
}()
105105

106-
private(set) var latestPublishedProduct: BlazeCampaignProduct?
106+
@Published private(set) var latestPublishedProduct: BlazeCampaignProduct?
107107

108108
private var subscriptions: Set<AnyCancellable> = []
109109

110110
@Published private var syncingError: Error?
111-
111+
112+
private var cancellables = Set<AnyCancellable>()
112113

113114
init(siteID: Int64,
114115
stores: StoresManager = ServiceLocator.stores,
@@ -122,15 +123,33 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
122123
self.blazeEligibilityChecker = blazeEligibilityChecker
123124
self.state = .loading
124125

126+
observeIsSiteEligibleForBlaze()
127+
observeAvailability()
125128
observeSectionVisibility()
126129
configureResultsController()
127130
}
128131

132+
func observeIsSiteEligibleForBlaze() {
133+
stores.site
134+
.removeDuplicates()
135+
.sink { site in
136+
Task { [weak self] in
137+
guard
138+
let self,
139+
let site
140+
else {
141+
return
142+
}
143+
144+
isSiteEligibleForBlaze = await checkSiteEligibility(site)
145+
}
146+
}
147+
.store(in: &cancellables)
148+
}
149+
129150
@MainActor
130151
func checkAvailability() async {
131-
isSiteEligibleForBlaze = await checkSiteEligibility()
132152
try? await synchronizePublishedProducts()
133-
updateAvailability()
134153
}
135154

136155
@MainActor
@@ -140,8 +159,6 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
140159

141160
analytics.track(event: .DynamicDashboard.cardLoadingStarted(type: .blaze))
142161

143-
isSiteEligibleForBlaze = await checkSiteEligibility()
144-
145162
guard isSiteEligibleForBlaze else {
146163
update(state: .empty)
147164
return
@@ -221,10 +238,7 @@ private extension BlazeCampaignDashboardViewModel {
221238
})
222239
}
223240

224-
func checkSiteEligibility() async -> Bool {
225-
guard let site = stores.sessionManager.defaultSite else {
226-
return false
227-
}
241+
func checkSiteEligibility(_ site: Site) async -> Bool {
228242
return await blazeEligibilityChecker.isSiteEligible(site)
229243
}
230244

@@ -288,8 +302,13 @@ private extension BlazeCampaignDashboardViewModel {
288302
onStateChange?()
289303
}
290304

291-
func updateAvailability() {
292-
canShowInDashboard = isSiteEligibleForBlaze && latestPublishedProduct != nil
305+
func observeAvailability() {
306+
$isSiteEligibleForBlaze
307+
.combineLatest($latestPublishedProduct)
308+
.map { (isSiteEligibleForBlaze, latestPublishedProduct) in
309+
return isSiteEligibleForBlaze && latestPublishedProduct != nil
310+
}
311+
.assign(to: &$canShowInDashboard)
293312
}
294313

295314
func updateResults() {
@@ -321,11 +340,9 @@ private extension BlazeCampaignDashboardViewModel {
321340
productResultsController.onDidChangeContent = { [weak self] in
322341
guard let self else { return }
323342
latestPublishedProduct = productResultsController.fetchedObjects.first
324-
updateAvailability()
325343
updateResults()
326344
}
327345
productResultsController.onDidResetContent = { [weak self] in
328-
self?.updateAvailability()
329346
self?.updateResults()
330347
}
331348

0 commit comments

Comments
 (0)