Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 54 additions & 58 deletions lib/app/view/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ class _AppState extends State<App> {
contactsAgreementStatusRepository: context.read<ContactsAgreementStatusRepository>(),
localeRepository: context.read<LocaleRepository>(),
themeModeRepository: context.read<ThemeModeRepository>(),
appThemes: context.read<AppThemes>(),
sessionRepository: context.read<SessionRepository>(),
systemInfoRepository: context.read<SystemInfoRepository>(),
appCompatibilityResolver: context.read<AppCompatibilityResolver>(),
Expand Down Expand Up @@ -117,63 +116,60 @@ class _AppState extends State<App> {
final isDeepLinkEnabled = EnvironmentConfig.APP_LINK_DOMAIN.isNotEmpty;

final featureAccess = context.watch<FeatureAccess>();

final materialApp = BlocBuilder<AppBloc, AppState>(
buildWhen: (previous, current) => previous.themeSettings != current.themeSettings,
builder: (context, state) {
return ThemeProvider(
settings: state.themeSettings,
lightDynamic: null,
darkDynamic: null,
child: BlocBuilder<AppBloc, AppState>(
buildWhen: (previous, current) =>
previous.effectiveLocale != current.effectiveLocale ||
previous.effectiveThemeMode != current.effectiveThemeMode,
builder: (context, state) {
final themeProvider = ThemeProvider.of(context);
final forcedMode = featureAccess.supportedConfig.themeMode;
final finalThemeMode = forcedMode == ThemeMode.system ? state.effectiveThemeMode : forcedMode;

return MaterialApp.router(
locale: state.effectiveLocale,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
// restorationScopeId: 'App', // TODO: temporary comment to prevent AppShell's AutoRouter placeholder blink - additional investigation necessary
title: EnvironmentConfig.APP_NAME,
themeMode: finalThemeMode,
theme: themeProvider.light(),
darkTheme: themeProvider.dark(),
routerConfig: appRouter.config(
deepLinkBuilder: isDeepLinkEnabled ? appRouter.deepLinkBuilder : null,
navigatorObservers: () => [
AppRouterObserver(),
context.read<AppAnalyticsRepository>().createObserver(),
AutoRouteObserver(),
],
reevaluateListenable: ReevaluateListenable.stream(
// Insert and skip the initial state to ensure the distinct buffer if filled
// and ensure the next state change is emitted only if it differ from the initial state.
//
// Please verify next caases if you change this logic:
// - Call drop after theme change or locale change:
appBloc.stream
.mergeAll([
Stream.fromIterable([appBloc.state]),
])
.distinct((p, n) {
final same = p.compareToReevaluate(n);
_logger.fine('AppState compareToReevaluate: $same');
if (!same) _logger.fine('AppState compareToReevaluate: previous: $p\n next: $n');
return same;
})
.skip(1),
),
),
);
},
),
);
},
final themeSettings = context.watch<ThemeSettings>();

final materialApp = ThemeProvider(
settings: themeSettings,
lightDynamic: null,
darkDynamic: null,
child: BlocBuilder<AppBloc, AppState>(
buildWhen: (previous, current) =>
previous.effectiveLocale != current.effectiveLocale || previous.themeMode != current.themeMode,
builder: (context, state) {
final themeProvider = ThemeProvider.of(context);
final forcedMode = featureAccess.supportedConfig.themeMode;
final finalThemeMode = forcedMode == ThemeMode.system
? themeSettings.effectiveThemeMode(state.themeMode)
: forcedMode;

return MaterialApp.router(
locale: state.effectiveLocale,
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
// restorationScopeId: 'App', // TODO: temporary comment to prevent AppShell's AutoRouter placeholder blink - additional investigation necessary
title: EnvironmentConfig.APP_NAME,
themeMode: finalThemeMode,
theme: themeProvider.light(),
darkTheme: themeProvider.dark(),
routerConfig: appRouter.config(
deepLinkBuilder: isDeepLinkEnabled ? appRouter.deepLinkBuilder : null,
navigatorObservers: () => [
AppRouterObserver(),
context.read<AppAnalyticsRepository>().createObserver(),
AutoRouteObserver(),
],
reevaluateListenable: ReevaluateListenable.stream(
// Insert and skip the initial state to ensure the distinct buffer if filled
// and ensure the next state change is emitted only if it differ from the initial state.
//
// Please verify next caases if you change this logic:
// - Call drop after theme change or locale change:
appBloc.stream
.mergeAll([
Stream.fromIterable([appBloc.state]),
])
.distinct((p, n) {
final same = p.compareToReevaluate(n);
_logger.fine('AppState compareToReevaluate: $same');
if (!same) _logger.fine('AppState compareToReevaluate: previous: $p\n next: $n');
return same;
})
.skip(1),
),
),
);
},
),
);

return MultiBlocProvider(
Expand Down
8 changes: 0 additions & 8 deletions lib/blocs/app/app_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import 'package:webtrit_phone/extensions/extensions.dart';
import 'package:webtrit_phone/models/models.dart';
import 'package:webtrit_phone/repositories/repositories.dart';
import 'package:webtrit_phone/resolvers/resolvers.dart';
import 'package:webtrit_phone/theme/theme.dart';
import 'package:webtrit_phone/utils/utils.dart';

part 'app_bloc.freezed.dart';
Expand All @@ -40,22 +39,19 @@ class AppBloc extends Bloc<AppEvent, AppState> {
required this.systemInfoRepository,
required this.appCompatibilityResolver,
required this.packageInfo,
required AppThemes appThemes,
}) : super(
AppState(
session: sessionRepository.getCurrent(),
status: (sessionRepository.getCurrent().isLoggedIn)
? AppLifecycleStatus.authenticated
: AppLifecycleStatus.unauthenticated,
themeSettings: appThemes.values.first.settings,
themeMode: themeModeRepository.getThemeMode(),
locale: localeRepository.getLocale(),
userAgreementStatus: userAgreementStatusRepository.getUserAgreementStatus(),
contactsAgreementStatus: contactsAgreementStatusRepository.getContactsAgreementStatus(),
),
) {
on<AppLoggedIn>(_onLoggedIn);
on<AppThemeSettingsChanged>(_onThemeSettingsChanged, transformer: droppable());
on<AppThemeModeChanged>(_onThemeModeChanged, transformer: droppable());
on<AppLocaleChanged>(_onLocaleChanged, transformer: droppable());
on<AppAgreementAccepted>(_onUserAgreementAccepted, transformer: droppable());
Expand Down Expand Up @@ -197,10 +193,6 @@ class AppBloc extends Bloc<AppEvent, AppState> {
emit(state.copyWith(status: AppLifecycleStatus.unauthenticated, session: const Session(), logoutReason: null));
}

void _onThemeSettingsChanged(AppThemeSettingsChanged event, Emitter<AppState> emit) {
emit(state.copyWith(themeSettings: event.value));
}

void _onThemeModeChanged(AppThemeModeChanged event, Emitter<AppState> emit) async {
final themeMode = event.value;
if (themeMode == ThemeMode.system) {
Expand Down
Loading
Loading