Kaynağa Gözat

Fix authorization logic

Ivan Valkou 5 yıl önce
ebeveyn
işleme
851be037f4

+ 3 - 1
FreeAPS/Sources/Modules/Login/LoginViewModel.swift

@@ -10,7 +10,9 @@ extension Login {
 
             $credentials
                 .compactMap { $0 }
-                .sink { self.provider.authorize(credentials: $0) }
+                .sink { [weak self] in
+                    self?.provider.authorize(credentials: $0)
+                }
                 .store(in: &lifetime)
         }
 

+ 3 - 0
FreeAPS/Sources/Modules/Main/MainDataFlow.swift

@@ -11,11 +11,14 @@ enum Main {
     }
 
     enum Scene {
+        case loading
         case authorized
         case onboarding
 
         var screen: Screen {
             switch self {
+            case .loading:
+                return .loading
             case .authorized:
                 return .authorizedRoot
             case .onboarding:

+ 1 - 6
FreeAPS/Sources/Modules/Main/MainViewModel.swift

@@ -9,12 +9,7 @@ extension Main {
         @Published var isModalPresented = false
         @Published var isAlertPresented = false
         @Published var alertMessage = ""
-        @Published private(set) var scene: Scene!
-
-        required init(provider: Provider, resolver: Resolver) {
-            super.init(provider: provider, resolver: resolver)
-            scene = isAuthotized ? .authorized : .onboarding
-        }
+        @Published private(set) var scene: Scene = .loading
 
         override func subscribe() {
             router.mainModalScreen

+ 6 - 0
FreeAPS/Sources/Modules/Settings/SettingsViewModel.swift

@@ -5,6 +5,7 @@ extension Settings {
         @Injected() private var settingsManager: SettingsManager!
         @Injected() private var broadcaster: Broadcaster!
         @Injected() private var fileManager: FileManager!
+        @Injected() private var authorizationManager: AuthorizationManager!
         @Published var closedLoop = false
 
         @Published var debugOptions = false
@@ -39,6 +40,11 @@ extension Settings {
 
             return items
         }
+
+        func logout() {
+            authorizationManager.logout()
+            showModal(for: nil)
+        }
     }
 }
 

+ 4 - 0
FreeAPS/Sources/Modules/Settings/View/SettingsRootView.swift

@@ -91,6 +91,10 @@ extension Settings {
                         .onTapGesture {
                             showShareSheet = true
                         }
+                    Text("Read disclaimer").chevronCell()
+                        .onTapGesture {
+                            viewModel.logout()
+                        }
                 }
             }
             .sheet(isPresented: $showShareSheet) {

+ 3 - 0
FreeAPS/Sources/Router/Screen.swift

@@ -2,6 +2,7 @@ import SwiftUI
 import Swinject
 
 enum Screen: Identifiable {
+    case loading
     case home
     case settings
     case onboarding
@@ -30,6 +31,8 @@ enum Screen: Identifiable {
 extension Screen {
     func view(resolver: Resolver) -> AnyView {
         switch self {
+        case .loading:
+            return ProgressView().asAny()
         case .home:
             return Home.Builder(resolver: resolver).buildView()
         case .settings:

+ 8 - 4
FreeAPS/Sources/Services/AuthorizationManager/AuthorizationManager.swift

@@ -3,17 +3,15 @@ import Combine
 import Swinject
 
 protocol AuthorizationManager {
-    var isAuthorized: Bool { get }
     var authorizationPublisher: AnyPublisher<Bool, Never> { get }
     func authorize(credentials: Credentials) -> AnyPublisher<Void, Never>
     func logout()
 }
 
 final class BaseAuthorizationManager: AuthorizationManager, Injectable {
-    private let isAuthorizedSubject = CurrentValueSubject<Bool, Never>(false)
+    private let isAuthorizedSubject = CurrentValueSubject<Bool?, Never>(nil)
 
-    var authorizationPublisher: AnyPublisher<Bool, Never> { isAuthorizedSubject.eraseToAnyPublisher() }
-    var isAuthorized: Bool { isAuthorizedSubject.value }
+    var authorizationPublisher: AnyPublisher<Bool, Never> { isAuthorizedSubject.ignoreNil().eraseToAnyPublisher() }
 
     let credentials = CurrentValueSubject<Credentials?, Never>(nil)
 
@@ -23,6 +21,12 @@ final class BaseAuthorizationManager: AuthorizationManager, Injectable {
 
     init(resolver: Resolver) {
         injectServices(resolver)
+        if let creds = keychain.getValue(Credentials.self, forKey: Login.Config.credentialsKey) {
+            credentials.send(creds)
+            isAuthorizedSubject.send(true)
+        } else {
+            isAuthorizedSubject.send(false)
+        }
     }
 
     func authorize(credentials: Credentials) -> AnyPublisher<Void, Never> {