metatext/ViewModels/Sources/ViewModels/ListsViewModel.swift

57 lines
1.7 KiB
Swift
Raw Normal View History

2020-08-29 03:50:58 +00:00
// Copyright © 2020 Metabolist. All rights reserved.
import Foundation
import Combine
2020-08-30 23:33:11 +00:00
import Mastodon
2020-08-31 18:57:02 +00:00
import ServiceLayer
2020-08-29 03:50:58 +00:00
2020-09-01 07:33:49 +00:00
public class ListsViewModel: ObservableObject {
@Published public private(set) var lists = [MastodonList]()
@Published public private(set) var creatingList = false
@Published public var alertItem: AlertItem?
2020-08-29 03:50:58 +00:00
private let identityService: IdentityService
private var cancellables = Set<AnyCancellable>()
init(identityService: IdentityService) {
self.identityService = identityService
identityService.listsObservation()
.map {
$0.compactMap {
guard case let .list(list) = $0 else { return nil }
return list
}
}
.assignErrorsToAlertItem(to: \.alertItem, on: self)
.assign(to: &$lists)
}
}
2020-09-01 07:33:49 +00:00
public extension ListsViewModel {
2020-08-29 03:50:58 +00:00
func refreshLists() {
identityService.refreshLists()
.assignErrorsToAlertItem(to: \.alertItem, on: self)
.sink { _ in }
.store(in: &cancellables)
}
func createList(title: String) {
identityService.createList(title: title)
.assignErrorsToAlertItem(to: \.alertItem, on: self)
.handleEvents(
receiveSubscription: { [weak self] _ in self?.creatingList = true },
receiveCompletion: { [weak self] _ in self?.creatingList = false })
.sink { _ in }
.store(in: &cancellables)
}
func delete(list: MastodonList) {
identityService.deleteList(id: list.id)
.assignErrorsToAlertItem(to: \.alertItem, on: self)
.sink { _ in }
.store(in: &cancellables)
}
}