Improve the Pinned label creation during swipe, add Unpin

This commit is contained in:
Jackson Harper 2023-07-07 15:07:13 -07:00
parent e2d4de1f41
commit b099d22115
3 changed files with 36 additions and 28 deletions

View file

@ -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: {

View file

@ -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)
}

View file

@ -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)