@@ -73,7 +73,7 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
73
73
private let storageManager : StorageManagerType
74
74
private let analytics : Analytics
75
75
76
- private var isSiteEligibleForBlaze = false
76
+ @ Published private var isSiteEligibleForBlaze = false
77
77
private let blazeEligibilityChecker : BlazeEligibilityCheckerProtocol
78
78
79
79
/// Blaze campaign ResultsController.
@@ -103,12 +103,13 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
103
103
)
104
104
} ( )
105
105
106
- private( set) var latestPublishedProduct : BlazeCampaignProduct ?
106
+ @ Published private( set) var latestPublishedProduct : BlazeCampaignProduct ?
107
107
108
108
private var subscriptions : Set < AnyCancellable > = [ ]
109
109
110
110
@Published private var syncingError : Error ?
111
-
111
+
112
+ private var cancellables = Set < AnyCancellable > ( )
112
113
113
114
init ( siteID: Int64 ,
114
115
stores: StoresManager = ServiceLocator . stores,
@@ -122,15 +123,33 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
122
123
self . blazeEligibilityChecker = blazeEligibilityChecker
123
124
self . state = . loading
124
125
126
+ observeIsSiteEligibleForBlaze ( )
127
+ observeAvailability ( )
125
128
observeSectionVisibility ( )
126
129
configureResultsController ( )
127
130
}
128
131
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
+
129
150
@MainActor
130
151
func checkAvailability( ) async {
131
- isSiteEligibleForBlaze = await checkSiteEligibility ( )
132
152
try ? await synchronizePublishedProducts ( )
133
- updateAvailability ( )
134
153
}
135
154
136
155
@MainActor
@@ -140,8 +159,6 @@ final class BlazeCampaignDashboardViewModel: ObservableObject {
140
159
141
160
analytics. track ( event: . DynamicDashboard. cardLoadingStarted ( type: . blaze) )
142
161
143
- isSiteEligibleForBlaze = await checkSiteEligibility ( )
144
-
145
162
guard isSiteEligibleForBlaze else {
146
163
update ( state: . empty)
147
164
return
@@ -221,10 +238,7 @@ private extension BlazeCampaignDashboardViewModel {
221
238
} )
222
239
}
223
240
224
- func checkSiteEligibility( ) async -> Bool {
225
- guard let site = stores. sessionManager. defaultSite else {
226
- return false
227
- }
241
+ func checkSiteEligibility( _ site: Site ) async -> Bool {
228
242
return await blazeEligibilityChecker. isSiteEligible ( site)
229
243
}
230
244
@@ -288,8 +302,13 @@ private extension BlazeCampaignDashboardViewModel {
288
302
onStateChange ? ( )
289
303
}
290
304
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)
293
312
}
294
313
295
314
func updateResults( ) {
@@ -321,11 +340,9 @@ private extension BlazeCampaignDashboardViewModel {
321
340
productResultsController. onDidChangeContent = { [ weak self] in
322
341
guard let self else { return }
323
342
latestPublishedProduct = productResultsController. fetchedObjects. first
324
- updateAvailability ( )
325
343
updateResults ( )
326
344
}
327
345
productResultsController. onDidResetContent = { [ weak self] in
328
- self ? . updateAvailability ( )
329
346
self ? . updateResults ( )
330
347
}
331
348
0 commit comments