@@ -4,6 +4,7 @@ import 'package:bloc/bloc.dart';
44import 'package:core/core.dart' ;
55import 'package:data_repository/data_repository.dart' ;
66import 'package:equatable/equatable.dart' ;
7+ import 'package:flutter_news_app_mobile_client_full_source_code/app/bloc/app_bloc.dart' ; // Import AppBloc
78
89part 'sources_filter_event.dart' ;
910part 'sources_filter_state.dart' ;
@@ -12,20 +13,30 @@ class SourcesFilterBloc extends Bloc<SourcesFilterEvent, SourcesFilterState> {
1213 SourcesFilterBloc ({
1314 required DataRepository <Source > sourcesRepository,
1415 required DataRepository <Country > countriesRepository,
16+ required DataRepository <UserContentPreferences >
17+ userContentPreferencesRepository,
18+ required AppBloc appBloc,
1519 }) : _sourcesRepository = sourcesRepository,
1620 _countriesRepository = countriesRepository,
21+ _userContentPreferencesRepository = userContentPreferencesRepository,
22+ _appBloc = appBloc,
1723 super (const SourcesFilterState ()) {
1824 on < LoadSourceFilterData > (_onLoadSourceFilterData);
1925 on < CountryCapsuleToggled > (_onCountryCapsuleToggled);
2026 on < AllSourceTypesCapsuleToggled > (_onAllSourceTypesCapsuleToggled);
2127 on < SourceTypeCapsuleToggled > (_onSourceTypeCapsuleToggled);
2228 on < SourceCheckboxToggled > (_onSourceCheckboxToggled);
2329 on < ClearSourceFiltersRequested > (_onClearSourceFiltersRequested);
24- // Removed _FetchFilteredSourcesRequested event listener
30+ on < SourcesFilterApplyFollowedRequested > (
31+ _onSourcesFilterApplyFollowedRequested,
32+ );
2533 }
2634
2735 final DataRepository <Source > _sourcesRepository;
2836 final DataRepository <Country > _countriesRepository;
37+ final DataRepository <UserContentPreferences >
38+ _userContentPreferencesRepository;
39+ final AppBloc _appBloc;
2940
3041 Future <void > _onLoadSourceFilterData (
3142 LoadSourceFilterData event,
@@ -182,6 +193,63 @@ class SourcesFilterBloc extends Bloc<SourcesFilterEvent, SourcesFilterState> {
182193 );
183194 }
184195
196+ /// Handles the request to apply the user's followed sources as filters.
197+ Future <void > _onSourcesFilterApplyFollowedRequested (
198+ SourcesFilterApplyFollowedRequested event,
199+ Emitter <SourcesFilterState > emit,
200+ ) async {
201+ emit (
202+ state.copyWith (
203+ followedSourcesStatus: SourceFilterDataLoadingStatus .loading,
204+ ),
205+ );
206+
207+ final currentUser = _appBloc.state.user! ;
208+
209+ try {
210+ final preferences = await _userContentPreferencesRepository.read (
211+ id: currentUser.id,
212+ userId: currentUser.id,
213+ );
214+
215+ if (preferences.followedSources.isEmpty) {
216+ emit (
217+ state.copyWith (
218+ followedSourcesStatus: SourceFilterDataLoadingStatus .success,
219+ followedSources: const [],
220+ clearErrorMessage: true ,
221+ ),
222+ );
223+ return ;
224+ }
225+
226+ emit (
227+ state.copyWith (
228+ followedSourcesStatus: SourceFilterDataLoadingStatus .success,
229+ followedSources: preferences.followedSources,
230+ finallySelectedSourceIds: preferences.followedSources
231+ .map ((s) => s.id)
232+ .toSet (),
233+ clearFollowedSourcesError: true ,
234+ ),
235+ );
236+ } on HttpException catch (e) {
237+ emit (
238+ state.copyWith (
239+ followedSourcesStatus: SourceFilterDataLoadingStatus .failure,
240+ error: e,
241+ ),
242+ );
243+ } catch (e) {
244+ emit (
245+ state.copyWith (
246+ followedSourcesStatus: SourceFilterDataLoadingStatus .failure,
247+ error: UnknownException (e.toString ()),
248+ ),
249+ );
250+ }
251+ }
252+
185253 // Helper method to filter sources based on selected countries and types
186254 List <Source > _getFilteredSources ({
187255 required List <Source > allSources,
0 commit comments