Skip to content

Commit 3a8dcca

Browse files
authored
Merge pull request #8613 from woocommerce/issue/fix-hub-ranges-timezone-rule
Analytics Hub: Fix range generation structure
2 parents b69dd5b + 57766ae commit 3a8dcca

20 files changed

+206
-141
lines changed

Networking/Networking/Extensions/DateFormatter+Woo.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public extension DateFormatter {
107107
/// Date formatter used for creating the properly-formatted date range info. Typically
108108
/// used when setting the end date on `AnalyticsHubTimeRangeGenerator`.
109109
///
110-
public static func createAnalyticsHubDayMonthYearFormatter(timezone: TimeZone) -> DateFormatter {
110+
public static func createDayMonthYearFormatter(timezone: TimeZone) -> DateFormatter {
111111
let formatter = DateFormatter()
112112
formatter.timeZone = timezone
113113
formatter.dateFormat = "MMM d, yyyy"
@@ -117,7 +117,7 @@ public extension DateFormatter {
117117
/// Date formatter used for creating the properly-formatted date range info. Typically
118118
/// used when setting the end date of a same-month range on `AnalyticsHubTimeRangeGenerator`.
119119
///
120-
public static func createAnalyticsHubDayYearFormatter(timezone: TimeZone) -> DateFormatter {
120+
public static func createDayYearFormatter(timezone: TimeZone) -> DateFormatter {
121121
let formatter = DateFormatter()
122122
formatter.timeZone = timezone
123123
formatter.dateFormat = "d, yyyy"
@@ -127,7 +127,7 @@ public extension DateFormatter {
127127
/// Date formatter used for creating the properly-formatted date range info. Typically
128128
/// used when setting the start date on `AnalyticsHubTimeRangeGenerator`.
129129
///
130-
public static func createAnalyticsHubDayMonthFormatter(timezone: TimeZone) -> DateFormatter {
130+
public static func createDayMonthFormatter(timezone: TimeZone) -> DateFormatter {
131131
let formatter = DateFormatter()
132132
formatter.timeZone = timezone
133133
formatter.dateFormat = "MMM d"

WooCommerce/Classes/Extensions/Date+Woo.swift

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,46 @@ extension Date {
5757
return Strings.presentDeicticExpression
5858
}
5959

60+
/// Returns a localized string used for describe a date range string based on two dates. E.g.
61+
///
62+
/// receiver: 2021-01-01
63+
/// other: 2022-12-31
64+
/// returns: Jan 1, 2021 - Dec 31, 2022
65+
///
66+
/// receiver: 2021-01-01
67+
/// other: 2021-01-31
68+
/// returns: Jan 1 - 31, 2022
69+
///
70+
/// receiver: 2021-01-01
71+
/// other: 2022-01-01
72+
/// returns: Jan 1, 2021 - Jan 1, 2022
73+
///
74+
/// receiver: 2022-01-1
75+
/// other: nil
76+
/// returns: Jan 1, 2022
77+
///
78+
func formatAsRange(with other: Date? = nil, timezone: TimeZone, calendar: Calendar) -> String {
79+
guard let other else {
80+
return DateFormatter.Stats.createDayMonthYearFormatter(timezone: timezone).string(from: self)
81+
}
82+
83+
let formattedStart: String
84+
if self.isSameYear(as: other, using: calendar) {
85+
formattedStart = DateFormatter.Stats.createDayMonthFormatter(timezone: timezone).string(from: self)
86+
} else {
87+
formattedStart = DateFormatter.Stats.createDayMonthYearFormatter(timezone: timezone).string(from: self)
88+
}
89+
90+
let formattedEnd: String
91+
if self.isSameMonth(as: other, using: calendar) {
92+
formattedEnd = DateFormatter.Stats.createDayYearFormatter(timezone: timezone).string(from: other)
93+
} else {
94+
formattedEnd = DateFormatter.Stats.createDayMonthYearFormatter(timezone: timezone).string(from: other)
95+
}
96+
97+
return "\(formattedStart) - \(formattedEnd)"
98+
}
99+
60100
/// Returns the next midnight starting from `self`.
61101
///
62102
/// For example, if `self` is 2020-01-03 00:41:09, the returned value will be 2020-01-04 00:00:00.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ private extension AnalyticsTimeRangeCard {
125125
///
126126
struct DatesFormatter: RangedDateTextFormatter {
127127
func format(start: Date, end: Date) -> String {
128-
AnalyticsHubTimeRange(start: start, end: end).formatToString(simplified: false, timezone: .current, calendar: Locale.current.calendar)
128+
start.formatAsRange(with: end, timezone: .current, calendar: Locale.current.calendar)
129129
}
130130
}
131131
}

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/Time Range/AnalyticsHubTimeRange.swift

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,4 @@ import Foundation
33
struct AnalyticsHubTimeRange {
44
let start: Date
55
let end: Date
6-
7-
func formatToString(simplified: Bool, timezone: TimeZone, calendar: Calendar) -> String {
8-
if simplified {
9-
return DateFormatter.Stats.createAnalyticsHubDayMonthYearFormatter(timezone: timezone).string(from: start)
10-
}
11-
12-
let startDateDescription: String
13-
if start.isSameYear(as: end, using: calendar) {
14-
startDateDescription = DateFormatter.Stats.createAnalyticsHubDayMonthFormatter(timezone: timezone).string(from: start)
15-
} else {
16-
startDateDescription = DateFormatter.Stats.createAnalyticsHubDayMonthYearFormatter(timezone: timezone).string(from: start)
17-
}
18-
19-
let endDateDescription: String
20-
if start.isSameMonth(as: end, using: calendar) {
21-
endDateDescription = DateFormatter.Stats.createAnalyticsHubDayYearFormatter(timezone: timezone).string(from: end)
22-
} else {
23-
endDateDescription = DateFormatter.Stats.createAnalyticsHubDayMonthYearFormatter(timezone: timezone).string(from: end)
24-
}
25-
26-
return "\(startDateDescription) - \(endDateDescription)"
27-
}
286
}

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/Time Range/AnalyticsHubTimeRangeData.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ import Foundation
33
protocol AnalyticsHubTimeRangeData {
44
var currentDateStart: Date? { get }
55
var currentDateEnd: Date? { get }
6+
var formattedCurrentRange: String? { get }
7+
68
var previousDateStart: Date? { get }
79
var previousDateEnd: Date? { get }
10+
var formattedPreviousRange: String? { get }
811
}
912

1013
extension AnalyticsHubTimeRangeData {

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/Time Range/AnalyticsHubTimeRangeSelection.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,11 @@ public class AnalyticsHubTimeRangeSelection {
4444
return
4545
}
4646

47-
let currentTimeRange = selectionData.currentTimeRange
48-
let previousTimeRange = selectionData.previousTimeRange
49-
let useShortFormat = selectionType == .today || selectionType == .yesterday
50-
51-
self.currentTimeRange = currentTimeRange
52-
self.previousTimeRange = previousTimeRange
47+
self.currentTimeRange = selectionData.currentTimeRange
48+
self.previousTimeRange = selectionData.previousTimeRange
5349
self.rangeSelectionDescription = selectionType.description
54-
self.formattedCurrentRangeText = currentTimeRange?.formatToString(simplified: useShortFormat, timezone: timezone, calendar: calendar)
55-
self.formattedPreviousRangeText = previousTimeRange?.formatToString(simplified: useShortFormat, timezone: timezone, calendar: calendar)
50+
self.formattedCurrentRangeText = selectionData.formattedCurrentRange
51+
self.formattedPreviousRangeText = selectionData.formattedPreviousRange
5652
}
5753

5854
/// Unwrap the generated selected `AnalyticsHubTimeRange` based on the `selectedTimeRange`

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/Time Range/Range Data Generation/AnalyticsHubCustomRangeData.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ import Foundation
1010
struct AnalyticsHubCustomRangeData: AnalyticsHubTimeRangeData {
1111
var currentDateStart: Date?
1212
var currentDateEnd: Date?
13+
var formattedCurrentRange: String?
1314

1415
var previousDateStart: Date?
1516
var previousDateEnd: Date?
17+
var formattedPreviousRange: String?
1618

1719
init(start: Date, end: Date, timezone: TimeZone, calendar: Calendar) {
1820
guard
@@ -21,10 +23,12 @@ struct AnalyticsHubCustomRangeData: AnalyticsHubTimeRangeData {
2123
let previousStart = calendar.date(byAdding: .day, value: -dayDifference, to: previousEnd) else {
2224
return
2325
}
24-
2526
self.currentDateStart = start.startOfDay(timezone: timezone)
2627
self.currentDateEnd = end.endOfDay(timezone: timezone)
28+
self.formattedCurrentRange = currentDateStart?.formatAsRange(with: currentDateEnd, timezone: timezone, calendar: calendar)
29+
2730
self.previousDateStart = previousStart.startOfDay(timezone: timezone)
2831
self.previousDateEnd = previousEnd.startOfDay(timezone: timezone)
32+
self.formattedPreviousRange = previousDateStart?.formatAsRange(with: previousDateEnd, timezone: timezone, calendar: calendar)
2933
}
3034
}

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/Time Range/Range Data Generation/AnalyticsHubLastMonthRangeData.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,21 @@ import Foundation
1111
struct AnalyticsHubLastMonthRangeData: AnalyticsHubTimeRangeData {
1212
let currentDateStart: Date?
1313
let currentDateEnd: Date?
14+
let formattedCurrentRange: String?
15+
1416
let previousDateStart: Date?
1517
let previousDateEnd: Date?
18+
let formattedPreviousRange: String?
1619

1720
init(referenceDate: Date, timezone: TimeZone, calendar: Calendar) {
1821
let oneMonthAgo = calendar.date(byAdding: .month, value: -1, to: referenceDate)
1922
self.currentDateEnd = oneMonthAgo?.endOfMonth(timezone: timezone)
2023
self.currentDateStart = oneMonthAgo?.startOfMonth(timezone: timezone)
24+
self.formattedCurrentRange = currentDateStart?.formatAsRange(with: currentDateEnd, timezone: timezone, calendar: calendar)
2125

2226
let twoMonthsAgo = calendar.date(byAdding: .month, value: -2, to: referenceDate)
2327
self.previousDateEnd = twoMonthsAgo?.endOfMonth(timezone: timezone)
2428
self.previousDateStart = twoMonthsAgo?.startOfMonth(timezone: timezone)
29+
self.formattedPreviousRange = previousDateStart?.formatAsRange(with: previousDateEnd, timezone: timezone, calendar: calendar)
2530
}
2631
}

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/Time Range/Range Data Generation/AnalyticsHubLastQuarterRangeData.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,21 @@ import Foundation
1111
struct AnalyticsHubLastQuarterRangeData: AnalyticsHubTimeRangeData {
1212
let currentDateStart: Date?
1313
let currentDateEnd: Date?
14+
let formattedCurrentRange: String?
15+
1416
let previousDateStart: Date?
1517
let previousDateEnd: Date?
18+
let formattedPreviousRange: String?
1619

1720
init(referenceDate: Date, timezone: TimeZone, calendar: Calendar) {
1821
let oneQuarterAgo = calendar.date(byAdding: .month, value: -3, to: referenceDate)
1922
self.currentDateEnd = oneQuarterAgo?.endOfQuarter(timezone: timezone, calendar: calendar)
2023
self.currentDateStart = oneQuarterAgo?.startOfQuarter(timezone: timezone, calendar: calendar)
24+
self.formattedCurrentRange = currentDateStart?.formatAsRange(with: currentDateEnd, timezone: timezone, calendar: calendar)
2125

2226
let twoQuartersAgo = calendar.date(byAdding: .month, value: -6, to: referenceDate)
2327
self.previousDateEnd = twoQuartersAgo?.endOfQuarter(timezone: timezone, calendar: calendar)
2428
self.previousDateStart = twoQuartersAgo?.startOfQuarter(timezone: timezone, calendar: calendar)
29+
self.formattedPreviousRange = previousDateStart?.formatAsRange(with: previousDateEnd, timezone: timezone, calendar: calendar)
2530
}
2631
}

WooCommerce/Classes/ViewRelated/Dashboard/Analytics Hub/Time Range/Range Data Generation/AnalyticsHubLastWeekRangeData.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,21 @@ import Foundation
1111
struct AnalyticsHubLastWeekRangeData: AnalyticsHubTimeRangeData {
1212
let currentDateStart: Date?
1313
let currentDateEnd: Date?
14+
let formattedCurrentRange: String?
15+
1416
let previousDateStart: Date?
1517
let previousDateEnd: Date?
18+
let formattedPreviousRange: String?
1619

1720
init(referenceDate: Date, timezone: TimeZone, calendar: Calendar) {
1821
let oneWeekAgo = calendar.date(byAdding: .day, value: -7, to: referenceDate)
1922
self.currentDateEnd = oneWeekAgo?.endOfWeek(timezone: timezone, calendar: calendar)
2023
self.currentDateStart = oneWeekAgo?.startOfWeek(timezone: timezone, calendar: calendar)
24+
self.formattedCurrentRange = currentDateStart?.formatAsRange(with: currentDateEnd, timezone: timezone, calendar: calendar)
2125

2226
let twoWeeksAgo = calendar.date(byAdding: .day, value: -14, to: referenceDate)
2327
self.previousDateEnd = twoWeeksAgo?.endOfWeek(timezone: timezone, calendar: calendar)
2428
self.previousDateStart = twoWeeksAgo?.startOfWeek(timezone: timezone, calendar: calendar)
29+
self.formattedPreviousRange = previousDateStart?.formatAsRange(with: previousDateEnd, timezone: timezone, calendar: calendar)
2530
}
2631
}

0 commit comments

Comments
 (0)