mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
Improve the Pinned label creation during swipe, add Unpin
This commit is contained in:
parent
e2d4de1f41
commit
b099d22115
3 changed files with 36 additions and 28 deletions
|
|
@ -541,12 +541,17 @@ struct AnimatingCellHeight: AnimatableModifier {
|
|||
func swipeActionButton(action: SwipeAction, item: LinkedItem) -> AnyView {
|
||||
switch action {
|
||||
case .pin:
|
||||
let isPinned = item.labels?.allObjects.first { ($0 as? LinkedItemLabel)?.name == "Pinned" } != nil
|
||||
return AnyView(Button(action: {
|
||||
viewModel.pinItem(dataService: dataService, item: item)
|
||||
if isPinned {
|
||||
viewModel.unpinItem(dataService: dataService, item: item)
|
||||
} else {
|
||||
viewModel.pinItem(dataService: dataService, item: item)
|
||||
}
|
||||
}, label: {
|
||||
VStack {
|
||||
Image.pinRotated
|
||||
Text("Pin")
|
||||
Text(isPinned ? "Unpin" : "Pin")
|
||||
}
|
||||
}).tint(Color(hex: "#0A84FF")))
|
||||
case .archive:
|
||||
|
|
@ -555,7 +560,8 @@ struct AnimatingCellHeight: AnimatableModifier {
|
|||
viewModel.setLinkArchived(dataService: dataService, objectID: item.objectID, archived: !item.isArchived)
|
||||
}
|
||||
}, label: {
|
||||
Label(!item.isArchived ? "Archive" : "Unarchive", systemImage: !item.isArchived ? "archivebox" : "tray.and.arrow.down.fill")
|
||||
Label(!item.isArchived ? "Archive" : "Unarchive",
|
||||
systemImage: !item.isArchived ? "archivebox" : "tray.and.arrow.down.fill")
|
||||
})
|
||||
.tint(!item.isArchived ? .green : .indigo))
|
||||
case .delete:
|
||||
|
|
@ -571,7 +577,7 @@ struct AnimatingCellHeight: AnimatableModifier {
|
|||
case .moveToInbox:
|
||||
return AnyView(Button(
|
||||
action: {
|
||||
viewModel.addLabel(dataService: dataService, item: item, label: "Inbox")
|
||||
// viewModel.addLabel(dataService: dataService, item: item, label: "Inbox", color)
|
||||
|
||||
},
|
||||
label: {
|
||||
|
|
|
|||
|
|
@ -322,35 +322,37 @@ import Views
|
|||
dataService.removeLink(objectID: objectID)
|
||||
}
|
||||
|
||||
func addLabel(dataService: DataService, item: LinkedItem, label: String) {
|
||||
Task {
|
||||
if let label = LinkedItemLabel.named(label, inContext: dataService.viewContext) {
|
||||
// Label already exists, so just add it and refresh everything
|
||||
let existingLabels = item.labels?.allObjects.compactMap { ($0 as? LinkedItemLabel)?.unwrappedID } ?? []
|
||||
dataService.updateItemLabels(itemID: item.unwrappedID, labelIDs: existingLabels + [label.unwrappedID])
|
||||
func getOrCreateLabel(dataService: DataService, named: String, color: String) -> LinkedItemLabel? {
|
||||
if let label = LinkedItemLabel.named(named, inContext: dataService.viewContext) {
|
||||
return label
|
||||
}
|
||||
if let labelID = try? dataService.createLabel(name: named, color: color, description: "") {
|
||||
return dataService.viewContext.object(with: labelID) as? LinkedItemLabel
|
||||
// return LinkedItemLabel.lookup(byID: labelID, inContext: dataService.viewContext)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
item.update(inContext: dataService.viewContext)
|
||||
updateFeatureFilter(context: dataService.viewContext, filter: FeaturedItemFilter(rawValue: featureFilter))
|
||||
} else if let labelID = try? await dataService.createLabel(name: "Pinned", color: "#0A84FF", description: ""),
|
||||
let label = LinkedItemLabel.named(label, inContext: dataService.viewContext)
|
||||
{
|
||||
let existingLabels = item.labels?.allObjects.compactMap { ($0 as? LinkedItemLabel)?.unwrappedID } ?? []
|
||||
dataService.updateItemLabels(itemID: item.unwrappedID, labelIDs: existingLabels + [label.unwrappedID])
|
||||
func addLabel(dataService: DataService, item: LinkedItem, label: String, color: String) {
|
||||
if let label = getOrCreateLabel(dataService: dataService, named: "Pinned", color: color) {
|
||||
let existingLabels = item.labels?.allObjects.compactMap { ($0 as? LinkedItemLabel)?.unwrappedID } ?? []
|
||||
dataService.updateItemLabels(itemID: item.unwrappedID, labelIDs: existingLabels + [label.unwrappedID])
|
||||
|
||||
item.update(inContext: dataService.viewContext)
|
||||
updateFeatureFilter(context: dataService.viewContext, filter: FeaturedItemFilter(rawValue: featureFilter))
|
||||
}
|
||||
item.update(inContext: dataService.viewContext)
|
||||
updateFeatureFilter(context: dataService.viewContext, filter: FeaturedItemFilter(rawValue: featureFilter))
|
||||
}
|
||||
}
|
||||
|
||||
func removeLabel(dataService: DataService, item: LinkedItem, named: String) {
|
||||
let labelIds = item.labels?.filter { ($0 as? LinkedItemLabel)?.name != named }.compactMap { ($0 as? LinkedItemLabel)?.unwrappedID } ?? []
|
||||
let labelIds = item.labels?
|
||||
.filter { ($0 as? LinkedItemLabel)?.name != named }
|
||||
.compactMap { ($0 as? LinkedItemLabel)?.unwrappedID } ?? []
|
||||
dataService.updateItemLabels(itemID: item.unwrappedID, labelIDs: labelIds)
|
||||
item.update(inContext: dataService.viewContext)
|
||||
}
|
||||
|
||||
func pinItem(dataService: DataService, item: LinkedItem) {
|
||||
addLabel(dataService: dataService, item: item, label: "Pinned")
|
||||
addLabel(dataService: dataService, item: item, label: "Pinned", color: "#0A84FF")
|
||||
if featureFilter == FeaturedItemFilter.pinned.rawValue {
|
||||
updateFeatureFilter(context: dataService.viewContext, filter: .pinned)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,11 +56,11 @@ public struct InternalLinkedItemLabel: Encodable {
|
|||
}
|
||||
}
|
||||
|
||||
extension LinkedItemLabel {
|
||||
public var unwrappedID: String { id ?? "" }
|
||||
public var unwrappedName: String { name ?? "" }
|
||||
public extension LinkedItemLabel {
|
||||
var unwrappedID: String { id ?? "" }
|
||||
var unwrappedName: String { name ?? "" }
|
||||
|
||||
public static func named(_ name: String, inContext context: NSManagedObjectContext) -> LinkedItemLabel? {
|
||||
static func named(_ name: String, inContext context: NSManagedObjectContext) -> LinkedItemLabel? {
|
||||
let fetchRequest: NSFetchRequest<Models.LinkedItemLabel> = LinkedItemLabel.fetchRequest()
|
||||
fetchRequest.predicate = NSPredicate(
|
||||
format: "name == %@", name
|
||||
|
|
@ -90,7 +90,7 @@ extension LinkedItemLabel {
|
|||
return label
|
||||
}
|
||||
|
||||
func update(
|
||||
internal func update(
|
||||
inContext context: NSManagedObjectContext,
|
||||
newName: String? = nil,
|
||||
newColor: String? = nil,
|
||||
|
|
@ -121,7 +121,7 @@ extension LinkedItemLabel {
|
|||
}
|
||||
}
|
||||
|
||||
func remove(inContext context: NSManagedObjectContext) {
|
||||
internal func remove(inContext context: NSManagedObjectContext) {
|
||||
context.perform {
|
||||
context.delete(self)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue