From 58dfddeeca238380ec7e589291abf0090fd032fe Mon Sep 17 00:00:00 2001 From: Steve Byatt <47413006+stevebyatt10@users.noreply.github.com> Date: Mon, 2 Sep 2024 17:00:25 +1000 Subject: [PATCH] Update lastSignedInUserID defaults to use new UserSignInState enum (#1209) * init * projecgt file * Update project.pbxproj --------- Co-authored-by: Ethan Pippin --- Shared/Objects/UserSignInState.swift | 33 +++++++++++++++++++ Shared/Services/SwiftfinDefaults.swift | 9 +++-- Shared/Services/UserSession.swift | 6 ++-- Shared/ViewModels/SettingsViewModel.swift | 2 +- Swiftfin tvOS/App/SwiftfinApp.swift | 2 +- .../Views/SelectUserView/SelectUserView.swift | 2 +- .../Views/UserSignInView/UserSignInView.swift | 2 +- Swiftfin.xcodeproj/project.pbxproj | 6 ++++ .../xcshareddata/swiftpm/Package.resolved | 2 +- .../App/SwiftfinApp+ValueObservation.swift | 2 +- Swiftfin/App/SwiftfinApp.swift | 4 +-- .../Views/SelectUserView/SelectUserView.swift | 2 +- .../Views/UserSignInView/UserSignInView.swift | 2 +- 13 files changed, 59 insertions(+), 15 deletions(-) create mode 100644 Shared/Objects/UserSignInState.swift diff --git a/Shared/Objects/UserSignInState.swift b/Shared/Objects/UserSignInState.swift new file mode 100644 index 00000000..8c2cdee4 --- /dev/null +++ b/Shared/Objects/UserSignInState.swift @@ -0,0 +1,33 @@ +// +// Swiftfin is subject to the terms of the Mozilla Public +// License, v2.0. If a copy of the MPL was not distributed with this +// file, you can obtain one at https://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2024 Jellyfin & Jellyfin Contributors +// + +import Defaults +import Foundation + +enum UserSignInState: RawRepresentable, Codable, Defaults.Serializable, Equatable, Hashable { + + case signedOut + case signedIn(userID: String) + + var rawValue: String { + switch self { + case .signedOut: + "" + case let .signedIn(userID): + userID + } + } + + init?(rawValue: String) { + if rawValue.isEmpty { + self = .signedOut + } else { + self = .signedIn(userID: rawValue) + } + } +} diff --git a/Shared/Services/SwiftfinDefaults.swift b/Shared/Services/SwiftfinDefaults.swift index 9c41b781..b23e151b 100644 --- a/Shared/Services/SwiftfinDefaults.swift +++ b/Shared/Services/SwiftfinDefaults.swift @@ -33,7 +33,12 @@ extension UserDefaults { // the Defaults value should always be in sync with the latest user and what // views properly expect. However, this feels like a hack and should be changed? static var currentUserSuite: UserDefaults { - userSuite(id: Defaults[.lastSignedInUserID] ?? "default") + switch Defaults[.lastSignedInUserID] { + case .signedOut: + return userSuite(id: "default") + case let .signedIn(userID): + return userSuite(id: userID) + } } static func userSuite(id: String) -> UserDefaults { @@ -82,7 +87,7 @@ extension Defaults.Keys { static let backgroundSignOutInterval: Key = AppKey("backgroundSignOutInterval", default: 3600) static let backgroundTimeStamp: Key = AppKey("backgroundTimeStamp", default: Date.now) - static let lastSignedInUserID: Key = AppKey("lastSignedInUserID") + static let lastSignedInUserID: Key = AppKey("lastSignedInUserID", default: .signedOut) static let selectUserDisplayType: Key = AppKey("selectUserDisplayType", default: .grid) static let selectUserServerSelection: Key = AppKey("selectUserServerSelection", default: .all) diff --git a/Shared/Services/UserSession.swift b/Shared/Services/UserSession.swift index d00fc321..952f7aee 100644 --- a/Shared/Services/UserSession.swift +++ b/Shared/Services/UserSession.swift @@ -42,13 +42,13 @@ final class UserSession { extension Container { var currentUserSession: Factory { self { - guard let lastUserID = Defaults[.lastSignedInUserID] else { return nil } + guard case let .signedIn(userId) = Defaults[.lastSignedInUserID] else { return nil } guard let user = try? SwiftfinStore.dataStack.fetchOne( - From().where(\.$id == lastUserID) + From().where(\.$id == userId) ) else { // had last user ID but no saved user - Defaults[.lastSignedInUserID] = nil + Defaults[.lastSignedInUserID] = .signedOut return nil } diff --git a/Shared/ViewModels/SettingsViewModel.swift b/Shared/ViewModels/SettingsViewModel.swift index 4b053272..96295ee3 100644 --- a/Shared/ViewModels/SettingsViewModel.swift +++ b/Shared/ViewModels/SettingsViewModel.swift @@ -109,7 +109,7 @@ final class SettingsViewModel: ViewModel { } func signOut() { - Defaults[.lastSignedInUserID] = nil + Defaults[.lastSignedInUserID] = .signedOut Container.shared.currentUserSession.reset() Notifications[.didSignOut].post() } diff --git a/Swiftfin tvOS/App/SwiftfinApp.swift b/Swiftfin tvOS/App/SwiftfinApp.swift index bd26cb7f..8462a325 100644 --- a/Swiftfin tvOS/App/SwiftfinApp.swift +++ b/Swiftfin tvOS/App/SwiftfinApp.swift @@ -66,7 +66,7 @@ struct SwiftfinApp: App { let backgroundedInterval = Date.now.timeIntervalSince(Defaults[.backgroundTimeStamp]) if Defaults[.signOutOnBackground], backgroundedInterval > Defaults[.backgroundSignOutInterval] { - Defaults[.lastSignedInUserID] = nil + Defaults[.lastSignedInUserID] = .signedOut Container.shared.currentUserSession.reset() Notifications[.didSignOut].post() } diff --git a/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift b/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift index 9e641004..869008ed 100644 --- a/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift +++ b/Swiftfin tvOS/Views/SelectUserView/SelectUserView.swift @@ -305,7 +305,7 @@ struct SelectUserView: View { self.error = eventError self.isPresentingError = true case let .signedIn(user): - Defaults[.lastSignedInUserID] = user.id + Defaults[.lastSignedInUserID] = .signedIn(userID: user.id) Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } diff --git a/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift b/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift index 439771be..05d44041 100644 --- a/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift +++ b/Swiftfin tvOS/Views/UserSignInView/UserSignInView.swift @@ -171,7 +171,7 @@ struct UserSignInView: View { case let .signedIn(user): router.dismissCoordinator() - Defaults[.lastSignedInUserID] = user.id + Defaults[.lastSignedInUserID] = .signedIn(userID: user.id) Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } diff --git a/Swiftfin.xcodeproj/project.pbxproj b/Swiftfin.xcodeproj/project.pbxproj index fab11f0b..1167cbb2 100644 --- a/Swiftfin.xcodeproj/project.pbxproj +++ b/Swiftfin.xcodeproj/project.pbxproj @@ -180,6 +180,8 @@ C46DD8EC2A8FB49A0046A504 /* LiveMainOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46DD8EB2A8FB49A0046A504 /* LiveMainOverlay.swift */; }; C46DD8EF2A8FB56E0046A504 /* LiveBottomBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C46DD8EE2A8FB56E0046A504 /* LiveBottomBarView.swift */; }; C4E5081B2703F82A0045C9AB /* MediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4E508172703E8190045C9AB /* MediaView.swift */; }; + DFB7C3DF2C7AA43A00CE7CDC /* UserSignInState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB7C3DE2C7AA42700CE7CDC /* UserSignInState.swift */; }; + DFB7C3E02C7AA43A00CE7CDC /* UserSignInState.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFB7C3DE2C7AA42700CE7CDC /* UserSignInState.swift */; }; E1002B642793CEE800E47059 /* ChapterInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1002B632793CEE700E47059 /* ChapterInfo.swift */; }; E1002B652793CEE800E47059 /* ChapterInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1002B632793CEE700E47059 /* ChapterInfo.swift */; }; E1002B682793CFBA00E47059 /* Algorithms in Frameworks */ = {isa = PBXBuildFile; productRef = E1002B672793CFBA00E47059 /* Algorithms */; }; @@ -1086,6 +1088,7 @@ C46DD8EB2A8FB49A0046A504 /* LiveMainOverlay.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveMainOverlay.swift; sourceTree = ""; }; C46DD8EE2A8FB56E0046A504 /* LiveBottomBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveBottomBarView.swift; sourceTree = ""; }; C4E508172703E8190045C9AB /* MediaView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaView.swift; sourceTree = ""; }; + DFB7C3DE2C7AA42700CE7CDC /* UserSignInState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSignInState.swift; sourceTree = ""; }; E1002B632793CEE700E47059 /* ChapterInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChapterInfo.swift; sourceTree = ""; }; E10231292BCF8A08009D71FC /* iOSLiveTVCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = iOSLiveTVCoordinator.swift; sourceTree = ""; }; E102312A2BCF8A08009D71FC /* tvOSLiveTVCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = tvOSLiveTVCoordinator.swift; sourceTree = ""; }; @@ -1853,6 +1856,7 @@ E129428F28F0BDC300796AC6 /* TimeStampType.swift */, E1C8CE7B28FF015000DF5D7B /* TrailingTimestampType.swift */, E1EA09682BED78BB004CDE76 /* UserAccessPolicy.swift */, + DFB7C3DE2C7AA42700CE7CDC /* UserSignInState.swift */, E1D8429229340B8300D1041A /* Utilities.swift */, E1BDF2E42951475300CC0294 /* VideoPlayerActionButton.swift */, E1F0204D26CCCA74001C1C3B /* VideoPlayerJumpLength.swift */, @@ -4189,6 +4193,7 @@ E1E6C44529AECCF20064123F /* PlayNextItemActionButton.swift in Sources */, 6264E88D273850380081A12A /* Strings.swift in Sources */, E1C926102887565C002A7A66 /* PlayButton.swift in Sources */, + DFB7C3E02C7AA43A00CE7CDC /* UserSignInState.swift in Sources */, E1575E67293E77B5001665B1 /* OverlayType.swift in Sources */, E1E9EFEA28C6B96500CC1F8B /* ServerButton.swift in Sources */, E1575E65293E77B5001665B1 /* VideoPlayerJumpLength.swift in Sources */, @@ -4671,6 +4676,7 @@ E1D3043528D1763100587289 /* SeeAllButton.swift in Sources */, 4E73E2A62C41CFD3002D2A78 /* PlaybackBitrateTestSize.swift in Sources */, E172D3B22BACA569007B4647 /* EpisodeContent.swift in Sources */, + DFB7C3DF2C7AA43A00CE7CDC /* UserSignInState.swift in Sources */, E13F05EC28BC9000003499D2 /* LibraryDisplayType.swift in Sources */, 4E16FD572C01A32700110147 /* LetterPickerOrientation.swift in Sources */, E1356E0329A730B200382563 /* SeparatorHStack.swift in Sources */, diff --git a/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 38f911da..a9143492 100644 --- a/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Swiftfin.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "651194fc1966b57201a0de2cba27dc40798bbdf515febdc83f00d634d916fea4", + "originHash" : "54fc43873cff9b3db2ad273a82066d201e4ea59316a81526b530004e4d98b974", "pins" : [ { "identity" : "blurhashkit", diff --git a/Swiftfin/App/SwiftfinApp+ValueObservation.swift b/Swiftfin/App/SwiftfinApp+ValueObservation.swift index 24c8cf53..03eeaf94 100644 --- a/Swiftfin/App/SwiftfinApp+ValueObservation.swift +++ b/Swiftfin/App/SwiftfinApp+ValueObservation.swift @@ -33,7 +33,7 @@ extension SwiftfinApp { lastSignInUserIDCancellable = Task { for await newValue in Defaults.updates(.lastSignedInUserID) { - if let _ = newValue { + if case .signedIn = newValue { setUserDefaultsObservation() } else { setAppDefaultsObservation() diff --git a/Swiftfin/App/SwiftfinApp.swift b/Swiftfin/App/SwiftfinApp.swift index b7b4e6b9..ca0ec2c8 100644 --- a/Swiftfin/App/SwiftfinApp.swift +++ b/Swiftfin/App/SwiftfinApp.swift @@ -67,7 +67,7 @@ struct SwiftfinApp: App { // don't keep last user id if Defaults[.signOutOnClose] { - Defaults[.lastSignedInUserID] = nil + Defaults[.lastSignedInUserID] = .signedOut } } @@ -107,7 +107,7 @@ struct SwiftfinApp: App { let backgroundedInterval = Date.now.timeIntervalSince(Defaults[.backgroundTimeStamp]) if Defaults[.signOutOnBackground], backgroundedInterval > Defaults[.backgroundSignOutInterval] { - Defaults[.lastSignedInUserID] = nil + Defaults[.lastSignedInUserID] = .signedOut Container.shared.currentUserSession.reset() Notifications[.didSignOut].post() } diff --git a/Swiftfin/Views/SelectUserView/SelectUserView.swift b/Swiftfin/Views/SelectUserView/SelectUserView.swift index 41d3538b..87b89fbb 100644 --- a/Swiftfin/Views/SelectUserView/SelectUserView.swift +++ b/Swiftfin/Views/SelectUserView/SelectUserView.swift @@ -561,7 +561,7 @@ struct SelectUserView: View { case let .signedIn(user): UIDevice.feedback(.success) - Defaults[.lastSignedInUserID] = user.id + Defaults[.lastSignedInUserID] = .signedIn(userID: user.id) Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() } diff --git a/Swiftfin/Views/UserSignInView/UserSignInView.swift b/Swiftfin/Views/UserSignInView/UserSignInView.swift index 144e50c0..6929c3f9 100644 --- a/Swiftfin/Views/UserSignInView/UserSignInView.swift +++ b/Swiftfin/Views/UserSignInView/UserSignInView.swift @@ -73,7 +73,7 @@ struct UserSignInView: View { case let .signedIn(user): UIDevice.feedback(.success) - Defaults[.lastSignedInUserID] = user.id + Defaults[.lastSignedInUserID] = .signedIn(userID: user.id) Container.shared.currentUserSession.reset() Notifications[.didSignIn].post() }