damus

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

commit 3bec23ecacac0dded7758e497f5e206c9ecc6efa
parent 6323eafd7e970e05093a103da3801c70b32aa796
Author: SanjaySiddharth <64358580+SanjaySiddharth@users.noreply.github.com>
Date:   Sat, 29 Mar 2025 03:18:08 +0530

Add search feature to the settings screen


Closes: https://github.com/damus-io/damus/issues/2838
Changelog-Added: Added a search interface to the settings screen
Signed-off-by: SanjaySiddharth <mjsanjaysiddharth1999@gmail.com>
Diffstat:
Mdamus/Views/ConfigView.swift | 167++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
1 file changed, 106 insertions(+), 61 deletions(-)

diff --git a/damus/Views/ConfigView.swift b/damus/Views/ConfigView.swift @@ -18,11 +18,26 @@ struct ConfigView: View { @State var delete_account_warning: Bool = false @State var confirm_delete_account: Bool = false @State var delete_text: String = "" + @State private var searchText: String = "" @ObservedObject var settings: UserSettingsStore - + + // String constants private let DELETE_KEYWORD = "DELETE" - + private let keysTitle = NSLocalizedString("Keys", comment: "Settings section for managing keys") + private let appearanceTitle = NSLocalizedString("Appearance and filters", comment: "Section header for text, appearance, and content filter settings") + private let searchUniverseTitle = NSLocalizedString("Search / Universe", comment: "Section header for search/universe settings") + private let notificationsTitle = NSLocalizedString("Notifications", comment: "Section header for Damus notifications") + private let zapsTitle = NSLocalizedString("Zaps", comment: "Section header for zap settings") + private let translationTitle = NSLocalizedString("Translation", comment: "Section header for text and appearance settings") + private let reactionsTitle = NSLocalizedString("Reactions", comment: "Section header for reactions settings") + private let developerTitle = NSLocalizedString("Developer", comment: "Section header for developer settings") + private let firstAidTitle = NSLocalizedString("First Aid", comment: "Section header for first aid tools and settings") + private let signOutTitle = NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account.") + private let deleteAccountTitle = NSLocalizedString("Delete Account", comment: "Button to delete the user's account.") + private let versionTitle = NSLocalizedString("Version", comment: "Section title for displaying the version number of the Damus app.") + private let copyString = NSLocalizedString("Copy", comment: "Context menu option for copying the version of damus.") + init(state: DamusState) { self.state = state _settings = ObservedObject(initialValue: state.settings) @@ -31,91 +46,122 @@ struct ConfigView: View { func textColor() -> Color { colorScheme == .light ? DamusColors.black : DamusColors.white } - + + func showSettingsButton(title : String)->Bool{ + return searchText.isEmpty || title.lowercased().contains(searchText.lowercased()) + } + var body: some View { ZStack(alignment: .leading) { Form { Section { - NavigationLink(value: Route.KeySettings(keypair: state.keypair)) { - IconLabel(NSLocalizedString("Keys", comment: "Settings section for managing keys"), img_name: "Key", color: .purple) - } - - NavigationLink(value: Route.AppearanceSettings(settings: settings)) { - IconLabel(NSLocalizedString("Appearance and filters", comment: "Section header for text, appearance, and content filter settings"), img_name: "eye", color: .red) + // Keys + if showSettingsButton(title: keysTitle){ + NavigationLink(value:Route.KeySettings(keypair: state.keypair)){ + IconLabel(keysTitle,img_name:"Key",color:.purple) + } } - - NavigationLink(value: Route.SearchSettings(settings: settings)) { - IconLabel(NSLocalizedString("Search/Universe", comment: "Section header for search/universe settings"), img_name: "search", color: .red) + // Appearance and filters + if showSettingsButton(title: appearanceTitle){ + NavigationLink(value:Route.AppearanceSettings(settings: settings)){ + IconLabel(appearanceTitle,img_name:"eye",color:.red) + } } - - NavigationLink(value: Route.NotificationSettings(settings: settings)) { - IconLabel(NSLocalizedString("Notifications", comment: "Section header for Damus notifications"), img_name: "notification-bell-on", color: .blue) + // Search/Universe + if showSettingsButton(title: searchUniverseTitle){ + NavigationLink(value: Route.SearchSettings(settings: settings)){ + IconLabel(searchUniverseTitle,img_name:"search",color:.red) + } } - NavigationLink(value: Route.ZapSettings(settings: settings)) { - IconLabel(NSLocalizedString("Zaps", comment: "Section header for zap settings"), img_name: "zap.fill", color: .orange) + //Notifications + if showSettingsButton(title: notificationsTitle){ + NavigationLink(value: Route.NotificationSettings(settings: settings)){ + IconLabel(notificationsTitle,img_name:"notification-bell-on",color:.blue) + } } - - NavigationLink(value: Route.TranslationSettings(settings: settings)) { - IconLabel(NSLocalizedString("Translation", comment: "Section header for text and appearance settings"), img_name: "globe", color: .green) + //Zaps + if showSettingsButton(title: zapsTitle){ + NavigationLink(value: Route.ZapSettings(settings: settings)){ + IconLabel(zapsTitle,img_name:"zap.fill",color:.orange) + } } - - NavigationLink(value: Route.ReactionsSettings(settings: settings)) { - IconLabel(NSLocalizedString("Reactions", comment: "Section header for reactions settings"), img_name: "shaka.fill", color: .purple) + //Translation + if showSettingsButton(title: translationTitle){ + NavigationLink(value: Route.TranslationSettings(settings: settings)){ + IconLabel(translationTitle,img_name:"globe",color:.green) + } } - - NavigationLink(value: Route.DeveloperSettings(settings: settings)) { - IconLabel(NSLocalizedString("Developer", comment: "Section header for developer settings"), img_name: "magic-stick2.fill", color: DamusColors.adaptableBlack) + //Reactions + if showSettingsButton(title: reactionsTitle){ + NavigationLink(value: Route.ReactionsSettings(settings: settings)){ + IconLabel(reactionsTitle,img_name:"shaka.fill",color:.purple) + } } - - NavigationLink(value: Route.FirstAidSettings(settings: settings)) { - IconLabel(NSLocalizedString("First Aid", comment: "Section header for first aid tools and settings"), img_name: "help2", color: .red) + //Developer + if showSettingsButton(title: developerTitle){ + NavigationLink(value: Route.DeveloperSettings(settings: settings)){ + IconLabel(developerTitle,img_name:"magic-stick2.fill",color:DamusColors.adaptableBlack) + } } - } - - Section(NSLocalizedString("Sign Out", comment: "Section title for signing out")) { - Button(action: { - if state.keypair.privkey == nil { - logout(state) - } else { - confirm_logout = true + //First Aid + if showSettingsButton(title: firstAidTitle){ + NavigationLink(value: Route.FirstAidSettings(settings: settings)){ + IconLabel(firstAidTitle,img_name:"help2",color: .red) } - }, label: { - Label(NSLocalizedString("Sign out", comment: "Sidebar menu label to sign out of the account."), image: "logout") - .foregroundColor(textColor()) - .frame(maxWidth: .infinity, alignment: .leading) - }) + } } - - if state.is_privkey_user { - Section(header: Text("Permanently Delete Account", comment: "Section title for deleting the user")) { + //Sign out Section + if showSettingsButton(title: signOutTitle){ + Section(signOutTitle){ Button(action: { - delete_account_warning = true + if state.keypair.privkey == nil { + logout(state) + } else { + confirm_logout = true + } }, label: { - Label(NSLocalizedString("Delete Account", comment: "Button to delete the user's account."), image: "delete") + Label(signOutTitle, image: "logout") + .foregroundColor(textColor()) .frame(maxWidth: .infinity, alignment: .leading) - .foregroundColor(.red) }) } } - - Section( - header: Text(NSLocalizedString("Version", comment: "Section title for displaying the version number of the Damus app.")), - footer: Text("").padding(.bottom, tabHeight + getSafeAreaBottom()) - ) { - Text(verbatim: VersionInfo.version) - .contextMenu { - Button { - UIPasteboard.general.string = VersionInfo.version - } label: { - Label(NSLocalizedString("Copy", comment: "Context menu option for copying the version of damus."), image: "copy2") - } + // Delete Account + if showSettingsButton(title: deleteAccountTitle){ + if state.is_privkey_user { + Section(header: Text("Permanently Delete Account", comment: "Section title for deleting the user")) { + Button(action: { + delete_account_warning = true + }, label: { + Label(deleteAccountTitle, image: "delete") + .frame(maxWidth: .infinity, alignment: .leading) + .foregroundColor(.red) + }) } + } + } + // Version info + if showSettingsButton(title: versionTitle) { + Section( + header: Text(versionTitle), + footer: Text("").padding(.bottom, tabHeight + getSafeAreaBottom()) + ) { + Text(verbatim: VersionInfo.version) + .contextMenu { + Button { + UIPasteboard.general.string = VersionInfo.version + } label: { + Label(copyString, image: "copy2") + } + } + } } } } .navigationTitle(NSLocalizedString("Settings", comment: "Navigation title for Settings view.")) .navigationBarTitleDisplayMode(.large) + .searchable(text: $searchText,prompt: "Search within settings") .alert(NSLocalizedString("WARNING:\n\nTHIS WILL SIGN AN EVENT THAT DELETES THIS ACCOUNT.\n\nYOU WILL NO LONGER BE ABLE TO LOG INTO DAMUS USING THIS ACCOUNT KEY.\n\n ARE YOU SURE YOU WANT TO CONTINUE?", comment: "Alert for deleting the users account."), isPresented: $delete_account_warning) { Button(NSLocalizedString("Cancel", comment: "Cancel deleting the user."), role: .cancel) { @@ -154,7 +200,6 @@ struct ConfigView: View { dismiss() } } - } struct ConfigView_Previews: PreviewProvider {