mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
fix label view models
This commit is contained in:
parent
dc733c3ac2
commit
915bec37d2
3 changed files with 65 additions and 53 deletions
|
|
@ -4,7 +4,6 @@ import Services
|
|||
import SwiftUI
|
||||
import Views
|
||||
|
||||
// TODO: -labels fix file
|
||||
final class LabelsViewModel: ObservableObject {
|
||||
private var hasLoadedInitialLabels = false
|
||||
@Published var isLoading = false
|
||||
|
|
@ -46,25 +45,27 @@ final class LabelsViewModel: ObservableObject {
|
|||
.store(in: &subscriptions)
|
||||
}
|
||||
|
||||
func createLabel(dataService _: DataService, name _: String, color _: Color, description _: String?) {
|
||||
// isLoading = true
|
||||
//
|
||||
// dataService.createLabelPublisher(
|
||||
// name: name,
|
||||
// color: color.hex ?? "",
|
||||
// description: description
|
||||
// ).sink(
|
||||
// receiveCompletion: { [weak self] _ in
|
||||
// self?.isLoading = false
|
||||
// },
|
||||
// receiveValue: { [weak self] result in
|
||||
// self?.isLoading = false
|
||||
// self?.labels.insert(result, at: 0)
|
||||
// self?.unselectedLabels.insert(result, at: 0)
|
||||
// self?.showCreateEmailModal = false
|
||||
// }
|
||||
// )
|
||||
// .store(in: &subscriptions)
|
||||
func createLabel(dataService: DataService, name: String, color: Color, description: String?) {
|
||||
isLoading = true
|
||||
|
||||
dataService.createLabelPublisher(
|
||||
name: name,
|
||||
color: color.hex ?? "",
|
||||
description: description
|
||||
).sink(
|
||||
receiveCompletion: { [weak self] _ in
|
||||
self?.isLoading = false
|
||||
},
|
||||
receiveValue: { [weak self] labelID in
|
||||
if let label = dataService.viewContext.object(with: labelID) as? LinkedItemLabel {
|
||||
self?.labels.insert(label, at: 0)
|
||||
self?.unselectedLabels.insert(label, at: 0)
|
||||
}
|
||||
self?.isLoading = false
|
||||
self?.showCreateEmailModal = false
|
||||
}
|
||||
)
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
|
||||
func deleteLabel(dataService: DataService, labelID: String) {
|
||||
|
|
@ -83,27 +84,31 @@ final class LabelsViewModel: ObservableObject {
|
|||
}
|
||||
|
||||
func saveItemLabelChanges(
|
||||
itemID _: String,
|
||||
dataService _: DataService,
|
||||
onComplete _: @escaping ([LinkedItemLabel]) -> Void
|
||||
itemID: String,
|
||||
dataService: DataService,
|
||||
onComplete: @escaping ([LinkedItemLabel]) -> Void
|
||||
) {
|
||||
// isLoading = true
|
||||
// dataService.updateArticleLabelsPublisher(itemID: itemID, labelIDs: selectedLabels.map(\.id)).sink(
|
||||
// receiveCompletion: { [weak self] _ in
|
||||
// self?.isLoading = false
|
||||
// },
|
||||
// receiveValue: { onComplete($0) }
|
||||
// )
|
||||
// .store(in: &subscriptions)
|
||||
isLoading = true
|
||||
dataService.updateArticleLabelsPublisher(itemID: itemID, labelIDs: selectedLabels.map(\.unwrappedID)).sink(
|
||||
receiveCompletion: { [weak self] _ in
|
||||
self?.isLoading = false
|
||||
},
|
||||
receiveValue: { labelIDs in
|
||||
onComplete(
|
||||
labelIDs.compactMap { dataService.viewContext.object(with: $0) as? LinkedItemLabel }
|
||||
)
|
||||
}
|
||||
)
|
||||
.store(in: &subscriptions)
|
||||
}
|
||||
|
||||
func addLabelToItem(_: LinkedItemLabel) {
|
||||
// selectedLabels.insert(label, at: 0)
|
||||
// unselectedLabels.removeAll { $0.id == label.id }
|
||||
func addLabelToItem(_ label: LinkedItemLabel) {
|
||||
selectedLabels.insert(label, at: 0)
|
||||
unselectedLabels.removeAll { $0.id == label.id }
|
||||
}
|
||||
|
||||
func removeLabelFromItem(_: LinkedItemLabel) {
|
||||
// unselectedLabels.insert(label, at: 0)
|
||||
// selectedLabels.removeAll { $0.id == label.id }
|
||||
func removeLabelFromItem(_ label: LinkedItemLabel) {
|
||||
unselectedLabels.insert(label, at: 0)
|
||||
selectedLabels.removeAll { $0.id == label.id }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import Models
|
|||
import SwiftGraphQL
|
||||
|
||||
public extension DataService {
|
||||
// swiftlint:disable:next function_body_length
|
||||
func updateArticleLabelsPublisher(
|
||||
itemID: String,
|
||||
labelIDs: [String]
|
||||
|
|
@ -45,27 +46,31 @@ public extension DataService {
|
|||
|
||||
switch payload.data {
|
||||
case let .saved(labels):
|
||||
guard let linkedItem = LinkedItem.lookup(byID: itemID, inContext: self.backgroundContext) else {
|
||||
promise(.failure(.message(messageText: "failed to set labels")))
|
||||
return
|
||||
}
|
||||
|
||||
self.backgroundContext.perform {
|
||||
guard let linkedItem = LinkedItem.lookup(byID: itemID, inContext: self.backgroundContext) else {
|
||||
promise(.failure(.message(messageText: "failed to set labels")))
|
||||
return
|
||||
}
|
||||
|
||||
if let existingLabels = linkedItem.labels {
|
||||
linkedItem.removeFromLabels(existingLabels)
|
||||
}
|
||||
linkedItem.addToLabels(NSSet(array: labels))
|
||||
}
|
||||
for label in labels {
|
||||
if let labelObject = LinkedItemLabel.lookup(byID: label.id, inContext: self.backgroundContext) {
|
||||
linkedItem.addToLabels(labelObject)
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
try self.backgroundContext.save()
|
||||
logger.debug("Item labels updated")
|
||||
let labelObjects = linkedItem.labels.asArray(of: LinkedItemLabel.self)
|
||||
promise(.success(labelObjects.map(\.objectID)))
|
||||
} catch {
|
||||
self.backgroundContext.rollback()
|
||||
logger.debug("Failed to update item labels: \(error.localizedDescription)")
|
||||
promise(.failure(.message(messageText: "failed to set labels")))
|
||||
do {
|
||||
try self.backgroundContext.save()
|
||||
logger.debug("Item labels updated")
|
||||
let labelObjects = linkedItem.labels.asArray(of: LinkedItemLabel.self)
|
||||
promise(.success(labelObjects.map(\.objectID)))
|
||||
} catch {
|
||||
self.backgroundContext.rollback()
|
||||
logger.debug("Failed to update item labels: \(error.localizedDescription)")
|
||||
promise(.failure(.message(messageText: "failed to set labels")))
|
||||
}
|
||||
}
|
||||
case .error:
|
||||
promise(.failure(.message(messageText: "failed to set labels")))
|
||||
|
|
|
|||
|
|
@ -41,6 +41,8 @@ struct InternalLinkedItemLabel {
|
|||
}
|
||||
|
||||
extension LinkedItemLabel {
|
||||
public var unwrappedID: String { id ?? "" }
|
||||
|
||||
static func lookup(byID labelID: String, inContext context: NSManagedObjectContext) -> LinkedItemLabel? {
|
||||
let fetchRequest: NSFetchRequest<Models.LinkedItemLabel> = LinkedItemLabel.fetchRequest()
|
||||
fetchRequest.predicate = NSPredicate(
|
||||
|
|
|
|||
Loading…
Reference in a new issue