120 lines
3.8 KiB
Swift
120 lines
3.8 KiB
Swift
//
|
|
// 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")
|
|
}
|