@@ -2,6 +2,7 @@ import 'package:bloc/bloc.dart';
2
2
import 'package:bloc_concurrency/bloc_concurrency.dart' ;
3
3
import 'package:equatable/equatable.dart' ;
4
4
import 'package:ht_headlines_repository/ht_headlines_repository.dart' ;
5
+ import 'package:ht_main/headlines-feed/models/headline_filter.dart' ;
5
6
6
7
part 'headlines_feed_event.dart' ;
7
8
part 'headlines_feed_state.dart' ;
@@ -16,7 +17,7 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
16
17
/// {@macro headlines_feed_bloc}
17
18
HeadlinesFeedBloc ({required HtHeadlinesRepository headlinesRepository})
18
19
: _headlinesRepository = headlinesRepository,
19
- super (HeadlinesFeedInitial ()) {
20
+ super (HeadlinesFeedLoading ()) {
20
21
on < HeadlinesFeedFetchRequested > (
21
22
_onHeadlinesFeedFetchRequested,
22
23
transformer: sequential (),
@@ -25,10 +26,51 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
25
26
_onHeadlinesFeedRefreshRequested,
26
27
transformer: restartable (),
27
28
);
29
+ on < HeadlinesFeedFilterChanged > (
30
+ _onHeadlinesFeedFilterChanged,
31
+ );
28
32
}
29
33
30
34
final HtHeadlinesRepository _headlinesRepository;
31
35
36
+ Future <void > _onHeadlinesFeedFilterChanged (
37
+ HeadlinesFeedFilterChanged event,
38
+ Emitter <HeadlinesFeedState > emit,
39
+ ) async {
40
+ emit (HeadlinesFeedLoading ());
41
+ try {
42
+ final response = await _headlinesRepository.getHeadlines (
43
+ limit: 20 ,
44
+ category: event.category, // Pass category directly
45
+ source: event.source, // Pass source directly
46
+ eventCountry: event.eventCountry, // Pass eventCountry directly
47
+ );
48
+ final newFilter = (state is HeadlinesFeedLoaded )
49
+ ? (state as HeadlinesFeedLoaded ).filter.copyWith (
50
+ category: event.category,
51
+ source: event.source,
52
+ eventCountry: event.eventCountry,
53
+ )
54
+ : HeadlineFilter (
55
+ category: event.category,
56
+ source: event.source,
57
+ eventCountry: event.eventCountry,
58
+ );
59
+ emit (
60
+ HeadlinesFeedLoaded (
61
+ headlines: response.items,
62
+ hasMore: response.hasMore,
63
+ cursor: response.cursor,
64
+ filter: newFilter,
65
+ ),
66
+ );
67
+ } on HeadlinesFetchException catch (e) {
68
+ emit (HeadlinesFeedError (message: e.message));
69
+ } catch (_) {
70
+ emit (const HeadlinesFeedError (message: 'An unexpected error occurred' ));
71
+ }
72
+ }
73
+
32
74
/// Handles [HeadlinesFeedFetchRequested] events.
33
75
///
34
76
/// Fetches headlines from the repository and emits
@@ -46,12 +88,16 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
46
88
final response = await _headlinesRepository.getHeadlines (
47
89
limit: 20 ,
48
90
startAfterId: currentState.cursor,
91
+ category: currentState.filter.category, // Use existing filter
92
+ source: currentState.filter.source, // Use existing filter
93
+ eventCountry: currentState.filter.eventCountry, // Use existing filter
49
94
);
50
95
emit (
51
96
HeadlinesFeedLoaded (
52
97
headlines: currentState.headlines + response.items,
53
98
hasMore: response.hasMore,
54
99
cursor: response.cursor,
100
+ filter: currentState.filter,
55
101
),
56
102
);
57
103
} on HeadlinesFetchException catch (e) {
@@ -62,12 +108,26 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
62
108
} else {
63
109
emit (HeadlinesFeedLoading ());
64
110
try {
65
- final response = await _headlinesRepository.getHeadlines (limit: 20 );
111
+ final response = await _headlinesRepository.getHeadlines (
112
+ limit: 20 ,
113
+ category: state is HeadlinesFeedLoaded
114
+ ? (state as HeadlinesFeedLoaded ).filter.category
115
+ : null ,
116
+ source: state is HeadlinesFeedLoaded
117
+ ? (state as HeadlinesFeedLoaded ).filter.source
118
+ : null ,
119
+ eventCountry: state is HeadlinesFeedLoaded
120
+ ? (state as HeadlinesFeedLoaded ).filter.eventCountry
121
+ : null ,
122
+ );
66
123
emit (
67
124
HeadlinesFeedLoaded (
68
125
headlines: response.items,
69
126
hasMore: response.hasMore,
70
127
cursor: response.cursor,
128
+ filter: state is HeadlinesFeedLoaded
129
+ ? (state as HeadlinesFeedLoaded ).filter
130
+ : const HeadlineFilter (),
71
131
),
72
132
);
73
133
} on HeadlinesFetchException catch (e) {
@@ -92,12 +152,26 @@ class HeadlinesFeedBloc extends Bloc<HeadlinesFeedEvent, HeadlinesFeedState> {
92
152
) async {
93
153
emit (HeadlinesFeedLoading ());
94
154
try {
95
- final response = await _headlinesRepository.getHeadlines (limit: 20 );
155
+ final response = await _headlinesRepository.getHeadlines (
156
+ limit: 20 ,
157
+ category: state is HeadlinesFeedLoaded
158
+ ? (state as HeadlinesFeedLoaded ).filter.category
159
+ : null ,
160
+ source: state is HeadlinesFeedLoaded
161
+ ? (state as HeadlinesFeedLoaded ).filter.source
162
+ : null ,
163
+ eventCountry: state is HeadlinesFeedLoaded
164
+ ? (state as HeadlinesFeedLoaded ).filter.eventCountry
165
+ : null ,
166
+ );
96
167
emit (
97
168
HeadlinesFeedLoaded (
98
169
headlines: response.items,
99
170
hasMore: response.hasMore,
100
171
cursor: response.cursor,
172
+ filter: state is HeadlinesFeedLoaded
173
+ ? (state as HeadlinesFeedLoaded ).filter
174
+ : const HeadlineFilter (),
101
175
),
102
176
);
103
177
} on HeadlinesFetchException catch (e) {
0 commit comments