@@ -27,17 +27,17 @@ class StatsWidgetsStore {
27
27
initializeStatsWidgetsIfNeeded ( )
28
28
29
29
if let newTodayData = refreshStats ( type: HomeWidgetTodayData . self) {
30
- HomeWidgetTodayData . write ( items : newTodayData)
30
+ setCachedItems ( newTodayData)
31
31
WidgetCenter . shared. reloadTodayTimelines ( )
32
32
}
33
33
34
34
if let newAllTimeData = refreshStats ( type: HomeWidgetAllTimeData . self) {
35
- HomeWidgetAllTimeData . write ( items : newAllTimeData)
35
+ setCachedItems ( newAllTimeData)
36
36
WidgetCenter . shared. reloadAllTimeTimelines ( )
37
37
}
38
38
39
39
if let newThisWeekData = refreshStats ( type: HomeWidgetThisWeekData . self) {
40
- HomeWidgetThisWeekData . write ( items : newThisWeekData)
40
+ setCachedItems ( newThisWeekData)
41
41
WidgetCenter . shared. reloadThisWeekTimelines ( )
42
42
}
43
43
}
@@ -51,21 +51,21 @@ class StatsWidgetsStore {
51
51
52
52
var isReloadRequired = false
53
53
54
- if !HomeWidgetTodayData. cacheDataExists ( ) {
54
+ if !hasCachedItems ( for : HomeWidgetTodayData . self ) {
55
55
DDLogInfo ( " StatsWidgets: Writing initialization data into HomeWidgetTodayData.plist " )
56
- HomeWidgetTodayData . write ( items : initializeHomeWidgetData ( type: HomeWidgetTodayData . self) )
56
+ setCachedItems ( initializeHomeWidgetData ( type: HomeWidgetTodayData . self) )
57
57
isReloadRequired = true
58
58
}
59
59
60
- if !HomeWidgetThisWeekData. cacheDataExists ( ) {
60
+ if !hasCachedItems ( for : HomeWidgetThisWeekData . self ) {
61
61
DDLogInfo ( " StatsWidgets: Writing initialization data into HomeWidgetThisWeekData.plist " )
62
- HomeWidgetThisWeekData . write ( items : initializeHomeWidgetData ( type: HomeWidgetThisWeekData . self) )
62
+ setCachedItems ( initializeHomeWidgetData ( type: HomeWidgetThisWeekData . self) )
63
63
isReloadRequired = true
64
64
}
65
65
66
- if !HomeWidgetAllTimeData. cacheDataExists ( ) {
66
+ if !hasCachedItems ( for : HomeWidgetAllTimeData . self ) {
67
67
DDLogInfo ( " StatsWidgets: Writing initialization data into HomeWidgetAllTimeData.plist " )
68
- HomeWidgetAllTimeData . write ( items : initializeHomeWidgetData ( type: HomeWidgetAllTimeData . self) )
68
+ setCachedItems ( initializeHomeWidgetData ( type: HomeWidgetAllTimeData . self) )
69
69
isReloadRequired = true
70
70
}
71
71
@@ -83,7 +83,7 @@ class StatsWidgetsStore {
83
83
return
84
84
}
85
85
86
- var homeWidgetCache = T . read ( ) ?? initializeHomeWidgetData ( type: widgetType)
86
+ var homeWidgetCache = getCachedItems ( for : T . self ) ?? initializeHomeWidgetData ( type: widgetType)
87
87
guard let oldData = homeWidgetCache [ siteID. intValue] else {
88
88
DDLogError ( " StatsWidgets: Failed to find a matching site " )
89
89
return
@@ -93,7 +93,7 @@ class StatsWidgetsStore {
93
93
DDLogError ( " StatsWidgets: the site does not exist anymore " )
94
94
// if for any reason that site does not exist anymore, remove it from the cache.
95
95
homeWidgetCache. removeValue ( forKey: siteID. intValue)
96
- T . write ( items : homeWidgetCache)
96
+ setCachedItems ( homeWidgetCache)
97
97
return
98
98
}
99
99
@@ -102,37 +102,81 @@ class StatsWidgetsStore {
102
102
if widgetType == HomeWidgetTodayData . self, let stats = stats as? TodayWidgetStats {
103
103
widgetReload = WidgetCenter . shared. reloadTodayTimelines
104
104
105
- homeWidgetCache [ siteID. intValue] = HomeWidgetTodayData ( siteID: siteID. intValue,
106
- siteName: blog. title ?? oldData. siteName,
107
- url: blog. url ?? oldData. url,
108
- timeZone: blog. timeZone ?? TimeZone . current,
109
- date: Date ( ) ,
110
- stats: stats) as? T
105
+ homeWidgetCache [ siteID. intValue] = HomeWidgetTodayData (
106
+ siteID: siteID. intValue,
107
+ siteName: blog. title ?? oldData. siteName,
108
+ url: blog. url ?? oldData. url,
109
+ timeZone: blog. timeZone ?? TimeZone . current,
110
+ date: Date ( ) ,
111
+ stats: stats
112
+ ) as? T
111
113
112
114
} else if widgetType == HomeWidgetAllTimeData . self, let stats = stats as? AllTimeWidgetStats {
113
115
widgetReload = WidgetCenter . shared. reloadAllTimeTimelines
114
116
115
- homeWidgetCache [ siteID. intValue] = HomeWidgetAllTimeData ( siteID: siteID. intValue,
116
- siteName: blog. title ?? oldData. siteName,
117
- url: blog. url ?? oldData. url,
118
- timeZone: blog. timeZone ?? TimeZone . current,
119
- date: Date ( ) ,
120
- stats: stats) as? T
117
+ homeWidgetCache [ siteID. intValue] = HomeWidgetAllTimeData (
118
+ siteID: siteID. intValue,
119
+ siteName: blog. title ?? oldData. siteName,
120
+ url: blog. url ?? oldData. url,
121
+ timeZone: blog. timeZone ?? TimeZone . current,
122
+ date: Date ( ) ,
123
+ stats: stats
124
+ ) as? T
121
125
122
126
} else if widgetType == HomeWidgetThisWeekData . self, let stats = stats as? ThisWeekWidgetStats {
123
127
widgetReload = WidgetCenter . shared. reloadThisWeekTimelines
124
128
125
- homeWidgetCache [ siteID. intValue] = HomeWidgetThisWeekData ( siteID: siteID. intValue,
126
- siteName: blog. title ?? oldData. siteName,
127
- url: blog. url ?? oldData. url,
128
- timeZone: blog. timeZone ?? TimeZone . current,
129
- date: Date ( ) ,
130
- stats: stats) as? T
129
+ homeWidgetCache [ siteID. intValue] = HomeWidgetThisWeekData (
130
+ siteID: siteID. intValue,
131
+ siteName: blog. title ?? oldData. siteName,
132
+ url: blog. url ?? oldData. url,
133
+ timeZone: blog. timeZone ?? TimeZone . current,
134
+ date: Date ( ) ,
135
+ stats: stats
136
+ ) as? T
131
137
}
132
138
133
- T . write ( items : homeWidgetCache)
139
+ setCachedItems ( homeWidgetCache)
134
140
widgetReload ? ( )
135
141
}
142
+
143
+ // MARK: HomeWidgetCache (Helpers)
144
+
145
+ private func getCachedItems< T: HomeWidgetData > ( for type: T . Type ) -> [ Int : T ] ? {
146
+ do {
147
+ return try makeCache ( for: type) . read ( )
148
+ } catch {
149
+ DDLogError ( " HomeWidgetCache: failed to read items: \( error) " )
150
+ return nil
151
+ }
152
+ }
153
+
154
+ private func hasCachedItems< T: HomeWidgetData > ( for type: T . Type ) -> Bool {
155
+ guard let items = getCachedItems ( for: type) else {
156
+ return false
157
+ }
158
+ return !items. isEmpty
159
+ }
160
+
161
+ private func deleteCachedItems< T: HomeWidgetData > ( for type: T . Type ) {
162
+ do {
163
+ try makeCache ( for: T . self) . delete ( )
164
+ } catch {
165
+ DDLogError ( " HomeWidgetCache: failed to delete items: \( error) " )
166
+ }
167
+ }
168
+
169
+ private func setCachedItems< T: HomeWidgetData > ( _ items: [ Int : T ] ) {
170
+ do {
171
+ try makeCache ( for: T . self) . write ( items: items)
172
+ } catch {
173
+ DDLogError ( " HomeWidgetCache: failed to write items: \( error) " )
174
+ }
175
+ }
176
+
177
+ private func makeCache< T: HomeWidgetData > ( for type: T . Type ) -> HomeWidgetCache < T > {
178
+ HomeWidgetCache < T > ( appGroup: appGroupName)
179
+ }
136
180
}
137
181
138
182
// MARK: - Helper methods
@@ -283,9 +327,9 @@ private extension StatsWidgetsStore {
283
327
284
328
guard !isLoggedIn else { return }
285
329
286
- HomeWidgetTodayData . delete ( )
287
- HomeWidgetThisWeekData . delete ( )
288
- HomeWidgetAllTimeData . delete ( )
330
+ deleteCachedItems ( for : HomeWidgetTodayData . self )
331
+ deleteCachedItems ( for : HomeWidgetThisWeekData . self )
332
+ deleteCachedItems ( for : HomeWidgetAllTimeData . self )
289
333
290
334
userDefaults? . setValue ( nil , forKey: WidgetStatsConfiguration . userDefaultsSiteIdKey)
291
335
0 commit comments