TF-3977 Add disable spam banner in preferences setting
This commit is contained in:
@@ -1,6 +0,0 @@
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_detail/thread_detail_local_setting_detail.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
|
||||
|
||||
extension LocalSettingsMapExtension on Map<SupportedLocalSetting, LocalSettingOptions?> {
|
||||
bool? get threadDetailEnabled => (this[SupportedLocalSetting.threadDetail]?.setting as ThreadDetailLocalSettingDetail?)?.value;
|
||||
}
|
||||
@@ -3,7 +3,7 @@ import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/local/local_setting_cache_manager.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/identities/identity_bindings.dart';
|
||||
@@ -36,7 +36,7 @@ class ManageAccountDashBoardBindings extends BaseBindings {
|
||||
void bindingsDataSourceImpl() {
|
||||
Get.lazyPut(() => ManageAccountDataSourceImpl(
|
||||
Get.find<LanguageCacheManager>(),
|
||||
Get.find<LocalSettingCacheManager>(),
|
||||
Get.find<PreferencesSettingManager>(),
|
||||
Get.find<CacheExceptionThrower>()));
|
||||
}
|
||||
|
||||
|
||||
-32
@@ -1,32 +0,0 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_detail/thread_detail_local_setting_detail.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
|
||||
|
||||
abstract class LocalSettingDetail<T> extends Equatable {
|
||||
const LocalSettingDetail(this.value);
|
||||
|
||||
final T value;
|
||||
|
||||
Map<String, dynamic> toJson();
|
||||
}
|
||||
|
||||
class LocalSettingDetailConverter extends JsonConverter<LocalSettingDetail, Map<String, dynamic>> {
|
||||
const LocalSettingDetailConverter();
|
||||
|
||||
@override
|
||||
LocalSettingDetail fromJson(Map<String, dynamic> json) {
|
||||
final type = json['type'] as String?;
|
||||
|
||||
if (type == SupportedLocalSetting.threadDetail.name) {
|
||||
return ThreadDetailLocalSettingDetail.fromJson(json);
|
||||
}
|
||||
|
||||
throw UnimplementedError();
|
||||
}
|
||||
|
||||
@override
|
||||
Map<String, dynamic> toJson(LocalSettingDetail object) {
|
||||
return object.toJson();
|
||||
}
|
||||
}
|
||||
-24
@@ -1,24 +0,0 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_detail/local_setting_detail.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
|
||||
|
||||
part 'thread_detail_local_setting_detail.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class ThreadDetailLocalSettingDetail extends LocalSettingDetail<bool> {
|
||||
const ThreadDetailLocalSettingDetail(
|
||||
super.value, [
|
||||
this.type = SupportedLocalSetting.threadDetail,
|
||||
]);
|
||||
|
||||
@JsonKey(defaultValue: SupportedLocalSetting.threadDetail)
|
||||
final SupportedLocalSetting type;
|
||||
|
||||
factory ThreadDetailLocalSettingDetail.fromJson(Map<String, dynamic> json) =>
|
||||
_$ThreadDetailLocalSettingDetailFromJson(json);
|
||||
@override
|
||||
Map<String, dynamic> toJson() => _$ThreadDetailLocalSettingDetailToJson(this);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [value, type];
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_detail/local_setting_detail.dart';
|
||||
|
||||
part 'local_setting_options.g.dart';
|
||||
|
||||
enum SupportedLocalSetting {
|
||||
threadDetail,
|
||||
}
|
||||
|
||||
@JsonSerializable(converters: [LocalSettingDetailConverter()])
|
||||
class LocalSettingOptions with EquatableMixin {
|
||||
const LocalSettingOptions({
|
||||
required this.setting,
|
||||
});
|
||||
|
||||
final LocalSettingDetail? setting;
|
||||
|
||||
factory LocalSettingOptions.fromJson(Map<String, dynamic> json) =>
|
||||
_$LocalSettingOptionsFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$LocalSettingOptionsToJson(this);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [setting];
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_setting.dart';
|
||||
|
||||
part 'preferences_root.g.dart';
|
||||
|
||||
@JsonSerializable(explicitToJson: true)
|
||||
class PreferencesRoot with EquatableMixin {
|
||||
final PreferencesSetting setting;
|
||||
|
||||
PreferencesRoot({required this.setting});
|
||||
|
||||
factory PreferencesRoot.initial() {
|
||||
return PreferencesRoot(
|
||||
setting: PreferencesSetting.initial(),
|
||||
);
|
||||
}
|
||||
|
||||
factory PreferencesRoot.fromJson(Map<String, dynamic> json) =>
|
||||
_$PreferencesRootFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$PreferencesRootToJson(this);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [setting];
|
||||
}
|
||||
|
||||
extension PreferencesRootExtension on PreferencesRoot {
|
||||
PreferencesRoot copyWith({PreferencesSetting? setting}) {
|
||||
return PreferencesRoot(
|
||||
setting: setting ?? this.setting,
|
||||
);
|
||||
}
|
||||
|
||||
PreferencesRoot updateThreadDetail(bool enabled) {
|
||||
return copyWith(setting: setting.updateThreadDetail(enabled));
|
||||
}
|
||||
|
||||
PreferencesRoot updateSpamReport({
|
||||
bool? isEnabled,
|
||||
int? lastTimeDismissedMilliseconds,
|
||||
}) {
|
||||
return copyWith(
|
||||
setting: setting.updateSpamReport(
|
||||
isEnabled: isEnabled,
|
||||
lastTimeDismissedMilliseconds: lastTimeDismissedMilliseconds,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/spam_report_config.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/thread_detail_config.dart';
|
||||
|
||||
part 'preferences_setting.g.dart';
|
||||
|
||||
@JsonSerializable(explicitToJson: true)
|
||||
class PreferencesSetting with EquatableMixin {
|
||||
final ThreadDetailConfig threadDetail;
|
||||
final SpamReportConfig spamReport;
|
||||
|
||||
PreferencesSetting({
|
||||
required this.threadDetail,
|
||||
required this.spamReport,
|
||||
});
|
||||
|
||||
factory PreferencesSetting.initial() {
|
||||
return PreferencesSetting(
|
||||
threadDetail: ThreadDetailConfig.initial(),
|
||||
spamReport: SpamReportConfig.initial(),
|
||||
);
|
||||
}
|
||||
|
||||
factory PreferencesSetting.fromJson(Map<String, dynamic> json) =>
|
||||
_$PreferencesSettingFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$PreferencesSettingToJson(this);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [threadDetail, spamReport];
|
||||
}
|
||||
|
||||
extension PreferencesSettingExtension on PreferencesSetting {
|
||||
PreferencesSetting copyWith({
|
||||
ThreadDetailConfig? threadDetail,
|
||||
SpamReportConfig? spamReport,
|
||||
}) {
|
||||
return PreferencesSetting(
|
||||
threadDetail: threadDetail ?? this.threadDetail,
|
||||
spamReport: spamReport ?? this.spamReport,
|
||||
);
|
||||
}
|
||||
|
||||
PreferencesSetting updateThreadDetail(bool enabled) {
|
||||
return copyWith(threadDetail: threadDetail.copyWith(isEnabled: enabled));
|
||||
}
|
||||
|
||||
PreferencesSetting updateSpamReport({
|
||||
bool? isEnabled,
|
||||
int? lastTimeDismissedMilliseconds,
|
||||
}) {
|
||||
return copyWith(
|
||||
spamReport: spamReport.copyWith(
|
||||
isEnabled: isEnabled ?? spamReport.isEnabled,
|
||||
lastTimeDismissedMilliseconds: lastTimeDismissedMilliseconds ??
|
||||
spamReport.lastTimeDismissedMilliseconds,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
|
||||
|
||||
part 'spam_report_config.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class SpamReportConfig with EquatableMixin {
|
||||
final bool isEnabled;
|
||||
final int lastTimeDismissedMilliseconds;
|
||||
|
||||
SpamReportConfig({
|
||||
this.isEnabled = true,
|
||||
this.lastTimeDismissedMilliseconds = 0,
|
||||
});
|
||||
|
||||
factory SpamReportConfig.initial() {
|
||||
return SpamReportConfig(
|
||||
isEnabled: true,
|
||||
lastTimeDismissedMilliseconds: 0,
|
||||
);
|
||||
}
|
||||
|
||||
factory SpamReportConfig.fromJson(Map<String, dynamic> json) =>
|
||||
_$SpamReportConfigFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SpamReportConfigToJson(this);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isEnabled, lastTimeDismissedMilliseconds];
|
||||
}
|
||||
|
||||
extension SpamReportConfigExtension on SpamReportConfig {
|
||||
SpamReportConfig copyWith({
|
||||
bool? isEnabled,
|
||||
int? lastTimeDismissedMilliseconds,
|
||||
}) {
|
||||
return SpamReportConfig(
|
||||
isEnabled: isEnabled ?? this.isEnabled,
|
||||
lastTimeDismissedMilliseconds:
|
||||
lastTimeDismissedMilliseconds ?? this.lastTimeDismissedMilliseconds,
|
||||
);
|
||||
}
|
||||
|
||||
SpamReportState get spamReportState =>
|
||||
isEnabled ? SpamReportState.enabled : SpamReportState.disabled;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'thread_detail_config.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class ThreadDetailConfig with EquatableMixin {
|
||||
final bool isEnabled;
|
||||
|
||||
ThreadDetailConfig({this.isEnabled = false});
|
||||
|
||||
factory ThreadDetailConfig.initial() {
|
||||
return ThreadDetailConfig(
|
||||
isEnabled: false,
|
||||
);
|
||||
}
|
||||
|
||||
factory ThreadDetailConfig.fromJson(Map<String, dynamic> json) =>
|
||||
_$ThreadDetailConfigFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$ThreadDetailConfigToJson(this);
|
||||
|
||||
@override
|
||||
List<Object> get props => [isEnabled];
|
||||
}
|
||||
|
||||
extension ThreadDetailConfigExtension on ThreadDetailConfig {
|
||||
ThreadDetailConfig copyWith({bool? isEnabled}) {
|
||||
return ThreadDetailConfig(
|
||||
isEnabled: isEnabled ?? this.isEnabled,
|
||||
);
|
||||
}
|
||||
}
|
||||
+32
-27
@@ -1,66 +1,71 @@
|
||||
|
||||
import 'package:server_settings/server_settings/tmail_server_settings.dart';
|
||||
import 'package:server_settings/server_settings/tmail_server_settings_extension.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/local_settings_map_extension.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_setting.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
|
||||
enum SettingOptionType {
|
||||
readReceipt,
|
||||
senderPriority,
|
||||
thread;
|
||||
enum PreferencesOptionType {
|
||||
readReceipt(isLocal: false),
|
||||
senderPriority(isLocal: false),
|
||||
thread(isLocal: true),
|
||||
spamReport(isLocal: true);
|
||||
|
||||
final bool isLocal;
|
||||
|
||||
const PreferencesOptionType({required this.isLocal});
|
||||
|
||||
String getTitle(AppLocalizations appLocalizations) {
|
||||
switch(this) {
|
||||
case SettingOptionType.readReceipt:
|
||||
case PreferencesOptionType.readReceipt:
|
||||
return appLocalizations.emailReadReceipts;
|
||||
case SettingOptionType.senderPriority:
|
||||
case PreferencesOptionType.senderPriority:
|
||||
return appLocalizations.senderSetImportantFlag;
|
||||
case SettingOptionType.thread:
|
||||
case PreferencesOptionType.thread:
|
||||
return appLocalizations.thread;
|
||||
case PreferencesOptionType.spamReport:
|
||||
return appLocalizations.spamReports;
|
||||
}
|
||||
}
|
||||
|
||||
String getExplanation(AppLocalizations appLocalizations) {
|
||||
switch(this) {
|
||||
case SettingOptionType.readReceipt:
|
||||
case PreferencesOptionType.readReceipt:
|
||||
return appLocalizations.emailReadReceiptsSettingExplanation;
|
||||
case SettingOptionType.senderPriority:
|
||||
case PreferencesOptionType.senderPriority:
|
||||
return appLocalizations.senderImportantSettingExplanation;
|
||||
case SettingOptionType.thread:
|
||||
case PreferencesOptionType.thread:
|
||||
return appLocalizations.threadSettingExplanation;
|
||||
case PreferencesOptionType.spamReport:
|
||||
return appLocalizations.spamReportsSettingExplanation;
|
||||
}
|
||||
}
|
||||
|
||||
String getToggleDescription(AppLocalizations appLocalizations) {
|
||||
switch(this) {
|
||||
case SettingOptionType.readReceipt:
|
||||
case PreferencesOptionType.readReceipt:
|
||||
return appLocalizations.emailReadReceiptsToggleDescription;
|
||||
case SettingOptionType.senderPriority:
|
||||
case PreferencesOptionType.senderPriority:
|
||||
return appLocalizations.senderImportantSettingToggleDescription;
|
||||
case SettingOptionType.thread:
|
||||
case PreferencesOptionType.thread:
|
||||
return appLocalizations.threadToggleDescription;
|
||||
case PreferencesOptionType.spamReport:
|
||||
return appLocalizations.spamReportToggleDescription;
|
||||
}
|
||||
}
|
||||
|
||||
bool isEnabled(
|
||||
TMailServerSettingOptions? settingOption,
|
||||
Map<SupportedLocalSetting, LocalSettingOptions?> localSettings,
|
||||
PreferencesSetting preferencesSetting,
|
||||
) {
|
||||
switch(this) {
|
||||
case SettingOptionType.readReceipt:
|
||||
case PreferencesOptionType.readReceipt:
|
||||
return settingOption?.isAlwaysReadReceipts ?? false;
|
||||
case SettingOptionType.senderPriority:
|
||||
case PreferencesOptionType.senderPriority:
|
||||
return settingOption?.isDisplaySenderPriority ?? false;
|
||||
case SettingOptionType.thread:
|
||||
return localSettings.threadDetailEnabled ?? false;
|
||||
case PreferencesOptionType.thread:
|
||||
return preferencesSetting.threadDetail.isEnabled;
|
||||
case PreferencesOptionType.spamReport:
|
||||
return preferencesSetting.spamReport.isEnabled;
|
||||
}
|
||||
}
|
||||
|
||||
bool get isLocal {
|
||||
return switch (this) {
|
||||
thread => true,
|
||||
_ => false,
|
||||
};
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -3,7 +3,7 @@ import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_manager.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/local/local_setting_cache_manager.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/local/preferences_setting_manager.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/data/repository/manage_account_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/save_language_interactor.dart';
|
||||
@@ -43,7 +43,7 @@ class PreferencesInteractorsBindings extends InteractorsBindings {
|
||||
), tag: composerId);
|
||||
Get.lazyPut(() => ManageAccountDataSourceImpl(
|
||||
Get.find<LanguageCacheManager>(),
|
||||
Get.find<LocalSettingCacheManager>(),
|
||||
Get.find<PreferencesSettingManager>(),
|
||||
Get.find<CacheExceptionThrower>(),
|
||||
), tag: composerId);
|
||||
}
|
||||
|
||||
@@ -10,9 +10,8 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/update_local_
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_local_settings_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/update_local_settings_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_detail/thread_detail_local_setting_detail.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/setting_option_type.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_root.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart';
|
||||
import 'package:tmail_ui_user/features/server_settings/domain/state/get_server_setting_state.dart';
|
||||
import 'package:tmail_ui_user/features/server_settings/domain/state/update_server_setting_state.dart';
|
||||
import 'package:tmail_ui_user/features/server_settings/domain/usecases/get_server_setting_interactor.dart';
|
||||
@@ -34,7 +33,7 @@ class PreferencesController extends BaseController {
|
||||
final UpdateLocalSettingsInteractor _updateLocalSettingsInteractor;
|
||||
|
||||
final settingOption = Rxn<TMailServerSettingOptions>();
|
||||
final localSettings = Rxn(<SupportedLocalSetting, LocalSettingOptions?>{});
|
||||
final localSettings = Rxn<PreferencesRoot>();
|
||||
|
||||
bool get isLoading => viewState.value.fold(
|
||||
(failure) => false,
|
||||
@@ -55,13 +54,9 @@ class PreferencesController extends BaseController {
|
||||
} else if (success is UpdateServerSettingSuccess) {
|
||||
_updateSettingOptionValue(newSettingOption: success.settingOption);
|
||||
} else if (success is GetLocalSettingsSuccess) {
|
||||
_updateLocalSettingOptionValue(
|
||||
newLocalSettings: success.localSettings,
|
||||
);
|
||||
_updateLocalSettingOptionValue(success.preferencesRoot);
|
||||
} else if (success is UpdateLocalSettingsSuccess) {
|
||||
_updateLocalSettingOptionValue(
|
||||
newLocalSettings: success.localSettings,
|
||||
);
|
||||
_updateLocalSettingOptionValue(success.preferencesRoot);
|
||||
} else {
|
||||
super.handleSuccessViewState(success);
|
||||
}
|
||||
@@ -90,49 +85,68 @@ class PreferencesController extends BaseController {
|
||||
settingOption.value = newSettingOption;
|
||||
}
|
||||
|
||||
void _updateLocalSettingOptionValue({
|
||||
required Map<SupportedLocalSetting, LocalSettingOptions?> newLocalSettings
|
||||
}) {
|
||||
localSettings.value = newLocalSettings;
|
||||
void _updateLocalSettingOptionValue(PreferencesRoot preferencesRoot) {
|
||||
localSettings.value = preferencesRoot;
|
||||
}
|
||||
|
||||
void _getSettingOption() {
|
||||
consumeState(_getLocalSettingInteractor.execute(SupportedLocalSetting.values));
|
||||
consumeState(_getLocalSettingInteractor.execute());
|
||||
final accountId = _manageAccountDashBoardController.accountId.value;
|
||||
if (accountId != null) {
|
||||
consumeState(_getServerSettingInteractor.execute(accountId));
|
||||
} else {
|
||||
consumeState(Stream.value(Left(GetServerSettingFailure(NotFoundAccountIdException()))));
|
||||
consumeState(Stream.value(Left(GetLocalSettingsFailure(
|
||||
exception: NotFoundAccountIdException(),
|
||||
))));
|
||||
}
|
||||
}
|
||||
|
||||
void updateStateSettingOption(SettingOptionType optionType, bool isEnabled) {
|
||||
void updateStateSettingOption(
|
||||
PreferencesOptionType optionType,
|
||||
bool isEnabled,
|
||||
) {
|
||||
if (optionType.isLocal) {
|
||||
Map<SupportedLocalSetting, LocalSettingOptions?> newLocalSettings = {};
|
||||
switch(optionType) {
|
||||
case SettingOptionType.thread:
|
||||
var currentLocalSettings = Map<SupportedLocalSetting, LocalSettingOptions?>.from(localSettings.value ?? {});
|
||||
currentLocalSettings[SupportedLocalSetting.threadDetail] = LocalSettingOptions(setting: ThreadDetailLocalSettingDetail(!isEnabled));
|
||||
newLocalSettings = currentLocalSettings;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
consumeState(_updateLocalSettingsInteractor.execute(newLocalSettings));
|
||||
return;
|
||||
_updateLocalPreferencesSetting(optionType, isEnabled);
|
||||
} else {
|
||||
_updateServerPreferencesSetting(optionType, isEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
void _updateLocalPreferencesSetting(
|
||||
PreferencesOptionType optionType,
|
||||
bool isEnabled,
|
||||
) {
|
||||
PreferencesRoot? preferencesRoot;
|
||||
switch(optionType) {
|
||||
case PreferencesOptionType.thread:
|
||||
preferencesRoot = localSettings.value?.updateThreadDetail(
|
||||
!isEnabled,
|
||||
);
|
||||
break;
|
||||
case PreferencesOptionType.spamReport:
|
||||
preferencesRoot = localSettings.value?.updateSpamReport(
|
||||
isEnabled: !isEnabled,
|
||||
);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (preferencesRoot != null) {
|
||||
consumeState(_updateLocalSettingsInteractor.execute(preferencesRoot));
|
||||
}
|
||||
}
|
||||
|
||||
void _updateServerPreferencesSetting(
|
||||
PreferencesOptionType optionType,
|
||||
bool isEnabled,
|
||||
) {
|
||||
TMailServerSettingOptions? newSettingOption;
|
||||
switch(optionType) {
|
||||
case SettingOptionType.readReceipt:
|
||||
case PreferencesOptionType.readReceipt:
|
||||
newSettingOption = settingOption.value?.copyWith(
|
||||
alwaysReadReceipts: !isEnabled,
|
||||
);
|
||||
break;
|
||||
case SettingOptionType.senderPriority:
|
||||
case PreferencesOptionType.senderPriority:
|
||||
newSettingOption = settingOption.value?.copyWith(
|
||||
displaySenderPriority: !isEnabled,
|
||||
);
|
||||
@@ -143,12 +157,18 @@ class PreferencesController extends BaseController {
|
||||
|
||||
final accountId = _manageAccountDashBoardController.accountId.value;
|
||||
if (accountId != null && newSettingOption != null) {
|
||||
consumeState(_updateServerSettingInteractor.execute(
|
||||
accountId,
|
||||
newSettingOption,
|
||||
));
|
||||
consumeState(
|
||||
_updateServerSettingInteractor.execute(
|
||||
accountId,
|
||||
newSettingOption,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
consumeState(Stream.value(Left(UpdateServerSettingFailure(NotFoundAccountIdException()))));
|
||||
consumeState(
|
||||
Stream.value(
|
||||
Left(UpdateServerSettingFailure(NotFoundAccountIdException())),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,9 @@ import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/base/setting_detail_view_builder.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/setting_option_type.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/preferences_controller.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/widgets/setting_option_item.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/preferences/widgets/preferences_option_item.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/widgets/setting_header_widget.dart';
|
||||
|
||||
class PreferencesView extends GetWidget<PreferencesController> with AppLoaderMixin {
|
||||
@@ -57,31 +57,33 @@ class PreferencesView extends GetWidget<PreferencesController> with AppLoaderMix
|
||||
),
|
||||
Obx(() {
|
||||
final settingOption = controller.settingOption.value;
|
||||
final localSettingOption = controller.localSettings;
|
||||
final localSettingOption = controller.localSettings.value;
|
||||
|
||||
if (settingOption == null && (localSettingOption.value?.isEmpty ?? true)) {
|
||||
if (settingOption == null && localSettingOption == null) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
final availableSettingOptions = [
|
||||
if (settingOption != null) ...SettingOptionType.values.where(
|
||||
(optionType) => !optionType.isLocal,
|
||||
),
|
||||
...SettingOptionType.values.where(
|
||||
(optionType) => optionType.isLocal,
|
||||
),
|
||||
if (settingOption != null)
|
||||
...PreferencesOptionType.values.where(
|
||||
(optionType) => !optionType.isLocal,
|
||||
),
|
||||
if (localSettingOption != null)
|
||||
...PreferencesOptionType.values.where(
|
||||
(optionType) => optionType.isLocal,
|
||||
),
|
||||
];
|
||||
|
||||
return Expanded(
|
||||
child: ListView.separated(
|
||||
itemCount: availableSettingOptions.length,
|
||||
itemBuilder: (context, index) {
|
||||
return SettingOptionItem(
|
||||
return PreferencesOptionItem(
|
||||
imagePaths: controller.imagePaths,
|
||||
settingOption: settingOption,
|
||||
localSettings: localSettingOption.value ?? {},
|
||||
preferencesSetting: localSettingOption!.setting,
|
||||
optionType: availableSettingOptions[index],
|
||||
onTapSettingOptionAction: controller.updateStateSettingOption,
|
||||
onTapPreferencesOptionAction: controller.updateStateSettingOption,
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, __) => const SizedBox(height: 49),
|
||||
|
||||
+14
-12
@@ -6,25 +6,27 @@ import 'package:server_settings/server_settings/tmail_server_settings.dart';
|
||||
import 'package:tmail_ui_user/features/base/widget/default_switch_icon_widget.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/local_setting_options.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/setting_option_type.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences/preferences_setting.dart';
|
||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/preferences_option_type.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
|
||||
typedef OnTapSettingOptionAction = Function(SettingOptionType optionType, bool isEnabled);
|
||||
typedef OnTapPreferencesOptionAction = Function(PreferencesOptionType optionType, bool isEnabled);
|
||||
|
||||
class SettingOptionItem extends StatelessWidget {
|
||||
class PreferencesOptionItem extends StatelessWidget {
|
||||
|
||||
final ImagePaths imagePaths;
|
||||
final TMailServerSettingOptions? settingOption;
|
||||
final Map<SupportedLocalSetting, LocalSettingOptions?> localSettings;
|
||||
final SettingOptionType optionType;
|
||||
final OnTapSettingOptionAction onTapSettingOptionAction;
|
||||
final PreferencesSetting preferencesSetting;
|
||||
final PreferencesOptionType optionType;
|
||||
final OnTapPreferencesOptionAction onTapPreferencesOptionAction;
|
||||
|
||||
const SettingOptionItem({
|
||||
const PreferencesOptionItem({
|
||||
super.key,
|
||||
required this.imagePaths,
|
||||
required this.settingOption,
|
||||
required this.localSettings,
|
||||
required this.preferencesSetting,
|
||||
required this.optionType,
|
||||
required this.onTapSettingOptionAction,
|
||||
required this.onTapPreferencesOptionAction,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -60,18 +62,18 @@ class SettingOptionItem extends StatelessWidget {
|
||||
children: [
|
||||
InkWell(
|
||||
key: ValueKey(optionType.getTitle(appLocalizations)),
|
||||
onTap: () => onTapSettingOptionAction(
|
||||
onTap: () => onTapPreferencesOptionAction(
|
||||
optionType,
|
||||
optionType.isEnabled(settingOption, localSettings),
|
||||
optionType.isEnabled(settingOption, preferencesSetting),
|
||||
),
|
||||
child: DefaultSwitchIconWidget(
|
||||
key: ValueKey(
|
||||
optionType.isEnabled(settingOption, localSettings)
|
||||
optionType.isEnabled(settingOption, preferencesSetting)
|
||||
? 'setting_option_switch_on'
|
||||
: 'setting_option_switch_off',
|
||||
),
|
||||
imagePaths: imagePaths,
|
||||
isEnabled: optionType.isEnabled(settingOption, localSettings),
|
||||
isEnabled: optionType.isEnabled(settingOption, preferencesSetting),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 12),
|
||||
Reference in New Issue
Block a user