diff --git a/lib/features/base/state/banner_state.dart b/lib/features/base/state/banner_state.dart new file mode 100644 index 000000000..332f0b77b --- /dev/null +++ b/lib/features/base/state/banner_state.dart @@ -0,0 +1,5 @@ + +enum BannerState { + enabled, + disabled; +} \ 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 index c24b5d9f2..92d6acd94 100644 --- a/lib/features/manage_account/presentation/forward/forward_controller.dart +++ b/lib/features/manage_account/presentation/forward/forward_controller.dart @@ -8,15 +8,18 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:forward/forward/tmail_forward.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/extensions/email_address_extension.dart'; import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/base/state/banner_state.dart'; +import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/add_recipients_in_forwarding_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/delete_recipient_in_forwarding_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_local_copy_in_forwarding_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/add_recipient_in_forwarding_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/delete_recipient_in_forwarding_state.dart'; -import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/edit_local_copy_in_forwarding_state.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/add_recipients_in_forwarding_interactor.dart'; @@ -86,6 +89,7 @@ class ForwardController extends BaseController { if (success is GetForwardSuccess) { currentForward.value = success.forward; listRecipientForward.value = currentForward.value!.listRecipientForward; + _updateForwardWarningBannerState(); } else if (success is DeleteRecipientInForwardingSuccess) { _handleDeleteRecipientSuccess(success); } else if (success is AddRecipientsInForwardingSuccess) { @@ -157,6 +161,7 @@ class ForwardController extends BaseController { currentForward.value = success.forward; listRecipientForward.value = currentForward.value!.listRecipientForward; selectionMode.value = SelectMode.INACTIVE; + _updateForwardWarningBannerState(); } List get listRecipientForwardSelected => @@ -170,6 +175,16 @@ class ForwardController extends BaseController { bool get isAllSelected => listRecipientForward.every((recipient) => recipient.selectMode == SelectMode.ACTIVE); + bool get _isExistRecipientSameServerDomain => + listRecipientForward.any((recipient) { + final serverDomain = accountDashBoardController.sessionCurrent?.serverDomain ?? ''; + final isSameDomain = EmailUtils.isSameDomain( + emailAddress: recipient.emailAddress.emailAddress, + serverDomain: serverDomain + ); + return !isSameDomain; + }); + void selectRecipientForward(RecipientForward recipientForward) { if (selectionMode.value == SelectMode.INACTIVE) { selectionMode.value = SelectMode.ACTIVE; @@ -260,6 +275,8 @@ class ForwardController extends BaseController { listRecipientForward.value = currentForward.value!.listRecipientForward; recipientController.clearAll(); + + _updateForwardWarningBannerState(); } void handleEditLocalCopy() { @@ -286,6 +303,8 @@ class ForwardController extends BaseController { currentForward.value = success.forward; listRecipientForward.value = currentForward.value!.listRecipientForward; + + _updateForwardWarningBannerState(); } void registerListenerWorker() { @@ -311,4 +330,11 @@ class ForwardController extends BaseController { AppLocalizations.of(context).incorrectEmailFormat); } } + + void _updateForwardWarningBannerState() { + accountDashBoardController.forwardWarningBannerState.value = _isExistRecipientSameServerDomain + ? BannerState.enabled + : BannerState.disabled; + log('ForwardController::_updateForwardWarningBannerState: forwardWarningBannerState = ${accountDashBoardController.forwardWarningBannerState.value}'); + } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/forward/widgets/forward_warning_banner.dart b/lib/features/manage_account/presentation/forward/widgets/forward_warning_banner.dart new file mode 100644 index 000000000..f9c1ddc83 --- /dev/null +++ b/lib/features/manage_account/presentation/forward/widgets/forward_warning_banner.dart @@ -0,0 +1,42 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class ForwardWarningBanner extends StatelessWidget { + + final ImagePaths _imagePaths = Get.find(); + + ForwardWarningBanner({super.key}); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + margin: const EdgeInsetsDirectional.only(top: 16, start: 16, end: 16), + padding: const EdgeInsets.all(12), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8)), + color: AppColor.colorBackgroundNotificationVacationSetting, + ), + child: Row(children: [ + SvgPicture.asset( + _imagePaths.icInfoCircleOutline, + colorFilter: AppColor.colorQuotaError.asFilter(), + ), + const SizedBox(width: 12), + Expanded( + child: Text( + AppLocalizations.of(context).messageWarningDialogForForwardsToOtherDomains, + style: Theme.of(context).textTheme.labelSmall?.copyWith( + fontSize: 15, + color: Colors.black + ) + ) + ), + ]), + ); + } +} \ No newline at end of file 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 0d3e909f8..127b53dbd 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -14,6 +14,7 @@ import 'package:package_info_plus/package_info_plus.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart'; +import 'package:tmail_ui_user/features/base/state/banner_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_vacation_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/update_vacation_state.dart'; @@ -48,6 +49,7 @@ class ManageAccountDashBoardController extends ReloadableController { final accountMenuItemSelected = AccountMenuItem.profiles.obs; final settingsPageLevel = SettingsPageLevel.universal.obs; final vacationResponse = Rxn(); + final forwardWarningBannerState = Rxn(); final dashboardSettingAction = Rxn(); Session? sessionCurrent; 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 91b08cad1..d37198e0e 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -7,10 +7,12 @@ import 'package:core/presentation/views/text/slogan_builder.dart'; import 'package:core/utils/platform_info.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/state/banner_state.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_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/forward/widgets/forward_warning_banner.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/mailbox_visibility/mailbox_visibility_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; @@ -111,6 +113,14 @@ class ManageAccountDashBoardView extends GetWidget { return const SizedBox.shrink(); } }), + Obx(() { + if (controller.manageAccountDashboardController.forwardWarningBannerState.value == BannerState.enabled && + controller.manageAccountDashboardController.accountMenuItemSelected.value == AccountMenuItem.forward) { + return ForwardWarningBanner(); + } else { + return const SizedBox.shrink(); + } + }), Expanded(child: _bodySettingsScreen()) ] ),