diff --git a/lib/features/manage_account/presentation/forward/forward_bindings.dart b/lib/features/manage_account/presentation/forward/forward_bindings.dart index 79da2b756..d7aefb41e 100644 --- a/lib/features/manage_account/presentation/forward/forward_bindings.dart +++ b/lib/features/manage_account/presentation/forward/forward_bindings.dart @@ -1,6 +1,7 @@ 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/delete_recipient_in_forwarding_interactor.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'; @@ -10,6 +11,7 @@ class ForwardBindings extends BaseBindings { void bindingsController() { Get.lazyPut(() => ForwardController( Get.find(), + Get.find(), )); } @@ -22,6 +24,7 @@ class ForwardBindings extends BaseBindings { @override void bindingsInteractor() { Get.lazyPut(() => GetForwardInteractor(Get.find())); + Get.lazyPut(() => DeleteRecipientInForwardingInteractor(Get.find())); } @override diff --git a/lib/features/manage_account/presentation/forward/forward_controller.dart b/lib/features/manage_account/presentation/forward/forward_controller.dart index c867c1b04..07736569b 100644 --- a/lib/features/manage_account/presentation/forward/forward_controller.dart +++ b/lib/features/manage_account/presentation/forward/forward_controller.dart @@ -1,28 +1,48 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/app_toast.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/views/bottom_popup/confirmation_dialog_action_sheet_builder.dart'; +import 'package:core/presentation/views/dialog/confirmation_dialog_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:forward/forward/tmail_forward.dart'; import 'package:get/get.dart'; +import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/base_controller.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/state/delete_recipient_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/delete_recipient_in_forwarding_interactor.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'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class ForwardController extends BaseController { final GetForwardInteractor _getForwardInteractor; + final DeleteRecipientInForwardingInteractor _deleteRecipientInForwardingInteractor; final _accountDashBoardController = Get.find(); + final _responsiveUtils = Get.find(); + final _imagePaths = Get.find(); + final _appToast = Get.find(); - final listForwards = [].obs; + final currentForward = Rxn(); ForwardController( this._getForwardInteractor, + this._deleteRecipientInForwardingInteractor, ); @override void onDone() { viewState.value.fold((failure) {}, (success) { if (success is GetForwardSuccess) { - if (success.forward.forwards.isNotEmpty) { - listForwards.addAll(success.forward.forwards); - } + currentForward.value = success.forward; + } else if (success is DeleteRecipientInForwardingSuccess) { + _handleDeleteRecipientSuccess(success); } }); } @@ -40,7 +60,63 @@ class ForwardController extends BaseController { consumeState(_getForwardInteractor.execute(_accountDashBoardController.accountId.value!)); } - void deleteEmailForward(String emailForward) { - //TODO: deleteEmailForward + void deleteRecipients(BuildContext context, String emailAddress) { + if (_responsiveUtils.isMobile(context)) { + (ConfirmationDialogActionSheetBuilder(context) + ..messageText(AppLocalizations.of(context) + .messageConfirmationDialogDeleteRecipientForward(emailAddress)) + ..onCancelAction(AppLocalizations.of(context).cancel, () => + popBack()) + ..onConfirmAction(AppLocalizations.of(context).delete, () => + _handleDeleteRecipientAction({emailAddress}))) + .show(); + } else { + showDialog( + context: context, + barrierColor: AppColor.colorDefaultCupertinoActionSheet, + builder: (BuildContext context) => + PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths) + ..title(AppLocalizations.of(context).deleteRecipient) + ..content(AppLocalizations.of(context) + .messageConfirmationDialogDeleteRecipientForward(emailAddress)) + ..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, + fit: BoxFit.fill)) + ..marginIcon(EdgeInsets.zero) + ..colorConfirmButton(AppColor.colorConfirmActionDialog) + ..styleTextConfirmButton(const TextStyle( + fontSize: 17, + fontWeight: FontWeight.w500, + color: AppColor.colorActionDeleteConfirmDialog)) + ..onCloseButtonAction(() => popBack()) + ..onConfirmButtonAction(AppLocalizations.of(context).delete, () => + _handleDeleteRecipientAction({emailAddress})) + ..onCancelButtonAction(AppLocalizations.of(context).cancel, () => + popBack())) + .build())); + } + } + + void _handleDeleteRecipientAction(Set listRecipients) { + popBack(); + + final accountId = _accountDashBoardController.accountId.value; + if (accountId != null && currentForward.value != null) { + consumeState(_deleteRecipientInForwardingInteractor.execute( + accountId, + DeleteRecipientInForwardingRequest( + currentForward: currentForward.value!, + listRecipientDeleted: listRecipients))); + } + } + + void _handleDeleteRecipientSuccess(DeleteRecipientInForwardingSuccess success) { + if (currentOverlayContext != null && currentContext != null) { + _appToast.showToastWithIcon( + currentOverlayContext!, + message: AppLocalizations.of(currentContext!).toastMessageDeleteRecipientSuccessfully, + icon: _imagePaths.icSelected); + } + + currentForward.value = success.forward; } } \ No newline at end of file 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 index b41d862f6..094b40338 100644 --- 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 @@ -9,11 +9,11 @@ class EmailForwardItemWidget extends StatelessWidget { final _imagePaths = Get.find(); final _emailForwardController = Get.find(); - final String emailForward; + final String emailAddress; EmailForwardItemWidget({ Key? key, - required this.emailForward, + required this.emailAddress, }) : super(key: key); @override @@ -23,25 +23,24 @@ class EmailForwardItemWidget extends StatelessWidget { top: 15, bottom: 15, left: _responsiveUtils.isMobile(context) ? 16 : 24, - right: _responsiveUtils.isMobile(context) ? 0 : 24 + right: _responsiveUtils.isMobile(context) ? 8 : 24 ), color: Colors.white, child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ - Text(emailForward, + Text(emailAddress, 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); - }), + buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icDeleteEmailForward, + fit: BoxFit.fill, + ), + onTap: () { + _emailForwardController.deleteRecipients(context, emailAddress); + }), ]), ); } 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 index ba838bfef..c6e8609b2 100644 --- 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 @@ -50,14 +50,14 @@ class ListEmailForwardsWidget extends GetWidget { ), Expanded( child: Obx(() { - log('ListEmailForwardsWidget::build(): ${controller.listForwards}'); + final listRecipients = controller.currentForward.value?.forwards.toList() ?? []; return ListView.separated( shrinkWrap: true, - itemCount: controller.listForwards.length, + itemCount: listRecipients.length, itemBuilder: (context, index) { - final emailForward = controller.listForwards[index]; - log('ListEmailForwardsWidget::build(): $emailForward'); - return EmailForwardItemWidget(emailForward: emailForward); + final emailAddress = listRecipients[index]; + log('ListEmailForwardsWidget::build(): $emailAddress'); + return EmailForwardItemWidget(emailAddress: emailAddress); }, separatorBuilder: (context, index) => const Divider( color: AppColor.lineItemListColor, diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index b64d3b322..e7bba2d2c 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2022-08-18T17:02:08.322535", + "@@last_modified": "2022-08-19T11:57:02.557202", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -2037,5 +2037,27 @@ "placeholders": { "endDate": {} } + }, + "messageConfirmationDialogDeleteRecipientForward": "Do you want to delete email {emailAddress}?", + "@messageConfirmationDialogDeleteRecipientForward": { + "type": "text", + "placeholders_order": [ + "emailAddress" + ], + "placeholders": { + "emailAddress": {} + } + }, + "deleteRecipient": "Delete recipient", + "@deleteRecipient": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "toastMessageDeleteRecipientSuccessfully": "The email has been removed from the recipient list.", + "@toastMessageDeleteRecipientSuccessfully": { + "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 1f93f6c73..979b8cbc5 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2106,4 +2106,24 @@ class AppLocalizations { name: 'messageDisableVacationResponderAutomatically', args: [endDate]); } + + String messageConfirmationDialogDeleteRecipientForward(String emailAddress) { + return Intl.message( + 'Do you want to delete email $emailAddress?', + name: 'messageConfirmationDialogDeleteRecipientForward', + args: [emailAddress] + ); + } + + String get deleteRecipient { + return Intl.message( + 'Delete recipient', + name: 'deleteRecipient'); + } + + String get toastMessageDeleteRecipientSuccessfully { + return Intl.message( + 'The email has been removed from the recipient list.', + name: 'toastMessageDeleteRecipientSuccessfully'); + } } \ No newline at end of file