Improve loading UX in the home timeline

Changelog-Changed: Improved loading UX in the home timeline
Signed-off-by: Daniel D’Aquino <daniel@daquino.me>
This commit is contained in:
Daniel D’Aquino
2025-09-03 15:08:15 -07:00
parent 4478672c10
commit d766029f2b
3 changed files with 19 additions and 4 deletions

View File

@@ -41,7 +41,7 @@ enum HomeResubFilter {
}
}
class HomeModel: ContactsDelegate {
class HomeModel: ContactsDelegate, ObservableObject {
// The maximum amount of contacts placed on a home feed subscription filter.
// If the user has more contacts, chunking or other techniques will be used to avoid sending huge filters
let MAX_CONTACTS_ON_FILTER = 500
@@ -71,7 +71,7 @@ class HomeModel: ContactsDelegate {
var dmsHandlerTask: Task<Void, Never>?
var nwcHandlerTask: Task<Void, Never>?
var loading: Bool = false
@Published var loading: Bool = true
var signal = SignalModel()
@@ -658,6 +658,9 @@ class HomeModel: ContactsDelegate {
self.homeHandlerTask?.cancel()
self.homeHandlerTask = Task {
DispatchQueue.main.async {
self.loading = true
}
for await item in damus_state.nostrNetwork.reader.subscribe(filters: home_filters) {
switch item {
case .event(let borrow):
@@ -669,6 +672,9 @@ class HomeModel: ContactsDelegate {
await self.process_event(ev: event, context: .home)
case .eose:
guard let txn = NdbTxn(ndb: damus_state.ndb) else { return }
DispatchQueue.main.async {
self.loading = false
}
load_profiles(context: "home", load: .from_events(events.events), damus_state: damus_state, txn: txn)
}
}

View File

@@ -10,7 +10,7 @@ import SwiftUI
struct PostingTimelineView: View {
let damus_state: DamusState
var home: HomeModel
@ObservedObject var home: HomeModel
@State var search: String = ""
@State var results: [NostrEvent] = []
@State var initialOffset: CGFloat?
@@ -25,6 +25,14 @@ struct PostingTimelineView: View {
@State var headerHeight: CGFloat = 0
@Binding var headerOffset: CGFloat
@SceneStorage("PostingTimelineView.filter_state") var filter_state : FilterState = .posts_and_replies
var loading: Binding<Bool> {
Binding(get: {
return home.loading
}, set: {
home.loading = $0
})
}
func content_filter(_ fstate: FilterState) -> ((NostrEvent) -> Bool) {
var filters = ContentFilters.defaults(damus_state: damus_state)
@@ -33,7 +41,7 @@ struct PostingTimelineView: View {
}
func contentTimelineView(filter: (@escaping (NostrEvent) -> Bool)) -> some View {
TimelineView<AnyView>(events: home.events, loading: .constant(false), headerHeight: $headerHeight, headerOffset: $headerOffset, damus: damus_state, show_friend_icon: false, filter: filter)
TimelineView<AnyView>(events: home.events, loading: self.loading, headerHeight: $headerHeight, headerOffset: $headerOffset, damus: damus_state, show_friend_icon: false, filter: filter)
}
func HeaderView()->some View {

View File

@@ -95,6 +95,7 @@ struct TimelineView<Content: View>: View {
}
}
.coordinateSpace(name: "scroll")
.disabled(self.loading)
.onReceive(handle_notify(.scroll_to_top)) { () in
events.flush()
self.events.set_should_queue(false)