diff --git a/damus/Features/Timeline/Models/HomeModel.swift b/damus/Features/Timeline/Models/HomeModel.swift index ed18f3c4..4a5fa062 100644 --- a/damus/Features/Timeline/Models/HomeModel.swift +++ b/damus/Features/Timeline/Models/HomeModel.swift @@ -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? var nwcHandlerTask: Task? - 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) } } diff --git a/damus/Features/Timeline/Views/PostingTimelineView.swift b/damus/Features/Timeline/Views/PostingTimelineView.swift index 8a37b5be..06848ba7 100644 --- a/damus/Features/Timeline/Views/PostingTimelineView.swift +++ b/damus/Features/Timeline/Views/PostingTimelineView.swift @@ -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 { + 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(events: home.events, loading: .constant(false), headerHeight: $headerHeight, headerOffset: $headerOffset, damus: damus_state, show_friend_icon: false, filter: filter) + TimelineView(events: home.events, loading: self.loading, headerHeight: $headerHeight, headerOffset: $headerOffset, damus: damus_state, show_friend_icon: false, filter: filter) } func HeaderView()->some View { diff --git a/damus/Features/Timeline/Views/TimelineView.swift b/damus/Features/Timeline/Views/TimelineView.swift index 5ad84008..96c06179 100644 --- a/damus/Features/Timeline/Views/TimelineView.swift +++ b/damus/Features/Timeline/Views/TimelineView.swift @@ -95,6 +95,7 @@ struct TimelineView: View { } } .coordinateSpace(name: "scroll") + .disabled(self.loading) .onReceive(handle_notify(.scroll_to_top)) { () in events.flush() self.events.set_should_queue(false)