Skip to content

Commit 85c6e56

Browse files
committed
Show error messages on the custom post types screens
1 parent 4bec4e1 commit 85c6e56

3 files changed

Lines changed: 56 additions & 11 deletions

File tree

WordPress/Classes/ViewRelated/CustomPostTypes/CustomPostListView.swift

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ struct CustomPostListView: View {
2727
EmptyStateView(emptyText, systemImage: "doc.text")
2828
} else if viewModel.shouldDisplayInitialLoading {
2929
ProgressView()
30+
} else if let error = viewModel.errorToDisplay() {
31+
EmptyStateView.failure(error: error)
3032
}
3133
}
3234
.refreshable {
@@ -58,7 +60,10 @@ private struct PaginatedList: View {
5860
}
5961
}
6062

61-
makeFooterView()
63+
Section {
64+
makeFooterView()
65+
}
66+
.listSectionSeparator(.hidden)
6267
}
6368
.listStyle(.plain)
6469
}
@@ -80,6 +85,7 @@ private struct PaginatedList: View {
8085
do {
8186
try await onLoadNextPage()
8287
} catch {
88+
DDLogError("Failed to load next page: \(error)")
8389
self.loadMoreError = error
8490
}
8591
}
@@ -91,15 +97,16 @@ private struct PaginatedList: View {
9197
.progressViewStyle(.circular)
9298
.frame(maxWidth: .infinity, minHeight: 44, alignment: .center)
9399
.id(UUID()) // A hack to show the ProgressView after cell reusing.
94-
} else if loadMoreError != nil {
95-
Button {
96-
Task { await loadNextPage() }
97-
} label: {
98-
HStack {
99-
Image(systemName: "exclamationmark.circle")
100-
Text(SharedStrings.Button.retry)
100+
} else if let loadMoreError {
101+
VStack {
102+
Text(verbatim: loadMoreError.localizedDescription)
103+
Button {
104+
Task { await loadNextPage() }
105+
} label: {
106+
Text(verbatim: SharedStrings.Button.retry)
101107
}
102-
}
108+
.buttonStyle(.borderedProminent)
109+
}.frame(maxWidth: .infinity, alignment: .center)
103110
}
104111
}
105112
}
@@ -291,3 +298,20 @@ private enum Strings {
291298
onSelectPost: { _ in }
292299
)
293300
}
301+
302+
#Preview("Load Next Page Error") {
303+
PaginatedList(
304+
items: [
305+
.stale(
306+
id: 1,
307+
post: CustomPostCollectionDisplayPost(
308+
date: .now,
309+
title: "Published Post",
310+
excerpt: "This post has stale data and is being refreshed."
311+
)
312+
),
313+
],
314+
onLoadNextPage: { throw CollectionError.DatabaseError(errMessage: "SQL error") },
315+
onSelectPost: { _ in },
316+
)
317+
}

WordPress/Classes/ViewRelated/CustomPostTypes/CustomPostListViewModel.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ final class CustomPostListViewModel: ObservableObject {
1616

1717
@Published private(set) var items: [CustomPostCollectionItem] = []
1818
@Published private(set) var listInfo: ListInfo?
19+
@Published private var error: Error?
1920

2021
var shouldDisplayEmptyView: Bool {
2122
items.isEmpty && listInfo?.isSyncing == false
@@ -25,6 +26,10 @@ final class CustomPostListViewModel: ObservableObject {
2526
items.isEmpty && listInfo?.isSyncing == true
2627
}
2728

29+
func errorToDisplay() -> Error? {
30+
items.isEmpty ? error : nil
31+
}
32+
2833
init(
2934
client: WordPressClient,
3035
service: WpSelfHostedService,
@@ -49,7 +54,8 @@ final class CustomPostListViewModel: ObservableObject {
4954
do {
5055
_ = try await collection?.refresh()
5156
} catch {
52-
DDLogError("Pull to refresh failed: \(error)")
57+
DDLogError("Failed to refresh posts: \(error)")
58+
self.show(error: error)
5359
}
5460
}
5561

@@ -95,6 +101,15 @@ final class CustomPostListViewModel: ObservableObject {
95101
}
96102
}
97103
}
104+
105+
private func show(error: Error) {
106+
self.error = error
107+
108+
if !items.isEmpty {
109+
// Show an error notice, on top of the list content.
110+
Notice(error: error).post()
111+
}
112+
}
98113
}
99114

100115
struct CustomPostCollectionDisplayPost: Equatable {

WordPress/Classes/ViewRelated/CustomPostTypes/CustomPostTypesView.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ struct CustomPostTypesView: View {
6363
_ = try await self.collection.fetch()
6464
await refresh()
6565
} catch {
66-
self.error = error
66+
DDLogError("Failed to query stored post types: \(error)")
67+
if types.isEmpty {
68+
self.error = error
69+
} else {
70+
Notice(error: error).post()
71+
}
6772
}
6873
}
6974
}
@@ -83,6 +88,7 @@ struct CustomPostTypesView: View {
8388
$0.1.slug < $1.1.slug
8489
}
8590
} catch {
91+
DDLogError("Failed to fetch post types: \(error)")
8692
self.error = error
8793
}
8894
}

0 commit comments

Comments
 (0)