TF-3685 Add integration test for case change identity in draft email

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-04-23 11:40:59 +07:00
committed by Dat H. Pham
parent 80dff51c77
commit ef1f979c4b
10 changed files with 312 additions and 112 deletions
@@ -114,7 +114,7 @@ class ComposerView extends GetWidget<ComposerController> {
children: [
Obx(() {
if (controller.fromRecipientState.value == PrefixRecipientState.enabled) {
return FromComposerMobileWidget(
return FromComposerMobileWidget(
selectedIdentity: controller.identitySelected.value,
imagePaths: controller.imagePaths,
responsiveUtils: controller.responsiveUtils,
@@ -551,6 +551,7 @@ class ComposerView extends GetWidget<ComposerController> {
PopupMenuItem(
padding: EdgeInsets.zero,
child: PopupItemWidget(
key: const Key('save_as_draft_popup_item'),
iconAction: controller.imagePaths.icSaveToDraft,
nameAction: AppLocalizations.of(context).saveAsDraft,
colorIcon: ComposerStyle.popupItemIconColor,
@@ -1,5 +1,4 @@
import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/html_transformer/transform_configuration.dart';
import 'package:core/utils/platform_info.dart';
import 'package:dartz/dartz.dart';
@@ -96,7 +95,7 @@ extension SetupEmailContentExtension on ComposerController {
emailContentsViewState.value = Left(uiState);
consumeState(Stream.value(Left(uiState)));
} else {
emailContentsViewState.value = Right(UIState.idle);
emailContentsViewState.value = Right(LoadEmailContentCompleted());
}
break;
case EmailActionType.editSendingEmail:
@@ -161,7 +160,7 @@ extension SetupEmailContentExtension on ComposerController {
emailContentsViewState.value = Left(GetEmailContentFailure(uiState.exception));
consumeState(Stream.value(Left(GetEmailContentFailure(uiState.exception))));
} else {
emailContentsViewState.value = Right(UIState.idle);
emailContentsViewState.value = Right(LoadEmailContentCompleted());
}
}
break;
@@ -207,7 +206,7 @@ extension SetupEmailContentExtension on ComposerController {
emailContentsViewState.value = Left(GetEmailContentFailure(uiState.exception));
consumeState(Stream.value(Left(GetEmailContentFailure(uiState.exception))));
} else {
emailContentsViewState.value = Right(UIState.idle);
emailContentsViewState.value = Right(LoadEmailContentCompleted());
}
}
break;
@@ -219,7 +218,7 @@ extension SetupEmailContentExtension on ComposerController {
emailContentsViewState.value = Right(successState);
break;
default:
emailContentsViewState.value = Right(UIState.idle);
emailContentsViewState.value = Right(LoadEmailContentCompleted());
break;
}
}
@@ -31,117 +31,122 @@ class MobileEditorView extends StatelessWidget with EditorViewMixin {
@override
Widget build(BuildContext context) {
if (arguments == null) {
if (arguments == null || contentViewState == null) {
return const SizedBox.shrink();
}
switch (arguments!.emailActionType) {
case EmailActionType.compose:
case EmailActionType.composeFromEmailAddress:
case EmailActionType.composeFromFileShared:
return MobileEditorWidget(
content: HtmlExtension.editorStartTags,
direction: AppUtils.getCurrentDirection(context),
onCreatedEditorAction: onCreatedEditorAction,
onLoadCompletedEditorAction: onLoadCompletedEditorAction,
onEditorContentHeightChanged: onEditorContentHeightChanged,
);
case EmailActionType.editDraft:
case EmailActionType.editSendingEmail:
case EmailActionType.composeFromContentShared:
case EmailActionType.reopenComposerBrowser:
case EmailActionType.composeFromMailtoUri:
case EmailActionType.composeFromUnsubscribeMailtoLink:
case EmailActionType.editAsNewEmail:
if (contentViewState == null) {
return const SizedBox.shrink();
}
return contentViewState!.fold(
(failure) => MobileEditorWidget(
content: HtmlExtension.editorStartTags,
direction: AppUtils.getCurrentDirection(context),
onCreatedEditorAction: onCreatedEditorAction,
onLoadCompletedEditorAction: onLoadCompletedEditorAction,
onEditorContentHeightChanged: onEditorContentHeightChanged,
),
(success) {
if (success is GetEmailContentLoading) {
return const CupertinoLoadingWidget(padding: EdgeInsets.all(16.0));
} else {
var newContent = HtmlExtension.editorStartTags;
if (success is GetEmailContentSuccess) {
newContent = success.htmlEmailContent;
} else if (success is GetEmailContentFromCacheSuccess) {
newContent = success.htmlEmailContent;
}
if (newContent.isEmpty) {
newContent = HtmlExtension.editorStartTags;
}
return MobileEditorWidget(
content: newContent,
direction: AppUtils.getCurrentDirection(context),
onCreatedEditorAction: onCreatedEditorAction,
onLoadCompletedEditorAction: onLoadCompletedEditorAction,
onEditorContentHeightChanged: onEditorContentHeightChanged,
);
}
final direction = AppUtils.getCurrentDirection(context);
final locale = Localizations.localeOf(context);
final appLocalizations = AppLocalizations.of(context);
final actionType = arguments!.emailActionType;
if (_isEditOrComposeAction(actionType)) {
return contentViewState!.fold(
(_) => buildEditor(direction: direction),
(success) {
if (success is GetEmailContentLoading) {
return const CupertinoLoadingWidget(padding: EdgeInsets.all(16.0));
}
);
case EmailActionType.reply:
case EmailActionType.replyToList:
case EmailActionType.replyAll:
case EmailActionType.forward:
if (contentViewState == null) {
return const SizedBox.shrink();
}
return contentViewState!.fold(
(failure) {
final emailContentQuoted = getEmailContentQuotedAsHtml(
locale: Localizations.localeOf(context),
appLocalizations: AppLocalizations.of(context),
emailContent: '',
emailActionType: arguments!.emailActionType,
presentationEmail: arguments!.presentationEmail!
);
return MobileEditorWidget(
content: emailContentQuoted,
direction: AppUtils.getCurrentDirection(context),
onCreatedEditorAction: onCreatedEditorAction,
onLoadCompletedEditorAction: onLoadCompletedEditorAction,
onEditorContentHeightChanged: onEditorContentHeightChanged,
);
},
(success) {
if (success is GetEmailContentLoading) {
return const CupertinoLoadingWidget(padding: EdgeInsets.all(16.0));
} else {
final emailContentQuoted = getEmailContentQuotedAsHtml(
locale: Localizations.localeOf(context),
appLocalizations: AppLocalizations.of(context),
emailContent: success is GetEmailContentSuccess
? success.htmlEmailContent
: '',
emailActionType: arguments!.emailActionType,
presentationEmail: arguments!.presentationEmail!
);
return MobileEditorWidget(
content: emailContentQuoted,
direction: AppUtils.getCurrentDirection(context),
onCreatedEditorAction: onCreatedEditorAction,
onLoadCompletedEditorAction: onLoadCompletedEditorAction,
onEditorContentHeightChanged: onEditorContentHeightChanged,
);
}
String newContent = '';
if (success is GetEmailContentSuccess) {
newContent = success.htmlEmailContent;
} else if (success is GetEmailContentFromCacheSuccess) {
newContent = success.htmlEmailContent;
}
);
default:
return MobileEditorWidget(
content: HtmlExtension.editorStartTags,
direction: AppUtils.getCurrentDirection(context),
onCreatedEditorAction: onCreatedEditorAction,
onLoadCompletedEditorAction: onLoadCompletedEditorAction,
onEditorContentHeightChanged: onEditorContentHeightChanged,
);
return buildEditor(
direction: direction,
content: newContent,
);
},
);
}
if (_isReplyOrForwardAction(actionType)) {
return contentViewState!.fold(
(_) => buildEditor(
direction: direction,
content: _buildQuotedContent(
appLocalizations: appLocalizations,
locale: locale,
),
),
(success) {
if (success is GetEmailContentLoading) {
return const CupertinoLoadingWidget(padding: EdgeInsets.all(16.0));
}
return buildEditor(
direction: direction,
content: _buildQuotedContent(
appLocalizations: appLocalizations,
locale: locale,
emailContent: success is GetEmailContentSuccess
? success.htmlEmailContent
: '',
),
);
},
);
}
return contentViewState!.fold(
(_) => buildEditor(direction: direction),
(success) {
if (success is GetEmailContentLoading) {
return const CupertinoLoadingWidget(padding: EdgeInsets.all(16.0));
}
return buildEditor(direction: direction);
},
);
}
bool _isEditOrComposeAction(EmailActionType type) {
return {
EmailActionType.editDraft,
EmailActionType.editSendingEmail,
EmailActionType.composeFromContentShared,
EmailActionType.reopenComposerBrowser,
EmailActionType.composeFromMailtoUri,
EmailActionType.composeFromUnsubscribeMailtoLink,
EmailActionType.editAsNewEmail,
}.contains(type);
}
bool _isReplyOrForwardAction(EmailActionType type) {
return {
EmailActionType.reply,
EmailActionType.replyToList,
EmailActionType.replyAll,
EmailActionType.forward,
}.contains(type);
}
String _buildQuotedContent({
required AppLocalizations appLocalizations,
required Locale locale,
String emailContent = '',
}) {
return getEmailContentQuotedAsHtml(
locale: locale,
appLocalizations: appLocalizations,
emailContent: emailContent,
emailActionType: arguments!.emailActionType,
presentationEmail: arguments!.presentationEmail!,
);
}
Widget buildEditor({
required TextDirection direction,
String content = '',
}) {
return MobileEditorWidget(
content: content.isEmpty ? HtmlExtension.editorStartTags : content,
direction: direction,
onCreatedEditorAction: onCreatedEditorAction,
onLoadCompletedEditorAction: onLoadCompletedEditorAction,
onEditorContentHeightChanged: onEditorContentHeightChanged,
);
}
}
@@ -49,6 +49,8 @@ class GetEmailContentFromCacheSuccess extends UIState {
];
}
class LoadEmailContentCompleted extends UIState {}
class GetEmailContentFailure extends FeatureFailure {
GetEmailContentFailure(dynamic exception, {super.onRetry})