Save last used account instead of having to set default

This commit is contained in:
Arkadiusz Fal
2021-10-19 23:27:04 +02:00
parent 00d706766c
commit 2d075e7b3a
23 changed files with 169 additions and 273 deletions

View File

@@ -3,7 +3,7 @@ import Defaults
import Foundation
final class AccountsModel: ObservableObject {
@Published private(set) var account: Instance.Account!
@Published private(set) var current: Instance.Account!
@Published private(set) var invidious = InvidiousAPI()
@Published private(set) var piped = PipedAPI()
@@ -11,15 +11,23 @@ final class AccountsModel: ObservableObject {
private var cancellables = [AnyCancellable]()
var all: [Instance.Account] {
Defaults[.instances].map(\.anonymousAccount) + Defaults[.accounts]
Defaults[.accounts]
}
var lastUsed: Instance.Account? {
guard let id = Defaults[.lastAccountID] else {
return nil
}
return AccountsModel.find(id)
}
var isEmpty: Bool {
account.isNil
current.isNil
}
var signedIn: Bool {
!isEmpty && !account.anonymous
!isEmpty && !current.anonymous
}
init() {
@@ -32,12 +40,12 @@ final class AccountsModel: ObservableObject {
)
}
func setAccount(_ account: Instance.Account! = nil) {
guard account != self.account else {
func setCurrent(_ account: Instance.Account! = nil) {
guard account != current else {
return
}
self.account = account
current = account
guard !account.isNil else {
return
@@ -49,5 +57,25 @@ final class AccountsModel: ObservableObject {
case .piped:
piped.setAccount(account)
}
Defaults[.lastAccountID] = account.anonymous ? nil : account.id
Defaults[.lastInstanceID] = account.instanceID
}
static func find(_ id: Instance.Account.ID) -> Instance.Account? {
Defaults[.accounts].first { $0.id == id }
}
static func add(instance: Instance, name: String, sid: String) -> Instance.Account {
let account = Instance.Account(instanceID: instance.id, name: name, url: instance.url, sid: sid)
Defaults[.accounts].append(account)
return account
}
static func remove(_ account: Instance.Account) {
if let accountIndex = Defaults[.accounts].firstIndex(where: { $0.id == account.id }) {
Defaults[.accounts].remove(at: accountIndex)
}
}
}

View File

@@ -14,17 +14,17 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
static var bridge = AccountsBridge()
let id: String
let instanceID: UUID
let instanceID: String
var name: String?
let url: String
let sid: String
let anonymous: Bool
init(id: String? = nil, instanceID: UUID? = nil, name: String? = nil, url: String? = nil, sid: String? = nil, anonymous: Bool = false) {
init(id: String? = nil, instanceID: String? = nil, name: String? = nil, url: String? = nil, sid: String? = nil, anonymous: Bool = false) {
self.anonymous = anonymous
self.id = id ?? (anonymous ? "anonymous-\(instanceID!)" : UUID().uuidString)
self.instanceID = instanceID ?? UUID()
self.instanceID = instanceID ?? UUID().uuidString
self.name = name
self.url = url ?? ""
self.sid = sid ?? ""
@@ -62,7 +62,7 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
return [
"id": value.id,
"instanceID": value.instanceID.uuidString,
"instanceID": value.instanceID,
"name": value.name ?? "",
"url": value.url,
"sid": value.sid
@@ -80,10 +80,9 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
return nil
}
let instanceUUID = UUID(uuidString: instanceID)!
let name = object["name"] ?? ""
return Account(id: id, instanceID: instanceUUID, name: name, url: url, sid: sid)
return Account(id: id, instanceID: instanceID, name: name, url: url, sid: sid)
}
}
}
@@ -91,13 +90,13 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
static var bridge = InstancesBridge()
let app: App
let id: UUID
let id: String
let name: String
let url: String
init(app: App, id: UUID? = nil, name: String, url: String) {
init(app: App, id: String? = nil, name: String, url: String) {
self.app = app
self.id = id ?? UUID()
self.id = id ?? UUID().uuidString
self.name = name
self.url = url
}
@@ -133,7 +132,7 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
return [
"app": value.app.rawValue,
"id": value.id.uuidString,
"id": value.id,
"name": value.name,
"url": value.url
]
@@ -149,10 +148,9 @@ struct Instance: Defaults.Serializable, Hashable, Identifiable {
return nil
}
let uuid = UUID(uuidString: id)
let name = object["name"] ?? ""
return Instance(app: app, id: uuid, name: name, url: url)
return Instance(app: app, id: id, name: name, url: url)
}
}

View File

@@ -2,21 +2,19 @@ import Defaults
import Foundation
final class InstancesModel: ObservableObject {
@Published var defaultAccount: Instance.Account?
var all: [Instance] {
Defaults[.instances]
}
init() {
guard let id = Defaults[.defaultAccountID] else {
return
var lastUsed: Instance? {
guard let id = Defaults[.lastInstanceID] else {
return nil
}
defaultAccount = findAccount(id)
return InstancesModel.find(id)
}
func find(_ id: Instance.ID?) -> Instance? {
static func find(_ id: Instance.ID?) -> Instance? {
guard id != nil else {
return nil
}
@@ -24,48 +22,26 @@ final class InstancesModel: ObservableObject {
return Defaults[.instances].first { $0.id == id }
}
func accounts(_ id: Instance.ID?) -> [Instance.Account] {
static func accounts(_ id: Instance.ID?) -> [Instance.Account] {
Defaults[.accounts].filter { $0.instanceID == id }
}
func add(app: Instance.App, name: String, url: String) -> Instance {
let instance = Instance(app: app, name: name, url: url)
static func add(app: Instance.App, name: String, url: String) -> Instance {
let instance = Instance(app: app, id: UUID().uuidString, name: name, url: url)
Defaults[.instances].append(instance)
return instance
}
func remove(_ instance: Instance) {
let accounts = accounts(instance.id)
static func remove(_ instance: Instance) {
let accounts = InstancesModel.accounts(instance.id)
if let index = Defaults[.instances].firstIndex(where: { $0.id == instance.id }) {
Defaults[.instances].remove(at: index)
accounts.forEach { removeAccount($0) }
accounts.forEach { AccountsModel.remove($0) }
}
}
func findAccount(_ id: Instance.Account.ID) -> Instance.Account? {
Defaults[.accounts].first { $0.id == id }
}
func addAccount(instance: Instance, name: String, sid: String) -> Instance.Account {
let account = Instance.Account(instanceID: instance.id, name: name, url: instance.url, sid: sid)
Defaults[.accounts].append(account)
return account
}
func removeAccount(_ account: Instance.Account) {
if let accountIndex = Defaults[.accounts].firstIndex(where: { $0.id == account.id }) {
Defaults[.accounts].remove(at: accountIndex)
}
}
func setDefaultAccount(_ account: Instance.Account?) {
Defaults[.defaultAccountID] = account?.id
defaultAccount = account
}
func resetDefaultAccount() {
setDefaultAccount(nil)
static func setLastAccount(_ account: Instance.Account?) {
Defaults[.lastAccountID] = account?.id
}
}