appearance.dart 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import 'dart:async';
  2. import 'package:app_flowy/user/application/user_settings_service.dart';
  3. import 'package:equatable/equatable.dart';
  4. import 'package:flowy_infra/theme.dart';
  5. import 'package:flowy_sdk/log.dart';
  6. import 'package:flowy_sdk/protobuf/flowy-user/user_setting.pb.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:easy_localization/easy_localization.dart';
  9. class AppearanceSettingModel extends ChangeNotifier with EquatableMixin {
  10. AppearanceSettingsPB setting;
  11. AppTheme _theme;
  12. Locale _locale;
  13. Timer? _saveOperation;
  14. AppearanceSettingModel(this.setting)
  15. : _theme = AppTheme.fromName(name: setting.theme),
  16. _locale = Locale(setting.locale.languageCode, setting.locale.countryCode);
  17. AppTheme get theme => _theme;
  18. Locale get locale => _locale;
  19. Future<void> save() async {
  20. _saveOperation?.cancel();
  21. _saveOperation = Timer(const Duration(seconds: 2), () async {
  22. await UserSettingsService().setAppearanceSettings(setting);
  23. });
  24. }
  25. @override
  26. List<Object> get props {
  27. return [setting.hashCode];
  28. }
  29. void swapTheme() {
  30. final themeType = (_theme.ty == ThemeType.light ? ThemeType.dark : ThemeType.light);
  31. if (_theme.ty != themeType) {
  32. _theme = AppTheme.fromType(themeType);
  33. setting.theme = themeTypeToString(themeType);
  34. notifyListeners();
  35. save();
  36. }
  37. }
  38. void setLocale(BuildContext context, Locale newLocale) {
  39. if (_locale != newLocale) {
  40. if (!context.supportedLocales.contains(newLocale)) {
  41. Log.warn("Unsupported locale: $newLocale");
  42. newLocale = const Locale('en');
  43. Log.debug("Fallback to locale: $newLocale");
  44. }
  45. context.setLocale(newLocale);
  46. _locale = newLocale;
  47. setting.locale.languageCode = _locale.languageCode;
  48. setting.locale.countryCode = _locale.countryCode ?? "";
  49. notifyListeners();
  50. save();
  51. }
  52. }
  53. void readLocaleWhenAppLaunch(BuildContext context) {
  54. if (setting.resetAsDefault) {
  55. setting.resetAsDefault = false;
  56. save();
  57. setLocale(context, context.deviceLocale);
  58. }
  59. }
  60. }