TF-3427 Collapse side features of the composer in a side menu

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-01-16 11:26:32 +07:00
committed by Dat H. Pham
parent 6fa66efce2
commit 778c138a10
11 changed files with 143 additions and 77 deletions
@@ -1273,7 +1273,7 @@ class ComposerController extends BaseController
if (composerArguments.value?.emailActionType == EmailActionType.compose || if (composerArguments.value?.emailActionType == EmailActionType.compose ||
composerArguments.value?.emailActionType == EmailActionType.editDraft) { composerArguments.value?.emailActionType == EmailActionType.editDraft) {
_savedEmailDraftHash = await _hashDraftEmail(); _savedEmailDraftHash = draftEmailHash;
} }
} }
@@ -519,13 +519,18 @@ class ComposerView extends GetWidget<ComposerController> {
openRichToolbarAction: controller.richTextWebController!.toggleFormattingOptions, openRichToolbarAction: controller.richTextWebController!.toggleFormattingOptions,
attachFileAction: () => controller.openFilePickerByType(context, FileType.any), attachFileAction: () => controller.openFilePickerByType(context, FileType.any),
insertImageAction: () => controller.insertImage(context, constraints.maxWidth), insertImageAction: () => controller.insertImage(context, constraints.maxWidth),
showCodeViewAction: controller.richTextWebController!.toggleCodeView,
deleteComposerAction: () => controller.handleClickDeleteComposer(context), deleteComposerAction: () => controller.handleClickDeleteComposer(context),
saveToDraftAction: () => controller.handleClickSaveAsDraftsButton(context), saveToDraftAction: () => controller.handleClickSaveAsDraftsButton(context),
sendMessageAction: () => controller.handleClickSendButton(context), sendMessageAction: () => controller.handleClickSendButton(context),
requestReadReceiptAction: () => controller.toggleRequestReadReceipt(context),
isPrintDraftEnabled: controller.isEmailChanged.isTrue, isPrintDraftEnabled: controller.isEmailChanged.isTrue,
onPrintDraftAction: () => controller.printDraft(context), openContextMenuAction: (position) {
controller.openPopupMenuAction(
context,
position,
_createMoreOptionPopupItemsOnDesktop(context),
radius: ComposerStyle.popupMenuRadius,
);
},
)), )),
], ],
), ),
@@ -801,13 +806,18 @@ class ComposerView extends GetWidget<ComposerController> {
openRichToolbarAction: controller.richTextWebController!.toggleFormattingOptions, openRichToolbarAction: controller.richTextWebController!.toggleFormattingOptions,
attachFileAction: () => controller.openFilePickerByType(context, FileType.any), attachFileAction: () => controller.openFilePickerByType(context, FileType.any),
insertImageAction: () => controller.insertImage(context, constraints.maxWidth), insertImageAction: () => controller.insertImage(context, constraints.maxWidth),
showCodeViewAction: controller.richTextWebController!.toggleCodeView,
deleteComposerAction: () => controller.handleClickDeleteComposer(context), deleteComposerAction: () => controller.handleClickDeleteComposer(context),
saveToDraftAction: () => controller.handleClickSaveAsDraftsButton(context), saveToDraftAction: () => controller.handleClickSaveAsDraftsButton(context),
sendMessageAction: () => controller.handleClickSendButton(context), sendMessageAction: () => controller.handleClickSendButton(context),
requestReadReceiptAction: () => controller.toggleRequestReadReceipt(context),
isPrintDraftEnabled: controller.isEmailChanged.isTrue, isPrintDraftEnabled: controller.isEmailChanged.isTrue,
onPrintDraftAction: () => controller.printDraft(context), openContextMenuAction: (position) {
controller.openPopupMenuAction(
context,
position,
_createMoreOptionPopupItemsOnDesktop(context),
radius: ComposerStyle.popupMenuRadius,
);
},
)), )),
], ],
), ),
@@ -936,6 +946,7 @@ class ComposerView extends GetWidget<ComposerController> {
child: PopupItemWidget( child: PopupItemWidget(
controller.imagePaths.icDeleteMailbox, controller.imagePaths.icDeleteMailbox,
AppLocalizations.of(context).delete, AppLocalizations.of(context).delete,
colorIcon: ComposerStyle.popupItemIconColor,
styleName: ComposerStyle.popupItemTextStyle, styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding, padding: ComposerStyle.popupItemPadding,
onCallbackAction: () { onCallbackAction: () {
@@ -946,4 +957,56 @@ class ComposerView extends GetWidget<ComposerController> {
), ),
]; ];
} }
List<PopupMenuEntry> _createMoreOptionPopupItemsOnDesktop(BuildContext context) {
return [
PopupMenuItem(
padding: EdgeInsets.zero,
child: PopupItemWidget(
controller.imagePaths.icStyleCodeView,
AppLocalizations.of(context).embedCode,
styleName: ComposerStyle.popupItemTextStyle,
colorIcon: ComposerStyle.popupItemIconColor,
padding: ComposerStyle.popupItemPadding,
selectedIcon: controller.imagePaths.icFilterSelected,
isSelected: controller.richTextWebController?.codeViewEnabled,
onCallbackAction: () {
popBack();
controller.richTextWebController?.toggleCodeView();
},
),
),
PopupMenuItem(
padding: EdgeInsets.zero,
child: PopupItemWidget(
controller.imagePaths.icReadReceipt,
AppLocalizations.of(context).requestReadReceipt,
styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding,
colorIcon: ComposerStyle.popupItemIconColor,
selectedIcon: controller.imagePaths.icFilterSelected,
isSelected: controller.hasRequestReadReceipt.value,
onCallbackAction: () {
popBack();
controller.toggleRequestReadReceipt(context);
},
),
),
if (controller.isEmailChanged.isTrue)
PopupMenuItem(
padding: EdgeInsets.zero,
child: PopupItemWidget(
controller.imagePaths.icPrinter,
AppLocalizations.of(context).print,
colorIcon: ComposerStyle.popupItemIconColor,
styleName: ComposerStyle.popupItemTextStyle,
padding: ComposerStyle.popupItemPadding,
onCallbackAction: () {
popBack();
controller.printDraft(context);
},
),
),
];
}
} }
@@ -4,13 +4,14 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:model/extensions/identity_extension.dart';
import 'package:model/extensions/list_email_address_extension.dart'; import 'package:model/extensions/list_email_address_extension.dart';
import 'package:model/extensions/presentation_email_extension.dart'; import 'package:model/extensions/presentation_email_extension.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/state/button_state.dart'; import 'package:tmail_ui_user/features/base/state/button_state.dart';
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/draft_email_print.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/web/print_draft_dialog_view.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/print_draft_dialog_view.dart';
import 'package:tmail_ui_user/features/email/domain/model/email_print.dart';
import 'package:tmail_ui_user/features/email/domain/state/print_email_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/print_email_state.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
@@ -62,10 +63,10 @@ extension ComposerPrintDraftExtension on ComposerController {
final childWidget = PointerInterceptor( final childWidget = PointerInterceptor(
child: PrintDraftDialogView( child: PrintDraftDialogView(
emailPrint: EmailPrint( emailPrint: DraftEmailPrint(
appName: appLocalizations.app_name, appName: appLocalizations.app_name,
userName: mailboxDashBoardController.userEmail, userName: mailboxDashBoardController.userEmail,
attachments: uploadController.attachmentsUploaded, attachments: uploadController.allAttachmentsUploaded,
emailContent: emailContent, emailContent: emailContent,
locale: locale.toLanguageTag(), locale: locale.toLanguageTag(),
fromPrefix: appLocalizations.from_email_address_prefix, fromPrefix: appLocalizations.from_email_address_prefix,
@@ -77,9 +78,7 @@ extension ComposerPrintDraftExtension on ComposerController {
toAddress: listToEmailAddress.toSet().toEscapeHtmlStringUseCommaSeparator(), toAddress: listToEmailAddress.toSet().toEscapeHtmlStringUseCommaSeparator(),
ccAddress: listCcEmailAddress.toSet().toEscapeHtmlStringUseCommaSeparator(), ccAddress: listCcEmailAddress.toSet().toEscapeHtmlStringUseCommaSeparator(),
bccAddress: listBccEmailAddress.toSet().toEscapeHtmlStringUseCommaSeparator(), bccAddress: listBccEmailAddress.toSet().toEscapeHtmlStringUseCommaSeparator(),
sender: composerArguments.value!.presentationEmail?.from?.isNotEmpty == true sender: identitySelected.value?.toEmailAddress(),
? composerArguments.value!.presentationEmail?.from!.first
: null,
receiveTime: presentationEmail?.getReceivedAt( receiveTime: presentationEmail?.getReceivedAt(
locale.toLanguageTag(), locale.toLanguageTag(),
pattern: presentationEmail.receivedAt pattern: presentationEmail.receivedAt
@@ -0,0 +1,25 @@
import 'package:tmail_ui_user/features/email/domain/model/email_print.dart';
class DraftEmailPrint extends EmailPrint {
DraftEmailPrint({
required super.appName,
required super.userName,
required super.emailContent,
required super.locale,
required super.fromPrefix,
required super.toPrefix,
required super.ccPrefix,
required super.bccPrefix,
required super.replyToPrefix,
required super.titleAttachment,
required super.receiveTime,
super.attachments,
super.toAddress,
super.ccAddress,
super.bccAddress,
super.replyToAddress,
super.sender,
super.subject,
});
}
@@ -14,7 +14,7 @@ class ComposerStyle {
static const Color backgroundEditorColor = Colors.white; static const Color backgroundEditorColor = Colors.white;
static const Color richToolbarColor = Colors.white; static const Color richToolbarColor = Colors.white;
static const Color mobileBackgroundColor = Colors.white; static const Color mobileBackgroundColor = Colors.white;
static const Color popupItemIconColor = AppColor.primaryColor; static const Color popupItemIconColor = AppColor.steelGrayA540;
static const EdgeInsetsGeometry richToolbarPadding = EdgeInsetsDirectional.symmetric(horizontal: 24, vertical: 8); static const EdgeInsetsGeometry richToolbarPadding = EdgeInsetsDirectional.symmetric(horizontal: 24, vertical: 8);
static const EdgeInsetsGeometry desktopRecipientPadding = EdgeInsetsDirectional.only(end: 24); static const EdgeInsetsGeometry desktopRecipientPadding = EdgeInsetsDirectional.only(end: 24);
@@ -13,10 +13,10 @@ class BottomBarComposerWidgetStyle {
static const double height = 60; static const double height = 60;
static const Color backgroundColor = Colors.white; static const Color backgroundColor = Colors.white;
static const Color iconColor = AppColor.colorRichButtonComposer; static const Color iconColor = AppColor.steelGrayA540;
static const Color sendButtonBackgroundColor = AppColor.primaryColor; static const Color sendButtonBackgroundColor = AppColor.blue700;
static const Color selectedBackgroundColor = AppColor.colorSelected; static const Color selectedIconColor = AppColor.blue700;
static const Color selectedIconColor = AppColor.primaryColor; static const Color disabledIconColor = AppColor.colorRichButtonComposer;
static const EdgeInsetsGeometry padding = EdgeInsetsDirectional.symmetric(horizontal: 32); static const EdgeInsetsGeometry padding = EdgeInsetsDirectional.symmetric(horizontal: 32);
static const EdgeInsetsGeometry iconPadding = EdgeInsetsDirectional.all(5); static const EdgeInsetsGeometry iconPadding = EdgeInsetsDirectional.all(5);
@@ -1,8 +1,8 @@
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:tmail_ui_user/features/composer/presentation/styles/web/bottom_bar_composer_widget_style.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/web/bottom_bar_composer_widget_style.dart';
import 'package:tmail_ui_user/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class BottomBarComposerWidget extends StatelessWidget { class BottomBarComposerWidget extends StatelessWidget {
@@ -15,12 +15,10 @@ class BottomBarComposerWidget extends StatelessWidget {
final VoidCallback openRichToolbarAction; final VoidCallback openRichToolbarAction;
final VoidCallback attachFileAction; final VoidCallback attachFileAction;
final VoidCallback insertImageAction; final VoidCallback insertImageAction;
final VoidCallback showCodeViewAction;
final VoidCallback deleteComposerAction; final VoidCallback deleteComposerAction;
final VoidCallback saveToDraftAction; final VoidCallback saveToDraftAction;
final VoidCallback sendMessageAction; final VoidCallback sendMessageAction;
final VoidCallback requestReadReceiptAction; final OnOpenContextMenuAction openContextMenuAction;
final VoidCallback onPrintDraftAction;
const BottomBarComposerWidget({ const BottomBarComposerWidget({
super.key, super.key,
@@ -32,12 +30,10 @@ class BottomBarComposerWidget extends StatelessWidget {
required this.openRichToolbarAction, required this.openRichToolbarAction,
required this.attachFileAction, required this.attachFileAction,
required this.insertImageAction, required this.insertImageAction,
required this.showCodeViewAction,
required this.deleteComposerAction, required this.deleteComposerAction,
required this.saveToDraftAction, required this.saveToDraftAction,
required this.sendMessageAction, required this.sendMessageAction,
required this.requestReadReceiptAction, required this.openContextMenuAction,
required this.onPrintDraftAction,
}); });
@override @override
@@ -52,9 +48,7 @@ class BottomBarComposerWidget extends StatelessWidget {
icon: imagePaths.icRichToolbar, icon: imagePaths.icRichToolbar,
borderRadius: BottomBarComposerWidgetStyle.iconRadius, borderRadius: BottomBarComposerWidgetStyle.iconRadius,
padding: BottomBarComposerWidgetStyle.richTextIconPadding, padding: BottomBarComposerWidgetStyle.richTextIconPadding,
backgroundColor: isFormattingOptionsEnabled backgroundColor: Colors.transparent,
? BottomBarComposerWidgetStyle.selectedBackgroundColor
: Colors.transparent,
iconSize: BottomBarComposerWidgetStyle.richTextIconSize, iconSize: BottomBarComposerWidgetStyle.richTextIconSize,
iconColor: isFormattingOptionsEnabled iconColor: isFormattingOptionsEnabled
? BottomBarComposerWidgetStyle.selectedIconColor ? BottomBarComposerWidgetStyle.selectedIconColor
@@ -78,7 +72,9 @@ class BottomBarComposerWidget extends StatelessWidget {
absorbing: isCodeViewEnabled, absorbing: isCodeViewEnabled,
child: TMailButtonWidget.fromIcon( child: TMailButtonWidget.fromIcon(
icon: imagePaths.icInsertImage, icon: imagePaths.icInsertImage,
iconColor: BottomBarComposerWidgetStyle.iconColor, iconColor: isCodeViewEnabled
? BottomBarComposerWidgetStyle.disabledIconColor
: BottomBarComposerWidgetStyle.iconColor,
borderRadius: BottomBarComposerWidgetStyle.iconRadius, borderRadius: BottomBarComposerWidgetStyle.iconRadius,
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
padding: BottomBarComposerWidgetStyle.iconPadding, padding: BottomBarComposerWidgetStyle.iconPadding,
@@ -89,18 +85,12 @@ class BottomBarComposerWidget extends StatelessWidget {
), ),
const SizedBox(width: BottomBarComposerWidgetStyle.space), const SizedBox(width: BottomBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon( TMailButtonWidget.fromIcon(
icon: imagePaths.icStyleCodeView, icon: imagePaths.icMore,
iconColor: isCodeViewEnabled iconColor: BottomBarComposerWidgetStyle.iconColor,
? BottomBarComposerWidgetStyle.selectedIconColor backgroundColor: Colors.transparent,
: BottomBarComposerWidgetStyle.iconColor,
borderRadius: BottomBarComposerWidgetStyle.iconRadius,
backgroundColor: isCodeViewEnabled
? BottomBarComposerWidgetStyle.selectedBackgroundColor
: Colors.transparent,
padding: BottomBarComposerWidgetStyle.iconPadding,
iconSize: BottomBarComposerWidgetStyle.iconSize, iconSize: BottomBarComposerWidgetStyle.iconSize,
tooltipMessage: AppLocalizations.of(context).embedCode, tooltipMessage: AppLocalizations.of(context).more,
onTapActionCallback: showCodeViewAction, onTapActionAtPositionCallback: openContextMenuAction,
), ),
const Spacer(), const Spacer(),
TMailButtonWidget.fromIcon( TMailButtonWidget.fromIcon(
@@ -108,42 +98,19 @@ class BottomBarComposerWidget extends StatelessWidget {
borderRadius: BottomBarComposerWidgetStyle.iconRadius, borderRadius: BottomBarComposerWidgetStyle.iconRadius,
padding: BottomBarComposerWidgetStyle.iconPadding, padding: BottomBarComposerWidgetStyle.iconPadding,
iconSize: BottomBarComposerWidgetStyle.iconSize, iconSize: BottomBarComposerWidgetStyle.iconSize,
iconColor: BottomBarComposerWidgetStyle.iconColor,
backgroundColor: Colors.transparent,
tooltipMessage: AppLocalizations.of(context).delete, tooltipMessage: AppLocalizations.of(context).delete,
onTapActionCallback: deleteComposerAction, onTapActionCallback: deleteComposerAction,
), ),
const SizedBox(width: BottomBarComposerWidgetStyle.space), const SizedBox(width: BottomBarComposerWidgetStyle.space),
TMailButtonWidget.fromIcon(
icon: imagePaths.icReadReceipt,
borderRadius: BottomBarComposerWidgetStyle.iconRadius,
padding: BottomBarComposerWidgetStyle.iconPadding,
iconSize: BottomBarComposerWidgetStyle.iconSize,
iconColor: hasReadReceipt
? BottomBarComposerWidgetStyle.selectedIconColor
: BottomBarComposerWidgetStyle.iconColor,
tooltipMessage: hasReadReceipt
? AppLocalizations.of(context).turnOffRequestReadReceipt
: AppLocalizations.of(context).turnOnRequestReadReceipt,
onTapActionCallback: requestReadReceiptAction,
),
const SizedBox(width: BottomBarComposerWidgetStyle.space),
if (isPrintDraftEnabled)
TMailButtonWidget.fromIcon(
icon: imagePaths.icPrinter,
borderRadius: BottomBarComposerWidgetStyle.iconRadius,
padding: BottomBarComposerWidgetStyle.iconPadding,
iconSize: BottomBarComposerWidgetStyle.iconSize,
iconColor: AppColor.steelGrayA540,
margin: const EdgeInsetsDirectional.only(
end: BottomBarComposerWidgetStyle.space,
),
tooltipMessage: AppLocalizations.of(context).print,
onTapActionCallback: onPrintDraftAction,
),
TMailButtonWidget.fromIcon( TMailButtonWidget.fromIcon(
icon: imagePaths.icSaveToDraft, icon: imagePaths.icSaveToDraft,
borderRadius: BottomBarComposerWidgetStyle.iconRadius, borderRadius: BottomBarComposerWidgetStyle.iconRadius,
padding: BottomBarComposerWidgetStyle.iconPadding, padding: BottomBarComposerWidgetStyle.iconPadding,
iconSize: BottomBarComposerWidgetStyle.iconSize, iconSize: BottomBarComposerWidgetStyle.iconSize,
backgroundColor: Colors.transparent,
iconColor: BottomBarComposerWidgetStyle.iconColor,
tooltipMessage: AppLocalizations.of(context).saveAsDraft, tooltipMessage: AppLocalizations.of(context).saveAsDraft,
onTapActionCallback: saveToDraftAction, onTapActionCallback: saveToDraftAction,
), ),
@@ -7,6 +7,7 @@ import 'package:core/utils/file_utils.dart';
import 'package:core/utils/print_utils.dart'; import 'package:core/utils/print_utils.dart';
import 'package:filesize/filesize.dart'; import 'package:filesize/filesize.dart';
import 'package:model/email/attachment.dart'; import 'package:model/email/attachment.dart';
import 'package:tmail_ui_user/features/composer/presentation/model/draft_email_print.dart';
import 'package:tmail_ui_user/features/email/data/datasource/print_file_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/print_file_datasource.dart';
import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart'; import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
import 'package:tmail_ui_user/features/email/domain/model/email_print.dart'; import 'package:tmail_ui_user/features/email/domain/model/email_print.dart';
@@ -32,8 +33,7 @@ class PrintFileDataSourceImpl extends PrintFileDataSource {
@override @override
Future<void> printEmail(EmailPrint emailPrint) { Future<void> printEmail(EmailPrint emailPrint) {
return Future.sync(() async { return Future.sync(() async {
final emailContentEscaped = await _transformHtmlEmailContent( final emailContentEscaped = await _transformHtmlEmailContent(emailPrint);
emailPrint.emailContent);
final List<PrintAttachment> listPrintAttachment = []; final List<PrintAttachment> listPrintAttachment = [];
@@ -72,16 +72,23 @@ class PrintFileDataSourceImpl extends PrintFileDataSource {
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
Future<String> _transformHtmlEmailContent(String emailContent) async { Future<String> _transformHtmlEmailContent(EmailPrint emailPrint) async {
try { try {
final htmlContentTransformed = await _htmlAnalyzer.transformHtmlEmailContent( if (emailPrint.emailContent.isEmpty) return '';
emailContent,
TransformConfiguration.forPrintEmail(), final htmlContentTransformed = emailPrint is DraftEmailPrint
); ? await _htmlAnalyzer.removeCollapsedExpandedSignatureEffect(
emailContent: emailPrint.emailContent,
)
: await _htmlAnalyzer.transformHtmlEmailContent(
emailPrint.emailContent,
TransformConfiguration.forPrintEmail(),
);
return htmlContentTransformed; return htmlContentTransformed;
} catch (e) { } catch (e) {
logError('PrintFileDataSourceImpl::_transformHtmlEmailContent: Exception: $e'); logError('PrintFileDataSourceImpl::_transformHtmlEmailContent: Exception: $e');
return emailContent; return '';
} }
} }
} }
@@ -471,6 +471,11 @@ class UploadController extends BaseController {
return mapInlineAttachments; return mapInlineAttachments;
} }
List<Attachment> get allAttachmentsUploaded => [
...attachmentsUploaded,
...inlineAttachmentsUploaded,
];
void _handleUploadAttachmentFailure(UploadAttachmentFailure failure) { void _handleUploadAttachmentFailure(UploadAttachmentFailure failure) {
if (currentContext != null && currentOverlayContext != null) { if (currentContext != null && currentOverlayContext != null) {
appToast.showToastErrorMessage( appToast.showToastErrorMessage(
@@ -6,6 +6,8 @@ import 'package:model/identity/identity_request_dto.dart';
extension IdentityExtension on Identity { extension IdentityExtension on Identity {
EmailAddress toEmailAddressNoName() => EmailAddress(null, email); EmailAddress toEmailAddressNoName() => EmailAddress(null, email);
EmailAddress toEmailAddress() => EmailAddress(name, email);
IdentityRequestDto toIdentityRequest() => IdentityRequestDto( IdentityRequestDto toIdentityRequest() => IdentityRequestDto(
name: name, name: name,
replyTo: replyTo, replyTo: replyTo,
@@ -1272,7 +1272,6 @@ void main() {
composerController?.handleSuccessViewState(state); composerController?.handleSuccessViewState(state);
// assert // assert
verifyNever(mockHtmlEditorApi.getText());
expect(composerController?.savedEmailDraftHash, isNull); expect(composerController?.savedEmailDraftHash, isNull);
}); });
@@ -1292,7 +1291,6 @@ void main() {
composerController?.handleFailureViewState(state); composerController?.handleFailureViewState(state);
// assert // assert
verifyNever(mockHtmlEditorApi.getText());
expect(composerController?.savedEmailDraftHash, isNull); expect(composerController?.savedEmailDraftHash, isNull);
}); });