From 3224527c52e2271abce4620030e41d984b68caa1 Mon Sep 17 00:00:00 2001 From: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:45:06 +0400 Subject: [PATCH] improved search --- apps/ios/Shared/Views/Chat/ChatView.swift | 8 +- .../Shared/Views/ChatList/ChatListView.swift | 90 ++++++++++--------- .../Views/NewChat/NewChatScanButton.swift | 32 ------- apps/ios/SimpleX.xcodeproj/project.pbxproj | 4 - 4 files changed, 54 insertions(+), 80 deletions(-) delete mode 100644 apps/ios/Shared/Views/NewChat/NewChatScanButton.swift diff --git a/apps/ios/Shared/Views/Chat/ChatView.swift b/apps/ios/Shared/Views/Chat/ChatView.swift index 4fb93ffe22..e7fc041c28 100644 --- a/apps/ios/Shared/Views/Chat/ChatView.swift +++ b/apps/ios/Shared/Views/Chat/ChatView.swift @@ -250,8 +250,8 @@ struct ChatView: View { } private func searchToolbar() -> some View { - HStack { - HStack { + HStack(spacing: 12) { + HStack(spacing: 4) { Image(systemName: "magnifyingglass") TextField("Search", text: $searchText) .focused($searchFocussed) @@ -264,9 +264,9 @@ struct ChatView: View { Image(systemName: "xmark.circle.fill").opacity(searchText == "" ? 0 : 1) } } - .padding(EdgeInsets(top: 8, leading: 6, bottom: 8, trailing: 6)) + .padding(EdgeInsets(top: 7, leading: 7, bottom: 7, trailing: 7)) .foregroundColor(.secondary) - .background(Color(.secondarySystemBackground)) + .background(Color(.tertiarySystemFill)) .cornerRadius(10.0) Button ("Cancel") { diff --git a/apps/ios/Shared/Views/ChatList/ChatListView.swift b/apps/ios/Shared/Views/ChatList/ChatListView.swift index 1d5a2f0e57..7e1bf6bfb2 100644 --- a/apps/ios/Shared/Views/ChatList/ChatListView.swift +++ b/apps/ios/Shared/Views/ChatList/ChatListView.swift @@ -12,6 +12,7 @@ import SimpleXChat struct ChatListView: View { @EnvironmentObject var chatModel: ChatModel @Binding var showSettings: Bool + @State private var searchMode = false @State private var searchText = "" @State private var showNewChatSheet = false @State private var userPickerVisible = false @@ -63,8 +64,8 @@ struct ChatListView: View { private var chatListView: some View { VStack { -// chatList.searchable(text: $searchText) chatList + .navigationBarHidden(searchMode) } .onDisappear() { withAnimation { userPickerVisible = false } } .refreshable { @@ -83,7 +84,6 @@ struct ChatListView: View { secondaryButton: .cancel() )) } -// .offset(x: -8) .listStyle(.plain) .navigationBarTitleDisplayMode(.inline) .sheet(isPresented: $showCreateGroupSheet) { @@ -161,19 +161,19 @@ struct ChatListView: View { let cs = filteredChats() ZStack { VStack { - if !chatModel.chats.isEmpty { - ChatListSearchBar(text: $searchText) - .listRowSeparator(.hidden, edges: .top) - .frame(maxWidth: .infinity) - } List { + if !chatModel.chats.isEmpty { + ChatListSearchBar(searchMode: $searchMode, searchText: $searchText) + .listRowSeparator(.hidden, edges: .top) + .frame(maxWidth: .infinity) + } ForEach(cs, id: \.viewId) { chat in ChatListNavLink(chat: chat) .padding(.trailing, -16) .disabled(chatModel.chatRunning != true) } + .offset(x: -8) } - .offset(x: -8) } .onChange(of: chatModel.chatId) { _ in if chatModel.chatId == nil, let chatId = chatModel.chatToTop { @@ -273,46 +273,56 @@ struct ChatListView: View { } } -struct ChatListSearchBar: View { - @Binding var text: String - @State private var showCancelButton = false +private struct ChatListSearchBar: View { + @Binding var searchMode: Bool + @Binding var searchText: String @State private var showScanCodeSheet = false var body: some View { - VStack { - HStack(spacing: 8) { - HStack(spacing: 4) { - Image(systemName: "magnifyingglass") - .foregroundColor(.secondary) - TextField("Search", text: $text) + HStack(spacing: 12) { + HStack(spacing: 4) { + Image(systemName: "magnifyingglass") + TextField("Search or paste link", text: $searchText) + .foregroundColor(.primary) + .frame(maxWidth: .infinity) + .onTapGesture { + searchMode = true + } + + if searchMode { + Image(systemName: "xmark.circle.fill") + .opacity(searchText == "" ? 0 : 1) .onTapGesture { - showCancelButton = true + searchText = "" + } + } else { + Image(systemName: "qrcode") + .onTapGesture { + showScanCodeSheet = true } } - .padding(.horizontal, 7) - .padding(.vertical, 7) - .background(Color(uiColor: .secondarySystemFill)) - .clipShape(RoundedRectangle(cornerRadius: 10)) - - if showCancelButton { - Button { - hideKeyboard() - text = "" - showCancelButton = false - } label: { - Text("Cancel") - .foregroundColor(.accentColor) - } - .padding(.trailing, 8) - .transition(.identity) - } - - NewChatScanButton() } - Divider() + .padding(EdgeInsets(top: 7, leading: 7, bottom: 7, trailing: 7)) + .foregroundColor(.secondary) + .background(Color(.tertiarySystemFill)) + .cornerRadius(10.0) + + if searchMode { + Text("Cancel") + .foregroundColor(.accentColor) + .onTapGesture { + hideKeyboard() + searchText = "" + searchMode = false + } + .transition(.identity) + } + } + .padding(.bottom, 2) + .sheet(isPresented: $showScanCodeSheet) { + NewChatView(selection: .connect, showQRCodeScanner: true) + .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) // fixes .refreshable in ChatListView affecting nested view } - .padding(.horizontal, 18) - .padding(.vertical, 2) } } diff --git a/apps/ios/Shared/Views/NewChat/NewChatScanButton.swift b/apps/ios/Shared/Views/NewChat/NewChatScanButton.swift deleted file mode 100644 index f4c676e0af..0000000000 --- a/apps/ios/Shared/Views/NewChat/NewChatScanButton.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// NewChatScanButton.swift -// SimpleX (iOS) -// -// Created by spaced4ndy on 30.11.2023. -// Copyright © 2023 SimpleX Chat. All rights reserved. -// - -import SwiftUI - -struct NewChatScanButton: View { - @State private var showNewChatSheet = false - - var body: some View { - Button { - showNewChatSheet = true - } label: { - Image(systemName: "qrcode") - .resizable() - .scaledToFit() - .frame(width: 20, height: 20) - } - .sheet(isPresented: $showNewChatSheet) { - NewChatView(selection: .connect, showQRCodeScanner: true) - .environment(\EnvironmentValues.refresh as! WritableKeyPath, nil) // fixes .refreshable in ChatListView affecting nested view - } - } -} - -//#Preview { -// NewChatScanButton() -//} diff --git a/apps/ios/SimpleX.xcodeproj/project.pbxproj b/apps/ios/SimpleX.xcodeproj/project.pbxproj index 3c65af3388..c138683d59 100644 --- a/apps/ios/SimpleX.xcodeproj/project.pbxproj +++ b/apps/ios/SimpleX.xcodeproj/project.pbxproj @@ -180,7 +180,6 @@ 64AA1C6C27F3537400AC7277 /* DeletedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */; }; 64AEA4ED2B15D2A400334292 /* NewChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AEA4EC2B15D2A400334292 /* NewChatView.swift */; }; 64AEA4EF2B15FEE100334292 /* NewChatInviteButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AEA4EE2B15FEE100334292 /* NewChatInviteButton.swift */; }; - 64AEA4F12B18896400334292 /* NewChatScanButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64AEA4F02B18896400334292 /* NewChatScanButton.swift */; }; 64C06EB52A0A4A7C00792D4D /* ChatItemInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */; }; 64C3B0212A0D359700E19930 /* CustomTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */; }; 64D0C2C029F9688300B38D5F /* UserAddressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */; }; @@ -467,7 +466,6 @@ 64AA1C6B27F3537400AC7277 /* DeletedItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletedItemView.swift; sourceTree = ""; }; 64AEA4EC2B15D2A400334292 /* NewChatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatView.swift; sourceTree = ""; }; 64AEA4EE2B15FEE100334292 /* NewChatInviteButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatInviteButton.swift; sourceTree = ""; }; - 64AEA4F02B18896400334292 /* NewChatScanButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewChatScanButton.swift; sourceTree = ""; }; 64C06EB42A0A4A7C00792D4D /* ChatItemInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatItemInfoView.swift; sourceTree = ""; }; 64C3B0202A0D359700E19930 /* CustomTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTimePicker.swift; sourceTree = ""; }; 64D0C2BF29F9688300B38D5F /* UserAddressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAddressView.swift; sourceTree = ""; }; @@ -744,7 +742,6 @@ 64D0C2C529FAC1EC00B38D5F /* AddContactLearnMore.swift */, 64AEA4EC2B15D2A400334292 /* NewChatView.swift */, 64AEA4EE2B15FEE100334292 /* NewChatInviteButton.swift */, - 64AEA4F02B18896400334292 /* NewChatScanButton.swift */, ); path = NewChat; sourceTree = ""; @@ -1250,7 +1247,6 @@ 184152CEF68D2336FC2EBCB0 /* CallViewRenderers.swift in Sources */, 5CB634AD29E46CF70066AD6B /* LocalAuthView.swift in Sources */, 18415FEFE153C5920BFB7828 /* GroupWelcomeView.swift in Sources */, - 64AEA4F12B18896400334292 /* NewChatScanButton.swift in Sources */, 18415F9A2D551F9757DA4654 /* CIVideoView.swift in Sources */, 184158C131FDB829D8A117EA /* VideoPlayerView.swift in Sources */, );