Tusker/Tusker/LocalData.swift

120 lines
3.8 KiB
Swift
Raw Normal View History

2018-08-19 20:14:04 +00:00
//
// LocalData.swift
// Tusker
//
// Created by Shadowfacts on 8/18/18.
// Copyright © 2018 Shadowfacts. All rights reserved.
//
import Foundation
class LocalData {
static let shared = LocalData()
2019-12-30 20:59:49 +00:00
let defaults: UserDefaults
private init() {
if ProcessInfo.processInfo.environment.keys.contains("UI_TESTING") {
defaults = UserDefaults(suiteName: "\(Bundle.main.bundleIdentifier!).uitesting")!
2019-12-31 16:40:56 +00:00
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")
]
2019-12-31 16:40:56 +00:00
}
2019-12-30 20:59:49 +00:00
} else {
defaults = UserDefaults()
}
}
2018-08-19 20:14:04 +00:00
private let accountsKey = "accounts"
var accounts: [UserAccountInfo] {
2018-08-19 20:14:04 +00:00
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 []
}
2018-08-19 20:14:04 +00:00
}
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)
2018-08-19 20:14:04 +00:00
}
}
private let mostRecentAccountKey = "mostRecentAccount"
var mostRecentAccount: String? {
2018-08-19 20:14:04 +00:00
get {
return defaults.string(forKey: mostRecentAccountKey)
2018-08-19 20:14:04 +00:00
}
set {
defaults.set(newValue, forKey: mostRecentAccountKey)
2018-08-19 20:14:04 +00:00
}
}
var onboardingComplete: Bool {
return !accounts.isEmpty
2018-08-19 20:14:04 +00:00
}
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)
2018-08-19 20:14:04 +00:00
}
let info = UserAccountInfo(instanceURL: url, clientID: id, clientSecret: secret, username: username, accessToken: accessToken)
accounts.append(info)
self.accounts = accounts
return info
2018-08-19 20:14:04 +00:00
}
func removeAccount(_ info: UserAccountInfo) {
}
func getMostRecentAccount() -> UserAccountInfo? {
if let accessToken = mostRecentAccount {
return accounts.first { $0.accessToken == accessToken }
} else {
return nil
2018-08-19 20:14:04 +00:00
}
}
}
extension LocalData {
struct UserAccountInfo: Equatable, Hashable {
let instanceURL: URL
let clientID: String
let clientSecret: String
let username: String
let accessToken: String
}
2018-08-19 20:14:04 +00:00
}
2019-09-16 17:12:23 +00:00
extension Notification.Name {
static let userLoggedOut = Notification.Name("userLoggedOut")
}