// // LocalData.swift // Tusker // // Created by Shadowfacts on 8/18/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation class LocalData { static let shared = LocalData() let defaults: UserDefaults private init() { if ProcessInfo.processInfo.environment.keys.contains("UI_TESTING") { defaults = UserDefaults(suiteName: "\(Bundle.main.bundleIdentifier!).uitesting")! if ProcessInfo.processInfo.environment.keys.contains("UI_TESTING_LOGIN") { accounts = [ UserAccountInfo( instanceURL: URL(string: "http://localhost:8080")!, clientID: "client_id", clientSecret: "client_secret", username: "admin", accessToken: "access_token") ] } } else { defaults = UserDefaults() } } private let accountsKey = "accounts" var accounts: [UserAccountInfo] { get { if let array = defaults.array(forKey: accountsKey) as? [[String: String]] { return array.compactMap { (info) in guard let instanceURL = info["instanceURL"], let url = URL(string: instanceURL), let id = info["clientID"], let secret = info["clientSecret"], let username = info["username"], let accessToken = info["accessToken"] else { return nil } return UserAccountInfo(instanceURL: url, clientID: id, clientSecret: secret, username: username, accessToken: accessToken) } } else { return [] } } set { let array = newValue.map { (info) in return [ "instanceURL": info.instanceURL.absoluteString, "clientID": info.clientID, "clientSecret": info.clientSecret, "username": info.username, "accessToken": info.accessToken ] } defaults.set(array, forKey: accountsKey) } } private let mostRecentAccountKey = "mostRecentAccount" var mostRecentAccount: String? { get { return defaults.string(forKey: mostRecentAccountKey) } set { defaults.set(newValue, forKey: mostRecentAccountKey) } } var onboardingComplete: Bool { return !accounts.isEmpty } func addAccount(instanceURL url: URL, clientID id: String, clientSecret secret: String, username: String, accessToken: String) -> UserAccountInfo { var accounts = self.accounts if let index = accounts.firstIndex(where: { $0.instanceURL == url && $0.username == username }) { accounts.remove(at: index) } let info = UserAccountInfo(instanceURL: url, clientID: id, clientSecret: secret, username: username, accessToken: accessToken) accounts.append(info) self.accounts = accounts return info } func removeAccount(_ info: UserAccountInfo) { } func getMostRecentAccount() -> UserAccountInfo? { if let accessToken = mostRecentAccount { return accounts.first { $0.accessToken == accessToken } } else { return nil } } } extension LocalData { struct UserAccountInfo: Equatable, Hashable { let instanceURL: URL let clientID: String let clientSecret: String let username: String let accessToken: String } } extension Notification.Name { static let userLoggedOut = Notification.Name("userLoggedOut") }