From 632b9c67d6a7012dfd70a40bc41ab9b0beb084c1 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 8 Aug 2023 19:17:36 +0700 Subject: [PATCH] TF-1714 Change ButtonBuilder to TMailButton widget (cherry picked from commit fd536ff648370a60ef89d4428fedd949a3e62ae7) --- core/lib/core.dart | 1 - .../extensions/color_extension.dart | 1 + .../views/button/button_builder.dart | 187 ------------- .../views/button/icon_button_web.dart | 26 -- .../views/button/tmail_button_widget.dart | 99 ++++++- .../container/tmail_container_widget.dart | 28 +- .../presentation/base_composer_view.dart | 2 +- .../email/presentation/email_view.dart | 13 +- .../bottom_bar_mail_widget_builder.dart | 150 +++++++---- .../mailbox/presentation/mailbox_view.dart | 45 ++-- .../bottom_bar_selection_mailbox_widget.dart | 54 ++-- .../mailbox_dashboard_controller.dart | 4 + .../mailbox_dashboard_view_web.dart | 168 +++++------- .../widgets/email_rules_header_widget.dart | 64 ++--- .../menu/manage_account_menu_view.dart | 178 ++++++------ .../quotas/presentation/quotas_view.dart | 2 +- .../bottom_bar_sending_queue_widget.dart | 97 ++++--- .../thread/presentation/thread_view.dart | 6 +- .../bottom_bar_thread_selection_widget.dart | 253 +++++++++--------- 19 files changed, 641 insertions(+), 737 deletions(-) delete mode 100644 core/lib/presentation/views/button/button_builder.dart diff --git a/core/lib/core.dart b/core/lib/core.dart index 9ae33dc4b..93b938928 100644 --- a/core/lib/core.dart +++ b/core/lib/core.dart @@ -52,7 +52,6 @@ export 'presentation/views/text/rich_text_builder.dart'; export 'presentation/views/text/text_overflow_builder.dart'; export 'presentation/views/responsive/responsive_widget.dart'; export 'presentation/views/list/tree_view.dart'; -export 'presentation/views/button/button_builder.dart'; export 'presentation/views/button/icon_button_web.dart'; export 'presentation/views/button/tmail_button_widget.dart'; export 'presentation/views/image/avatar_builder.dart'; diff --git a/core/lib/presentation/extensions/color_extension.dart b/core/lib/presentation/extensions/color_extension.dart index bd60dc840..067fdce8a 100644 --- a/core/lib/presentation/extensions/color_extension.dart +++ b/core/lib/presentation/extensions/color_extension.dart @@ -200,6 +200,7 @@ extension AppColor on Color { static const colorMailto = Color(0xFFB3B3B3); static const colorEventDescriptionBackground = Color(0x05000000); static const colorLabelQuotas = Color(0xFF818C99); + static const colorLabelCancelButton = Color(0xFFAEB7C2); static const mapGradientColor = [ [Color(0xFF21D4FD), Color(0xFFB721FF)], diff --git a/core/lib/presentation/views/button/button_builder.dart b/core/lib/presentation/views/button/button_builder.dart deleted file mode 100644 index 5456d2d14..000000000 --- a/core/lib/presentation/views/button/button_builder.dart +++ /dev/null @@ -1,187 +0,0 @@ - -import 'package:core/core.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -typedef OnPressActionClick = void Function(); -typedef OnPressActionWithPositionClick = void Function(RelativeRect? position); - -class ButtonBuilder { - OnPressActionClick? _onPressActionClick; - OnPressActionWithPositionClick? _onPressActionWithPositionClick; - - BuildContext? _context; - final String? _icon; - String? _text; - double? _size; - EdgeInsets? _paddingIcon; - bool? _isVertical; - Key? _key; - Color? _iconColor; - TextStyle? _textStyle; - BoxDecoration? _decoration; - Widget? _iconAction; - double? _radiusSplash; - double? _maxWidth; - EdgeInsets? _padding; - EdgeInsets? _margin; - String? _tooltip; - BoxConstraints? _constraints; - - void key(Key key) { - _key = key; - } - - void context(BuildContext context) { - _context = context; - } - - void size(double? size) { - _size = size; - } - - void maxWidth(double? size) { - _maxWidth = size; - } - - void iconColor(Color color) { - _iconColor = color; - } - - void decoration(BoxDecoration decoration) { - _decoration = decoration; - } - - void addIconAction(Widget icon) { - _iconAction = icon; - } - - void radiusSplash(double? radius) { - _radiusSplash = radius; - } - - void padding(EdgeInsets? padding) { - _padding = padding; - } - - void margin(EdgeInsets? margin) { - _margin = margin; - } - - void textStyle(TextStyle style) { - _textStyle = style; - } - - void paddingIcon(EdgeInsets paddingIcon) { - _paddingIcon = paddingIcon; - } - - void text(String? text, {required bool isVertical}) { - _text = text; - _isVertical = isVertical; - } - - void tooltip(String? message) { - _tooltip = message; - } - - void addBoxConstraints(BoxConstraints? constraints) { - _constraints = constraints; - } - - ButtonBuilder(this._icon); - - void onPressActionClick(OnPressActionClick onPressActionClick) { - _onPressActionClick = onPressActionClick; - } - - void addOnPressActionWithPositionClick(OnPressActionWithPositionClick onPressActionClick) { - _onPressActionWithPositionClick = onPressActionClick; - } - - Widget build() { - return Padding( - padding: _margin ?? EdgeInsets.zero, - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: _onPressActionClick, - onTapDown: (detail) { - if (_onPressActionWithPositionClick != null && _context != null) { - final screenSize = MediaQuery.of(_context!).size; - final offset = detail.globalPosition; - final position = RelativeRect.fromLTRB( - offset.dx, - offset.dy, - screenSize.width - offset.dx, - screenSize.height - offset.dy, - ); - _onPressActionWithPositionClick?.call(position); - } - }, - borderRadius: BorderRadius.circular(_radiusSplash ?? 20), - child: Tooltip( - message: _tooltip ?? '', - child: Container( - key: _key, - alignment: Alignment.center, - color: _decoration == null ? Colors.transparent : null, - decoration: _decoration, - width: _maxWidth, - constraints: _constraints, - padding: _padding ?? EdgeInsets.zero, - child: _buildBody() - ), - ) - ), - ), - ); - } - - Widget _buildBody() { - if (_text != null) { - return _isVertical! - ? Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _buildIcon(), - _buildText(), - if (_iconAction != null) _iconAction! - ]) - : Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _buildIcon(), - _buildText(), - if (_iconAction != null) _iconAction! - ]); - } else { - return _buildIcon(); - } - } - - Widget _buildIcon() => Padding( - padding: _paddingIcon ?? const EdgeInsets.all(10), - child: SvgPicture.asset( - _icon ?? '', - width: _size ?? 24, - height: _size ?? 24, - fit: BoxFit.fill, - colorFilter: _iconColor.asFilter() - )); - - Widget _buildText() { - return Text( - _text ?? '', - maxLines: 1, - softWrap: CommonTextStyle.defaultSoftWrap, - overflow: CommonTextStyle.defaultTextOverFlow, - style: _textStyle ?? const TextStyle( - fontSize: 12, - color: AppColor.colorTextButton - ), - ); - } -} \ No newline at end of file diff --git a/core/lib/presentation/views/button/icon_button_web.dart b/core/lib/presentation/views/button/icon_button_web.dart index be3bcb8ad..fd053155a 100644 --- a/core/lib/presentation/views/button/icon_button_web.dart +++ b/core/lib/presentation/views/button/icon_button_web.dart @@ -99,32 +99,6 @@ Widget buildIconWebHasPosition(BuildContext context, { ); } -Widget buildTextCircleButton(String text, { - TextStyle? textStyle, - IconWebCallback? onTap, -}) { - return Material( - shape: const CircleBorder(), - color: Colors.transparent, - child: TextButton( - style: ButtonStyle( - overlayColor: MaterialStateProperty.resolveWith((Set states) => AppColor.colorFocusButton), - shape: MaterialStateProperty.all(const CircleBorder()), - padding: MaterialStateProperty.resolveWith((Set states) => EdgeInsets.zero), - elevation: MaterialStateProperty.resolveWith((Set states) => 0)), - onPressed: () => onTap?.call(), - child: Text( - text, - style: textStyle ?? const TextStyle( - fontWeight: FontWeight.normal, - fontSize: 15, - color: AppColor.lineItemListColor - ) - ) - ) - ); -} - Widget buildTextIcon(String text, { TextStyle? textStyle, EdgeInsetsGeometry? padding, diff --git a/core/lib/presentation/views/button/tmail_button_widget.dart b/core/lib/presentation/views/button/tmail_button_widget.dart index 256bfe328..c036126b2 100644 --- a/core/lib/presentation/views/button/tmail_button_widget.dart +++ b/core/lib/presentation/views/button/tmail_button_widget.dart @@ -14,15 +14,24 @@ class TMailButtonWidget extends StatelessWidget { final double? width; final double maxWidth; final double maxHeight; + final double minWidth; final String? tooltipMessage; final Color? backgroundColor; final EdgeInsetsGeometry? padding; + final EdgeInsetsGeometry? margin; final String text; final String? icon; final bool verticalDirection; - final double iconSize; + final double? iconSize; + final double iconSpace; final Color? iconColor; final TextStyle? textStyle; + final String? trailingIcon; + final double? trailingIconSize; + final Color? trailingIconColor; + final List? boxShadow; + final TextAlign? textAlign; + final bool flexibleText; const TMailButtonWidget({ super.key, @@ -33,14 +42,23 @@ class TMailButtonWidget extends StatelessWidget { this.width, this.maxWidth = double.infinity, this.maxHeight = double.infinity, + this.minWidth = 0, this.tooltipMessage, this.backgroundColor, this.padding, this.verticalDirection = false, this.icon, - this.iconSize = 24, + this.iconSize, this.iconColor, this.textStyle, + this.iconSpace = 8, + this.trailingIcon, + this.trailingIconSize, + this.trailingIconColor, + this.boxShadow, + this.margin, + this.textAlign, + this.flexibleText = false, }); factory TMailButtonWidget.fromIcon({ @@ -52,14 +70,23 @@ class TMailButtonWidget extends StatelessWidget { double? width, double maxWidth = double.infinity, double maxHeight = double.infinity, + double minWidth = 0, String? tooltipMessage, Color? backgroundColor, EdgeInsetsGeometry? padding, String text = '', bool verticalDirection = false, - double iconSize = 24, + double? iconSize, Color? iconColor, TextStyle? textStyle, + double iconSpace = 8, + String? trailingIcon, + double? trailingIconSize, + Color? trailingIconColor, + List? boxShadow, + EdgeInsetsGeometry? margin, + TextAlign? textAlign, + bool flexibleText = false, }) { return TMailButtonWidget( key: key, @@ -70,6 +97,7 @@ class TMailButtonWidget extends StatelessWidget { width: width, maxWidth : maxWidth, maxHeight: maxHeight, + minWidth: minWidth, tooltipMessage: tooltipMessage, backgroundColor: backgroundColor, padding: padding, @@ -78,6 +106,14 @@ class TMailButtonWidget extends StatelessWidget { iconSize: iconSize, iconColor: iconColor, textStyle: textStyle, + iconSpace: iconSpace, + trailingIcon: trailingIcon, + trailingIconSize: trailingIconSize, + trailingIconColor: trailingIconColor, + boxShadow: boxShadow, + margin: margin, + textAlign: textAlign, + flexibleText: flexibleText, ); } @@ -88,7 +124,6 @@ class TMailButtonWidget extends StatelessWidget { if (icon != null && text.isNotEmpty) { if (verticalDirection) { childWidget = Column( - mainAxisSize: MainAxisSize.min, children: [ SvgPicture.asset( icon!, @@ -97,18 +132,31 @@ class TMailButtonWidget extends StatelessWidget { fit: BoxFit.fill, colorFilter: iconColor?.asFilter() ), + SizedBox(height: iconSpace), Text( text, + textAlign: textAlign, style: textStyle ?? const TextStyle( fontSize: 12, color: AppColor.colorTextButtonHeaderThread ), ), + if (trailingIcon != null) + Padding( + padding: EdgeInsetsDirectional.only(top: iconSpace), + child: SvgPicture.asset( + trailingIcon!, + width: trailingIconSize, + height: trailingIconSize, + fit: BoxFit.fill, + colorFilter: trailingIconColor?.asFilter() + ), + ), ] ); } else { childWidget = Row( - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, children: [ SvgPicture.asset( icon!, @@ -117,13 +165,38 @@ class TMailButtonWidget extends StatelessWidget { fit: BoxFit.fill, colorFilter: iconColor?.asFilter() ), - Text( - text, - style: textStyle ?? const TextStyle( - fontSize: 12, - color: AppColor.colorTextButtonHeaderThread + SizedBox(width: iconSpace), + if (flexibleText) + Flexible( + child: Text( + text, + textAlign: textAlign, + style: textStyle ?? const TextStyle( + fontSize: 12, + color: AppColor.colorTextButtonHeaderThread + ), + ), + ) + else + Text( + text, + textAlign: textAlign, + style: textStyle ?? const TextStyle( + fontSize: 12, + color: AppColor.colorTextButtonHeaderThread + ), + ), + if (trailingIcon != null) + Padding( + padding: EdgeInsetsDirectional.only(start: iconSpace), + child: SvgPicture.asset( + trailingIcon!, + width: trailingIconSize, + height: trailingIconSize, + fit: BoxFit.fill, + colorFilter: trailingIconColor?.asFilter() + ), ), - ), ] ); } @@ -138,6 +211,7 @@ class TMailButtonWidget extends StatelessWidget { } else { childWidget = Text( text, + textAlign: textAlign, style: textStyle ?? const TextStyle( fontSize: 12, color: AppColor.colorTextButtonHeaderThread @@ -152,9 +226,12 @@ class TMailButtonWidget extends StatelessWidget { width: width, maxWidth: maxWidth, maxHeight: maxHeight, + minWidth: minWidth, tooltipMessage: tooltipMessage, backgroundColor: backgroundColor, padding: padding, + margin: margin, + boxShadow: boxShadow, child: childWidget, ); } diff --git a/core/lib/presentation/views/container/tmail_container_widget.dart b/core/lib/presentation/views/container/tmail_container_widget.dart index 909729108..b5c0229fc 100644 --- a/core/lib/presentation/views/container/tmail_container_widget.dart +++ b/core/lib/presentation/views/container/tmail_container_widget.dart @@ -13,9 +13,12 @@ class TMailContainerWidget extends StatelessWidget { final double? width; final double maxWidth; final double maxHeight; + final double minWidth; final String? tooltipMessage; final Color? backgroundColor; final EdgeInsetsGeometry? padding; + final EdgeInsetsGeometry? margin; + final List? boxShadow; const TMailContainerWidget({ super.key, @@ -26,14 +29,17 @@ class TMailContainerWidget extends StatelessWidget { this.width, this.maxWidth = double.infinity, this.maxHeight = double.infinity, + this.minWidth = 0, this.tooltipMessage, this.backgroundColor, this.padding, + this.boxShadow, + this.margin, }); @override Widget build(BuildContext context) { - return Material( + final materialChild = Material( color: Colors.transparent, child: InkWell( onTap: onTapActionCallback, @@ -59,9 +65,14 @@ class TMailContainerWidget extends StatelessWidget { decoration: BoxDecoration( color: backgroundColor ?? AppColor.colorButtonHeaderThread, borderRadius: BorderRadius.all(Radius.circular(borderRadius)), + boxShadow: boxShadow ), width: width, - constraints: BoxConstraints(maxWidth: maxWidth, maxHeight: maxHeight), + constraints: BoxConstraints( + maxWidth: maxWidth, + maxHeight: maxHeight, + minWidth: minWidth + ), padding: padding ?? const EdgeInsetsDirectional.all(8), child: child ) @@ -71,13 +82,24 @@ class TMailContainerWidget extends StatelessWidget { decoration: BoxDecoration( color: backgroundColor ?? AppColor.colorButtonHeaderThread, borderRadius: BorderRadius.all(Radius.circular(borderRadius)), + boxShadow: boxShadow ), width: width, - constraints: BoxConstraints(maxWidth: maxWidth, maxHeight: maxHeight), + constraints: BoxConstraints( + maxWidth: maxWidth, + maxHeight: maxHeight, + minWidth: minWidth + ), padding: padding ?? const EdgeInsetsDirectional.all(8), child: child ) ), ); + + if (margin != null) { + return Padding(padding: margin!, child: materialChild); + } else { + return materialChild; + } } } \ No newline at end of file diff --git a/lib/features/composer/presentation/base_composer_view.dart b/lib/features/composer/presentation/base_composer_view.dart index 713a36465..3648241fe 100644 --- a/lib/features/composer/presentation/base_composer_view.dart +++ b/lib/features/composer/presentation/base_composer_view.dart @@ -497,7 +497,7 @@ abstract class BaseComposerView extends GetWidget textStyle: const TextStyle( fontWeight: FontWeight.w500, fontSize: 17, - color: AppColor.lineItemListColor + color: AppColor.colorLabelCancelButton ), backgroundColor: AppColor.emailAddressChipColor, width: 150, diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart index 845b9e06a..204647953 100644 --- a/lib/features/email/presentation/email_view.dart +++ b/lib/features/email/presentation/email_view.dart @@ -65,6 +65,7 @@ class EmailView extends GetWidget with AppLoaderMixin { right: responsiveUtils.isLandscapeMobile(context), left: responsiveUtils.isLandscapeMobile(context), child: Container( + clipBehavior: Clip.antiAlias, decoration: responsiveUtils.isWebDesktop(context) ? BoxDecoration( borderRadius: BorderRadius.circular(20), @@ -118,8 +119,10 @@ class EmailView extends GetWidget with AppLoaderMixin { : _buildSingleEmailView(context, email); }), ), - const Divider(color: AppColor.colorDividerHorizontal, height: 1), - _buildBottomBar(context, email), + BottomBarMailWidgetBuilder( + email, + onPressEmailActionClick: controller.pressEmailAction + ), ]); } @@ -225,12 +228,6 @@ class EmailView extends GetWidget with AppLoaderMixin { ]; } - Widget _buildBottomBar(BuildContext context, PresentationEmail presentationEmail) { - return BottomBarMailWidgetBuilder( - presentationEmail, - onPressEmailActionClick: (emailActionType) => controller.pressEmailAction(emailActionType)); - } - Widget _buildEmailBody(BuildContext context, PresentationEmail email) { if (PlatformInfo.isWeb && !email.hasCalendarEvent) { return _buildEmailMessage(context, email); 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 535a80ec7..976466417 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,7 +1,12 @@ -import 'package:core/core.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:model/model.dart'; +import 'package:model/email/email_action_type.dart'; +import 'package:model/email/presentation_email.dart'; +import 'package:model/extensions/presentation_email_extension.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; typedef OnPressEmailActionClick = void Function(EmailActionType emailActionType); @@ -27,69 +32,96 @@ class BottomBarMailWidgetBuilder extends StatelessWidget { final responsiveUtils = Get.find(); return Container( - alignment: Alignment.center, - decoration: responsiveUtils.isWebDesktop(context) - ? const BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.only( - bottomRight: Radius.circular(20), - bottomLeft: Radius.circular(20))) - : const BoxDecoration(color: Colors.white), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, + decoration: const BoxDecoration( + border: Border( + top: BorderSide( + color: AppColor.colorDividerHorizontal, + width: 0.5, + ) + ), + ), + child: IntrinsicHeight( + child: Row( children: [ if (_presentationEmail.numberOfAllEmailAddress() > 1) - Expanded(child: (ButtonBuilder(imagePaths.icReplyAll) - ..key(const Key('button_reply_all_message')) - ..size(15) - ..radiusSplash(0) - ..padding(const EdgeInsets.only(top: 5, bottom: 8)) - ..textStyle(TextStyle( + Expanded( + child: TMailButtonWidget( + key: const Key('reply_all_emails_button'), + text: AppLocalizations.of(context).reply_all, + icon: imagePaths.icReplyAll, + borderRadius: 0, + iconSize: 15, + textAlign: TextAlign.center, + flexibleText: true, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: TextStyle( fontSize: responsiveUtils.isPortraitMobile(context) ? 12 : 16, - color: AppColor.colorTextButton)) - ..onPressActionClick(() =>onPressEmailActionClick?.call(EmailActionType.replyAll)) - ..text(AppLocalizations.of(context).reply_all, - isVertical: responsiveUtils.isPortraitMobile(context))) - .build()), - Expanded(child: (ButtonBuilder(imagePaths.icReply) - ..key(const Key('button_reply_message')) - ..size(20) - ..radiusSplash(0) - ..padding(const EdgeInsets.only(top: 5, bottom: 8)) - ..textStyle(TextStyle( + color: AppColor.colorTextButton + ), + verticalDirection: responsiveUtils.isPortraitMobile(context), + onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.replyAll), + ), + ), + Expanded( + child: TMailButtonWidget( + key: const Key('reply_email_button'), + text: AppLocalizations.of(context).reply, + icon: imagePaths.icReply, + borderRadius: 0, + iconSize: 20, + textAlign: TextAlign.center, + flexibleText: true, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: TextStyle( fontSize: responsiveUtils.isPortraitMobile(context) ? 12 : 16, - color: AppColor.colorTextButton)) - ..onPressActionClick(() => onPressEmailActionClick?.call(EmailActionType.reply)) - ..text(AppLocalizations.of(context).reply, - isVertical: responsiveUtils.isPortraitMobile(context))) - .build()), - Expanded(child: (ButtonBuilder(imagePaths.icForward) - ..key(const Key('button_forward_message')) - ..size(20) - ..radiusSplash(0) - ..padding(const EdgeInsets.only(top: 5, bottom: 8)) - ..textStyle(TextStyle( + color: AppColor.colorTextButton + ), + verticalDirection: responsiveUtils.isPortraitMobile(context), + onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.reply), + ), + ), + Expanded( + child: TMailButtonWidget( + key: const Key('forward_email_button'), + text: AppLocalizations.of(context).forward, + icon: imagePaths.icForward, + borderRadius: 0, + iconSize: 20, + textAlign: TextAlign.center, + flexibleText: true, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: TextStyle( fontSize: responsiveUtils.isPortraitMobile(context) ? 12 : 16, - color: AppColor.colorTextButton)) - ..onPressActionClick(() => onPressEmailActionClick?.call(EmailActionType.forward)) - ..text(AppLocalizations.of(context).forward, - isVertical: responsiveUtils.isPortraitMobile(context))) - .build()), - if (responsiveUtils.mailboxDashboardOnlyHasEmailView(context)) - Expanded(child: (ButtonBuilder(imagePaths.icNewMessage) - ..key(const Key('button_new_message')) - ..size(20) - ..radiusSplash(0) - ..padding(const EdgeInsets.only(top: 5, bottom: 8)) - ..textStyle(TextStyle( - fontSize: responsiveUtils.isPortraitMobile(context) ? 12 : 16, - color: AppColor.colorTextButton)) - ..onPressActionClick(() => onPressEmailActionClick?.call(EmailActionType.compose)) - ..text(AppLocalizations.of(context).new_message, - isVertical: responsiveUtils.isPortraitMobile(context))) - .build()) + color: AppColor.colorTextButton + ), + verticalDirection: responsiveUtils.isPortraitMobile(context), + onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.forward), + ), + ), + Expanded( + child: TMailButtonWidget( + key: const Key('compose_new_email_button'), + text: AppLocalizations.of(context).new_message, + icon: imagePaths.icNewMessage, + borderRadius: 0, + iconSize: 20, + textAlign: TextAlign.center, + flexibleText: true, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: TextStyle( + fontSize: responsiveUtils.isPortraitMobile(context) ? 12 : 16, + color: AppColor.colorTextButton + ), + verticalDirection: responsiveUtils.isPortraitMobile(context), + onTapActionCallback: () => onPressEmailActionClick?.call(EmailActionType.compose), + ), + ), ] + ), ) ); } diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 1d3ae1942..27197d9c6 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -57,7 +57,21 @@ class MailboxView extends BaseMailboxView { Obx(() { if (controller.isSelectionEnabled() && controller.listActionOfMailboxSelected.isNotEmpty) { - return _buildOptionSelectionMailbox(context); + return SafeArea( + right: false, + top: false, + child: BottomBarSelectionMailboxWidget( + controller.listMailboxSelected, + controller.listActionOfMailboxSelected, + onMailboxActionsClick: (actions, listMailboxSelected) { + return controller.pressMailboxSelectionAction( + context, + actions, + listMailboxSelected + ); + } + ) + ); } else { return const SizedBox.shrink(); } @@ -369,35 +383,6 @@ class MailboxView extends BaseMailboxView { }).toList() ?? []; } - Widget _buildOptionSelectionMailbox(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: [ - const Divider( - color: AppColor.lineItemListColor, - height: 1, - thickness: 0.2 - ), - SafeArea( - right: false, - top: false, - child: BottomBarSelectionMailboxWidget( - responsiveUtils, - imagePaths, - controller.listMailboxSelected, - controller.listActionOfMailboxSelected, - onMailboxActionsClick: (actions, listMailboxSelected) => - controller.pressMailboxSelectionAction( - context, - actions, - listMailboxSelected - ) - ) - ) - ] - ); - } - Widget _buildVersionInformation(BuildContext context, PackageInfo packageInfo) { return Container( color: AppColor.colorBgMailbox, diff --git a/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart b/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart index e12ae8f76..99296995b 100644 --- a/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart +++ b/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart @@ -1,8 +1,9 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; -import 'package:core/presentation/views/button/button_builder.dart'; +import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart'; @@ -10,15 +11,11 @@ typedef OnMailboxActionsClick = void Function(MailboxActions, List _listSelectionMailbox; final List _listMailboxActions; final OnMailboxActionsClick onMailboxActionsClick; const BottomBarSelectionMailboxWidget( - this._responsiveUtils, - this._imagePaths, this._listSelectionMailbox, this._listMailboxActions, { @@ -30,23 +27,36 @@ class BottomBarSelectionMailboxWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return Row(children: _listMailboxActions - .map((action) => _buildMailboxActionButton(context, action)) - .toList()); - } + final responsiveUtils = Get.find(); + final imagePaths = Get.find(); - Widget _buildMailboxActionButton(BuildContext context, MailboxActions actions) { - return Expanded(child: (ButtonBuilder(actions.getContextMenuIcon(_imagePaths)) - ..radiusSplash(8) - ..padding(const EdgeInsets.all(8)) - ..tooltip(actions.getTitleContextMenu(context)) - ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButton)) - ..iconColor(AppColor.colorTextButton) - ..onPressActionClick(() => onMailboxActionsClick.call(actions, _listSelectionMailbox)) - ..text( - _responsiveUtils.isLandscapeMobile(context) ? null : actions.getTitleContextMenu(context), - isVertical: true - ) - ).build()); + return Container( + decoration: const BoxDecoration( + border: Border(top: BorderSide( + color: AppColor.colorDividerHorizontal, + width: 0.5, + )), + ), + child: IntrinsicHeight( + child: Row(children: _listMailboxActions + .map((action) { + return Expanded(child: TMailButtonWidget( + key: Key('${action.name}_button'), + text: responsiveUtils.isLandscapeMobile(context) + ? '' + : action.getTitleContextMenu(context), + icon: action.getContextMenuIcon(imagePaths), + borderRadius: 0, + backgroundColor: Colors.transparent, + flexibleText: true, + tooltipMessage: action.getTitleContextMenu(context), + textStyle: const TextStyle(fontSize: 12, color: AppColor.colorTextButton), + onTapActionCallback: () => onMailboxActionsClick.call(action, _listSelectionMailbox), + )); + }) + .toList() + ), + ), + ); } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index d51b631ba..055646117 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -2067,6 +2067,10 @@ class MailboxDashBoardController extends ReloadableController { await Future.delayed(const Duration(milliseconds: 500)); dispatchAction(RefreshAllEmailAction()); } + + void selectAllEmailAction() { + dispatchAction(SelectionAllEmailAction()); + } @override void onClose() { diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index 5cdddfd6a..f3c210714 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -397,81 +397,54 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { ); }), const SizedBox(width: 16), - (ButtonBuilder(imagePaths.icSelectAll) - ..key(const Key('button_select_all')) - ..decoration(const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(10)), - color: AppColor.colorButtonHeaderThread)) - ..paddingIcon(EdgeInsets.only( - right: AppUtils.isDirectionRTL(context) ? 0 : 8, - left: AppUtils.isDirectionRTL(context) ? 8 : 0 - )) - ..size(16) - ..radiusSplash(10) - ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) - ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButtonHeaderThread)) - ..onPressActionClick(() => controller.dispatchAction(SelectionAllEmailAction())) - ..text(AppLocalizations.of(context).select_all, isVertical: false)) - .build(), + TMailButtonWidget( + key: const Key('select_all_emails_button'), + text: AppLocalizations.of(context).select_all, + icon: imagePaths.icSelectAll, + borderRadius: 10, + iconSize: 16, + padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8), + onTapActionCallback: controller.selectAllEmailAction, + ), if (controller.isAbleMarkAllAsRead()) Padding( - padding: EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 0 : 16, - right: AppUtils.isDirectionRTL(context) ? 16 : 0, + padding: const EdgeInsetsDirectional.only(start: 16), + child: TMailButtonWidget( + key: const Key('mark_as_read_emails_button'), + text: AppLocalizations.of(context).mark_all_as_read, + icon: imagePaths.icSelectAll, + borderRadius: 10, + iconSize: 16, + padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8), + onTapActionCallback: () => controller.markAsReadMailboxAction(context), ), - child: (ButtonBuilder(imagePaths.icMarkAllAsRead) - ..key(const Key('button_mark_all_as_read')) - ..decoration(const BoxDecoration( - borderRadius:BorderRadius.all(Radius.circular(10)), - color: AppColor.colorButtonHeaderThread)) - ..paddingIcon(const EdgeInsets.only(right: 8)) - ..size(16) - ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) - ..radiusSplash(10) - ..textStyle(const TextStyle( - fontSize: 12, - color: AppColor.colorTextButtonHeaderThread)) - ..onPressActionClick(() => controller.markAsReadMailboxAction(context)) - ..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false)) - .build(), ), const SizedBox(width: 16), - Obx(() => (ButtonBuilder(controller.filterMessageOption.value.getIconSelected(imagePaths)) - ..key(const Key('button_filter_messages')) - ..context(context) - ..decoration(BoxDecoration( - borderRadius: const BorderRadius.all(Radius.circular(10)), - color: controller.filterMessageOption.value.getBackgroundColor())) - ..paddingIcon(EdgeInsets.only( - right: AppUtils.isDirectionRTL(context) ? 0 : 8, - left: AppUtils.isDirectionRTL(context) ? 8 : 0, - )) - ..size(16) - ..padding(const EdgeInsets.symmetric(horizontal: 12, vertical: 8)) - ..radiusSplash(10) - ..textStyle(controller.filterMessageOption.value.getTextStyle()) - ..addIconAction(Padding( - padding: EdgeInsets.only( - left: AppUtils.isDirectionRTL(context) ? 0 : 8, - right: AppUtils.isDirectionRTL(context) ? 8 : 0, - ), - child: SvgPicture.asset(imagePaths.icArrowDown, fit: BoxFit.fill))) - ..addOnPressActionWithPositionClick((position) => - controller.openPopupMenuAction( - context, - position, - popupMenuFilterEmailActionTile( - context, - controller.filterMessageOption.value, - (option) => controller.dispatchAction(FilterMessageAction(context, option)), - isSearchEmailRunning: controller.searchController.isSearchEmailRunning - ) - ) + Obx(() => TMailButtonWidget( + key: const Key('filter_emails_button'), + text: controller.filterMessageOption.value == FilterMessageOption.all + ? AppLocalizations.of(context).filter_messages + : controller.filterMessageOption.value.getTitle(context), + icon: controller.filterMessageOption.value.getIconSelected(imagePaths), + borderRadius: 10, + iconSize: 16, + padding: const EdgeInsetsDirectional.symmetric(horizontal: 12, vertical: 8), + backgroundColor: controller.filterMessageOption.value.getBackgroundColor(), + textStyle: controller.filterMessageOption.value.getTextStyle(), + trailingIcon: imagePaths.icArrowDown, + onTapActionAtPositionCallback: (position) { + return controller.openPopupMenuAction( + context, + position, + popupMenuFilterEmailActionTile( + context, + controller.filterMessageOption.value, + (option) => controller.dispatchAction(FilterMessageAction(context, option)), + isSearchEmailRunning: controller.searchController.isSearchEmailRunning ) - ..text(controller.filterMessageOption.value == FilterMessageOption.all - ? AppLocalizations.of(context).filter_messages - : controller.filterMessageOption.value.getTitle(context), isVertical: false)) - .build()), + ); + }, + )), ]); } @@ -682,37 +655,36 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { Widget _buildComposerButton(BuildContext context) { return Container( - padding: const EdgeInsets.all(16), - color: Colors.transparent, + padding: const EdgeInsetsDirectional.only( + start: 16, + end: 16, + top: 16, + bottom: 8 + ), width: ResponsiveUtils.defaultSizeMenu, alignment: Alignment.centerLeft, - child: (ButtonBuilder(imagePaths.icComposeWeb) - ..key(const Key('button_compose_email')) - ..decoration(BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppColor.colorTextButton, - boxShadow: const [ - BoxShadow( - blurRadius: 12.0, - color: AppColor.colorShadowComposerButton - ) - ])) - ..paddingIcon(EdgeInsets.only( - right: AppUtils.isDirectionRTL(context) ? 0 : 8, - left: AppUtils.isDirectionRTL(context) ? 8 : 0, - )) - ..iconColor(Colors.white) - ..size(24) - ..radiusSplash(10) - ..padding(const EdgeInsets.symmetric(vertical: 8)) - ..textStyle(const TextStyle( - fontSize: 15, - color: Colors.white, - fontWeight: FontWeight.w500 - )) - ..onPressActionClick(() => controller.goToComposer(ComposerArguments())) - ..text(AppLocalizations.of(context).compose, isVertical: false) - ).build() + child: TMailButtonWidget( + key: const Key('compose_email_button'), + text: AppLocalizations.of(context).compose, + icon: imagePaths.icComposeWeb, + borderRadius: 10, + iconSize: 24, + iconColor: Colors.white, + padding: const EdgeInsetsDirectional.symmetric(vertical: 8), + backgroundColor: AppColor.colorTextButton, + boxShadow: const [ + BoxShadow( + blurRadius: 12.0, + color: AppColor.colorShadowComposerButton + ) + ], + textStyle: const TextStyle( + fontSize: 15, + color: Colors.white, + fontWeight: FontWeight.w500 + ), + onTapActionCallback: () => controller.goToComposer(ComposerArguments()), + ), ); } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart b/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart index 2900aa85b..9c2670a99 100644 --- a/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart +++ b/lib/features/manage_account/presentation/email_rules/widgets/email_rules_header_widget.dart @@ -1,7 +1,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; -import 'package:core/presentation/views/button/button_builder.dart'; +import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -48,51 +48,43 @@ class EmailRulesHeaderWidget extends StatelessWidget { if (!responsiveUtils.isMobile(context)) { return Row( children: [ - (ButtonBuilder(imagePaths.icAddNewRules) - ..key(const Key('button_new_rule')) - ..decoration(BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppColor.colorTextButton)) - ..paddingIcon(const EdgeInsets.only(right: 8)) - ..iconColor(Colors.white) - ..size(20) - ..radiusSplash(10) - ..addBoxConstraints(const BoxConstraints(minWidth: 130)) - ..padding(const EdgeInsets.symmetric(vertical: 12,horizontal: 8)) - ..textStyle(const TextStyle( + TMailButtonWidget( + key: const Key('new_rule_button'), + text: AppLocalizations.of(context).addNewRule, + icon: imagePaths.icAddNewRules, + borderRadius: 10, + backgroundColor: AppColor.colorTextButton, + iconColor: Colors.white, + minWidth: 130, + padding: const EdgeInsets.symmetric(vertical: 12,horizontal: 8), + iconSize: 20, + textStyle: const TextStyle( fontSize: 17, color: Colors.white, fontWeight: FontWeight.w500, - )) - ..onPressActionClick(() => createRule.call()) - ..text( - AppLocalizations.of(context).addNewRule, - isVertical: false, - )).build(), + ), + onTapActionCallback: createRule, + ), const Spacer(), ], ); } else { - return (ButtonBuilder(imagePaths.icAddNewRules) - ..key(const Key('button_new_rule')) - ..decoration(BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: AppColor.colorTextButton)) - ..paddingIcon(const EdgeInsets.only(right: 8)) - ..iconColor(Colors.white) - ..size(20) - ..radiusSplash(10) - ..padding(const EdgeInsets.symmetric(vertical: 12)) - ..textStyle(const TextStyle( + return TMailButtonWidget( + key: const Key('new_rule_button'), + text: AppLocalizations.of(context).addNewRule, + icon: imagePaths.icAddNewRules, + borderRadius: 10, + backgroundColor: AppColor.colorTextButton, + iconColor: Colors.white, + padding: const EdgeInsets.symmetric(vertical: 12), + iconSize: 20, + textStyle: const TextStyle( fontSize: 17, color: Colors.white, fontWeight: FontWeight.w500, - )) - ..onPressActionClick(() => createRule.call()) - ..text( - AppLocalizations.of(context).addNewRule, - isVertical: false, - )).build(); + ), + onTapActionCallback: createRule, + ); } } } diff --git a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart index 7858f9071..9b5299557 100644 --- a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart @@ -7,7 +7,6 @@ import 'package:get/get.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/widgets/account_menu_item_tile_builder.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -import 'package:tmail_ui_user/main/utils/app_utils.dart'; class ManageAccountMenuView extends GetWidget { @@ -57,93 +56,100 @@ class ManageAccountMenuView extends GetWidget { const Divider(color: AppColor.colorDividerMailbox, height: 1), Expanded(child: Container( color: _responsiveUtils.isWebDesktop(context) ? AppColor.colorBgDesktop : Colors.white, - child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ - Padding( - padding: const EdgeInsetsDirectional.only(start: 20, top: 24), - child: (ButtonBuilder(DirectionUtils.isDirectionRTLByLanguage(context) ? _imagePaths.icArrowRight : _imagePaths.icBack) - ..key(const Key('button_back')) - ..decoration(BoxDecoration(borderRadius: BorderRadius.circular(10), color: AppColor.colorBgMailboxSelected)) - ..paddingIcon(EdgeInsets.only( - right: AppUtils.isDirectionRTL(context) ? 0 : 8, - left: AppUtils.isDirectionRTL(context) ? 8 : 0, - )) - ..iconColor(AppColor.colorTextButton) - ..maxWidth(100) - ..size(DirectionUtils.isDirectionRTLByLanguage(context) ? null : 16) - ..radiusSplash(10) - ..padding(DirectionUtils.isDirectionRTLByLanguage(context) + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsetsDirectional.only(start: 20, top: 24), + child: TMailButtonWidget( + key: const Key('back_to_dashboard_button'), + text: AppLocalizations.of(context).back, + icon: DirectionUtils.isDirectionRTLByLanguage(context) + ? _imagePaths.icArrowRight + : _imagePaths.icBack, + borderRadius: 10, + backgroundColor: AppColor.colorBgMailboxSelected, + iconColor: AppColor.colorTextButton, + maxWidth: 100, + padding: DirectionUtils.isDirectionRTLByLanguage(context) ? const EdgeInsets.symmetric(vertical: 5) - : const EdgeInsets.symmetric(vertical: 10)) - ..textStyle(const TextStyle(fontSize: 15, color: AppColor.colorTextButton, fontWeight: FontWeight.normal)) - ..onPressActionClick(() => controller.backToMailboxDashBoard(context)) - ..text(AppLocalizations.of(context).back, isVertical: false)) - .build()), - Padding( - padding: const EdgeInsetsDirectional.only(start: 32, top: 20), - child: Text( - AppLocalizations.of(context).manage_account, - style: const TextStyle( - color: Colors.black, - fontWeight: FontWeight.bold, - fontSize: 17 - ) - ) - ), - const SizedBox(height: 12), - Obx(() { - if (controller.listAccountMenuItem.isNotEmpty) { - return ListView.builder( - key: const Key('list_manage_account_menu_item'), - padding: const EdgeInsetsDirectional.only(start: 16, end: 8), - shrinkWrap: true, - itemCount: controller.listAccountMenuItem.length, - itemBuilder: (context, index) => Obx(() { - final menuItem = controller.listAccountMenuItem[index]; - return AccountMenuItemTileBuilder( - menuItem, - controller.dashBoardController.accountMenuItemSelected.value, - onSelectAccountMenuItemAction: controller.selectAccountMenuItem - ); - }) - ); - } else { - return const SizedBox.shrink(); - } - }), - const Padding( - padding: EdgeInsets.symmetric(vertical: 16), - child: Divider(color: AppColor.lineItemListColor, height: 1)), - Padding( - padding: const EdgeInsetsDirectional.only(start: 20, end: 10), - child: Material( - color: Colors.transparent, - child: InkWell( - onTap: () { - controller.dashBoardController.logout( - controller.dashBoardController.sessionCurrent, - controller.dashBoardController.accountId.value - ); - }, - borderRadius: BorderRadius.circular(10), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), - child: Row(children: [ - SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill), - const SizedBox(width: 12), - Expanded(child: Text( - AppLocalizations.of(context).sign_out, - style: const TextStyle( - fontWeight: FontWeight.normal, - fontSize: 15, - color: Colors.black - ) - )) - ]), - ) + : const EdgeInsets.symmetric(vertical: 10), + iconSize: DirectionUtils.isDirectionRTLByLanguage(context) ? null : 16, + textStyle: const TextStyle( + fontSize: 15, + color: AppColor.colorTextButton, + fontWeight: FontWeight.normal + ), + onTapActionCallback: () => controller.backToMailboxDashBoard(context), ), - ) - ), - ]), + ), + Padding( + padding: const EdgeInsetsDirectional.only(start: 32, top: 20), + child: Text( + AppLocalizations.of(context).manage_account, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 17 + ) + ) + ), + const SizedBox(height: 12), + Obx(() { + if (controller.listAccountMenuItem.isNotEmpty) { + return ListView.builder( + key: const Key('list_manage_account_menu_item'), + padding: const EdgeInsetsDirectional.only(start: 16, end: 8), + shrinkWrap: true, + itemCount: controller.listAccountMenuItem.length, + itemBuilder: (context, index) => Obx(() { + final menuItem = controller.listAccountMenuItem[index]; + return AccountMenuItemTileBuilder( + menuItem, + controller.dashBoardController.accountMenuItemSelected.value, + onSelectAccountMenuItemAction: controller.selectAccountMenuItem + ); + }) + ); + } else { + return const SizedBox.shrink(); + } + }), + const Padding( + padding: EdgeInsets.symmetric(vertical: 16), + child: Divider(color: AppColor.lineItemListColor, height: 1)), + Padding( + padding: const EdgeInsetsDirectional.only(start: 20, end: 10), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + controller.dashBoardController.logout( + controller.dashBoardController.sessionCurrent, + controller.dashBoardController.accountId.value + ); + }, + borderRadius: BorderRadius.circular(10), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), + child: Row(children: [ + SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill), + const SizedBox(width: 12), + Expanded(child: Text( + AppLocalizations.of(context).sign_out, + style: const TextStyle( + fontWeight: FontWeight.normal, + fontSize: 15, + color: Colors.black + ) + )) + ]), + ) + ), + ) + ), + ] + ), )), ] ) diff --git a/lib/features/quotas/presentation/quotas_view.dart b/lib/features/quotas/presentation/quotas_view.dart index def5dbfaf..0143887e8 100644 --- a/lib/features/quotas/presentation/quotas_view.dart +++ b/lib/features/quotas/presentation/quotas_view.dart @@ -30,7 +30,7 @@ class QuotasView extends GetWidget { ? QuotasViewStyles.webBackgroundColor : QuotasViewStyles.mobileBackgroundColor, border: const Border( - top: BorderSide( // <--- left side + top: BorderSide( color: QuotasViewStyles.topLineColor, width: QuotasViewStyles.topLineSize, ) diff --git a/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart b/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart index 362e88687..715d470c5 100644 --- a/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart +++ b/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart @@ -2,7 +2,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; -import 'package:core/presentation/views/button/button_builder.dart'; +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/base/state/button_state.dart'; @@ -33,49 +33,70 @@ class BottomBarSendingQueueWidget extends StatelessWidget { return Container( decoration: const BoxDecoration( border: Border(top: BorderSide( - color: AppColor.lineItemListColor, - width: 0.2, + color: AppColor.colorDividerHorizontal, + width: 0.5, )), color: Colors.white ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Expanded(child: (ButtonBuilder(imagePaths.icEdit) - ..key(Key(SendingEmailActionType.edit.getButtonKey())) - ..iconColor(SendingEmailActionType.edit.getButtonIconColor(_isEditable ? ButtonState.enabled : ButtonState.disabled)) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.edit.getButtonTitleColor(_isEditable ? ButtonState.enabled : ButtonState.disabled))) - ..onPressActionClick(() { - if (_isEditable) { - onHandleSendingEmailActionType?.call(SendingEmailActionType.edit, listSendingEmailSelected); - } - }) - ..text(SendingEmailActionType.edit.getButtonTitle(context), isVertical: responsiveUtils.isPortraitMobile(context)) - ).build()), - Expanded(child: (ButtonBuilder(imagePaths.icRefresh) - ..key(Key(SendingEmailActionType.resend.getButtonKey())) - ..iconColor(SendingEmailActionType.resend.getButtonIconColor(_isCanResend ? ButtonState.enabled : ButtonState.disabled)) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.resend.getButtonTitleColor(_isCanResend ? ButtonState.enabled : ButtonState.disabled))) - ..onPressActionClick(() { - if (_isCanResend) { - onHandleSendingEmailActionType?.call(SendingEmailActionType.resend, listSendingEmailSelected); - } - }) - ..text(SendingEmailActionType.resend.getButtonTitle(context), isVertical: responsiveUtils.isPortraitMobile(context)) - ).build()), - Expanded(child: (ButtonBuilder(imagePaths.icDeleteComposer) - ..key(Key(SendingEmailActionType.delete.getButtonKey())) - ..iconColor(SendingEmailActionType.delete.getButtonIconColor(ButtonState.enabled)) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.delete.getButtonTitleColor(ButtonState.enabled))) - ..onPressActionClick(() => onHandleSendingEmailActionType?.call(SendingEmailActionType.delete, listSendingEmailSelected)) - ..text(SendingEmailActionType.delete.getButtonTitle(context), isVertical: responsiveUtils.isPortraitMobile(context)) - ).build()) + Expanded( + child: TMailButtonWidget( + key: Key(SendingEmailActionType.edit.getButtonKey()), + text: SendingEmailActionType.edit.getButtonTitle(context), + icon: imagePaths.icEdit, + borderRadius: 8, + iconColor: SendingEmailActionType.edit.getButtonIconColor(_isEditable ? ButtonState.enabled : ButtonState.disabled), + textStyle: TextStyle( + fontSize: 12, + color: SendingEmailActionType.edit.getButtonTitleColor(_isEditable ? ButtonState.enabled : ButtonState.disabled) + ), + verticalDirection: responsiveUtils.isPortraitMobile(context), + onTapActionCallback: () { + if (_isEditable) { + onHandleSendingEmailActionType?.call( + SendingEmailActionType.edit, + listSendingEmailSelected + ); + } + }, + ), + ), + Expanded( + child: TMailButtonWidget( + key: Key(SendingEmailActionType.resend.getButtonKey()), + text: SendingEmailActionType.resend.getButtonTitle(context), + icon: imagePaths.icRefresh, + borderRadius: 8, + iconColor: SendingEmailActionType.resend.getButtonIconColor(_isCanResend ? ButtonState.enabled : ButtonState.disabled), + textStyle: TextStyle( + fontSize: 12, + color: SendingEmailActionType.resend.getButtonTitleColor(_isCanResend ? ButtonState.enabled : ButtonState.disabled) + ), + verticalDirection: responsiveUtils.isPortraitMobile(context), + onTapActionCallback: () { + if (_isCanResend) { + onHandleSendingEmailActionType?.call(SendingEmailActionType.resend, listSendingEmailSelected); + } + }, + ), + ), + Expanded( + child: TMailButtonWidget( + key: Key(SendingEmailActionType.delete.getButtonKey()), + text: SendingEmailActionType.delete.getButtonTitle(context), + icon: imagePaths.icDeleteComposer, + borderRadius: 8, + iconColor: SendingEmailActionType.delete.getButtonIconColor(ButtonState.enabled), + textStyle: TextStyle( + fontSize: 12, + color: SendingEmailActionType.delete.getButtonTitleColor(ButtonState.enabled) + ), + verticalDirection: responsiveUtils.isPortraitMobile(context), + onTapActionCallback: () => onHandleSendingEmailActionType?.call(SendingEmailActionType.delete, listSendingEmailSelected), + ), + ), ], ), ); diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index d9d86a1eb..738a33085 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -222,9 +222,9 @@ class ThreadView extends GetWidget return Obx(() { if (controller.isAllSearchInActive) { return Container( - padding: PlatformInfo.isWeb - ? EdgeInsets.zero - : controller.listEmailSelected.isNotEmpty ? const EdgeInsets.only(bottom: 70) : EdgeInsets.zero, + padding: PlatformInfo.isMobile && controller.listEmailSelected.isNotEmpty + ? EdgeInsets.only(bottom: _responsiveUtils.isTabletLarge(context) ? 85 : 70) + : EdgeInsets.zero, child: ComposeFloatingButton( scrollController: controller.listEmailController, onTap: () => controller.mailboxDashBoardController.goToComposer(ComposerArguments()) diff --git a/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart b/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart index 4ea481954..c1b8a1f06 100644 --- a/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart +++ b/lib/features/thread/presentation/widgets/bottom_bar_thread_selection_widget.dart @@ -1,8 +1,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; -import 'package:core/presentation/views/button/button_builder.dart'; -import 'package:core/utils/platform_info.dart'; +import 'package:core/presentation/views/button/tmail_button_widget.dart'; import 'package:flutter/material.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; @@ -35,86 +34,131 @@ class BottomBarThreadSelectionWidget extends StatelessWidget{ @override Widget build(BuildContext context) { return Container( - key: const Key('bottom_bar_thread_selection_widget'), decoration: const BoxDecoration( border: Border(top: BorderSide( - color: AppColor.lineItemListColor, - width: 0.2, + color: AppColor.colorDividerHorizontal, + width: 0.5, )), - color: Colors.white ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - if(_currentMailbox?.isDrafts == false) - Expanded(child: (ButtonBuilder(_listSelectionEmail.isAllEmailRead ? _imagePaths.icUnread : _imagePaths.icRead) - ..key(const Key('button_mark_read_email')) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButton)) - ..onPressActionClick(() { - onPressEmailSelectionActionClick?.call( - _listSelectionEmail.isAllEmailRead ? EmailActionType.markAsUnread : EmailActionType.markAsRead, - _listSelectionEmail - ); - }) - ..text(_getTextButtonMarkAsRead(context), isVertical: _responsiveUtils.isMobile(context))) - .build()), - Expanded(child: (ButtonBuilder(_listSelectionEmail.isAllEmailStarred ? _imagePaths.icUnStar : _imagePaths.icStar) - ..key(const Key('button_mark_as_star_email')) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButton)) - ..onPressActionClick(() { - onPressEmailSelectionActionClick?.call( - _listSelectionEmail.isAllEmailStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred, - _listSelectionEmail - ); - }) - ..text(_getTextButtonMarkAsStar(context), isVertical: _responsiveUtils.isMobile(context))) - .build()), - if (_currentMailbox?.isDrafts == false) - Expanded(child: (ButtonBuilder(_imagePaths.icMove) - ..key(const Key('button_move_to_mailbox')) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButton)) - ..onPressActionClick(() { - onPressEmailSelectionActionClick?.call(EmailActionType.moveToMailbox, _listSelectionEmail); - }) - ..text(_getTextButtonMove(context), isVertical: _responsiveUtils.isMobile(context))) - .build()), - if (_currentMailbox?.isDrafts == false) - Expanded(child: (ButtonBuilder(_currentMailbox?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam) - ..key(const Key('button_move_to_spam')) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButton)) - ..onPressActionClick(() { - if (_currentMailbox?.isSpam == true) { - onPressEmailSelectionActionClick?.call(EmailActionType.unSpam, _listSelectionEmail); - } else { - onPressEmailSelectionActionClick?.call(EmailActionType.moveToSpam, _listSelectionEmail); - } - }) - ..text(_getTextButtonSpam(context), isVertical: _responsiveUtils.isMobile(context))) - .build()), - Expanded(child: (ButtonBuilder(canDeletePermanently ? _imagePaths.icDeleteComposer : _imagePaths.icDelete) - ..key(const Key('button_delete_email')) - ..iconColor(canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor) - ..padding(const EdgeInsets.all(8)) - ..radiusSplash(8) - ..textStyle(const TextStyle(fontSize: 12, color: AppColor.colorTextButton)) - ..onPressActionClick(() { - if (canDeletePermanently) { - onPressEmailSelectionActionClick?.call(EmailActionType.deletePermanently, _listSelectionEmail); - } else { - onPressEmailSelectionActionClick?.call(EmailActionType.moveToTrash, _listSelectionEmail); - } - }) - ..text(_getTextButtonDelete(context), isVertical: _responsiveUtils.isMobile(context))) - .build()) - ] + child: IntrinsicHeight( + child: Row( + children: [ + if (_currentMailbox?.isDrafts == false) + Expanded( + child: TMailButtonWidget( + key: const Key('mark_as_read_selected_email_button'), + text: _listSelectionEmail.isAllEmailRead + ? AppLocalizations.of(context).unread + : AppLocalizations.of(context).read, + icon: _listSelectionEmail.isAllEmailRead ? _imagePaths.icUnread : _imagePaths.icRead, + borderRadius: 0, + iconSize: 20, + flexibleText: true, + textAlign: TextAlign.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: const TextStyle(fontSize: 12, color: AppColor.colorTextButton), + verticalDirection: _verticalDirection(context), + onTapActionCallback: () { + onPressEmailSelectionActionClick?.call( + _listSelectionEmail.isAllEmailRead ? EmailActionType.markAsUnread : EmailActionType.markAsRead, + _listSelectionEmail + ); + }, + ), + ), + Expanded( + child: TMailButtonWidget( + key: const Key('mark_as_star_selected_email_button'), + text: _listSelectionEmail.isAllEmailStarred + ? AppLocalizations.of(context).un_star + : AppLocalizations.of(context).star, + icon: _listSelectionEmail.isAllEmailStarred ? _imagePaths.icUnStar : _imagePaths.icStar, + borderRadius: 0, + iconSize: 20, + flexibleText: true, + textAlign: TextAlign.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: const TextStyle(fontSize: 12, color: AppColor.colorTextButton), + verticalDirection: _verticalDirection(context), + onTapActionCallback: () { + onPressEmailSelectionActionClick?.call( + _listSelectionEmail.isAllEmailStarred ? EmailActionType.unMarkAsStarred : EmailActionType.markAsStarred, + _listSelectionEmail + ); + }, + ), + ), + if (_currentMailbox?.isDrafts == false) + Expanded( + child: TMailButtonWidget( + key: const Key('move_selected_email_to_mailbox_button'), + text: AppLocalizations.of(context).move, + icon: _imagePaths.icMove, + borderRadius: 0, + iconSize: 20, + textAlign: TextAlign.center, + flexibleText: true, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: const TextStyle(fontSize: 12, color: AppColor.colorTextButton), + verticalDirection: _verticalDirection(context), + onTapActionCallback: () { + onPressEmailSelectionActionClick?.call(EmailActionType.moveToMailbox, _listSelectionEmail); + }, + ), + ), + if (_currentMailbox?.isDrafts == false) + Expanded( + child: TMailButtonWidget( + key: const Key('move_selected_email_to_spam_button'), + text: _currentMailbox?.isSpam == true + ? AppLocalizations.of(context).un_spam + : AppLocalizations.of(context).spam, + icon: _currentMailbox?.isSpam == true ? _imagePaths.icNotSpam : _imagePaths.icSpam, + borderRadius: 0, + iconSize: 20, + flexibleText: true, + textAlign: TextAlign.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: const TextStyle(fontSize: 12, color: AppColor.colorTextButton), + verticalDirection: _verticalDirection(context), + onTapActionCallback: () { + if (_currentMailbox?.isSpam == true) { + onPressEmailSelectionActionClick?.call(EmailActionType.unSpam, _listSelectionEmail); + } else { + onPressEmailSelectionActionClick?.call(EmailActionType.moveToSpam, _listSelectionEmail); + } + }, + ), + ), + Expanded( + child: TMailButtonWidget( + key: const Key('delete_selected_email_button'), + text: AppLocalizations.of(context).delete, + icon: canDeletePermanently ? _imagePaths.icDeleteComposer : _imagePaths.icDelete, + iconColor: canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor, + borderRadius: 0, + iconSize: 20, + flexibleText: true, + textAlign: TextAlign.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 12), + backgroundColor: Colors.transparent, + textStyle: const TextStyle(fontSize: 12, color: AppColor.colorTextButton), + verticalDirection: _verticalDirection(context), + onTapActionCallback: () { + if (canDeletePermanently) { + onPressEmailSelectionActionClick?.call(EmailActionType.deletePermanently, _listSelectionEmail); + } else { + onPressEmailSelectionActionClick?.call(EmailActionType.moveToTrash, _listSelectionEmail); + } + }, + ), + ), + ] + ), ) ); } @@ -123,54 +167,9 @@ class BottomBarThreadSelectionWidget extends StatelessWidget{ return _currentMailbox?.isTrash == true || _currentMailbox?.isDrafts == true; } - String? _getTextButtonMarkAsRead(BuildContext context) { - if (!_isMailboxDashboardSplitView(context)) { - return _listSelectionEmail.isAllEmailRead - ? AppLocalizations.of(context).unread - : AppLocalizations.of(context).read; - } - return null; - } - - String? _getTextButtonMarkAsStar(BuildContext context) { - if (!_isMailboxDashboardSplitView(context)) { - return _listSelectionEmail.isAllEmailStarred - ? AppLocalizations.of(context).un_star - : AppLocalizations.of(context).star; - } - return null; - } - - String? _getTextButtonMove(BuildContext context) { - if (!_isMailboxDashboardSplitView(context)) { - return AppLocalizations.of(context).move; - } - return null; - } - - String? _getTextButtonSpam(BuildContext context) { - if (!_isMailboxDashboardSplitView(context)) { - return _currentMailbox?.isSpam == true - ? AppLocalizations.of(context).un_spam - : AppLocalizations.of(context).spam; - } - return null; - } - - String? _getTextButtonDelete(BuildContext context) { - if (!_isMailboxDashboardSplitView(context)) { - return AppLocalizations.of(context).delete; - } - return null; - } - - bool _isMailboxDashboardSplitView(BuildContext context) { - if (PlatformInfo.isWeb) { - return _responsiveUtils.isTabletLarge(context); - } else { - return _responsiveUtils.isLandscapeTablet(context) || - _responsiveUtils.isTabletLarge(context) || - _responsiveUtils.isDesktop(context); - } + bool _verticalDirection(BuildContext context) { + return _responsiveUtils.isLandscapeMobile(context) || + _responsiveUtils.isPortraitMobile(context) || + _responsiveUtils.isTabletLarge(context); } } \ No newline at end of file