diff --git a/lib/features/email/domain/model/email_print.dart b/lib/features/email/domain/model/email_print.dart index d37dec519..3c1f33063 100644 --- a/lib/features/email/domain/model/email_print.dart +++ b/lib/features/email/domain/model/email_print.dart @@ -1,12 +1,6 @@ import 'package:equatable/equatable.dart'; -import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/email/attachment.dart'; -import 'package:model/extensions/list_email_address_extension.dart'; -import 'package:model/extensions/presentation_email_extension.dart'; -import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; -import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart'; -import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class EmailPrint with EquatableMixin { final String appName; @@ -45,30 +39,6 @@ class EmailPrint with EquatableMixin { this.replyToAddress, }); - factory EmailPrint.generate({ - required PrintEmailAction printEmailAction, - required EmailLoaded emailLoaded - }) { - return EmailPrint( - appName: AppLocalizations.of(printEmailAction.context).app_name, - userName: printEmailAction.userEmail, - emailInformation: printEmailAction.email.toEmail(), - attachments: emailLoaded.attachments, - emailContent: emailLoaded.htmlContent, - locale: Localizations.localeOf(printEmailAction.context).toLanguageTag(), - fromPrefix: AppLocalizations.of(printEmailAction.context).from_email_address_prefix, - toPrefix: AppLocalizations.of(printEmailAction.context).to_email_address_prefix, - ccPrefix: AppLocalizations.of(printEmailAction.context).cc_email_address_prefix, - bccPrefix: AppLocalizations.of(printEmailAction.context).bcc_email_address_prefix, - replyToPrefix: AppLocalizations.of(printEmailAction.context).replyToEmailAddressPrefix, - titleAttachment: AppLocalizations.of(printEmailAction.context).attachments.toLowerCase(), - toAddress: printEmailAction.email.to?.listEmailAddressToString(isFullEmailAddress: true), - ccAddress: printEmailAction.email.cc?.listEmailAddressToString(isFullEmailAddress: true), - bccAddress: printEmailAction.email.bcc?.listEmailAddressToString(isFullEmailAddress: true), - replyToAddress: printEmailAction.email.replyTo?.listEmailAddressToString(isFullEmailAddress: true), - ); - } - @override List get props => [ appName, diff --git a/lib/features/email/presentation/action/email_ui_action.dart b/lib/features/email/presentation/action/email_ui_action.dart index 3a276779b..67fce9729 100644 --- a/lib/features/email/presentation/action/email_ui_action.dart +++ b/lib/features/email/presentation/action/email_ui_action.dart @@ -1,7 +1,5 @@ -import 'package:flutter/cupertino.dart'; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; -import 'package:model/email/presentation_email.dart'; import 'package:tmail_ui_user/features/base/action/ui_action.dart'; class EmailUIAction extends UIAction { @@ -26,22 +24,6 @@ class CloseEmailDetailedViewToRedirectToTheInboxAction extends EmailUIAction {} class CloseEmailDetailedViewAction extends EmailUIAction {} -class PrintEmailAction extends EmailUIAction { - - final BuildContext context; - final String userEmail; - final PresentationEmail email; - - PrintEmailAction({ - required this.context, - required this.userEmail, - required this.email - }); - - @override - List get props => [context, userEmail, email]; -} - class HideEmailContentViewAction extends EmailUIAction {} class ShowEmailContentViewAction extends EmailUIAction {} \ No newline at end of file diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 68fdcf9e2..49f05d331 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -29,6 +29,7 @@ import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:share_plus/share_plus.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart'; +import 'package:tmail_ui_user/features/base/state/button_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart'; import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart'; @@ -145,11 +146,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin { final emailUnsubscribe = Rxn(); final attachmentsViewState = RxMap>(); final isEmailContentHidden = RxBool(false); + final currentEmailLoaded = Rxn(); EmailId? _currentEmailId; Identity? _identitySelected; - EmailLoaded? _currentEmailLoaded; - PrintEmailAction? _printEmailAction; + ButtonState? _printEmailButtonState; final StreamController> _downloadProgressStateController = StreamController>.broadcast(); @@ -157,8 +158,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin { PresentationEmail? get currentEmail => mailboxDashBoardController.selectedEmail.value; - EmailLoaded? get currentEmailLoaded => _currentEmailLoaded; - bool get calendarEventProcessing => viewState.value.fold( (failure) => false, (success) => success is CalendarEventReplying || success is StoreEventAttendanceStatusLoading); @@ -499,12 +498,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } emailSupervisorController.popEmailQueue(success.emailCurrent?.id); - _currentEmailLoaded = EmailLoaded( + currentEmailLoaded.value = EmailLoaded( htmlContent: success.htmlEmailContent, attachments: List.of(success.attachments), emailCurrent: success.emailCurrent, ); - emailSupervisorController.pushEmailQueue(_currentEmailLoaded!); + emailSupervisorController.pushEmailQueue(currentEmailLoaded.value!); if (success.emailCurrent?.id == currentEmail?.id) { attachments.value = success.attachments; @@ -543,12 +542,12 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } emailSupervisorController.popEmailQueue(success.emailCurrent?.id); - _currentEmailLoaded = EmailLoaded( + currentEmailLoaded.value = EmailLoaded( htmlContent: success.htmlEmailContent, attachments: List.of(success.attachments), emailCurrent: success.emailCurrent, ); - emailSupervisorController.pushEmailQueue(_currentEmailLoaded!); + emailSupervisorController.pushEmailQueue(currentEmailLoaded.value!); if (success.emailCurrent?.id == currentEmail?.id) { attachments.value = success.attachments; @@ -567,13 +566,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin { emailContents.value = success.htmlEmailContent; } - if (_printEmailAction != null) { - _handlePrintEmailWhenEmailContentLoaded( - action: _printEmailAction!, - emailLoaded: _currentEmailLoaded! - ); - } - if (PlatformInfo.isMobile) { final detailedEmail = DetailedEmail( emailId: currentEmail!.id!, @@ -627,12 +619,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void _resetToOriginalValue({bool isEmailClosing = false}) { emailContents.value = null; - _currentEmailLoaded = null; + currentEmailLoaded.value = null; attachments.clear(); attachmentsViewState.value = {}; blobCalendarEvent.value = null; emailUnsubscribe.value = null; - _printEmailAction = null; _identitySelected = null; if (isEmailClosing) { emailLoadedViewState.value = Right(UIState.idle); @@ -1350,10 +1341,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin { mailboxDashBoardController.goToComposer( ComposerArguments.replyEmail( presentationEmail: presentationEmail, - content: _currentEmailLoaded?.htmlContent ?? '', + content: currentEmailLoaded.value?.htmlContent ?? '', mailboxRole: presentationEmail.mailboxContain?.role, - messageId: _currentEmailLoaded?.emailCurrent?.messageId, - references: _currentEmailLoaded?.emailCurrent?.references, + messageId: currentEmailLoaded.value?.emailCurrent?.messageId, + references: currentEmailLoaded.value?.emailCurrent?.references, ) ); break; @@ -1361,10 +1352,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin { mailboxDashBoardController.goToComposer( ComposerArguments.replyAllEmail( presentationEmail: presentationEmail, - content: _currentEmailLoaded?.htmlContent ?? '', + content: currentEmailLoaded.value?.htmlContent ?? '', mailboxRole: presentationEmail.mailboxContain?.role, - messageId: _currentEmailLoaded?.emailCurrent?.messageId, - references: _currentEmailLoaded?.emailCurrent?.references, + messageId: currentEmailLoaded.value?.emailCurrent?.messageId, + references: currentEmailLoaded.value?.emailCurrent?.references, ) ); break; @@ -1372,10 +1363,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin { mailboxDashBoardController.goToComposer( ComposerArguments.forwardEmail( presentationEmail: presentationEmail, - content: _currentEmailLoaded?.htmlContent ?? '', + content: currentEmailLoaded.value?.htmlContent ?? '', attachments: attachments, - messageId: _currentEmailLoaded?.emailCurrent?.messageId, - references: _currentEmailLoaded?.emailCurrent?.references, + messageId: currentEmailLoaded.value?.emailCurrent?.messageId, + references: currentEmailLoaded.value?.emailCurrent?.references, ) ); break; @@ -1478,7 +1469,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { void _handleParseCalendarEventFailure(ParseCalendarEventFailure failure) { emailLoadedViewState.value = Left(failure); - emailContents.value = _currentEmailLoaded?.htmlContent; + emailContents.value = currentEmailLoaded.value?.htmlContent; } void _enableScrollPageView() { @@ -1595,26 +1586,34 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } void _printEmail(BuildContext context, PresentationEmail email) { - if (_printEmailAction != null) { + if (_printEmailButtonState == ButtonState.disabled) { log('SingleEmailController::_printEmail: Print email started'); return; } - _printEmailAction = PrintEmailAction( - context: context, - userEmail: mailboxDashBoardController.userEmail, - email: email - ); - consumeState(Stream.value(Right(PrintEmailLoading()))); + _printEmailButtonState = ButtonState.disabled; - if (_currentEmailLoaded == null) { - log('SingleEmailController::_printEmail: Email content loading'); - return; - } - - _handlePrintEmailWhenEmailContentLoaded( - action: _printEmailAction!, - emailLoaded: _currentEmailLoaded! + consumeState( + _printEmailInteractor.execute( + EmailPrint( + appName: AppLocalizations.of(context).app_name, + userName: mailboxDashBoardController.userEmail, + emailInformation: email.toEmail(), + attachments: currentEmailLoaded.value!.attachments, + emailContent: currentEmailLoaded.value!.htmlContent, + locale: Localizations.localeOf(context).toLanguageTag(), + fromPrefix: AppLocalizations.of(context).from_email_address_prefix, + toPrefix: AppLocalizations.of(context).to_email_address_prefix, + ccPrefix: AppLocalizations.of(context).cc_email_address_prefix, + bccPrefix: AppLocalizations.of(context).bcc_email_address_prefix, + replyToPrefix: AppLocalizations.of(context).replyToEmailAddressPrefix, + titleAttachment: AppLocalizations.of(context).attachments.toLowerCase(), + toAddress: email.to?.listEmailAddressToString(isFullEmailAddress: true), + ccAddress: email.cc?.listEmailAddressToString(isFullEmailAddress: true), + bccAddress: email.bcc?.listEmailAddressToString(isFullEmailAddress: true), + replyToAddress: email.replyTo?.listEmailAddressToString(isFullEmailAddress: true), + ) + ) ); } @@ -1629,11 +1628,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } void _handlePrintEmailSuccess(PrintEmailSuccess success) { - _printEmailAction = null; + _printEmailButtonState = ButtonState.enabled; } void _showMessageWhenEmailPrintingFailed(PrintEmailFailure failure) { - _printEmailAction = null; + _printEmailButtonState = ButtonState.enabled; if (currentOverlayContext != null && currentContext != null) { appToast.showToastErrorMessage( @@ -1642,23 +1641,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin { } } - void _handlePrintEmailWhenEmailContentLoaded({ - required PrintEmailAction action, - required EmailLoaded emailLoaded - }) { - if (action.email.id != emailLoaded.emailCurrent?.id) { - log('SingleEmailController::_handlePrintEmailInQueue: Print email action NOT matched email id'); - _printEmailAction = null; - return; - } - - consumeState( - _printEmailInteractor.execute( - EmailPrint.generate(printEmailAction: action, emailLoaded: emailLoaded) - ) - ); - } - void onCalendarEventReplyAction(EventActionType eventActionType, EmailId emailId) { switch (eventActionType) { case EventActionType.yes: diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index a64fa314a..635645612 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -369,7 +369,7 @@ class EmailView extends GetWidget { ), Obx(() => CalendarEventDetailWidget( calendarEvent: calendarEvent, - emailContent: controller.currentEmailLoaded?.htmlContent ?? '', + emailContent: controller.currentEmailLoaded.value?.htmlContent ?? '', isDraggableAppActive: controller.mailboxDashBoardController.isAttachmentDraggableAppActive, onOpenComposerAction: controller.openNewComposerAction, onOpenNewTabAction: controller.openNewTabAction, diff --git a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart index 8bb9d4904..5317f78a2 100644 --- a/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart +++ b/lib/features/email/presentation/widgets/email_view_app_bar_widget.dart @@ -8,6 +8,7 @@ import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/presentation_mailbox_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; +import 'package:tmail_ui_user/features/email/presentation/controller/single_email_controller.dart'; import 'package:tmail_ui_user/features/email/presentation/styles/email_view_app_bar_widget_styles.dart'; import 'package:tmail_ui_user/features/email/presentation/widgets/email_view_back_button.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -18,6 +19,7 @@ typedef OnMoreActionClick = void Function(PresentationEmail, RelativeRect?); class EmailViewAppBarWidget extends StatelessWidget { final _imagePaths = Get.find(); final _responsiveUtils = Get.find(); + final _singleEmailController = Get.find(); final PresentationEmail presentationEmail; final List? optionsWidget; @@ -99,11 +101,14 @@ class EmailViewAppBarWidget extends StatelessWidget { presentationEmail.hasStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred ) ), - if (PlatformInfo.isWeb && PlatformInfo.isCanvasKit) - ...[ - const SizedBox(width: EmailViewAppBarWidgetStyles.space), - TMailButtonWidget.fromIcon( + Obx(() { + if (_singleEmailController.currentEmailLoaded.value != null + && PlatformInfo.isWeb + && PlatformInfo.isCanvasKit + ) { + return TMailButtonWidget.fromIcon( icon: _imagePaths.icPrinter, + margin: const EdgeInsetsDirectional.only(start: EmailViewAppBarWidgetStyles.space), iconSize: EmailViewAppBarWidgetStyles.deleteButtonIconSize, backgroundColor: Colors.transparent, padding: EmailViewAppBarWidgetStyles.buttonPadding, @@ -112,8 +117,11 @@ class EmailViewAppBarWidget extends StatelessWidget { presentationEmail, EmailActionType.printAll ) - ), - ], + ); + } else { + return const SizedBox.shrink(); + } + }), const SizedBox(width: EmailViewAppBarWidgetStyles.space), TMailButtonWidget.fromIcon( icon: _imagePaths.icDeleteComposer,