@@ -41,20 +41,31 @@ final class StoreStatsPeriodViewModel {
4141
4242 /// Emits visitor stats text values based on site visit stats and selected time interval.
4343 private( set) lazy var visitorStatsText : AnyPublisher < String , Never > =
44- Publishers . CombineLatest ( $siteStats. eraseToAnyPublisher ( ) , $selectedIntervalIndex. eraseToAnyPublisher ( ) )
45- . compactMap { siteStats, selectedIntervalIndex in
46- StatsDataTextFormatter . createVisitorCountText ( siteStats: siteStats, selectedIntervalIndex: selectedIntervalIndex)
44+ Publishers . CombineLatest3 ( $siteStats. eraseToAnyPublisher ( ) , $selectedIntervalIndex. eraseToAnyPublisher ( ) , $summaryStats. eraseToAnyPublisher ( ) )
45+ . compactMap { siteStats, selectedIntervalIndex, summaryStats in
46+ if let selectedIntervalIndex {
47+ return StatsDataTextFormatter . createVisitorCountText ( siteStats: siteStats, selectedIntervalIndex: selectedIntervalIndex)
48+ } else {
49+ return StatsDataTextFormatter . createVisitorCountText ( siteStats: summaryStats)
50+ }
4751 }
4852 . removeDuplicates ( )
4953 . eraseToAnyPublisher ( )
5054
5155 /// Emits conversion stats text values based on order stats, site visit stats, and selected time interval.
5256 private( set) lazy var conversionStatsText : AnyPublisher < String , Never > =
53- Publishers . CombineLatest3 ( $orderStatsData. eraseToAnyPublisher ( ) , $siteStats. eraseToAnyPublisher ( ) , $selectedIntervalIndex. eraseToAnyPublisher ( ) )
54- . compactMap { orderStatsData, siteStats, selectedIntervalIndex in
55- StatsDataTextFormatter . createConversionRateText ( orderStats: orderStatsData. stats,
56- siteStats: siteStats,
57- selectedIntervalIndex: selectedIntervalIndex)
57+ Publishers . CombineLatest4 ( $orderStatsData. eraseToAnyPublisher ( ) ,
58+ $siteStats. eraseToAnyPublisher ( ) ,
59+ $selectedIntervalIndex. eraseToAnyPublisher ( ) ,
60+ $summaryStats. eraseToAnyPublisher ( ) )
61+ . compactMap { orderStatsData, siteStats, selectedIntervalIndex, summaryStats in
62+ if let selectedIntervalIndex {
63+ return StatsDataTextFormatter . createConversionRateText ( orderStats: orderStatsData. stats,
64+ siteStats: siteStats,
65+ selectedIntervalIndex: selectedIntervalIndex)
66+ } else {
67+ return StatsDataTextFormatter . createConversionRateText ( orderStats: orderStatsData. stats, siteStats: summaryStats)
68+ }
5869 }
5970 . removeDuplicates ( )
6071 . eraseToAnyPublisher ( )
@@ -106,6 +117,7 @@ final class StoreStatsPeriodViewModel {
106117 // MARK: - Private data
107118
108119 @Published private var siteStats : SiteVisitStats ?
120+ @Published private var summaryStats : SiteSummaryStats ?
109121
110122 typealias OrderStatsData = ( stats: OrderStatsV4 ? , intervals: [ OrderStatsV4Interval ] )
111123 @Published private var orderStatsData : OrderStatsData = ( nil , [ ] )
@@ -128,13 +140,27 @@ final class StoreStatsPeriodViewModel {
128140 return ResultsController ( storageManager: storageManager, matching: predicate, sortedBy: [ ] )
129141 } ( )
130142
143+ /// SiteSummaryStats ResultsController: Loads site summary stats from the Storage Layer
144+ private lazy var summaryStatsResultsController : ResultsController < StorageSiteSummaryStats > = {
145+ let formattedDateString : String = {
146+ let date = timeRange. latestDate ( currentDate: currentDate, siteTimezone: siteTimezone)
147+ return StatsStoreV4 . buildDateString ( from: date, with: . day)
148+ } ( )
149+ let predicate = NSPredicate ( format: " siteID = %ld AND period == %@ AND date == %@ " ,
150+ siteID,
151+ timeRange. summaryStatsGranularity. rawValue,
152+ formattedDateString)
153+ return ResultsController ( storageManager: storageManager, matching: predicate, sortedBy: [ ] )
154+ } ( )
155+
131156 // MARK: - Configurations
132157
133158 /// Updated externally when reloading data.
134159 var siteTimezone : TimeZone
135160
136161 private let siteID : Int64
137162 private let timeRange : StatsTimeRangeV4
163+ private let currentDate : Date
138164 private let currencyFormatter : CurrencyFormatter
139165 private let storageManager : StorageManagerType
140166 private let currencySettings : CurrencySettings
@@ -144,12 +170,14 @@ final class StoreStatsPeriodViewModel {
144170 init ( siteID: Int64 ,
145171 timeRange: StatsTimeRangeV4 ,
146172 siteTimezone: TimeZone ,
173+ currentDate: Date ,
147174 currencyFormatter: CurrencyFormatter ,
148175 currencySettings: CurrencySettings ,
149176 storageManager: StorageManagerType = ServiceLocator . storageManager) {
150177 self . siteID = siteID
151178 self . timeRange = timeRange
152179 self . siteTimezone = siteTimezone
180+ self . currentDate = currentDate
153181 self . currencyFormatter = currencyFormatter
154182 self . currencySettings = currencySettings
155183 self . storageManager = storageManager
@@ -239,6 +267,7 @@ private extension StoreStatsPeriodViewModel {
239267 func configureResultsControllers( ) {
240268 configureSiteStatsResultsController ( )
241269 configureOrderStatsResultsController ( )
270+ configureSummaryStatsResultsController ( )
242271 }
243272
244273 func configureOrderStatsResultsController( ) {
@@ -260,6 +289,16 @@ private extension StoreStatsPeriodViewModel {
260289 }
261290 try ? siteStatsResultsController. performFetch ( )
262291 }
292+
293+ func configureSummaryStatsResultsController( ) {
294+ summaryStatsResultsController. onDidChangeContent = { [ weak self] in
295+ self ? . updateSiteSummaryDataIfNeeded ( )
296+ }
297+ summaryStatsResultsController. onDidResetContent = { [ weak self] in
298+ self ? . updateSiteSummaryDataIfNeeded ( )
299+ }
300+ try ? summaryStatsResultsController. performFetch ( )
301+ }
263302}
264303
265304// MARK: - Private Helpers
@@ -269,6 +308,10 @@ private extension StoreStatsPeriodViewModel {
269308 siteStats = siteStatsResultsController. fetchedObjects. first
270309 }
271310
311+ func updateSiteSummaryDataIfNeeded( ) {
312+ summaryStats = summaryStatsResultsController. fetchedObjects. first
313+ }
314+
272315 func updateOrderDataIfNeeded( ) {
273316 let orderStats = orderStatsResultsController. fetchedObjects. first
274317 let intervals = StatsIntervalDataParser . sortOrderStatsIntervals ( from: orderStats)
0 commit comments