@@ -19,6 +19,9 @@ struct SlateDetailView: View {
19
19
@Environment ( \. homeActions)
20
20
private var homeActions
21
21
22
+ @Environment ( \. modelContext)
23
+ private var modelContext
24
+
22
25
init ( destination: SlateDestination ) {
23
26
self . destination = destination
24
27
let slateID = destination. slateID
@@ -41,7 +44,7 @@ struct SlateDetailView: View {
41
44
}
42
45
}
43
46
. onAppear {
44
- guard let slateInfo = destination . slateInfo else {
47
+ guard let slateInfo = slateInfo ( destination ) else {
45
48
return
46
49
}
47
50
homeActions. trackSlateDetailImpression ( info: slateInfo)
@@ -56,7 +59,7 @@ struct SlateDetailView: View {
56
59
private extension SlateDetailView {
57
60
var proposedCards : [ HomeCardConfiguration ] {
58
61
recommendations. enumerated ( ) . compactMap {
59
- if let item = $0. element. item {
62
+ if let item = fetchItem ( $0. element. remoteID ) {
60
63
return HomeCardConfiguration (
61
64
givenURL: item. givenURL,
62
65
sharedWithYouUrlString: nil ,
@@ -79,6 +82,62 @@ private extension SlateDetailView {
79
82
return nil
80
83
}
81
84
}
85
+
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
+
103
+ /// Fetch an `Item` from the underlying `Recommendation`
104
+ /// - Parameter recommendationID: `Recommendation` ID
105
+ /// - Returns: the item, if it was found
106
+ func fetchItem( _ recommendationID: String ) -> Item ? {
107
+ let predicate = #Predicate< Item> { $0. recommendation? . remoteID == recommendationID }
108
+ var fetchDescriptor = FetchDescriptor ( predicate: predicate)
109
+ fetchDescriptor. fetchLimit = 1
110
+
111
+ let result = ( try ? modelContext. fetch ( fetchDescriptor) ) ?? [ ]
112
+ return result. first
113
+ }
114
+
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
+ func fetchSlate( _ remoteID: String ) -> Slate ? {
119
+ let predicate = #Predicate< Slate> { $0. remoteID == remoteID }
120
+ var fetchDescriptor = FetchDescriptor ( predicate: predicate)
121
+ fetchDescriptor. fetchLimit = 1
122
+
123
+ let result = ( try ? modelContext. fetch ( fetchDescriptor) ) ?? [ ]
124
+ return result. first
125
+ }
126
+
127
+ /// Fettch the current slate lineup
128
+ /// - Returns: the slate lineup, if it was found
129
+ func fetchSlateLineup( ) -> SlateLineup ? {
130
+ // there is only one lineup, so we don't need to filter this query
131
+ let predicate = #Predicate< SlateLineup> { _ in
132
+ return true
133
+ }
134
+ var fetchDescriptor = FetchDescriptor ( predicate: predicate)
135
+ fetchDescriptor. fetchLimit = 1
136
+
137
+ let result = ( try ? modelContext. fetch ( fetchDescriptor) ) ?? [ ]
138
+ return result. first
139
+ }
140
+
82
141
/// Determine the size of the current layout
83
142
/// **NOTE: turns out that, since this is a detail view, the environment value `layoutWidth`
84
143
/// cannot be used here since the GeometryReader of HomeView is not active
0 commit comments