diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift index 3e73f2112..ac57b4290 100644 --- a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift +++ b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift @@ -66,6 +66,13 @@ public extension LinkedItem { var unwrappedSavedAt: Date { savedAt ?? Date() } var unwrappedCreatedAt: Date { createdAt ?? Date() } + var deepLink: URL? { + if let id = id { + return URL(string: "omnivore://read/\(id)") + } + return nil + } + var hasLabels: Bool { (labels?.count ?? 0) > 0 } diff --git a/apple/OmnivoreKit/Sources/Models/DeepLinkDecoder.swift b/apple/OmnivoreKit/Sources/Models/DeepLinkDecoder.swift index 9d3028358..d10e85b56 100644 --- a/apple/OmnivoreKit/Sources/Models/DeepLinkDecoder.swift +++ b/apple/OmnivoreKit/Sources/Models/DeepLinkDecoder.swift @@ -40,8 +40,7 @@ public extension DeepLink { case "saved-search": let named = url.path.replacingOccurrences(of: "/", with: "") return .savedSearch(named: named) - case "read": - case "shareExtensionRequestID": + case "read", "shareExtensionRequestID": let requestID = url.path.replacingOccurrences(of: "/", with: "") return .webAppLinkRequest(requestID: requestID) default: diff --git a/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift b/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift index cb6087871..f42d86e05 100644 --- a/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift +++ b/apple/OmnivoreKit/Sources/Views/FeedItem/LibraryItemCard.swift @@ -2,6 +2,17 @@ import Models import SwiftUI import Utils +public extension View { + func draggableItem(item: LinkedItem) -> some View { + if #available(iOS 16.0, *), let url = item.deepLink { + return AnyView(self.draggable(url) { + Label(item.unwrappedTitle, systemImage: "link") + }) + } + return AnyView(self) + } +} + public struct LibraryItemCard: View { let viewer: Viewer? let tapHandler: () -> Void @@ -27,6 +38,7 @@ public struct LibraryItemCard: View { } } .padding(.bottom, 8) + .draggableItem(item: item) } var isFullyRead: Bool {