diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift index cb5df3594..dc6c0faf2 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewIOS.swift @@ -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: { diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index 20a88e5d2..ce95b8773 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -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) } diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift index 60268e8c4..3fc3e9314 100644 --- a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItemLabel.swift @@ -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 = 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)