TF-859 Keep local copy in Forwarding

This commit is contained in:
ManhNTX
2022-08-21 10:23:08 +07:00
committed by Dat H. Pham
parent 3c85f1d5ed
commit dc0c3ee445
13 changed files with 228 additions and 32 deletions
@@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_em
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_email_rule_filter_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/edit_local_copy_in_forwarding_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
abstract class ManageAccountDataSource {
@@ -44,4 +45,6 @@ abstract class ManageAccountDataSource {
Future<TMailForward> addRecipientsInForwarding(AccountId accountId, AddRecipientInForwardingRequest addRequest);
Future<TMailForward> editLocalCopyInForwarding(AccountId accountId, EditLocalCopyInForwardingRequest editRequest);
}
@@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_em
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_email_rule_filter_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/edit_local_copy_in_forwarding_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
class ManageAccountDataSourceImpl extends ManageAccountDataSource {
@@ -155,4 +156,13 @@ class ManageAccountDataSourceImpl extends ManageAccountDataSource {
throw error;
});
}
@override
Future<TMailForward> editLocalCopyInForwarding(AccountId accountId, EditLocalCopyInForwardingRequest editRequest) {
return Future.sync(() async {
return await manageAccountAPI.updateForward(accountId, editRequest.newTMailForward);
}).catchError((error) {
throw error;
});
}
}
@@ -14,6 +14,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_em
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_email_rule_filter_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/edit_local_copy_in_forwarding_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
@@ -92,4 +93,9 @@ class ManageAccountRepositoryImpl extends ManageAccountRepository {
Future<TMailForward> addRecipientsInForwarding(AccountId accountId, AddRecipientInForwardingRequest addRequest) {
return dataSource.addRecipientsInForwarding(accountId, addRequest);
}
@override
Future<TMailForward> editLocalCopyInForwarding(AccountId accountId, EditLocalCopyInForwardingRequest editRequest) {
return dataSource.editLocalCopyInForwarding(accountId, editRequest);
}
}
@@ -0,0 +1,19 @@
import 'package:equatable/equatable.dart';
import 'package:forward/forward/tmail_forward.dart';
class EditLocalCopyInForwardingRequest with EquatableMixin {
final TMailForward currentForward;
final bool keepLocalCopy;
EditLocalCopyInForwardingRequest({
required this.currentForward,
required this.keepLocalCopy,
});
TMailForward get newTMailForward {
return currentForward.copyWith(localCopy: keepLocalCopy);
}
@override
List<Object?> get props => [currentForward, keepLocalCopy];
}
@@ -13,6 +13,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_em
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_email_rule_filter_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/edit_local_copy_in_forwarding_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/identities_response.dart';
abstract class ManageAccountRepository {
@@ -43,4 +44,6 @@ abstract class ManageAccountRepository {
Future<TMailForward> deleteRecipientInForwarding(AccountId accountId, DeleteRecipientInForwardingRequest deleteRequest);
Future<TMailForward> addRecipientsInForwarding(AccountId accountId, AddRecipientInForwardingRequest addRequest);
Future<TMailForward> editLocalCopyInForwarding(AccountId accountId, EditLocalCopyInForwardingRequest editRequest);
}
@@ -0,0 +1,21 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:forward/forward/tmail_forward.dart';
class EditLocalCopyInForwardingSuccess extends UIState {
final TMailForward forward;
EditLocalCopyInForwardingSuccess(this.forward);
@override
List<Object?> get props => [forward];
}
class EditLocalCopyInForwardingFailure extends FeatureFailure {
final dynamic exception;
EditLocalCopyInForwardingFailure(this.exception);
@override
List<Object> get props => [exception];
}
@@ -0,0 +1,29 @@
import 'dart:core';
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.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/repository/manage_account_repository.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_local_copy_in_forwarding_state.dart';
class EditLocalCopyInForwardingInteractor {
final ManageAccountRepository manageAccountRepository;
EditLocalCopyInForwardingInteractor(this.manageAccountRepository);
Stream<Either<Failure, Success>> execute(
AccountId accountId,
EditLocalCopyInForwardingRequest editRequest,
) async* {
try {
final result = await manageAccountRepository.editLocalCopyInForwarding(
accountId,
editRequest);
yield Right<Failure, Success>(EditLocalCopyInForwardingSuccess(result));
} catch (exception) {
yield Left<Failure, Success>(EditLocalCopyInForwardingFailure(exception));
}
}
}
@@ -3,6 +3,7 @@ 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/add_recipients_in_forwarding_interactor.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/edit_local_copy_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';
@@ -14,6 +15,7 @@ class ForwardBindings extends BaseBindings {
Get.find<GetForwardInteractor>(),
Get.find<DeleteRecipientInForwardingInteractor>(),
Get.find<AddRecipientsInForwardingInteractor>(),
Get.find<EditLocalCopyInForwardingInteractor>(),
));
}
@@ -28,6 +30,7 @@ class ForwardBindings extends BaseBindings {
Get.lazyPut(() => GetForwardInteractor(Get.find<ManageAccountRepository>()));
Get.lazyPut(() => DeleteRecipientInForwardingInteractor(Get.find<ManageAccountRepository>()));
Get.lazyPut(() => AddRecipientsInForwardingInteractor(Get.find<ManageAccountRepository>()));
Get.lazyPut(() => EditLocalCopyInForwardingInteractor(Get.find<ManageAccountRepository>()));
}
@override
@@ -16,13 +16,16 @@ import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/emails_forward_creator/presentation/emails_forward_creator_binding.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/emails_forward_creator/presentation/model/mails_forward_creator_arguments.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';
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/edit_local_copy_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/extensions/tmail_forward_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
@@ -36,6 +39,7 @@ class ForwardController extends BaseController {
final GetForwardInteractor _getForwardInteractor;
final DeleteRecipientInForwardingInteractor _deleteRecipientInForwardingInteractor;
final AddRecipientsInForwardingInteractor _addRecipientsInForwardingInteractor;
final EditLocalCopyInForwardingInteractor _editLocalCopyInForwardingInteractor;
final accountDashBoardController = Get.find<ManageAccountDashBoardController>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
@@ -45,7 +49,7 @@ class ForwardController extends BaseController {
final selectionMode = Rx<SelectMode>(SelectMode.INACTIVE);
final listRecipientForward = RxList<RecipientForward>();
TMailForward? currentForward;
final currentForward = Rxn<TMailForward>();
final listForwards = <String>[].obs;
@@ -53,6 +57,7 @@ class ForwardController extends BaseController {
this._getForwardInteractor,
this._deleteRecipientInForwardingInteractor,
this._addRecipientsInForwardingInteractor,
this._editLocalCopyInForwardingInteractor,
);
@override
@@ -65,12 +70,14 @@ class ForwardController extends BaseController {
},
(success) {
if (success is GetForwardSuccess) {
currentForward = success.forward;
listRecipientForward.value = currentForward!.listRecipientForward;
currentForward.value = success.forward;
listRecipientForward.value = currentForward.value!.listRecipientForward;
} else if (success is DeleteRecipientInForwardingSuccess) {
_handleDeleteRecipientSuccess(success);
} else if (success is AddRecipientsInForwardingSuccess) {
_handleAddRecipientsSuccess(success);
} else if (success is EditLocalCopyInForwardingSuccess) {
_handleEditLocalCopySuccess(success);
}
});
}
@@ -128,11 +135,11 @@ class ForwardController extends BaseController {
popBack();
final accountId = accountDashBoardController.accountId.value;
if (accountId != null && currentForward != null) {
if (accountId != null && currentForward.value != null) {
consumeState(_deleteRecipientInForwardingInteractor.execute(
accountId,
DeleteRecipientInForwardingRequest(
currentForward: currentForward!,
currentForward: currentForward.value!,
listRecipientDeleted: listRecipients)));
}
}
@@ -140,13 +147,14 @@ class ForwardController extends BaseController {
void _handleDeleteRecipientSuccess(DeleteRecipientInForwardingSuccess success) {
if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastWithIcon(
currentOverlayContext!,
message: AppLocalizations.of(currentContext!).toastMessageDeleteRecipientSuccessfully,
icon: _imagePaths.icSelected);
currentOverlayContext!,
message: AppLocalizations.of(currentContext!).toastMessageDeleteRecipientSuccessfully,
icon: _imagePaths.icSelected,
);
}
currentForward = success.forward;
listRecipientForward.value = currentForward!.listRecipientForward;
currentForward.value = success.forward;
listRecipientForward.value = currentForward.value!.listRecipientForward;
selectionMode.value = SelectMode.INACTIVE;
}
@@ -230,7 +238,7 @@ class ForwardController extends BaseController {
void goToAddEmailsForward() async {
final accountId = accountDashBoardController.accountId.value;
if (accountId != null) {
if(kIsWeb) {
if (kIsWeb) {
_openMailsForwardCreatorOverlay();
} else {
final listEmail = await push(
@@ -252,11 +260,11 @@ class ForwardController extends BaseController {
void handleAddRecipients(List<EmailAddress> listEmailAddress) {
final accountId = accountDashBoardController.accountId.value;
final listRecipients = listEmailAddress.map((e) => e.emailAddress).toSet();
if (accountId != null && currentForward != null) {
if (accountId != null && currentForward.value != null) {
consumeState(_addRecipientsInForwardingInteractor.execute(
accountId,
AddRecipientInForwardingRequest(
currentForward: currentForward!,
currentForward: currentForward.value!,
listRecipientAdded: listRecipients)));
}
}
@@ -264,12 +272,43 @@ class ForwardController extends BaseController {
void _handleAddRecipientsSuccess(AddRecipientsInForwardingSuccess success) {
if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastWithIcon(
currentOverlayContext!,
message: AppLocalizations.of(currentContext!).toastMessageAddRecipientsSuccessfully,
icon: _imagePaths.icSelected);
currentOverlayContext!,
message: AppLocalizations.of(currentContext!).toastMessageAddRecipientsSuccessfully,
icon: _imagePaths.icSelected,
);
}
currentForward = success.forward;
listRecipientForward.value = currentForward!.listRecipientForward;
currentForward.value = success.forward;
listRecipientForward.value = currentForward.value!.listRecipientForward;
}
bool getCurrentForwardLocalCopyState() {
return currentForward.value?.localCopy ?? false;
}
void handleEditLocalCopy() {
final accountId = accountDashBoardController.accountId.value;
if (accountId != null && currentForward.value != null) {
consumeState(_editLocalCopyInForwardingInteractor.execute(
accountId,
EditLocalCopyInForwardingRequest(
currentForward: currentForward.value!,
keepLocalCopy: !currentForward.value!.localCopy)));
}
}
void _handleEditLocalCopySuccess(EditLocalCopyInForwardingSuccess success) {
if (currentOverlayContext != null && currentContext != null) {
_appToast.showToastWithIcon(
currentOverlayContext!,
message: success.forward.localCopy ?
AppLocalizations.of(currentContext!).toastMessageLocalCopyEnable :
AppLocalizations.of(currentContext!).toastMessageLocalCopyDisable,
icon: _imagePaths.icSelected,
);
}
currentForward.value = success.forward;
listRecipientForward.value = currentForward.value!.listRecipientForward;
}
}
@@ -27,7 +27,6 @@ class ForwardView extends GetWidget<ForwardController> with AppLoaderMixin {
ForwardHeaderWidget(
imagePaths: _imagePaths,
responsiveUtils: _responsiveUtils,
addEmailForward: () => controller.goToAddEmailsForward(),
),
SizedBox(height: _responsiveUtils.isWebDesktop(context) ? 24 : 16),
_buildLoadingView(),
@@ -1,19 +1,20 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/style_utils.dart';
import 'package:core/presentation/views/button/button_builder.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/main/localizations/app_localizations.dart';
class ForwardHeaderWidget extends StatelessWidget {
class ForwardHeaderWidget extends GetWidget<ForwardController> {
const ForwardHeaderWidget({
Key? key,
required this.addEmailForward,
required this.imagePaths,
required this.responsiveUtils,
}) : super(key: key);
final VoidCallback addEmailForward;
final ImagePaths imagePaths;
final ResponsiveUtils responsiveUtils;
@@ -32,9 +33,10 @@ class ForwardHeaderWidget extends StatelessWidget {
fontSize: 17,
fontWeight: FontWeight.bold,
color: Colors.black)),
const SizedBox(height: 4),
const SizedBox(height: 24),
_buildButtonAddNewEmailsForward(context),
const SizedBox(height: 24),
Obx(() => _buildButtonSwitchKeepLocalCopy(context)),
]),
);
}
@@ -57,7 +59,7 @@ class ForwardHeaderWidget extends StatelessWidget {
color: Colors.white,
fontWeight: FontWeight.w500,
))
..onPressActionClick(() => addEmailForward.call())
..onPressActionClick(() => controller.goToAddEmailsForward())
..text(
AppLocalizations.of(context).addRecipients,
isVertical: false,
@@ -79,7 +81,7 @@ class ForwardHeaderWidget extends StatelessWidget {
color: Colors.white,
fontWeight: FontWeight.w500,
))
..onPressActionClick(() => addEmailForward.call())
..onPressActionClick(() => controller.getCurrentForwardLocalCopyState())
..text(
AppLocalizations.of(context).addRecipients,
isVertical: false,
@@ -87,4 +89,29 @@ class ForwardHeaderWidget extends StatelessWidget {
.build();
}
}
Widget _buildButtonSwitchKeepLocalCopy(BuildContext context) {
if(controller.currentForward.value != null) {
return SizedBox(
width: 250,
child: SwitchListTile(
contentPadding: const EdgeInsets.symmetric(horizontal: 0),
title: Text(AppLocalizations.of(context).keepLocalCopyForwardLabel,
overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w400,
color: Colors.black)),
value: controller.getCurrentForwardLocalCopyState(),
onChanged: (_) {
controller.handleEditLocalCopy();
},
controlAffinity: ListTileControlAffinity.trailing,
),
);
} else {
return const SizedBox.shrink();
}
}
}
+25 -7
View File
@@ -1,5 +1,5 @@
{
"@@last_modified": "2022-08-20T20:59:54.192845",
"@@last_modified": "2022-08-21T10:21:05.186351",
"initializing_data": "Initializing data...",
"@initializing_data": {
"type": "text",
@@ -1892,8 +1892,8 @@
"placeholders_order": [],
"placeholders": {}
},
"headerEmailsForward": "Emails forward",
"@headerEmailsForward": {
"headerRecipients": "Recipients",
"@headerRecipients": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
@@ -2066,14 +2066,14 @@
"placeholders_order": [],
"placeholders": {}
},
"addEmailForward": "Add Email",
"@addEmailForward": {
"addRecipients": "Add Recipients",
"@addRecipients": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"emailForwardLabel": "Name or Email address",
"@emailForwardLabel": {
"recipientsLabel": "Name or Email address",
"@recipientsLabel": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
@@ -2083,5 +2083,23 @@
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"toastMessageLocalCopyEnable": "Keep local copy enable.",
"@toastMessageLocalCopyEnable": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"toastMessageLocalCopyDisable": "Keep local copy disable.",
"@toastMessageLocalCopyDisable": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
},
"keepLocalCopyForwardLabel": "Keep local copy",
"@keepLocalCopyForwardLabel": {
"type": "text",
"placeholders_order": [],
"placeholders": {}
}
}
@@ -2153,4 +2153,23 @@ class AppLocalizations {
'The emails has been added from the recipient list.',
name: 'toastMessageAddRecipientsSuccessfully');
}
String get toastMessageLocalCopyEnable {
return Intl.message(
'Keep local copy enable.',
name: 'toastMessageLocalCopyEnable');
}
String get toastMessageLocalCopyDisable {
return Intl.message(
'Keep local copy disable.',
name: 'toastMessageLocalCopyDisable');
}
String get keepLocalCopyForwardLabel {
return Intl.message(
'Keep local copy',
name: 'keepLocalCopyForwardLabel',
);
}
}