@@ -11,6 +11,21 @@ import '../api/storage/remote/model.dart';
1111
1212part 'settings.mapper.dart' ;
1313
14+ @MappableClass ()
15+ final class Alarm with AlarmMappable {
16+ final DateTime date;
17+ final String title;
18+ final String description;
19+ final bool isActive;
20+
21+ const Alarm ({
22+ required this .date,
23+ this .title = '' ,
24+ this .description = '' ,
25+ this .isActive = true ,
26+ });
27+ }
28+
1429@MappableEnum ()
1530enum ThemeDensity {
1631 system,
@@ -48,16 +63,27 @@ final class ThemeModeMapper extends SimpleMapper<ThemeMode> {
4863
4964@MappableClass (includeCustomMappers: [ThemeModeMapper ()])
5065class FlowSettings with FlowSettingsMappable , LeapSettings {
66+ static const String localeKey = 'locale' ;
5167 final String locale;
68+ static const String themeModeKey = 'themeMode' ;
5269 final ThemeMode themeMode;
70+ static const String nativeTitleBarKey = 'nativeTitleBar' ;
5371 @override
5472 final bool nativeTitleBar;
73+ static const String designKey = 'design' ;
5574 final String design;
75+ static const String syncModeKey = 'syncMode' ;
5676 final SyncMode syncMode;
77+ static const String remotesKey = 'remotes' ;
5778 final List <RemoteStorage > remotes;
79+ static const String startOfWeekKey = 'startOfWeek' ;
5880 final int startOfWeek;
81+ static const String densityKey = 'density' ;
5982 final ThemeDensity density;
83+ static const String highContrastKey = 'highContrast' ;
6084 final bool highContrast;
85+ static const String alarmsKey = 'alarms' ;
86+ final List <Alarm > alarms;
6187
6288 const FlowSettings ({
6389 this .locale = '' ,
@@ -69,39 +95,64 @@ class FlowSettings with FlowSettingsMappable, LeapSettings {
6995 this .startOfWeek = 0 ,
7096 this .density = ThemeDensity .system,
7197 this .highContrast = false ,
98+ this .alarms = const [],
7299 });
73100
74101 factory FlowSettings .fromPrefs (SharedPreferences prefs) => FlowSettings (
75102 themeMode:
76- ThemeMode .values.byName (prefs.getString ('themeMode' ) ?? 'system' ),
77- design: prefs.getString ('design' ) ?? '' ,
78- nativeTitleBar: prefs.getBool ('nativeTitleBar' ) ?? false ,
79- locale: prefs.getString ('locale' ) ?? '' ,
103+ ThemeMode .values.byName (prefs.getString (themeModeKey ) ?? 'system' ),
104+ design: prefs.getString (designKey ) ?? '' ,
105+ nativeTitleBar: prefs.getBool (nativeTitleBarKey ) ?? false ,
106+ locale: prefs.getString (localeKey ) ?? '' ,
80107 syncMode:
81- SyncMode .values.byName (prefs.getString ('syncMode' ) ?? 'noMobile' ),
108+ SyncMode .values.byName (prefs.getString (syncModeKey ) ?? 'noMobile' ),
82109 remotes: prefs
83- .getStringList ('remotes' )
110+ .getStringList (remotesKey )
84111 ? .map ((e) => RemoteStorageMapper .fromJson (e))
85112 .toList () ??
86113 [],
87- startOfWeek: prefs.getInt ('startOfWeek' ) ?? 0 ,
114+ startOfWeek: prefs.getInt (startOfWeekKey ) ?? 0 ,
88115 density:
89- ThemeDensity .values.byName (prefs.getString ('density' ) ?? 'system' ),
90- highContrast: prefs.getBool ('highContrast' ) ?? false ,
116+ ThemeDensity .values.byName (prefs.getString (densityKey) ?? 'system' ),
117+ highContrast: prefs.getBool (highContrastKey) ?? false ,
118+ alarms: prefs
119+ .getStringList (alarmsKey)
120+ ? .map ((e) => AlarmMapper .fromJson (e))
121+ .toList () ??
122+ [],
91123 );
124+ Future <void > saveThemeMode (SharedPreferences prefs) =>
125+ prefs.setString (themeModeKey, themeMode.name);
126+ Future <void > saveDesign (SharedPreferences prefs) =>
127+ prefs.setString (designKey, design);
128+ Future <void > saveNativeTitleBar (SharedPreferences prefs) =>
129+ prefs.setBool (nativeTitleBarKey, nativeTitleBar);
130+ Future <void > saveLocale (SharedPreferences prefs) =>
131+ prefs.setString (localeKey, locale);
132+ Future <void > saveSyncMode (SharedPreferences prefs) =>
133+ prefs.setString (syncModeKey, syncMode.name);
134+ Future <void > saveRemotes (SharedPreferences prefs) => prefs.setStringList (
135+ remotesKey, remotes.map ((e) => json.encode (e.toJson ())).toList ());
136+ Future <void > saveStartOfWeek (SharedPreferences prefs) =>
137+ prefs.setInt (startOfWeekKey, startOfWeek);
138+ Future <void > saveDensity (SharedPreferences prefs) =>
139+ prefs.setString (densityKey, density.name);
140+ Future <void > saveHighContrast (SharedPreferences prefs) =>
141+ prefs.setBool (highContrastKey, highContrast);
142+ Future <void > saveAlarms (SharedPreferences prefs) => prefs.setStringList (
143+ alarmsKey, alarms.map ((e) => json.encode (e.toJson ())).toList ());
92144
93- Future <void > save () async {
94- final prefs = await SharedPreferences .getInstance ();
95- await prefs.setString ('themeMode' , themeMode.name);
96- await prefs.setString ('design' , design);
97- await prefs.setBool ('nativeTitleBar' , nativeTitleBar);
98- await prefs.setString ('locale' , locale);
99- await prefs.setString ('syncMode' , syncMode.name);
100- await prefs.setStringList (
101- 'remotes' , remotes.map ((e) => json.encode (e.toJson ())).toList ());
102- await prefs.setInt ('startOfWeek' , startOfWeek);
103- await prefs.setString ('density' , density.name);
104- await prefs.setBool ('highContrast' , highContrast);
145+ Future <void > save (SharedPreferences prefs) async {
146+ await saveThemeMode (prefs);
147+ await saveDesign (prefs);
148+ await saveNativeTitleBar (prefs);
149+ await saveLocale (prefs);
150+ await saveSyncMode (prefs);
151+ await saveRemotes (prefs);
152+ await saveStartOfWeek (prefs);
153+ await saveDensity (prefs);
154+ await saveHighContrast (prefs);
155+ await saveAlarms (prefs);
105156 }
106157}
107158
@@ -114,67 +165,103 @@ class SettingsCubit extends Cubit<FlowSettings>
114165 with LeapSettingsBlocBaseMixin <FlowSettings > {
115166 SettingsCubit (SharedPreferences prefs) : super (FlowSettings .fromPrefs (prefs));
116167
168+ Future <void > _runSave (
169+ Future <void > Function (SharedPreferences prefs) save) async {
170+ final prefs = await SharedPreferences .getInstance ();
171+ await save (prefs);
172+ }
173+
117174 Future <void > changeThemeMode (ThemeMode mode) {
118175 emit (state.copyWith (themeMode: mode));
119- return state.save ( );
176+ return _runSave ( state.saveThemeMode );
120177 }
121178
122179 Future <void > changeDesign (String design) {
123- emit (state.copyWith (design: design));
124- return state.save ();
180+ final newState = state.copyWith (design: design);
181+ emit (newState);
182+ return _runSave (newState.saveDesign);
125183 }
126184
127185 Future <void > changeNativeTitleBar (bool nativeTitleBar) {
128- emit (state.copyWith (nativeTitleBar: nativeTitleBar));
129- return state.save ();
186+ final newState = state.copyWith (nativeTitleBar: nativeTitleBar);
187+ emit (newState);
188+ return _runSave (newState.saveNativeTitleBar);
130189 }
131190
132191 Future <void > changeLocale (String locale) {
133- emit (state.copyWith (locale: locale));
134- return state.save ();
192+ final newState = state.copyWith (locale: locale);
193+ emit (newState);
194+ return _runSave (newState.saveLocale);
135195 }
136196
137197 Future <void > changeSyncMode (SyncMode syncMode) {
138- emit (state.copyWith (syncMode: syncMode));
139- return state.save ();
198+ final newState = state.copyWith (syncMode: syncMode);
199+ emit (newState);
200+ return _runSave (newState.saveSyncMode);
140201 }
141202
142203 Future <void > addStorage (RemoteStorage remoteStorage) {
143- emit (state.copyWith (remotes: [...state.remotes, remoteStorage]));
144- return state.save ();
204+ final newState = state.copyWith (remotes: [...state.remotes, remoteStorage]);
205+ emit (newState);
206+ return _runSave (newState.saveRemotes);
145207 }
146208
147209 RemoteStorage ? getStorage (String name) {
148210 return state.remotes.firstWhereOrNull ((e) => e.identifier == name);
149211 }
150212
151213 Future <void > removeStorage (String name) {
152- emit (state.copyWith (
153- remotes: state.remotes.where ((e) => e.toFilename () != name).toList ()));
154- return state.save ();
214+ final newState = state.copyWith (
215+ remotes: state.remotes.where ((e) => e.toFilename () != name).toList ());
216+ emit (newState);
217+ return _runSave (newState.saveRemotes);
155218 }
156219
157220 Future <void > changeStartOfWeek (int startOfWeek) {
158- emit (state.copyWith (startOfWeek: startOfWeek));
159- return state.save ();
221+ final newState = state.copyWith (startOfWeek: startOfWeek);
222+ emit (newState);
223+ return _runSave (newState.saveStartOfWeek);
160224 }
161225
162226 Future <void > changeDensity (ThemeDensity density) {
163- emit (state.copyWith (density: density));
164- return state.save ();
227+ final newState = state.copyWith (density: density);
228+ emit (newState);
229+ return _runSave (newState.saveDensity);
165230 }
166231
167232 Future <void > changeHighContrast (bool highContrast) {
168- emit (state.copyWith (highContrast: highContrast));
169- return state.save ();
233+ final newState = state.copyWith (highContrast: highContrast);
234+ emit (newState);
235+ return _runSave (newState.saveHighContrast);
236+ }
237+
238+ Future <void > addAlarm (Alarm alarm) {
239+ final newState = state.copyWith (alarms: [...state.alarms, alarm]);
240+ emit (newState);
241+ return _runSave (newState.saveAlarms);
242+ }
243+
244+ Future <void > removeAlarm (Alarm alarm) {
245+ final newState =
246+ state.copyWith (alarms: state.alarms.where ((e) => e != alarm).toList ());
247+ emit (newState);
248+ return _runSave (newState.saveAlarms);
249+ }
250+
251+ Future <void > changeAlarm (int index, Alarm alarm) {
252+ final newState = state.copyWith (
253+ alarms:
254+ state.alarms.mapIndexed ((i, e) => i == index ? alarm : e).toList ());
255+ emit (newState);
256+ return _runSave (newState.saveAlarms);
170257 }
171258
172259 Future <void > importSettings (String data) {
173260 final settings = FlowSettingsMapper .fromJson (data).copyWith (
174261 remotes: state.remotes,
175262 );
176263 emit (settings);
177- return state .save ( );
264+ return _runSave (settings .save);
178265 }
179266
180267 Future <String > exportSettings () async {
0 commit comments