From 8b7ac1f03989ef3998638bf7b2beb995970b071f Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 23 Jul 2024 13:35:02 +0700 Subject: [PATCH] TF-2893 Apply the standard app grid icon --- core/lib/presentation/utils/icon_utils.dart | 2 +- .../views/image/avatar_builder.dart | 4 +- .../views/text/slogan_builder.dart | 26 ++++++-- core/lib/utils/platform_info.dart | 5 +- .../widget/application_version_widget.dart | 6 +- .../base/widget/text_input_field_builder.dart | 2 +- .../contact_input_decoration_builder.dart | 2 +- .../styles/email_subject_styles.dart | 2 +- .../email_view_app_bar_widget_styles.dart | 2 +- .../styles/email_view_styles.dart | 2 +- .../styles/email_recovery_view_styles.dart | 2 +- .../widgets/identity_input_field_builder.dart | 2 +- ...ty_input_with_drop_list_field_builder.dart | 2 +- .../login/presentation/login_view_web.dart | 8 +-- .../mailbox/presentation/mailbox_view.dart | 1 - .../presentation/mailbox_view_web.dart | 4 +- .../styles/mailbox_icon_widget_styles.dart | 2 +- .../domain/app_dashboard/linagora_app.dart | 11 ++-- .../styles/app_grid_dashboard_style.dart | 14 +++++ .../app_grid_dashboard_icon.dart | 61 +++++++++++++++++++ .../app_grid_dashboard_item.dart | 51 ++++++++++------ .../app_grid_dashboard_overlay.dart | 23 ++----- .../app_list_dashboard_item.dart | 6 +- .../menu/manage_account_menu_view.dart | 4 +- .../delete_identity_dialog_builder.dart | 2 +- .../rules_filter_creator_view.dart | 2 +- .../rules_filter_input_field_builder.dart | 2 +- 27 files changed, 173 insertions(+), 77 deletions(-) create mode 100644 lib/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart create mode 100644 lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_icon.dart diff --git a/core/lib/presentation/utils/icon_utils.dart b/core/lib/presentation/utils/icon_utils.dart index 49ea41ccd..cff79a3be 100644 --- a/core/lib/presentation/utils/icon_utils.dart +++ b/core/lib/presentation/utils/icon_utils.dart @@ -2,5 +2,5 @@ import 'package:core/utils/platform_info.dart'; class IconUtils { - static const double defaultIconSize = PlatformInfo.isWeb ? 20.0 : 24.0; + static double defaultIconSize = PlatformInfo.isWeb ? 20.0 : 24.0; } \ No newline at end of file diff --git a/core/lib/presentation/views/image/avatar_builder.dart b/core/lib/presentation/views/image/avatar_builder.dart index e662a5686..fd35e8a0a 100644 --- a/core/lib/presentation/views/image/avatar_builder.dart +++ b/core/lib/presentation/views/image/avatar_builder.dart @@ -2,7 +2,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; typedef OnTapAvatarActionClick = void Function(); -typedef OnTapAvatarActionWithPositionClick = void Function(RelativeRect? position); +typedef OnTapAvatarActionWithPositionClick = void Function(RelativeRect position); class AvatarBuilder { @@ -58,7 +58,7 @@ class AvatarBuilder { _onTapAvatarActionClick = onTapAvatarActionClick; } - void addOnTapAvatarActionWithPositionClick(OnTapAvatarActionWithPositionClick onTapAvatarActionWithPositionClick) { + void addOnTapAvatarActionWithPositionClick(OnTapAvatarActionWithPositionClick? onTapAvatarActionWithPositionClick) { _onTapAvatarActionWithPositionClick = onTapAvatarActionWithPositionClick; } diff --git a/core/lib/presentation/views/text/slogan_builder.dart b/core/lib/presentation/views/text/slogan_builder.dart index de1242023..170b64b13 100644 --- a/core/lib/presentation/views/text/slogan_builder.dart +++ b/core/lib/presentation/views/text/slogan_builder.dart @@ -1,3 +1,4 @@ +import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/utils/style_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -14,8 +15,8 @@ class SloganBuilder extends StatelessWidget { final String? text; final TextStyle? textStyle; final TextAlign? textAlign; - final String? logoSVG; final String? logo; + final Uri? publicLogoUri; final double? sizeLogo; final OnTapCallback? onTapCallback; final EdgeInsetsGeometry? paddingText; @@ -31,8 +32,8 @@ class SloganBuilder extends StatelessWidget { this.text, this.textStyle, this.textAlign, - this.logoSVG, this.logo, + this.publicLogoUri, this.sizeLogo, this.onTapCallback, this.padding, @@ -94,9 +95,9 @@ class SloganBuilder extends StatelessWidget { } Widget _logoApp() { - if (logoSVG != null) { + if (logo != null && logo!.endsWith('svg')) { return SvgPicture.asset( - logoSVG!, + logo!, width: sizeLogo ?? 150, height: sizeLogo ?? 150); } else if (logo != null) { @@ -104,9 +105,22 @@ class SloganBuilder extends StatelessWidget { image: AssetImage(logo!), fit: BoxFit.fill, width: sizeLogo ?? 150, + height: sizeLogo ?? 150); + } else if (publicLogoUri != null) { + return Image.network( + publicLogoUri.toString(), + fit: BoxFit.fill, + width: sizeLogo ?? 150, height: sizeLogo ?? 150, - alignment: Alignment.center); + errorBuilder: (_, error, stackTrace) { + return Container( + width: sizeLogo ?? 150, + height: sizeLogo ?? 150, + color: AppColor.textFieldHintColor, + ); + }); + } else { + return const SizedBox.shrink(); } - return const SizedBox.shrink(); } } diff --git a/core/lib/utils/platform_info.dart b/core/lib/utils/platform_info.dart index adebd0cad..72c002b8f 100644 --- a/core/lib/utils/platform_info.dart +++ b/core/lib/utils/platform_info.dart @@ -3,7 +3,10 @@ import 'package:core/utils/web_renderer/canvas_kit.dart'; import 'package:flutter/foundation.dart'; abstract class PlatformInfo { - static const bool isWeb = kIsWeb; + @visibleForTesting + static bool isTestingForWeb = false; + + static bool get isWeb => kIsWeb || isTestingForWeb; static bool get isLinux => !kIsWeb && defaultTargetPlatform == TargetPlatform.linux; static bool get isWindows => !kIsWeb && defaultTargetPlatform == TargetPlatform.windows; static bool get isMacOS => !kIsWeb && defaultTargetPlatform == TargetPlatform.macOS; diff --git a/lib/features/base/widget/application_version_widget.dart b/lib/features/base/widget/application_version_widget.dart index 7a3ff99a3..3f2f95834 100644 --- a/lib/features/base/widget/application_version_widget.dart +++ b/lib/features/base/widget/application_version_widget.dart @@ -1,17 +1,16 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/utils/application_manager.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; class ApplicationVersionWidget extends StatefulWidget { - final ApplicationManager applicationManager; final EdgeInsetsGeometry? padding; final String? title; final TextStyle? textStyle; const ApplicationVersionWidget({ super.key, - required this.applicationManager, this.title, this.textStyle, this.padding, @@ -23,12 +22,13 @@ class ApplicationVersionWidget extends StatefulWidget { class _ApplicationVersionWidgetState extends State { + final ApplicationManager _applicationManager = Get.find(); Future? _versionStream; @override void initState() { super.initState(); - _versionStream = widget.applicationManager.getVersion(); + _versionStream = _applicationManager.getVersion(); } @override diff --git a/lib/features/base/widget/text_input_field_builder.dart b/lib/features/base/widget/text_input_field_builder.dart index 00d5e5b3d..5b12d293c 100644 --- a/lib/features/base/widget/text_input_field_builder.dart +++ b/lib/features/base/widget/text_input_field_builder.dart @@ -58,7 +58,7 @@ class TextInputFieldBuilder extends StatelessWidget { minLines: minLines, maxLines: maxLines, decoration: (TextInputDecorationBuilder() - ..setContentPadding(const EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 16 : 12, horizontal: 12)) + ..setContentPadding(EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 16 : 12, horizontal: 12)) ..setHintText(hint) ..setFillColor(backgroundColor) ..setErrorText(error)) diff --git a/lib/features/contact/presentation/widgets/contact_input_decoration_builder.dart b/lib/features/contact/presentation/widgets/contact_input_decoration_builder.dart index ce7a4af44..0f5794ac6 100644 --- a/lib/features/contact/presentation/widgets/contact_input_decoration_builder.dart +++ b/lib/features/contact/presentation/widgets/contact_input_decoration_builder.dart @@ -42,7 +42,7 @@ class ContactInputDecorationBuilder extends InputDecorationBuilder { color: AppColor.colorEmailAddressFull, fontWeight: FontWeight.w500, fontSize: 16), - contentPadding: const EdgeInsets.symmetric( + contentPadding: EdgeInsets.symmetric( vertical: PlatformInfo.isWeb ? 16 : 12, horizontal: 12), errorText: errorText, diff --git a/lib/features/email/presentation/styles/email_subject_styles.dart b/lib/features/email/presentation/styles/email_subject_styles.dart index c8d7a8481..3777922ac 100644 --- a/lib/features/email/presentation/styles/email_subject_styles.dart +++ b/lib/features/email/presentation/styles/email_subject_styles.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; class EmailSubjectStyles { static const double textSize = 20; - static const int? maxLines = PlatformInfo.isWeb ? 2 : null; + static int? maxLines = PlatformInfo.isWeb ? 2 : null; static const Color textColor = AppColor.colorNameEmail; static const Color cursorColor = AppColor.colorTextButton; diff --git a/lib/features/email/presentation/styles/email_view_app_bar_widget_styles.dart b/lib/features/email/presentation/styles/email_view_app_bar_widget_styles.dart index 6e000135d..852ba065f 100644 --- a/lib/features/email/presentation/styles/email_view_app_bar_widget_styles.dart +++ b/lib/features/email/presentation/styles/email_view_app_bar_widget_styles.dart @@ -8,7 +8,7 @@ class EmailViewAppBarWidgetStyles { static const double bottomBorderWidth = 0.5; static const double height = 52; static const double radius = 20; - static const double buttonIconSize = IconUtils.defaultIconSize; + static double buttonIconSize = IconUtils.defaultIconSize; static const double deleteButtonIconSize = 20; static const double space = 5; static double? heightIOS(BuildContext context, ResponsiveUtils responsiveUtils) { diff --git a/lib/features/email/presentation/styles/email_view_styles.dart b/lib/features/email/presentation/styles/email_view_styles.dart index 449bcf6a3..2c6350ee8 100644 --- a/lib/features/email/presentation/styles/email_view_styles.dart +++ b/lib/features/email/presentation/styles/email_view_styles.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; class EmailViewStyles { static const double mobileContentHorizontalMargin = 16; static const double mobileContentVerticalMargin = 12; - static const double pageViewIconSize = IconUtils.defaultIconSize; + static double pageViewIconSize = IconUtils.defaultIconSize; static const EdgeInsetsGeometry pageViewButtonPadding = EdgeInsets.all(5); } \ No newline at end of file diff --git a/lib/features/email_recovery/presentation/styles/email_recovery_view_styles.dart b/lib/features/email_recovery/presentation/styles/email_recovery_view_styles.dart index 32798860c..64a056933 100644 --- a/lib/features/email_recovery/presentation/styles/email_recovery_view_styles.dart +++ b/lib/features/email_recovery/presentation/styles/email_recovery_view_styles.dart @@ -14,7 +14,7 @@ class EmailRecoveryViewStyles { color: Colors.white, ); - static const EdgeInsetsGeometry backgroundMarginMobile = EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0); + static EdgeInsetsGeometry backgroundMarginMobile = EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0); static const BorderRadiusGeometry clipRRectBorderRadiusMobile = BorderRadius.only( topLeft: Radius.circular(16), diff --git a/lib/features/identity_creator/presentation/widgets/identity_input_field_builder.dart b/lib/features/identity_creator/presentation/widgets/identity_input_field_builder.dart index edf550a2d..a82cd0abb 100644 --- a/lib/features/identity_creator/presentation/widgets/identity_input_field_builder.dart +++ b/lib/features/identity_creator/presentation/widgets/identity_input_field_builder.dart @@ -53,7 +53,7 @@ class IdentityInputFieldBuilder extends StatelessWidget { textStyle: const TextStyle(color: Colors.black, fontSize: 16), keyboardType: inputType ?? TextInputType.text, decoration: (IdentityInputDecorationBuilder() - ..setContentPadding(const EdgeInsets.symmetric( + ..setContentPadding(EdgeInsets.symmetric( vertical: PlatformInfo.isWeb ? 16 : 12, horizontal: 12)) ..setErrorText(_error)) diff --git a/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart b/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart index 8febe3a86..33905afb8 100644 --- a/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart +++ b/lib/features/identity_creator/presentation/widgets/identity_input_with_drop_list_field_builder.dart @@ -46,7 +46,7 @@ class IdentityInputWithDropListFieldBuilder extends StatelessWidget { controller: editingController, textInputAction: TextInputAction.done, decoration: (IdentityInputDecorationBuilder() - ..setContentPadding(const EdgeInsets.symmetric( + ..setContentPadding(EdgeInsets.symmetric( vertical: PlatformInfo.isWeb ? 16 : 12, horizontal: 12)) ..setErrorText(_error)) diff --git a/lib/features/login/presentation/login_view_web.dart b/lib/features/login/presentation/login_view_web.dart index e6547a00d..5bd119f68 100644 --- a/lib/features/login/presentation/login_view_web.dart +++ b/lib/features/login/presentation/login_view_web.dart @@ -104,7 +104,7 @@ class LoginView extends BaseLoginView { padding: const EdgeInsets.only(top: 24), child: SloganBuilder( arrangedByHorizontal: true, - logoSVG: controller.imagePaths.icJMAPStandard, + logo: controller.imagePaths.icJMAPStandard, sizeLogo: 48.0, paddingText: const EdgeInsets.only(left: 12), text: AppLocalizations.of(context).jmapStandard, @@ -115,7 +115,7 @@ class LoginView extends BaseLoginView { padding: const EdgeInsets.only(top: 16), child: SloganBuilder( arrangedByHorizontal: true, - logoSVG: controller.imagePaths.icEncrypted, + logo: controller.imagePaths.icEncrypted, sizeLogo: 48.0, paddingText: const EdgeInsets.only(left: 12), text: AppLocalizations.of(context).encryptedMailbox, @@ -126,7 +126,7 @@ class LoginView extends BaseLoginView { padding: const EdgeInsets.only(top: 16), child: SloganBuilder( arrangedByHorizontal: true, - logoSVG: controller.imagePaths.icTeam, + logo: controller.imagePaths.icTeam, sizeLogo: 48.0, paddingText: const EdgeInsets.only(left: 12), text: AppLocalizations.of(context).manageEmailAsATeam, @@ -137,7 +137,7 @@ class LoginView extends BaseLoginView { padding: const EdgeInsets.only(top: 16), child: SloganBuilder( arrangedByHorizontal: true, - logoSVG: controller.imagePaths.icIntegration, + logo: controller.imagePaths.icIntegration, sizeLogo: 48.0, paddingText: const EdgeInsets.only(left: 12), text: AppLocalizations.of(context).multipleIntegrations, diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index ed13f9f8d..8c63db888 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -93,7 +93,6 @@ class MailboxView extends BaseMailboxView { child: SafeArea( top: false, child: ApplicationVersionWidget( - applicationManager: controller.applicationManager, padding: EdgeInsets.zero, title: '${AppLocalizations.of(context).version} ', textStyle: Theme.of(context).textTheme.labelMedium?.copyWith( diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 8da1aaa90..88d40f161 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -66,9 +66,7 @@ class MailboxView extends BaseMailboxView { ), child: Row(children: [ ApplicationLogoWidthTextWidget(), - ApplicationVersionWidget( - applicationManager: controller.mailboxDashBoardController.applicationManager, - ) + const ApplicationVersionWidget() ]) ); } diff --git a/lib/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart b/lib/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart index 58592e1ab..e55986ffb 100644 --- a/lib/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart +++ b/lib/features/mailbox/presentation/styles/mailbox_icon_widget_styles.dart @@ -2,5 +2,5 @@ import 'package:core/utils/platform_info.dart'; class MailboxIconWidgetStyles { - static const double iconSize = PlatformInfo.isWeb ? 24 : 20; + static double iconSize = PlatformInfo.isWeb ? 24 : 20; } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart b/lib/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart index 29484fd4a..dc8254359 100644 --- a/lib/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart +++ b/lib/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart @@ -9,7 +9,7 @@ class LinagoraApp with EquatableMixin{ final String appName; @JsonKey(name: 'icon') - final String iconName; + final String? iconName; @JsonKey(name: 'appLink') final Uri appUri; @@ -17,15 +17,17 @@ class LinagoraApp with EquatableMixin{ final String? androidPackageId; final String? iosUrlScheme; final String? iosAppStoreLink; + final Uri? publicIconUri; LinagoraApp( this.appName, - this.iconName, this.appUri, { + this.iconName, this.androidPackageId, this.iosUrlScheme, - this.iosAppStoreLink + this.iosAppStoreLink, + this.publicIconUri } ); @@ -40,6 +42,7 @@ class LinagoraApp with EquatableMixin{ appUri, androidPackageId, iosUrlScheme, - iosAppStoreLink + iosAppStoreLink, + publicIconUri ]; } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart b/lib/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart new file mode 100644 index 000000000..7bcc5cb94 --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; + +class AppGridDashboardStyle { + static const double iconSize = 42; + static const double hoverIconSize = 80; + static const EdgeInsetsGeometry padding = EdgeInsetsDirectional.symmetric(horizontal: 10, vertical: 14); + static final List cardShadow = [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + blurRadius: 20, + offset: Offset.zero + ), + ]; +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_icon.dart b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_icon.dart new file mode 100644 index 000000000..5d393bbed --- /dev/null +++ b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_icon.dart @@ -0,0 +1,61 @@ +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/views/button/tmail_button_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_portal/flutter_portal.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_overlay.dart'; +import 'package:tmail_ui_user/main/utils/app_utils.dart'; + +class AppGridDashboardIcon extends StatelessWidget { + + final ImagePaths _imagePaths = Get.find(); + + final AppGridDashboardController appGridController; + final VoidCallback? onShowAppDashboardAction; + + AppGridDashboardIcon({ + super.key, + required this.appGridController, + this.onShowAppDashboardAction + }); + + @override + Widget build(BuildContext context) { + return Obx(() { + final isAppGridOpen = appGridController.isAppGridDashboardOverlayOpen.value; + return PortalTarget( + visible: isAppGridOpen, + portalFollower: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: appGridController.toggleAppGridDashboard + ), + child: PortalTarget( + anchor: Aligned( + follower: AppUtils.isDirectionRTL(context) + ? Alignment.topLeft + : Alignment.topRight, + target: AppUtils.isDirectionRTL(context) + ? Alignment.bottomLeft + : Alignment.bottomRight + ), + portalFollower: Obx(() { + final listApps = appGridController.linagoraApplications.value; + if (listApps?.apps.isNotEmpty == true) { + return AppDashboardOverlay(listApps!); + } + return const SizedBox.shrink(); + }), + visible: isAppGridOpen, + child: TMailButtonWidget.fromIcon( + icon: _imagePaths.icAppDashboard, + backgroundColor: Colors.transparent, + iconSize: 30, + padding: const EdgeInsets.all(6), + onTapActionCallback: onShowAppDashboardAction, + ), + ) + ); + }); + } +} diff --git a/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart index aa34865b2..ade8417d5 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart @@ -1,11 +1,11 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/resources/image_paths.dart'; -import 'package:core/presentation/utils/style_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/base/widget/link_browser_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_app.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart'; import 'package:tmail_ui_user/main/utils/app_utils.dart'; class AppGridDashboardItem extends StatelessWidget { @@ -26,31 +26,46 @@ class AppGridDashboardItem extends StatelessWidget { borderRadius: const BorderRadius.all(Radius.circular(16)), hoverColor: AppColor.colorBgMailboxSelected, child: Container( - width: 98, + width: AppGridDashboardStyle.hoverIconSize, padding: const EdgeInsets.symmetric(vertical: 8), child: Column(children: [ - app.iconName.endsWith("svg") - ? SvgPicture.asset( - _imagePaths.getConfigurationImagePath(app.iconName), - width: 56, - height: 56, - fit: BoxFit.fill) - : Image.asset( - _imagePaths.getConfigurationImagePath(app.iconName), - width: 56, - height: 56, - fit: BoxFit.fill), + if (app.iconName?.isNotEmpty == true) + app.iconName!.endsWith("svg") + ? SvgPicture.asset( + _imagePaths.getConfigurationImagePath(app.iconName!), + width: AppGridDashboardStyle.iconSize, + height: AppGridDashboardStyle.iconSize, + fit: BoxFit.fill) + : Image.asset( + _imagePaths.getConfigurationImagePath(app.iconName!), + width: AppGridDashboardStyle.iconSize, + height: AppGridDashboardStyle.iconSize, + fit: BoxFit.fill) + else if (app.publicIconUri != null) + Image.network( + app.publicIconUri.toString(), + width: AppGridDashboardStyle.iconSize, + height: AppGridDashboardStyle.iconSize, + fit: BoxFit.fill, + errorBuilder: (_, error, stackTrace) { + return Container( + width: AppGridDashboardStyle.iconSize, + height: AppGridDashboardStyle.iconSize, + color: AppColor.textFieldHintColor, + ); + } + ), Padding( padding: const EdgeInsets.only(top: 8), child: Text( app.appName, maxLines: 1, textAlign: TextAlign.center, - softWrap: CommonTextStyle.defaultSoftWrap, - overflow: CommonTextStyle.defaultTextOverFlow, - style: const TextStyle( - color: AppColor.colorNameEmail, - fontSize: 15 + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Colors.black, + fontSize: 12, + fontWeight: FontWeight.w400, ), ), ), diff --git a/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_overlay.dart b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_overlay.dart index b59cd974c..065060d48 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_overlay.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_overlay.dart @@ -1,6 +1,6 @@ -import 'package:core/presentation/extensions/color_extension.dart'; import 'package:flutter/material.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/app_dashboard/linagora_applications.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/styles/app_grid_dashboard_style.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_grid_dashboard_item.dart'; class AppDashboardOverlay extends StatelessWidget { @@ -17,18 +17,9 @@ class AppDashboardOverlay extends StatelessWidget { decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(24), - boxShadow: const [ - BoxShadow( - color: AppColor.colorShadowLayerBottom, - blurRadius: 96, - offset: Offset.zero), - BoxShadow( - color: AppColor.colorShadowLayerTop, - blurRadius: 2, - offset: Offset.zero), - ] + boxShadow: AppGridDashboardStyle.cardShadow ), - padding: const EdgeInsets.all(24), + padding: AppGridDashboardStyle.padding, child: Wrap(children: _linagoraApplications.apps .map((app) => AppGridDashboardItem(app)) .toList()), @@ -38,13 +29,11 @@ class AppDashboardOverlay extends StatelessWidget { double get _widthAppGrid { if (_linagoraApplications.apps.length >= 3) { - return 342; + return AppGridDashboardStyle.hoverIconSize * 3 + AppGridDashboardStyle.padding.horizontal; } else if (_linagoraApplications.apps.length == 2) { - return 244; - } else if (_linagoraApplications.apps.length == 1) { - return 146; + return AppGridDashboardStyle.hoverIconSize * 2 + AppGridDashboardStyle.padding.horizontal; } else { - return 0; + return AppGridDashboardStyle.hoverIconSize + AppGridDashboardStyle.padding.horizontal; } } } diff --git a/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart index b095237c6..bb51f2086 100644 --- a/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart +++ b/lib/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart @@ -26,8 +26,10 @@ class AppListDashboardItem extends StatelessWidget { text: app.appName, textAlign: TextAlign.center, textStyle: const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorNameEmail), - logo: !app.iconName.endsWith('svg') ? imagePaths.getConfigurationImagePath(app.iconName) : null, - logoSVG: app.iconName.endsWith('svg') ? imagePaths.getConfigurationImagePath(app.iconName) : null, + logo: app.iconName?.isNotEmpty == true + ? imagePaths.getConfigurationImagePath(app.iconName!) + : null, + publicLogoUri: app.publicIconUri, onTapCallback: () => _openApp(context, app), padding: const EdgeInsetsDirectional.symmetric(vertical: 12, horizontal: 20), hoverColor: AppColor.colorBgMailboxSelected 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 2a7678d25..df8e3a871 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 @@ -27,9 +27,7 @@ class ManageAccountMenuView extends GetWidget { padding: const EdgeInsetsDirectional.only(top: 16, bottom: 16, start: 16), child: Row(children: [ ApplicationLogoWidthTextWidget(), - ApplicationVersionWidget( - applicationManager: controller.dashBoardController.applicationManager, - ) + const ApplicationVersionWidget() ]) ), if (!controller.responsiveUtils.isWebDesktop(context)) diff --git a/lib/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart b/lib/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart index 89ca63cf4..72de12425 100644 --- a/lib/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart +++ b/lib/features/manage_account/presentation/profiles/identities/widgets/delete_identity_dialog_builder.dart @@ -26,7 +26,7 @@ class DeleteIdentityDialogBuilder extends StatelessWidget { responsiveUtils: responsiveUtils, mobile: (_buildDeleteDialog(context) ..alignment(Alignment.bottomCenter) - ..outsideDialogPadding(const EdgeInsets.only(bottom: PlatformInfo.isWeb ? 42 : 16)) + ..outsideDialogPadding(EdgeInsets.only(bottom: PlatformInfo.isWeb ? 42 : 16)) ..widthDialog(MediaQuery.of(context).size.width - 16)) .build(), landscapeMobile: _buildDeleteDialog(context).build(), diff --git a/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart b/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart index c0de88b04..80e9b56c5 100644 --- a/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart +++ b/lib/features/rules_filter_creator/presentation/rules_filter_creator_view.dart @@ -50,7 +50,7 @@ class RuleFilterCreatorView extends GetWidget { topLeft: Radius.circular(16), topRight: Radius.circular(16)), color: Colors.white), - margin: const EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0), + margin: EdgeInsets.only(top: PlatformInfo.isWeb ? 70 : 0), child: ClipRRect( borderRadius: const BorderRadius.only( topLeft: Radius.circular(16), diff --git a/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_field_builder.dart b/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_field_builder.dart index 4906070d9..cc91603eb 100644 --- a/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_field_builder.dart +++ b/lib/features/rules_filter_creator/presentation/widgets/rules_filter_input_field_builder.dart @@ -36,7 +36,7 @@ class RulesFilterInputField extends StatelessWidget { focusNode: focusNode, maxLines: 1, decoration: (RulesFilterInputDecorationBuilder() - ..setContentPadding(const EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 14 : 12, horizontal: 12)) + ..setContentPadding(EdgeInsets.symmetric(vertical: PlatformInfo.isWeb ? 14 : 12, horizontal: 12)) ..setHintText(hintText) ..setErrorText(errorText)) .build(),