a bunch more usability improvements

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2022-04-23 18:21:45 -07:00
parent 090385d3da
commit cb463c6da9
7 changed files with 89 additions and 22 deletions

View File

@@ -213,7 +213,6 @@ struct ContentView: View {
self.pool?.send(.event(ev))
}
.onReceive(NotificationCenter.default.publisher(for: .post)) { obj in
let post_res = obj.object as! NostrPostResult
switch post_res {
case .post(let post):
@@ -256,13 +255,19 @@ struct ContentView: View {
}
func switch_timeline(_ timeline: Timeline) {
if timeline != .notifications {
if timeline == self.selected_timeline {
NotificationCenter.default.post(name: .scroll_to_top, object: nil)
return
}
if (timeline != .notifications && self.selected_timeline == .notifications) || timeline == .notifications {
new_notifications = false
}
self.selected_timeline = timeline
NotificationCenter.default.post(name: .switched_timeline, object: timeline)
//self.selected_timeline = timeline
}
func add_relay(_ pool: RelayPool, _ relay: String) {
//add_rw_relay(pool, "wss://nostr-pub.wellorder.net")
add_rw_relay(pool, relay)

View File

@@ -36,11 +36,35 @@ class ThreadModel: ObservableObject {
self.replies.replies.removeAll()
}
func should_resubscribe(_ ev_b: NostrEvent) -> Bool {
if self.events.count == 0 {
return true
}
guard let ev_a = self.event else {
return true
}
if ev_b.is_root_event() {
return false
}
// rough heuristic to save us from resubscribing all the time
return ev_b.count_ids() != ev_a.count_ids()
}
func set_active_event(_ ev: NostrEvent) {
unsubscribe()
self.event = ev
add_event(ev)
subscribe(ev)
if should_resubscribe(ev) {
unsubscribe()
self.event = ev
add_event(ev)
subscribe(ev)
} else {
self.event = ev
if events.count == 0 {
add_event(ev)
}
}
}
private func subscribe(_ ev: NostrEvent) {

View File

@@ -179,6 +179,20 @@ class NostrEvent: Codable, Identifiable, CustomStringConvertible {
return (ns, c)
}
public func count_ids() -> Int {
return count_refs("e")
}
public func count_refs(_ type: String) -> Int {
var count: Int = 0
for tag in tags {
if tag.count >= 2 && tag[0] == "e" {
count += 1
}
}
return count
}
public var referenced_pubkeys: [ReferencedId] {
return get_referenced_ids(key: "p")
}

View File

@@ -25,6 +25,18 @@ extension Notification.Name {
}
}
extension Notification.Name {
static var switched_timeline: Notification.Name {
return Notification.Name("switched_timeline")
}
}
extension Notification.Name {
static var scroll_to_top: Notification.Name {
return Notification.Name("scroll_to_to")
}
}
extension Notification.Name {
static var broadcast_event: Notification.Name {
return Notification.Name("broadcast event")

View File

@@ -148,7 +148,7 @@ struct ChatView: View {
.contentShape(Rectangle())
.id(event.id)
.frame(minHeight: just_started ? PFP_SIZE : 0)
//.padding([.bottom], next_ev == nil ? 2 : 0)
.padding([.bottom], next_ev == nil ? 30 : 0)
//.border(Color.green)
}

View File

@@ -13,6 +13,7 @@ struct ThreadView: View {
@EnvironmentObject var profiles: Profiles
@EnvironmentObject var thread: ThreadModel
@Environment(\.dismiss) var dismiss
var body: some View {
Group {
@@ -35,6 +36,9 @@ struct ThreadView: View {
}
*/
}
.onReceive(NotificationCenter.default.publisher(for: .switched_timeline)) { n in
dismiss()
}
.onReceive(NotificationCenter.default.publisher(for: .toggle_thread_view)) { _ in
is_chatroom = !is_chatroom
//print("is_chatroom: \(is_chatroom)")

View File

@@ -26,22 +26,30 @@ struct TimelineView: View {
}
var MainContent: some View {
ScrollView {
LazyVStack {
ForEach(events, id: \.id) { (ev: NostrEvent) in
/*
let evdet = EventDetailView(thread: ThreadModel(event: ev, pool: pool))
.navigationBarTitle("Thread")
.padding([.leading, .trailing], 6)
.environmentObject(profiles)
*/
EventView(event: ev, highlight: .none, has_action_bar: true)
.onTapGesture {
NotificationCenter.default.post(name: .open_thread, object: ev)
}
ScrollViewReader { scroller in
ScrollView {
LazyVStack {
ForEach(events, id: \.id) { (ev: NostrEvent) in
/*
let evdet = EventDetailView(thread: ThreadModel(event: ev, pool: pool))
.navigationBarTitle("Thread")
.padding([.leading, .trailing], 6)
.environmentObject(profiles)
*/
EventView(event: ev, highlight: .none, has_action_bar: true)
.onTapGesture {
NotificationCenter.default.post(name: .open_thread, object: ev)
}
}
}
}
.onReceive(NotificationCenter.default.publisher(for: .scroll_to_top)) { _ in
guard let event = events.first else {
return
}
scroll_to_event(scroller: scroller, id: event.id, delay: 0.0, animate: true)
}
}
}
}