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-02-01 12:15:11 +08:00
|
|
|
import 'package:async/async.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-02-01 12:15:11 +08:00
|
|
|
CancelableOperation? _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-02-01 12:15:11 +08:00
|
|
|
_saveOperation?.cancel;
|
|
|
|
_saveOperation = CancelableOperation.fromFuture(
|
|
|
|
Future.delayed(const Duration(seconds: 1), () async {
|
2022-03-01 10:31:39 -05:00
|
|
|
await UserSettingsService().setAppearanceSettings(setting);
|
2022-02-01 12:15:11 +08:00
|
|
|
}),
|
|
|
|
);
|
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
|
|
|
}
|