From d4baf513c67b8a88bb2db8d9b5e68acef22c6538 Mon Sep 17 00:00:00 2001 From: kingbri Date: Sat, 15 Jun 2024 22:52:19 -0500 Subject: [PATCH] Debrid: Fix UI updates with auth If a debrid is authorized, a Published variable needs to be notified since SwiftUI can't read computed properties on the fly (they are getters). Therefore, it's better to maintain a single source of truth of which services are logged in. Signed-off-by: kingbri --- Ferrite/API/AllDebridWrapper.swift | 2 +- Ferrite/ViewModels/DebridManager.swift | 22 ++++++++++--------- Ferrite/ViewModels/ScrapingViewModel.swift | 4 ++-- .../Library/BookmarksView.swift | 2 +- .../Library/LibraryPickerView.swift | 2 +- .../SearchResult/SearchFilterHeaderView.swift | 2 +- Ferrite/Views/SettingsView.swift | 2 +- 7 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Ferrite/API/AllDebridWrapper.swift b/Ferrite/API/AllDebridWrapper.swift index 75be7f3..a5a31b8 100644 --- a/Ferrite/API/AllDebridWrapper.swift +++ b/Ferrite/API/AllDebridWrapper.swift @@ -13,7 +13,7 @@ class AllDebrid: PollingDebridSource, ObservableObject { let website = "https://alldebrid.com" var authTask: Task? - var authProcessing: Bool = false + @Published var authProcessing: Bool = false var isLoggedIn: Bool { getToken() != nil } diff --git a/Ferrite/ViewModels/DebridManager.swift b/Ferrite/ViewModels/DebridManager.swift index 70771a4..382e319 100644 --- a/Ferrite/ViewModels/DebridManager.swift +++ b/Ferrite/ViewModels/DebridManager.swift @@ -23,14 +23,7 @@ class DebridManager: ObservableObject { // UI Variables @Published var showWebView: Bool = false @Published var showAuthSession: Bool = false - - var hasEnabledDebrids: Bool { - debridSources.contains { $0.isLoggedIn } - } - - var enabledDebridCount: Int { - debridSources.filter(\.isLoggedIn).count - } + @Published var enabledDebrids: [DebridSource] = [] @Published var selectedDebridSource: DebridSource? { didSet { @@ -57,6 +50,9 @@ class DebridManager: ObservableObject { @Published var notImplementedMessage: String = "" init() { + // Update the UI for debrid services that are enabled + enabledDebrids = debridSources.filter { $0.isLoggedIn } + // Set the preferred service. Contains migration logic for earlier versions if let rawPreferredService = UserDefaults.standard.string(forKey: "Debrid.PreferredService") { let debridServiceId: String? @@ -193,7 +189,7 @@ class DebridManager: ObservableObject { debridSource.authProcessing = false } - if enabledDebridCount == 1 { + if enabledDebrids.count == 1 { selectedDebridSource = debridSource } } @@ -201,6 +197,8 @@ class DebridManager: ObservableObject { // Set an API key if manually provided if let apiKey { debridSource.setApiKey(apiKey) + enabledDebrids.append(debridSource) + return } @@ -213,6 +211,7 @@ class DebridManager: ObservableObject { if validateAuthUrl(authUrl) { try await pollingSource.authTask?.value + enabledDebrids.append(debridSource) } else { throw DebridError.AuthQuery(description: "The authentication URL was invalid") } @@ -278,7 +277,7 @@ class DebridManager: ObservableObject { // Currently handles Premiumize callback func handleAuthCallback(url: URL?, error: Error?) async { defer { - if enabledDebridCount == 1 { + if enabledDebrids.count == 1 { selectedDebridSource = selectedOAuthDebridSource } @@ -296,6 +295,7 @@ class DebridManager: ObservableObject { if let callbackUrl = url { try oauthDebridSource.handleAuthCallback(url: callbackUrl) + enabledDebrids.append(oauthDebridSource) } else { throw DebridError.AuthQuery(description: "The callback URL was invalid") } @@ -312,6 +312,8 @@ class DebridManager: ObservableObject { if selectedDebridSource?.id == debridSource.id { selectedDebridSource = nil } + + enabledDebrids.removeAll { $0.id == debridSource.id } } // MARK: - Debrid fetch UI linked functions diff --git a/Ferrite/ViewModels/ScrapingViewModel.swift b/Ferrite/ViewModels/ScrapingViewModel.swift index 0da575c..82d5c69 100644 --- a/Ferrite/ViewModels/ScrapingViewModel.swift +++ b/Ferrite/ViewModels/ScrapingViewModel.swift @@ -102,7 +102,7 @@ class ScrapingViewModel: ObservableObject { cleanedSearchText = searchText.lowercased() - if await !debridManager.hasEnabledDebrids { + if await !debridManager.enabledDebrids.isEmpty { await debridManager.clearIAValues() } @@ -136,7 +136,7 @@ class ScrapingViewModel: ObservableObject { var failedSourceNames: [String] = [] for await (requestResult, sourceName) in group { if let requestResult { - if await debridManager.hasEnabledDebrids { + if await !debridManager.enabledDebrids.isEmpty { await debridManager.populateDebridIA(requestResult.magnets) } diff --git a/Ferrite/Views/ComponentViews/Library/BookmarksView.swift b/Ferrite/Views/ComponentViews/Library/BookmarksView.swift index eb0d632..c0b7d5e 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.hasEnabledDebrids { + if !debridManager.enabledDebrids.isEmpty { 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 d3c88f6..8c97e58 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.hasEnabledDebrids { + if !debridManager.enabledDebrids.isEmpty { Text("Cloud").tag(NavigationViewModel.LibraryPickerSegment.debridCloud) } } diff --git a/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift b/Ferrite/Views/ComponentViews/SearchResult/SearchFilterHeaderView.swift index 1ba7df0..9a96ab3 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.hasEnabledDebrids { + if !debridManager.enabledDebrids.isEmpty { IAFilterView() } diff --git a/Ferrite/Views/SettingsView.swift b/Ferrite/Views/SettingsView.swift index 3c8ffcd..692ce43 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.hasEnabledDebrids { + if !debridManager.enabledDebrids.isEmpty { NavigationLink { DefaultActionPickerView( actionRequirement: .debrid,