diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift index 9acaa9390..1f965db92 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/Components/FeedCardNavigationLink.swift @@ -12,10 +12,8 @@ struct FeedCardNavigationLink: View { var body: some View { let destination = LinkItemDetailView( - viewModel: LinkItemDetailViewModel( - linkedItemObjectID: item.objectID, - dataService: dataService - ) + linkedItemObjectID: item.objectID, + isPDF: item.isPDF ) #if os(iOS) let modifiedDestination = destination @@ -66,10 +64,8 @@ struct GridCardNavigationLink: View { var body: some View { let destination = LinkItemDetailView( - viewModel: LinkItemDetailViewModel( - linkedItemObjectID: item.objectID, - dataService: dataService - ) + linkedItemObjectID: item.objectID, + isPDF: item.isPDF ) #if os(iOS) let modifiedDestination = destination diff --git a/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift b/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift index 029bf1c4a..05ab44cf7 100644 --- a/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift +++ b/apple/OmnivoreKit/Sources/App/Views/LinkItemDetailView.swift @@ -6,17 +6,20 @@ import Utils import Views @MainActor final class LinkItemDetailViewModel: ObservableObject { - let pdfItem: PDFItem? - let item: LinkedItem? + @Published var pdfItem: PDFItem? + @Published var item: LinkedItem? - init(linkedItemObjectID: NSManagedObjectID, dataService: DataService) { - if let linkedItem = dataService.viewContext.object(with: linkedItemObjectID) as? LinkedItem { - self.pdfItem = PDFItem.make(item: linkedItem) - self.item = linkedItem - } else { - self.pdfItem = nil - self.item = nil + func loadItem(linkedItemObjectID: NSManagedObjectID, dataService: DataService) async { + let item = await dataService.viewContext.perform { + dataService.viewContext.object(with: linkedItemObjectID) as? LinkedItem } + + if let item = item { + pdfItem = PDFItem.make(item: item) + self.item = item + } + + trackReadEvent() } func handleArchiveAction(dataService: DataService) { @@ -41,7 +44,7 @@ import Views ) } - func trackReadEvent() { + private func trackReadEvent() { guard let itemID = item?.unwrappedID ?? pdfItem?.itemID else { return } guard let slug = item?.unwrappedSlug ?? pdfItem?.slug else { return } guard let originalArticleURL = item?.unwrappedPageURLString ?? pdfItem?.originalArticleURL else { return } @@ -70,14 +73,18 @@ struct LinkItemDetailView: View { @Environment(\.presentationMode) var presentationMode: Binding static let navBarHeight = 50.0 - @ObservedObject private var viewModel: LinkItemDetailViewModel + let linkedItemObjectID: NSManagedObjectID + let isPDF: Bool + + @StateObject private var viewModel = LinkItemDetailViewModel() @State private var showFontSizePopover = false @State private var showTitleEdit = false @State private var navBarVisibilityRatio = 1.0 @State private var showDeleteConfirmation = false - init(viewModel: LinkItemDetailViewModel) { - self.viewModel = viewModel + init(linkedItemObjectID: NSManagedObjectID, isPDF: Bool) { + self.linkedItemObjectID = linkedItemObjectID + self.isPDF = isPDF } var toggleReadStatusToolbarItem: some View { @@ -106,25 +113,24 @@ struct LinkItemDetailView: View { @State var hideNavBar = false var body: some View { - if viewModel.pdfItem != nil { - fixedNavBarReader - #if os(iOS) - .navigationBarHidden(hideNavBar) - #endif - .task { - hideNavBar = true - viewModel.trackReadEvent() - } - } else if let item = viewModel.item { - WebReaderContainerView(item: item) - #if os(iOS) - .navigationBarHidden(hideNavBar) - #endif - .task { - hideNavBar = true - viewModel.trackReadEvent() + ZStack { + if isPDF { + fixedNavBarReader + .task { + await viewModel.loadItem(linkedItemObjectID: linkedItemObjectID, dataService: dataService) + hideNavBar = true + } + } else if let item = viewModel.item { + WebReaderContainerView(item: item) } } + .task { + await viewModel.loadItem(linkedItemObjectID: linkedItemObjectID, dataService: dataService) + hideNavBar = true + } + #if os(iOS) + .navigationBarHidden(hideNavBar) + #endif } var navBar: some View {