From c171f5fc240033458b97e9435ccaf8a5ba8b2f29 Mon Sep 17 00:00:00 2001 From: ManhNTX Date: Thu, 18 Aug 2022 10:18:59 +0700 Subject: [PATCH] TF-816: get list email forward --- assets/images/ic_delete_email_forward.svg | 5 ++ .../extensions/color_extension.dart | 2 + .../presentation/resources/image_paths.dart | 1 + .../lib/forward/get/get_forward_response.dart | 4 +- forward/lib/forward/tmail_forward.dart | 11 ++- .../test/forward/get_forward_method_test.dart | 2 +- .../datasource/manage_account_datasource.dart | 4 + .../manage_account_datasource_impl.dart | 10 +++ .../data/network/manage_account_api.dart | 32 ++++++++ .../manage_account_repository_impl.dart | 6 ++ .../domain/exceptions/forward_exception.dart | 3 + .../repository/manage_account_repository.dart | 3 + .../domain/state/get_forward_state.dart | 20 +++++ .../usecases/get_forward_interactor.dart | 23 ++++++ .../email_rules/email_rules_view.dart | 2 +- .../forward/forward_bindings.dart | 32 ++++++++ .../forward/forward_controller.dart | 46 ++++++++++++ .../presentation/forward/forward_view.dart | 66 +++++++++++++++++ .../widgets/email_forward_item_widget.dart | 48 ++++++++++++ .../widgets/list_email_forward_widget.dart | 74 +++++++++++++++++++ .../manage_account_dashboard_controller.dart | 7 ++ .../manage_account_dashboard_view.dart | 8 +- .../menu/manage_account_menu_controller.dart | 29 +++++--- .../presentation/model/account_menu_item.dart | 5 ++ lib/l10n/intl_messages.arb | 14 +++- lib/main/localizations/app_localizations.dart | 14 ++++ 26 files changed, 447 insertions(+), 24 deletions(-) create mode 100644 assets/images/ic_delete_email_forward.svg create mode 100644 lib/features/manage_account/domain/exceptions/forward_exception.dart create mode 100644 lib/features/manage_account/domain/state/get_forward_state.dart create mode 100644 lib/features/manage_account/domain/usecases/get_forward_interactor.dart create mode 100644 lib/features/manage_account/presentation/forward/forward_bindings.dart create mode 100644 lib/features/manage_account/presentation/forward/forward_controller.dart create mode 100644 lib/features/manage_account/presentation/forward/forward_view.dart create mode 100644 lib/features/manage_account/presentation/forward/widgets/email_forward_item_widget.dart create mode 100644 lib/features/manage_account/presentation/forward/widgets/list_email_forward_widget.dart diff --git a/assets/images/ic_delete_email_forward.svg b/assets/images/ic_delete_email_forward.svg new file mode 100644 index 000000000..52f30249f --- /dev/null +++ b/assets/images/ic_delete_email_forward.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/core/lib/presentation/extensions/color_extension.dart b/core/lib/presentation/extensions/color_extension.dart index 94cbb1c11..294bf552a 100644 --- a/core/lib/presentation/extensions/color_extension.dart +++ b/core/lib/presentation/extensions/color_extension.dart @@ -133,6 +133,8 @@ extension AppColor on Color { static const colorBackgroundSnackBar = Color(0xFF343438); static const colorBackgroundHeaderListRuleFilter = Color(0xFFFAF7F7); static const colorBorderListRuleFilter = Color(0xFFE7E8EC); + static const colorBackgroundHeaderListForwards = Color(0xFFFAF7F7); + static const colorBorderListForwardsFilter = Color(0xFFE7E8EC); static const colorBackgroundFieldConditionRulesFilter = Color(0xFFF2F3F5); static const colorDividerRuleFilter = Color(0xFFE7E8EC); diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index 7c861396b..23f7892d3 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -152,6 +152,7 @@ class ImagePaths { String get icOpenEditRule => _getImagePath('ic_open_edit_rule.svg'); String get icEditRuleMobile => _getImagePath('ic_edit_rule_mobile.svg'); String get icDeleteRuleMobile => _getImagePath('ic_delete_rule_mobile.svg'); + String get icDeleteEmailForward => _getImagePath('ic_delete_email_forward.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/forward/lib/forward/get/get_forward_response.dart b/forward/lib/forward/get/get_forward_response.dart index 09b2ccf83..6051db237 100644 --- a/forward/lib/forward/get/get_forward_response.dart +++ b/forward/lib/forward/get/get_forward_response.dart @@ -14,8 +14,8 @@ part 'get_forward_response.g.dart'; @AccountIdConverter() @IdConverter() @JsonSerializable() -class GetForwardResponse extends GetResponse { - GetForwardResponse(AccountId accountId, State state, List list, List? notFound) : super(accountId, state, list, notFound); +class GetForwardResponse extends GetResponse { + GetForwardResponse(AccountId accountId, State state, List list, List? notFound) : super(accountId, state, list, notFound); factory GetForwardResponse.fromJson(Map json) => _$GetForwardResponseFromJson(json); diff --git a/forward/lib/forward/tmail_forward.dart b/forward/lib/forward/tmail_forward.dart index 636fbd8f2..b5f8271d9 100644 --- a/forward/lib/forward/tmail_forward.dart +++ b/forward/lib/forward/tmail_forward.dart @@ -1,27 +1,26 @@ import 'package:forward/forward/converter/forward_id_coverter.dart'; import 'package:forward/forward/forward.dart'; import 'package:forward/forward/forward_id.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:json_annotation/json_annotation.dart'; part 'tmail_forward.g.dart'; @ForwardIdConverter() @JsonSerializable() -class TmailForward extends Forward { +class TMailForward extends Forward { final ForwardId id; final bool localCopy; final Set forwards; - TmailForward({ + TMailForward({ required this.id, required this.localCopy, required this.forwards, }); - factory TmailForward.fromJson(Map json) => - _$TmailForwardFromJson(json); + factory TMailForward.fromJson(Map json) => + _$TMailForwardFromJson(json); - Map toJson() => _$TmailForwardToJson(this); + Map toJson() => _$TMailForwardToJson(this); @override List get props => [ diff --git a/forward/test/forward/get_forward_method_test.dart b/forward/test/forward/get_forward_method_test.dart index 5297ae39b..0ac56013a 100644 --- a/forward/test/forward/get_forward_method_test.dart +++ b/forward/test/forward/get_forward_method_test.dart @@ -12,7 +12,7 @@ import 'package:jmap_dart_client/jmap/jmap_request.dart'; void main() { group('test to json get forward method', () { - final expectRuleFilter1 = TmailForward( + final expectRuleFilter1 = TMailForward( id: ForwardIdSingleton.forwardIdSingleton, localCopy: true, forwards: {"bob@domain.org", "alice@domain.org"}, diff --git a/lib/features/manage_account/data/datasource/manage_account_datasource.dart b/lib/features/manage_account/data/datasource/manage_account_datasource.dart index 91bff1ba6..45df74ccf 100644 --- a/lib/features/manage_account/data/datasource/manage_account_datasource.dart +++ b/lib/features/manage_account/data/datasource/manage_account_datasource.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:forward/forward/tmail_forward.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; @@ -29,4 +30,7 @@ abstract class ManageAccountDataSource { Future> createNewEmailRuleFilter(AccountId accountId, CreateNewEmailRuleFilterRequest ruleFilterRequest); Future> editEmailRuleFilter(AccountId accountId, EditEmailRuleFilterRequest ruleFilterRequest); + + Future getForward(AccountId accountId); + } \ No newline at end of file diff --git a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart index b3a68ee6e..b099428c3 100644 --- a/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart +++ b/lib/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:forward/forward/tmail_forward.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; @@ -106,4 +107,13 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource { throw error; }); } + + @override + Future getForward(AccountId accountId) { + return Future.sync(() async { + return await manageAccountAPI.getForward(accountId); + }).catchError((error) { + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/manage_account/data/network/manage_account_api.dart b/lib/features/manage_account/data/network/manage_account_api.dart index db695aa46..c774a205a 100644 --- a/lib/features/manage_account/data/network/manage_account_api.dart +++ b/lib/features/manage_account/data/network/manage_account_api.dart @@ -1,5 +1,9 @@ import 'dart:async'; +import 'package:forward/forward/forward_id.dart'; +import 'package:forward/forward/get/get_forward_method.dart'; +import 'package:forward/forward/get/get_forward_response.dart'; +import 'package:forward/forward/tmail_forward.dart'; import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; @@ -17,6 +21,7 @@ import 'package:rule_filter/rule_filter/rule_filter_id.dart'; import 'package:rule_filter/rule_filter/set/set_rule_filter_method.dart'; import 'package:rule_filter/rule_filter/tmail_rule.dart'; import 'package:tmail_ui_user/features/manage_account/data/extensions/list_tmail_rule_extensions.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/exceptions/forward_exception.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart'; @@ -180,4 +185,31 @@ class ManageAccountAPI { return result?.list.first.rules ?? []; } + + Future getForward(AccountId accountId) async { + final processingInvocation = ProcessingInvocation(); + final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation); + + final getForwardMethod = GetForwardMethod( + accountId, + )..addIds({ForwardIdSingleton.forwardIdSingleton.id}); + + final getForwardInvocation = requestBuilder.invocation(getForwardMethod); + final response = await (requestBuilder + ..usings(getForwardMethod.requiredCapabilities)) + .build() + .execute(); + + final result = response.parse( + getForwardInvocation.methodCallId, + GetForwardResponse.deserialize); + + final tMailForwardResult = result?.list.first; + if (tMailForwardResult == null) { + throw NotFoundForwardException(); + } + + return tMailForwardResult; + } + } \ No newline at end of file diff --git a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart index 1e6ffefae..ffdc277bf 100644 --- a/lib/features/manage_account/data/repository/manage_account_repository_impl.dart +++ b/lib/features/manage_account/data/repository/manage_account_repository_impl.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:forward/forward/tmail_forward.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; @@ -63,4 +64,9 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository { Future> editEmailRuleFilter(AccountId accountId, EditEmailRuleFilterRequest ruleFilterRequest) { return dataSource.editEmailRuleFilter(accountId, ruleFilterRequest); } + + @override + Future getForward(AccountId accountId) { + return dataSource.getForward(accountId); + } } \ No newline at end of file diff --git a/lib/features/manage_account/domain/exceptions/forward_exception.dart b/lib/features/manage_account/domain/exceptions/forward_exception.dart new file mode 100644 index 000000000..87e1a25df --- /dev/null +++ b/lib/features/manage_account/domain/exceptions/forward_exception.dart @@ -0,0 +1,3 @@ +class NotFoundForwardException implements Exception { + NotFoundForwardException(); +} diff --git a/lib/features/manage_account/domain/repository/manage_account_repository.dart b/lib/features/manage_account/domain/repository/manage_account_repository.dart index 26ca1db98..48806df34 100644 --- a/lib/features/manage_account/domain/repository/manage_account_repository.dart +++ b/lib/features/manage_account/domain/repository/manage_account_repository.dart @@ -1,5 +1,6 @@ import 'dart:ui'; +import 'package:forward/forward/tmail_forward.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; @@ -29,4 +30,6 @@ abstract class ManageAccountRepository { Future> createNewEmailRuleFilter(AccountId accountId, CreateNewEmailRuleFilterRequest ruleFilterRequest); Future> editEmailRuleFilter(AccountId accountId, EditEmailRuleFilterRequest ruleFilterRequest); + + Future getForward(AccountId accountId); } \ No newline at end of file diff --git a/lib/features/manage_account/domain/state/get_forward_state.dart b/lib/features/manage_account/domain/state/get_forward_state.dart new file mode 100644 index 000000000..1102a406e --- /dev/null +++ b/lib/features/manage_account/domain/state/get_forward_state.dart @@ -0,0 +1,20 @@ +import 'package:core/core.dart'; +import 'package:forward/forward/tmail_forward.dart'; + +class GetForwardSuccess extends UIState { + final TMailForward forward; + + GetForwardSuccess(this.forward); + + @override + List get props => [forward]; +} + +class GetForwardFailure extends FeatureFailure { + final dynamic exception; + + GetForwardFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/manage_account/domain/usecases/get_forward_interactor.dart b/lib/features/manage_account/domain/usecases/get_forward_interactor.dart new file mode 100644 index 000000000..bb72e9b52 --- /dev/null +++ b/lib/features/manage_account/domain/usecases/get_forward_interactor.dart @@ -0,0 +1,23 @@ +import 'dart:core'; + +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/get_forward_state.dart'; + +class GetForwardInteractor { + final ManageAccountRepository manageAccountRepository; + + GetForwardInteractor(this.manageAccountRepository); + + Stream> execute(AccountId accountId) async* { + try { + yield Right(LoadingState()); + final response = await manageAccountRepository.getForward(accountId); + yield Right(GetForwardSuccess(response)); + } catch (exception) { + yield Left(GetForwardFailure(exception)); + } + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/email_rules/email_rules_view.dart b/lib/features/manage_account/presentation/email_rules/email_rules_view.dart index ba80af22d..f9bb4196d 100644 --- a/lib/features/manage_account/presentation/email_rules/email_rules_view.dart +++ b/lib/features/manage_account/presentation/email_rules/email_rules_view.dart @@ -55,7 +55,7 @@ class EmailRulesView extends GetWidget with AppLoaderMixin _responsiveUtils.isTablet(context)) { return const EdgeInsets.only(right: 32, top: 16, bottom: 16); } else { - return const EdgeInsets.only(right: 32, top: 16, bottom: 16); + return const EdgeInsets.only(top: 16, bottom: 16, right: 28, left: 20); } } } diff --git a/lib/features/manage_account/presentation/forward/forward_bindings.dart b/lib/features/manage_account/presentation/forward/forward_bindings.dart new file mode 100644 index 000000000..79da2b756 --- /dev/null +++ b/lib/features/manage_account/presentation/forward/forward_bindings.dart @@ -0,0 +1,32 @@ +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/base_bindings.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/get_forward_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_controller.dart'; + +class ForwardBindings extends BaseBindings { + + @override + void bindingsController() { + Get.lazyPut(() => ForwardController( + Get.find(), + )); + } + + @override + void bindingsDataSource() {} + + @override + void bindingsDataSourceImpl() {} + + @override + void bindingsInteractor() { + Get.lazyPut(() => GetForwardInteractor(Get.find())); + } + + @override + void bindingsRepository() {} + + @override + void bindingsRepositoryImpl() {} +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/forward/forward_controller.dart b/lib/features/manage_account/presentation/forward/forward_controller.dart new file mode 100644 index 000000000..c867c1b04 --- /dev/null +++ b/lib/features/manage_account/presentation/forward/forward_controller.dart @@ -0,0 +1,46 @@ +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/get_forward_state.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_forward_interactor.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; + +class ForwardController extends BaseController { + + final GetForwardInteractor _getForwardInteractor; + + final _accountDashBoardController = Get.find(); + + final listForwards = [].obs; + + ForwardController( + this._getForwardInteractor, + ); + + @override + void onDone() { + viewState.value.fold((failure) {}, (success) { + if (success is GetForwardSuccess) { + if (success.forward.forwards.isNotEmpty) { + listForwards.addAll(success.forward.forwards); + } + } + }); + } + + @override + void onError(error) {} + + @override + void onInit() { + _getForward(); + super.onInit(); + } + + void _getForward() { + consumeState(_getForwardInteractor.execute(_accountDashBoardController.accountId.value!)); + } + + void deleteEmailForward(String emailForward) { + //TODO: deleteEmailForward + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/forward/forward_view.dart b/lib/features/manage_account/presentation/forward/forward_view.dart new file mode 100644 index 000000000..abf9e2055 --- /dev/null +++ b/lib/features/manage_account/presentation/forward/forward_view.dart @@ -0,0 +1,66 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/widgets/list_email_forward_widget.dart'; + +class ForwardView extends GetWidget with AppLoaderMixin { + final _responsiveUtils = Get.find(); + + ForwardView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: _responsiveUtils.isWebDesktop(context) + ? AppColor.colorBgDesktop + : Colors.white, + body: Container( + width: double.infinity, + margin: _getMarginView(context), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: _responsiveUtils.isWebDesktop(context) ? 24 : 16), + _buildLoadingView(), + const Expanded(child: ListEmailForwardsWidget()) + ], + ), + ), + ); + } + + EdgeInsets _getMarginView(BuildContext context) { + if (BuildUtils.isWeb) { + if (_responsiveUtils.isDesktop(context)) { + return const EdgeInsets.only(left: 16, top: 16, right: 24, bottom: 24); + } else if (_responsiveUtils.isTabletLarge(context) || + _responsiveUtils.isTablet(context)) { + return const EdgeInsets.only(right: 32, top: 16, bottom: 16); + } else { + return const EdgeInsets.only(right: 32, top: 16, bottom: 16); + } + } else { + if (_responsiveUtils.isDesktop(context) || + _responsiveUtils.isLandscapeTablet(context) || + _responsiveUtils.isTabletLarge(context) || + _responsiveUtils.isTablet(context)) { + return const EdgeInsets.only(right: 32, top: 16, bottom: 16); + } else { + return const EdgeInsets.only(top: 16, bottom: 16, right: 28, left: 20); + } + } + } + + Widget _buildLoadingView() { + return Obx(() => controller.viewState.value.fold( + (failure) => const SizedBox.shrink(), + (success) => success is LoadingState + ? Padding( + padding: const EdgeInsets.only(bottom: 24), + child: loadingWidget) + : const SizedBox.shrink() + )); + } +} diff --git a/lib/features/manage_account/presentation/forward/widgets/email_forward_item_widget.dart b/lib/features/manage_account/presentation/forward/widgets/email_forward_item_widget.dart new file mode 100644 index 000000000..b41d862f6 --- /dev/null +++ b/lib/features/manage_account/presentation/forward/widgets/email_forward_item_widget.dart @@ -0,0 +1,48 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_controller.dart'; + +class EmailForwardItemWidget extends StatelessWidget { + final _responsiveUtils = Get.find(); + final _imagePaths = Get.find(); + final _emailForwardController = Get.find(); + + final String emailForward; + + EmailForwardItemWidget({ + Key? key, + required this.emailForward, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only( + top: 15, + bottom: 15, + left: _responsiveUtils.isMobile(context) ? 16 : 24, + right: _responsiveUtils.isMobile(context) ? 0 : 24 + ), + color: Colors.white, + child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ + Text(emailForward, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + color: Colors.black)), + const Spacer(), + if (!_responsiveUtils.isMobile(context)) + buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icDeleteEmailForward, + fit: BoxFit.fill, + ), + onTap: () { + _emailForwardController.deleteEmailForward(emailForward); + }), + ]), + ); + } +} diff --git a/lib/features/manage_account/presentation/forward/widgets/list_email_forward_widget.dart b/lib/features/manage_account/presentation/forward/widgets/list_email_forward_widget.dart new file mode 100644 index 000000000..ba838bfef --- /dev/null +++ b/lib/features/manage_account/presentation/forward/widgets/list_email_forward_widget.dart @@ -0,0 +1,74 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/widgets/email_forward_item_widget.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class ListEmailForwardsWidget extends GetWidget { + const ListEmailForwardsWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: AppColor.colorBackgroundWrapIconStyleCode, + borderRadius: BorderRadius.circular(16), + border: Border.all( + width: 1, + color: AppColor.colorBorderListForwardsFilter) + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: double.infinity, + decoration: const BoxDecoration( + color: AppColor.colorBackgroundHeaderListForwards, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16)), + ), + padding: const EdgeInsets.symmetric( + vertical: 28, + horizontal: 24, + ), + child: Text(AppLocalizations.of(context).headerEmailsForward, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: AppColor.colorTextButtonHeaderThread)), + ), + const Divider( + color: AppColor.lineItemListColor, + height: 1, + thickness: 0.2, + ), + Expanded( + child: Obx(() { + log('ListEmailForwardsWidget::build(): ${controller.listForwards}'); + return ListView.separated( + shrinkWrap: true, + itemCount: controller.listForwards.length, + itemBuilder: (context, index) { + final emailForward = controller.listForwards[index]; + log('ListEmailForwardsWidget::build(): $emailForward'); + return EmailForwardItemWidget(emailForward: emailForward); + }, + separatorBuilder: (context, index) => const Divider( + color: AppColor.lineItemListColor, + height: 1, + thickness: 0.2, + ), + ); + }), + ), + ]), + ), + ); + } +} diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 98b81fc69..57d9f9220 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -2,6 +2,7 @@ import 'package:core/core.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:forward/forward/capability_forward.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; @@ -14,6 +15,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authenticated_a import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_bindings.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_bindings.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/manage_account_arguments.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; @@ -110,6 +112,9 @@ class ManageAccountDashBoardController extends ReloadableController { if(newAccountMenuItem == AccountMenuItem.emailRules) { EmailRulesBindings().dependencies(); } + if(newAccountMenuItem == AccountMenuItem.forward) { + ForwardBindings().dependencies(); + } accountMenuItemSelected.value = newAccountMenuItem; if (currentContext != null && !_responsiveUtils.isDesktop(currentContext!)) { closeMenuDrawer(); @@ -135,4 +140,6 @@ class ManageAccountDashBoardController extends ReloadableController { bool checkAvailableRuleFilterInSession() => sessionCurrent.value?.capabilities.containsKey(capabilityRuleFilter) ?? false; + bool checkAvailableForwardInSession() => sessionCurrent.value?.capabilities.containsKey(capabilityForward) ?? false; + } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart index 1012a4219..4dea253e7 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -4,8 +4,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_bindings.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_view.dart'; @@ -154,6 +154,12 @@ class ManageAccountDashBoardView extends GetWidget(); - final _responsiveUtils = Get.find(); late Worker sessionWorker; @@ -22,7 +18,7 @@ class ManageAccountMenuController extends BaseController { void _initWorker() { sessionWorker = ever(dashBoardController.sessionCurrent, (_) { - _createListAccountMenuItemWithEmailRule(); + _createListAccountMenu(); }); } @@ -33,19 +29,28 @@ class ManageAccountMenuController extends BaseController { @override void onInit() { _initWorker(); - _createListAccountMenuItemWithEmailRule(); + _createListAccountMenu(); super.onInit(); } - _createListAccountMenuItemWithEmailRule(){ + _createListAccountMenu(){ + listAccountMenuItem.clear(); + listAccountMenuItem.add( + AccountMenuItem.profiles, + ); if (dashBoardController.checkAvailableRuleFilterInSession()) { - listAccountMenuItem.clear(); - listAccountMenuItem.addAll([ - AccountMenuItem.profiles, + listAccountMenuItem.add( AccountMenuItem.emailRules, - AccountMenuItem.languageAndRegion, - ]); + ); } + if (dashBoardController.checkAvailableForwardInSession()) { + listAccountMenuItem.add( + AccountMenuItem.forward, + ); + } + listAccountMenuItem.add( + AccountMenuItem.languageAndRegion, + ); } @override diff --git a/lib/features/manage_account/presentation/model/account_menu_item.dart b/lib/features/manage_account/presentation/model/account_menu_item.dart index 0ac4ed585..507e9187d 100644 --- a/lib/features/manage_account/presentation/model/account_menu_item.dart +++ b/lib/features/manage_account/presentation/model/account_menu_item.dart @@ -7,6 +7,7 @@ enum AccountMenuItem { profiles, languageAndRegion, emailRules, + forward, } extension AccountMenuItemExtension on AccountMenuItem { @@ -19,6 +20,8 @@ extension AccountMenuItemExtension on AccountMenuItem { return imagePaths.icLanguage; case AccountMenuItem.emailRules: return imagePaths.icEmailRules; + case AccountMenuItem.forward: + return imagePaths.icForward; } } @@ -30,6 +33,8 @@ extension AccountMenuItemExtension on AccountMenuItem { return AppLocalizations.of(context).languageAndRegion; case AccountMenuItem.emailRules: return AppLocalizations.of(context).emailRules; + case AccountMenuItem.forward: + return AppLocalizations.of(context).forwarding; } } } \ No newline at end of file diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index e99978d82..62eb18ff5 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-08-12T09:07:20.482325", + "@@last_modified": "2022-08-18T10:12:35.405050", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -1891,5 +1891,17 @@ "type": "text", "placeholders_order": [], "placeholders": {} + }, + "headerEmailsForward": "Emails forward", + "@headerEmailsForward": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "forwarding": "Forwarding", + "@forwarding": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 3399bfbe8..c9f3d9551 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -1945,4 +1945,18 @@ class AppLocalizations { 'Your filter has been updated', name: 'yourFilterHasBeenUpdated'); } + + String get headerEmailsForward { + return Intl.message( + 'Emails forward', + name: 'headerEmailsForward', + ); + } + + String get forwarding { + return Intl.message( + 'Forwarding', + name: 'forwarding', + ); + } } \ No newline at end of file