diff --git a/Ferrite/API/PremiumizeWrapper.swift b/Ferrite/API/PremiumizeWrapper.swift index b45f8f2..bc14311 100644 --- a/Ferrite/API/PremiumizeWrapper.swift +++ b/Ferrite/API/PremiumizeWrapper.swift @@ -13,7 +13,7 @@ public class Premiumize: OAuthDebridSource, ObservableObject { public let website = "https://premiumize.me" @Published public var authProcessing: Bool = false public var isLoggedIn: Bool { - return getToken() != nil + getToken() != nil } public var manualToken: String? { diff --git a/Ferrite/API/RealDebridWrapper.swift b/Ferrite/API/RealDebridWrapper.swift index cb1dd13..fdeccab 100644 --- a/Ferrite/API/RealDebridWrapper.swift +++ b/Ferrite/API/RealDebridWrapper.swift @@ -7,7 +7,7 @@ import Foundation -public class RealDebrid: PollingDebridSource, ObservableObject { +public class RealDebrid: PollingDebridSource, ObservableObject { public let id = "RealDebrid" public let abbreviation = "RD" public let website = "https://real-debrid.com" diff --git a/Ferrite/Protocols/Debrid.swift b/Ferrite/Protocols/Debrid.swift index 75a84d6..fb24d7d 100644 --- a/Ferrite/Protocols/Debrid.swift +++ b/Ferrite/Protocols/Debrid.swift @@ -9,7 +9,7 @@ import Foundation public protocol DebridSource: AnyObservableObject { // ID of the service - //var id: DebridInfo { get } + // var id: DebridInfo { get } var id: String { get } var abbreviation: String { get } var website: String { get } diff --git a/Ferrite/Utils/Store.swift b/Ferrite/Utils/Store.swift index a663fe6..34cd3b2 100644 --- a/Ferrite/Utils/Store.swift +++ b/Ferrite/Utils/Store.swift @@ -12,12 +12,12 @@ // TODO: Replace with Observable when minVersion >= iOS 17 // -import SwiftUI import Combine +import SwiftUI class ErasedObservableObject: ObservableObject { let objectWillChange: AnyPublisher - + init(objectWillChange: AnyPublisher) { self.objectWillChange = objectWillChange } @@ -62,14 +62,14 @@ public protocol AnyObservableObject: AnyObject { public struct Store { /// The underlying object being stored. public let wrappedValue: ObjectType - + // See https://github.com/Tiny-Home-Consulting/Dependiject/issues/38 fileprivate var _observableObject: ObservedObject @MainActor internal var observableObject: ErasedObservableObject { - return _observableObject.wrappedValue + _observableObject.wrappedValue } - + /// A projected value which has the same properties as the wrapped value, but presented as /// bindings. /// @@ -84,55 +84,54 @@ public struct Store { /// } /// ``` public var projectedValue: Wrapper { - return Wrapper(self) + Wrapper(self) } - + /// Create a stored value on a custom scheduler. /// /// Use this init to schedule updates on a specific scheduler other than `DispatchQueue.main`. - public init( - wrappedValue: ObjectType, - on scheduler: S, - schedulerOptions: S.SchedulerOptions? = nil - ) { + public init(wrappedValue: ObjectType, + on scheduler: S, + schedulerOptions: S.SchedulerOptions? = nil) + { self.wrappedValue = wrappedValue - + if let observable = wrappedValue as? AnyObservableObject { let objectWillChange = observable.objectWillChange .receive(on: scheduler, options: schedulerOptions) .eraseToAnyPublisher() - self._observableObject = .init(initialValue: .init(objectWillChange: objectWillChange)) + _observableObject = .init(initialValue: .init(objectWillChange: objectWillChange)) } else { assertionFailure( "Only use the Store property wrapper with objects conforming to AnyObservableObject." ) - self._observableObject = .init(initialValue: .empty()) + _observableObject = .init(initialValue: .empty()) } } - + /// Create a stored value which publishes on the main thread. /// /// To control when updates are published, see ``init(wrappedValue:on:schedulerOptions:)``. public init(wrappedValue: ObjectType) { self.init(wrappedValue: wrappedValue, on: DispatchQueue.main) } - + /// An equivalent to SwiftUI's /// [`ObservedObject.Wrapper`](https://developer.apple.com/documentation/swiftui/observedobject/wrapper) /// type. @dynamicMemberLookup public struct Wrapper { private var store: Store - + internal init(_ store: Store) { self.store = store } - + /// Returns a binding to the resulting value of a given key path. public subscript( dynamicMember keyPath: ReferenceWritableKeyPath ) -> Binding { - return Binding { + Binding { self.store.wrappedValue[keyPath: keyPath] } set: { self.store.wrappedValue[keyPath: keyPath] = $0 diff --git a/Ferrite/ViewModels/DebridManager.swift b/Ferrite/ViewModels/DebridManager.swift index 3675c26..a113407 100644 --- a/Ferrite/ViewModels/DebridManager.swift +++ b/Ferrite/ViewModels/DebridManager.swift @@ -27,7 +27,7 @@ public class DebridManager: ObservableObject { } var enabledDebridCount: Int { - debridSources.filter{ $0.isLoggedIn }.count + debridSources.filter(\.isLoggedIn).count } @Published var selectedDebridSource: DebridSource? { @@ -35,6 +35,7 @@ public class DebridManager: ObservableObject { UserDefaults.standard.set(selectedDebridSource?.id ?? "", forKey: "Debrid.PreferredService") } } + var selectedDebridItem: DebridIA? var selectedDebridFile: DebridIAFile? @@ -59,7 +60,6 @@ public class DebridManager: ObservableObject { var premiumizeAuthProcessing: Bool = false init() { - // Set the preferred service. Contains migration logic for earlier versions if let rawPreferredService = UserDefaults.standard.string(forKey: "Debrid.PreferredService") { let debridServiceId: String? @@ -72,8 +72,8 @@ public class DebridManager: ObservableObject { // Only set the debrid source if it's logged in // Otherwise remove the key - let tempDebridSource = self.debridSources.first { $0.id == debridServiceId } - if (tempDebridSource?.isLoggedIn ?? false) { + let tempDebridSource = debridSources.first { $0.id == debridServiceId } + if tempDebridSource?.isLoggedIn ?? false { selectedDebridSource = tempDebridSource } else { UserDefaults.standard.removeObject(forKey: "Debrid.PreferredService") @@ -286,7 +286,7 @@ public class DebridManager: ObservableObject { if let error { throw DebridError.AuthQuery(description: "OAuth callback Error: \(error)") - } + } if let callbackUrl = url { try oauthDebridSource.handleAuthCallback(url: callbackUrl) @@ -377,7 +377,6 @@ public class DebridManager: ObservableObject { if error.code != -999 { await sendDebridError(error, prefix: "\(selectedSource.id) cloud fetch error") } - } } } diff --git a/Ferrite/Views/ComponentViews/Library/Cloud/CloudTorrentView.swift b/Ferrite/Views/ComponentViews/Library/Cloud/CloudTorrentView.swift index 0c86880..cdc950f 100644 --- a/Ferrite/Views/ComponentViews/Library/Cloud/CloudTorrentView.swift +++ b/Ferrite/Views/ComponentViews/Library/Cloud/CloudTorrentView.swift @@ -25,12 +25,12 @@ struct CloudTorrentView: View { if cloudTorrent.status == "downloaded", !cloudTorrent.links.isEmpty { navModel.resultFromCloud = true navModel.selectedTitle = cloudTorrent.fileName - + var historyInfo = HistoryEntryJson( name: cloudTorrent.fileName, source: debridSource.id ) - + Task { let magnet = Magnet(hash: cloudTorrent.hash, link: nil) await debridManager.populateDebridIA([magnet]) @@ -39,11 +39,11 @@ struct CloudTorrentView: View { if cloudTorrent.links.count == 1 { await debridManager.fetchDebridDownload(magnet: magnet) - + if !debridManager.downloadUrl.isEmpty { historyInfo.url = debridManager.downloadUrl PersistenceController.shared.createHistory(historyInfo, performSave: true) - + pluginManager.runDefaultAction( urlString: debridManager.downloadUrl, navModel: navModel @@ -63,7 +63,7 @@ struct CloudTorrentView: View { .font(.callout) .fixedSize(horizontal: false, vertical: true) .lineLimit(4) - + HStack { Text(cloudTorrent.status.capitalizingFirstLetter()) Spacer()