TF-3715 Thread Detail create resuable actions

TF-3715 Thread Detail refactor actions for expanded email view

TF-3715 Thread Detail apply actions for collapsed email view

TF-3715 Thread Detail fix unit tests

TF-3715 Thread Detail add await for _getEmailContent in composer

TF-3715 Thread Detail remove unused emailLoaded in ThreadDetailAppBar

TF-3715 Thread Detail hide print action when isMobile

TF-3715 Thread Detail allow mark as read in EmailActionReactor

TF-3715 Thread Detail fix loadMoreThreadDetailEmails unit test

TF-3715 Thread Detail fix action small tap region

TF-3715 Thread Detail fix cannot permanent delete email

TF-3715 Thread Detail prevent close when move email

TF-3715 Thread Detail fix refresh when mark star selected collapsed email

TF-3715 Thread Detail update print action display logic

TF-3715 Thread Detail fix duplicate mark star in app bar

TF-3715 Thread Detail create new transformer for reply forward empty content email

TF-3715 Thread Detail fix email not load after open multiple times

TF-3715 Thread Detail fix close when move expanded email

TF-3715 Thread Detail fix duplicate and missing actions

TF-3715 Thread Detail restore editAsNewEmail action to _getEmailContent in setupEmailContent

TF-3715 Thread Detail update print action name

TF-3715 Thread Detail handle move and delete email with 1 item in thread detail

TF-3715 Thread Detail fix tap outside to close context menu

TF-3715 Thread Detail fix create rule and compose from recipient info

TF-3715 Thread Detail handle move and delete email with 1 item in thread detail

TF-3715 Thread Detail Fix cannot create email rule

TF-3715 Thread Detail Fix crash composer

TF-3715 Thread Detail Fix cannot unsubscribe

TF-3715 Thread Detail Fix duplicate actions on single email

TF-3715 Thread Detail Fix refresh view when reply/forward

TF-3715 Thread Detail Revert old logic to _getEmailContent

TF-3715 Thread Detail Update specific cases for UpdatedEmailKeywordsAction

TF-3715 Thread Detail Fix concurrent modification during iteration

TF-3715 Thread Detail Fix unsubscribe for all thread detail emails

TF-3715 Thread Detail Remove unnecessary Future in reactor

TF-3715 Thread Detail Remove dependency from SingleEmailController

TF-3715 Thread Detail Apply individual list post and unsubscribe header

TF-3715 Thread Detail Fix unsubscribe collapsed email

TF-3715 Thread Detail Conditionally inject rule filter interactor
This commit is contained in:
DatDang
2025-05-16 15:37:07 +07:00
committed by Dat H. Pham
parent 421fa321ba
commit 8a2ea62987
38 changed files with 2135 additions and 715 deletions
@@ -196,7 +196,7 @@ extension EmailActionTypeExtension on EmailActionType {
case EmailActionType.openInNewTab:
return appLocalizations.openInNewTab;
case EmailActionType.printAll:
return appLocalizations.printAll;
return appLocalizations.print;
case EmailActionType.forward:
return appLocalizations.forward;
case EmailActionType.replyAll:
@@ -27,78 +27,13 @@ extension SetupEmailContentExtension on ComposerController {
switch(currentEmailActionType) {
case EmailActionType.editAsNewEmail:
case EmailActionType.editDraft:
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
final emailId = arguments.presentationEmail?.id;
if (session == null) {
emailContentsViewState.value = Left(GetEmailContentFailure(NotFoundSessionException()));
return;
}
if (accountId == null) {
emailContentsViewState.value = Left(GetEmailContentFailure(NotFoundAccountIdException()));
return;
}
if (emailId == null) {
emailContentsViewState.value = Left(GetEmailContentFailure(NotFoundEmailException()));
return;
}
final resultState = await getEmailContentInteractor.execute(
session,
accountId,
emailId,
mailboxDashBoardController.baseDownloadUrl,
TransformConfiguration.forEditDraftsEmail(),
await _getEmailContent(
arguments,
transformConfiguration: TransformConfiguration.forEditDraftsEmail(),
additionalProperties: Properties({
IndividualHeaderIdentifier.identityHeader.value,
}),
).last;
final uiState = resultState.fold((failure) => failure, (success) => success);
if (uiState is GetEmailContentSuccess) {
initAttachmentsAndInlineImages(
attachments: uiState.attachments,
inlineImages: uiState.inlineImages,
);
if (currentEmailActionType == EmailActionType.editDraft ||
currentEmailActionType == EmailActionType.editAsNewEmail) {
setupEmailRequestReadReceiptFlag(
uiState.emailCurrent!.hasRequestReadReceipt,
);
setupSelectedIdentityForEditDraft(
uiState.emailCurrent!.identityIdFromHeader,
);
}
emailContentsViewState.value = Right(uiState);
} else if (uiState is GetEmailContentFromCacheSuccess) {
initAttachmentsAndInlineImages(
attachments: uiState.attachments,
inlineImages: uiState.inlineImages,
);
if (currentEmailActionType == EmailActionType.editDraft ||
currentEmailActionType == EmailActionType.editAsNewEmail) {
setupEmailRequestReadReceiptFlag(
uiState.emailCurrent.hasRequestReadReceipt,
);
setupSelectedIdentityForEditDraft(
uiState.emailCurrent.identityIdFromHeader,
);
}
emailContentsViewState.value = Right(uiState);
} else if (uiState is GetEmailContentFailure) {
emailContentsViewState.value = Left(uiState);
consumeState(Stream.value(Left(uiState)));
} else {
emailContentsViewState.value = Right(LoadEmailContentCompleted());
}
);
break;
case EmailActionType.editSendingEmail:
final sendingEmail = arguments.sendingEmail;
@@ -130,7 +65,10 @@ extension SetupEmailContentExtension on ComposerController {
case EmailActionType.replyAll:
case EmailActionType.forward:
if (arguments.emailContents?.trim().isNotEmpty != true) {
emailContentsViewState.value = Left(GetEmailContentFailure(EmptyEmailContentException()));
await _getEmailContent(
arguments,
transformConfiguration: TransformConfiguration.forReplyForwardEmptyEmail(),
);
} else {
final resultState = await transformHtmlEmailContentInteractor.execute(
arguments.emailContents ?? '',
@@ -224,4 +162,81 @@ extension SetupEmailContentExtension on ComposerController {
break;
}
}
Future<void> _getEmailContent(
ComposerArguments arguments, {
required TransformConfiguration transformConfiguration,
Properties? additionalProperties,
}) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
final emailId = arguments.presentationEmail?.id;
if (session == null) {
emailContentsViewState.value = Left(GetEmailContentFailure(NotFoundSessionException()));
return;
}
if (accountId == null) {
emailContentsViewState.value = Left(GetEmailContentFailure(NotFoundAccountIdException()));
return;
}
if (emailId == null) {
emailContentsViewState.value = Left(GetEmailContentFailure(NotFoundEmailException()));
return;
}
final resultState = await getEmailContentInteractor.execute(
session,
accountId,
emailId,
mailboxDashBoardController.baseDownloadUrl,
transformConfiguration,
additionalProperties: additionalProperties,
).last;
final uiState = resultState.fold((failure) => failure, (success) => success);
if (uiState is GetEmailContentSuccess) {
initAttachmentsAndInlineImages(
attachments: uiState.attachments,
inlineImages: uiState.inlineImages,
);
if (currentEmailActionType == EmailActionType.editDraft ||
currentEmailActionType == EmailActionType.editAsNewEmail) {
setupEmailRequestReadReceiptFlag(
uiState.emailCurrent!.hasRequestReadReceipt,
);
setupSelectedIdentityForEditDraft(
uiState.emailCurrent!.identityIdFromHeader,
);
}
emailContentsViewState.value = Right(uiState);
} else if (uiState is GetEmailContentFromCacheSuccess) {
initAttachmentsAndInlineImages(
attachments: uiState.attachments,
inlineImages: uiState.inlineImages,
);
if (currentEmailActionType == EmailActionType.editDraft
|| currentEmailActionType == EmailActionType.editAsNewEmail) {
setupEmailRequestReadReceiptFlag(
uiState.emailCurrent.hasRequestReadReceipt,
);
setupSelectedIdentityForEditDraft(
uiState.emailCurrent.identityIdFromHeader,
);
}
emailContentsViewState.value = Right(uiState);
} else if (uiState is GetEmailContentFailure) {
emailContentsViewState.value = Left(uiState);
consumeState(Stream.value(Left(uiState)));
} else {
emailContentsViewState.value = Right(LoadEmailContentCompleted());
}
}
}