forked from shadowfacts/Tusker
Fix refreshing not loading initial when previous attempt failed
Closes #214
This commit is contained in:
parent
f7304a011c
commit
319b5458fc
|
@ -197,7 +197,11 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
|
|||
|
||||
@objc func refresh() {
|
||||
Task {
|
||||
await controller.loadNewer()
|
||||
if case .notLoadedInitial = await controller.state {
|
||||
await controller.loadInitial()
|
||||
} else {
|
||||
await controller.loadNewer()
|
||||
}
|
||||
#if !targetEnvironment(macCatalyst)
|
||||
collectionView.refreshControl?.endRefreshing()
|
||||
#endif
|
||||
|
@ -280,6 +284,8 @@ extension TimelineViewController {
|
|||
typealias TimelineItem = String // status ID
|
||||
|
||||
func loadInitial() async throws -> [TimelineItem] {
|
||||
try await Task.sleep(nanoseconds: 1 * NSEC_PER_SEC)
|
||||
|
||||
guard let mastodonController else {
|
||||
throw Error.noClient
|
||||
}
|
||||
|
|
|
@ -64,6 +64,14 @@ extension TimelineLikeCollectionViewController {
|
|||
}
|
||||
|
||||
func handleAddLoadingIndicator() async {
|
||||
if case .loadingInitial(_, _) = await controller.state,
|
||||
let refreshControl = collectionView.refreshControl,
|
||||
refreshControl.isRefreshing {
|
||||
refreshControl.beginRefreshing()
|
||||
// if we're loading initial and the refresh control is already going, we don't need to add another indicator
|
||||
return
|
||||
}
|
||||
|
||||
var snapshot = dataSource.snapshot()
|
||||
if !snapshot.sectionIdentifiers.contains(.footer) {
|
||||
snapshot.appendSections([.footer])
|
||||
|
@ -77,6 +85,13 @@ extension TimelineLikeCollectionViewController {
|
|||
}
|
||||
|
||||
func handleRemoveLoadingIndicator() async {
|
||||
if case .loadingInitial(_, _) = await controller.state,
|
||||
let refreshControl = collectionView.refreshControl,
|
||||
refreshControl.isRefreshing {
|
||||
refreshControl.endRefreshing()
|
||||
return
|
||||
}
|
||||
|
||||
let oldContentOffset = collectionView.contentOffset
|
||||
var snapshot = dataSource.snapshot()
|
||||
snapshot.deleteSections([.footer])
|
||||
|
|
|
@ -70,7 +70,7 @@ actor TimelineLikeController<Item> {
|
|||
} catch {
|
||||
await loadingIndicator.end()
|
||||
await emit(event: .loadAllError(error, token))
|
||||
state = .idle
|
||||
state = .notLoadedInitial
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -194,7 +194,7 @@ actor TimelineLikeController<Item> {
|
|||
return false
|
||||
}
|
||||
case .loadingInitial(let token, let hasAddedLoadingIndicator):
|
||||
return to == .idle || (!hasAddedLoadingIndicator && to == .loadingInitial(token, hasAddedLoadingIndicator: true))
|
||||
return to == .notLoadedInitial || to == .idle || (!hasAddedLoadingIndicator && to == .loadingInitial(token, hasAddedLoadingIndicator: true))
|
||||
case .loadingNewer(_):
|
||||
return to == .idle
|
||||
case .loadingOlder(let token, let hasAddedLoadingIndicator):
|
||||
|
|
Loading…
Reference in New Issue