Skip to content

Commit 19d5e88

Browse files
authored
Merge pull request #121 from flutter-news-app-full-source-code/Early-RemoteConfig-Fetch-and-App-Initialization-Streamlining
Early remote config fetch and app initialization streamlining
2 parents c227232 + 6f84e56 commit 19d5e88

File tree

57 files changed

+2360
-3706
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2360
-3706
lines changed

lib/account/bloc/account_bloc.dart

Lines changed: 0 additions & 492 deletions
This file was deleted.

lib/account/bloc/account_event.dart

Lines changed: 0 additions & 66 deletions
This file was deleted.

lib/account/bloc/account_state.dart

Lines changed: 0 additions & 37 deletions
This file was deleted.

lib/account/view/manage_followed_items/countries/add_country_to_follow_page.dart

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import 'package:core/core.dart';
22
import 'package:data_repository/data_repository.dart';
33
import 'package:flutter/material.dart';
44
import 'package:flutter_bloc/flutter_bloc.dart';
5-
import 'package:flutter_news_app_mobile_client_full_source_code/account/bloc/account_bloc.dart';
65
import 'package:flutter_news_app_mobile_client_full_source_code/account/bloc/available_countries_bloc.dart';
6+
import 'package:flutter_news_app_mobile_client_full_source_code/app/bloc/app_bloc.dart';
77
import 'package:flutter_news_app_mobile_client_full_source_code/l10n/l10n.dart';
88
import 'package:ui_kit/ui_kit.dart';
99

@@ -57,14 +57,14 @@ class AddCountryToFollowPage extends StatelessWidget {
5757

5858
final countries = countriesState.availableCountries;
5959

60-
return BlocBuilder<AccountBloc, AccountState>(
60+
return BlocBuilder<AppBloc, AppState>(
6161
buildWhen: (previous, current) =>
62-
previous.preferences?.followedCountries !=
63-
current.preferences?.followedCountries ||
64-
previous.status != current.status,
65-
builder: (context, accountState) {
62+
previous.userContentPreferences?.followedCountries !=
63+
current.userContentPreferences?.followedCountries,
64+
builder: (context, appState) {
65+
final userContentPreferences = appState.userContentPreferences;
6666
final followedCountries =
67-
accountState.preferences?.followedCountries ?? [];
67+
userContentPreferences?.followedCountries ?? [];
6868

6969
return ListView.builder(
7070
padding: const EdgeInsets.symmetric(
@@ -150,8 +150,28 @@ class AddCountryToFollowPage extends StatelessWidget {
150150
? l10n.unfollowCountryTooltip(country.name)
151151
: l10n.followCountryTooltip(country.name),
152152
onPressed: () {
153-
context.read<AccountBloc>().add(
154-
AccountFollowCountryToggled(country: country),
153+
if (userContentPreferences == null) return;
154+
155+
final updatedFollowedCountries = List<Country>.from(
156+
followedCountries,
157+
);
158+
if (isFollowed) {
159+
updatedFollowedCountries.removeWhere(
160+
(c) => c.id == country.id,
161+
);
162+
} else {
163+
updatedFollowedCountries.add(country);
164+
}
165+
166+
final updatedPreferences = userContentPreferences
167+
.copyWith(
168+
followedCountries: updatedFollowedCountries,
169+
);
170+
171+
context.read<AppBloc>().add(
172+
AppUserContentPreferencesChanged(
173+
preferences: updatedPreferences,
174+
),
155175
);
156176
},
157177
),

lib/account/view/manage_followed_items/countries/followed_countries_list_page.dart

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import 'package:core/core.dart';
22
import 'package:flutter/material.dart';
33
import 'package:flutter_bloc/flutter_bloc.dart';
4-
import 'package:flutter_news_app_mobile_client_full_source_code/account/bloc/account_bloc.dart';
54
import 'package:flutter_news_app_mobile_client_full_source_code/ads/interstitial_ad_manager.dart';
5+
import 'package:flutter_news_app_mobile_client_full_source_code/app/bloc/app_bloc.dart';
66
import 'package:flutter_news_app_mobile_client_full_source_code/l10n/l10n.dart';
77
import 'package:flutter_news_app_mobile_client_full_source_code/router/routes.dart';
88
import 'package:go_router/go_router.dart';
@@ -18,8 +18,6 @@ class FollowedCountriesListPage extends StatelessWidget {
1818
@override
1919
Widget build(BuildContext context) {
2020
final l10n = AppLocalizationsX(context).l10n;
21-
final followedCountries =
22-
context.watch<AccountBloc>().state.preferences?.followedCountries ?? [];
2321

2422
return Scaffold(
2523
appBar: AppBar(
@@ -34,33 +32,31 @@ class FollowedCountriesListPage extends StatelessWidget {
3432
),
3533
],
3634
),
37-
body: BlocBuilder<AccountBloc, AccountState>(
38-
builder: (context, state) {
39-
if (state.status == AccountStatus.loading &&
40-
state.preferences == null) {
35+
body: BlocBuilder<AppBloc, AppState>(
36+
builder: (context, appState) {
37+
final user = appState.user;
38+
final userContentPreferences = appState.userContentPreferences;
39+
40+
if (appState.status == AppLifeCycleStatus.loadingUserData ||
41+
userContentPreferences == null) {
4142
return LoadingStateWidget(
4243
icon: Icons.flag_outlined,
4344
headline: l10n.followedCountriesLoadingHeadline,
4445
subheadline: l10n.pleaseWait,
4546
);
4647
}
4748

48-
if (state.status == AccountStatus.failure &&
49-
state.preferences == null) {
49+
if (appState.initialUserPreferencesError != null) {
5050
return FailureStateWidget(
51-
exception:
52-
state.error ??
53-
OperationFailedException(l10n.followedCountriesErrorHeadline),
51+
exception: appState.initialUserPreferencesError!,
5452
onRetry: () {
55-
if (state.user?.id != null) {
56-
context.read<AccountBloc>().add(
57-
AccountLoadUserPreferences(userId: state.user!.id),
58-
);
59-
}
53+
context.read<AppBloc>().add(AppStarted(initialUser: user));
6054
},
6155
);
6256
}
6357

58+
final followedCountries = userContentPreferences.followedCountries;
59+
6460
if (followedCountries.isEmpty) {
6561
return InitialStateWidget(
6662
icon: Icons.location_off_outlined,
@@ -91,8 +87,18 @@ class FollowedCountriesListPage extends StatelessWidget {
9187
),
9288
tooltip: l10n.unfollowCountryTooltip(country.name),
9389
onPressed: () {
94-
context.read<AccountBloc>().add(
95-
AccountFollowCountryToggled(country: country),
90+
final updatedFollowedCountries = List<Country>.from(
91+
followedCountries,
92+
)..removeWhere((c) => c.id == country.id);
93+
94+
final updatedPreferences = userContentPreferences.copyWith(
95+
followedCountries: updatedFollowedCountries,
96+
);
97+
98+
context.read<AppBloc>().add(
99+
AppUserContentPreferencesChanged(
100+
preferences: updatedPreferences,
101+
),
96102
);
97103
},
98104
),

lib/account/view/manage_followed_items/sources/add_source_to_follow_page.dart

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import 'package:core/core.dart';
22
import 'package:data_repository/data_repository.dart';
33
import 'package:flutter/material.dart';
44
import 'package:flutter_bloc/flutter_bloc.dart';
5-
import 'package:flutter_news_app_mobile_client_full_source_code/account/bloc/account_bloc.dart';
65
import 'package:flutter_news_app_mobile_client_full_source_code/account/bloc/available_sources_bloc.dart';
6+
import 'package:flutter_news_app_mobile_client_full_source_code/app/bloc/app_bloc.dart';
77
import 'package:flutter_news_app_mobile_client_full_source_code/l10n/l10n.dart';
88
import 'package:ui_kit/ui_kit.dart';
99

@@ -47,14 +47,14 @@ class AddSourceToFollowPage extends StatelessWidget {
4747
);
4848
}
4949

50-
return BlocBuilder<AccountBloc, AccountState>(
50+
return BlocBuilder<AppBloc, AppState>(
5151
buildWhen: (previous, current) =>
52-
previous.preferences?.followedSources !=
53-
current.preferences?.followedSources ||
54-
previous.status != current.status,
55-
builder: (context, accountState) {
52+
previous.userContentPreferences?.followedSources !=
53+
current.userContentPreferences?.followedSources,
54+
builder: (context, appState) {
55+
final userContentPreferences = appState.userContentPreferences;
5656
final followedSources =
57-
accountState.preferences?.followedSources ?? [];
57+
userContentPreferences?.followedSources ?? [];
5858

5959
return ListView.builder(
6060
padding: const EdgeInsets.all(AppSpacing.md),
@@ -80,8 +80,28 @@ class AddSourceToFollowPage extends StatelessWidget {
8080
? l10n.unfollowSourceTooltip(source.name)
8181
: l10n.followSourceTooltip(source.name),
8282
onPressed: () {
83-
context.read<AccountBloc>().add(
84-
AccountFollowSourceToggled(source: source),
83+
if (userContentPreferences == null) return;
84+
85+
final updatedFollowedSources = List<Source>.from(
86+
followedSources,
87+
);
88+
if (isFollowed) {
89+
updatedFollowedSources.removeWhere(
90+
(s) => s.id == source.id,
91+
);
92+
} else {
93+
updatedFollowedSources.add(source);
94+
}
95+
96+
final updatedPreferences = userContentPreferences
97+
.copyWith(
98+
followedSources: updatedFollowedSources,
99+
);
100+
101+
context.read<AppBloc>().add(
102+
AppUserContentPreferencesChanged(
103+
preferences: updatedPreferences,
104+
),
85105
);
86106
},
87107
),

0 commit comments

Comments
 (0)