-
-
Notifications
You must be signed in to change notification settings - Fork 47
/
main_bloc.dart
117 lines (100 loc) · 3.67 KB
/
main_bloc.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:genshindb/application/utils/app_path_utils.dart';
import 'package:genshindb/domain/enums/enums.dart';
import 'package:genshindb/domain/models/models.dart';
import 'package:genshindb/domain/services/genshin_service.dart';
import 'package:genshindb/domain/services/locale_service.dart';
import 'package:genshindb/domain/services/logging_service.dart';
import 'package:genshindb/domain/services/settings_service.dart';
import 'package:genshindb/domain/services/telemetry_service.dart';
import 'package:package_info/package_info.dart';
import '../bloc.dart';
part 'main_bloc.freezed.dart';
part 'main_event.dart';
part 'main_state.dart';
class MainBloc extends Bloc<MainEvent, MainState> {
final LoggingService _logger;
final GenshinService _genshinService;
final SettingsService _settingsService;
final LocaleService _localeService;
final TelemetryService _telemetryService;
final CharactersBloc _charactersBloc;
final WeaponsBloc _weaponsBloc;
final HomeBloc _homeBloc;
final ArtifactsBloc _artifactsBloc;
MainBloc(
this._logger,
this._genshinService,
this._settingsService,
this._localeService,
this._telemetryService,
this._charactersBloc,
this._weaponsBloc,
this._homeBloc,
this._artifactsBloc,
) : super(const MainState.loading());
_MainLoadedState get currentState => state as _MainLoadedState;
@override
Stream<MainState> mapEventToState(
MainEvent event,
) async* {
final s = await event.when(
init: () async {
return _init(init: true);
},
themeChanged: (theme) async {
return _loadThemeData(currentState.appTitle, theme, _settingsService.accentColor);
},
accentColorChanged: (accentColor) async {
return _loadThemeData(currentState.appTitle, _settingsService.appTheme, accentColor);
},
languageChanged: (language) async {
return _init(languageChanged: true);
},
);
yield s;
}
Future<MainState> _init({bool languageChanged = false, bool init = false}) async {
_logger.info(runtimeType, '_init: Initializing all..');
await _settingsService.init();
_logger.info(runtimeType, '_init: Deleting old logs...');
try {
await AppPathUtils.deleteOlLogs();
} catch (e, s) {
_logger.error(runtimeType, '_init: Unknown error while trying to delete old logs', e, s);
}
await _genshinService.init(_settingsService.language);
if (languageChanged) {
_logger.info(runtimeType, '_init: Language changed, reloading all the required blocs...');
_charactersBloc.add(const CharactersEvent.init());
_weaponsBloc.add(const WeaponsEvent.init());
_homeBloc.add(const HomeEvent.init());
_artifactsBloc.add(const ArtifactsEvent.init());
}
final packageInfo = await PackageInfo.fromPlatform();
final settings = _settingsService.appSettings;
await _telemetryService.trackInit(settings);
if (init) {
await Future.delayed(const Duration(milliseconds: 600));
}
return _loadThemeData(packageInfo.appName, settings.appTheme, settings.accentColor);
}
Future<MainState> _loadThemeData(
String appTitle,
AppThemeType theme,
AppAccentColorType accentColor, {
bool isInitialized = true,
}) async {
_logger.info(runtimeType, '_init: Is first install = ${_settingsService.isFirstInstall}');
return MainState.loaded(
appTitle: appTitle,
accentColor: accentColor,
language: _localeService.getLocaleWithoutLang(),
initialized: isInitialized,
theme: theme,
firstInstall: _settingsService.isFirstInstall,
);
}
}