forked from shadowfacts/Tusker
Remove deferred loading indicator, causes more trouble than it's worth
Closes #404
This commit is contained in:
parent
59231e513f
commit
5b321fcc78
|
@ -63,19 +63,20 @@ class TimelineLikeController<Item: Sendable> {
|
||||||
}
|
}
|
||||||
let token = LoadAttemptToken()
|
let token = LoadAttemptToken()
|
||||||
state = .loadingInitial(token, hasAddedLoadingIndicator: false)
|
state = .loadingInitial(token, hasAddedLoadingIndicator: false)
|
||||||
let loadingIndicator = DeferredLoadingIndicator(owner: self, state: state, addedIndicatorState: .loadingInitial(token, hasAddedLoadingIndicator: true))
|
await emit(event: .addLoadingIndicator)
|
||||||
|
state = .loadingInitial(token, hasAddedLoadingIndicator: true)
|
||||||
do {
|
do {
|
||||||
let items = try await delegate.loadInitial()
|
let items = try await delegate.loadInitial()
|
||||||
guard case .loadingInitial(token, _) = state else {
|
guard case .loadingInitial(token, _) = state else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
await loadingIndicator.end()
|
|
||||||
await emit(event: .replaceAllItems(items, token))
|
await emit(event: .replaceAllItems(items, token))
|
||||||
|
await emit(event: .removeLoadingIndicator)
|
||||||
state = .idle
|
state = .idle
|
||||||
} catch is CancellationError {
|
} catch is CancellationError {
|
||||||
return
|
return
|
||||||
} catch {
|
} catch {
|
||||||
await loadingIndicator.end()
|
await emit(event: .removeLoadingIndicator)
|
||||||
await emit(event: .loadAllError(error, token))
|
await emit(event: .loadAllError(error, token))
|
||||||
state = .notLoadedInitial
|
state = .notLoadedInitial
|
||||||
}
|
}
|
||||||
|
@ -88,9 +89,10 @@ class TimelineLikeController<Item: Sendable> {
|
||||||
}
|
}
|
||||||
let token = LoadAttemptToken()
|
let token = LoadAttemptToken()
|
||||||
state = .restoringInitial(token, hasAddedLoadingIndicator: false)
|
state = .restoringInitial(token, hasAddedLoadingIndicator: false)
|
||||||
let loadingIndicator = DeferredLoadingIndicator(owner: self, state: state, addedIndicatorState: .restoringInitial(token, hasAddedLoadingIndicator: true))
|
await emit(event: .addLoadingIndicator)
|
||||||
|
state = .restoringInitial(token, hasAddedLoadingIndicator: true)
|
||||||
await doRestore()
|
await doRestore()
|
||||||
await loadingIndicator.end()
|
await emit(event: .removeLoadingIndicator)
|
||||||
state = .idle
|
state = .idle
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,19 +130,20 @@ class TimelineLikeController<Item: Sendable> {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
state = .loadingOlder(token, hasAddedLoadingIndicator: false)
|
state = .loadingOlder(token, hasAddedLoadingIndicator: false)
|
||||||
let loadingIndicator = DeferredLoadingIndicator(owner: self, state: state, addedIndicatorState: .loadingOlder(token, hasAddedLoadingIndicator: true))
|
await emit(event: .addLoadingIndicator)
|
||||||
|
state = .loadingOlder(token, hasAddedLoadingIndicator: true)
|
||||||
do {
|
do {
|
||||||
let items = try await delegate.loadOlder()
|
let items = try await delegate.loadOlder()
|
||||||
guard case .loadingOlder(token, _) = state else {
|
guard case .loadingOlder(token, _) = state else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
await loadingIndicator.end()
|
|
||||||
await emit(event: .appendItems(items, token))
|
await emit(event: .appendItems(items, token))
|
||||||
|
await emit(event: .removeLoadingIndicator)
|
||||||
state = .idle
|
state = .idle
|
||||||
} catch is CancellationError {
|
} catch is CancellationError {
|
||||||
return
|
return
|
||||||
} catch {
|
} catch {
|
||||||
await loadingIndicator.end()
|
await emit(event: .removeLoadingIndicator)
|
||||||
await emit(event: .loadOlderError(error, token))
|
await emit(event: .loadOlderError(error, token))
|
||||||
state = .idle
|
state = .idle
|
||||||
}
|
}
|
||||||
|
@ -349,34 +352,6 @@ class TimelineLikeController<Item: Sendable> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@MainActor
|
|
||||||
class DeferredLoadingIndicator {
|
|
||||||
private let owner: TimelineLikeController<Item>
|
|
||||||
private let addedIndicatorState: State
|
|
||||||
private let task: Task<Void, Error>
|
|
||||||
|
|
||||||
init(owner: TimelineLikeController<Item>, state: State, addedIndicatorState: State) {
|
|
||||||
self.owner = owner
|
|
||||||
self.addedIndicatorState = addedIndicatorState
|
|
||||||
self.task = Task { @MainActor in
|
|
||||||
try await Task.sleep(nanoseconds: 150 * NSEC_PER_MSEC)
|
|
||||||
guard state == owner.state else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
await owner.emit(event: .addLoadingIndicator)
|
|
||||||
owner.transition(to: addedIndicatorState)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func end() async {
|
|
||||||
if owner.state == addedIndicatorState {
|
|
||||||
await owner.emit(event: .removeLoadingIndicator)
|
|
||||||
} else {
|
|
||||||
task.cancel()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TimelineGapDirection {
|
enum TimelineGapDirection {
|
||||||
|
|
Loading…
Reference in New Issue