Skip to content

Commit c94d7f0

Browse files
committed
fix: The HeadlinesFeedBloc has been updated to correctly format multiple selected category IDs and source IDs as comma-separated strings when making API requests. This aligns with the backend's expectation and should resolve the bug where new filter selections were overriding previous ones instead of being combined. Filtering by multiple categories and/or multiple sources simultaneously should now work as intended.
1 parent d8f3f56 commit c94d7f0

File tree

1 file changed

+48
-45
lines changed

1 file changed

+48
-45
lines changed

lib/headlines-feed/bloc/headlines_feed_bloc.dart

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -60,20 +60,22 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
6060
) async {
6161
emit(HeadlinesFeedLoading()); // Show loading for filter application
6262
try {
63-
final response = await _headlinesRepository.readAllByQuery({
64-
if (event.filter.categories?.isNotEmpty ?? false)
65-
'categories':
66-
event.filter.categories!
67-
.whereType<Category>()
68-
.map((c) => c.id)
69-
.toList(),
70-
if (event.filter.sources?.isNotEmpty ?? false)
71-
'sources':
72-
event.filter.sources!
73-
.whereType<Source>()
74-
.map((s) => s.id)
75-
.toList(),
76-
}, limit: _headlinesFetchLimit,);
63+
final queryParams = <String, dynamic>{};
64+
if (event.filter.categories?.isNotEmpty ?? false) {
65+
queryParams['categories'] = event.filter.categories!
66+
.map((c) => c.id)
67+
.join(',');
68+
}
69+
if (event.filter.sources?.isNotEmpty ?? false) {
70+
queryParams['sources'] = event.filter.sources!
71+
.map((s) => s.id)
72+
.join(',');
73+
}
74+
75+
final response = await _headlinesRepository.readAllByQuery(
76+
queryParams,
77+
limit: _headlinesFetchLimit,
78+
);
7779
emit(
7880
HeadlinesFeedLoaded(
7981
headlines: response.items,
@@ -133,8 +135,8 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
133135
Emitter<HeadlinesFeedState> emit,
134136
) async {
135137
// Determine current filter and cursor based on state
136-
var currentFilter = const HeadlineFilter();
137-
var currentCursor =
138+
HeadlineFilter currentFilter = const HeadlineFilter(); // Made type explicit
139+
String? currentCursor = // Made type explicit
138140
event.cursor; // Use event's cursor if provided (for pagination)
139141
var currentHeadlines = <Headline>[];
140142
var isPaginating = false;
@@ -169,21 +171,20 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
169171
}
170172

171173
try {
174+
final queryParams = <String, dynamic>{};
175+
if (currentFilter.categories?.isNotEmpty ?? false) {
176+
queryParams['categories'] = currentFilter.categories!
177+
.map((c) => c.id)
178+
.join(',');
179+
}
180+
if (currentFilter.sources?.isNotEmpty ?? false) {
181+
queryParams['sources'] = currentFilter.sources!
182+
.map((s) => s.id)
183+
.join(',');
184+
}
185+
172186
final response = await _headlinesRepository.readAllByQuery(
173-
{
174-
if (currentFilter.categories?.isNotEmpty ?? false)
175-
'categories':
176-
currentFilter.categories!
177-
.whereType<Category>()
178-
.map((c) => c.id)
179-
.toList(),
180-
if (currentFilter.sources?.isNotEmpty ?? false)
181-
'sources':
182-
currentFilter.sources!
183-
.whereType<Source>()
184-
.map((s) => s.id)
185-
.toList(),
186-
},
187+
queryParams,
187188
limit: _headlinesFetchLimit,
188189
startAfterId: currentCursor, // Use determined cursor
189190
);
@@ -216,27 +217,29 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
216217
emit(HeadlinesFeedLoading()); // Show loading indicator for refresh
217218

218219
// Determine the filter currently applied in the state
219-
var currentFilter = const HeadlineFilter();
220+
HeadlineFilter currentFilter = const HeadlineFilter(); // Made type explicit
220221
if (state is HeadlinesFeedLoaded) {
221222
currentFilter = (state as HeadlinesFeedLoaded).filter;
222223
}
223224

224225
try {
226+
final queryParams = <String, dynamic>{};
227+
if (currentFilter.categories?.isNotEmpty ?? false) {
228+
queryParams['categories'] = currentFilter.categories!
229+
.map((c) => c.id)
230+
.join(',');
231+
}
232+
if (currentFilter.sources?.isNotEmpty ?? false) {
233+
queryParams['sources'] = currentFilter.sources!
234+
.map((s) => s.id)
235+
.join(',');
236+
}
237+
225238
// Fetch the first page using the current filter
226-
final response = await _headlinesRepository.readAllByQuery({
227-
if (currentFilter.categories?.isNotEmpty ?? false)
228-
'categories':
229-
currentFilter.categories!
230-
.whereType<Category>()
231-
.map((c) => c.id)
232-
.toList(),
233-
if (currentFilter.sources?.isNotEmpty ?? false)
234-
'sources':
235-
currentFilter.sources!
236-
.whereType<Source>()
237-
.map((s) => s.id)
238-
.toList(),
239-
}, limit: _headlinesFetchLimit,);
239+
final response = await _headlinesRepository.readAllByQuery(
240+
queryParams,
241+
limit: _headlinesFetchLimit,
242+
);
240243
emit(
241244
HeadlinesFeedLoaded(
242245
headlines: response.items, // Replace headlines on refresh

0 commit comments

Comments
 (0)