Skip to content

Commit 5eed639

Browse files
authored
Merge pull request #7697 from woocommerce/issue/7566-rander-no-connected
Widgets: Show Not logged in view
2 parents 45e3c2f + 6ce1b2d commit 5eed639

File tree

3 files changed

+50
-30
lines changed

3 files changed

+50
-30
lines changed

WooCommerce/Classes/Yosemite/DefaultStoresManager.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ class DefaultStoresManager: StoresManager {
175175
ServiceLocator.storageManager.reset()
176176
ServiceLocator.productImageUploader.reset()
177177

178+
updateAndReloadWidgetInformation(with: nil)
179+
178180
NotificationCenter.default.post(name: .logOutEventReceived, object: nil)
179181

180182
return self
@@ -501,7 +503,7 @@ private extension DefaultStoresManager {
501503
/// Updates the necesary dependencies for the widget to function correctly.
502504
/// Reloads widgets timelines.
503505
///
504-
func updateAndReloadWidgetInformation(with siteID: Int64) {
506+
func updateAndReloadWidgetInformation(with siteID: Int64?) {
505507
// Token to fire network requests
506508
keychain.currentAuthToken = sessionManager.defaultCredentials?.authToken
507509

WooCommerce/StoreWidgets/StoreInfoProvider.swift

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
import WidgetKit
22
import KeychainAccess
33

4-
/// Type that represents the Widget information
4+
/// Type that represents the all the possible Widget states.
55
///
6-
struct StoreInfoEntry: TimelineEntry {
7-
/// Date to request new info
8-
///
9-
var date: Date
6+
enum StoreInfoEntry: TimelineEntry {
7+
// Represents a not logged-in state
8+
case notConnected
9+
10+
// Represents a fetching error state
11+
case error
12+
13+
// Represents a fetched data state
14+
case data(StoreInfoData)
1015

16+
// Current date, needed by the `TimelineEntry` protocol.
17+
var date: Date { Date() }
18+
}
19+
20+
/// Type that represents the the widget state data.
21+
///
22+
struct StoreInfoData {
1123
/// Eg: Today, Weekly, Monthly, Yearly
1224
///
1325
var range: String
@@ -45,13 +57,12 @@ final class StoreInfoProvider: TimelineProvider {
4557
///
4658
func placeholder(in context: Context) -> StoreInfoEntry {
4759
let dependencies = Self.fetchDependencies()
48-
return StoreInfoEntry(date: Date(),
49-
range: "Today",
50-
name: dependencies?.storeName ?? Localization.myShop,
51-
revenue: "$132.234",
52-
visitors: "67",
53-
orders: "23",
54-
conversion: "34%")
60+
return StoreInfoEntry.data(.init(range: Localization.today,
61+
name: dependencies?.storeName ?? Localization.myShop,
62+
revenue: "$132.234",
63+
visitors: "67",
64+
orders: "23",
65+
conversion: "34%"))
5566
}
5667

5768
/// Quick Snapshot. Required when previewing the widget.
@@ -65,7 +76,7 @@ final class StoreInfoProvider: TimelineProvider {
6576
///
6677
func getTimeline(in context: Context, completion: @escaping (Timeline<StoreInfoEntry>) -> Void) {
6778
guard let dependencies = Self.fetchDependencies() else {
68-
return // TODO: Dispatch non auth error entry
79+
return completion(Timeline<StoreInfoEntry>(entries: [StoreInfoEntry.notConnected], policy: .never))
6980
}
7081

7182
let strongService = StoreInfoDataService(authToken: dependencies.authToken)
@@ -75,13 +86,12 @@ final class StoreInfoProvider: TimelineProvider {
7586
let todayStats = try await strongService.fetchTodayStats(for: dependencies.storeID)
7687

7788
// TODO: Use proper store formatting.
78-
let entry = StoreInfoEntry(date: Date(),
79-
range: Localization.today,
80-
name: dependencies.storeName,
81-
revenue: "$\(todayStats.revenue)",
82-
visitors: "\(todayStats.totalVisitors)",
83-
orders: "\(todayStats.totalOrders)",
84-
conversion: "\(todayStats.conversion)%")
89+
let entry = StoreInfoEntry.data(.init(range: Localization.today,
90+
name: dependencies.storeName,
91+
revenue: "$\(todayStats.revenue)",
92+
visitors: "\(todayStats.totalVisitors)",
93+
orders: "\(todayStats.totalOrders)",
94+
conversion: "\(todayStats.conversion)%"))
8595

8696
let reloadDate = Date(timeIntervalSinceNow: 30 * 60) // Ask for a 15 minutes reload.
8797
let timeline = Timeline<StoreInfoEntry>(entries: [entry], policy: .after(reloadDate))

WooCommerce/StoreWidgets/StoreInfoWidget.swift

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,16 @@ struct StoreInfoWidget: Widget {
1111

1212
var body: some WidgetConfiguration {
1313
StaticConfiguration(kind: "StoreInfoWidget", provider: StoreInfoProvider()) { entry in
14-
StoreInfoView(entry: entry)
14+
Group {
15+
switch entry {
16+
case .notConnected:
17+
NotLoggedInView()
18+
case .error:
19+
EmptyView() // TODO:
20+
case .data(let data):
21+
StoreInfoView(entry: data)
22+
}
23+
}
1524
}
1625
.configurationDisplayName("Store Info")
1726
.supportedFamilies(enableWidgets ? [.systemMedium] : [])
@@ -23,7 +32,7 @@ struct StoreInfoWidget: Widget {
2332
private struct StoreInfoView: View {
2433

2534
// Entry to render
26-
let entry: StoreInfoEntry
35+
let entry: StoreInfoData
2736

2837
var body: some View {
2938
ZStack {
@@ -156,13 +165,12 @@ private extension NotLoggedInView {
156165
struct StoreWidgets_Previews: PreviewProvider {
157166
static var previews: some View {
158167
StoreInfoView(
159-
entry: StoreInfoEntry(date: Date(),
160-
range: "Today",
161-
name: "Ernest Shop",
162-
revenue: "$132.234",
163-
visitors: "67",
164-
orders: "23",
165-
conversion: "37%")
168+
entry: StoreInfoData(range: "Today",
169+
name: "Ernest Shop",
170+
revenue: "$132.234",
171+
visitors: "67",
172+
orders: "23",
173+
conversion: "37%")
166174
)
167175
.previewContext(WidgetPreviewContext(family: .systemMedium))
168176

0 commit comments

Comments
 (0)