Skip to content

Commit 0af536a

Browse files
authored
Merge pull request #8267 from woocommerce/issue/8146-introduce-last-range-structure
[Analytics Hub] Refactor Time Range data structure
2 parents e61e97c + a944617 commit 0af536a

File tree

12 files changed

+333
-257
lines changed

12 files changed

+333
-257
lines changed

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubTimeRangeGenerator.swift

Lines changed: 0 additions & 212 deletions
This file was deleted.

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/AnalyticsHubViewModel.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ final class AnalyticsHubViewModel: ObservableObject {
1515
init(siteID: Int64,
1616
statsTimeRange: StatsTimeRangeV4,
1717
stores: StoresManager = ServiceLocator.stores) {
18-
let selectedType = AnalyticsHubTimeRangeGenerator.SelectionType.from(statsTimeRange)
19-
let timeRangeGenerator = AnalyticsHubTimeRangeGenerator(selectionType: selectedType)
18+
let selectedType = AnalyticsHubTimeRangeSelection.SelectionType(statsTimeRange)
19+
let timeRangeSelection = AnalyticsHubTimeRangeSelection(selectionType: selectedType)
2020

2121
self.siteID = siteID
2222
self.stores = stores
2323
self.timeRangeSelectionType = selectedType
24-
self.timeRangeGenerator = timeRangeGenerator
25-
self.timeRangeCard = AnalyticsHubViewModel.timeRangeCard(timeRangeGenerator: timeRangeGenerator)
24+
self.timeRangeSelection = timeRangeSelection
25+
self.timeRangeCard = AnalyticsHubViewModel.timeRangeCard(timeRangeSelection: timeRangeSelection)
2626

2727
bindViewModelsWithData()
2828
}
@@ -41,7 +41,7 @@ final class AnalyticsHubViewModel: ObservableObject {
4141

4242
/// Time Range Selection Type
4343
///
44-
@Published var timeRangeSelectionType: AnalyticsHubTimeRangeGenerator.SelectionType
44+
@Published var timeRangeSelectionType: AnalyticsHubTimeRangeSelection.SelectionType
4545

4646
/// Time Range ViewModel
4747
///
@@ -59,7 +59,7 @@ final class AnalyticsHubViewModel: ObservableObject {
5959

6060
/// Time Range selection data defining the current and previous time period
6161
///
62-
private var timeRangeGenerator: AnalyticsHubTimeRangeGenerator
62+
private var timeRangeSelection: AnalyticsHubTimeRangeSelection
6363

6464
/// Request stats data from network
6565
///
@@ -80,8 +80,8 @@ private extension AnalyticsHubViewModel {
8080
func retrieveOrderStats() async throws {
8181
switchToLoadingState()
8282

83-
let currentTimeRange = try timeRangeGenerator.unwrapCurrentTimeRange()
84-
let previousTimeRange = try timeRangeGenerator.unwrapPreviousTimeRange()
83+
let currentTimeRange = try timeRangeSelection.unwrapCurrentTimeRange()
84+
let previousTimeRange = try timeRangeSelection.unwrapPreviousTimeRange()
8585

8686
async let currentPeriodRequest = retrieveStats(earliestDateToInclude: currentTimeRange.start,
8787
latestDateToInclude: currentTimeRange.end,
@@ -145,8 +145,8 @@ private extension AnalyticsHubViewModel {
145145
.removeDuplicates()
146146
.sink { [weak self] newSelectionType in
147147
guard let self else { return }
148-
self.timeRangeGenerator = AnalyticsHubTimeRangeGenerator(selectionType: newSelectionType)
149-
self.timeRangeCard = AnalyticsHubViewModel.timeRangeCard(timeRangeGenerator: self.timeRangeGenerator)
148+
self.timeRangeSelection = AnalyticsHubTimeRangeSelection(selectionType: newSelectionType)
149+
self.timeRangeCard = AnalyticsHubViewModel.timeRangeCard(timeRangeSelection: self.timeRangeSelection)
150150
Task.init {
151151
await self.updateData()
152152
}
@@ -208,10 +208,10 @@ private extension AnalyticsHubViewModel {
208208
isRedacted: false)
209209
}
210210

211-
static func timeRangeCard(timeRangeGenerator: AnalyticsHubTimeRangeGenerator) -> AnalyticsTimeRangeCardViewModel {
212-
return AnalyticsTimeRangeCardViewModel(selectedRangeTitle: timeRangeGenerator.selectionDescription,
213-
currentRangeSubtitle: timeRangeGenerator.generateCurrentRangeDescription(),
214-
previousRangeSubtitle: timeRangeGenerator.generatePreviousRangeDescription())
211+
static func timeRangeCard(timeRangeSelection: AnalyticsHubTimeRangeSelection) -> AnalyticsTimeRangeCardViewModel {
212+
return AnalyticsTimeRangeCardViewModel(selectedRangeTitle: timeRangeSelection.rangeSelectionDescription,
213+
currentRangeSubtitle: timeRangeSelection.currentRangeDescription,
214+
previousRangeSubtitle: timeRangeSelection.previousRangeDescription)
215215
}
216216
}
217217

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/AnalyticsTimeRangeCard.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ struct AnalyticsTimeRangeCard: View {
77
let timeRangeTitle: String
88
let currentRangeDescription: String
99
let previousRangeDescription: String
10-
@Binding var selectionType: AnalyticsHubTimeRangeGenerator.SelectionType
10+
@Binding var selectionType: AnalyticsHubTimeRangeSelection.SelectionType
1111

1212
@State private var showTimeRangeSelectionView: Bool = false
1313

14-
init(viewModel: AnalyticsTimeRangeCardViewModel, selectionType: Binding<AnalyticsHubTimeRangeGenerator.SelectionType>) {
14+
init(viewModel: AnalyticsTimeRangeCardViewModel, selectionType: Binding<AnalyticsHubTimeRangeSelection.SelectionType>) {
1515
self.timeRangeTitle = viewModel.selectedRangeTitle
1616
self.currentRangeDescription = viewModel.currentRangeSubtitle
1717
self.previousRangeDescription = viewModel.previousRangeSubtitle
@@ -22,7 +22,7 @@ struct AnalyticsTimeRangeCard: View {
2222
createTimeRangeContent()
2323
.sheet(isPresented: $showTimeRangeSelectionView) {
2424
SelectionList(title: Localization.timeRangeSelectionTitle,
25-
items: AnalyticsHubTimeRangeGenerator.SelectionType.allCases,
25+
items: AnalyticsHubTimeRangeSelection.SelectionType.allCases,
2626
contentKeyPath: \.description,
2727
selected: $selectionType)
2828
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import Foundation
2+
3+
struct AnalyticsHubDayRangeData: AnalyticsHubTimeRangeData {
4+
let currentDateStart: Date?
5+
let currentDateEnd: Date?
6+
let previousDateStart: Date?
7+
let previousDateEnd: Date?
8+
9+
init(referenceDate: Date, timezone: TimeZone, calendar: Calendar) {
10+
self.currentDateEnd = referenceDate
11+
self.currentDateStart = referenceDate.startOfDay(timezone: timezone)
12+
let previousDateEnd = calendar.date(byAdding: .day, value: -1, to: referenceDate)
13+
self.previousDateEnd = previousDateEnd
14+
self.previousDateStart = previousDateEnd?.startOfDay(timezone: timezone)
15+
}
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import Foundation
2+
3+
struct AnalyticsHubMonthRangeData: AnalyticsHubTimeRangeData {
4+
let currentDateStart: Date?
5+
let currentDateEnd: Date?
6+
let previousDateStart: Date?
7+
let previousDateEnd: Date?
8+
9+
init(referenceDate: Date, timezone: TimeZone, calendar: Calendar) {
10+
self.currentDateEnd = referenceDate
11+
self.currentDateStart = referenceDate.startOfMonth(timezone: timezone)
12+
let previousDateEnd = calendar.date(byAdding: .month, value: -1, to: referenceDate)
13+
self.previousDateEnd = previousDateEnd
14+
self.previousDateStart = previousDateEnd?.startOfMonth(timezone: timezone)
15+
}
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import Foundation
2+
3+
struct AnalyticsHubTimeRange {
4+
let start: Date
5+
let end: Date
6+
7+
func formatToString(simplified: Bool, calendar: Calendar) -> String {
8+
if simplified {
9+
return DateFormatter.Stats.analyticsHubDayMonthYearFormatter.string(from: start)
10+
}
11+
12+
let startDateDescription = DateFormatter.Stats.analyticsHubDayMonthFormatter.string(from: start)
13+
14+
if start.isSameMonth(as: end, using: calendar) {
15+
return "\(startDateDescription) - \(DateFormatter.Stats.analyticsHubDayYearFormatter.string(from: end))"
16+
} else {
17+
return "\(startDateDescription) - \(DateFormatter.Stats.analyticsHubDayMonthYearFormatter.string(from: end))"
18+
}
19+
}
20+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Foundation
2+
3+
protocol AnalyticsHubTimeRangeData {
4+
var currentDateStart: Date? { get }
5+
var currentDateEnd: Date? { get }
6+
var previousDateStart: Date? { get }
7+
var previousDateEnd: Date? { get }
8+
9+
init(referenceDate: Date, timezone: TimeZone, calendar: Calendar)
10+
}
11+
12+
extension AnalyticsHubTimeRangeData {
13+
var currentTimeRange: AnalyticsHubTimeRange? {
14+
generateTimeRangeFrom(startDate: currentDateStart, endDate: currentDateEnd)
15+
}
16+
17+
var previousTimeRange: AnalyticsHubTimeRange? {
18+
generateTimeRangeFrom(startDate: previousDateStart, endDate: previousDateEnd)
19+
}
20+
21+
private func generateTimeRangeFrom(startDate: Date?, endDate: Date?) -> AnalyticsHubTimeRange? {
22+
if let startDate = startDate,
23+
let endDate = endDate {
24+
return AnalyticsHubTimeRange(start: startDate, end: endDate)
25+
} else {
26+
return nil
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)