From 8a4196db3ab558c37fdba42a18aaa790fb982756 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Wed, 25 Aug 2021 13:04:52 -0400 Subject: [PATCH] Add search --- OTP/Views/AllKeysView.swift | 4 +++- OTP/Views/AppView.swift | 22 +++++++++++++++------- OTP/Views/KeysSection.swift | 18 +++++++++++++++--- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/OTP/Views/AllKeysView.swift b/OTP/Views/AllKeysView.swift index 6de9c2d..efd1a06 100644 --- a/OTP/Views/AllKeysView.swift +++ b/OTP/Views/AllKeysView.swift @@ -10,6 +10,7 @@ import SwiftUI struct AllKeysView: View { @ObservedObject private var store: KeyStore @ObservedObject private var codeHolder: AppView.CodeHolder + @State private var searchQuery = "" init() { let store = KeyStore.shared @@ -19,9 +20,10 @@ struct AllKeysView: View { var body: some View { List { - KeysSection(codeHolder: codeHolder) + KeysSection(codeHolder: codeHolder, searchQuery: searchQuery) } .listStyle(.insetGrouped) + .searchable(text: $searchQuery) .navigationTitle("All Keys") .toolbar { ToolbarItem(placement: .navigationBarTrailing) { diff --git a/OTP/Views/AppView.swift b/OTP/Views/AppView.swift index 11cc225..adfa9bf 100644 --- a/OTP/Views/AppView.swift +++ b/OTP/Views/AppView.swift @@ -12,25 +12,32 @@ import Combine struct AppView: View { @ObservedObject private var store: KeyStore @ObservedObject private var entryHolder: CodeHolder + @ObservedObject private var allEntriesHolder: CodeHolder + @State private var searchQuery = "" @State private var isPresentingPreferences = false init() { self.store = .shared self.entryHolder = CodeHolder(store: .shared) { (entry) in entry.folderID == nil } + self.allEntriesHolder = CodeHolder(store: .shared, entryFilter: nil) } var body: some View { NavigationView { List { - KeysSection(codeHolder: entryHolder) - - Section { - NavigationLink("All Keys") { - AllKeysView() + if searchQuery.isEmpty { + KeysSection(codeHolder: entryHolder) + + Section { + NavigationLink("All Keys") { + AllKeysView() + } } + + FoldersSection() + } else { + KeysSection(codeHolder: allEntriesHolder, searchQuery: searchQuery) } - - FoldersSection() } .listStyle(.insetGrouped) .navigationTitle("OTP") @@ -48,6 +55,7 @@ struct AppView: View { } } } + .searchable(text: $searchQuery) .sheet(isPresented: $isPresentingPreferences, content: self.preferencesSheet) } diff --git a/OTP/Views/KeysSection.swift b/OTP/Views/KeysSection.swift index cf65364..e523ea4 100644 --- a/OTP/Views/KeysSection.swift +++ b/OTP/Views/KeysSection.swift @@ -9,18 +9,30 @@ import SwiftUI import UniformTypeIdentifiers struct KeysSection: View { + private let searchQuery: String? @ObservedObject private var store: KeyStore = .shared @ObservedObject private var entryHolder: AppView.CodeHolder @State private var editedEntry: AppView.CodeEntry? = nil @State private var presentedQRCode: AppView.CodeEntry? = nil - init(codeHolder: AppView.CodeHolder) { + init(codeHolder: AppView.CodeHolder, searchQuery: String? = nil) { self.entryHolder = codeHolder + self.searchQuery = searchQuery + } + + var filteredEntries: [AppView.CodeEntry] { + if let query = searchQuery?.lowercased(), !query.isEmpty { + return entryHolder.sortedEntries.filter { (e) in + e.key.issuer.lowercased().contains(query) || (e.key.label?.lowercased().contains(query) ?? false) + } + } else { + return entryHolder.sortedEntries + } } var body: some View { Section { - ForEach(entryHolder.sortedEntries) { (entry) in + ForEach(filteredEntries) { (entry) in KeyView(key: entry.key, currentCode: entry.code) // disabled because dropping onto list rows does not work :/ // .onDrag { @@ -33,7 +45,7 @@ struct KeysSection: View { .onDelete { (indices) in withAnimation(.default) { for index in indices { - store.removeKey(entryID: entryHolder.sortedEntries[index].id) + store.removeKey(entryID: filteredEntries[index].id) } } }