mirror of
git://jb55.com/damus
synced 2024-09-18 19:23:49 +00:00
filters: generalize ContentFilter
This simplifies our content filters so that it is a bit more flexible for future additions. Fixes: 0957cc896cc8 ("Add "Do not show #nsfw tagged posts" setting")
This commit is contained in:
parent
49283f2bb2
commit
440e37c1d3
@ -82,12 +82,7 @@ struct ContentView: View {
|
|||||||
@StateObject var navigationCoordinator: NavigationCoordinator = NavigationCoordinator()
|
@StateObject var navigationCoordinator: NavigationCoordinator = NavigationCoordinator()
|
||||||
@AppStorage("has_seen_suggested_users") private var hasSeenSuggestedUsers = false
|
@AppStorage("has_seen_suggested_users") private var hasSeenSuggestedUsers = false
|
||||||
let sub_id = UUID().description
|
let sub_id = UUID().description
|
||||||
var damus_filter: DamusFilter {
|
|
||||||
get {
|
|
||||||
return DamusFilter(hide_nsfw_tagged_content: self.damus_state?.settings.hide_nsfw_tagged_content ?? true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
|
|
||||||
// connect retry timer
|
// connect retry timer
|
||||||
@ -97,7 +92,13 @@ struct ContentView: View {
|
|||||||
Text("Are you lost?", comment: "Text asking the user if they are lost in the app.")
|
Text("Are you lost?", comment: "Text asking the user if they are lost in the app.")
|
||||||
.id("what")
|
.id("what")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func content_filter(_ fstate: FilterState) -> ((NostrEvent) -> Bool) {
|
||||||
|
var filters = ContentFilters.defaults(damus_state!.settings)
|
||||||
|
filters.append(fstate.filter)
|
||||||
|
return ContentFilters(filters: filters).filter
|
||||||
|
}
|
||||||
|
|
||||||
var PostingTimelineView: some View {
|
var PostingTimelineView: some View {
|
||||||
VStack {
|
VStack {
|
||||||
ZStack {
|
ZStack {
|
||||||
@ -105,10 +106,10 @@ struct ContentView: View {
|
|||||||
// This is needed or else there is a bug when switching from the 3rd or 2nd tab to first. no idea why.
|
// This is needed or else there is a bug when switching from the 3rd or 2nd tab to first. no idea why.
|
||||||
mystery
|
mystery
|
||||||
|
|
||||||
contentTimelineView(filter: damus_filter.get_filter(.posts))
|
contentTimelineView(filter: content_filter(.posts))
|
||||||
.tag(FilterState.posts)
|
.tag(FilterState.posts)
|
||||||
.id(FilterState.posts)
|
.id(FilterState.posts)
|
||||||
contentTimelineView(filter: damus_filter.get_filter(.posts_and_replies))
|
contentTimelineView(filter: content_filter(.posts_and_replies))
|
||||||
.tag(FilterState.posts_and_replies)
|
.tag(FilterState.posts_and_replies)
|
||||||
.id(FilterState.posts_and_replies)
|
.id(FilterState.posts_and_replies)
|
||||||
}
|
}
|
||||||
|
@ -7,15 +7,9 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
protocol ContentFilter {
|
|
||||||
/// Function that implements the content filtering logic
|
|
||||||
/// - Parameter ev: The nostr event to be processed
|
|
||||||
/// - Returns: Must return `true` to show events, and return `false` to hide/filter events
|
|
||||||
func filter(ev: NostrEvent) -> Bool
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Simple filter to determine whether to show posts or all posts and replies.
|
/// Simple filter to determine whether to show posts or all posts and replies.
|
||||||
enum FilterState : Int, ContentFilter {
|
enum FilterState : Int {
|
||||||
case posts_and_replies = 1
|
case posts_and_replies = 1
|
||||||
case posts = 0
|
case posts = 0
|
||||||
|
|
||||||
@ -30,29 +24,31 @@ enum FilterState : Int, ContentFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Simple filter to determine whether to show posts with #nsfw tags
|
/// Simple filter to determine whether to show posts with #nsfw tags
|
||||||
struct NSFWTagFilter: ContentFilter {
|
func nsfw_tag_filter(ev: NostrEvent) -> Bool {
|
||||||
func filter(ev: NostrEvent) -> Bool {
|
|
||||||
return ev.referenced_hashtags.first(where: { t in t.hashtag == "nsfw" }) == nil
|
return ev.referenced_hashtags.first(where: { t in t.hashtag == "nsfw" }) == nil
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generic filter with various tweakable settings
|
/// Generic filter with various tweakable settings
|
||||||
struct DamusFilter: ContentFilter {
|
struct ContentFilters {
|
||||||
let hide_nsfw_tagged_content: Bool
|
var filters: [(NostrEvent) -> Bool]
|
||||||
|
|
||||||
func filter(ev: NostrEvent) -> Bool {
|
func filter(ev: NostrEvent) -> Bool {
|
||||||
if self.hide_nsfw_tagged_content {
|
for filter in filters {
|
||||||
return NSFWTagFilter().filter(ev: ev)
|
if !filter(ev) {
|
||||||
}
|
return false
|
||||||
else {
|
}
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension ContentFilters {
|
||||||
|
static func defaults(_ settings: UserSettingsStore) -> [(NostrEvent) -> Bool] {
|
||||||
|
var filters = Array<(NostrEvent) -> Bool>()
|
||||||
|
if settings.hide_nsfw_tagged_content {
|
||||||
|
filters.append(nsfw_tag_filter)
|
||||||
|
}
|
||||||
|
return filters
|
||||||
}
|
}
|
||||||
|
|
||||||
func get_filter(_ filter_state: FilterState) -> ((NostrEvent) -> Bool) {
|
|
||||||
return { ev in
|
|
||||||
return filter_state.filter(ev: ev) && self.filter(ev: ev)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,10 @@ struct SearchHomeView: View {
|
|||||||
@StateObject var model: SearchHomeModel
|
@StateObject var model: SearchHomeModel
|
||||||
@State var search: String = ""
|
@State var search: String = ""
|
||||||
@FocusState private var isFocused: Bool
|
@FocusState private var isFocused: Bool
|
||||||
var damus_filter: DamusFilter {
|
|
||||||
get {
|
var content_filter: (NostrEvent) -> Bool {
|
||||||
return DamusFilter(hide_nsfw_tagged_content: self.damus_state.settings.hide_nsfw_tagged_content)
|
let filters = ContentFilters.defaults(self.damus_state.settings)
|
||||||
}
|
return ContentFilters(filters: filters).filter
|
||||||
}
|
}
|
||||||
|
|
||||||
let preferredLanguages = Set(Locale.preferredLanguages.map { localeToLanguage($0) })
|
let preferredLanguages = Set(Locale.preferredLanguages.map { localeToLanguage($0) })
|
||||||
@ -55,7 +55,7 @@ struct SearchHomeView: View {
|
|||||||
damus: damus_state,
|
damus: damus_state,
|
||||||
show_friend_icon: true,
|
show_friend_icon: true,
|
||||||
filter: { ev in
|
filter: { ev in
|
||||||
if !damus_filter.filter(ev: ev) {
|
if !content_filter(ev) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user