import Combine import Foundation import Swinject protocol Provider { init(resolver: Resolver) var user: CurrentValueSubject { get } } class BaseProvider: Provider, Injectable { let user = CurrentValueSubject(nil) var lifetime = Set() @Injected() var authorizationManager: AuthorizationManager! required init(resolver: Resolver) { injectServices(resolver) subscribe() } private func subscribe() { authorizationManager.credentials .map { credentials -> User? in guard let credentials = credentials else { return nil } return User(id: credentials.id) } .sink { user in self.user.send(user) } .store(in: &lifetime) } func defaults(for file: String) -> RawJSON { guard let url = Foundation.Bundle.main.url(forResource: "json/defaults/\(file)", withExtension: "") else { return "" } return (try? String(contentsOf: url)) ?? "" } }