Skip to content

Commit d89f9ae

Browse files
committed
feat(settings): implement settings bloc logic
- Implemented SettingsBloc with events - Added state management - Handled settings loading and updating - Implemented theme change logic
1 parent 84430bd commit d89f9ae

File tree

3 files changed

+316
-7
lines changed

3 files changed

+316
-7
lines changed

lib/settings/bloc/settings_bloc.dart

Lines changed: 138 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,147 @@
1+
import 'dart:async';
2+
13
import 'package:bloc/bloc.dart';
24
import 'package:equatable/equatable.dart';
5+
import 'package:ht_data_repository/ht_data_repository.dart';
6+
import 'package:ht_shared/ht_shared.dart';
37

48
part 'settings_event.dart';
59
part 'settings_state.dart';
610

711
class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
8-
SettingsBloc() : super(SettingsInitial()) {
9-
on<SettingsEvent>((event, emit) {
10-
// TODO: implement event handler
11-
});
12+
SettingsBloc({
13+
required HtDataRepository<UserAppSettings> userAppSettingsRepository,
14+
}) : _userAppSettingsRepository = userAppSettingsRepository,
15+
super(SettingsInitial()) {
16+
on<SettingsLoaded>(_onSettingsLoaded);
17+
on<SettingsBaseThemeChanged>(_onSettingsBaseThemeChanged);
18+
on<SettingsAccentThemeChanged>(_onSettingsAccentThemeChanged);
19+
on<SettingsFontFamilyChanged>(_onSettingsFontFamilyChanged);
20+
on<SettingsTextScaleFactorChanged>(_onSettingsTextScaleFactorChanged);
21+
on<SettingsFontWeightChanged>(_onSettingsFontWeightChanged);
22+
on<SettingsLanguageChanged>(_onSettingsLanguageChanged);
23+
}
24+
25+
final HtDataRepository<UserAppSettings> _userAppSettingsRepository;
26+
27+
Future<void> _onSettingsLoaded(
28+
SettingsLoaded event,
29+
Emitter<SettingsState> emit,
30+
) async {
31+
emit(SettingsLoadInProgress());
32+
try {
33+
// Assuming a fixed ID for user settings, or fetching based on current user
34+
final userAppSettings =
35+
await _userAppSettingsRepository.read(id: event.userId!);
36+
emit(SettingsLoadSuccess(userAppSettings: userAppSettings));
37+
} on NotFoundException {
38+
final defaultSettings = UserAppSettings(id: event.userId!);
39+
await _userAppSettingsRepository.create(item: defaultSettings);
40+
emit(SettingsLoadSuccess(userAppSettings: defaultSettings));
41+
} on HtHttpException catch (e) {
42+
emit(SettingsLoadFailure(e.message));
43+
} catch (e) {
44+
emit(SettingsLoadFailure('An unexpected error occurred: $e'));
45+
}
46+
}
47+
48+
Future<void> _updateSettings(
49+
UserAppSettings updatedSettings,
50+
Emitter<SettingsState> emit,
51+
) async {
52+
emit(SettingsUpdateInProgress(userAppSettings: updatedSettings));
53+
try {
54+
final result = await _userAppSettingsRepository.update(
55+
id: updatedSettings.id,
56+
item: updatedSettings,
57+
);
58+
emit(SettingsUpdateSuccess(userAppSettings: result));
59+
} on HtHttpException catch (e) {
60+
emit(SettingsUpdateFailure(e.message));
61+
} catch (e) {
62+
emit(SettingsUpdateFailure('An unexpected error occurred: $e'));
63+
}
64+
}
65+
66+
Future<void> _onSettingsBaseThemeChanged(
67+
SettingsBaseThemeChanged event,
68+
Emitter<SettingsState> emit,
69+
) async {
70+
if (state is SettingsLoadSuccess) {
71+
final currentSettings = (state as SettingsLoadSuccess).userAppSettings;
72+
final updatedSettings = currentSettings.copyWith(
73+
displaySettings:
74+
currentSettings.displaySettings.copyWith(baseTheme: event.baseTheme),
75+
);
76+
await _updateSettings(updatedSettings, emit);
77+
}
78+
}
79+
80+
Future<void> _onSettingsAccentThemeChanged(
81+
SettingsAccentThemeChanged event,
82+
Emitter<SettingsState> emit,
83+
) async {
84+
if (state is SettingsLoadSuccess) {
85+
final currentSettings = (state as SettingsLoadSuccess).userAppSettings;
86+
final updatedSettings = currentSettings.copyWith(
87+
displaySettings: currentSettings.displaySettings
88+
.copyWith(accentTheme: event.accentTheme),
89+
);
90+
await _updateSettings(updatedSettings, emit);
91+
}
92+
}
93+
94+
Future<void> _onSettingsFontFamilyChanged(
95+
SettingsFontFamilyChanged event,
96+
Emitter<SettingsState> emit,
97+
) async {
98+
if (state is SettingsLoadSuccess) {
99+
final currentSettings = (state as SettingsLoadSuccess).userAppSettings;
100+
final updatedSettings = currentSettings.copyWith(
101+
displaySettings: currentSettings.displaySettings
102+
.copyWith(fontFamily: event.fontFamily),
103+
);
104+
await _updateSettings(updatedSettings, emit);
105+
}
106+
}
107+
108+
Future<void> _onSettingsTextScaleFactorChanged(
109+
SettingsTextScaleFactorChanged event,
110+
Emitter<SettingsState> emit,
111+
) async {
112+
if (state is SettingsLoadSuccess) {
113+
final currentSettings = (state as SettingsLoadSuccess).userAppSettings;
114+
final updatedSettings = currentSettings.copyWith(
115+
displaySettings: currentSettings.displaySettings
116+
.copyWith(textScaleFactor: event.textScaleFactor),
117+
);
118+
await _updateSettings(updatedSettings, emit);
119+
}
120+
}
121+
122+
Future<void> _onSettingsFontWeightChanged(
123+
SettingsFontWeightChanged event,
124+
Emitter<SettingsState> emit,
125+
) async {
126+
if (state is SettingsLoadSuccess) {
127+
final currentSettings = (state as SettingsLoadSuccess).userAppSettings;
128+
final updatedSettings = currentSettings.copyWith(
129+
displaySettings: currentSettings.displaySettings
130+
.copyWith(fontWeight: event.fontWeight),
131+
);
132+
await _updateSettings(updatedSettings, emit);
133+
}
134+
}
135+
136+
Future<void> _onSettingsLanguageChanged(
137+
SettingsLanguageChanged event,
138+
Emitter<SettingsState> emit,
139+
) async {
140+
if (state is SettingsLoadSuccess) {
141+
final currentSettings = (state as SettingsLoadSuccess).userAppSettings;
142+
final updatedSettings =
143+
currentSettings.copyWith(language: event.language);
144+
await _updateSettings(updatedSettings, emit);
145+
}
12146
}
13147
}

lib/settings/bloc/settings_event.dart

Lines changed: 98 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,102 @@ sealed class SettingsEvent extends Equatable {
44
const SettingsEvent();
55

66
@override
7-
List<Object> get props => [];
7+
List<Object?> get props => [];
8+
}
9+
10+
/// {@template settings_loaded}
11+
/// Event to request loading of user settings.
12+
/// {@endtemplate}
13+
final class SettingsLoaded extends SettingsEvent {
14+
/// {@macro settings_loaded}
15+
const SettingsLoaded({this.userId});
16+
17+
final String? userId;
18+
19+
@override
20+
List<Object?> get props => [userId];
21+
}
22+
23+
/// {@template settings_base_theme_changed}
24+
/// Event to change the base theme.
25+
/// {@endtemplate}
26+
final class SettingsBaseThemeChanged extends SettingsEvent {
27+
/// {@macro settings_base_theme_changed}
28+
const SettingsBaseThemeChanged(this.baseTheme);
29+
30+
/// The new base theme.
31+
final AppBaseTheme baseTheme;
32+
33+
@override
34+
List<Object?> get props => [baseTheme];
35+
}
36+
37+
/// {@template settings_accent_theme_changed}
38+
/// Event to change the accent theme.
39+
/// {@endtemplate}
40+
final class SettingsAccentThemeChanged extends SettingsEvent {
41+
/// {@macro settings_accent_theme_changed}
42+
const SettingsAccentThemeChanged(this.accentTheme);
43+
44+
/// The new accent theme.
45+
final AppAccentTheme accentTheme;
46+
47+
@override
48+
List<Object?> get props => [accentTheme];
49+
}
50+
51+
/// {@template settings_font_family_changed}
52+
/// Event to change the font family.
53+
/// {@endtemplate}
54+
final class SettingsFontFamilyChanged extends SettingsEvent {
55+
/// {@macro settings_font_family_changed}
56+
const SettingsFontFamilyChanged(this.fontFamily);
57+
58+
/// The new font family.
59+
final String fontFamily;
60+
61+
@override
62+
List<Object?> get props => [fontFamily];
63+
}
64+
65+
/// {@template settings_text_scale_factor_changed}
66+
/// Event to change the text scale factor.
67+
/// {@endtemplate}
68+
final class SettingsTextScaleFactorChanged extends SettingsEvent {
69+
/// {@macro settings_text_scale_factor_changed}
70+
const SettingsTextScaleFactorChanged(this.textScaleFactor);
71+
72+
/// The new text scale factor.
73+
final AppTextScaleFactor textScaleFactor;
74+
75+
@override
76+
List<Object?> get props => [textScaleFactor];
77+
}
78+
79+
/// {@template settings_font_weight_changed}
80+
/// Event to change the font weight.
81+
/// {@endtemplate}
82+
final class SettingsFontWeightChanged extends SettingsEvent {
83+
/// {@macro settings_font_weight_changed}
84+
const SettingsFontWeightChanged(this.fontWeight);
85+
86+
/// The new font weight.
87+
final AppFontWeight fontWeight;
88+
89+
@override
90+
List<Object?> get props => [fontWeight];
91+
}
92+
93+
/// {@template settings_language_changed}
94+
/// Event to change the application language.
95+
/// {@endtemplate}
96+
final class SettingsLanguageChanged extends SettingsEvent {
97+
/// {@macro settings_language_changed}
98+
const SettingsLanguageChanged(this.language);
99+
100+
/// The new language.
101+
final AppLanguage language;
102+
103+
@override
104+
List<Object?> get props => [language];
8105
}

lib/settings/bloc/settings_state.dart

Lines changed: 80 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,87 @@ part of 'settings_bloc.dart';
22

33
sealed class SettingsState extends Equatable {
44
const SettingsState();
5-
5+
66
@override
7-
List<Object> get props => [];
7+
List<Object?> get props => [];
88
}
99

10+
/// {@template settings_initial}
11+
/// The initial settings state.
12+
/// {@endtemplate}
1013
final class SettingsInitial extends SettingsState {}
14+
15+
/// {@template settings_load_in_progress}
16+
/// State indicating that user settings are being loaded.
17+
/// {@endtemplate}
18+
final class SettingsLoadInProgress extends SettingsState {}
19+
20+
/// {@template settings_load_success}
21+
/// State indicating that user settings have been successfully loaded.
22+
/// {@endtemplate}
23+
final class SettingsLoadSuccess extends SettingsState {
24+
/// {@macro settings_load_success}
25+
const SettingsLoadSuccess({required this.userAppSettings});
26+
27+
/// The loaded user application settings.
28+
final UserAppSettings userAppSettings;
29+
30+
@override
31+
List<Object?> get props => [userAppSettings];
32+
}
33+
34+
/// {@template settings_load_failure}
35+
/// State indicating that loading user settings failed.
36+
/// {@endtemplate}
37+
final class SettingsLoadFailure extends SettingsState {
38+
/// {@macro settings_load_failure}
39+
const SettingsLoadFailure(this.errorMessage);
40+
41+
/// The error message describing the failure.
42+
final String errorMessage;
43+
44+
@override
45+
List<Object?> get props => [errorMessage];
46+
}
47+
48+
/// {@template settings_update_in_progress}
49+
/// State indicating that user settings are being updated.
50+
/// {@endtemplate}
51+
final class SettingsUpdateInProgress extends SettingsState {
52+
/// {@macro settings_update_in_progress}
53+
const SettingsUpdateInProgress({required this.userAppSettings});
54+
55+
/// The user application settings being updated.
56+
final UserAppSettings userAppSettings;
57+
58+
@override
59+
List<Object?> get props => [userAppSettings];
60+
}
61+
62+
/// {@template settings_update_success}
63+
/// State indicating that user settings have been successfully updated.
64+
/// {@endtemplate}
65+
final class SettingsUpdateSuccess extends SettingsState {
66+
/// {@macro settings_update_success}
67+
const SettingsUpdateSuccess({required this.userAppSettings});
68+
69+
/// The updated user application settings.
70+
final UserAppSettings userAppSettings;
71+
72+
@override
73+
List<Object?> get props => [userAppSettings];
74+
}
75+
76+
/// {@template settings_update_failure}
77+
/// State indicating that updating user settings failed.
78+
/// {@endtemplate}
79+
final class SettingsUpdateFailure extends SettingsState {
80+
/// {@macro settings_update_failure}
81+
const SettingsUpdateFailure(this.errorMessage);
82+
83+
/// The error message describing the failure.
84+
final String errorMessage;
85+
86+
@override
87+
List<Object?> get props => [errorMessage];
88+
}

0 commit comments

Comments
 (0)