From b80f8900b756bde512b3cb4b2c86a9ca8dcc81ae Mon Sep 17 00:00:00 2001 From: kingbri Date: Tue, 4 Jun 2024 13:56:48 -0400 Subject: [PATCH] Debrid: Allow for UI updates Mark as an ObservableObject so the UI can see parameters that are being updated in the class. Signed-off-by: kingbri --- Ferrite/API/PremiumizeWrapper.swift | 8 ++--- Ferrite/API/RealDebridWrapper.swift | 8 ++--- Ferrite/Protocols/Debrid.swift | 2 +- Ferrite/ViewModels/DebridManager.swift | 29 ++++++++----------- Ferrite/ViewModels/ScrapingViewModel.swift | 4 +-- .../Library/BookmarksView.swift | 2 +- .../Library/LibraryPickerView.swift | 2 +- .../SearchResult/SearchFilterHeaderView.swift | 2 +- Ferrite/Views/SettingsView.swift | 2 +- 9 files changed, 27 insertions(+), 32 deletions(-) diff --git a/Ferrite/API/PremiumizeWrapper.swift b/Ferrite/API/PremiumizeWrapper.swift index 8a08d6b..9fcd234 100644 --- a/Ferrite/API/PremiumizeWrapper.swift +++ b/Ferrite/API/PremiumizeWrapper.swift @@ -12,14 +12,14 @@ public class Premiumize: OAuthDebridSource { public let abbreviation = "PM" public let website = "https://premiumize.me" - public var authProcessing: Bool = false + @Published public var authProcessing: Bool = false public var isLoggedIn: Bool { getToken() != nil } - public var IAValues: [DebridIA] = [] - public var cloudDownloads: [DebridCloudDownload] = [] - public var cloudTorrents: [DebridCloudTorrent] = [] + @Published public var IAValues: [DebridIA] = [] + @Published public var cloudDownloads: [DebridCloudDownload] = [] + @Published public var cloudTorrents: [DebridCloudTorrent] = [] let baseAuthUrl = "https://www.premiumize.me/authorize" let baseApiUrl = "https://www.premiumize.me/api" diff --git a/Ferrite/API/RealDebridWrapper.swift b/Ferrite/API/RealDebridWrapper.swift index 53efaa2..e6f46de 100644 --- a/Ferrite/API/RealDebridWrapper.swift +++ b/Ferrite/API/RealDebridWrapper.swift @@ -13,16 +13,16 @@ public class RealDebrid: PollingDebridSource { public let website = "https://real-debrid.com" public var authTask: Task? - public var authProcessing: Bool = false + @Published public var authProcessing: Bool = false // Directly checked because the request fetch uses async public var isLoggedIn: Bool { FerriteKeychain.shared.get("RealDebrid.AccessToken") != nil } - public var IAValues: [DebridIA] = [] - public var cloudDownloads: [DebridCloudDownload] = [] - public var cloudTorrents: [DebridCloudTorrent] = [] + @Published public var IAValues: [DebridIA] = [] + @Published public var cloudDownloads: [DebridCloudDownload] = [] + @Published public var cloudTorrents: [DebridCloudTorrent] = [] let baseAuthUrl = "https://api.real-debrid.com/oauth/v2" let baseApiUrl = "https://api.real-debrid.com/rest/1.0" diff --git a/Ferrite/Protocols/Debrid.swift b/Ferrite/Protocols/Debrid.swift index 3c35014..8af5adf 100644 --- a/Ferrite/Protocols/Debrid.swift +++ b/Ferrite/Protocols/Debrid.swift @@ -7,7 +7,7 @@ import Foundation -public protocol DebridSource { +public protocol DebridSource: ObservableObject { // ID of the service var id: String { get } var abbreviation: String { get } diff --git a/Ferrite/ViewModels/DebridManager.swift b/Ferrite/ViewModels/DebridManager.swift index 84d9e02..6e30bcf 100644 --- a/Ferrite/ViewModels/DebridManager.swift +++ b/Ferrite/ViewModels/DebridManager.swift @@ -12,16 +12,20 @@ import SwiftUI public class DebridManager: ObservableObject { // Linked classes var logManager: LoggingManager? - let realDebrid: RealDebrid = .init() - let allDebrid: AllDebrid = .init() - let premiumize: Premiumize = .init() + @Published var realDebrid: RealDebrid = .init() + @Published var allDebrid: AllDebrid = .init() + @Published var premiumize: Premiumize = .init() - lazy var debridSources: [DebridSource] = [realDebrid, allDebrid, premiumize] + lazy var debridSources: [any DebridSource] = [realDebrid, allDebrid, premiumize] // UI Variables @Published var showWebView: Bool = false @Published var showAuthSession: Bool = false + var hasEnabledDebrids: Bool { + debridSources.contains { $0.isLoggedIn } + } + // Service agnostic variables @Published var enabledDebrids: Set = [] { didSet { @@ -60,9 +64,6 @@ public class DebridManager: ObservableObject { // RealDebrid auth variables var realDebridAuthProcessing: Bool = false - // RealDebrid fetch variables - @Published var realDebridIAValues: [DebridIA] = [] - @Published var showDeleteAlert: Bool = false var selectedRealDebridItem: DebridIA? @@ -78,9 +79,6 @@ public class DebridManager: ObservableObject { // AllDebrid auth variables var allDebridAuthProcessing: Bool = false - // AllDebrid fetch variables - @Published var allDebridIAValues: [DebridIA] = [] - var selectedAllDebridItem: DebridIA? var selectedAllDebridFile: DebridIAFile? @@ -92,9 +90,6 @@ public class DebridManager: ObservableObject { // Premiumize auth variables var premiumizeAuthProcessing: Bool = false - // Premiumize fetch variables - @Published var premiumizeIAValues: [DebridIA] = [] - var selectedPremiumizeItem: DebridIA? var selectedPremiumizeFile: DebridIAFile? @@ -171,9 +166,9 @@ public class DebridManager: ObservableObject { // Cleans all cached IA values in the event of a full IA refresh public func clearIAValues() { - realDebridIAValues = [] - allDebridIAValues = [] - premiumizeIAValues = [] + for debridSource in debridSources { + debridSource.IAValues = [] + } } // Clears all selected files and items @@ -216,7 +211,7 @@ public class DebridManager: ObservableObject { } } else if let IAIndex = premiumize.IAValues.firstIndex(where: { $0.magnet.hash == magnet.hash }), enabledDebrids.contains(.premiumize) { if now.timeIntervalSince1970 > premiumize.IAValues[IAIndex].expiryTimeStamp { - premiumizeIAValues.remove(at: IAIndex) + premiumize.IAValues.remove(at: IAIndex) return true } else { return false diff --git a/Ferrite/ViewModels/ScrapingViewModel.swift b/Ferrite/ViewModels/ScrapingViewModel.swift index 46720dd..13c65a0 100644 --- a/Ferrite/ViewModels/ScrapingViewModel.swift +++ b/Ferrite/ViewModels/ScrapingViewModel.swift @@ -80,7 +80,7 @@ class ScrapingViewModel: ObservableObject { cleanedSearchText = searchText.lowercased() - if await !debridManager.enabledDebrids.isEmpty { + if await !debridManager.hasEnabledDebrids { await debridManager.clearIAValues() } @@ -114,7 +114,7 @@ class ScrapingViewModel: ObservableObject { var failedSourceNames: [String] = [] for await (requestResult, sourceName) in group { if let requestResult { - if await !debridManager.enabledDebrids.isEmpty { + if await !debridManager.hasEnabledDebrids { await debridManager.populateDebridIA(requestResult.magnets) } diff --git a/Ferrite/Views/ComponentViews/Library/BookmarksView.swift b/Ferrite/Views/ComponentViews/Library/BookmarksView.swift index 60bd3cf..eb0d632 100644 --- a/Ferrite/Views/ComponentViews/Library/BookmarksView.swift +++ b/Ferrite/Views/ComponentViews/Library/BookmarksView.swift @@ -56,7 +56,7 @@ struct BookmarksView: View { .frame(height: 15) } .task { - if debridManager.enabledDebrids.count > 0 { + if debridManager.hasEnabledDebrids { let magnets = bookmarks.compactMap { if let magnetHash = $0.magnetHash { return Magnet(hash: magnetHash, link: $0.magnetLink) diff --git a/Ferrite/Views/ComponentViews/Library/LibraryPickerView.swift b/Ferrite/Views/ComponentViews/Library/LibraryPickerView.swift index 8c97e58..d3c88f6 100644 --- a/Ferrite/Views/ComponentViews/Library/LibraryPickerView.swift +++ b/Ferrite/Views/ComponentViews/Library/LibraryPickerView.swift @@ -19,7 +19,7 @@ struct LibraryPickerView: View { Text("Bookmarks").tag(NavigationViewModel.LibraryPickerSegment.bookmarks) Text("History").tag(NavigationViewModel.LibraryPickerSegment.history) - if !debridManager.enabledDebrids.isEmpty { + if debridManager.hasEnabledDebrids { Text("Cloud").tag(NavigationViewModel.LibraryPickerSegment.debridCloud) } } diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift index 2602c68..8797a1a 100644 --- a/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift +++ b/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift @@ -60,7 +60,7 @@ struct SearchFilterHeaderView: View { // MARK: - Cache status picker - if !debridManager.enabledDebrids.isEmpty { + if debridManager.hasEnabledDebrids { IAFilterView() } diff --git a/Ferrite/Views/SettingsView.swift b/Ferrite/Views/SettingsView.swift index 019c6bb..8914583 100644 --- a/Ferrite/Views/SettingsView.swift +++ b/Ferrite/Views/SettingsView.swift @@ -128,7 +128,7 @@ struct SettingsView: View { } Section(header: InlineHeader("Default actions")) { - if debridManager.enabledDebrids.count > 0 { + if debridManager.hasEnabledDebrids { NavigationLink { DefaultActionPickerView( actionRequirement: .debrid,