1
0
mirror of https://github.com/yattee/yattee.git synced 2024-12-15 06:40:32 +05:30
yattee/Model/Accounts/AccountsModel.swift

102 lines
2.4 KiB
Swift
Raw Normal View History

2021-10-17 04:18:58 +05:30
import Combine
import Defaults
import Foundation
final class AccountsModel: ObservableObject {
2021-10-21 03:51:50 +05:30
@Published private(set) var current: Account!
2021-10-17 04:18:58 +05:30
2021-10-21 03:51:50 +05:30
@Published private var invidious = InvidiousAPI()
@Published private var piped = PipedAPI()
2021-10-17 04:18:58 +05:30
@Published var publicAccount: Account?
2021-10-17 04:18:58 +05:30
private var cancellables = [AnyCancellable]()
2021-10-21 03:51:50 +05:30
var all: [Account] {
Defaults[.accounts]
}
2021-10-21 03:51:50 +05:30
var lastUsed: Account? {
guard let id = Defaults[.lastAccountID] else {
return nil
}
return AccountsModel.find(id)
2021-10-17 04:18:58 +05:30
}
2021-12-25 00:50:05 +05:30
var any: Account? {
lastUsed ?? all.randomElement()
}
2021-10-21 03:51:50 +05:30
var app: VideosApp {
2021-11-13 02:16:15 +05:30
current?.instance?.app ?? .invidious
2021-10-21 03:51:50 +05:30
}
var api: VideosAPI {
app == .piped ? piped : invidious
}
2021-10-18 04:36:00 +05:30
var isEmpty: Bool {
current.isNil
2021-10-18 04:36:00 +05:30
}
2021-10-17 04:18:58 +05:30
var signedIn: Bool {
!isEmpty && !current.anonymous && api.signedIn
2021-10-17 04:18:58 +05:30
}
init() {
cancellables.append(
invidious.objectWillChange.sink { [weak self] _ in self?.objectWillChange.send() }
)
cancellables.append(
piped.objectWillChange.sink { [weak self] _ in self?.objectWillChange.send() }
)
}
2021-10-21 03:51:50 +05:30
func setCurrent(_ account: Account! = nil) {
guard account != current else {
2021-10-17 04:18:58 +05:30
return
}
current = account
2021-10-17 04:18:58 +05:30
2021-10-18 04:36:00 +05:30
guard !account.isNil else {
return
}
2021-10-17 04:18:58 +05:30
switch account.instance.app {
case .invidious:
invidious.setAccount(account)
case .piped:
piped.setAccount(account)
}
Defaults[.lastAccountID] = account.anonymous ? (account.isPublic ? "public" : nil) : account.id
Defaults[.lastInstanceID] = account.instanceID
}
2021-10-21 03:51:50 +05:30
static func find(_ id: Account.ID) -> Account? {
Defaults[.accounts].first { $0.id == id }
}
static func add(instance: Instance, name: String, username: String, password: String? = nil) -> Account {
let account = Account(
instanceID: instance.id,
name: name,
url: instance.apiURL,
username: username,
password: password
)
Defaults[.accounts].append(account)
return account
}
2021-10-21 03:51:50 +05:30
static func remove(_ account: Account) {
if let accountIndex = Defaults[.accounts].firstIndex(where: { $0.id == account.id }) {
Defaults[.accounts].remove(at: accountIndex)
}
2021-10-17 04:18:58 +05:30
}
}