diff --git a/damus/Core/Networking/NostrNetworkManager/SubscriptionManager.swift b/damus/Core/Networking/NostrNetworkManager/SubscriptionManager.swift index 2c486b19..fbb0a089 100644 --- a/damus/Core/Networking/NostrNetworkManager/SubscriptionManager.swift +++ b/damus/Core/Networking/NostrNetworkManager/SubscriptionManager.swift @@ -416,8 +416,8 @@ extension NostrNetworkManager { /// to all connected relays. The `timeout` parameter is a total deadline for both phases. func lookup(noteId: NoteId, to targetRelays: [RelayURL]? = nil, timeout: Duration? = nil) async throws -> NdbNoteLender? { // Since note ids point to immutable objects, we can do a simple ndb lookup first - if let noteKey = try? self.ndb.lookup_note_key(noteId) { - return NdbNoteLender(ndb: self.ndb, noteKey: noteKey) + if let note = try? self.ndb.lookup_note_and_copy(noteId) { + return NdbNoteLender(ownedNdbNote: note) } // Not available in local ndb, stream from network @@ -760,4 +760,4 @@ extension NostrNetworkManager { /// Preload metadata for authors and referenced profiles case preload } -} \ No newline at end of file +} diff --git a/damus/Features/Events/EventLoaderView.swift b/damus/Features/Events/EventLoaderView.swift index 111f07a8..648dca18 100644 --- a/damus/Features/Events/EventLoaderView.swift +++ b/damus/Features/Events/EventLoaderView.swift @@ -16,7 +16,6 @@ struct EventLoaderView: View { let relayHints: [RelayURL] @State var event: NostrEvent? @State var subscription_uuid: String = UUID().description - @State var loadingTask: Task? = nil let content: (NostrEvent) -> Content /// Creates an event loader view. @@ -34,32 +33,21 @@ struct EventLoaderView: View { let event = damus_state.events.lookup(event_id) _event = State(initialValue: event) } - - func unsubscribe() { - self.loadingTask?.cancel() - } - - func subscribe() { - self.loadingTask?.cancel() - self.loadingTask = Task { - let targetRelays = relayHints.isEmpty ? nil : relayHints - #if DEBUG - if let targetRelays, !targetRelays.isEmpty { - print("[relay-hints] EventLoaderView: Loading event \(event_id.hex().prefix(8))... with \(targetRelays.count) relay hint(s): \(targetRelays.map { $0.absoluteString })") - } - #endif - let lender = try? await damus_state.nostrNetwork.reader.lookup(noteId: self.event_id, to: targetRelays) - lender?.justUseACopy({ event = $0 }) - #if DEBUG - if let targetRelays, !targetRelays.isEmpty { - print("[relay-hints] EventLoaderView: Event \(event_id.hex().prefix(8))... loaded: \(event != nil)") - } - #endif + + func load() async { + let targetRelays = relayHints.isEmpty ? nil : relayHints + #if DEBUG + if let targetRelays, !targetRelays.isEmpty { + print("[relay-hints] EventLoaderView: Loading event \(event_id.hex().prefix(8))... with \(targetRelays.count) relay hint(s): \(targetRelays.map { $0.absoluteString })") } - } - - func load() { - subscribe() + #endif + let lender = try? await damus_state.nostrNetwork.reader.lookup(noteId: self.event_id, to: targetRelays) + lender?.justUseACopy({ event = $0 }) + #if DEBUG + if let targetRelays, !targetRelays.isEmpty { + print("[relay-hints] EventLoaderView: Event \(event_id.hex().prefix(8))... loaded: \(event != nil)") + } + #endif } var body: some View { @@ -70,11 +58,11 @@ struct EventLoaderView: View { ProgressView().padding() } } - .onAppear { + .task { guard event == nil else { return } - self.load() + await self.load() } } }