Skip to content

Commit 81366e4

Browse files
authored
Merge pull request #39 from flutter-news-app-full-source-code/refactor-streamline-headline-and-source-country
Refactor streamline headline and source country
2 parents 21dbf06 + 6cfd833 commit 81366e4

25 files changed

+249
-233
lines changed

lib/app/view/app.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ class App extends StatelessWidget {
2626
required AuthRepository authenticationRepository,
2727
required DataRepository<Headline> headlinesRepository,
2828
required DataRepository<Topic> topicsRepository,
29-
required DataRepository<Country> countriesRepository,
3029
required DataRepository<Source> sourcesRepository,
3130
required DataRepository<UserAppSettings> userAppSettingsRepository,
3231
required DataRepository<UserContentPreferences>
@@ -39,7 +38,6 @@ class App extends StatelessWidget {
3938
}) : _authenticationRepository = authenticationRepository,
4039
_headlinesRepository = headlinesRepository,
4140
_topicsRepository = topicsRepository,
42-
_countriesRepository = countriesRepository,
4341
_sourcesRepository = sourcesRepository,
4442
_userAppSettingsRepository = userAppSettingsRepository,
4543
_userContentPreferencesRepository = userContentPreferencesRepository,
@@ -51,7 +49,6 @@ class App extends StatelessWidget {
5149
final AuthRepository _authenticationRepository;
5250
final DataRepository<Headline> _headlinesRepository;
5351
final DataRepository<Topic> _topicsRepository;
54-
final DataRepository<Country> _countriesRepository;
5552
final DataRepository<Source> _sourcesRepository;
5653
final DataRepository<UserAppSettings> _userAppSettingsRepository;
5754
final DataRepository<UserContentPreferences>
@@ -68,7 +65,6 @@ class App extends StatelessWidget {
6865
RepositoryProvider.value(value: _authenticationRepository),
6966
RepositoryProvider.value(value: _headlinesRepository),
7067
RepositoryProvider.value(value: _topicsRepository),
71-
RepositoryProvider.value(value: _countriesRepository),
7268
RepositoryProvider.value(value: _sourcesRepository),
7369
RepositoryProvider.value(value: _userAppSettingsRepository),
7470
RepositoryProvider.value(value: _userContentPreferencesRepository),

lib/bootstrap.dart

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ Future<Widget> bootstrap(
5555

5656
DataClient<Headline> headlinesClient;
5757
DataClient<Topic> topicsClient;
58-
DataClient<Country> countriesClient;
5958
DataClient<Source> sourcesClient;
6059
DataClient<UserContentPreferences> userContentPreferencesClient;
6160
DataClient<UserAppSettings> userAppSettingsClient;
@@ -75,12 +74,6 @@ Future<Widget> bootstrap(
7574
initialData: topicsFixturesData,
7675
logger: Logger('DataInMemory<Topic>'),
7776
);
78-
countriesClient = DataInMemory<Country>(
79-
toJson: (i) => i.toJson(),
80-
getId: (i) => i.id,
81-
initialData: countriesFixturesData,
82-
logger: Logger('DataInMemory<Country>'),
83-
);
8477
sourcesClient = DataInMemory<Source>(
8578
toJson: (i) => i.toJson(),
8679
getId: (i) => i.id,
@@ -124,13 +117,6 @@ Future<Widget> bootstrap(
124117
toJson: (topic) => topic.toJson(),
125118
logger: Logger('DataApi<Topic>'),
126119
);
127-
countriesClient = DataApi<Country>(
128-
httpClient: httpClient,
129-
modelName: 'country',
130-
fromJson: Country.fromJson,
131-
toJson: (country) => country.toJson(),
132-
logger: Logger('DataApi<Country>'),
133-
);
134120
sourcesClient = DataApi<Source>(
135121
httpClient: httpClient,
136122
modelName: 'source',
@@ -181,13 +167,6 @@ Future<Widget> bootstrap(
181167
toJson: (topic) => topic.toJson(),
182168
logger: Logger('DataApi<Topic>'),
183169
);
184-
countriesClient = DataApi<Country>(
185-
httpClient: httpClient,
186-
modelName: 'country',
187-
fromJson: Country.fromJson,
188-
toJson: (country) => country.toJson(),
189-
logger: Logger('DataApi<Country>'),
190-
);
191170
sourcesClient = DataApi<Source>(
192171
httpClient: httpClient,
193172
modelName: 'source',
@@ -229,9 +208,6 @@ Future<Widget> bootstrap(
229208
dataClient: headlinesClient,
230209
);
231210
final topicsRepository = DataRepository<Topic>(dataClient: topicsClient);
232-
final countriesRepository = DataRepository<Country>(
233-
dataClient: countriesClient,
234-
);
235211
final sourcesRepository = DataRepository<Source>(dataClient: sourcesClient);
236212
final userContentPreferencesRepository =
237213
DataRepository<UserContentPreferences>(
@@ -251,7 +227,6 @@ Future<Widget> bootstrap(
251227
authenticationRepository: authenticationRepository,
252228
headlinesRepository: headlinesRepository,
253229
topicsRepository: topicsRepository,
254-
countriesRepository: countriesRepository,
255230
sourcesRepository: sourcesRepository,
256231
userAppSettingsRepository: userAppSettingsRepository,
257232
userContentPreferencesRepository: userContentPreferencesRepository,

lib/content_management/bloc/create_headline/create_headline_bloc.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'package:bloc/bloc.dart';
22
import 'package:core/core.dart';
3+
import 'package:country_picker/country_picker.dart' as picker;
34
import 'package:data_repository/data_repository.dart';
45
import 'package:equatable/equatable.dart';
56
import 'package:flutter/foundation.dart';
7+
import 'package:flutter_news_app_web_dashboard_full_source_code/shared/shared.dart';
68
import 'package:uuid/uuid.dart';
79

810
part 'create_headline_event.dart';
@@ -16,11 +18,9 @@ class CreateHeadlineBloc
1618
required DataRepository<Headline> headlinesRepository,
1719
required DataRepository<Source> sourcesRepository,
1820
required DataRepository<Topic> topicsRepository,
19-
required DataRepository<Country> countriesRepository,
2021
}) : _headlinesRepository = headlinesRepository,
2122
_sourcesRepository = sourcesRepository,
2223
_topicsRepository = topicsRepository,
23-
_countriesRepository = countriesRepository,
2424
super(const CreateHeadlineState()) {
2525
on<CreateHeadlineDataLoaded>(_onDataLoaded);
2626
on<CreateHeadlineTitleChanged>(_onTitleChanged);
@@ -37,7 +37,6 @@ class CreateHeadlineBloc
3737
final DataRepository<Headline> _headlinesRepository;
3838
final DataRepository<Source> _sourcesRepository;
3939
final DataRepository<Topic> _topicsRepository;
40-
final DataRepository<Country> _countriesRepository;
4140
final _uuid = const Uuid();
4241

4342
Future<void> _onDataLoaded(
@@ -49,29 +48,23 @@ class CreateHeadlineBloc
4948
final [
5049
sourcesResponse,
5150
topicsResponse,
52-
countriesResponse,
5351
] = await Future.wait([
5452
_sourcesRepository.readAll(
5553
sort: [const SortOption('updatedAt', SortOrder.desc)],
5654
),
5755
_topicsRepository.readAll(
5856
sort: [const SortOption('updatedAt', SortOrder.desc)],
5957
),
60-
_countriesRepository.readAll(
61-
sort: [const SortOption('updatedAt', SortOrder.desc)],
62-
),
6358
]);
6459

6560
final sources = (sourcesResponse as PaginatedResponse<Source>).items;
6661
final topics = (topicsResponse as PaginatedResponse<Topic>).items;
67-
final countries = (countriesResponse as PaginatedResponse<Country>).items;
6862

6963
emit(
7064
state.copyWith(
7165
status: CreateHeadlineStatus.initial,
7266
sources: sources,
7367
topics: topics,
74-
countries: countries,
7568
),
7669
);
7770
} on HttpException catch (e) {
@@ -132,7 +125,13 @@ class CreateHeadlineBloc
132125
CreateHeadlineCountryChanged event,
133126
Emitter<CreateHeadlineState> emit,
134127
) {
135-
emit(state.copyWith(eventCountry: () => event.country));
128+
final packageCountry = event.country;
129+
if (packageCountry == null) {
130+
emit(state.copyWith(eventCountry: () => null));
131+
} else {
132+
final coreCountry = adaptPackageCountryToCoreCountry(packageCountry);
133+
emit(state.copyWith(eventCountry: () => coreCountry));
134+
}
136135
}
137136

138137
void _onStatusChanged(

lib/content_management/bloc/create_headline/create_headline_event.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ final class CreateHeadlineTopicChanged extends CreateHeadlineEvent {
6464
/// Event for when the headline's country is changed.
6565
final class CreateHeadlineCountryChanged extends CreateHeadlineEvent {
6666
const CreateHeadlineCountryChanged(this.country);
67-
final Country? country;
67+
final picker.Country? country;
6868
@override
6969
List<Object?> get props => [country];
7070
}

lib/content_management/bloc/create_headline/create_headline_state.dart

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ final class CreateHeadlineState extends Equatable {
3131
this.eventCountry,
3232
this.sources = const [],
3333
this.topics = const [],
34-
this.countries = const [],
3534
this.contentStatus = ContentStatus.active,
3635
this.exception,
3736
this.createdHeadline,
@@ -47,7 +46,6 @@ final class CreateHeadlineState extends Equatable {
4746
final Country? eventCountry;
4847
final List<Source> sources;
4948
final List<Topic> topics;
50-
final List<Country> countries;
5149
final ContentStatus contentStatus;
5250
final HttpException? exception;
5351
final Headline? createdHeadline;
@@ -73,7 +71,6 @@ final class CreateHeadlineState extends Equatable {
7371
ValueGetter<Country?>? eventCountry,
7472
List<Source>? sources,
7573
List<Topic>? topics,
76-
List<Country>? countries,
7774
ContentStatus? contentStatus,
7875
HttpException? exception,
7976
Headline? createdHeadline,
@@ -89,7 +86,6 @@ final class CreateHeadlineState extends Equatable {
8986
eventCountry: eventCountry != null ? eventCountry() : this.eventCountry,
9087
sources: sources ?? this.sources,
9188
topics: topics ?? this.topics,
92-
countries: countries ?? this.countries,
9389
contentStatus: contentStatus ?? this.contentStatus,
9490
exception: exception,
9591
createdHeadline: createdHeadline ?? this.createdHeadline,
@@ -108,7 +104,6 @@ final class CreateHeadlineState extends Equatable {
108104
eventCountry,
109105
sources,
110106
topics,
111-
countries,
112107
contentStatus,
113108
exception,
114109
createdHeadline,

lib/content_management/bloc/create_source/create_source_bloc.dart

Lines changed: 12 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import 'package:bloc/bloc.dart';
22
import 'package:core/core.dart';
3+
import 'package:country_picker/country_picker.dart' as picker;
34
import 'package:data_repository/data_repository.dart';
45
import 'package:equatable/equatable.dart';
56
import 'package:flutter/foundation.dart';
7+
import 'package:flutter_news_app_web_dashboard_full_source_code/shared/shared.dart';
68
import 'package:uuid/uuid.dart';
79

810
part 'create_source_event.dart';
@@ -13,9 +15,7 @@ class CreateSourceBloc extends Bloc<CreateSourceEvent, CreateSourceState> {
1315
/// {@macro create_source_bloc}
1416
CreateSourceBloc({
1517
required DataRepository<Source> sourcesRepository,
16-
required DataRepository<Country> countriesRepository,
1718
}) : _sourcesRepository = sourcesRepository,
18-
_countriesRepository = countriesRepository,
1919
super(const CreateSourceState()) {
2020
on<CreateSourceDataLoaded>(_onDataLoaded);
2121
on<CreateSourceNameChanged>(_onNameChanged);
@@ -29,36 +29,15 @@ class CreateSourceBloc extends Bloc<CreateSourceEvent, CreateSourceState> {
2929
}
3030

3131
final DataRepository<Source> _sourcesRepository;
32-
final DataRepository<Country> _countriesRepository;
3332
final _uuid = const Uuid();
3433

3534
Future<void> _onDataLoaded(
3635
CreateSourceDataLoaded event,
3736
Emitter<CreateSourceState> emit,
3837
) async {
39-
emit(state.copyWith(status: CreateSourceStatus.loading));
40-
try {
41-
final countriesResponse = await _countriesRepository.readAll(
42-
sort: [const SortOption('updatedAt', SortOrder.desc)],
43-
);
44-
final countries = countriesResponse.items;
45-
46-
emit(
47-
state.copyWith(
48-
status: CreateSourceStatus.initial,
49-
countries: countries,
50-
),
51-
);
52-
} on HttpException catch (e) {
53-
emit(state.copyWith(status: CreateSourceStatus.failure, exception: e));
54-
} catch (e) {
55-
emit(
56-
state.copyWith(
57-
status: CreateSourceStatus.failure,
58-
exception: UnknownException('An unexpected error occurred: $e'),
59-
),
60-
);
61-
}
38+
// This event is now a no-op since we don't need to load countries.
39+
// We just ensure the BLoC is in the initial state.
40+
emit(state.copyWith(status: CreateSourceStatus.initial));
6241
}
6342

6443
void _onNameChanged(
@@ -100,7 +79,13 @@ class CreateSourceBloc extends Bloc<CreateSourceEvent, CreateSourceState> {
10079
CreateSourceHeadquartersChanged event,
10180
Emitter<CreateSourceState> emit,
10281
) {
103-
emit(state.copyWith(headquarters: () => event.headquarters));
82+
final packageCountry = event.headquarters;
83+
if (packageCountry == null) {
84+
emit(state.copyWith(headquarters: () => null));
85+
} else {
86+
final coreCountry = adaptPackageCountryToCoreCountry(packageCountry);
87+
emit(state.copyWith(headquarters: () => coreCountry));
88+
}
10489
}
10590

10691
void _onStatusChanged(

lib/content_management/bloc/create_source/create_source_event.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ final class CreateSourceLanguageChanged extends CreateSourceEvent {
5656
/// Event for when the source's headquarters is changed.
5757
final class CreateSourceHeadquartersChanged extends CreateSourceEvent {
5858
const CreateSourceHeadquartersChanged(this.headquarters);
59-
final Country? headquarters;
59+
final picker.Country? headquarters;
6060
@override
6161
List<Object?> get props => [headquarters];
6262
}

lib/content_management/bloc/create_source/create_source_state.dart

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ final class CreateSourceState extends Equatable {
2929
this.sourceType,
3030
this.language = '',
3131
this.headquarters,
32-
this.countries = const [],
3332
this.contentStatus = ContentStatus.active,
3433
this.exception,
3534
this.createdSource,
@@ -42,7 +41,6 @@ final class CreateSourceState extends Equatable {
4241
final SourceType? sourceType;
4342
final String language;
4443
final Country? headquarters;
45-
final List<Country> countries;
4644
final ContentStatus contentStatus;
4745
final HttpException? exception;
4846
final Source? createdSource;
@@ -64,7 +62,6 @@ final class CreateSourceState extends Equatable {
6462
ValueGetter<SourceType?>? sourceType,
6563
String? language,
6664
ValueGetter<Country?>? headquarters,
67-
List<Country>? countries,
6865
ContentStatus? contentStatus,
6966
HttpException? exception,
7067
Source? createdSource,
@@ -77,7 +74,6 @@ final class CreateSourceState extends Equatable {
7774
sourceType: sourceType != null ? sourceType() : this.sourceType,
7875
language: language ?? this.language,
7976
headquarters: headquarters != null ? headquarters() : this.headquarters,
80-
countries: countries ?? this.countries,
8177
contentStatus: contentStatus ?? this.contentStatus,
8278
exception: exception,
8379
createdSource: createdSource ?? this.createdSource,
@@ -93,7 +89,6 @@ final class CreateSourceState extends Equatable {
9389
sourceType,
9490
language,
9591
headquarters,
96-
countries,
9792
contentStatus,
9893
exception,
9994
createdSource,

0 commit comments

Comments
 (0)