| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  | import 'dart:async'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-01 10:31:39 -05:00
										 |  |  | import 'package:app_flowy/user/application/user_settings_service.dart'; | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  | import 'package:equatable/equatable.dart'; | 
					
						
							|  |  |  | import 'package:flowy_infra/theme.dart'; | 
					
						
							| 
									
										
										
										
											2022-02-19 13:52:52 +08:00
										 |  |  | import 'package:flowy_sdk/log.dart'; | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  | import 'package:flowy_sdk/protobuf/flowy-user-data-model/user_setting.pb.dart'; | 
					
						
							|  |  |  | import 'package:flutter/material.dart'; | 
					
						
							| 
									
										
										
										
											2022-01-29 09:24:04 +08:00
										 |  |  | import 'package:easy_localization/easy_localization.dart'; | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class AppearanceSettingModel extends ChangeNotifier with EquatableMixin { | 
					
						
							|  |  |  |   AppearanceSettings setting; | 
					
						
							|  |  |  |   AppTheme _theme; | 
					
						
							| 
									
										
										
										
											2022-02-04 15:45:06 -05:00
										 |  |  |   Locale _locale; | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  |   Timer? _saveOperation; | 
					
						
							| 
									
										
										
										
											2022-01-28 21:10:13 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |   AppearanceSettingModel(this.setting) | 
					
						
							|  |  |  |       : _theme = AppTheme.fromName(name: setting.theme), | 
					
						
							| 
									
										
										
										
											2022-02-04 15:45:06 -05:00
										 |  |  |         _locale = Locale(setting.locale.languageCode, setting.locale.countryCode); | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   AppTheme get theme => _theme; | 
					
						
							| 
									
										
										
										
											2022-02-04 15:45:06 -05:00
										 |  |  |   Locale get locale => _locale; | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   Future<void> save() async { | 
					
						
							| 
									
										
										
										
											2022-03-20 17:17:06 +08:00
										 |  |  |     _saveOperation?.cancel(); | 
					
						
							|  |  |  |     _saveOperation = Timer(const Duration(seconds: 2), () async { | 
					
						
							|  |  |  |       await UserSettingsService().setAppearanceSettings(setting); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   List<Object> get props { | 
					
						
							|  |  |  |     return [setting.hashCode]; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void swapTheme() { | 
					
						
							|  |  |  |     final themeType = (_theme.ty == ThemeType.light ? ThemeType.dark : ThemeType.light); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (_theme.ty != themeType) { | 
					
						
							|  |  |  |       _theme = AppTheme.fromType(themeType); | 
					
						
							|  |  |  |       setting.theme = themeTypeToString(themeType); | 
					
						
							|  |  |  |       notifyListeners(); | 
					
						
							|  |  |  |       save(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 15:45:06 -05:00
										 |  |  |   void setLocale(BuildContext context, Locale newLocale) { | 
					
						
							|  |  |  |     if (_locale != newLocale) { | 
					
						
							| 
									
										
										
										
											2022-02-05 21:50:49 +08:00
										 |  |  |       if (!context.supportedLocales.contains(newLocale)) { | 
					
						
							| 
									
										
										
										
											2022-03-01 10:25:21 +08:00
										 |  |  |         Log.warn("Unsupported locale: $newLocale"); | 
					
						
							| 
									
										
										
										
											2022-02-05 21:50:49 +08:00
										 |  |  |         newLocale = const Locale('en'); | 
					
						
							| 
									
										
										
										
											2022-02-05 21:50:49 +08:00
										 |  |  |         Log.debug("Fallback to locale: $newLocale"); | 
					
						
							| 
									
										
										
										
											2022-02-05 21:50:49 +08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 15:45:06 -05:00
										 |  |  |       context.setLocale(newLocale); | 
					
						
							|  |  |  |       _locale = newLocale; | 
					
						
							|  |  |  |       setting.locale.languageCode = _locale.languageCode; | 
					
						
							|  |  |  |       setting.locale.countryCode = _locale.countryCode ?? ""; | 
					
						
							| 
									
										
										
										
											2022-01-28 18:48:09 +08:00
										 |  |  |       notifyListeners(); | 
					
						
							|  |  |  |       save(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-02-01 09:12:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-01 12:15:11 +08:00
										 |  |  |   void readLocaleWhenAppLaunch(BuildContext context) { | 
					
						
							|  |  |  |     if (setting.resetAsDefault) { | 
					
						
							|  |  |  |       setting.resetAsDefault = false; | 
					
						
							|  |  |  |       save(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 15:45:06 -05:00
										 |  |  |       setLocale(context, context.deviceLocale); | 
					
						
							| 
									
										
										
										
											2022-02-01 12:15:11 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-02-01 09:12:59 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-01-28 18:34:21 +08:00
										 |  |  | } |