Fix refreshing not loading initial when previous attempt failed

Closes #214
This commit is contained in:
Shadowfacts 2022-11-09 19:15:08 -05:00
parent f7304a011c
commit 319b5458fc
3 changed files with 24 additions and 3 deletions

View File

@ -197,7 +197,11 @@ class TimelineViewController: UIViewController, TimelineLikeCollectionViewContro
@objc func refresh() { @objc func refresh() {
Task { Task {
await controller.loadNewer() if case .notLoadedInitial = await controller.state {
await controller.loadInitial()
} else {
await controller.loadNewer()
}
#if !targetEnvironment(macCatalyst) #if !targetEnvironment(macCatalyst)
collectionView.refreshControl?.endRefreshing() collectionView.refreshControl?.endRefreshing()
#endif #endif
@ -280,6 +284,8 @@ extension TimelineViewController {
typealias TimelineItem = String // status ID typealias TimelineItem = String // status ID
func loadInitial() async throws -> [TimelineItem] { func loadInitial() async throws -> [TimelineItem] {
try await Task.sleep(nanoseconds: 1 * NSEC_PER_SEC)
guard let mastodonController else { guard let mastodonController else {
throw Error.noClient throw Error.noClient
} }

View File

@ -64,6 +64,14 @@ extension TimelineLikeCollectionViewController {
} }
func handleAddLoadingIndicator() async { 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() var snapshot = dataSource.snapshot()
if !snapshot.sectionIdentifiers.contains(.footer) { if !snapshot.sectionIdentifiers.contains(.footer) {
snapshot.appendSections([.footer]) snapshot.appendSections([.footer])
@ -77,6 +85,13 @@ extension TimelineLikeCollectionViewController {
} }
func handleRemoveLoadingIndicator() async { func handleRemoveLoadingIndicator() async {
if case .loadingInitial(_, _) = await controller.state,
let refreshControl = collectionView.refreshControl,
refreshControl.isRefreshing {
refreshControl.endRefreshing()
return
}
let oldContentOffset = collectionView.contentOffset let oldContentOffset = collectionView.contentOffset
var snapshot = dataSource.snapshot() var snapshot = dataSource.snapshot()
snapshot.deleteSections([.footer]) snapshot.deleteSections([.footer])

View File

@ -70,7 +70,7 @@ actor TimelineLikeController<Item> {
} catch { } catch {
await loadingIndicator.end() await loadingIndicator.end()
await emit(event: .loadAllError(error, token)) await emit(event: .loadAllError(error, token))
state = .idle state = .notLoadedInitial
} }
} }
@ -194,7 +194,7 @@ actor TimelineLikeController<Item> {
return false return false
} }
case .loadingInitial(let token, let hasAddedLoadingIndicator): 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(_): case .loadingNewer(_):
return to == .idle return to == .idle
case .loadingOlder(let token, let hasAddedLoadingIndicator): case .loadingOlder(let token, let hasAddedLoadingIndicator):