diff --git a/lib/features/email/domain/extensions/presentation_email_extension.dart b/lib/features/email/domain/extensions/presentation_email_extension.dart index d6d53e572..15575cc48 100644 --- a/lib/features/email/domain/extensions/presentation_email_extension.dart +++ b/lib/features/email/domain/extensions/presentation_email_extension.dart @@ -1,22 +1,10 @@ -import 'package:intl/intl.dart'; import 'package:model/model.dart'; import 'package:core/core.dart'; extension PresentationEmailExtension on PresentationEmail { - String getTimeSentEmail(String locale) { - if (sentAt != null) { - if (sentAt!.value.isToday()) { - return DateFormat('h:mm a', locale).format(sentAt!.value); - } else if (sentAt!.value.isYesterday()) { - return DateFormat('EEE', locale).format(sentAt!.value); - } else if (sentAt!.value.isThisYear()) { - return DateFormat('MMMd', locale).format(sentAt!.value); - } else { - return DateFormat('yMMMd', locale).format(sentAt!.value); - } - } else { - return ''; - } + String getTimeSentEmail(String newLocale) { + final dateTime = sentAt?.value; + return sentAt.formatDate(pattern: dateTime.toPattern(), locale: newLocale); } } \ No newline at end of file diff --git a/lib/features/email/presentation/email_controller.dart b/lib/features/email/presentation/email_controller.dart index f88cc9c08..9f84ecc1e 100644 --- a/lib/features/email/presentation/email_controller.dart +++ b/lib/features/email/presentation/email_controller.dart @@ -7,8 +7,11 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/email/domain/state/get_email_content_state.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart'; +import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; +import 'package:tmail_ui_user/main/routes/app_routes.dart'; class EmailController extends BaseController { @@ -16,6 +19,7 @@ class EmailController extends BaseController { final GetEmailContentInteractor _getEmailContentInteractor; final emailAddressExpandMode = ExpandMode.COLLAPSE.obs; + EmailContent? emailContent; EmailController(this._getEmailContentInteractor); @@ -48,6 +52,11 @@ class EmailController extends BaseController { @override void onDone() { + viewState.value.map((success) { + if (success is GetEmailContentSuccess) { + emailContent = success.emailContent; + } + }); } @override @@ -61,4 +70,19 @@ class EmailController extends BaseController { void goToThreadView(BuildContext context) { Get.back(); } + + void pressEmailAction(EmailActionType emailActionType) { + if (mailboxDashBoardController.selectedEmail.value != null + && mailboxDashBoardController.sessionCurrent != null + && mailboxDashBoardController.userProfile.value != null) { + Get.toNamed( + AppRoutes.COMPOSER, + arguments: ComposerArguments( + emailActionType: emailActionType, + presentationEmail: mailboxDashBoardController.selectedEmail.value!, + emailContent: emailContent, + session: mailboxDashBoardController.sessionCurrent!, + userProfile: mailboxDashBoardController.userProfile.value!)); + } + } } \ No newline at end of file diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 659287c49..3f03c0b16 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -58,8 +58,9 @@ class EmailView extends GetWidget { Widget _buildBottomBar(BuildContext context) { return Padding( padding: EdgeInsets.only(left: 6, top: 6, right: 6, bottom: 6), - child: BottomBarMailWidgetBuilder(context, imagePaths, responsiveUtils) - .build()); + child: (BottomBarMailWidgetBuilder(context, imagePaths, responsiveUtils) + ..addOnPressEmailAction((emailActionType) => emailController.pressEmailAction(emailActionType))) + .build()); } Widget _buildEmailContent(BuildContext context) { @@ -193,11 +194,11 @@ class EmailView extends GetWidget { itemCount: messageContents.length, itemBuilder: (context, index) => MessageContentTileBuilder( - htmlMessagePurifier, - messageContents[index], - attachmentsInline, - emailController.mailboxDashBoardController.sessionCurrent, - emailController.mailboxDashBoardController.accountId.value) + htmlMessagePurifier: htmlMessagePurifier, + messageContent: messageContents[index], + attachmentInlines: attachmentsInline, + session: emailController.mailboxDashBoardController.sessionCurrent, + accountId: emailController.mailboxDashBoardController.accountId.value) .build()) : SizedBox.shrink(); } else { diff --git a/lib/features/email/presentation/extensions/presentation_email_extension.dart b/lib/features/email/presentation/extensions/presentation_email_extension.dart index 3c22fab4c..e2d9b47f7 100644 --- a/lib/features/email/presentation/extensions/presentation_email_extension.dart +++ b/lib/features/email/presentation/extensions/presentation_email_extension.dart @@ -1,9 +1,8 @@ -import 'package:intl/intl.dart'; import 'package:model/model.dart'; extension PresentationEmailExtension on PresentationEmail { int numberOfAllEmailAddress() => to.numberEmailAddress() + cc.numberEmailAddress() + bcc.numberEmailAddress(); - String getSentTime() => sentAt != null ? DateFormat('dd/MM/yyyy h:mm a', 'en_US').format(sentAt!.value) : ''; + String getSentTime(String locale) => sentAt.formatDate(pattern: 'dd/MM/yyyy h:mm a', locale: locale); } \ No newline at end of file diff --git a/lib/features/email/presentation/model/composer_arguments.dart b/lib/features/email/presentation/model/composer_arguments.dart new file mode 100644 index 000000000..60f308ef9 --- /dev/null +++ b/lib/features/email/presentation/model/composer_arguments.dart @@ -0,0 +1,23 @@ + +import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:model/model.dart'; + +class ComposerArguments with EquatableMixin { + final EmailActionType emailActionType; + final PresentationEmail? presentationEmail; + final EmailContent? emailContent; + final Session session; + final UserProfile userProfile; + + ComposerArguments({ + this.emailActionType = EmailActionType.compose, + this.presentationEmail, + this.emailContent, + required this.session, + required this.userProfile + }); + + @override + List get props => [emailActionType, presentationEmail, emailContent, session, userProfile]; +} \ No newline at end of file diff --git a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart index dd4fcd5de..a9e2b72dd 100644 --- a/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart +++ b/lib/features/email/presentation/widgets/app_bar_mail_widget_builder.dart @@ -56,7 +56,7 @@ class AppBarMailWidgetBuilder { Widget _buildBackButton() { return ButtonBuilder(_imagePaths.icBack) .size(20) - .onBackActionClick(() { + .onPressActionClick(() { if (_onBackActionClick != null) { _onBackActionClick!(); }}) diff --git a/lib/features/email/presentation/widgets/bottom_bar_mail_widget_builder.dart b/lib/features/email/presentation/widgets/bottom_bar_mail_widget_builder.dart index 3e217a5b7..cb6dda564 100644 --- a/lib/features/email/presentation/widgets/bottom_bar_mail_widget_builder.dart +++ b/lib/features/email/presentation/widgets/bottom_bar_mail_widget_builder.dart @@ -1,20 +1,29 @@ import 'package:core/core.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; +import 'package:model/model.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +typedef OnPressEmailActionClick = void Function(EmailActionType emailActionType); + class BottomBarMailWidgetBuilder { final BuildContext _context; final ImagePaths _imagePaths; final ResponsiveUtils _responsiveUtils; + OnPressEmailActionClick? _onPressEmailActionClick; + BottomBarMailWidgetBuilder( this._context, this._imagePaths, this._responsiveUtils, ); + void addOnPressEmailAction(OnPressEmailActionClick onPressEmailActionClick) { + _onPressEmailActionClick = onPressEmailActionClick; + } + Widget build() { return Container( key: Key('bottom_bar_messenger_widget'), @@ -34,14 +43,26 @@ class BottomBarMailWidgetBuilder { children: [ ButtonBuilder(_imagePaths.icReplyAll) .key(Key('button_reply_all_message')) + .onPressActionClick(() { + if (_onPressEmailActionClick != null) { + _onPressEmailActionClick!(EmailActionType.replyAll); + }}) .text(AppLocalizations.of(_context).reply_all, isVertical: _responsiveUtils.isMobile(_context)) .build(), ButtonBuilder(_imagePaths.icReply) .key(Key('button_reply_message')) + .onPressActionClick(() { + if (_onPressEmailActionClick != null) { + _onPressEmailActionClick!(EmailActionType.reply); + }}) .text(AppLocalizations.of(_context).reply, isVertical: _responsiveUtils.isMobile(_context)) .build(), ButtonBuilder(_imagePaths.icForward) .key(Key('button_forward_message')) + .onPressActionClick(() { + if (_onPressEmailActionClick != null) { + _onPressEmailActionClick!(EmailActionType.forward); + }}) .text(AppLocalizations.of(_context).forward, isVertical: _responsiveUtils.isMobile(_context)) .build() ] diff --git a/lib/features/email/presentation/widgets/message_content_tile_builder.dart b/lib/features/email/presentation/widgets/message_content_tile_builder.dart index e55fe56a2..0fee68fa1 100644 --- a/lib/features/email/presentation/widgets/message_content_tile_builder.dart +++ b/lib/features/email/presentation/widgets/message_content_tile_builder.dart @@ -11,19 +11,19 @@ import 'package:tmail_ui_user/features/email/presentation/model/text_format.dart class MessageContentTileBuilder { - final MessageContent _messageContent; - final List _attachmentInlines; - final Session? _session; - final AccountId? _accountId; - final HtmlMessagePurifier _htmlMessagePurifier; + final MessageContent messageContent; + final List attachmentInlines; + final Session? session; + final AccountId? accountId; + final HtmlMessagePurifier htmlMessagePurifier; - MessageContentTileBuilder( - this._htmlMessagePurifier, - this._messageContent, - this._attachmentInlines, - this._session, - this._accountId, - ); + MessageContentTileBuilder({ + required this.htmlMessagePurifier, + required this.messageContent, + required this.attachmentInlines, + required this.session, + required this.accountId, + }); Widget build() { return Theme( @@ -33,8 +33,8 @@ class MessageContentTileBuilder { child: MediaQuery( data: MediaQueryData(padding: EdgeInsets.zero), child: Center( - child: _messageContent.textFormat == TextFormat.PLAIN - ? Text('${_messageContent.content}', style: TextStyle(fontSize: 12, color: AppColor.mailboxTextColor)) + child: messageContent.textFormat == TextFormat.PLAIN + ? Text('${messageContent.content}', style: TextStyle(fontSize: 12, color: AppColor.mailboxTextColor)) : HtmlWidget( getHtmlMessageText(), textStyle: TextStyle(fontSize: 12, color: AppColor.mailboxTextColor), @@ -50,11 +50,11 @@ class MessageContentTileBuilder { } String getHtmlMessageText() { - final message = (_attachmentInlines.isNotEmpty && _session != null && _accountId != null && _messageContent.hasImageInlineWithCid()) - ? '${_messageContent.getContentHasInlineAttachment(_session!, _accountId!, _attachmentInlines)}' - : '${_messageContent.content}'; + final message = (attachmentInlines.isNotEmpty && session != null && accountId != null && messageContent.hasImageInlineWithCid()) + ? '${messageContent.getContentHasInlineAttachment(session!, accountId!, attachmentInlines)}' + : '${messageContent.content}'; - final trustAsHtml = _htmlMessagePurifier.purifyHtmlMessage( + final trustAsHtml = htmlMessagePurifier.purifyHtmlMessage( message, allowAttributes: {'style', 'input', 'form'}); diff --git a/lib/features/email/presentation/widgets/sender_and_receiver_information_tile_builder.dart b/lib/features/email/presentation/widgets/sender_and_receiver_information_tile_builder.dart index d25b98808..7b104875f 100644 --- a/lib/features/email/presentation/widgets/sender_and_receiver_information_tile_builder.dart +++ b/lib/features/email/presentation/widgets/sender_and_receiver_information_tile_builder.dart @@ -69,7 +69,7 @@ class SenderAndReceiverInformationTileBuilder { Padding( padding: EdgeInsets.only(top: 6), child: Text( - '${_presentationEmail!.getSentTime()}', + '${_presentationEmail!.getSentTime(Localizations.localeOf(_context).toLanguageTag())}', style: TextStyle(fontSize: 12, color: AppColor.baseTextColor), )) ], diff --git a/lib/main/routes/app_routes.dart b/lib/main/routes/app_routes.dart index e1df10406..f4071c00c 100644 --- a/lib/main/routes/app_routes.dart +++ b/lib/main/routes/app_routes.dart @@ -6,4 +6,5 @@ abstract class AppRoutes { static const THREAD = '$MAILBOX_DASHBOARD/thread'; static const EMAIL = '$THREAD/email'; static const SESSION = '/session'; + static const COMPOSER = '/composer'; } \ No newline at end of file