103 lines
2.8 KiB
Swift
103 lines
2.8 KiB
Swift
//
|
|
// BuilderEventView.swift
|
|
// damus
|
|
//
|
|
// Created by William Casarin on 2023-01-23.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct BuilderEventView: View {
|
|
let damus: DamusState
|
|
let event_id: String
|
|
@State var event: NostrEvent?
|
|
@State var subscription_uuid: String = UUID().description
|
|
|
|
init(damus: DamusState, event: NostrEvent) {
|
|
_event = State(initialValue: event)
|
|
self.damus = damus
|
|
self.event_id = event.id
|
|
}
|
|
|
|
init(damus: DamusState, event_id: String) {
|
|
let event = damus.events.lookup(event_id)
|
|
self.event_id = event_id
|
|
self.damus = damus
|
|
_event = State(initialValue: event)
|
|
}
|
|
|
|
func unsubscribe() {
|
|
damus.pool.unsubscribe(sub_id: subscription_uuid)
|
|
}
|
|
|
|
func subscribe(filters: [NostrFilter]) {
|
|
damus.pool.register_handler(sub_id: subscription_uuid, handler: handle_event)
|
|
damus.pool.send(.subscribe(.init(filters: filters, sub_id: subscription_uuid)))
|
|
}
|
|
|
|
func handle_event(relay_id: String, ev: NostrConnectionEvent) {
|
|
guard case .nostr_event(let nostr_response) = ev else {
|
|
return
|
|
}
|
|
|
|
guard case .event(let id, let nostr_event) = nostr_response else {
|
|
return
|
|
}
|
|
|
|
guard id == subscription_uuid else {
|
|
return
|
|
}
|
|
|
|
if event != nil {
|
|
return
|
|
}
|
|
|
|
event = nostr_event
|
|
|
|
unsubscribe()
|
|
}
|
|
|
|
func load() {
|
|
subscribe(filters: [
|
|
NostrFilter(ids: [self.event_id], limit: 1),
|
|
NostrFilter(
|
|
kinds: [.zap],
|
|
referenced_ids: [self.event_id]
|
|
)
|
|
])
|
|
}
|
|
|
|
var body: some View {
|
|
VStack {
|
|
if let event {
|
|
let ev = event.get_inner_event(cache: damus.events) ?? event
|
|
let thread = ThreadModel(event: ev, damus_state: damus)
|
|
NavigationLink(value: Route.Thread(thread: thread)) {
|
|
EventView(damus: damus, event: event, options: .embedded)
|
|
.padding([.top, .bottom], 8)
|
|
}.buttonStyle(.plain)
|
|
} else {
|
|
ProgressView().padding()
|
|
}
|
|
}
|
|
.frame(minWidth: 0, maxWidth: .infinity)
|
|
.overlay(
|
|
RoundedRectangle(cornerRadius: 10)
|
|
.stroke(Color.gray.opacity(0.2), lineWidth: 1.0)
|
|
)
|
|
.onAppear {
|
|
guard event == nil else {
|
|
return
|
|
}
|
|
self.load()
|
|
}
|
|
}
|
|
}
|
|
|
|
struct BuilderEventView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
BuilderEventView(damus: test_damus_state(), event_id: "536bee9e83c818e3b82c101935128ae27a0d4290039aaf253efe5f09232c1962")
|
|
}
|
|
}
|
|
|