Skip to content

Commit 145c417

Browse files
committed
feat(details): implement similar headlines bloc
- Fetches similar headlines - Filters out current headline - Handles loading, empty, and error states
1 parent 2133f3c commit 145c417

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import 'dart:async';
2+
3+
import 'package:bloc/bloc.dart';
4+
import 'package:equatable/equatable.dart';
5+
import 'package:ht_data_repository/ht_data_repository.dart';
6+
import 'package:ht_shared/ht_shared.dart' show Headline, HtHttpException;
7+
8+
part 'similar_headlines_event.dart';
9+
part 'similar_headlines_state.dart';
10+
11+
class SimilarHeadlinesBloc
12+
extends Bloc<SimilarHeadlinesEvent, SimilarHeadlinesState> {
13+
SimilarHeadlinesBloc({
14+
required HtDataRepository<Headline> headlinesRepository,
15+
}) : _headlinesRepository = headlinesRepository,
16+
super(SimilarHeadlinesInitial()) {
17+
on<FetchSimilarHeadlines>(_onFetchSimilarHeadlines);
18+
}
19+
20+
final HtDataRepository<Headline> _headlinesRepository;
21+
static const int _similarHeadlinesLimit = 5;
22+
23+
Future<void> _onFetchSimilarHeadlines(
24+
FetchSimilarHeadlines event,
25+
Emitter<SimilarHeadlinesState> emit,
26+
) async {
27+
emit(SimilarHeadlinesLoading());
28+
try {
29+
final currentHeadline = event.currentHeadline;
30+
if (currentHeadline.category == null ||
31+
currentHeadline.category!.id.isEmpty) {
32+
emit(SimilarHeadlinesEmpty());
33+
return;
34+
}
35+
36+
final queryParams = {
37+
'categories': currentHeadline.category!.id,
38+
};
39+
40+
final response = await _headlinesRepository.readAllByQuery(
41+
queryParams,
42+
limit: _similarHeadlinesLimit + 1, // Fetch one extra to check if current is there
43+
);
44+
45+
// Filter out the current headline from the results
46+
final similarHeadlines = response.items
47+
.where((headline) => headline.id != currentHeadline.id)
48+
.toList();
49+
50+
// Take only the required limit after filtering
51+
final finalSimilarHeadlines = similarHeadlines.take(_similarHeadlinesLimit).toList();
52+
53+
if (finalSimilarHeadlines.isEmpty) {
54+
emit(SimilarHeadlinesEmpty());
55+
} else {
56+
emit(SimilarHeadlinesLoaded(similarHeadlines: finalSimilarHeadlines));
57+
}
58+
} on HtHttpException catch (e) {
59+
emit(SimilarHeadlinesError(message: e.message));
60+
} catch (e) {
61+
emit(SimilarHeadlinesError(message: 'An unexpected error occurred: $e'));
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)