Skip to content

Commit e378d90

Browse files
authored
Fix some crashes (#1141)
* feat(Core Data): add fetchSlate to Source * fix(home): simplify relationship chain in RecentSavesView and RecommendationsView to prevent potential SwiftData related crashes * fix(home): let HomeActions fetch the slate from a Core Data background context instead of SlateDetailView to prevent some potential SwiftData related crashes * fix(home): update RecommendationsView, retrieve analyticsID directly from the recommendation instead of going back and forth from the related item * fix(home): update SlateDetailView, simplify relationship chain for domain
1 parent cce9819 commit e378d90

File tree

7 files changed

+29
-44
lines changed

7 files changed

+29
-44
lines changed

PocketKit/Sources/PocketKit/Home/Models/HomeActions.swift

+14-6
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,24 @@ extension HomeActions {
102102
}
103103
}
104104

105-
func trackSlateDetailImpression(info: SlateInfo) {
105+
func trackSlateDetailImpression(_ slateID: String) {
106106
Task(priority: .background) {
107+
let source = await Services.shared.source
108+
guard let slate = source.fetchSlate(slateID) else {
109+
return
110+
}
107111
let tracker = await Services.shared.tracker
112+
var sortIndex: Int?
113+
if let index = slate.sortIndex {
114+
sortIndex = Int(truncating: index)
115+
}
108116
tracker.track(
109117
event: Events.ExpandedSlate.slateExpanded(
110-
slateId: info.slateId,
111-
slateRequestId: info.slateRequestId,
112-
slateExperimentId: info.slateExperimentId,
113-
slateIndex: info.slateIndex,
114-
slateLineupId: info.slateLineupId
118+
slateId: slateID,
119+
slateRequestId: slate.requestID,
120+
slateExperimentId: slate.experimentID,
121+
slateIndex: sortIndex ?? 0,
122+
slateLineupId: slate.slateLineup?.remoteID ?? ""
115123
)
116124
)
117125
}

PocketKit/Sources/PocketKit/Home/Views/Detail views/SlateDetailView.swift

+2-35
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ struct SlateDetailView: View {
4444
}
4545
}
4646
.onAppear {
47-
guard let slateInfo = slateInfo(destination) else {
48-
return
49-
}
50-
homeActions.trackSlateDetailImpression(info: slateInfo)
47+
homeActions.trackSlateDetailImpression(destination.slateID)
5148
}
5249
.animation(.smooth, value: cards)
5350
.navigationTitle(destination.slateTitle ?? "")
@@ -66,7 +63,7 @@ private extension SlateDetailView {
6663
type: .slateDetail,
6764
index: $0.offset,
6865
shareURL: item.shareURL,
69-
domain: item.bestDomain,
66+
domain: item.domain,
7067
timeToRead: item.timeToRead,
7168
isSyndicated: item.isSyndicated,
7269
recommendationID: item.recommendation?.analyticsID,
@@ -83,23 +80,6 @@ private extension SlateDetailView {
8380
}
8481
}
8582

86-
/// Fetch analytics info for this slate
87-
/// - Parameter destination: slate destination of this slate
88-
/// - Returns: analytics info
89-
func slateInfo(_ destination: SlateDestination) -> SlateInfo? {
90-
guard let slate = fetchSlate(destination.slateID),
91-
let lineup = fetchSlateLineup() else {
92-
return nil
93-
}
94-
return SlateInfo(
95-
slateId: slate.remoteID,
96-
slateRequestId: slate.requestID,
97-
slateExperimentId: slate.experimentID,
98-
slateIndex: Int(slate.sortIndex ?? 0),
99-
slateLineupId: lineup.remoteID
100-
)
101-
}
102-
10383
/// Fetch an `Item` from the underlying `Recommendation`
10484
/// - Parameter recommendationID: `Recommendation` ID
10585
/// - Returns: the item, if it was found
@@ -112,19 +92,6 @@ private extension SlateDetailView {
11292
return result.first
11393
}
11494

115-
/// Fetch the current slate from SwiftData
116-
/// - Parameter remoteID: the remote id of this slate
117-
/// - Returns: the slate, if it was found
118-
@MainActor
119-
func fetchSlate(_ remoteID: String) -> Slate? {
120-
let predicate = #Predicate<Slate> { $0.remoteID == remoteID }
121-
var fetchDescriptor = FetchDescriptor(predicate: predicate)
122-
fetchDescriptor.fetchLimit = 1
123-
124-
let result = (try? modelContext.fetch(fetchDescriptor)) ?? []
125-
return result.first
126-
}
127-
12895
/// Fettch the current slate lineup
12996
/// - Returns: the slate lineup, if it was found
13097
func fetchSlateLineup() -> SlateLineup? {

PocketKit/Sources/PocketKit/Home/Views/Top level views/RecentSavesView.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private extension RecentSavesView {
7979
type: .recentSave,
8080
index: $0.offset,
8181
shareURL: item.shareURL,
82-
domain: item.bestDomain,
82+
domain: item.domain,
8383
timeToRead: item.timeToRead,
8484
isSyndicated: item.isSyndicated == true,
8585
recommendationID: item.recommendation?.analyticsID,

PocketKit/Sources/PocketKit/Home/Views/Top level views/RecommendationsView.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ private extension RecommendationsView {
139139
type: .recommendation,
140140
index: Int($0.sortIndex),
141141
shareURL: item.shareURL,
142-
domain: item.bestDomain,
142+
domain: item.domain,
143143
timeToRead: item.timeToRead,
144144
isSyndicated: item.isSyndicated,
145-
recommendationID: item.recommendation?.analyticsID,
145+
recommendationID: $0.analyticsID,
146146
bestTitle: item.bestTitle,
147147
slug: item.collectionSlug,
148148
excerpt: item.excerpt,

PocketKit/Sources/Sync/PocketSource.swift

+4
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,10 @@ extension PocketSource {
10361036
}
10371037
return updatedItem
10381038
}
1039+
1040+
public func fetchSlate( _ slateID: String) -> CDSlate? {
1041+
try? space.fetchSlate(byRemoteID: slateID)
1042+
}
10391043
}
10401044

10411045
// MARK: - Collections

PocketKit/Sources/Sync/Source.swift

+2
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ public protocol Source {
136136

137137
func fetchSavedItem(_ url: String) -> CDSavedItem?
138138

139+
func fetchSlate( _ slateID: String) -> CDSlate?
140+
139141
/// Get the count of unread saves
140142
/// - Returns: Int of unread saves
141143
func unreadSaves() throws -> Int

PocketKit/Tests/PocketKitTests/Support/MockSource.swift

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ import CoreData
88
import Combine
99

1010
class MockSource: Source {
11+
func fetchSlate(_ slateID: String) -> Sync.CDSlate? {
12+
nil
13+
}
14+
1115
func makeNotesController() -> NSFetchedResultsController<Sync.CDNote> {
1216
NSFetchedResultsController()
1317
}

0 commit comments

Comments
 (0)