From 6433a6b2e5f4a0a16fb8f5d15ecc313d6ceb2574 Mon Sep 17 00:00:00 2001 From: Duong Thai Date: Thu, 14 Mar 2024 10:59:31 +0700 Subject: [PATCH] fix: refresh logic --- .../FetchedResults+toRSSItems.swift | 33 +++++++++++++ .../RSS/Sources/RSS/Views/RSSAddNewFeed.swift | 13 +---- .../Sources/RSS/Views/RSSFeedManager.swift | 1 - .../RSS/Sources/RSS/Views/RSSFeedView.swift | 9 ++-- .../Sources/RSS/Views/RSSTabContentView.swift | 47 +++++++++---------- 5 files changed, 60 insertions(+), 43 deletions(-) create mode 100644 Packages/RSS/Sources/RSS/Models/FetchedResults+toRSSItems.swift diff --git a/Packages/RSS/Sources/RSS/Models/FetchedResults+toRSSItems.swift b/Packages/RSS/Sources/RSS/Models/FetchedResults+toRSSItems.swift new file mode 100644 index 00000000..16db753d --- /dev/null +++ b/Packages/RSS/Sources/RSS/Models/FetchedResults+toRSSItems.swift @@ -0,0 +1,33 @@ +// +// FetchedResults+toRSSItems.swift +// +// +// Created by Duong Thai on 14/3/24. +// + +import SwiftUI + +extension FetchedResults { + func toRSSItems() -> [RSSItem] { self.flatMap { $0.toRSSItems() } } +} + +extension RSSFeed { + func toRSSItems() -> [RSSItem] { ((self.items?.allObjects as? [RSSItem]) ?? []) } +} + +extension Optional: Comparable { + public static func < (lhs: Optional, rhs: Optional) -> Bool { + if let lhs, let rhs { lhs < rhs } + else { false } + } + + public static func > (lhs: Optional, rhs: Optional) -> Bool { + if let lhs, let rhs { lhs > rhs } + else { false } + } + + public static func == (lhs: Optional, rhs: Optional) -> Bool { + if let lhs, let rhs { lhs == rhs } + else { false } + } +} diff --git a/Packages/RSS/Sources/RSS/Views/RSSAddNewFeed.swift b/Packages/RSS/Sources/RSS/Views/RSSAddNewFeed.swift index 20308a11..001d3bfa 100644 --- a/Packages/RSS/Sources/RSS/Views/RSSAddNewFeed.swift +++ b/Packages/RSS/Sources/RSS/Views/RSSAddNewFeed.swift @@ -153,18 +153,7 @@ public struct RSSAddNewFeed: View { RSSItemView(item) } } - .task { - items = ((feed.items?.allObjects as? [RSSItem]) ?? []) - .sorted { i0, i1 in - if let d0 = i0.date, - let d1 = i1.date - { - d0 > d1 - } else { - false - } - } - } + .task { items = feed.toRSSItems().sorted { $0.date > $1.date } } } } } diff --git a/Packages/RSS/Sources/RSS/Views/RSSFeedManager.swift b/Packages/RSS/Sources/RSS/Views/RSSFeedManager.swift index 0e7e8782..f5be2ead 100644 --- a/Packages/RSS/Sources/RSS/Views/RSSFeedManager.swift +++ b/Packages/RSS/Sources/RSS/Views/RSSFeedManager.swift @@ -53,7 +53,6 @@ public struct RSSFeedManager: View { ToolbarItem(placement: .topBarTrailing) { Button("rss.rssFeedManager.action.done") { dismiss() - moContext.refreshAllObjects() try? moContext.save() } } diff --git a/Packages/RSS/Sources/RSS/Views/RSSFeedView.swift b/Packages/RSS/Sources/RSS/Views/RSSFeedView.swift index a16b4aae..1124d90d 100644 --- a/Packages/RSS/Sources/RSS/Views/RSSFeedView.swift +++ b/Packages/RSS/Sources/RSS/Views/RSSFeedView.swift @@ -13,12 +13,9 @@ struct RSSFeedView: View { @Environment(Theme.self) private var theme private var items: ArraySlice { - ((feed.items?.allObjects as? [RSSItem]) ?? []) - .sorted { i0, i1 in - if let d0 = i0.date, - let d1 = i1.date - { d0 > d1 } else { false } - }.prefix(5) + feed.toRSSItems() + .sorted { $0.date > $1.date } + .prefix(5) } private var contentPadding: CGFloat { diff --git a/Packages/RSS/Sources/RSS/Views/RSSTabContentView.swift b/Packages/RSS/Sources/RSS/Views/RSSTabContentView.swift index dfac97e7..a3ed182c 100644 --- a/Packages/RSS/Sources/RSS/Views/RSSTabContentView.swift +++ b/Packages/RSS/Sources/RSS/Views/RSSTabContentView.swift @@ -15,9 +15,10 @@ import AppAccount import CoreData public struct RSSTabContentView: View { - @FetchRequest(sortDescriptors: [SortDescriptor(\.date, order: .reverse)], - predicate: NSPredicate(format: "feed.isShowing == TRUE")) - private var items: FetchedResults + @FetchRequest(sortDescriptors: [], + predicate: NSPredicate(format: "isShowing == true")) + private var feeds: FetchedResults + private var items: [RSSItem] { feeds.toRSSItems().sorted { $0.date > $1.date } } @Environment(\.managedObjectContext) private var moContext @State private var isLoading = true @@ -27,6 +28,25 @@ public struct RSSTabContentView: View { @Environment(Theme.self) private var theme @Environment(RouterPath.self) private var routerPath + public var body: some View { + NavigationStack { + Group { + if items.isEmpty { + makeContentUnavailableView() + } else { + makeItemList() + } + } + .navigationTitle("tab.rss") + .navigationBarTitleDisplayMode(.inline) + .listStyle(PlainListStyle()) + .toolbar { makeToolbarItems() } + .onReceive(NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)) { notification in + let userInfo = notification.userInfo ?? [:] + NSManagedObjectContext.mergeChanges(fromRemoteContextSave: userInfo, into: [moContext]) + } + } + } public init() {} @@ -87,25 +107,4 @@ public struct RSSTabContentView: View { } } - public var body: some View { - NavigationStack { - Group { - if items.isEmpty { - makeContentUnavailableView() - } else { - makeItemList() - } - } - .navigationTitle("tab.rss") - .navigationBarTitleDisplayMode(.inline) - .listStyle(PlainListStyle()) - .onReceive(NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)) { notification in - let userInfo = notification.userInfo ?? [:] - NSManagedObjectContext.mergeChanges(fromRemoteContextSave: userInfo, into: [moContext]) - } - .toolbar { - makeToolbarItems() - } - } - } }