TF-2827 Only enable print button when email content loaded

This commit is contained in:
dab246
2024-05-31 18:38:32 +07:00
committed by Dat H. Pham
parent 98c848db9a
commit 9020fe0a62
5 changed files with 58 additions and 116 deletions
@@ -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<Object?> get props => [
appName,
@@ -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<Object?> get props => [context, userEmail, email];
}
class HideEmailContentViewAction extends EmailUIAction {}
class ShowEmailContentViewAction extends EmailUIAction {}
@@ -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<EmailUnsubscribe>();
final attachmentsViewState = RxMap<Id, Either<Failure, Success>>();
final isEmailContentHidden = RxBool(false);
final currentEmailLoaded = Rxn<EmailLoaded>();
EmailId? _currentEmailId;
Identity? _identitySelected;
EmailLoaded? _currentEmailLoaded;
PrintEmailAction? _printEmailAction;
ButtonState? _printEmailButtonState;
final StreamController<Either<Failure, Success>> _downloadProgressStateController =
StreamController<Either<Failure, Success>>.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, Success>(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:
@@ -369,7 +369,7 @@ class EmailView extends GetWidget<SingleEmailController> {
),
Obx(() => CalendarEventDetailWidget(
calendarEvent: calendarEvent,
emailContent: controller.currentEmailLoaded?.htmlContent ?? '',
emailContent: controller.currentEmailLoaded.value?.htmlContent ?? '',
isDraggableAppActive: controller.mailboxDashBoardController.isAttachmentDraggableAppActive,
onOpenComposerAction: controller.openNewComposerAction,
onOpenNewTabAction: controller.openNewTabAction,
@@ -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<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _singleEmailController = Get.find<SingleEmailController>();
final PresentationEmail presentationEmail;
final List<Widget>? 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,