commit 12eb50255af20fc33898b03dd820f0de352dc627
parent be3e65f657f47642bb0abd34b8568c33928a9bcd
Author: James Carucci <jim.carucci@northstarbis.com>
Date: Sat, 13 Aug 2022 12:20:48 -0400
Add filters for home screen
Closes: #25
Changelog-Added: Added ability to hide replies on home timeline
Diffstat:
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 {