diff --git a/assets/images/ic_read_receipt.svg b/assets/images/ic_read_receipt.svg new file mode 100644 index 000000000..2549e5652 --- /dev/null +++ b/assets/images/ic_read_receipt.svg @@ -0,0 +1,14 @@ + + + + + + diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart index af74e290b..d4ffc99ee 100644 --- a/core/lib/presentation/resources/image_paths.dart +++ b/core/lib/presentation/resources/image_paths.dart @@ -202,6 +202,7 @@ class ImagePaths { String get icAttachmentFile => _getImagePath('ic_attachment_file.svg'); String get icAttachFile => _getImagePath('ic_attach_file.svg'); String get icSend => _getImagePath('ic_send.svg'); + String get icReadReceipt => _getImagePath('ic_read_receipt.svg'); String _getImagePath(String imageName) { return AssetsPaths.images + imageName; diff --git a/lib/features/base/mixin/popup_context_menu_action_mixin.dart b/lib/features/base/mixin/popup_context_menu_action_mixin.dart index 91484b80f..e3ddb014e 100644 --- a/lib/features/base/mixin/popup_context_menu_action_mixin.dart +++ b/lib/features/base/mixin/popup_context_menu_action_mixin.dart @@ -16,14 +16,24 @@ mixin PopupContextMenuActionMixin { .show(); } - void openPopupMenuAction(BuildContext context, RelativeRect? position, List popupMenuItems) async { + void openPopupMenuAction( + BuildContext context, + RelativeRect? position, + List popupMenuItems, + { + double? radius, + } + ) async { await showMenu( - context: context, - position: position ?? const RelativeRect.fromLTRB(16, 40, 16, 16), - color: Colors.white, - elevation: 4, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), - items: popupMenuItems); + context: context, + position: position ?? const RelativeRect.fromLTRB(16, 40, 16, 16), + color: Colors.white, + elevation: 4, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(radius ?? 16)) + ), + items: popupMenuItems + ); } Widget buildCancelButton(BuildContext context) { diff --git a/lib/features/base/styles/popup_item_widget_style.dart b/lib/features/base/styles/popup_item_widget_style.dart new file mode 100644 index 000000000..8aac934af --- /dev/null +++ b/lib/features/base/styles/popup_item_widget_style.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; + +class PopupItemWidgetStyle { + static const double iconSize = 20; + static const double selectedIconSize = 16; + static const double space = 12; + static const double height = 48; + + static const EdgeInsetsGeometry padding = EdgeInsets.symmetric(horizontal: 20, vertical: 16); + static const EdgeInsetsGeometry iconSelectedPadding = EdgeInsetsDirectional.only(start: 12); + + static const TextStyle labelTextStyle = TextStyle( + fontSize: 17, + fontWeight: FontWeight.normal, + color: Colors.black + ); +} \ No newline at end of file diff --git a/lib/features/base/widget/popup_item_widget.dart b/lib/features/base/widget/popup_item_widget.dart index 3407236ca..480f2c338 100644 --- a/lib/features/base/widget/popup_item_widget.dart +++ b/lib/features/base/widget/popup_item_widget.dart @@ -1,8 +1,8 @@ - -import 'package:core/core.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; +import 'package:tmail_ui_user/features/base/styles/popup_item_widget_style.dart'; class PopupItemWidget extends StatelessWidget { @@ -11,7 +11,9 @@ class PopupItemWidget extends StatelessWidget { final Color? colorIcon; final double? iconSize; final TextStyle? styleName; - final EdgeInsets? padding; + final bool? isSelected; + final String? selectedIcon; + final EdgeInsetsGeometry? padding; final VoidCallback? onCallbackAction; const PopupItemWidget( @@ -22,7 +24,9 @@ class PopupItemWidget extends StatelessWidget { this.colorIcon, this.iconSize, this.styleName, + this.isSelected, this.padding, + this.selectedIcon, this.onCallbackAction } ) : super(key: key); @@ -32,28 +36,33 @@ class PopupItemWidget extends StatelessWidget { return PointerInterceptor( child: InkWell( onTap: onCallbackAction, - child: Padding( - padding: padding ?? const EdgeInsets.symmetric(horizontal: 20, vertical: 16), - child: SizedBox( - child: Row(children: [ - SvgPicture.asset( - _iconAction, - width: iconSize ?? 20, - height: iconSize ?? 20, - fit: BoxFit.fill, - colorFilter: colorIcon.asFilter() - ), - const SizedBox(width: 12), - Expanded(child: Text( - _nameAction, - style: styleName ?? const TextStyle( - fontSize: 17, - fontWeight: FontWeight.normal, - color: Colors.black - ) - )), - ]) - ), + child: Container( + height: PopupItemWidgetStyle.height, + padding: padding, + child: Row(children: [ + SvgPicture.asset( + _iconAction, + width: iconSize ?? PopupItemWidgetStyle.iconSize, + height: iconSize ?? PopupItemWidgetStyle.iconSize, + fit: BoxFit.fill, + colorFilter: colorIcon?.asFilter() + ), + const SizedBox(width: PopupItemWidgetStyle.space), + Expanded(child: Text( + _nameAction, + style: styleName ?? PopupItemWidgetStyle.labelTextStyle + )), + if (isSelected == true && selectedIcon != null) + Padding( + padding: PopupItemWidgetStyle.iconSelectedPadding, + child: SvgPicture.asset( + selectedIcon!, + width: PopupItemWidgetStyle.selectedIconSize, + height: PopupItemWidgetStyle.selectedIconSize, + fit: BoxFit.fill + ), + ) + ]), ) ), ); diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index cba1f133d..cc2d87f21 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:model/email/prefix_email_address.dart'; +import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/prefix_recipient_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/composer_style.dart'; @@ -22,6 +23,7 @@ import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_c import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/desktop_app_bar_composer_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class ComposerView extends GetWidget { @@ -59,14 +61,28 @@ class ComposerView extends GetWidget { isSendButtonEnabled: controller.isEnableEmailSendButton.value, onCloseViewAction: () => controller.saveToDraftAndClose(context), sendMessageAction: () => controller.sendEmailAction(context), - openContextMenuAction: () => {}, + openContextMenuAction: (position) { + controller.openPopupMenuAction( + context, + position, + _createMoreOptionPopupItems(context), + radius: ComposerStyle.popupMenuRadius + ); + }, )) else Obx(() => AppBarComposerWidget( isSendButtonEnabled: controller.isEnableEmailSendButton.value, onCloseViewAction: () => controller.saveToDraftAndClose(context), sendMessageAction: () => controller.sendEmailAction(context), - openContextMenuAction: () => {}, + openContextMenuAction: (position) { + controller.openPopupMenuAction( + context, + position, + _createMoreOptionPopupItems(context), + radius: ComposerStyle.popupMenuRadius + ); + }, )), Expanded( child: SafeArea( @@ -317,6 +333,14 @@ class ComposerView extends GetWidget { deleteComposerAction: () => controller.closeComposer(context), saveToDraftAction: () => controller.saveToDraftAction(context), sendMessageAction: () => controller.sendEmailAction(context), + requestReadReceiptAction: (position) { + controller.openPopupMenuAction( + context, + position, + _createReadReceiptPopupItems(context), + radius: ComposerStyle.popupMenuRadius + ); + }, ), ] ) @@ -350,4 +374,72 @@ class ComposerView extends GetWidget { ..onActionClick((_) => controller.openFilePickerByType(context, FileType.any))) .build(); } + + List _createReadReceiptPopupItems(BuildContext context) { + return [ + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icReadReceipt, + AppLocalizations.of(context).requestReadReceipt, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + selectedIcon: _imagePaths.icFilterSelected, + isSelected: controller.hasRequestReadReceipt.value, + onCallbackAction: () { + popBack(); + controller.toggleRequestReadReceipt(); + } + ) + ), + ]; + } + + List _createMoreOptionPopupItems(BuildContext context) { + return [ + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icReadReceipt, + AppLocalizations.of(context).requestReadReceipt, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + colorIcon: ComposerStyle.popupItemIconColor, + selectedIcon: _imagePaths.icFilterSelected, + isSelected: controller.hasRequestReadReceipt.value, + onCallbackAction: () { + popBack(); + controller.toggleRequestReadReceipt(); + } + ) + ), + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icSaveToDraft, + AppLocalizations.of(context).saveAsDraft, + colorIcon: ComposerStyle.popupItemIconColor, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + onCallbackAction: () { + popBack(); + controller.saveToDraftAction(context); + } + ) + ), + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icDeleteMailbox, + AppLocalizations.of(context).delete, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + onCallbackAction: () { + popBack(); + controller.closeComposer(context); + }, + ) + ), + ]; + } } \ No newline at end of file diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index f84cec342..a93d83215 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -1,9 +1,11 @@ +import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:model/email/prefix_email_address.dart'; +import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/composer/presentation/model/prefix_recipient_state.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/composer_style.dart'; @@ -18,10 +20,13 @@ import 'package:tmail_ui_user/features/composer/presentation/widgets/web/mobile_ import 'package:tmail_ui_user/features/composer/presentation/widgets/recipient_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/subject_composer_widget.dart'; import 'package:tmail_ui_user/features/composer/presentation/widgets/web/toolbar_rich_text_builder.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class ComposerView extends GetWidget { final _responsiveUtils = Get.find(); + final _imagePaths = Get.find(); ComposerView({Key? key}) : super(key: key); @@ -43,7 +48,14 @@ class ComposerView extends GetWidget { attachFileAction: () => controller.openFilePickerByType(context, FileType.any), insertImageAction: () => controller.insertImage(context, constraints.maxWidth), sendMessageAction: () => controller.sendEmailAction(context), - openContextMenuAction: () => {}, + openContextMenuAction: (position) { + controller.openPopupMenuAction( + context, + position, + _createMoreOptionPopupItems(context), + radius: ComposerStyle.popupMenuRadius + ); + }, )), ConstrainedBox( constraints: BoxConstraints( @@ -340,6 +352,14 @@ class ComposerView extends GetWidget { deleteComposerAction: () => controller.closeComposer(context), saveToDraftAction: () => controller.saveToDraftAction(context), sendMessageAction: () => controller.sendEmailAction(context), + requestReadReceiptAction: (position) { + controller.openPopupMenuAction( + context, + position, + _createReadReceiptPopupItems(context), + radius: ComposerStyle.popupMenuRadius + ); + }, )), ]); }, @@ -510,10 +530,102 @@ class ComposerView extends GetWidget { deleteComposerAction: () => controller.closeComposer(context), saveToDraftAction: () => controller.saveToDraftAction(context), sendMessageAction: () => controller.sendEmailAction(context), + requestReadReceiptAction: (position) { + controller.openPopupMenuAction( + context, + position, + _createReadReceiptPopupItems(context), + radius: ComposerStyle.popupMenuRadius + ); + }, )), ]); }, ) ); } + + List _createReadReceiptPopupItems(BuildContext context) { + return [ + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icReadReceipt, + AppLocalizations.of(context).requestReadReceipt, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + selectedIcon: _imagePaths.icFilterSelected, + isSelected: controller.hasRequestReadReceipt.value, + onCallbackAction: () { + popBack(); + controller.toggleRequestReadReceipt(); + } + ) + ), + ]; + } + + List _createMoreOptionPopupItems(BuildContext context) { + return [ + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icStyleCodeView, + AppLocalizations.of(context).embedCode, + styleName: ComposerStyle.popupItemTextStyle, + colorIcon: ComposerStyle.popupItemIconColor, + padding: ComposerStyle.popupItemPadding, + selectedIcon: _imagePaths.icFilterSelected, + isSelected: controller.richTextWebController.codeViewEnabled, + onCallbackAction: () { + popBack(); + controller.richTextWebController.toggleCodeView(); + } + ) + ), + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icReadReceipt, + AppLocalizations.of(context).requestReadReceipt, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + colorIcon: ComposerStyle.popupItemIconColor, + selectedIcon: _imagePaths.icFilterSelected, + isSelected: controller.hasRequestReadReceipt.value, + onCallbackAction: () { + popBack(); + controller.toggleRequestReadReceipt(); + } + ) + ), + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icSaveToDraft, + AppLocalizations.of(context).saveAsDraft, + colorIcon: ComposerStyle.popupItemIconColor, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + onCallbackAction: () { + popBack(); + controller.saveToDraftAction(context); + } + ) + ), + PopupMenuItem( + padding: EdgeInsets.zero, + child: PopupItemWidget( + _imagePaths.icDeleteMailbox, + AppLocalizations.of(context).delete, + styleName: ComposerStyle.popupItemTextStyle, + padding: ComposerStyle.popupItemPadding, + onCallbackAction: () { + popBack(); + controller.closeComposer(context); + }, + ) + ), + ]; + } } \ No newline at end of file diff --git a/lib/features/composer/presentation/styles/composer_style.dart b/lib/features/composer/presentation/styles/composer_style.dart index 875ab98b3..8e7cbf6d3 100644 --- a/lib/features/composer/presentation/styles/composer_style.dart +++ b/lib/features/composer/presentation/styles/composer_style.dart @@ -8,11 +8,13 @@ class ComposerStyle { static const double radius = 28; static const double keyboardMaxHeight = 500; static const double keyboardToolBarHeight = 200; + static const double popupMenuRadius = 8; static const Color borderColor = AppColor.colorLineComposer; static const Color backgroundEditorColor = Colors.white; static const Color richToolbarColor = Colors.white; static const Color mobileBackgroundColor = Colors.white; + static const Color popupItemIconColor = AppColor.primaryColor; static const EdgeInsetsGeometry richToolbarPadding = EdgeInsetsDirectional.symmetric(horizontal: 24, vertical: 8); static const EdgeInsetsGeometry desktopRecipientPadding = EdgeInsetsDirectional.only(end: 24); @@ -30,6 +32,13 @@ class ComposerStyle { static const EdgeInsetsGeometry mobileSubjectMargin = EdgeInsetsDirectional.only(start: 16); static const EdgeInsetsGeometry mobileSubjectPadding = EdgeInsetsDirectional.only(end: 16, top: 12, bottom: 12); static const EdgeInsetsGeometry mobileEditorPadding = EdgeInsetsDirectional.symmetric(horizontal: 12); + static const EdgeInsetsGeometry popupItemPadding = EdgeInsetsDirectional.symmetric(horizontal: 12); + + static const TextStyle popupItemTextStyle = TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w500 + ); static const List richToolbarShadow = [ BoxShadow( diff --git a/lib/features/composer/presentation/widgets/mobile/app_bar_composer_widget.dart b/lib/features/composer/presentation/widgets/mobile/app_bar_composer_widget.dart index 69821985e..2d174c4a0 100644 --- a/lib/features/composer/presentation/widgets/mobile/app_bar_composer_widget.dart +++ b/lib/features/composer/presentation/widgets/mobile/app_bar_composer_widget.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/mobile_app_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'; class AppBarComposerWidget extends StatelessWidget { @@ -10,7 +11,7 @@ class AppBarComposerWidget extends StatelessWidget { final bool isSendButtonEnabled; final VoidCallback onCloseViewAction; final VoidCallback sendMessageAction; - final VoidCallback openContextMenuAction; + final OnOpenContextMenuAction openContextMenuAction; final _imagePaths = Get.find(); @@ -59,7 +60,7 @@ class AppBarComposerWidget extends StatelessWidget { padding: MobileAppBarComposerWidgetStyle.iconPadding, iconSize: MobileAppBarComposerWidgetStyle.iconSize, tooltipMessage: AppLocalizations.of(context).more, - onTapActionCallback: openContextMenuAction, + onTapActionAtPositionCallback: openContextMenuAction, ), ], ), diff --git a/lib/features/composer/presentation/widgets/mobile/landscape_app_bar_composer_widget.dart b/lib/features/composer/presentation/widgets/mobile/landscape_app_bar_composer_widget.dart index 1a0acc47a..67e266f39 100644 --- a/lib/features/composer/presentation/widgets/mobile/landscape_app_bar_composer_widget.dart +++ b/lib/features/composer/presentation/widgets/mobile/landscape_app_bar_composer_widget.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/mobile_app_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'; class LandscapeAppBarComposerWidget extends StatelessWidget { @@ -10,7 +11,7 @@ class LandscapeAppBarComposerWidget extends StatelessWidget { final bool isSendButtonEnabled; final VoidCallback onCloseViewAction; final VoidCallback sendMessageAction; - final VoidCallback openContextMenuAction; + final OnOpenContextMenuAction openContextMenuAction; final _imagePaths = Get.find(); @@ -62,7 +63,7 @@ class LandscapeAppBarComposerWidget extends StatelessWidget { padding: MobileAppBarComposerWidgetStyle.iconPadding, iconSize: MobileAppBarComposerWidgetStyle.iconSize, tooltipMessage: AppLocalizations.of(context).more, - onTapActionCallback: openContextMenuAction, + onTapActionAtPositionCallback: openContextMenuAction, ), ], ), diff --git a/lib/features/composer/presentation/widgets/mobile/tablet_bottom_bar_composer_widget.dart b/lib/features/composer/presentation/widgets/mobile/tablet_bottom_bar_composer_widget.dart index 1ce88a7a8..a1d76f14d 100644 --- a/lib/features/composer/presentation/widgets/mobile/tablet_bottom_bar_composer_widget.dart +++ b/lib/features/composer/presentation/widgets/mobile/tablet_bottom_bar_composer_widget.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/mobile/tablet_bottom_bar_composer_widget_style.dart'; +import 'package:tmail_ui_user/features/composer/presentation/widgets/web/bottom_bar_composer_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class TabletBottomBarComposerWidget extends StatelessWidget { @@ -10,6 +11,7 @@ class TabletBottomBarComposerWidget extends StatelessWidget { final VoidCallback deleteComposerAction; final VoidCallback saveToDraftAction; final VoidCallback sendMessageAction; + final OnRequestReadReceiptAction? requestReadReceiptAction; final _imagePaths = Get.find(); @@ -18,6 +20,7 @@ class TabletBottomBarComposerWidget extends StatelessWidget { required this.deleteComposerAction, required this.saveToDraftAction, required this.sendMessageAction, + this.requestReadReceiptAction, }); @override @@ -37,12 +40,21 @@ class TabletBottomBarComposerWidget extends StatelessWidget { onTapActionCallback: deleteComposerAction, ), const SizedBox(width: TabletBottomBarComposerWidgetStyle.space), + TMailButtonWidget.fromIcon( + icon: _imagePaths.icReadReceipt, + borderRadius: TabletBottomBarComposerWidgetStyle.iconRadius, + padding: TabletBottomBarComposerWidgetStyle.iconPadding, + iconSize: TabletBottomBarComposerWidgetStyle.iconSize, + tooltipMessage: AppLocalizations.of(context).requestReadReceipt, + onTapActionAtPositionCallback: requestReadReceiptAction, + ), + const SizedBox(width: TabletBottomBarComposerWidgetStyle.space), TMailButtonWidget.fromIcon( icon: _imagePaths.icSaveToDraft, borderRadius: TabletBottomBarComposerWidgetStyle.iconRadius, padding: TabletBottomBarComposerWidgetStyle.iconPadding, iconSize: TabletBottomBarComposerWidgetStyle.iconSize, - tooltipMessage: AppLocalizations.of(context).save_to_drafts, + tooltipMessage: AppLocalizations.of(context).saveAsDraft, onTapActionCallback: saveToDraftAction, ), const SizedBox(width: TabletBottomBarComposerWidgetStyle.sendButtonSpace), diff --git a/lib/features/composer/presentation/widgets/web/bottom_bar_composer_widget.dart b/lib/features/composer/presentation/widgets/web/bottom_bar_composer_widget.dart index 645b5cf76..d2855acef 100644 --- a/lib/features/composer/presentation/widgets/web/bottom_bar_composer_widget.dart +++ b/lib/features/composer/presentation/widgets/web/bottom_bar_composer_widget.dart @@ -5,6 +5,8 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/web/bottom_bar_composer_widget_style.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +typedef OnRequestReadReceiptAction = Function(RelativeRect position); + class BottomBarComposerWidget extends StatelessWidget { final bool isCodeViewEnabled; @@ -16,6 +18,7 @@ class BottomBarComposerWidget extends StatelessWidget { final VoidCallback deleteComposerAction; final VoidCallback saveToDraftAction; final VoidCallback sendMessageAction; + final OnRequestReadReceiptAction? requestReadReceiptAction; final _imagePaths = Get.find(); @@ -30,6 +33,7 @@ class BottomBarComposerWidget extends StatelessWidget { required this.deleteComposerAction, required this.saveToDraftAction, required this.sendMessageAction, + this.requestReadReceiptAction, }); @override @@ -103,12 +107,21 @@ class BottomBarComposerWidget extends StatelessWidget { onTapActionCallback: deleteComposerAction, ), const SizedBox(width: BottomBarComposerWidgetStyle.space), + TMailButtonWidget.fromIcon( + icon: _imagePaths.icReadReceipt, + borderRadius: BottomBarComposerWidgetStyle.iconRadius, + padding: BottomBarComposerWidgetStyle.iconPadding, + iconSize: BottomBarComposerWidgetStyle.iconSize, + tooltipMessage: AppLocalizations.of(context).requestReadReceipt, + onTapActionAtPositionCallback: requestReadReceiptAction, + ), + const SizedBox(width: BottomBarComposerWidgetStyle.space), TMailButtonWidget.fromIcon( icon: _imagePaths.icSaveToDraft, borderRadius: BottomBarComposerWidgetStyle.iconRadius, padding: BottomBarComposerWidgetStyle.iconPadding, iconSize: BottomBarComposerWidgetStyle.iconSize, - tooltipMessage: AppLocalizations.of(context).save_to_drafts, + tooltipMessage: AppLocalizations.of(context).saveAsDraft, onTapActionCallback: saveToDraftAction, ), const SizedBox(width: BottomBarComposerWidgetStyle.sendButtonSpace), diff --git a/lib/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart b/lib/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart index e2b8e4aa2..72cd05b5c 100644 --- a/lib/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart +++ b/lib/features/composer/presentation/widgets/web/mobile_responsive_app_bar_composer_widget.dart @@ -5,6 +5,8 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/composer/presentation/styles/mobile_app_bar_composer_widget_style.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; +typedef OnOpenContextMenuAction = Function(RelativeRect position); + class MobileResponsiveAppBarComposerWidget extends StatelessWidget { final bool isCodeViewEnabled; @@ -14,7 +16,7 @@ class MobileResponsiveAppBarComposerWidget extends StatelessWidget { final VoidCallback attachFileAction; final VoidCallback insertImageAction; final VoidCallback sendMessageAction; - final VoidCallback openContextMenuAction; + final OnOpenContextMenuAction openContextMenuAction; final VoidCallback openRichToolbarAction; final _imagePaths = Get.find(); @@ -109,7 +111,7 @@ class MobileResponsiveAppBarComposerWidget extends StatelessWidget { padding: MobileAppBarComposerWidgetStyle.iconPadding, iconSize: MobileAppBarComposerWidgetStyle.iconSize, tooltipMessage: AppLocalizations.of(context).more, - onTapActionCallback: openContextMenuAction, + onTapActionAtPositionCallback: openContextMenuAction, ), ], ), diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 530a9a975..8d9df719c 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -504,6 +504,7 @@ class EmailView extends GetWidget { imagePaths.icUnreadEmail, AppLocalizations.of(context).mark_as_unread, colorIcon: AppColor.colorTextButton, + padding: const EdgeInsetsDirectional.only(start: 12), styleName: const TextStyle( fontWeight: FontWeight.w500, fontSize: 16, @@ -531,6 +532,7 @@ class EmailView extends GetWidget { ? AppLocalizations.of(context).remove_from_spam : AppLocalizations.of(context).mark_as_spam, colorIcon: AppColor.colorTextButton, + padding: const EdgeInsetsDirectional.only(start: 12), styleName: const TextStyle( fontWeight: FontWeight.w500, fontSize: 16, @@ -552,6 +554,7 @@ class EmailView extends GetWidget { imagePaths.icQuickCreatingRule, AppLocalizations.of(context).quickCreatingRule, colorIcon: AppColor.colorTextButton, + padding: const EdgeInsetsDirectional.only(start: 12), styleName: const TextStyle( fontWeight: FontWeight.w500, fontSize: 16, diff --git a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart index 8aa6a0f1b..9adb5bd79 100644 --- a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart +++ b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart @@ -264,6 +264,7 @@ mixin MailboxWidgetMixin { contextMenuItem.action.getContextMenuIcon(imagePaths), contextMenuItem.action.getTitleContextMenu(context), colorIcon: contextMenuItem.action.getColorContextMenuIcon(), + padding: const EdgeInsetsDirectional.only(start: 12), iconSize: 24, styleName: TextStyle( fontWeight: FontWeight.w500, diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index b900184c0..53bafb7d3 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2023-09-07T09:30:18.682623", + "@@last_modified": "2023-09-07T19:09:09.089986", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -3233,5 +3233,11 @@ "placeholders": { "count": {} } + }, + "saveAsDraft": "Save as draft", + "@saveAsDraft": { + "type": "text", + "placeholders_order": [], + "placeholders": {} } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index ff861b853..f046b6217 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -3333,4 +3333,11 @@ class AppLocalizations { args: [count] ); } + + String get saveAsDraft { + return Intl.message( + 'Save as draft', + name: 'saveAsDraft', + ); + } } \ No newline at end of file