diff --git a/core/lib/presentation/extensions/string_extension.dart b/core/lib/presentation/extensions/string_extension.dart index f19a5b943..d2414cf98 100644 --- a/core/lib/presentation/extensions/string_extension.dart +++ b/core/lib/presentation/extensions/string_extension.dart @@ -1,4 +1,7 @@ +import 'package:collection/collection.dart'; +import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/utils/app_logger.dart'; +import 'package:flutter/material.dart'; extension StringExtension on String { @@ -78,4 +81,21 @@ extension StringExtension on String { return 'application/octet-stream'; // Unknown type } } + + List get gradientColors { + return AppColor.mapGradientColor[_generateGradientColorIndex()]; + } + + int _generateGradientColorIndex() { + try { + if (isNotEmpty && codeUnits.isNotEmpty) { + return codeUnits.sum % AppColor.mapGradientColor.length; + } else { + return 0; + } + } catch (e) { + logError('StringExtension::_generateGradientColorIndex(): $e'); + return 0; + } + } } \ No newline at end of file diff --git a/core/lib/presentation/utils/theme_utils.dart b/core/lib/presentation/utils/theme_utils.dart index 18b1e8f3c..f24f51143 100644 --- a/core/lib/presentation/utils/theme_utils.dart +++ b/core/lib/presentation/utils/theme_utils.dart @@ -92,6 +92,8 @@ class ThemeUtils { fontFamily: ConstantsUI.fontApp, fontWeight: FontWeight.w500, letterSpacing: 0.15, + fontSize: 16, + height: 24 / 16, ), titleSmall: TextStyle( fontFamily: ConstantsUI.fontApp, diff --git a/lib/features/base/widget/application_logo_with_text_widget.dart b/lib/features/base/widget/application_logo_with_text_widget.dart index 0917a1cd7..752b6fc4b 100644 --- a/lib/features/base/widget/application_logo_with_text_widget.dart +++ b/lib/features/base/widget/application_logo_with_text_widget.dart @@ -11,11 +11,13 @@ class ApplicationLogoWidthTextWidget extends StatelessWidget { final VoidCallback? onTapAction; final EdgeInsetsGeometry? margin; + final double? iconSize; ApplicationLogoWidthTextWidget({ super.key, this.onTapAction, this.margin, + this.iconSize, }); @override @@ -24,7 +26,7 @@ class ApplicationLogoWidthTextWidget extends StatelessWidget { icon: PlatformInfo.isWeb && AppConfig.isSaasPlatForm ? _imagePaths.icLogoWithTextBeta : _imagePaths.icLogoWithText, - iconSize: 33, + iconSize: iconSize ?? 33, padding: EdgeInsets.zero, margin: margin, backgroundColor: Colors.transparent, diff --git a/lib/features/base/widget/user_avatar_builder.dart b/lib/features/base/widget/user_avatar_builder.dart new file mode 100644 index 000000000..83a6e9a15 --- /dev/null +++ b/lib/features/base/widget/user_avatar_builder.dart @@ -0,0 +1,33 @@ +import 'package:core/presentation/extensions/string_extension.dart'; +import 'package:core/presentation/views/image/avatar_builder.dart'; +import 'package:flutter/material.dart'; + +class UserAvatarBuilder extends StatelessWidget { + final String username; + final double? size; + final VoidCallback? onTapAction; + + const UserAvatarBuilder({ + Key? key, + required this.username, + this.size, + this.onTapAction, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final avatarBuilder = AvatarBuilder() + ..text(username.firstLetterToUpperCase) + ..size(size ?? 32) + ..addTextStyle(Theme.of(context).textTheme.titleMedium?.copyWith( + color: Colors.white, + )) + ..avatarColor(username.gradientColors); + + if (onTapAction != null) { + avatarBuilder.addOnTapActionClick(onTapAction!); + } + + return avatarBuilder.build(); + } +} diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index a86b019b6..70325cf4b 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -12,11 +12,11 @@ import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid_vie import 'package:tmail_ui_user/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/folder_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/folders_bar_widget.dart'; +import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_app_bar.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_category_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_item_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_loading_bar_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/sending_queue_mailbox_widget.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart'; import 'package:tmail_ui_user/features/quotas/presentation/quotas_view.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; @@ -36,6 +36,22 @@ class MailboxView extends BaseMailboxView { children: [ Expanded( child: Column(children: [ + Obx(() { + final accountId = controller + .mailboxDashBoardController + .accountId + .value; + + final username = accountId != null + ? controller.mailboxDashBoardController.getOwnEmailAddress() + : ''; + + return MailboxAppBar( + username: username, + openSettingsAction: + controller.mailboxDashBoardController.goToSettings, + ); + }), _buildHeaderMailbox(context), Expanded(child: Container( color: Colors.white, @@ -170,24 +186,6 @@ class MailboxView extends BaseMailboxView { physics: const AlwaysScrollableScrollPhysics(), padding: const EdgeInsets.only(bottom: 16), child: Column(children: [ - Obx(() { - if (controller.isSelectionEnabled() && controller.responsiveUtils.isLandscapeMobile(context)) { - return const SizedBox.shrink(); - } - return UserInformationWidget( - userName: controller.mailboxDashBoardController.accountId.value != null - ? controller.mailboxDashBoardController.getOwnEmailAddress() - : '', - subtitle: AppLocalizations.of(context).manage_account, - onSubtitleClick: controller.mailboxDashBoardController.goToSettings, - border: const Border( - bottom: BorderSide( - color: AppColor.colorDividerHorizontal, - width: 0.5, - ) - ), - ); - }), Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)), Obx(() { final linagoraApps = controller diff --git a/lib/features/mailbox/presentation/widgets/mailbox_app_bar.dart b/lib/features/mailbox/presentation/widgets/mailbox_app_bar.dart new file mode 100644 index 000000000..6109055eb --- /dev/null +++ b/lib/features/mailbox/presentation/widgets/mailbox_app_bar.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/base/widget/application_logo_with_text_widget.dart'; +import 'package:tmail_ui_user/features/base/widget/user_avatar_builder.dart'; + +typedef OnOpenSettingsAction = void Function(); + +class MailboxAppBar extends StatelessWidget { + final String username; + final OnOpenSettingsAction? openSettingsAction; + + const MailboxAppBar({ + super.key, + required this.username, + this.openSettingsAction, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsetsDirectional.symmetric( + horizontal: 16, + vertical: 4, + ), + height: 50, + child: Row( + children: [ + ApplicationLogoWidthTextWidget(iconSize: 22), + const Spacer(), + UserAvatarBuilder( + username: username, + onTapAction: openSettingsAction, + ), + ], + ), + ); + } +} diff --git a/model/lib/extensions/email_address_extension.dart b/model/lib/extensions/email_address_extension.dart index cb1b7a0b1..18dc86153 100644 --- a/model/lib/extensions/email_address_extension.dart +++ b/model/lib/extensions/email_address_extension.dart @@ -1,8 +1,7 @@ -import 'dart:ui'; - +import 'package:core/presentation/extensions/capitalize_extension.dart'; +import 'package:core/presentation/extensions/string_extension.dart'; +import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; -import 'package:core/core.dart'; -import 'package:collection/collection.dart'; extension EmailAddressExtension on EmailAddress { @@ -44,19 +43,5 @@ extension EmailAddressExtension on EmailAddress { String get labelAvatar => asString().isNotEmpty ? asString()[0].toUpperCase() : ''; - List get avatarColors { - return AppColor.mapGradientColor[_generateIndex()]; - } - - int _generateIndex() { - if (emailAddress.isNotEmpty) { - final codeUnits = emailAddress.codeUnits; - if (codeUnits.isNotEmpty) { - final sumCodeUnits = codeUnits.sum; - final index = sumCodeUnits % AppColor.mapGradientColor.length; - return index; - } - } - return 0; - } + List get avatarColors => emailAddress.gradientColors; } \ No newline at end of file