diff --git a/.swift-version b/.swift-version index 760606e..3659ea2 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -5.7 +5.8 diff --git a/Ferrite/Extensions/Color.swift b/Ferrite/Extensions/Color.swift index bd3b14e..8d28825 100644 --- a/Ferrite/Extensions/Color.swift +++ b/Ferrite/Extensions/Color.swift @@ -7,8 +7,8 @@ import SwiftUI -extension Color { - public init(hex: String) { +public extension Color { + init(hex: String) { let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) var int: UInt64 = 0 Scanner(string: hex).scanHexInt64(&int) @@ -28,7 +28,7 @@ extension Color { .sRGB, red: Double(r) / 255, green: Double(g) / 255, - blue: Double(b) / 255, + blue: Double(b) / 255, opacity: Double(a) / 255 ) } diff --git a/Ferrite/Extensions/UIApplication.swift b/Ferrite/Extensions/UIApplication.swift index 167b8dc..a19b1cf 100644 --- a/Ferrite/Extensions/UIApplication.swift +++ b/Ferrite/Extensions/UIApplication.swift @@ -10,6 +10,6 @@ import UIKit extension UIApplication { // From https://stackoverflow.com/questions/69650504/how-to-get-rid-of-message-windows-was-deprecated-in-ios-15-0-use-uiwindowsc var currentUIWindow: UIWindow? { - return UIApplication.shared.connectedScenes.flatMap { ($0 as? UIWindowScene)?.windows ?? [] }.first { $0.isKeyWindow } + UIApplication.shared.connectedScenes.flatMap { ($0 as? UIWindowScene)?.windows ?? [] }.first { $0.isKeyWindow } } } diff --git a/Ferrite/ViewModels/ScrapingViewModel.swift b/Ferrite/ViewModels/ScrapingViewModel.swift index 1e047b1..16ca3c0 100644 --- a/Ferrite/ViewModels/ScrapingViewModel.swift +++ b/Ferrite/ViewModels/ScrapingViewModel.swift @@ -725,7 +725,8 @@ class ScrapingViewModel: ObservableObject { // A capture group must be used in the provided regex if let regexString, - let parsedValue { + let parsedValue + { return runRegex(parsedValue: parsedValue, regexString: regexString) } else { return parsedValue @@ -922,7 +923,8 @@ class ScrapingViewModel: ObservableObject { } if let parsedValue, - let regexString { + let regexString + { return runRegex(parsedValue: parsedValue, regexString: regexString) } else { return parsedValue diff --git a/Ferrite/Views/CommonViews/NavView.swift b/Ferrite/Views/CommonViews/NavView.swift index eeb7ed7..fe2c172 100644 --- a/Ferrite/Views/CommonViews/NavView.swift +++ b/Ferrite/Views/CommonViews/NavView.swift @@ -16,16 +16,16 @@ struct NavView: View { var body: some View { // Uncomment once NavigationStack issues are fixed /* - if #available(iOS 16, *) { - NavigationStack { - content - } - } else { - */ - NavigationView { - content - } - .navigationViewStyle(.stack) - //} + if #available(iOS 16, *) { + NavigationStack { + content + } + } else { + */ + NavigationView { + content + } + .navigationViewStyle(.stack) + // } } } diff --git a/Ferrite/Views/ComponentViews/Plugin/Buttons/PluginCatalogButtonView.swift b/Ferrite/Views/ComponentViews/Plugin/Buttons/PluginCatalogButtonView.swift index 46043bc..9f9be28 100644 --- a/Ferrite/Views/ComponentViews/Plugin/Buttons/PluginCatalogButtonView.swift +++ b/Ferrite/Views/ComponentViews/Plugin/Buttons/PluginCatalogButtonView.swift @@ -58,7 +58,7 @@ struct PluginCatalogButtonView: View { ) .padding(.horizontal, 7) .padding(.vertical, 5) - .background(Color.init(uiColor: .tertiarySystemBackground)) + .background(Color(uiColor: .tertiarySystemBackground)) .clipShape(RoundedRectangle(cornerRadius: 10)) } .buttonStyle(.borderless) diff --git a/Ferrite/Views/ComponentViews/Plugin/PluginAggregateView.swift b/Ferrite/Views/ComponentViews/Plugin/PluginAggregateView.swift index 835c0c9..71f6d97 100644 --- a/Ferrite/Views/ComponentViews/Plugin/PluginAggregateView.swift +++ b/Ferrite/Views/ComponentViews/Plugin/PluginAggregateView.swift @@ -38,8 +38,7 @@ struct PluginAggregateView: View { installedPlugins: installedPlugins, searchText: searchText ) - if !filteredUpdatedPlugins.isEmpty - { + if !filteredUpdatedPlugins.isEmpty { Section(header: InlineHeader("Updates")) { ForEach(filteredUpdatedPlugins, id: \.self) { (updatedPlugin: PJ) in PluginCatalogButtonView(availablePlugin: updatedPlugin, needsUpdate: true) @@ -59,14 +58,12 @@ struct PluginAggregateView: View { } } - let filteredAvailablePlugins = pluginManager.fetchFilteredPlugins( forType: PJ.self, installedPlugins: installedPlugins, searchText: searchText ) - if !filteredAvailablePlugins.isEmpty - { + if !filteredAvailablePlugins.isEmpty { Section(header: InlineHeader("Catalog")) { ForEach(filteredAvailablePlugins, id: \.self) { availablePlugin in PluginCatalogButtonView(availablePlugin: availablePlugin, needsUpdate: false) diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift index 2f408b7..1df4702 100644 --- a/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift +++ b/Ferrite/Views/ComponentViews/SearchResult/SearchResultButtonView.swift @@ -133,7 +133,7 @@ struct SearchResultButtonView: View { } message: { Text( "RealDebrid is currently caching this file. Would you like to delete it? \n\n" + - "Progress can be checked on the RealDebrid website." + "Progress can be checked on the RealDebrid website." ) } .onReceive(NotificationCenter.default.publisher(for: .didDeleteBookmark)) { notification in diff --git a/Ferrite/Views/ContentView.swift b/Ferrite/Views/ContentView.swift index 20d5e67..2bce38f 100644 --- a/Ferrite/Views/ContentView.swift +++ b/Ferrite/Views/ContentView.swift @@ -17,7 +17,7 @@ struct ContentView: View { @AppStorage("Behavior.AutocorrectSearch") var autocorrectSearch: Bool = false @State private var isSearching = false - @State private var dismissAction: () -> () = {} + @State private var dismissAction: () -> Void = {} var body: some View { NavView { @@ -47,7 +47,7 @@ struct ContentView: View { sources: sources, debridManager: debridManager ) - + logManager.hideIndeterminateToast() scrapingModel.runningSearchTask = nil } diff --git a/Ferrite/Views/MainView.swift b/Ferrite/Views/MainView.swift index 49d35f0..63530c6 100644 --- a/Ferrite/Views/MainView.swift +++ b/Ferrite/Views/MainView.swift @@ -71,6 +71,7 @@ struct MainView: View { Application.shared.osVersion.toString() >= Application.shared.minVersion { // MARK: If scope bar duplication happens, this may be the problem + // Sleep for 2 seconds to allow for view layout and app init try? await Task.sleep(seconds: 2) diff --git a/Ferrite/Views/RepresentableViews/ExpandedSearchable.swift b/Ferrite/Views/RepresentableViews/ExpandedSearchable.swift index 95f53c7..7843815 100644 --- a/Ferrite/Views/RepresentableViews/ExpandedSearchable.swift +++ b/Ferrite/Views/RepresentableViews/ExpandedSearchable.swift @@ -9,32 +9,30 @@ import SwiftUI public extension View { // A dismissAction must be added in the parent view struct due to lifecycle issues - func expandedSearchable( - text: Binding, - isSearching: Binding? = nil, - prompt: String? = nil, - dismiss: Binding<(() -> ())>? = nil, - scopeBarContent: @escaping () -> Content = { - EmptyView() - }, - onSubmit: (() -> ())? = nil, - onCancel: (() -> ())? = nil - ) -> some View { - self - .overlay( - SearchBar( - searchText: text, - isSearching: isSearching ?? Binding(get: { true }, set: { _, _ in }), - prompt: prompt ?? "Search", - dismiss: dismiss ?? Binding(get: { {} }, set: { _, _ in }), - scopeBarContent: scopeBarContent, - onSubmit: onSubmit, - onCancel: onCancel - ) - .frame(width: 0, height: 0) + func expandedSearchable(text: Binding, + isSearching: Binding? = nil, + prompt: String? = nil, + dismiss: Binding<() -> Void>? = nil, + scopeBarContent: @escaping () -> some View = { + EmptyView() + }, + onSubmit: (() -> Void)? = nil, + onCancel: (() -> Void)? = nil) -> some View + { + overlay( + SearchBar( + searchText: text, + isSearching: isSearching ?? Binding(get: { true }, set: { _, _ in }), + prompt: prompt ?? "Search", + dismiss: dismiss ?? Binding(get: { {} }, set: { _, _ in }), + scopeBarContent: scopeBarContent, + onSubmit: onSubmit, + onCancel: onCancel ) - .environment(\.esIsSearching, isSearching?.wrappedValue ?? false) - .environment(\.esDismissSearch, ESDismissSearchAction(action: dismiss?.wrappedValue ?? { })) + .frame(width: 0, height: 0) + ) + .environment(\.esIsSearching, isSearching?.wrappedValue ?? false) + .environment(\.esDismissSearch, ESDismissSearchAction(action: dismiss?.wrappedValue ?? {})) } func esAutocapitalization(_ autocapitalizationType: UITextAutocapitalizationType) -> some View { @@ -47,9 +45,9 @@ struct ESIsSearching: EnvironmentKey { } struct ESDismissSearchAction: EnvironmentKey { - static var defaultValue: ESDismissSearchAction = ESDismissSearchAction(action: {}) + static var defaultValue: ESDismissSearchAction = .init(action: {}) - let action: () -> () + let action: () -> Void func callAsFunction() { action() @@ -78,7 +76,7 @@ extension EnvironmentValues { } struct SearchBar: UIViewControllerRepresentable { - var searchController: UISearchController = UISearchController(searchResultsController: nil) + var searchController: UISearchController = .init(searchResultsController: nil) @Environment(\.autocorrectionDisabled) var autocorrectionDisabled @Environment(\.esAutocapitalizationType) var autocapitalization @@ -87,10 +85,10 @@ struct SearchBar: UIViewControllerRepresentable { @Binding var searchText: String @Binding var isSearching: Bool var prompt: String - @Binding var dismiss: (() -> ()) + @Binding var dismiss: () -> Void let scopeBarContent: () -> ScopeContent - let onSubmit: (() -> ())? - let onCancel: (() -> ())? + let onSubmit: (() -> Void)? + let onCancel: (() -> Void)? class Coordinator: NSObject, UISearchBarDelegate, UISearchResultsUpdating { let parent: SearchBar @@ -123,7 +121,7 @@ struct SearchBar: UIViewControllerRepresentable { } func makeCoordinator() -> Coordinator { - return Coordinator(self) + Coordinator(self) } func makeUIViewController(context: Context) -> NavSearchBarWrapper { @@ -186,7 +184,7 @@ struct SearchBar: UIViewControllerRepresentable { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - + override func viewWillAppear(_ animated: Bool) { setup() } diff --git a/Ferrite/Views/RepresentableViews/ShareSheet.swift b/Ferrite/Views/RepresentableViews/ShareSheet.swift index 6748b8a..cd33d0a 100644 --- a/Ferrite/Views/RepresentableViews/ShareSheet.swift +++ b/Ferrite/Views/RepresentableViews/ShareSheet.swift @@ -13,6 +13,6 @@ struct ShareSheet: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> UIActivityViewController { UIActivityViewController(activityItems: activityItems, applicationActivities: nil) } - + func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {} } diff --git a/Ferrite/Views/SettingsView.swift b/Ferrite/Views/SettingsView.swift index f85773c..66a5e70 100644 --- a/Ferrite/Views/SettingsView.swift +++ b/Ferrite/Views/SettingsView.swift @@ -51,7 +51,7 @@ struct SettingsView: View { } Section(header: InlineHeader("Playback services")) { - NavigationLink{ + NavigationLink { SettingsKodiView(kodiServers: kodiServers) } label: { HStack { diff --git a/Ferrite/Views/SheetViews/BatchChoiceView.swift b/Ferrite/Views/SheetViews/BatchChoiceView.swift index 1710e53..771395f 100644 --- a/Ferrite/Views/SheetViews/BatchChoiceView.swift +++ b/Ferrite/Views/SheetViews/BatchChoiceView.swift @@ -39,7 +39,7 @@ struct BatchChoiceView: View { if file.fileName.lowercased().contains(searchText.lowercased()) || searchText.isEmpty { Button(file.fileName) { debridManager.selectedAllDebridFile = file - + queueCommonDownload(fileName: file.fileName) } } @@ -49,7 +49,7 @@ struct BatchChoiceView: View { if file.name.lowercased().contains(searchText.lowercased()) || searchText.isEmpty { Button(file.name) { debridManager.selectedPremiumizeFile = file - + queueCommonDownload(fileName: file.name) } }