damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | LICENSE

commit 1d8ca9486305ac0a10e098310c79289f9d8de9cd
parent fd57ca001280c9107b8a58f283474ebb9f927cc8
Author: William Casarin <jb55@jb55.com>
Date:   Tue, 19 Apr 2022 10:34:43 -0700

global timeline

Signed-off-by: William Casarin <jb55@jb55.com>

Diffstat:
Mdamus/ContentView.swift | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 86 insertions(+), 38 deletions(-)

diff --git a/damus/ContentView.swift b/damus/ContentView.swift @@ -27,6 +27,7 @@ enum Sheets: Identifiable { enum Timeline: String, CustomStringConvertible { case home case notifications + case global var description: String { return self.rawValue @@ -43,10 +44,11 @@ struct ContentView: View { @State var selected_timeline: Timeline? = .home @State var last_event_of_kind: [Int: NostrEvent] = [:] @State var has_events: [String: ()] = [:] - @State var notifications_active: Bool = false + @State var has_friend_event: [String: ()] = [:] @State var new_notifications: Bool = false @State var events: [NostrEvent] = [] + @State var friend_events: [NostrEvent] = [] @State var notifications: [NostrEvent] = [] // connect retry timer @@ -75,21 +77,22 @@ struct ContentView: View { } } - var HomeTab: some View { - Button(action: {switch_timeline(.home)}) { - Label("", systemImage: selected_timeline == .home ? "house.fill" : "house") + func TabButton(timeline: Timeline, img: String) -> some View { + Button(action: {switch_timeline(timeline)}) { + Label("", systemImage: selected_timeline == timeline ? "\(img).fill" : img) .contentShape(Rectangle()) .frame(maxWidth: .infinity, minHeight: 30.0) } - .foregroundColor(selected_timeline != .home ? .gray : .primary) + .foregroundColor(selected_timeline != timeline ? .gray : .primary) } var TabBar: some View { VStack { Divider() HStack { - HomeTab + TabButton(timeline: .home, img: "house") NotificationTab + TabButton(timeline: .global, img: "globe.americas") } } } @@ -111,7 +114,6 @@ struct ContentView: View { var PostButtonContainer: some View { VStack { - Spacer() HStack { @@ -126,37 +128,46 @@ struct ContentView: View { var PostingTimelineView: some View { ZStack { if let pool = self.pool { - TimelineView(events: $events, pool: pool) + TimelineView(events: $friend_events, pool: pool) .environmentObject(profiles) } PostButtonContainer } } + func MainContent(pool: RelayPool) -> some View { + NavigationView { + VStack { + PostingTimelineView + .onAppear() { + switch_timeline(.home) + } + + let notif = TimelineView(events: $notifications, pool: pool) + .environmentObject(profiles) + .navigationTitle("Notifications") + .navigationBarBackButtonHidden(true) + + let global = TimelineView(events: $events, pool: pool) + .environmentObject(profiles) + .navigationTitle("Global") + .navigationBarBackButtonHidden(true) + + NavigationLink(destination: notif, tag: .notifications, selection: $selected_timeline) { EmptyView() } + + NavigationLink(destination: global, tag: .global, selection: $selected_timeline) { EmptyView() } + } + .navigationBarTitle("Damus", displayMode: .inline) + } + } + var body: some View { VStack { if let pool = self.pool { ZStack { - NavigationView { - VStack { - PostingTimelineView - .onAppear() { - switch_timeline(.home) - } - - let tlv = TimelineView(events: $notifications, pool: pool) - .environmentObject(profiles) - .navigationTitle("Notifications") - .navigationBarBackButtonHidden(true) - - NavigationLink(destination: tlv, isActive: $notifications_active) { - EmptyView() - } - } - .navigationBarTitle("Damus", displayMode: .inline) - } - .padding([.bottom], -8.0) - + MainContent(pool: pool) + .padding([.bottom], -8.0) + LoadingContainer } } @@ -184,20 +195,36 @@ struct ContentView: View { self.loading = (self.pool?.num_connecting ?? 0) != 0 } } - - func is_friend(_ pubkey: String) -> Bool { - return pubkey == self.pubkey || self.friends[pubkey] != nil + + func is_friend(pubkey: String) -> Bool { + return pubkey == self.pubkey || friends[pubkey] != nil + } + + func is_friend_event(_ ev: NostrEvent) -> Bool { + if is_friend(pubkey: ev.pubkey) { + return true + } + + if ev.is_reply { + // show our replies? + if ev.pubkey == self.pubkey { + return true + } + for pk in ev.referenced_pubkeys { + if is_friend(pubkey: pk.ref_id) { + return true + } + } + } + + return false } func switch_timeline(_ timeline: Timeline) { - if timeline == .notifications { - self.notifications_active = true - self.selected_timeline = .notifications + if timeline != .notifications { new_notifications = false - } else { - self.notifications_active = false - self.selected_timeline = .home } + self.selected_timeline = timeline //self.selected_timeline = timeline } @@ -294,6 +321,15 @@ struct ContentView: View { } } + func handle_friend_event(_ ev: NostrEvent) { + if has_friend_event[ev.id] != nil || !is_friend_event(ev) { + return + } + self.has_friend_event[ev.id] = () + self.friend_events.append(ev) + self.friend_events = self.friend_events.sorted { $0.created_at > $1.created_at } + } + func process_event(_ ev: NostrEvent) { if has_events[ev.id] == nil { has_events[ev.id] = () @@ -306,6 +342,8 @@ struct ContentView: View { self.events.append(ev) self.events = self.events.sorted { $0.created_at > $1.created_at } + handle_friend_event(ev) + if is_notification(ev: ev, pubkey: pubkey) { handle_notification(ev: ev) } @@ -314,10 +352,20 @@ struct ContentView: View { handle_metadata_event(ev) } else if ev.kind == 3 { handle_contact_event(ev) + + if ev.pubkey == pubkey { + process_friend_events() + } } } } + func process_friend_events() { + for event in events { + handle_friend_event(event) + } + } + func handle_event(relay_id: String, conn_event: NostrConnectionEvent) { switch conn_event { case .ws_event(let ev): @@ -395,7 +443,7 @@ func get_metadata_since_time(_ metadata_event: NostrEvent?) -> Int64? { func get_since_time(last_event: NostrEvent?) -> Int64 { if last_event == nil { - return Int64(Date().timeIntervalSince1970) - (24 * 60 * 60 * 4) + return Int64(Date().timeIntervalSince1970) - (24 * 60 * 60 * 1) } return last_event!.created_at - 60 * 10