From 088fc473292c2d1b8d812210063bc1426604d4a3 Mon Sep 17 00:00:00 2001 From: mrFq1 <1xxbx0il0@mozmail.com> Date: Thu, 18 May 2023 15:20:27 +0800 Subject: [PATCH] feat: search support --- .../Providers/ProviderProxiesView.swift | 20 ++++++++-------- .../Providers/ProxyProvidersRowView.swift | 13 ++++++++++- .../Providers/RuleProvidersRowView.swift | 13 ++++++++++- .../ContentTabs/Proxies/ProxyGroupView.swift | 23 +++++++++++-------- .../ContentTabs/Proxies/ProxyItemView.swift | 8 +++---- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/ClashX Dashboard/Views/ContentTabs/Providers/ProviderProxiesView.swift b/ClashX Dashboard/Views/ContentTabs/Providers/ProviderProxiesView.swift index be19c55..2690873 100644 --- a/ClashX Dashboard/Views/ContentTabs/Providers/ProviderProxiesView.swift +++ b/ClashX Dashboard/Views/ContentTabs/Providers/ProviderProxiesView.swift @@ -16,6 +16,16 @@ struct ProviderProxiesView: View { @State private var isTesting = false @State private var isUpdating = false + var proxies: [DBProxy] { + if searchString.string.isEmpty { + return provider.proxies + } else { + return provider.proxies.filter { + $0.name.lowercased().contains(searchString.string.lowercased()) + } + } + } + var body: some View { ScrollView { Section { @@ -55,21 +65,13 @@ struct ProviderProxiesView: View { var proxyListView: some View { LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: columnCount)) { - ForEach($provider.proxies, id: \.id) { proxy in + ForEach(proxies, id: \.id) { proxy in ProxyItemView( proxy: proxy, selectable: false ) .background(.white) .cornerRadius(8) - - .show(isVisible: { - if searchString.string.isEmpty { - return true - } else { - return proxy.wrappedValue.name.lowercased().contains(searchString.string.lowercased()) - } - }()) } } } diff --git a/ClashX Dashboard/Views/ContentTabs/Providers/ProxyProvidersRowView.swift b/ClashX Dashboard/Views/ContentTabs/Providers/ProxyProvidersRowView.swift index f7d65bd..b6f88e6 100644 --- a/ClashX Dashboard/Views/ContentTabs/Providers/ProxyProvidersRowView.swift +++ b/ClashX Dashboard/Views/ContentTabs/Providers/ProxyProvidersRowView.swift @@ -9,9 +9,20 @@ import SwiftUI struct ProxyProvidersRowView: View { @ObservedObject var providerStorage: DBProviderStorage + @EnvironmentObject var searchString: ProxiesSearchString @State private var isUpdating = false + var providers: [DBProxyProvider] { + if searchString.string.isEmpty { + return providerStorage.proxyProviders + } else { + return providerStorage.proxyProviders.filter { + $0.name.lowercased().contains(searchString.string.lowercased()) + } + } + } + var body: some View { NavigationLink { contentView @@ -53,7 +64,7 @@ struct ProxyProvidersRowView: View { } var listView: some View { - ForEach(providerStorage.proxyProviders, id: \.id) { + ForEach(providers, id: \.id) { ProxyProviderInfoView(provider: $0) } } diff --git a/ClashX Dashboard/Views/ContentTabs/Providers/RuleProvidersRowView.swift b/ClashX Dashboard/Views/ContentTabs/Providers/RuleProvidersRowView.swift index 515e43e..2b76e5f 100644 --- a/ClashX Dashboard/Views/ContentTabs/Providers/RuleProvidersRowView.swift +++ b/ClashX Dashboard/Views/ContentTabs/Providers/RuleProvidersRowView.swift @@ -9,9 +9,20 @@ import SwiftUI struct RuleProvidersRowView: View { @ObservedObject var providerStorage: DBProviderStorage + @EnvironmentObject var searchString: ProxiesSearchString @State private var isUpdating = false + var providers: [DBRuleProvider] { + if searchString.string.isEmpty { + return providerStorage.ruleProviders + } else { + return providerStorage.ruleProviders.filter { + $0.name.lowercased().contains(searchString.string.lowercased()) + } + } + } + var body: some View { NavigationLink { contentView @@ -26,7 +37,7 @@ struct RuleProvidersRowView: View { ScrollView { Section { VStack(spacing: 12) { - ForEach(providerStorage.ruleProviders, id: \.id) { + ForEach(providers, id: \.id) { RuleProviderView(provider: $0) } } diff --git a/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyGroupView.swift b/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyGroupView.swift index 6b62d16..aa1db67 100644 --- a/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyGroupView.swift +++ b/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyGroupView.swift @@ -18,6 +18,16 @@ struct ProxyGroupView: View { @State private var selectable = false @State private var isTesting = false + var proxies: [DBProxy] { + if searchString.string.isEmpty { + return proxyGroup.proxies + } else { + return proxyGroup.proxies.filter { + $0.name.lowercased().contains(searchString.string.lowercased()) + } + } + } + var body: some View { ScrollView { Section { @@ -96,24 +106,17 @@ struct ProxyGroupView: View { var proxyListView: some View { LazyVGrid(columns: Array(repeating: GridItem(.flexible()), count: columnCount)) { - ForEach($proxyGroup.proxies, id: \.id) { proxy in + ForEach(proxies, id: \.id) { proxy in ProxyItemView( proxy: proxy, selectable: selectable ) - .background(proxyGroup.now == proxy.wrappedValue.name ? Color.teal : Color.white) + .background(proxyGroup.now == proxy.name ? Color.teal : Color.white) .cornerRadius(8) .onTapGesture { - let item = proxy.wrappedValue + let item = proxy updateSelect(item.name) } - .show(isVisible: { - if searchString.string.isEmpty { - return true - } else { - return proxy.wrappedValue.name.lowercased().contains(searchString.string.lowercased()) - } - }()) } } } diff --git a/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyItemView.swift b/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyItemView.swift index 4c18870..87666c0 100644 --- a/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyItemView.swift +++ b/ClashX Dashboard/Views/ContentTabs/Proxies/ProxyItemView.swift @@ -8,16 +8,16 @@ import SwiftUI struct ProxyItemView: View { - @Binding var proxy: DBProxy + @ObservedObject var proxy: DBProxy @State var selectable: Bool @EnvironmentObject var hideProxyNames: HideProxyNames - init(proxy: Binding, selectable: Bool) { - self._proxy = proxy + init(proxy: DBProxy, selectable: Bool) { + self.proxy = proxy self.selectable = selectable - self.isBuiltInProxy = [.pass, .direct, .reject].contains(proxy.wrappedValue.type) + self.isBuiltInProxy = [.pass, .direct, .reject].contains(proxy.type) } @State private var isBuiltInProxy: Bool