damus

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

commit a9b45eb3fe1956960839303f5ceb398225741c44
parent be3e65f657f47642bb0abd34b8568c33928a9bcd
Author: James Carucci <jim.carucci@northstarbis.com>
Date:   Sat, 13 Aug 2022 12:20:48 -0400

Add filters for home screen

Closes: #24
Changelog-Added: Added ability to hide replies on home timeline

Diffstat:
Mdamus/ContentView.swift | 50+++++++++++++++++++++++++++++++++++++++++++-------
Mdamus/Views/ProfileView.swift | 2+-
Mdamus/Views/SearchHomeView.swift | 2+-
Mdamus/Views/SearchView.swift | 2+-
Mdamus/Views/TimelineView.swift | 7+++++--
5 files changed, 51 insertions(+), 12 deletions(-)

diff --git a/damus/ContentView.swift b/damus/ContentView.swift @@ -59,6 +59,8 @@ struct ContentView: View { @State var profile_open: Bool = false @State var thread_open: Bool = false @State var search_open: Bool = false + @State var filters_showing : Bool = false + @State var should_show_replies : Bool = true @StateObject var home: HomeModel = HomeModel() // connect retry timer @@ -86,18 +88,52 @@ struct ContentView: View { Spacer() } } + + var FiltersView: some View { + VStack{ + HStack{ + Toggle("Show Replies", isOn: $should_show_replies) + .toggleStyle(SwitchToggleStyle(tint: .purple)) + .padding(.leading,30) + .padding(.trailing,30) + + } + } + } var PostingTimelineView: some View { - ZStack { - if let damus = self.damus_state { - TimelineView(events: $home.events, loading: $home.loading, damus: damus, show_friend_icon: false) + VStack{ + Label("", systemImage: "line.3.horizontal.decrease.circle.fill") + .padding(.leading, 10) + .frame(maxWidth: .infinity, alignment: .leading) + .onTapGesture { + print("Filtering") + self.filters_showing = !self.filters_showing + } + if(filters_showing){ + FiltersView } - if privkey != nil { - PostButtonContainer { - self.active_sheet = .post + ZStack { + if let damus = self.damus_state { + TimelineView(events: $home.events, loading: $home.loading, damus: damus, show_friend_icon: false, filter: filter_event) + //TODO: Add filter function to the events to keep out replies if should_show_replies is false! + } + if privkey != nil { + PostButtonContainer { + self.active_sheet = .post + } } } } + + } + + func filter_event(_ ev: NostrEvent) -> Bool { + if !should_show_replies { + return !ev.is_reply(nil) + } + + return true } func MainContent(damus: DamusState) -> some View { @@ -119,7 +155,7 @@ struct ContentView: View { PostingTimelineView case .notifications: - TimelineView(events: $home.notifications, loading: $home.loading, damus: damus, show_friend_icon: true) + TimelineView(events: $home.notifications, loading: $home.loading, damus: damus, show_friend_icon: true, filter: { _ in true }) .navigationTitle("Notifications") case .dms: diff --git a/damus/Views/ProfileView.swift b/damus/Views/ProfileView.swift @@ -147,7 +147,7 @@ struct ProfileView: View { Divider() - InnerTimelineView(events: $profile.events, damus: damus_state, show_friend_icon: false) + InnerTimelineView(events: $profile.events, damus: damus_state, show_friend_icon: false, filter: { _ in true }) } .frame(maxHeight: .infinity, alignment: .topLeading) } diff --git a/damus/Views/SearchHomeView.swift b/damus/Views/SearchHomeView.swift @@ -39,7 +39,7 @@ struct SearchHomeView: View { } var GlobalContent: some View { - TimelineView(events: $model.events, loading: $model.loading, damus: damus_state, show_friend_icon: true) + TimelineView(events: $model.events, loading: $model.loading, damus: damus_state, show_friend_icon: true, filter: { _ in true }) } var SearchContent: some View { diff --git a/damus/Views/SearchView.swift b/damus/Views/SearchView.swift @@ -13,7 +13,7 @@ struct SearchView: View { @Environment(\.dismiss) var dismiss var body: some View { - TimelineView(events: $search.events, loading: $search.loading, damus: appstate, show_friend_icon: true) + TimelineView(events: $search.events, loading: $search.loading, damus: appstate, show_friend_icon: true, filter: { _ in true }) .navigationBarTitle(describe_search(search.search)) .padding([.leading, .trailing], 6) .onReceive(handle_notify(.switched_timeline)) { obj in diff --git a/damus/Views/TimelineView.swift b/damus/Views/TimelineView.swift @@ -16,10 +16,11 @@ struct InnerTimelineView: View { @Binding var events: [NostrEvent] let damus: DamusState let show_friend_icon: Bool + let filter: (NostrEvent) -> Bool var body: some View { LazyVStack { - ForEach(events, id: \.id) { (ev: NostrEvent) in + ForEach(events.filter(filter), id: \.id) { (ev: NostrEvent) in let tm = ThreadModel(event: inner_event_or_self(ev: ev), pool: damus.pool, privkey: damus.keypair.privkey) let is_chatroom = has_hashtag(ev.tags, hashtag: "chat") let tv = ThreadView(thread: tm, damus: damus, is_chatroom: is_chatroom) @@ -41,6 +42,8 @@ struct TimelineView: View { let damus: DamusState let show_friend_icon: Bool + let filter: (NostrEvent) -> Bool + var body: some View { MainContent } @@ -52,7 +55,7 @@ struct TimelineView: View { ProgressView() .progressViewStyle(.circular) } - InnerTimelineView(events: $events, damus: damus, show_friend_icon: show_friend_icon) + InnerTimelineView(events: $events, damus: damus, show_friend_icon: show_friend_icon, filter: filter) } .onReceive(NotificationCenter.default.publisher(for: .scroll_to_top)) { _ in guard let event = events.first else {