From 0df68587efa9bddb3efa0837fd204908baa59d8e Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 14 Jun 2022 16:24:13 -0700 Subject: [PATCH 1/3] enable recently read sorting option on ios --- .../Sources/Models/LinkedItemSort.swift | 21 +++++++------------ .../UpdateArticleReadingProgress.swift | 7 +++++-- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift index 0c5efd1fa..fc7f188c2 100644 --- a/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift +++ b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift @@ -3,9 +3,8 @@ import Foundation public enum LinkedItemSort: String, CaseIterable { case newest case oldest - // case recentlyRead + case recentlyRead case recentlyPublished -// case relevance } public extension LinkedItemSort { @@ -15,12 +14,10 @@ public extension LinkedItemSort { return "Newest" case .oldest: return "Oldest" -// case .recentlyRead: -// return "Recently Read" + case .recentlyRead: + return "Recently Read" case .recentlyPublished: return "Recently Published" -// case .relevance: -// return "Relevance" } } @@ -30,23 +27,21 @@ public extension LinkedItemSort { return "sort:saved" case .oldest: return "sort:saved-ASC" -// case .recentlyRead: -// return "sort:updated" + case .recentlyRead: + return "sort:read" case .recentlyPublished: return "sort:published" -// case .relevance: -// return "relevance" } } var sortDescriptors: [NSSortDescriptor] { switch self { - case .newest /* , .relevance */: + case .newest: return [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false)] case .oldest: return [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: true)] -// case .recentlyRead: -// return [NSSortDescriptor(keyPath: \LinkedItem.updatedAt, ascending: false)] + case .recentlyRead: + return [NSSortDescriptor(keyPath: \LinkedItem.updatedAt, ascending: false)] case .recentlyPublished: return [NSSortDescriptor(keyPath: \LinkedItem.publishDate, ascending: false)] } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift index 90a7bc752..07e9f273f 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift @@ -27,7 +27,7 @@ extension DataService { func syncLinkReadingProgress(itemID: String, objectID: NSManagedObjectID, readingProgress: Double, anchorIndex: Int) { enum MutationResult { - case saved(readingProgress: Double) + case saved(updatedAt: Date?) case error(errorCode: Enums.SaveArticleReadingProgressErrorCode) } @@ -36,7 +36,7 @@ extension DataService { saveArticleReadingProgressError: .init { .error(errorCode: try $0.errorCodes().first ?? .badData) }, saveArticleReadingProgressSuccess: .init { .saved( - readingProgress: try $0.updatedArticle(selection: Selection.Article { try $0.readingProgressPercent() }) + updatedAt: try $0.updatedArticle(selection: Selection.Article { try $0.updatedAt().value }) ) } ) @@ -64,6 +64,9 @@ extension DataService { context.perform { guard let linkedItem = context.object(with: objectID) as? LinkedItem else { return } linkedItem.serverSyncStatus = Int64(syncStatus.rawValue) + if let mutationResult = data?.data, case let MutationResult.saved(updatedAt) = mutationResult { + linkedItem.updatedAt = updatedAt + } do { try context.save() From 8ddfc5c72a68b80d79edb77928759bcf6fddb0ce Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 14 Jun 2022 20:46:02 -0700 Subject: [PATCH 2/3] update swift graphql schema --- .../Services/DataService/GQLSchema.swift | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/apple/OmnivoreKit/Sources/Services/DataService/GQLSchema.swift b/apple/OmnivoreKit/Sources/Services/DataService/GQLSchema.swift index c9240f9b4..b14558c77 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/GQLSchema.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/GQLSchema.swift @@ -681,6 +681,7 @@ extension Objects { let pageType: [String: Enums.PageType] let postedByViewer: [String: Bool] let publishedAt: [String: DateTime] + let readAt: [String: DateTime] let readingProgressAnchorIndex: [String: Int] let readingProgressPercent: [String: Double] let savedAt: [String: DateTime] @@ -793,6 +794,10 @@ extension Objects.Article: Decodable { if let value = try container.decode(DateTime?.self, forKey: codingKey) { map.set(key: field, hash: alias, value: value as Any) } + case "readAt": + if let value = try container.decode(DateTime?.self, forKey: codingKey) { + map.set(key: field, hash: alias, value: value as Any) + } case "readingProgressAnchorIndex": if let value = try container.decode(Int?.self, forKey: codingKey) { map.set(key: field, hash: alias, value: value as Any) @@ -890,6 +895,7 @@ extension Objects.Article: Decodable { pageType = map["pageType"] postedByViewer = map["postedByViewer"] publishedAt = map["publishedAt"] + readAt = map["readAt"] readingProgressAnchorIndex = map["readingProgressAnchorIndex"] readingProgressPercent = map["readingProgressPercent"] savedAt = map["savedAt"] @@ -1219,6 +1225,21 @@ extension Fields where TypeLock == Objects.Article { } } + func readAt() throws -> DateTime? { + let field = GraphQLField.leaf( + name: "readAt", + arguments: [] + ) + select(field) + + switch response { + case let .decoding(data): + return data.readAt[field.alias!] + case .mocking: + return nil + } + } + func readingProgressAnchorIndex() throws -> Int { let field = GraphQLField.leaf( name: "readingProgressAnchorIndex", From 5ec248a86c582dacb1ee14c582511d9385cc4160 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 14 Jun 2022 21:05:45 -0700 Subject: [PATCH 3/3] use readAt property to sort recently read items --- .../CoreDataModel.xcdatamodel/contents | 5 +++-- .../OmnivoreKit/Sources/Models/DataModels/FeedItem.swift | 1 + apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift | 5 ++++- .../Mutations/UpdateArticleReadingProgress.swift | 8 ++++---- .../DataService/Queries/ArticleContentQuery.swift | 2 ++ .../Services/DataService/Queries/LibraryItemsQuery.swift | 2 ++ .../Services/InternalModels/InternalLinkedItem.swift | 4 ++++ 7 files changed, 20 insertions(+), 7 deletions(-) diff --git a/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents b/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents index 9c4257c46..30b35f970 100644 --- a/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents +++ b/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents @@ -1,5 +1,5 @@ - + @@ -37,6 +37,7 @@ + @@ -92,7 +93,7 @@ - + diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift index 1150a8632..09b375545 100644 --- a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift +++ b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift @@ -19,6 +19,7 @@ public struct JSONArticle: Decodable { public let createdAt: Date public let updatedAt: Date public let savedAt: Date + public let readAt: Date? public let image: String public let readingProgressPercent: Double public let readingProgressAnchorIndex: Int diff --git a/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift index fc7f188c2..7e060955b 100644 --- a/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift +++ b/apple/OmnivoreKit/Sources/Models/LinkedItemSort.swift @@ -41,7 +41,10 @@ public extension LinkedItemSort { case .oldest: return [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: true)] case .recentlyRead: - return [NSSortDescriptor(keyPath: \LinkedItem.updatedAt, ascending: false)] + return [ + NSSortDescriptor(keyPath: \LinkedItem.readAt, ascending: false), + NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false) + ] case .recentlyPublished: return [NSSortDescriptor(keyPath: \LinkedItem.publishDate, ascending: false)] } diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift index 07e9f273f..b6f218fd2 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/UpdateArticleReadingProgress.swift @@ -27,7 +27,7 @@ extension DataService { func syncLinkReadingProgress(itemID: String, objectID: NSManagedObjectID, readingProgress: Double, anchorIndex: Int) { enum MutationResult { - case saved(updatedAt: Date?) + case saved(readAt: Date?) case error(errorCode: Enums.SaveArticleReadingProgressErrorCode) } @@ -36,7 +36,7 @@ extension DataService { saveArticleReadingProgressError: .init { .error(errorCode: try $0.errorCodes().first ?? .badData) }, saveArticleReadingProgressSuccess: .init { .saved( - updatedAt: try $0.updatedArticle(selection: Selection.Article { try $0.updatedAt().value }) + readAt: try $0.updatedArticle(selection: Selection.Article { try $0.readAt()?.value }) ) } ) @@ -64,8 +64,8 @@ extension DataService { context.perform { guard let linkedItem = context.object(with: objectID) as? LinkedItem else { return } linkedItem.serverSyncStatus = Int64(syncStatus.rawValue) - if let mutationResult = data?.data, case let MutationResult.saved(updatedAt) = mutationResult { - linkedItem.updatedAt = updatedAt + if let mutationResult = data?.data, case let MutationResult.saved(readAt) = mutationResult { + linkedItem.readAt = readAt } do { diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift index 61267d8a0..842242e05 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/ArticleContentQuery.swift @@ -101,6 +101,7 @@ public extension DataService { title: try $0.title(), createdAt: try $0.createdAt().value ?? Date(), savedAt: try $0.savedAt().value ?? Date(), + readAt: try $0.readAt()?.value, updatedAt: try $0.updatedAt().value ?? Date(), state: try $0.state()?.rawValue ?? "SUCCEEDED", readingProgress: try $0.readingProgressPercent(), @@ -225,6 +226,7 @@ public extension DataService { linkedItem.author = item.author linkedItem.publishDate = item.publishDate linkedItem.slug = item.slug + linkedItem.readAt = item.readAt linkedItem.isArchived = item.isArchived linkedItem.contentReader = item.contentReader linkedItem.serverSyncStatus = Int64(ServerSyncStatus.isNSync.rawValue) diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift b/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift index ed81fe955..99c9fcece 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/Queries/LibraryItemsQuery.swift @@ -97,6 +97,7 @@ public extension DataService { title: try $0.title(), createdAt: try $0.createdAt().value ?? Date(), savedAt: try $0.savedAt().value ?? Date(), + readAt: try $0.readAt()?.value, updatedAt: try $0.updatedAt().value ?? Date(), state: try $0.state()?.rawValue ?? "SUCCEEDED", readingProgress: try $0.readingProgressPercent(), @@ -164,6 +165,7 @@ private let libraryArticleSelection = Selection.Article { title: try $0.title(), createdAt: try $0.createdAt().value ?? Date(), savedAt: try $0.savedAt().value ?? Date(), + readAt: try $0.readAt()?.value, updatedAt: try $0.updatedAt().value ?? Date(), state: try $0.state()?.rawValue ?? "SUCCEEDED", readingProgress: try $0.readingProgressPercent(), diff --git a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift index f5f089fd7..dde255691 100644 --- a/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift +++ b/apple/OmnivoreKit/Sources/Services/InternalModels/InternalLinkedItem.swift @@ -7,6 +7,7 @@ struct InternalLinkedItem { let title: String let createdAt: Date let savedAt: Date + let readAt: Date? let updatedAt: Date let state: String var readingProgress: Double @@ -42,6 +43,7 @@ struct InternalLinkedItem { linkedItem.createdAt = createdAt linkedItem.savedAt = savedAt linkedItem.updatedAt = updatedAt + linkedItem.readAt = readAt linkedItem.state = state linkedItem.readingProgress = readingProgress linkedItem.readingProgressAnchor = Int64(readingProgressAnchor) @@ -53,6 +55,7 @@ struct InternalLinkedItem { linkedItem.siteName = siteName linkedItem.author = author linkedItem.publishDate = publishDate + linkedItem.readAt = readAt linkedItem.slug = slug linkedItem.isArchived = isArchived linkedItem.contentReader = contentReader @@ -99,6 +102,7 @@ extension JSONArticle { title: title, createdAt: createdAt, savedAt: savedAt, + readAt: readAt, updatedAt: updatedAt, state: "SUCCEEDED", readingProgress: readingProgressPercent,