Skip to content

Commit 78d8f89

Browse files
authored
JetpackStatsWidgets (#24221)
* Move WidgetAnalytics to the app * Remove LockScreenSingleStatViewModel and other types from WordPress * Move AllTimeWidgetStats to JetpackStatsWidgetsCore * Fix * Move JetpackStatsWidgetConfiguration to JetpackStatsWidgetCore * Move TodayWidgetStats * Move HomeWidgetAllTimeData * Move HomeWidgetThisWeekData * Cleanup formatting in HomeWidgetThisWeek * Fix WordPressTest compilation
1 parent b5eb9c2 commit 78d8f89

33 files changed

+253
-262
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import Foundation
2+
3+
/// This struct contains data for the Insights All Time stats to be displayed in the corresponding widget.
4+
///
5+
6+
public struct AllTimeWidgetStats: Codable, Equatable {
7+
public let views: Int
8+
public let visitors: Int
9+
public let posts: Int
10+
public let bestViews: Int
11+
12+
public init(views: Int? = 0, visitors: Int? = 0, posts: Int? = 0, bestViews: Int? = 0) {
13+
self.views = views ?? 0
14+
self.visitors = visitors ?? 0
15+
self.posts = posts ?? 0
16+
self.bestViews = bestViews ?? 0
17+
}
18+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Foundation
2+
3+
public struct HomeWidgetAllTimeData: HomeWidgetData {
4+
public let siteID: Int
5+
public let siteName: String
6+
public let url: String
7+
public let timeZone: TimeZone
8+
public let date: Date
9+
public let stats: AllTimeWidgetStats
10+
public static let filename = WidgetStatsConfiguration.allTimeFilename
11+
12+
public var statsURL: URL? {
13+
guard let statsUrl = URL(string: "https://wordpress.com/stats/insights/") else {
14+
return nil
15+
}
16+
return statsUrl.appendingPathComponent(String(siteID))
17+
}
18+
19+
public init(siteID: Int, siteName: String, url: String, timeZone: TimeZone, date: Date, stats: AllTimeWidgetStats) {
20+
self.siteID = siteID
21+
self.siteName = siteName
22+
self.url = url
23+
self.timeZone = timeZone
24+
self.date = date
25+
self.stats = stats
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Foundation
2+
3+
public struct HomeWidgetThisWeekData: HomeWidgetData {
4+
public let siteID: Int
5+
public let siteName: String
6+
public let url: String
7+
public let timeZone: TimeZone
8+
public let date: Date
9+
public let stats: ThisWeekWidgetStats
10+
public static let filename = WidgetStatsConfiguration.thisWeekFilename
11+
12+
public var statsURL: URL? {
13+
guard let statsUrl = URL(string: "https://wordpress.com/stats/week/") else {
14+
return nil
15+
}
16+
return statsUrl.appendingPathComponent(String(siteID))
17+
}
18+
19+
public init(siteID: Int, siteName: String, url: String, timeZone: TimeZone, date: Date, stats: ThisWeekWidgetStats) {
20+
self.siteID = siteID
21+
self.siteName = siteName
22+
self.url = url
23+
self.timeZone = timeZone
24+
self.date = date
25+
self.stats = stats
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Foundation
2+
3+
public struct HomeWidgetTodayData: HomeWidgetData {
4+
public let siteID: Int
5+
public let siteName: String
6+
public let url: String
7+
public let timeZone: TimeZone
8+
public let date: Date
9+
public let stats: TodayWidgetStats
10+
public static let filename = WidgetStatsConfiguration.todayFilename
11+
12+
public var statsURL: URL? {
13+
guard let statsUrl = URL(string: "https://wordpress.com/stats/day/") else {
14+
return nil
15+
}
16+
return statsUrl.appendingPathComponent(String(siteID))
17+
}
18+
19+
public init(siteID: Int, siteName: String, url: String, timeZone: TimeZone, date: Date, stats: TodayWidgetStats) {
20+
self.siteID = siteID
21+
self.siteName = siteName
22+
self.url = url
23+
self.timeZone = timeZone
24+
self.date = date
25+
self.stats = stats
26+
}
27+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import Foundation
2+
3+
/// This struct contains data for the Insights Today stats to be displayed in the corresponding widget.
4+
///
5+
6+
public struct TodayWidgetStats: Codable, Equatable {
7+
public let views: Int
8+
public let visitors: Int
9+
public let likes: Int
10+
public let comments: Int
11+
12+
public init(views: Int? = 0, visitors: Int? = 0, likes: Int? = 0, comments: Int? = 0) {
13+
self.views = views ?? 0
14+
self.visitors = visitors ?? 0
15+
self.likes = likes ?? 0
16+
self.comments = comments ?? 0
17+
}
18+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import Foundation
2+
3+
public enum WidgetStatsConfiguration {
4+
public static let keychainTokenKey = "OAuth2Token"
5+
public static let keychainServiceName = "JetpackTodayWidget"
6+
public static let userDefaultsSiteIdKey = "JetpackHomeWidgetsSiteId"
7+
public static let userDefaultsLoggedInKey = "JetpackHomeWidgetsLoggedIn"
8+
public static let todayFilename = "JetpackHomeWidgetTodayData.plist"
9+
public static let allTimeFilename = "JetpackHomeWidgetAllTimeData.plist"
10+
public static let thisWeekFilename = "JetpackHomeWidgetThisWeekData.plist"
11+
12+
public enum Kind: String {
13+
case homeToday = "JetpackHomeWidgetToday"
14+
case homeAllTime = "JetpackHomeWidgetAllTime"
15+
case homeThisWeek = "JetpackHomeWidgetThisWeek"
16+
case lockScreenTodayViews = "JetpackLockScreenWidgetTodayViews"
17+
case lockScreenTodayLikesComments = "JetpackLockScreenWidgetTodayLikesComments"
18+
case lockScreenTodayViewsVisitors = "JetpackLockScreenWidgetTodayViewsVisitors"
19+
case lockScreenAllTimeViews = "JetpackLockScreenWidgetAllTimeViews"
20+
case lockScreenAllTimeViewsVisitors = "JetpackLockScreenWidgetAllTimeViewsVisitors"
21+
case lockScreenAllTimePostsBestViews = "JetpackLockScreenWidgetAllTimePostsBestViews"
22+
23+
public var countKey: String {
24+
return rawValue + "Properties"
25+
}
26+
}
27+
}

WordPress/Classes/Stores/StatsInsightsStore.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Foundation
22
import WordPressKit
33
import WordPressFlux
44
import WidgetKit
5+
import JetpackStatsWidgetsCore
56

67
enum InsightAction: Action {
78

WordPress/Classes/Stores/StatsPeriodStore.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Foundation
22
import WordPressFlux
33
import WidgetKit
4+
import JetpackStatsWidgetsCore
45

56
enum PeriodType: CaseIterable {
67
case timeIntervalsSummary

WordPress/Classes/Stores/StatsWidgetsStore.swift

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import Foundation
12
import JetpackStatsWidgetsCore
23
import SFHFKeychainUtils
34
import WidgetKit
@@ -36,8 +37,8 @@ class StatsWidgetsStore {
3637

3738
/// Initialize the local cache for widgets, if it does not exist
3839
@objc func initializeStatsWidgetsIfNeeded() {
39-
UserDefaults(suiteName: WPAppGroupName)?.setValue(AccountHelper.isLoggedIn, forKey: AppConfiguration.Widget.Stats.userDefaultsLoggedInKey)
40-
UserDefaults(suiteName: WPAppGroupName)?.setValue(AccountHelper.defaultSiteId, forKey: AppConfiguration.Widget.Stats.userDefaultsSiteIdKey)
40+
UserDefaults(suiteName: WPAppGroupName)?.setValue(AccountHelper.isLoggedIn, forKey: WidgetStatsConfiguration.userDefaultsLoggedInKey)
41+
UserDefaults(suiteName: WPAppGroupName)?.setValue(AccountHelper.defaultSiteId, forKey: WidgetStatsConfiguration.userDefaultsSiteIdKey)
4142
storeCredentials()
4243

4344
var isReloadRequired = false
@@ -269,15 +270,15 @@ private extension StatsWidgetsStore {
269270
@objc func handleAccountChangedNotification() {
270271
let isLoggedIn = AccountHelper.isLoggedIn
271272
let userDefaults = UserDefaults(suiteName: WPAppGroupName)
272-
userDefaults?.setValue(isLoggedIn, forKey: AppConfiguration.Widget.Stats.userDefaultsLoggedInKey)
273+
userDefaults?.setValue(isLoggedIn, forKey: WidgetStatsConfiguration.userDefaultsLoggedInKey)
273274

274275
guard !isLoggedIn else { return }
275276

276277
HomeWidgetTodayData.delete()
277278
HomeWidgetThisWeekData.delete()
278279
HomeWidgetAllTimeData.delete()
279280

280-
userDefaults?.setValue(nil, forKey: AppConfiguration.Widget.Stats.userDefaultsSiteIdKey)
281+
userDefaults?.setValue(nil, forKey: WidgetStatsConfiguration.userDefaultsSiteIdKey)
281282

282283
WidgetCenter.shared.reloadAllTimelines()
283284
}
@@ -308,12 +309,12 @@ private extension StatsWidgetsStore {
308309
guard let account = try? WPAccount.lookupDefaultWordPressComAccount(in: coreDataStack.mainContext),
309310
let siteId = account.defaultBlog?.dotComID,
310311
let userDefaults = UserDefaults(suiteName: WPAppGroupName),
311-
userDefaults.value(forKey: AppConfiguration.Widget.Stats.userDefaultsSiteIdKey) == nil else {
312+
userDefaults.value(forKey: WidgetStatsConfiguration.userDefaultsSiteIdKey) == nil else {
312313
return
313314
}
314315

315-
userDefaults.setValue(AccountHelper.isLoggedIn, forKey: AppConfiguration.Widget.Stats.userDefaultsLoggedInKey)
316-
userDefaults.setValue(siteId, forKey: AppConfiguration.Widget.Stats.userDefaultsSiteIdKey)
316+
userDefaults.setValue(AccountHelper.isLoggedIn, forKey: WidgetStatsConfiguration.userDefaultsLoggedInKey)
317+
userDefaults.setValue(siteId, forKey: WidgetStatsConfiguration.userDefaultsSiteIdKey)
317318
initializeStatsWidgetsIfNeeded()
318319
}
319320

@@ -329,9 +330,9 @@ private extension StatsWidgetsStore {
329330

330331
do {
331332
try SFHFKeychainUtils.storeUsername(
332-
AppConfiguration.Widget.Stats.keychainTokenKey,
333+
WidgetStatsConfiguration.keychainTokenKey,
333334
andPassword: token,
334-
forServiceName: AppConfiguration.Widget.Stats.keychainServiceName,
335+
forServiceName: WidgetStatsConfiguration.keychainServiceName,
335336
accessGroup: WPAppKeychainAccessGroup,
336337
updateExisting: true
337338
)

WordPress/JetpackStatsWidgets/Tracks/WidgetAnalytics.swift renamed to WordPress/Classes/Utility/Analytics/WidgetAnalytics.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Foundation
22
import WidgetKit
3+
import JetpackStatsWidgetsCore
34

45
@objcMembers class WidgetAnalytics: NSObject {
56
static func trackLoadedWidgetsOnApplicationOpened() {
@@ -17,7 +18,7 @@ import WidgetKit
1718
}
1819

1920
let widgetAnalyticNames: [String] = installedWidgets.map { widgetInfo in
20-
guard let eventKind = AppConfiguration.Widget.Stats.Kind(rawValue: widgetInfo.kind) else {
21+
guard let eventKind = WidgetStatsConfiguration.Kind(rawValue: widgetInfo.kind) else {
2122
DDLogWarn("⚠️ Make sure the widget: \(widgetInfo.kind), has the correct kind.")
2223
return "\(widgetInfo.kind)_\(widgetInfo.family)"
2324
}
@@ -42,7 +43,7 @@ import WidgetKit
4243
case lockScreenAllTimeViewsVisitorsWidget = "widget_all_time_views_visitors_lockscreen"
4344
case lockScreenAllTimePostsBestViewsWidget = "widget_all_time_posts_best_views_lockscreen"
4445

45-
static func eventPrefix(for widgetKind: AppConfiguration.Widget.Stats.Kind) -> Events {
46+
static func eventPrefix(for widgetKind: WidgetStatsConfiguration.Kind) -> Events {
4647
switch widgetKind {
4748
case .homeToday:
4849
return .homeTodayWidget

0 commit comments

Comments
 (0)