From 29b917ead0579fc90672a62b2133ab4c14446e26 Mon Sep 17 00:00:00 2001 From: Daniel Chick Date: Mon, 1 Jul 2024 20:58:59 -0500 Subject: [PATCH] Migrate to the latest version of Factory (#1097) --- .../MainCoordinator/iOSMainCoordinator.swift | 11 +++-- .../MainCoordinator/tvOSMainCoordinator.swift | 4 +- .../BaseItemDto/BaseItemDto+Images.swift | 2 +- .../BaseItemDto+VideoPlayerViewModel.swift | 4 +- .../JellyfinAPI/BaseItemDto/BaseItemDto.swift | 3 +- .../BaseItemPerson+Poster.swift | 2 +- ...aSourceInfo+ItemVideoPlayerViewModel.swift | 4 +- .../Extensions/JellyfinAPI/MediaStream.swift | 2 +- Shared/ServerDiscovery/ServerDiscovery.swift | 2 +- Shared/Services/DownloadManager.swift | 9 +--- Shared/Services/DownloadTask.swift | 13 +++--- Shared/Services/Keychain.swift | 6 +-- Shared/Services/LogManager.swift | 32 +++++++------ Shared/Services/SwiftfinNotifications.swift | 8 ++-- Shared/Services/UserSession.swift | 45 +++++++++---------- .../StoredValue/StoredValue.swift | 3 +- .../StoredValue/StoredValues+User.swift | 2 +- .../SwiftfinStore+Mappings.swift | 3 +- .../SwiftfinStore+ServerState.swift | 3 +- Shared/SwiftfinStore/SwiftfinStore.swift | 10 ++--- .../SwiftinStore+UserState.swift | 9 ++-- .../ViewModels/ConnectToServerViewModel.swift | 3 +- Shared/ViewModels/DownloadListViewModel.swift | 2 +- Shared/ViewModels/SettingsViewModel.swift | 2 +- Shared/ViewModels/ViewModel.swift | 8 ++-- Swiftfin tvOS/App/SwiftfinApp.swift | 2 +- .../ItemView/Components/PlayButton.swift | 2 +- .../Views/SelectUserView/SelectUserView.swift | 2 +- .../Views/UserSignInView/UserSignInView.swift | 2 +- Swiftfin.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/swiftpm/Package.resolved | 10 ++--- Swiftfin/App/SwiftfinApp.swift | 2 +- .../DownloadTaskContentView.swift | 2 +- .../Components/ActionButtonHStack.swift | 2 +- .../Components/DownloadTaskButton.swift | 2 +- .../ItemView/Components/PlayButton.swift | 2 +- .../Views/SelectUserView/SelectUserView.swift | 2 +- .../Components/UserProfileRow.swift | 2 +- .../Views/UserSignInView/UserSignInView.swift | 2 +- 39 files changed, 115 insertions(+), 115 deletions(-) diff --git a/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift b/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift index e5b1a2da..e60781ad 100644 --- a/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift +++ b/Shared/Coordinators/MainCoordinator/iOSMainCoordinator.swift @@ -21,9 +21,12 @@ import SwiftUI final class MainCoordinator: NavigationCoordinatable { - @Injected(LogManager.service) + @Injected(\.logService) private var logger + @Injected(\.currentUserSession) + private var userSession + var stack: Stinsen.NavigationStack @Root @@ -50,7 +53,7 @@ final class MainCoordinator: NavigationCoordinatable { do { try await SwiftfinStore.setupDataStack() - if UserSession.current() != nil, !Defaults[.signOutOnClose] { + if userSession != nil, !Defaults[.signOutOnClose] { await MainActor.run { withAnimation(.linear(duration: 0.1)) { let _ = root(\.serverCheck) @@ -118,9 +121,9 @@ final class MainCoordinator: NavigationCoordinatable { @objc func didChangeCurrentServerURL(_ notification: Notification) { - guard UserSession.current() != nil else { return } + guard userSession != nil else { return } - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } diff --git a/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift b/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift index 46595fef..2e93413d 100644 --- a/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift +++ b/Shared/Coordinators/MainCoordinator/tvOSMainCoordinator.swift @@ -18,7 +18,7 @@ import SwiftUI final class MainCoordinator: NavigationCoordinatable { - @Injected(LogManager.service) + @Injected(\.logService) private var logger var stack: Stinsen.NavigationStack @@ -38,7 +38,7 @@ final class MainCoordinator: NavigationCoordinatable { do { try await SwiftfinStore.setupDataStack() - if UserSession.current() != nil { + if Container.shared.currentUserSession() != nil { await MainActor.run { withAnimation(.linear(duration: 0.1)) { let _ = root(\.mainTab) diff --git a/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+Images.swift b/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+Images.swift index 16673362..80f958ad 100644 --- a/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+Images.swift +++ b/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+Images.swift @@ -98,7 +98,7 @@ extension BaseItemDto { } // TODO: client passing for widget/shared group views? - guard let client = UserSession.current()?.client else { return nil } + guard let client = Container.shared.currentUserSession()?.client else { return nil } let parameters = Paths.GetItemImageParameters( maxWidth: scaleWidth, diff --git a/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+VideoPlayerViewModel.swift b/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+VideoPlayerViewModel.swift index 4cc0fc3b..05d5b6b6 100644 --- a/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+VideoPlayerViewModel.swift +++ b/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto+VideoPlayerViewModel.swift @@ -21,7 +21,7 @@ extension BaseItemDto { let tempOverkillBitrate = 360_000_000 let profile = DeviceProfile.build(for: currentVideoPlayerType, maxBitrate: tempOverkillBitrate) - let userSession = UserSession.current()! + let userSession = Container.shared.currentUserSession()! let playbackInfo = PlaybackInfoDto(deviceProfile: profile) let playbackInfoParameters = Paths.GetPostedPlaybackInfoParameters( @@ -56,7 +56,7 @@ extension BaseItemDto { profile.directPlayProfiles = [DirectPlayProfile(type: .video)] } - let userSession = UserSession.current()! + let userSession = Container.shared.currentUserSession()! let playbackInfo = PlaybackInfoDto(deviceProfile: profile) let playbackInfoParameters = Paths.GetPostedPlaybackInfoParameters( diff --git a/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto.swift b/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto.swift index 3ecd5786..dd7472c4 100644 --- a/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto.swift +++ b/Shared/Extensions/JellyfinAPI/BaseItemDto/BaseItemDto.swift @@ -193,8 +193,7 @@ extension BaseItemDto { parameters: parameters ) - let imageURL = UserSession - .current()! + let imageURL = Container.shared.currentUserSession()! .client .fullURL(with: request) diff --git a/Shared/Extensions/JellyfinAPI/BaseItemPerson/BaseItemPerson+Poster.swift b/Shared/Extensions/JellyfinAPI/BaseItemPerson/BaseItemPerson+Poster.swift index b1c480a3..ae99cfc5 100644 --- a/Shared/Extensions/JellyfinAPI/BaseItemPerson/BaseItemPerson+Poster.swift +++ b/Shared/Extensions/JellyfinAPI/BaseItemPerson/BaseItemPerson+Poster.swift @@ -23,7 +23,7 @@ extension BaseItemPerson: Poster { func portraitImageSources(maxWidth: CGFloat? = nil) -> [ImageSource] { - guard let client = UserSession.current()?.client else { return [] } + guard let client = Container.shared.currentUserSession()?.client else { return [] } // TODO: figure out what to do about screen scaling with .main being deprecated // - maxWidth assume already scaled? diff --git a/Shared/Extensions/JellyfinAPI/MediaSourceInfo/MediaSourceInfo+ItemVideoPlayerViewModel.swift b/Shared/Extensions/JellyfinAPI/MediaSourceInfo/MediaSourceInfo+ItemVideoPlayerViewModel.swift index 5b0e6e82..add358c0 100644 --- a/Shared/Extensions/JellyfinAPI/MediaSourceInfo/MediaSourceInfo+ItemVideoPlayerViewModel.swift +++ b/Shared/Extensions/JellyfinAPI/MediaSourceInfo/MediaSourceInfo+ItemVideoPlayerViewModel.swift @@ -18,7 +18,7 @@ extension MediaSourceInfo { func videoPlayerViewModel(with item: BaseItemDto, playSessionID: String) throws -> VideoPlayerViewModel { - let userSession: UserSession! = UserSession.current() + let userSession: UserSession! = Container.shared.currentUserSession() let playbackURL: URL let streamType: StreamType @@ -68,7 +68,7 @@ extension MediaSourceInfo { func liveVideoPlayerViewModel(with item: BaseItemDto, playSessionID: String) throws -> VideoPlayerViewModel { - let userSession: UserSession! = UserSession.current() + let userSession: UserSession! = Container.shared.currentUserSession() let playbackURL: URL let streamType: StreamType diff --git a/Shared/Extensions/JellyfinAPI/MediaStream.swift b/Shared/Extensions/JellyfinAPI/MediaStream.swift index 7e5a366b..58311db5 100644 --- a/Shared/Extensions/JellyfinAPI/MediaStream.swift +++ b/Shared/Extensions/JellyfinAPI/MediaStream.swift @@ -16,7 +16,7 @@ extension MediaStream { static var none: MediaStream = .init(displayTitle: L10n.none, index: -1) var asPlaybackChild: VLCVideoPlayer.PlaybackChild? { - guard let deliveryURL, let client = UserSession.current()?.client else { return nil } + guard let deliveryURL, let client = Container.shared.currentUserSession()?.client else { return nil } let deliveryPath = deliveryURL.removingFirst(if: client.configuration.url.absoluteString.last == "/") diff --git a/Shared/ServerDiscovery/ServerDiscovery.swift b/Shared/ServerDiscovery/ServerDiscovery.swift index 08128fae..21b74518 100644 --- a/Shared/ServerDiscovery/ServerDiscovery.swift +++ b/Shared/ServerDiscovery/ServerDiscovery.swift @@ -13,7 +13,7 @@ import UDPBroadcast class ServerDiscovery { - @Injected(LogManager.service) + @Injected(\.logService) private var logger private var connection: UDPBroadcastConnection? diff --git a/Shared/Services/DownloadManager.swift b/Shared/Services/DownloadManager.swift index a38f3ab1..2bc7f36a 100644 --- a/Shared/Services/DownloadManager.swift +++ b/Shared/Services/DownloadManager.swift @@ -12,17 +12,12 @@ import Foundation import JellyfinAPI extension Container { - - static let downloadManager = Factory(scope: .singleton) { - let manager = DownloadManager() - manager.clearTmp() - return manager - } + var downloadManager: Factory { self { DownloadManager() }.shared } } class DownloadManager: ObservableObject { - @Injected(LogManager.service) + @Injected(\.logService) private var logger @Published diff --git a/Shared/Services/DownloadTask.swift b/Shared/Services/DownloadTask.swift index bcf04e72..47fae8c4 100644 --- a/Shared/Services/DownloadTask.swift +++ b/Shared/Services/DownloadTask.swift @@ -38,9 +38,9 @@ class DownloadTask: NSObject, ObservableObject { case ready } - @Injected(LogManager.service) + @Injected(\.logService) private var logger - @Injected(UserSession.current) + @Injected(\.currentUserSession) private var userSession: UserSession! @Published @@ -80,8 +80,7 @@ class DownloadTask: NSObject, ObservableObject { await MainActor.run { self.state = .error(error) - Container.downloadManager() - .remove(task: self) + Container.shared.downloadManager.reset() } return } @@ -284,8 +283,7 @@ extension DownloadTask: URLSessionDownloadDelegate { DispatchQueue.main.async { self.state = .error(error) - Container.downloadManager() - .remove(task: self) + Container.shared.downloadManager.reset() } } @@ -295,8 +293,7 @@ extension DownloadTask: URLSessionDownloadDelegate { DispatchQueue.main.async { self.state = .error(error) - Container.downloadManager() - .remove(task: self) + Container.shared.downloadManager.reset() } } } diff --git a/Shared/Services/Keychain.swift b/Shared/Services/Keychain.swift index ead6c4c4..be4f83e1 100644 --- a/Shared/Services/Keychain.swift +++ b/Shared/Services/Keychain.swift @@ -10,10 +10,8 @@ import Factory import Foundation import KeychainSwift -enum Keychain { +extension Container { // TODO: take a look at all security options - static let service = Factory(scope: .singleton) { - KeychainSwift() - } + var keychainService: Factory { self { KeychainSwift() }.singleton } } diff --git a/Shared/Services/LogManager.swift b/Shared/Services/LogManager.swift index e2d85a6b..f7b75567 100644 --- a/Shared/Services/LogManager.swift +++ b/Shared/Services/LogManager.swift @@ -13,22 +13,28 @@ import Logging import Pulse // TODO: cleanup +extension Container { + var logService: Factory { self { Logger(label: "org.jellyfin.swiftfin") }.singleton } -enum LogManager { - - static let service = Factory(scope: .singleton) { - Logger(label: "org.jellyfin.swiftfin") + var pulseNetworkLogger: Factory { + self { + let configuration = NetworkLogger.Configuration() + return NetworkLogger(configuration: configuration) + } + .singleton } +} +struct LogManager { // TODO: make rules for logging sessions and redacting - static let pulseNetworkLogger = Factory(scope: .singleton) { - var configuration = NetworkLogger.Configuration() +// static let pulseNetworkLogger = Factory(scope: .singleton) { +// var configuration = NetworkLogger.Configuration() - // TODO: this used to be necessary to stop the mass of image requests - // clogging the logs, however don't seem necessary anymore? - // Find out how to get images to be logged and have an option to - // turn it on, via SuperUser. + // TODO: this used to be necessary to stop the mass of image requests + // clogging the logs, however don't seem necessary anymore? + // Find out how to get images to be logged and have an option to + // turn it on, via SuperUser. // configuration.willHandleEvent = { event -> LoggerStore.Event? in // switch event { @@ -46,8 +52,8 @@ enum LogManager { // return event // } - return NetworkLogger(configuration: configuration) - } +// return NetworkLogger(configuration: configuration) +// } } struct SwiftfinConsoleLogger: LogHandler { @@ -79,7 +85,7 @@ struct SwiftfinConsoleLogger: LogHandler { struct SwiftfinCorestoreLogger: CoreStoreLogger { - @Injected(LogManager.service) + @Injected(\.logService) private var logger func log( diff --git a/Shared/Services/SwiftfinNotifications.swift b/Shared/Services/SwiftfinNotifications.swift index 8ea4837b..396b73d5 100644 --- a/Shared/Services/SwiftfinNotifications.swift +++ b/Shared/Services/SwiftfinNotifications.swift @@ -11,7 +11,7 @@ import Foundation class SwiftfinNotification { - @Injected(Notifications.service) + @Injected(\.notificationCenter) private var notificationService let name: Notification.Name @@ -37,9 +37,11 @@ class SwiftfinNotification { } } -enum Notifications { +extension Container { + var notificationCenter: Factory { self { NotificationCenter.default }.singleton } +} - static let service = Factory(scope: .singleton) { NotificationCenter.default } +enum Notifications { struct Key: Hashable { diff --git a/Shared/Services/UserSession.swift b/Shared/Services/UserSession.swift index c8477f49..e4f14ff0 100644 --- a/Shared/Services/UserSession.swift +++ b/Shared/Services/UserSession.swift @@ -31,7 +31,7 @@ final class UserSession { let client = JellyfinClient( configuration: .swiftfinConfiguration(url: server.currentURL), sessionConfiguration: .swiftfin, - sessionDelegate: URLSessionProxyDelegate(logger: LogManager.pulseNetworkLogger()), + sessionDelegate: URLSessionProxyDelegate(logger: Container.shared.pulseNetworkLogger()), accessToken: user.accessToken ) @@ -39,32 +39,27 @@ final class UserSession { } } -fileprivate extension Container.Scope { +extension Container { + var currentUserSession: Factory { + self { + if let lastUserID = Defaults[.lastSignedInUserID], + let user = try? SwiftfinStore.dataStack.fetchOne( + From().where(\.$id == lastUserID) + ) + { + guard let server = user.server, + let _ = SwiftfinStore.dataStack.fetchExisting(server) + else { + fatalError("No associated server for last user") + } -// static let userSessionScope = . -} - -extension UserSession { - - static let current = Factory(scope: .cached) { - - if let lastUserID = Defaults[.lastSignedInUserID], - let user = try? SwiftfinStore.dataStack.fetchOne( - From().where(\.$id == lastUserID) - ) - { - guard let server = user.server, - let existingServer = SwiftfinStore.dataStack.fetchExisting(server) - else { - fatalError("No associated server for last user") + return .init( + server: server.state, + user: user.state + ) } - return .init( - server: server.state, - user: user.state - ) - } - - return nil + return nil + }.cached } } diff --git a/Shared/SwiftfinStore/StoredValue/StoredValue.swift b/Shared/SwiftfinStore/StoredValue/StoredValue.swift index 6dd29cb8..364c8da0 100644 --- a/Shared/SwiftfinStore/StoredValue/StoredValue.swift +++ b/Shared/SwiftfinStore/StoredValue/StoredValue.swift @@ -8,6 +8,7 @@ import Combine import CoreStore +import Factory import Foundation import SwiftUI @@ -125,7 +126,7 @@ extension StoredValue { domain: key.domain ) } catch { - LogManager.service().error("Unable to store and create publisher for: \(key)") + Container.shared.logService().error("Unable to store and create publisher for: \(key)") return nil } diff --git a/Shared/SwiftfinStore/StoredValue/StoredValues+User.swift b/Shared/SwiftfinStore/StoredValue/StoredValues+User.swift index 5f440363..9a695fac 100644 --- a/Shared/SwiftfinStore/StoredValue/StoredValues+User.swift +++ b/Shared/SwiftfinStore/StoredValue/StoredValues+User.swift @@ -26,7 +26,7 @@ extension StoredValues.Keys { domain: String, default defaultValue: Value ) -> Key { - guard let name, let currentUser = UserSession.current()?.user else { + guard let name, let currentUser = Container.shared.currentUserSession()?.user else { return Key(always: defaultValue) } diff --git a/Shared/SwiftfinStore/SwiftfinStore+Mappings.swift b/Shared/SwiftfinStore/SwiftfinStore+Mappings.swift index e08275e7..14bc9c14 100644 --- a/Shared/SwiftfinStore/SwiftfinStore+Mappings.swift +++ b/Shared/SwiftfinStore/SwiftfinStore+Mappings.swift @@ -7,6 +7,7 @@ // import CoreStore +import Factory import Foundation import KeychainSwift @@ -33,7 +34,7 @@ extension SwiftfinStore.Mappings { // move access token to Keychain if let id = sourceObject["id"] as? String, let accessToken = sourceObject["accessToken"] as? String { - Keychain.service().set(accessToken, forKey: "\(id)-accessToken") + Container.shared.keychainService().set(accessToken, forKey: "\(id)-accessToken") } else { fatalError("wtf") } diff --git a/Shared/SwiftfinStore/SwiftfinStore+ServerState.swift b/Shared/SwiftfinStore/SwiftfinStore+ServerState.swift index 6c9cc90a..4467f35a 100644 --- a/Shared/SwiftfinStore/SwiftfinStore+ServerState.swift +++ b/Shared/SwiftfinStore/SwiftfinStore+ServerState.swift @@ -7,6 +7,7 @@ // import CoreStore +import Factory import Foundation import JellyfinAPI import Pulse @@ -41,7 +42,7 @@ extension SwiftfinStore.State { JellyfinClient( configuration: .swiftfinConfiguration(url: currentURL), sessionConfiguration: .swiftfin, - sessionDelegate: URLSessionProxyDelegate(logger: LogManager.pulseNetworkLogger()) + sessionDelegate: URLSessionProxyDelegate(logger: Container.shared.pulseNetworkLogger()) ) } } diff --git a/Shared/SwiftfinStore/SwiftfinStore.swift b/Shared/SwiftfinStore/SwiftfinStore.swift index 23a507a0..593b67de 100644 --- a/Shared/SwiftfinStore/SwiftfinStore.swift +++ b/Shared/SwiftfinStore/SwiftfinStore.swift @@ -20,6 +20,10 @@ typealias UserState = SwiftfinStore.State.User // MARK: Namespaces +extension Container { + var dataStore: Factory { self { SwiftfinStore.dataStack }.singleton } +} + enum SwiftfinStore { /// Namespace for V1 objects @@ -64,14 +68,10 @@ extension SwiftfinStore { case .success: continuation.resume() case let .failure(error): - LogManager.service().error("Failed creating datastack with: \(error.localizedDescription)") + Container.shared.logService().error("Failed creating datastack with: \(error.localizedDescription)") continuation.resume(throwing: JellyfinAPIError("Failed creating datastack with: \(error.localizedDescription)")) } } } } - - static let service = Factory(scope: .singleton) { - SwiftfinStore.dataStack - } } diff --git a/Shared/SwiftfinStore/SwiftinStore+UserState.swift b/Shared/SwiftfinStore/SwiftinStore+UserState.swift index 034225cc..5acbd1d4 100644 --- a/Shared/SwiftfinStore/SwiftinStore+UserState.swift +++ b/Shared/SwiftfinStore/SwiftinStore+UserState.swift @@ -7,6 +7,7 @@ // import CoreStore +import Factory import Foundation import JellyfinAPI import KeychainSwift @@ -42,7 +43,7 @@ extension UserState { var accessToken: String { get { - guard let accessToken = Keychain.service().get("\(id)-accessToken") else { + guard let accessToken = Container.shared.keychainService().get("\(id)-accessToken") else { assertionFailure("access token missing in keychain") return "" } @@ -50,7 +51,7 @@ extension UserState { return accessToken } nonmutating set { - Keychain.service().set(newValue, forKey: "\(id)-accessToken") + Container.shared.keychainService().set(newValue, forKey: "\(id)-accessToken") } } @@ -101,7 +102,7 @@ extension UserState { UserDefaults.userSuite(id: id).removeAll() - let keychain = Keychain.service() + let keychain = Container.shared.keychainService() keychain.delete("\(id)-pin") } @@ -129,7 +130,7 @@ extension UserState { let client = JellyfinClient( configuration: .swiftfinConfiguration(url: server.currentURL), sessionConfiguration: .swiftfin, - sessionDelegate: URLSessionProxyDelegate(logger: LogManager.pulseNetworkLogger()), + sessionDelegate: URLSessionProxyDelegate(logger: Container.shared.pulseNetworkLogger()), accessToken: accessToken ) diff --git a/Shared/ViewModels/ConnectToServerViewModel.swift b/Shared/ViewModels/ConnectToServerViewModel.swift index dd6639f6..9ca6fdd3 100644 --- a/Shared/ViewModels/ConnectToServerViewModel.swift +++ b/Shared/ViewModels/ConnectToServerViewModel.swift @@ -8,6 +8,7 @@ import Combine import CoreStore +import Factory import Foundation import Get import JellyfinAPI @@ -146,7 +147,7 @@ final class ConnectToServerViewModel: ViewModel, Eventful, Stateful { let client = JellyfinClient( configuration: .swiftfinConfiguration(url: url), - sessionDelegate: URLSessionProxyDelegate(logger: LogManager.pulseNetworkLogger()) + sessionDelegate: URLSessionProxyDelegate(logger: Container.shared.pulseNetworkLogger()) ) let response = try await client.send(Paths.getPublicSystemInfo) diff --git a/Shared/ViewModels/DownloadListViewModel.swift b/Shared/ViewModels/DownloadListViewModel.swift index 4312e90c..f68a85e1 100644 --- a/Shared/ViewModels/DownloadListViewModel.swift +++ b/Shared/ViewModels/DownloadListViewModel.swift @@ -11,7 +11,7 @@ import SwiftUI class DownloadListViewModel: ViewModel { - @Injected(Container.downloadManager) + @Injected(\.downloadManager) private var downloadManager @Published diff --git a/Shared/ViewModels/SettingsViewModel.swift b/Shared/ViewModels/SettingsViewModel.swift index 0423d4c2..4b053272 100644 --- a/Shared/ViewModels/SettingsViewModel.swift +++ b/Shared/ViewModels/SettingsViewModel.swift @@ -110,7 +110,7 @@ final class SettingsViewModel: ViewModel { func signOut() { Defaults[.lastSignedInUserID] = nil - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignOut].post() } } diff --git a/Shared/ViewModels/ViewModel.swift b/Shared/ViewModels/ViewModel.swift index d8df8da9..c00c3e45 100644 --- a/Shared/ViewModels/ViewModel.swift +++ b/Shared/ViewModels/ViewModel.swift @@ -13,17 +13,17 @@ import KeychainSwift class ViewModel: ObservableObject { - @Injected(SwiftfinStore.service) + @Injected(\.dataStore) var dataStack - @Injected(Keychain.service) + @Injected(\.keychainService) var keychain - @Injected(LogManager.service) + @Injected(\.logService) var logger /// The current *signed in* user session - @Injected(UserSession.current) + @Injected(\.currentUserSession) var userSession: UserSession! var cancellables = Set() diff --git a/Swiftfin tvOS/App/SwiftfinApp.swift b/Swiftfin tvOS/App/SwiftfinApp.swift index 321b27b6..bd26cb7f 100644 --- a/Swiftfin tvOS/App/SwiftfinApp.swift +++ b/Swiftfin tvOS/App/SwiftfinApp.swift @@ -67,7 +67,7 @@ struct SwiftfinApp: App { if Defaults[.signOutOnBackground], backgroundedInterval > Defaults[.backgroundSignOutInterval] { Defaults[.lastSignedInUserID] = nil - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignOut].post() } } diff --git a/Swiftfin tvOS/Views/ItemView/Components/PlayButton.swift b/Swiftfin tvOS/Views/ItemView/Components/PlayButton.swift index a82f598c..e727bfc7 100644 --- a/Swiftfin tvOS/Views/ItemView/Components/PlayButton.swift +++ b/Swiftfin tvOS/Views/ItemView/Components/PlayButton.swift @@ -13,7 +13,7 @@ extension ItemView { struct PlayButton: View { - @Injected(LogManager.service) + @Injected(\.logService) private var logger @EnvironmentObject diff --git a/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift b/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift index 976fd6ff..bee3ebfe 100644 --- a/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift +++ b/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift @@ -306,7 +306,7 @@ struct SelectUserView: View { self.isPresentingError = true case let .signedIn(user): Defaults[.lastSignedInUserID] = user.id - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } } diff --git a/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift b/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift index daf0098a..439771be 100644 --- a/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift +++ b/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift @@ -172,7 +172,7 @@ struct UserSignInView: View { router.dismissCoordinator() Defaults[.lastSignedInUserID] = user.id - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } } diff --git a/Swiftfin.xcodeproj/project.pbxproj b/Swiftfin.xcodeproj/project.pbxproj index 01263003..8bb3c27c 100644 --- a/Swiftfin.xcodeproj/project.pbxproj +++ b/Swiftfin.xcodeproj/project.pbxproj @@ -5172,7 +5172,7 @@ repositoryURL = "https://github.com/sindresorhus/Defaults"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 7.0.0; + minimumVersion = 8.0.0; }; }; E145EB492BE16849003BF6F3 /* XCRemoteSwiftPackageReference "keychain-swift" */ = { @@ -5228,7 +5228,7 @@ repositoryURL = "https://github.com/hmlongco/Factory"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 1.0.0; + minimumVersion = 2.0.0; }; }; E19DDEC52948EF9900954E10 /* XCRemoteSwiftPackageReference "swift-collections" */ = { diff --git a/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2df9d44c..38f911da 100644 --- a/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "323b2ad9aaa9c000faf264d68272f0e9fab1349d9f910a0b95ee6aea10460f31", + "originHash" : "651194fc1966b57201a0de2cba27dc40798bbdf515febdc83f00d634d916fea4", "pins" : [ { "identity" : "blurhashkit", @@ -51,8 +51,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/sindresorhus/Defaults", "state" : { - "revision" : "3efef5a28ebdbbe922d4a2049493733ed14475a6", - "version" : "7.3.1" + "revision" : "38925e3cfacf3fb89a81a35b1cd44fd5a5b7e0fa", + "version" : "8.2.0" } }, { @@ -69,8 +69,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/hmlongco/Factory", "state" : { - "revision" : "39ff6a675cd0272d833d184d35add0f8fddd63de", - "version" : "1.3.7" + "revision" : "587995f7d5cc667951d635fbf6b4252324ba0439", + "version" : "2.3.2" } }, { diff --git a/Swiftfin/App/SwiftfinApp.swift b/Swiftfin/App/SwiftfinApp.swift index d8f73eff..1e200a5d 100644 --- a/Swiftfin/App/SwiftfinApp.swift +++ b/Swiftfin/App/SwiftfinApp.swift @@ -90,7 +90,7 @@ struct SwiftfinApp: App { if backgroundedInterval > Defaults[.backgroundSignOutInterval] { Defaults[.lastSignedInUserID] = nil - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignOut].post() } } diff --git a/Swiftfin/Views/DownloadTaskView/DownloadTaskContentView.swift b/Swiftfin/Views/DownloadTaskView/DownloadTaskContentView.swift index 6ebca913..3f605e7e 100644 --- a/Swiftfin/Views/DownloadTaskView/DownloadTaskContentView.swift +++ b/Swiftfin/Views/DownloadTaskView/DownloadTaskContentView.swift @@ -18,7 +18,7 @@ extension DownloadTaskView { @Default(.accentColor) private var accentColor - @Injected(Container.downloadManager) + @Injected(\.downloadManager) private var downloadManager @EnvironmentObject diff --git a/Swiftfin/Views/ItemView/Components/ActionButtonHStack.swift b/Swiftfin/Views/ItemView/Components/ActionButtonHStack.swift index 845d7829..c4b4852d 100644 --- a/Swiftfin/Views/ItemView/Components/ActionButtonHStack.swift +++ b/Swiftfin/Views/ItemView/Components/ActionButtonHStack.swift @@ -18,7 +18,7 @@ extension ItemView { @Default(.accentColor) private var accentColor - @Injected(Container.downloadManager) + @Injected(\.downloadManager) private var downloadManager: DownloadManager @EnvironmentObject diff --git a/Swiftfin/Views/ItemView/Components/DownloadTaskButton.swift b/Swiftfin/Views/ItemView/Components/DownloadTaskButton.swift index 612c6f9f..5deb0609 100644 --- a/Swiftfin/Views/ItemView/Components/DownloadTaskButton.swift +++ b/Swiftfin/Views/ItemView/Components/DownloadTaskButton.swift @@ -45,7 +45,7 @@ struct DownloadTaskButton: View { extension DownloadTaskButton { init(item: BaseItemDto) { - let downloadManager = Container.downloadManager() + let downloadManager = Container.shared.downloadManager() self.downloadTask = downloadManager.task(for: item) ?? .init(item: item) self.onSelect = { _ in } diff --git a/Swiftfin/Views/ItemView/Components/PlayButton.swift b/Swiftfin/Views/ItemView/Components/PlayButton.swift index a86858b5..70c0dd05 100644 --- a/Swiftfin/Views/ItemView/Components/PlayButton.swift +++ b/Swiftfin/Views/ItemView/Components/PlayButton.swift @@ -19,7 +19,7 @@ extension ItemView { @Default(.accentColor) private var accentColor - @Injected(LogManager.service) + @Injected(\.logService) private var logger @EnvironmentObject diff --git a/Swiftfin/Views/SelectUserView/SelectUserView.swift b/Swiftfin/Views/SelectUserView/SelectUserView.swift index f0bebdac..41d3538b 100644 --- a/Swiftfin/Views/SelectUserView/SelectUserView.swift +++ b/Swiftfin/Views/SelectUserView/SelectUserView.swift @@ -562,7 +562,7 @@ struct SelectUserView: View { UIDevice.feedback(.success) Defaults[.lastSignedInUserID] = user.id - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } } diff --git a/Swiftfin/Views/SettingsView/SettingsView/Components/UserProfileRow.swift b/Swiftfin/Views/SettingsView/SettingsView/Components/UserProfileRow.swift index b6c8b536..2733a10b 100644 --- a/Swiftfin/Views/SettingsView/SettingsView/Components/UserProfileRow.swift +++ b/Swiftfin/Views/SettingsView/SettingsView/Components/UserProfileRow.swift @@ -13,7 +13,7 @@ extension SettingsView { struct UserProfileRow: View { - @Injected(UserSession.current) + @Injected(\.currentUserSession) private var userSession: UserSession! let action: () -> Void diff --git a/Swiftfin/Views/UserSignInView/UserSignInView.swift b/Swiftfin/Views/UserSignInView/UserSignInView.swift index d5d964be..144e50c0 100644 --- a/Swiftfin/Views/UserSignInView/UserSignInView.swift +++ b/Swiftfin/Views/UserSignInView/UserSignInView.swift @@ -74,7 +74,7 @@ struct UserSignInView: View { UIDevice.feedback(.success) Defaults[.lastSignedInUserID] = user.id - UserSession.current.reset() + Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } }