@@ -76,21 +76,21 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
7676 required FeedCacheService feedCacheService,
7777 required ContentLimitationService contentLimitationService,
7878 UserContentPreferences ? initialUserContentPreferences,
79- }) : _headlinesRepository = headlinesRepository,
80- _feedDecoratorService = feedDecoratorService,
81- _engagementRepository = engagementRepository,
82- _adService = adService,
83- _appBloc = appBloc,
84- _inlineAdCacheService = inlineAdCacheService,
85- _feedCacheService = feedCacheService,
86- _contentLimitationService = contentLimitationService,
87- _logger = Logger ('HeadlinesFeedBloc' ),
88- super (
89- HeadlinesFeedState (
90- savedHeadlineFilters:
91- initialUserContentPreferences? .savedHeadlineFilters ?? const [],
92- ),
93- ) {
79+ }) : _headlinesRepository = headlinesRepository,
80+ _feedDecoratorService = feedDecoratorService,
81+ _engagementRepository = engagementRepository,
82+ _adService = adService,
83+ _appBloc = appBloc,
84+ _inlineAdCacheService = inlineAdCacheService,
85+ _feedCacheService = feedCacheService,
86+ _contentLimitationService = contentLimitationService,
87+ _logger = Logger ('HeadlinesFeedBloc' ),
88+ super (
89+ HeadlinesFeedState (
90+ savedHeadlineFilters:
91+ initialUserContentPreferences? .savedHeadlineFilters ?? const [],
92+ ),
93+ ) {
9494 // Subscribe to AppBloc to react to global state changes, primarily for
9595 // keeping the feed's list of saved filters synchronized with the global
9696 // app state.
@@ -224,11 +224,7 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
224224 // Group engagements by their entityId.
225225 return groupBy (response.items, (e) => e.entityId);
226226 } catch (e, s) {
227- _logger.severe (
228- 'Failed to fetch engagements for headlines.' ,
229- e,
230- s,
231- );
227+ _logger.severe ('Failed to fetch engagements for headlines.' , e, s);
232228 return {}; // Return empty map on failure to avoid breaking the feed.
233229 }
234230 }
@@ -311,9 +307,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
311307 final newEngagements = await _fetchEngagementsForHeadlines (
312308 headlineResponse.items.map ((h) => h.id).toList (),
313309 );
314- final updatedEngagementsMap =
315- Map < String , List < Engagement >>. from ( cachedFeed.engagementsMap)
316- ..addAll (newEngagements);
310+ final updatedEngagementsMap = Map < String , List < Engagement >>. from (
311+ cachedFeed.engagementsMap,
312+ ) ..addAll (newEngagements);
317313
318314 // For pagination, only inject ad placeholders.
319315 final newProcessedFeedItems = await _adService.injectFeedAdPlaceholders (
@@ -322,8 +318,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
322318 remoteConfig: remoteConfig,
323319 imageStyle: _appBloc.state.settings! .feedSettings.feedItemImageStyle,
324320 adThemeStyle: event.adThemeStyle,
325- processedContentItemCount:
326- cachedFeed.feedItems.whereType <Headline >().length,
321+ processedContentItemCount: cachedFeed.feedItems
322+ .whereType <Headline >()
323+ .length,
327324 );
328325
329326 _logger.fine (
@@ -370,8 +367,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
370367
371368 // Apply throttling logic.
372369 if (cachedFeed != null ) {
373- final timeSinceLastRefresh =
374- DateTime .now ().difference (cachedFeed.lastRefreshedAt);
370+ final timeSinceLastRefresh = DateTime .now ().difference (
371+ cachedFeed.lastRefreshedAt,
372+ );
375373 if (timeSinceLastRefresh < _refreshThrottleDuration) {
376374 _logger.info (
377375 'Refresh throttled for filter "$filterKey ". '
@@ -408,9 +406,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
408406 final newEngagements = await _fetchEngagementsForHeadlines (
409407 headlineResponse.items.map ((h) => h.id).toList (),
410408 );
411- final updatedEngagementsMap =
412- Map < String , List < Engagement >>. from ( cachedFeed? .engagementsMap ?? {})
413- ..addAll (newEngagements);
409+ final updatedEngagementsMap = Map < String , List < Engagement >>. from (
410+ cachedFeed? .engagementsMap ?? {},
411+ ) ..addAll (newEngagements);
414412
415413 _logger.info (
416414 'Refresh: Fetched ${headlineResponse .items .length } latest headlines '
@@ -423,8 +421,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
423421
424422 if (cachedHeadlines.isNotEmpty) {
425423 final firstCachedHeadlineId = cachedHeadlines.first.id;
426- final matchIndex =
427- newHeadlines.indexWhere ((h) => h.id == firstCachedHeadlineId);
424+ final matchIndex = newHeadlines.indexWhere (
425+ (h) => h.id == firstCachedHeadlineId,
426+ );
428427
429428 if (matchIndex != - 1 ) {
430429 // Prepend only the new items found before the match.
@@ -557,8 +556,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
557556 // Case 2: A filter was applied from the filter page ("Apply Only") or
558557 // by applying an un-pinned saved filter.
559558 // We check if the criteria match any *pinned* saved filter.
560- final matchingPinnedFilter =
561- state.savedHeadlineFilters.firstWhereOrNull ((savedFilter) {
559+ final matchingPinnedFilter = state.savedHeadlineFilters.firstWhereOrNull ((
560+ savedFilter,
561+ ) {
562562 // Only consider pinned filters for direct ID matching.
563563 if (! savedFilter.isPinned) return false ;
564564
@@ -999,14 +999,16 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
999999 }
10001000
10011001 final currentEngagements = state.engagementsMap[event.headlineId] ?? [];
1002- final userEngagement =
1003- currentEngagements.firstWhereOrNull ((e) => e.userId == userId);
1002+ final userEngagement = currentEngagements.firstWhereOrNull (
1003+ (e) => e.userId == userId,
1004+ );
10041005
10051006 try {
10061007 Engagement ? updatedEngagement;
10071008
10081009 if (userEngagement != null ) {
1009- final isTogglingOff = event.reactionType == null ||
1010+ final isTogglingOff =
1011+ event.reactionType == null ||
10101012 userEngagement.reaction? .reactionType == event.reactionType;
10111013
10121014 if (isTogglingOff) {
@@ -1053,16 +1055,16 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
10531055 }
10541056
10551057 // Optimistically update the state
1056- final newEngagementsForHeadline =
1057- List < Engagement >. from ( currentEngagements)
1058- ..removeWhere ((e) => e.userId == userId);
1058+ final newEngagementsForHeadline = List < Engagement >. from (
1059+ currentEngagements,
1060+ ) ..removeWhere ((e) => e.userId == userId);
10591061 if (updatedEngagement != null ) {
10601062 newEngagementsForHeadline.add (updatedEngagement);
10611063 }
10621064
1063- final newEngagementsMap =
1064- Map < String , List < Engagement >>. from ( state.engagementsMap)
1065- ..[event.headlineId] = newEngagementsForHeadline;
1065+ final newEngagementsMap = Map < String , List < Engagement >>. from (
1066+ state.engagementsMap,
1067+ ) ..[event.headlineId] = newEngagementsForHeadline;
10661068
10671069 // Update the cache with the new engagement map.
10681070 final filterKey = _generateFilterKey (state.activeFilterId! , state.filter);
@@ -1089,8 +1091,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
10891091 final language = _appBloc.state.settings? .language;
10901092 if (userId == null || language == null ) return ;
10911093
1092- final preCheckStatus =
1093- await _contentLimitationService.checkAction (ContentAction .postComment);
1094+ final preCheckStatus = await _contentLimitationService.checkAction (
1095+ ContentAction .postComment,
1096+ );
10941097 if (preCheckStatus != LimitationStatus .allowed) {
10951098 _logger.warning ('Comment limit reached for user $userId .' );
10961099 emit (
@@ -1104,30 +1107,31 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
11041107 }
11051108
11061109 final currentEngagements = state.engagementsMap[event.headlineId] ?? [];
1107- final userEngagement =
1108- currentEngagements.firstWhereOrNull ((e) => e.userId == userId);
1110+ final userEngagement = currentEngagements.firstWhereOrNull (
1111+ (e) => e.userId == userId,
1112+ );
11091113
11101114 final newComment = Comment (language: language, content: event.content);
1111- final engagementToUpsert = (userEngagement ??
1112- Engagement (
1113- id: const Uuid ().v4 (),
1114- userId: userId,
1115- entityId: event.headlineId,
1116- entityType: EngageableType .headline,
1117- createdAt: DateTime .now (),
1118- updatedAt: DateTime .now (),
1119- ))
1120- .copyWith (comment: ValueWrapper (newComment));
1115+ final engagementToUpsert =
1116+ (userEngagement ??
1117+ Engagement (
1118+ id: const Uuid ().v4 (),
1119+ userId: userId,
1120+ entityId: event.headlineId,
1121+ entityType: EngageableType .headline,
1122+ createdAt: DateTime .now (),
1123+ updatedAt: DateTime .now (),
1124+ ))
1125+ .copyWith (comment: ValueWrapper (newComment));
11211126
11221127 // Optimistic UI update
1123- final newEngagementsForHeadline =
1124- List <Engagement >.from (currentEngagements)
1125- ..removeWhere ((e) => e.userId == userId)
1126- ..add (engagementToUpsert);
1128+ final newEngagementsForHeadline = List <Engagement >.from (currentEngagements)
1129+ ..removeWhere ((e) => e.userId == userId)
1130+ ..add (engagementToUpsert);
11271131
1128- final newEngagementsMap =
1129- Map < String , List < Engagement >>. from ( state.engagementsMap)
1130- ..[event.headlineId] = newEngagementsForHeadline;
1132+ final newEngagementsMap = Map < String , List < Engagement >>. from (
1133+ state.engagementsMap,
1134+ ) ..[event.headlineId] = newEngagementsForHeadline;
11311135
11321136 final filterKey = _generateFilterKey (state.activeFilterId! , state.filter);
11331137 final cachedFeed = _feedCacheService.getFeed (filterKey);
@@ -1170,8 +1174,9 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
11701174 if (userId == null || language == null ) return ;
11711175
11721176 final currentEngagements = state.engagementsMap[event.headlineId] ?? [];
1173- final userEngagement =
1174- currentEngagements.firstWhereOrNull ((e) => e.userId == userId);
1177+ final userEngagement = currentEngagements.firstWhereOrNull (
1178+ (e) => e.userId == userId,
1179+ );
11751180
11761181 // If there's no existing engagement or no comment to update, do nothing.
11771182 if (userEngagement == null || userEngagement.comment == null ) {
@@ -1182,20 +1187,21 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
11821187 return ;
11831188 }
11841189
1185- final updatedComment =
1186- userEngagement.comment! .copyWith (content: event.content);
1187- final updatedEngagement =
1188- userEngagement.copyWith (comment: ValueWrapper (updatedComment));
1190+ final updatedComment = userEngagement.comment! .copyWith (
1191+ content: event.content,
1192+ );
1193+ final updatedEngagement = userEngagement.copyWith (
1194+ comment: ValueWrapper (updatedComment),
1195+ );
11891196
11901197 // Optimistic UI update
1191- final newEngagementsForHeadline =
1192- List <Engagement >.from (currentEngagements)
1193- ..removeWhere ((e) => e.userId == userId)
1194- ..add (updatedEngagement);
1195-
1196- final newEngagementsMap =
1197- Map <String , List <Engagement >>.from (state.engagementsMap)
1198- ..[event.headlineId] = newEngagementsForHeadline;
1198+ final newEngagementsForHeadline = List <Engagement >.from (currentEngagements)
1199+ ..removeWhere ((e) => e.userId == userId)
1200+ ..add (updatedEngagement);
1201+
1202+ final newEngagementsMap = Map <String , List <Engagement >>.from (
1203+ state.engagementsMap,
1204+ )..[event.headlineId] = newEngagementsForHeadline;
11991205
12001206 final filterKey = _generateFilterKey (state.activeFilterId! , state.filter);
12011207 final cachedFeed = _feedCacheService.getFeed (filterKey);
0 commit comments