@@ -83,7 +83,8 @@ class FeedRepository {
8383 final posts = rows.map (ShadePost .fromMap).toList (growable: false );
8484 final hasMore = posts.length > limit;
8585 final visiblePosts = hasMore ? posts.sublist (0 , limit) : posts;
86- final hydratedPosts = await _attachPollMetadata (visiblePosts);
86+ final postsWithPolls = await _attachPollMetadata (visiblePosts);
87+ final hydratedPosts = await _attachReplyCounts (postsWithPolls);
8788
8889 return FeedBatch (
8990 items: hydratedPosts,
@@ -212,6 +213,58 @@ class FeedRepository {
212213 )
213214 .toList (growable: false );
214215 }
216+
217+ Future <List <ShadePost >> _attachReplyCounts (List <ShadePost > posts) async {
218+ if (posts.isEmpty) {
219+ return posts;
220+ }
221+
222+ final postIds = posts
223+ .map ((ShadePost post) => post.id)
224+ .where ((String id) => id.isNotEmpty)
225+ .toList (growable: false );
226+ if (postIds.isEmpty) {
227+ return posts;
228+ }
229+
230+ List <Map <String , dynamic >> replyRows;
231+ try {
232+ final result = await _client
233+ .from ('replies' )
234+ .select ('id, post_id' )
235+ .inFilter ('post_id' , postIds)
236+ .limit (5000 );
237+ replyRows = (result as List <dynamic >)
238+ .map (
239+ (dynamic item) => Map <String , dynamic >.from (item as Map ),
240+ )
241+ .toList (growable: false );
242+ } catch (_) {
243+ return posts;
244+ }
245+
246+ if (replyRows.isEmpty) {
247+ return posts;
248+ }
249+
250+ final countsByPostId = < String , int > {};
251+ for (final row in replyRows) {
252+ final postId = row['post_id' ] as String ? ;
253+ if (postId == null || postId.isEmpty) {
254+ continue ;
255+ }
256+ countsByPostId.update (postId, (int value) => value + 1 ,
257+ ifAbsent: () => 1 );
258+ }
259+
260+ return posts
261+ .map (
262+ (ShadePost post) => post.copyWith (
263+ replyCount: countsByPostId[post.id] ?? 0 ,
264+ ),
265+ )
266+ .toList (growable: false );
267+ }
215268}
216269
217270List <String > _asStringList (dynamic value) {
0 commit comments