diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift index 735e8c8cc..829fb3614 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/ApplyLabelsView.swift @@ -2,6 +2,7 @@ import Models import Services import SwiftUI +import Utils import Views @MainActor @@ -195,15 +196,21 @@ struct ApplyLabelsView: View { } } +func isSystemLabel(_ label: LinkedItemLabel) -> Bool { + label.name == "RSS" || label.name == "Newsletter" || label.name == "Pinned" +} + extension Sequence where Element == LinkedItemLabel { func applySearchFilter(_ searchFilter: String) -> [LinkedItemLabel] { + let hideSystemLabels = UserDefaults(suiteName: "group.app.omnivoreapp")?.bool(forKey: UserDefaultKey.hideSystemLabels.rawValue) ?? false + if searchFilter.isEmpty || searchFilter == ZWSP { return map { $0 } // return the identity of the sequence } if searchFilter.starts(with: ZWSP) { let index = searchFilter.index(searchFilter.startIndex, offsetBy: 1) let trimmed = searchFilter.suffix(from: index).lowercased() - return filter { ($0.name ?? "").lowercased().contains(trimmed) } + return filter { ($0.name ?? "").lowercased().contains(trimmed) && (!hideSystemLabels || !isSystemLabel($0)) } } return filter { ($0.name ?? "").lowercased().contains(searchFilter.lowercased()) } } diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift index 04567a7e9..8355db882 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/FilterByLabelsViewModel.swift @@ -2,11 +2,12 @@ import CoreData import Models import Services import SwiftUI +import Utils import Views @MainActor final class FilterByLabelsViewModel: ObservableObject { @Published var isLoading = false - @Published var errorMessage: String? = nil + @Published var errorMessage: String? @Published var labels = [LinkedItemLabel]() @Published var selectedLabels = [LinkedItemLabel]() @Published var negatedLabels = [LinkedItemLabel]() @@ -14,7 +15,9 @@ import Views @Published var labelSearchFilter = "" func setLabels(_ labels: [LinkedItemLabel]) { - self.labels = labels.sorted { left, right in + let hideSystemLabels = UserDefaults(suiteName: "group.app.omnivoreapp")?.bool(forKey: UserDefaultKey.hideSystemLabels.rawValue) ?? false + + self.labels = labels.filter { !hideSystemLabels || !isSystemLabel($0) }.sorted { left, right in let aTrimmed = left.unwrappedName.trimmingCharacters(in: .whitespaces) let bTrimmed = right.unwrappedName.trimmingCharacters(in: .whitespaces) return aTrimmed.caseInsensitiveCompare(bTrimmed) == .orderedAscending diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift index 23575651c..bc13bdb04 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsView.swift @@ -10,22 +10,29 @@ struct LabelsView: View { @State private var showDeleteConfirmation = false @State private var labelToRemove: LinkedItemLabel? + @AppStorage(UserDefaultKey.hideSystemLabels.rawValue, store: UserDefaults(suiteName: "group.app.omnivoreapp")) var hideSystemLabels = false + var body: some View { List { - ForEach(viewModel.labels, id: \.id) { label in - HStack { - TextChip(feedItemLabel: label).allowsHitTesting(false) - Spacer() - Button( - action: { - labelToRemove = label - showDeleteConfirmation = true - }, - label: { Image(systemName: "trash") } - ) + Section { + ForEach(viewModel.labels, id: \.id) { label in + HStack { + TextChip(feedItemLabel: label).allowsHitTesting(false) + Spacer() + Button( + action: { + labelToRemove = label + showDeleteConfirmation = true + }, + label: { Image(systemName: "trash") } + ) + } } + createLabelButton + } + Section("Label settings") { + Toggle("Hide system labels", isOn: $hideSystemLabels) } - createLabelButton } .navigationTitle(LocalText.labelsGeneric) .alert("Are you sure you want to delete this label?", isPresented: $showDeleteConfirmation) { @@ -43,6 +50,11 @@ struct LabelsView: View { } Button(LocalText.cancelGeneric, role: .cancel) { self.labelToRemove = nil } } + .onChange(of: hideSystemLabels) { _ in + Task { + await viewModel.loadLabels(dataService: dataService, item: nil) + } + } .sheet(isPresented: $viewModel.showCreateLabelModal) { CreateLabelView(viewModel: viewModel, newLabelName: viewModel.labelSearchFilter) } diff --git a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift index 23ad0059c..5165e16dd 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Labels/LabelsViewModel.swift @@ -2,6 +2,7 @@ import CoreData import Models import Services import SwiftUI +import Utils @MainActor public final class LabelsViewModel: ObservableObject { let labelNameMaxLength = 64 @@ -16,7 +17,9 @@ import SwiftUI public init() {} func setLabels(_ labels: [LinkedItemLabel]) { - self.labels = labels.sorted { left, right in + let hideSystemLabels = UserDefaults(suiteName: "group.app.omnivoreapp")?.bool(forKey: UserDefaultKey.hideSystemLabels.rawValue) ?? false + + self.labels = labels.filter { !hideSystemLabels || !isSystemLabel($0) }.sorted { left, right in let aTrimmed = left.unwrappedName.trimmingCharacters(in: .whitespaces) let bTrimmed = right.unwrappedName.trimmingCharacters(in: .whitespaces) return aTrimmed.caseInsensitiveCompare(bTrimmed) == .orderedAscending diff --git a/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift b/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift index 66baa917f..d4628b384 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Profile/FiltersView.swift @@ -41,6 +41,7 @@ import Views } else { self.hasBadgePermission = false } + print("notification settings: ", settings.badgeSetting.rawValue) print("got the notification settings") } diff --git a/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift b/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift index 25959090d..6b7db00d6 100644 --- a/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift +++ b/apple/OmnivoreKit/Sources/Utils/UserDefaultKeys.swift @@ -33,6 +33,7 @@ public enum UserDefaultKey: String { case deviceTokenID case userWordsPerMinute case hideFeatureSection + case hideSystemLabels case justifyText case prefersHideStatusBarInReader case visibleShareExtensionTab