forked from shadowfacts/Tusker
Display toast on load errors
This commit is contained in:
parent
7f4bf52050
commit
7781c5252b
|
@ -59,6 +59,7 @@ class DiffableTimelineLikeTableViewController<Section: Hashable & CaseIterable,
|
|||
super.viewDidDisappear(animated)
|
||||
|
||||
pruneOffscreenRows()
|
||||
currentToast?.dismissToast(animated: false)
|
||||
}
|
||||
|
||||
class func refreshCommandTitle() -> String {
|
||||
|
@ -111,13 +112,26 @@ class DiffableTimelineLikeTableViewController<Section: Hashable & CaseIterable,
|
|||
state = .loadingInitial
|
||||
|
||||
loadInitialItems() { result in
|
||||
guard case let .success(snapshot) = result else {
|
||||
self.state = .unloaded
|
||||
return
|
||||
}
|
||||
DispatchQueue.main.async {
|
||||
self.dataSource.apply(snapshot, animatingDifferences: false)
|
||||
self.state = .loaded
|
||||
switch result {
|
||||
case let .success(snapshot):
|
||||
self.dataSource.apply(snapshot, animatingDifferences: false)
|
||||
self.state = .loaded
|
||||
case let .failure(.client(error)):
|
||||
self.state = .unloaded
|
||||
var config = ToastConfiguration(title: "Error Loading")
|
||||
config.subtitle = error.localizedDescription
|
||||
config.systemImageName = error.systemImageName
|
||||
config.actionTitle = "Retry"
|
||||
config.action = { [weak self] (toast) in
|
||||
toast.dismissToast(animated: true)
|
||||
self?.loadInitial()
|
||||
}
|
||||
self.showToast(configuration: config, animated: true)
|
||||
|
||||
default:
|
||||
self.state = .unloaded
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -133,13 +147,27 @@ class DiffableTimelineLikeTableViewController<Section: Hashable & CaseIterable,
|
|||
state = .loadingOlder
|
||||
|
||||
loadOlderItems(currentSnapshot: dataSource.snapshot()) { result in
|
||||
guard case let .success(snapshot) = result else {
|
||||
self.state = .loaded
|
||||
return
|
||||
}
|
||||
DispatchQueue.main.async {
|
||||
self.dataSource.apply(snapshot, animatingDifferences: false)
|
||||
self.state = .loaded
|
||||
|
||||
switch result {
|
||||
case let .success(snapshot):
|
||||
self.dataSource.apply(snapshot, animatingDifferences: false)
|
||||
|
||||
case let .failure(.client(error)):
|
||||
var config = ToastConfiguration(title: "Error Loading Older")
|
||||
config.subtitle = error.localizedDescription
|
||||
config.systemImageName = error.systemImageName
|
||||
config.actionTitle = "Retry"
|
||||
config.action = { [weak self] (toast) in
|
||||
toast.dismissToast(animated: true)
|
||||
self?.loadOlder()
|
||||
}
|
||||
self.showToast(configuration: config, animated: true)
|
||||
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -196,23 +224,32 @@ class DiffableTimelineLikeTableViewController<Section: Hashable & CaseIterable,
|
|||
}
|
||||
|
||||
loadNewerItems(currentSnapshot: snapshot) { result in
|
||||
guard case let .success(snapshot) = result else {
|
||||
DispatchQueue.main.async {
|
||||
self.refreshControl?.endRefreshing()
|
||||
self.state = .loaded
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
DispatchQueue.main.async {
|
||||
self.refreshControl?.endRefreshing()
|
||||
self.dataSource.apply(snapshot, animatingDifferences: false)
|
||||
self.state = .loaded
|
||||
|
||||
if let item = item,
|
||||
let indexPath = self.dataSource.indexPath(for: item) {
|
||||
// maintain the current position in the list (don't scroll to top)
|
||||
self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
|
||||
|
||||
switch result {
|
||||
case let .success(snapshot):
|
||||
self.dataSource.apply(snapshot, animatingDifferences: false)
|
||||
if let item = item,
|
||||
let indexPath = self.dataSource.indexPath(for: item) {
|
||||
// maintain the current position in the list (don't scroll to top)
|
||||
self.tableView.scrollToRow(at: indexPath, at: .top, animated: false)
|
||||
}
|
||||
|
||||
case let .failure(.client(error)):
|
||||
var config = ToastConfiguration(title: "Error Loading Newer")
|
||||
config.subtitle = error.localizedDescription
|
||||
config.systemImageName = error.systemImageName
|
||||
config.actionTitle = "Retry"
|
||||
config.action = { [weak self] (toast) in
|
||||
toast.dismissToast(animated: true)
|
||||
self?.refresh()
|
||||
}
|
||||
self.showToast(configuration: config, animated: true)
|
||||
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -267,5 +304,20 @@ extension DiffableTimelineLikeTableViewController {
|
|||
extension DiffableTimelineLikeTableViewController: BackgroundableViewController {
|
||||
func sceneDidEnterBackground() {
|
||||
pruneOffscreenRows()
|
||||
currentToast?.dismissToast(animated: false)
|
||||
}
|
||||
}
|
||||
|
||||
extension DiffableTimelineLikeTableViewController: ToastableViewController {
|
||||
}
|
||||
|
||||
fileprivate extension Client.Error {
|
||||
var systemImageName: String {
|
||||
switch self {
|
||||
case .networkError(_):
|
||||
return "wifi.exclamationmark"
|
||||
default:
|
||||
return "exclamationmark.triangle"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue