diff --git a/assets/images/ic_refresh_quotas.svg b/assets/images/ic_refresh_quotas.svg
new file mode 100644
index 000000000..d7c90ec60
--- /dev/null
+++ b/assets/images/ic_refresh_quotas.svg
@@ -0,0 +1,5 @@
+
diff --git a/core/lib/presentation/resources/image_paths.dart b/core/lib/presentation/resources/image_paths.dart
index 2a368bf7f..2afbdde78 100644
--- a/core/lib/presentation/resources/image_paths.dart
+++ b/core/lib/presentation/resources/image_paths.dart
@@ -229,6 +229,7 @@ class ImagePaths {
String get icCloseDialog => _getImagePath('ic_close_dialog.svg');
String get icDoubleArrowUp => _getImagePath('ic_double_arrow_up.svg');
String get icDoubleArrowDown => _getImagePath('ic_double_arrow_down.svg');
+ String get icRefreshQuotas => _getImagePath('ic_refresh_quotas.svg');
String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
diff --git a/core/lib/presentation/utils/theme_utils.dart b/core/lib/presentation/utils/theme_utils.dart
index 1e2bace32..ab7339c38 100644
--- a/core/lib/presentation/utils/theme_utils.dart
+++ b/core/lib/presentation/utils/theme_utils.dart
@@ -261,6 +261,15 @@ class ThemeUtils {
color: AppColor.textPrimary,
);
+ static TextStyle textStyleContentCaption() => const TextStyle(
+ fontFamily: ConstantsUI.fontApp,
+ fontWeight: FontWeight.normal,
+ letterSpacing: 0,
+ fontSize: 11,
+ height: 14 / 11,
+ color: AppColor.steelGray400,
+ );
+
static TextSelectionThemeData get _textSelectionTheme {
return const TextSelectionThemeData(
cursorColor: AppColor.primaryColor,
diff --git a/lib/features/email/presentation/email_view.dart b/lib/features/email/presentation/email_view.dart
index d2c9e7679..c69e8bc36 100644
--- a/lib/features/email/presentation/email_view.dart
+++ b/lib/features/email/presentation/email_view.dart
@@ -413,20 +413,15 @@ class EmailView extends GetWidget {
contentPadding: 0,
useDefaultFont: true,
),
- if (controller.mailboxDashBoardController.isAttachmentDraggableAppActive)
+ if (controller.mailboxDashBoardController.isAttachmentDraggableAppActive ||
+ controller.mailboxDashBoardController.isLocalFileDraggableAppActive ||
+ controller.mailboxDashBoardController.isAppGridDialogDisplayed.isTrue)
PointerInterceptor(
child: SizedBox(
width: constraints.maxWidth,
height: constraints.maxHeight,
)
),
- if (controller.mailboxDashBoardController.isLocalFileDraggableAppActive)
- PointerInterceptor(
- child: SizedBox(
- width: constraints.maxWidth,
- height: constraints.maxHeight,
- )
- )
],
);
});
diff --git a/lib/features/home/domain/extensions/session_extensions.dart b/lib/features/home/domain/extensions/session_extensions.dart
index 9f47307ed..8c36ed220 100644
--- a/lib/features/home/domain/extensions/session_extensions.dart
+++ b/lib/features/home/domain/extensions/session_extensions.dart
@@ -13,6 +13,7 @@ import 'package:jmap_dart_client/jmap/core/capability/capability_properties.dart
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:model/download_all/download_all_capability.dart';
+import 'package:model/mailbox/mailbox_constants.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/home/data/model/session_hive_obj.dart';
import 'package:tmail_ui_user/features/home/domain/converter/session_account_converter.dart';
@@ -115,4 +116,27 @@ extension SessionExtensions on Session {
linagoraDownloadAllCapability,
);
}
+
+ bool isSubAddressingSupported(AccountId? accountId) {
+ try {
+ if (accountId == null) {
+ return false;
+ }
+
+ if (!CapabilityIdentifier.jmapTeamMailboxes.isSupported(this, accountId)) {
+ return false;
+ }
+
+ final capability = getCapabilityProperties(
+ accountId,
+ CapabilityIdentifier.jmapTeamMailboxes,
+ );
+
+ final props = capability?.props[0] as Map?;
+ return props?[subaddressingSupported] ?? false;
+ } catch (e) {
+ logError('SessionExtensions::isSubAddressingSupported:Exception = $e');
+ return false;
+ }
+ }
}
\ No newline at end of file
diff --git a/lib/features/mailbox/presentation/base_mailbox_view.dart b/lib/features/mailbox/presentation/base_mailbox_view.dart
index 7ffa09f3f..7ee8ed741 100644
--- a/lib/features/mailbox/presentation/base_mailbox_view.dart
+++ b/lib/features/mailbox/presentation/base_mailbox_view.dart
@@ -1,16 +1,31 @@
+import 'package:core/presentation/extensions/color_extension.dart';
+import 'package:core/presentation/utils/theme_utils.dart';
+import 'package:core/presentation/views/list/tree_view.dart';
+import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
+import 'package:model/mailbox/expand_mode.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/open_app_grid_extension.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/extensions/toggle_expand_folders_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.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_dashboard/presentation/model/dashboard_routes.dart';
+import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
abstract class BaseMailboxView extends GetWidget
- with
- AppLoaderMixin,
- MailboxWidgetMixin {
+ with AppLoaderMixin {
BaseMailboxView({Key? key}) : super(key: key);
@@ -44,4 +59,327 @@ abstract class BaseMailboxView extends GetWidget
);
});
}
+
+ Widget buildFolders(BuildContext context) {
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Obx(() {
+ if (controller.personalMailboxIsNotEmpty) {
+ return buildMailboxCategory(
+ context,
+ MailboxCategories.personalFolders,
+ controller.personalRootNode,
+ );
+ } else {
+ return const SizedBox.shrink();
+ }
+ }),
+ Obx(() {
+ if (controller.teamMailboxesIsNotEmpty) {
+ return buildMailboxCategory(
+ context,
+ MailboxCategories.teamMailboxes,
+ controller.teamMailboxesRootNode,
+ );
+ } else {
+ return const SizedBox.shrink();
+ }
+ }),
+ ],
+ );
+ }
+
+ Widget buildMailboxCategory(
+ BuildContext context,
+ MailboxCategories categories,
+ MailboxNode mailboxNode,
+ ) {
+ final isDesktop = controller.responsiveUtils.isDesktop(context);
+
+ switch (categories) {
+ case MailboxCategories.exchange:
+ return _buildBodyMailboxCategory(
+ context: context,
+ categories: categories,
+ mailboxNode: mailboxNode,
+ padding: isDesktop ? null : const EdgeInsets.symmetric(horizontal: 12),
+ );
+ default:
+ return Column(
+ children: [
+ Obx(() => MailboxCategoryWidget(
+ categories: categories,
+ expandMode: categories.getExpandMode(
+ controller.mailboxCategoriesExpandMode.value,
+ ),
+ onToggleMailboxCategories: (categories, itemKey) =>
+ controller.toggleMailboxCategories(
+ categories,
+ controller.mailboxListScrollController,
+ itemKey,
+ ),
+ isArrangeLTR: false,
+ showIcon: true,
+ padding: isDesktop
+ ? const EdgeInsetsDirectional.only(start: 10)
+ : const EdgeInsets.symmetric(horizontal: 24),
+ height: isDesktop ? 36 : 40,
+ iconSpace: isDesktop
+ ? null
+ : MailboxItemWidgetStyles.mobileLabelIconSpace,
+ labelTextStyle: isDesktop ? null : ThemeUtils.textStyleInter500(),
+ )),
+ Obx(() {
+ final categoriesExpandMode = controller
+ .mailboxCategoriesExpandMode
+ .value;
+
+ bool isExpand = categories.getExpandMode(categoriesExpandMode) ==
+ ExpandMode.EXPAND;
+
+ return AnimatedContainer(
+ duration: const Duration(milliseconds: 400),
+ child: isExpand
+ ? _buildBodyMailboxCategory(
+ context: context,
+ categories: categories,
+ mailboxNode: mailboxNode,
+ padding: isDesktop
+ ? const EdgeInsetsDirectional.only(start: 10)
+ : const EdgeInsetsDirectional.only(start: 24, end: 12),
+ )
+ : const Offstage(),
+ );
+ }),
+ ],
+ );
+ }
+ }
+
+ Widget _buildBodyMailboxCategory({
+ required BuildContext context,
+ required MailboxCategories categories,
+ required MailboxNode mailboxNode,
+ EdgeInsetsGeometry? padding,
+ }) {
+ final treeView = TreeView(
+ key: Key('${categories.keyValue}_mailbox_list'),
+ children: _buildListChildTileWidget(context, mailboxNode),
+ );
+
+ if (padding != null) {
+ return Padding(padding: padding, child: treeView);
+ } else {
+ return treeView;
+ }
+ }
+
+ List _buildListChildTileWidget(
+ BuildContext context,
+ MailboxNode parentNode,
+ ) {
+ if (parentNode.childrenItems == null) {
+ return [];
+ }
+
+ return parentNode.childrenItems!.map((mailboxNode) {
+ final mailboxItemWidget = Obx(() => MailboxItemWidget(
+ mailboxNode: mailboxNode,
+ mailboxNodeSelected: controller
+ .mailboxDashBoardController
+ .selectedMailbox
+ .value,
+ onOpenMailboxFolderClick: (mailboxNode) =>
+ controller.openMailbox(context, mailboxNode.item),
+ onExpandFolderActionClick: mailboxNode.hasChildren()
+ ? (mailboxNode, itemKey) => controller.toggleMailboxFolder(
+ mailboxNode,
+ controller.mailboxListScrollController,
+ itemKey,
+ )
+ : null,
+ onSelectMailboxFolderClick: controller.selectMailboxNode,
+ onLongPressMailboxNodeAction: PlatformInfo.isMobile
+ ? (mailboxNode) => controller.handleLongPressMailboxNodeAction(
+ context,
+ mailboxNode.item,
+ )
+ : null,
+ onDragItemAccepted: PlatformInfo.isMobile
+ ? null
+ : controller.handleDragItemAccepted,
+ onMenuActionClick: PlatformInfo.isMobile
+ ? null
+ : (position, mailboxNode) {
+ controller.openMailboxContextMenuAction(
+ context,
+ position,
+ mailboxNode.item,
+ );
+ },
+ onEmptyMailboxActionCallback: PlatformInfo.isMobile
+ ? null
+ : (mailboxNode) => controller.emptyMailboxAction(
+ context,
+ mailboxNode.item,
+ ),
+ ));
+
+ if (mailboxNode.hasChildren()) {
+ return TreeViewChild(
+ context,
+ key: const Key('children_tree_mailbox_child'),
+ isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
+ paddingChild: const EdgeInsetsDirectional.only(start: 12),
+ parent: mailboxItemWidget,
+ children: _buildListChildTileWidget(context, mailboxNode),
+ ).build();
+ } else {
+ return mailboxItemWidget;
+ }
+ }).toList();
+ }
+
+ Widget buildListMailbox(BuildContext context) {
+ final isDesktop = controller.responsiveUtils.isDesktop(context);
+
+ return SingleChildScrollView(
+ controller: controller.mailboxListScrollController,
+ key: const PageStorageKey('mailbox_list'),
+ physics: const AlwaysScrollableScrollPhysics(),
+ padding: isDesktop
+ ? const EdgeInsetsDirectional.only(end: 16)
+ : const EdgeInsets.only(bottom: 16, top: 16),
+ child: Column(children: [
+ Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)),
+ Obx(() {
+ if (controller.defaultMailboxIsNotEmpty) {
+ return buildMailboxCategory(
+ context,
+ MailboxCategories.exchange,
+ controller.defaultRootNode,
+ );
+ } else {
+ return const SizedBox.shrink();
+ }
+ }),
+ Obx(() {
+ final sendingEmails = controller
+ .mailboxDashBoardController
+ .listSendingEmails;
+
+ final isSendingQueueSelected =
+ controller.mailboxDashBoardController.dashboardRoute.value == DashboardRoutes.sendingQueue;
+
+ if (sendingEmails.isNotEmpty && PlatformInfo.isMobile) {
+ return SendingQueueMailboxWidget(
+ imagePaths: controller.imagePaths,
+ responsiveUtils: controller.responsiveUtils,
+ listSendingEmails: sendingEmails,
+ onOpenSendingQueueAction: () =>
+ controller.openSendingQueueViewAction(context),
+ isSelected: isSendingQueueSelected,
+ );
+ } else {
+ return const SizedBox.shrink();
+ }
+ }),
+ Obx(() {
+ final sendingEmails = controller
+ .mailboxDashBoardController
+ .listSendingEmails;
+
+ if (controller.defaultMailboxIsNotEmpty ||
+ (sendingEmails.isNotEmpty && PlatformInfo.isMobile)) {
+ return const Padding(
+ padding: EdgeInsets.only(top: 8),
+ child: Divider(color: AppColor.folderDivider, height: 1),
+ );
+ } else {
+ return const SizedBox.shrink();
+ }
+ }),
+ Obx(() {
+ return FoldersBarWidget(
+ onOpenSearchFolder: () => controller.openSearchViewAction(context),
+ onAddNewFolder: () => controller.goToCreateNewMailboxView(context),
+ imagePaths: controller.imagePaths,
+ responsiveUtils: controller.responsiveUtils,
+ height: isDesktop ? 48 : 40,
+ padding: isDesktop
+ ? null
+ : const EdgeInsetsDirectional.only(start: 24, end: 12),
+ labelStyle: isDesktop ? null : ThemeUtils.textStyleInter500(),
+ expandMode: controller.foldersExpandMode.value,
+ onToggleExpandFolder: controller.toggleExpandFolders,
+ );
+ }),
+ Obx(() => AnimatedContainer(
+ duration: const Duration(milliseconds: 400),
+ child: controller.foldersExpandMode.value == ExpandMode.EXPAND
+ ? buildFolders(context)
+ : const Offstage(),
+ )),
+ Obx(() {
+ final accountId = controller
+ .mailboxDashBoardController
+ .accountId
+ .value;
+
+ if (accountId == null) return const SizedBox.shrink();
+
+ final contactSupportCapability = controller
+ .mailboxDashBoardController
+ .sessionCurrent
+ ?.getContactSupportCapability(accountId);
+
+ if (contactSupportCapability?.isAvailable != true) {
+ return const SizedBox.shrink();
+ }
+
+ final isFoldersExpanded =
+ controller.foldersExpandMode.value == ExpandMode.EXPAND;
+
+ final dividerPadding = EdgeInsets.only(
+ top: isFoldersExpanded ? 8 : 0,
+ bottom: 8,
+ );
+
+ return Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ Padding(
+ padding: dividerPadding,
+ child: const Divider(color: AppColor.folderDivider, height: 1),
+ ),
+ FolderWidget(
+ icon: controller.imagePaths.icHelp,
+ label: AppLocalizations.of(context).support,
+ onOpenFolderAction: () => controller
+ .mailboxDashBoardController
+ .onGetHelpOrReportBug(contactSupportCapability!),
+ tooltip: AppLocalizations.of(context).getHelpOrReportABug,
+ padding: isDesktop
+ ? null
+ : const EdgeInsets.symmetric(horizontal: 12),
+ itemPadding: const EdgeInsets.symmetric(
+ horizontal: MailboxItemWidgetStyles.mobileItemPadding,
+ ),
+ borderRadius: isDesktop
+ ? null
+ : MailboxItemWidgetStyles.mobileBorderRadius,
+ height: isDesktop
+ ? null
+ : MailboxItemWidgetStyles.mobileHeight,
+ labelTextStyle: isDesktop
+ ? null
+ : ThemeUtils.textStyleInter500(),
+ ),
+ ],
+ );
+ }),
+ ]),
+ );
+ }
}
\ No newline at end of file
diff --git a/lib/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart b/lib/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart
new file mode 100644
index 000000000..be0c5b227
--- /dev/null
+++ b/lib/features/mailbox/presentation/extensions/handle_mailbox_action_extension.dart
@@ -0,0 +1,110 @@
+
+import 'package:core/utils/app_logger.dart';
+import 'package:flutter/material.dart';
+import 'package:model/email/presentation_email.dart';
+import 'package:model/extensions/presentation_mailbox_extension.dart';
+import 'package:model/mailbox/presentation_mailbox.dart';
+import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
+
+extension HandleMailboxActionExtension on MailboxController {
+
+ void handleLongPressMailboxNodeAction(
+ BuildContext context,
+ PresentationMailbox mailbox,
+ ) {
+ final deletedMessageVaultSupported =
+ MailboxUtils.isDeletedMessageVaultSupported(session, accountId);
+
+ final isSubAddressingSupported =
+ session?.isSubAddressingSupported(accountId) ?? false;
+
+ final contextMenuActions = listContextMenuItemAction(
+ mailbox,
+ mailboxDashBoardController.enableSpamReport,
+ deletedMessageVaultSupported,
+ isSubAddressingSupported,
+ );
+
+ if (contextMenuActions.isEmpty) {
+ return;
+ }
+
+ openContextMenuAction(
+ context,
+ contextMenuMailboxActionTiles(
+ context,
+ imagePaths,
+ mailbox,
+ contextMenuActions,
+ handleMailboxAction: handleMailboxAction,
+ ),
+ );
+ }
+
+ void handleDragItemAccepted(
+ List listEmails,
+ PresentationMailbox presentationMailbox,
+ ) {
+ final mailboxPath = findNodePath(presentationMailbox.id)
+ ?? presentationMailbox.name?.name;
+ log('HandleMailboxActionExtension::handleDragItemAccepted():mailboxPath = $mailboxPath');
+ final newMailbox = mailboxPath != null
+ ? presentationMailbox.toPresentationMailboxWithMailboxPath(mailboxPath)
+ : presentationMailbox;
+
+ mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction(
+ listEmails,
+ newMailbox,
+ );
+ }
+
+ void openMailboxContextMenuAction(
+ BuildContext context,
+ RelativeRect position,
+ PresentationMailbox mailbox,
+ ) {
+ final deletedMessageVaultSupported =
+ MailboxUtils.isDeletedMessageVaultSupported(session, accountId);
+
+ final isSubAddressingSupported =
+ session?.isSubAddressingSupported(accountId) ?? false;
+
+ final contextMenuActions = listContextMenuItemAction(
+ mailbox,
+ mailboxDashBoardController.enableSpamReport,
+ deletedMessageVaultSupported,
+ isSubAddressingSupported,
+ );
+
+ if (contextMenuActions.isEmpty) {
+ return;
+ }
+
+ if (responsiveUtils.isScreenWithShortestSide(context)) {
+ openContextMenuAction(
+ context,
+ contextMenuMailboxActionTiles(
+ context,
+ imagePaths,
+ mailbox,
+ contextMenuActions,
+ handleMailboxAction: handleMailboxAction,
+ )
+ );
+ } else {
+ openPopupMenuAction(
+ context,
+ position,
+ popupMenuMailboxActionTiles(
+ context,
+ imagePaths,
+ mailbox,
+ contextMenuActions,
+ handleMailboxAction: handleMailboxAction,
+ ),
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/lib/features/mailbox/presentation/extensions/open_app_grid_extension.dart b/lib/features/mailbox/presentation/extensions/open_app_grid_extension.dart
index 4ccf97808..87ae310c9 100644
--- a/lib/features/mailbox/presentation/extensions/open_app_grid_extension.dart
+++ b/lib/features/mailbox/presentation/extensions/open_app_grid_extension.dart
@@ -10,6 +10,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosyst
extension OpenAppGridExtension on MailboxController {
void openAppGrid(List linagoraApps) {
log('OpenAppGridExtension::openAppGrid: length of linagoraApps = ${linagoraApps.length}');
+ mailboxDashBoardController.isAppGridDialogDisplayed.value = true;
Get.dialog(
Center(
child: Dialog(
@@ -55,7 +56,8 @@ extension OpenAppGridExtension on MailboxController {
),
),
barrierColor: AppColor.blackAlpha20,
- );
+ ).whenComplete(() =>
+ mailboxDashBoardController.isAppGridDialogDisplayed.value = false);
}
Future _handleOpenApp(AppLinagoraEcosystem app) async {
diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart
index bff598a41..7edac9e96 100644
--- a/lib/features/mailbox/presentation/mailbox_controller.dart
+++ b/lib/features/mailbox/presentation/mailbox_controller.dart
@@ -71,6 +71,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
+import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories_expand_mode.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
@@ -105,7 +106,8 @@ import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart';
class MailboxController extends BaseMailboxController
with MailboxActionHandlerMixin,
ContactSupportMixin,
- LauncherApplicationMixin {
+ LauncherApplicationMixin,
+ MailboxWidgetMixin {
final mailboxDashBoardController = Get.find();
final isMailboxListScrollable = false.obs;
diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart
index 821bc8ce9..be75f8fc4 100644
--- a/lib/features/mailbox/presentation/mailbox_view.dart
+++ b/lib/features/mailbox/presentation/mailbox_view.dart
@@ -1,21 +1,7 @@
-import 'package:core/core.dart';
+import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
-import 'package:get/get.dart';
-import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart';
-import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/extensions/toggle_expand_folders_extension.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/styles/mailbox_item_widget_styles.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_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_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';
@@ -28,6 +14,7 @@ class MailboxView extends BaseMailboxView {
return Drawer(
backgroundColor: Colors.white,
shape: InputBorder.none,
+ shadowColor: AppColor.blackAlpha20,
child: SafeArea(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -37,25 +24,19 @@ class MailboxView extends BaseMailboxView {
child: RefreshIndicator(
color: AppColor.primaryColor,
onRefresh: controller.refreshAllMailbox,
- child: _buildListMailbox(context),
- ),
- ),
- QuotasView(
- labelStyle: Theme.of(context).textTheme.bodySmall?.copyWith(
- color: AppColor.steelGray400,
- ),
- labelMaxLines: 1,
- padding: const EdgeInsetsDirectional.only(
- start: 24,
- end: 23,
- top: 16,
+ child: buildListMailbox(context),
),
),
+ const QuotasView(),
Container(
alignment: AlignmentDirectional.centerStart,
- padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
+ padding: const EdgeInsetsDirectional.only(
+ bottom: 16,
+ start: 24,
+ end: 24,
+ ),
child: ApplicationVersionWidget(
- title: '${AppLocalizations.of(context).version} ',
+ title: '${AppLocalizations.of(context).version.toLowerCase()} ',
),
),
],
@@ -63,254 +44,4 @@ class MailboxView extends BaseMailboxView {
),
);
}
-
- Widget _buildListMailbox(BuildContext context) {
- return SingleChildScrollView(
- controller: controller.mailboxListScrollController,
- key: const PageStorageKey('mailbox_list'),
- physics: const AlwaysScrollableScrollPhysics(),
- padding: const EdgeInsets.only(bottom: 16, top: 16),
- child: Column(children: [
- Obx(() => MailboxLoadingBarWidget(viewState: controller.viewState.value)),
- Obx(() {
- if (controller.defaultMailboxIsNotEmpty) {
- return _buildMailboxCategory(
- context,
- MailboxCategories.exchange,
- controller.defaultRootNode
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- Obx(() {
- if (controller.mailboxDashBoardController.listSendingEmails.isNotEmpty) {
- return SendingQueueMailboxWidget(
- imagePaths: controller.imagePaths,
- responsiveUtils: controller.responsiveUtils,
- listSendingEmails: controller.mailboxDashBoardController.listSendingEmails,
- onOpenSendingQueueAction: () => controller.openSendingQueueViewAction(context),
- isSelected: controller.mailboxDashBoardController.dashboardRoute.value == DashboardRoutes.sendingQueue,
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- Obx(() {
- if (controller.defaultMailboxIsNotEmpty ||
- controller.mailboxDashBoardController.listSendingEmails.isNotEmpty) {
- return const Padding(
- padding: EdgeInsets.only(top: 8),
- child: Divider(color: AppColor.folderDivider, height: 1),
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- Obx(() {
- return FoldersBarWidget(
- onOpenSearchFolder: () => controller.openSearchViewAction(context),
- onAddNewFolder: () => controller.goToCreateNewMailboxView(context),
- imagePaths: controller.imagePaths,
- responsiveUtils: controller.responsiveUtils,
- height: 40,
- padding: const EdgeInsetsDirectional.only(start: 24, end: 12),
- labelStyle: ThemeUtils.textStyleInter500(),
- expandMode: controller.foldersExpandMode.value,
- onToggleExpandFolder: controller.toggleExpandFolders,
- );
- }),
- Obx(() => AnimatedContainer(
- duration: const Duration(milliseconds: 400),
- child: controller.foldersExpandMode.value == ExpandMode.EXPAND
- ? _buildFolders(context)
- : const Offstage(),
- )),
- Obx(() {
- final accountId = controller
- .mailboxDashBoardController
- .accountId
- .value;
-
- if (accountId == null) return const SizedBox.shrink();
-
- final contactSupportCapability = controller
- .mailboxDashBoardController
- .sessionCurrent
- ?.getContactSupportCapability(accountId);
-
- if (contactSupportCapability?.isAvailable != true) {
- return const SizedBox.shrink();
- }
-
- final isFoldersExpanded =
- controller.foldersExpandMode.value == ExpandMode.EXPAND;
-
- return Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- Padding(
- padding: isFoldersExpanded
- ? const EdgeInsets.only(top: 8)
- : EdgeInsets.zero,
- child: const Divider(color: AppColor.folderDivider, height: 1),
- ),
- FolderWidget(
- icon: controller.imagePaths.icHelp,
- label: AppLocalizations.of(context).support,
- onOpenFolderAction: () => controller
- .mailboxDashBoardController
- .onGetHelpOrReportBug(contactSupportCapability!),
- tooltip: AppLocalizations.of(context).getHelpOrReportABug,
- padding: const EdgeInsets.symmetric(horizontal: 12),
- itemPadding: const EdgeInsets.symmetric(
- horizontal: MailboxItemWidgetStyles.mobileItemPadding,
- ),
- borderRadius: MailboxItemWidgetStyles.mobileBorderRadius,
- height: MailboxItemWidgetStyles.mobileHeight,
- labelTextStyle: ThemeUtils.textStyleInter500(),
- ),
- ],
- );
- }),
- ])
- );
- }
-
- Widget _buildFolders(BuildContext context) {
- return Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- Obx(() {
- if (controller.personalMailboxIsNotEmpty) {
- return _buildMailboxCategory(
- context,
- MailboxCategories.personalFolders,
- controller.personalRootNode,
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- Obx(() {
- if (controller.teamMailboxesIsNotEmpty) {
- return _buildMailboxCategory(
- context,
- MailboxCategories.teamMailboxes,
- controller.teamMailboxesRootNode,
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- ],
- );
- }
-
- Widget _buildBodyMailboxCategory({
- required BuildContext context,
- required MailboxCategories categories,
- required MailboxNode mailboxNode,
- EdgeInsetsGeometry? padding,
- }) {
- final lastNode = mailboxNode.childrenItems?.last;
-
- final treeView = TreeView(
- key: Key('${categories.keyValue}_mailbox_list'),
- children: _buildListChildTileWidget(
- context,
- mailboxNode,
- lastNode: lastNode,
- ),
- );
-
- if (padding != null) {
- return Padding(
- padding: padding,
- child: treeView,
- );
- } else {
- return treeView;
- }
- }
-
- Widget _buildMailboxCategory(BuildContext context, MailboxCategories categories, MailboxNode mailboxNode) {
- if (categories == MailboxCategories.exchange) {
- return _buildBodyMailboxCategory(
- context: context,
- categories: categories,
- mailboxNode: mailboxNode,
- padding: const EdgeInsets.symmetric(horizontal: 12),
- );
- }
- return Column(children: [
- Obx(() => MailboxCategoryWidget(
- categories: categories,
- expandMode: categories.getExpandMode(
- controller.mailboxCategoriesExpandMode.value,
- ),
- onToggleMailboxCategories: (categories, itemKey) =>
- controller.toggleMailboxCategories(
- categories,
- controller.mailboxListScrollController,
- itemKey,
- ),
- isArrangeLTR: false,
- showIcon: true,
- padding: const EdgeInsets.symmetric(horizontal: 24),
- height: 40,
- iconSpace: MailboxItemWidgetStyles.mobileLabelIconSpace,
- labelTextStyle: ThemeUtils.textStyleInter500(),
- )),
- AnimatedContainer(
- duration: const Duration(milliseconds: 400),
- child: categories.getExpandMode(controller.mailboxCategoriesExpandMode.value) == ExpandMode.EXPAND
- ? _buildBodyMailboxCategory(
- context: context,
- categories: categories,
- mailboxNode: mailboxNode,
- padding: const EdgeInsetsDirectional.only(
- start: 24,
- end: 12,
- ),
- )
- : const Offstage())
- ]);
- }
-
- List _buildListChildTileWidget(BuildContext context, MailboxNode parentNode, {MailboxNode? lastNode}) {
- return parentNode.childrenItems
- ?.map((mailboxNode) {
- if (mailboxNode.hasChildren()) {
- return TreeViewChild(
- context,
- key: const Key('children_tree_mailbox_child'),
- isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
- paddingChild: const EdgeInsetsDirectional.only(start: 12),
- parent: Obx(() => MailboxItemWidget(
- mailboxNode: mailboxNode,
- mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
- onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller),
- onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
- onExpandFolderActionClick: (mailboxNode, itemKey) =>
- controller.toggleMailboxFolder(
- mailboxNode,
- controller.mailboxListScrollController,
- itemKey,
- ),
- onSelectMailboxFolderClick: (mailboxNode) => controller.selectMailboxNode(mailboxNode),
- )),
- children: _buildListChildTileWidget(context, mailboxNode)
- ).build();
- } else {
- return Obx(() => MailboxItemWidget(
- mailboxNode: mailboxNode,
- mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
- onLongPressMailboxNodeAction: (mailboxNode) => openMailboxMenuActionOnMobile(context, controller.imagePaths, mailboxNode.item, controller),
- onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
- onSelectMailboxFolderClick: (mailboxNode) => controller.selectMailboxNode(mailboxNode)
- ));
- }
- }).toList() ?? [];
- }
}
\ No newline at end of file
diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart
index bbdd128c9..de0226924 100644
--- a/lib/features/mailbox/presentation/mailbox_view_web.dart
+++ b/lib/features/mailbox/presentation/mailbox_view_web.dart
@@ -1,24 +1,13 @@
-import 'package:core/core.dart';
+import 'package:core/presentation/extensions/color_extension.dart';
+import 'package:core/presentation/utils/theme_utils.dart';
+import 'package:core/utils/platform_info.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
-import 'package:model/model.dart';
-import 'package:tmail_ui_user/features/base/widget/application_logo_with_text_widget.dart';
import 'package:tmail_ui_user/features/base/widget/application_version_widget.dart';
import 'package:tmail_ui_user/features/base/widget/scrollbar_list_view.dart';
-import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/base_mailbox_view.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_categories.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/widgets/app_grid_view.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_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/user_information_widget.dart';
import 'package:tmail_ui_user/features/quotas/presentation/quotas_view.dart';
-import 'package:tmail_ui_user/features/quotas/presentation/styles/quotas_view_styles.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class MailboxView extends BaseMailboxView {
@@ -27,182 +16,49 @@ class MailboxView extends BaseMailboxView {
@override
Widget build(BuildContext context) {
+ final isDesktop = controller.responsiveUtils.isDesktop(context);
+
return Drawer(
- elevation: controller.responsiveUtils.isDesktop(context) ? 0 : 16.0,
- shape: controller.responsiveUtils.isDesktop(context)
- ? const RoundedRectangleBorder()
- : null,
- child: Scaffold(
- backgroundColor: controller.responsiveUtils.isWebDesktop(context)
- ? AppColor.colorBgDesktop
- : Colors.white,
- body: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
- if (!controller.responsiveUtils.isDesktop(context))
- ApplicationLogoWidthTextWidget(
- margin: const EdgeInsetsDirectional.only(
- top: 16,
- bottom: 16,
- start: 16,
- ),
- ),
- if (!controller.responsiveUtils.isDesktop(context))
- const Divider(
- color: AppColor.colorDividerMailbox,
- height: 0.5,
- thickness: 0.2),
- Expanded(child: Container(
- padding: EdgeInsetsDirectional.only(start: controller.responsiveUtils.isDesktop(context) ? 16 : 0),
- color: controller.responsiveUtils.isDesktop(context)
- ? AppColor.colorBgDesktop
- : Colors.white,
- child: Container(
- color: controller.responsiveUtils.isDesktop(context)
- ? AppColor.colorBgDesktop
- : Colors.white,
- child: _buildListMailbox(context),
- ),
- )),
- const Divider(color: AppColor.colorDividerHorizontal),
- const QuotasView(
- padding: EdgeInsetsDirectional.only(
- start: QuotasViewStyles.padding,
- top: QuotasViewStyles.padding,
- ),
+ backgroundColor: isDesktop ? AppColor.colorBgDesktop : Colors.white,
+ shape: InputBorder.none,
+ shadowColor: AppColor.blackAlpha20,
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ if (!isDesktop) buildMailboxAppBar(),
+ Expanded(
+ child: isDesktop
+ ? Padding(
+ padding: const EdgeInsetsDirectional.only(start: 16),
+ child: _buildListMailbox(context),
+ )
+ : _buildListMailbox(context),
),
+ const QuotasView(),
Container(
- width: double.infinity,
- alignment: controller.responsiveUtils.isDesktop(context)
- ? AlignmentDirectional.centerStart
- : AlignmentDirectional.center,
- padding: const EdgeInsets.all(16),
- color: controller.responsiveUtils.isWebDesktop(context)
- ? AppColor.colorBgDesktop
- : Colors.white,
+ alignment: isDesktop
+ ? AlignmentDirectional.center
+ : AlignmentDirectional.centerStart,
+ padding: const EdgeInsetsDirectional.only(
+ bottom: 16,
+ start: 24,
+ end: 24,
+ ),
child: ApplicationVersionWidget(
title: '${AppLocalizations.of(context).version.toLowerCase()} ',
+ textStyle: isDesktop
+ ? ThemeUtils.textStyleContentCaption()
+ : null,
),
),
- ]),
- )
+ ],
+ ),
);
}
Widget _buildListMailbox(BuildContext context) {
- final mailboxListWidget = SingleChildScrollView(
- controller: controller.mailboxListScrollController,
- key: const PageStorageKey('mailbox_list'),
- physics: const AlwaysScrollableScrollPhysics(),
- padding: EdgeInsetsDirectional.only(end: controller.responsiveUtils.isDesktop(context) ? 16 : 0),
- child: Column(children: [
- if (!controller.responsiveUtils.isDesktop(context))
- Obx(() => 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
- .mailboxDashBoardController
- .appGridDashboardController
- .listLinagoraApp;
+ final mailboxListWidget = buildListMailbox(context);
- if (linagoraApps.isNotEmpty && !controller.responsiveUtils.isDesktop(context)) {
- return AppGridView(linagoraApps: linagoraApps);
- } else {
- return const SizedBox.shrink();
- }
- }),
- const SizedBox(height: 8),
- Obx(() {
- if (controller.defaultMailboxIsNotEmpty) {
- return _buildMailboxCategory(
- context,
- MailboxCategories.exchange,
- controller.defaultRootNode
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- const SizedBox(height: 8),
- const Divider(color: AppColor.colorDividerMailbox, height: 1),
- FoldersBarWidget(
- onOpenSearchFolder: () => controller.openSearchViewAction(context),
- onAddNewFolder: () => controller.goToCreateNewMailboxView(context),
- imagePaths: controller.imagePaths,
- responsiveUtils: controller.responsiveUtils,
- ),
- Obx(() {
- if (controller.personalMailboxIsNotEmpty) {
- return _buildMailboxCategory(
- context,
- MailboxCategories.personalFolders,
- controller.personalRootNode
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- Obx(() {
- if (controller.teamMailboxesIsNotEmpty) {
- return _buildMailboxCategory(
- context,
- MailboxCategories.teamMailboxes,
- controller.teamMailboxesRootNode
- );
- } else {
- return const SizedBox.shrink();
- }
- }),
- Obx(() {
- final accountId = controller
- .mailboxDashBoardController
- .accountId
- .value;
-
- if (accountId == null) return const SizedBox.shrink();
-
- final contactSupportCapability = controller
- .mailboxDashBoardController
- .sessionCurrent
- ?.getContactSupportCapability(accountId);
-
- if (contactSupportCapability?.isAvailable != true) {
- return const SizedBox.shrink();
- }
-
- return Column(
- mainAxisSize: MainAxisSize.min,
- children: [
- const SizedBox(height: 8),
- const Divider(color: AppColor.colorDividerMailbox, height: 1),
- const SizedBox(height: 8),
- FolderWidget(
- icon: controller.imagePaths.icHelp,
- label: AppLocalizations.of(context).support,
- onOpenFolderAction: () => controller
- .mailboxDashBoardController
- .onGetHelpOrReportBug(contactSupportCapability!),
- tooltip: AppLocalizations.of(context).getHelpOrReportABug,
- padding: !controller.responsiveUtils.isDesktop(context)
- ? const EdgeInsets.symmetric(horizontal: 16)
- : null,
- ),
- const SizedBox(height: 16),
- ],
- );
- }),
- ])
- );
return Stack(
children: [
if (!PlatformInfo.isCanvasKit)
@@ -249,157 +105,4 @@ class MailboxView extends BaseMailboxView {
],
);
}
-
- Widget _buildBodyMailboxCategory({
- required BuildContext context,
- required MailboxCategories categories,
- required MailboxNode mailboxNode,
- EdgeInsetsGeometry? padding,
- }) {
- final lastNode = mailboxNode.childrenItems?.last;
-
- final treeView = TreeView(
- key: Key('${categories.keyValue}_mailbox_list'),
- children: _buildListChildTileWidget(
- context,
- mailboxNode,
- lastNode: lastNode,
- ),
- );
-
- if (padding != null) {
- return Padding(
- padding: padding,
- child: treeView,
- );
- } else {
- return treeView;
- }
- }
-
- Widget _buildMailboxCategory(
- BuildContext context,
- MailboxCategories categories,
- MailboxNode mailboxNode
- ) {
- if (categories == MailboxCategories.exchange) {
- return _buildBodyMailboxCategory(
- context: context,
- categories: categories,
- mailboxNode: mailboxNode,
- padding: !controller.responsiveUtils.isDesktop(context)
- ? const EdgeInsets.symmetric(horizontal: 16)
- : null,
- );
- } else {
- return Column(
- children: [
- Obx(() => MailboxCategoryWidget(
- categories: categories,
- expandMode: categories.getExpandMode(
- controller.mailboxCategoriesExpandMode.value,
- ),
- onToggleMailboxCategories: (categories, itemKey) =>
- controller.toggleMailboxCategories(
- categories,
- controller.mailboxListScrollController,
- itemKey,
- ),
- isArrangeLTR: false,
- showIcon: true,
- padding: !controller.responsiveUtils.isDesktop(context)
- ? const EdgeInsetsDirectional.only(start: 26, end: 16)
- : const EdgeInsetsDirectional.only(start: 10),
- )),
- AnimatedContainer(
- duration: const Duration(milliseconds: 400),
- child: categories.getExpandMode(controller.mailboxCategoriesExpandMode.value) == ExpandMode.EXPAND
- ? _buildBodyMailboxCategory(
- context: context,
- categories: categories,
- mailboxNode: mailboxNode,
- padding: !controller.responsiveUtils.isDesktop(context)
- ? const EdgeInsetsDirectional.only(start: 30, end: 16)
- : const EdgeInsetsDirectional.only(start: 10),
- )
- : const Offstage()
- ),
- const SizedBox(height: 8)
- ],
- );
- }
- }
-
- List _buildListChildTileWidget(
- BuildContext context,
- MailboxNode parentNode,
- {MailboxNode? lastNode}
- ) {
- return parentNode.childrenItems?.map((mailboxNode) {
- if (mailboxNode.hasChildren()) {
- return TreeViewChild(
- context,
- key: const Key('children_tree_mailbox_child'),
- isExpanded: mailboxNode.expandMode == ExpandMode.EXPAND,
- paddingChild: const EdgeInsetsDirectional.only(start: 14),
- parent: Obx(() => MailboxItemWidget(
- mailboxNode: mailboxNode,
- mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
- onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
- onExpandFolderActionClick: (mailboxNode, itemKey) =>
- controller.toggleMailboxFolder(
- mailboxNode,
- controller.mailboxListScrollController,
- itemKey,
- ),
- onSelectMailboxFolderClick: controller.selectMailboxNode,
- onDragItemAccepted: _handleDragItemAccepted,
- onMenuActionClick: (position, mailboxNode) {
- openMailboxMenuActionOnWeb(
- context,
- controller.imagePaths,
- controller.responsiveUtils,
- position,
- mailboxNode.item,
- controller
- );
- },
- onEmptyMailboxActionCallback: (mailboxNode) => controller.emptyMailboxAction(context, mailboxNode.item),
- )),
- children: _buildListChildTileWidget(context, mailboxNode)
- ).build();
- } else {
- return Obx(() => MailboxItemWidget(
- mailboxNode: mailboxNode,
- mailboxNodeSelected: controller.mailboxDashBoardController.selectedMailbox.value,
- onOpenMailboxFolderClick: (mailboxNode) => controller.openMailbox(context, mailboxNode.item),
- onSelectMailboxFolderClick: controller.selectMailboxNode,
- onDragItemAccepted: _handleDragItemAccepted,
- onMenuActionClick: (position, mailboxNode) {
- openMailboxMenuActionOnWeb(
- context,
- controller.imagePaths,
- controller.responsiveUtils,
- position,
- mailboxNode.item,
- controller
- );
- },
- onEmptyMailboxActionCallback: (mailboxNode) => controller.emptyMailboxAction(context, mailboxNode.item),
- ));
- }
- }).toList() ?? [];
- }
-
- void _handleDragItemAccepted(List listEmails, PresentationMailbox presentationMailbox) {
- final mailboxPath = controller.findNodePath(presentationMailbox.id)
- ?? presentationMailbox.name?.name;
- log('MailboxView::_handleDragItemAccepted(): mailboxPath: $mailboxPath');
- if (mailboxPath != null) {
- final newMailbox = presentationMailbox.toPresentationMailboxWithMailboxPath(mailboxPath);
- controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction(listEmails, newMailbox);
- } else {
- controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction(listEmails, presentationMailbox);
- }
- }
}
\ No newline at end of file
diff --git a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart
index 6a07f87a7..138b1090b 100644
--- a/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart
+++ b/lib/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart
@@ -2,18 +2,11 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
-import 'package:jmap_dart_client/jmap/account_id.dart';
-import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
-import 'package:jmap_dart_client/jmap/core/session/session.dart';
-import 'package:model/mailbox/mailbox_constants.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/widget/popup_item_widget.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/context_item_mailbox_action.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/utils/mailbox_utils.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_bottom_sheet_action_tile_builder.dart';
-import 'package:tmail_ui_user/main/error/capability_validator.dart';
mixin MailboxWidgetMixin {
@@ -105,43 +98,6 @@ mixin MailboxWidgetMixin {
}
}
- void openMailboxMenuActionOnMobile(
- BuildContext context,
- ImagePaths imagePaths,
- PresentationMailbox mailbox,
- MailboxController controller
- ) {
- final bool deletedMessageVaultSupported = MailboxUtils.isDeletedMessageVaultSupported(
- controller.mailboxDashBoardController.sessionCurrent,
- controller.mailboxDashBoardController.accountId.value);
-
- final bool subaddressingSupported = isSubaddressingSupported(
- controller.mailboxDashBoardController.sessionCurrent,
- controller.mailboxDashBoardController.accountId.value);
-
- final contextMenuActions = listContextMenuItemAction(
- mailbox,
- controller.mailboxDashBoardController.enableSpamReport,
- deletedMessageVaultSupported,
- subaddressingSupported,
- );
-
- if (contextMenuActions.isEmpty) {
- return;
- }
-
- controller.openContextMenuAction(
- context,
- contextMenuMailboxActionTiles(
- context,
- imagePaths,
- mailbox,
- contextMenuActions,
- handleMailboxAction: controller.handleMailboxAction
- )
- );
- }
-
List contextMenuMailboxActionTiles(
BuildContext context,
ImagePaths imagePaths,
@@ -207,59 +163,6 @@ mixin MailboxWidgetMixin {
return listContextMenuItemAction;
}
- void openMailboxMenuActionOnWeb(
- BuildContext context,
- ImagePaths imagePaths,
- ResponsiveUtils responsiveUtils,
- RelativeRect position,
- PresentationMailbox mailbox,
- MailboxController controller
- ) {
- final bool deletedMessageVaultSupported = MailboxUtils.isDeletedMessageVaultSupported(
- controller.mailboxDashBoardController.sessionCurrent,
- controller.mailboxDashBoardController.accountId.value);
-
- final bool subaddressingSupported = isSubaddressingSupported(
- controller.mailboxDashBoardController.sessionCurrent,
- controller.mailboxDashBoardController.accountId.value);
-
- final contextMenuActions = listContextMenuItemAction(
- mailbox,
- controller.mailboxDashBoardController.enableSpamReport,
- deletedMessageVaultSupported,
- subaddressingSupported,
- );
-
- if (contextMenuActions.isEmpty) {
- return;
- }
-
- if (responsiveUtils.isScreenWithShortestSide(context)) {
- controller.openContextMenuAction(
- context,
- contextMenuMailboxActionTiles(
- context,
- imagePaths,
- mailbox,
- contextMenuActions,
- handleMailboxAction: controller.handleMailboxAction
- )
- );
- } else {
- controller.openPopupMenuAction(
- context,
- position,
- popupMenuMailboxActionTiles(
- context,
- imagePaths,
- mailbox,
- contextMenuActions,
- handleMailboxAction: controller.handleMailboxAction
- )
- );
- }
- }
-
List popupMenuMailboxActionTiles(
BuildContext context,
ImagePaths imagePaths,
@@ -280,20 +183,6 @@ mixin MailboxWidgetMixin {
.toList();
}
- static bool isSubaddressingSupported(Session? session, AccountId? accountId) {
- if (session == null || accountId == null) {
- return false;
- }
- if (!CapabilityIdentifier.jmapTeamMailboxes.isSupported(session, accountId)) {
- return false;
- }
-
- return (session.getCapabilityProperties(accountId, CapabilityIdentifier.jmapTeamMailboxes)
- ?.props[0] as Map?)
- ?[subaddressingSupported]
- ?? false;
- }
-
PopupMenuItem _buildPopupMenuItem(
BuildContext context,
ImagePaths imagePaths,
diff --git a/lib/features/mailbox/presentation/widgets/count_of_emails_widget.dart b/lib/features/mailbox/presentation/widgets/count_of_emails_widget.dart
index cfd234e86..b546a5283 100644
--- a/lib/features/mailbox/presentation/widgets/count_of_emails_widget.dart
+++ b/lib/features/mailbox/presentation/widgets/count_of_emails_widget.dart
@@ -17,7 +17,7 @@ class CountOfEmailsWidget extends StatelessWidget {
overflow: TextOverflow.ellipsis,
style: PlatformInfo.isMobile
? ThemeUtils.textStyleInter400()
- : Theme.of(context).textTheme.bodyMedium?.copyWith(
+ : Theme.of(context).textTheme.bodySmall?.copyWith(
color: Colors.black,
),
);
diff --git a/lib/features/mailbox/presentation/widgets/folder_widget.dart b/lib/features/mailbox/presentation/widgets/folder_widget.dart
index e42e3188f..ee47e68d4 100644
--- a/lib/features/mailbox/presentation/widgets/folder_widget.dart
+++ b/lib/features/mailbox/presentation/widgets/folder_widget.dart
@@ -72,7 +72,6 @@ class FolderWidget extends StatelessWidget {
borderRadius: BorderRadius.all(
Radius.circular(borderRadius ?? MailboxItemWidgetStyles.borderRadius),
),
- hoverColor: AppColor.blue100,
child: item,
),
);
diff --git a/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart b/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart
index 42dd4f97f..53ceae924 100644
--- a/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart
+++ b/lib/features/mailbox/presentation/widgets/folders_bar_widget.dart
@@ -4,7 +4,6 @@ import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/utils/direction_utils.dart';
-import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:model/mailbox/expand_mode.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/expand_mode_extension.dart';
@@ -36,6 +35,8 @@ class FoldersBarWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
+ final isDesktop = responsiveUtils.isDesktop(context);
+
Widget searchBarIcon = TMailButtonWidget.fromIcon(
icon: imagePaths.icSearchBar,
backgroundColor: Colors.transparent,
@@ -45,7 +46,7 @@ class FoldersBarWidget extends StatelessWidget {
onTapActionCallback: onOpenSearchFolder,
);
- if (responsiveUtils.isWebDesktop(context)) {
+ if (isDesktop) {
searchBarIcon = Transform(
transform: Matrix4.translationValues(8, 0, 0),
child: searchBarIcon,
@@ -62,7 +63,7 @@ class FoldersBarWidget extends StatelessWidget {
onTapActionCallback: onAddNewFolder,
);
- if (responsiveUtils.isWebDesktop(context)) {
+ if (isDesktop) {
newFolderIcon = Transform(
transform: Matrix4.translationValues(8, 0, 0),
child: newFolderIcon,
@@ -78,8 +79,8 @@ class FoldersBarWidget extends StatelessWidget {
return Container(
padding: padding ?? EdgeInsetsDirectional.only(
- start: responsiveUtils.isWebDesktop(context) ? 10 : 26,
- end: responsiveUtils.isWebDesktop(context) ? 0 : 8,
+ start: isDesktop ? 10 : 26,
+ end: isDesktop ? 0 : 8,
),
height: height ?? 48,
child: Row(
@@ -94,9 +95,12 @@ class FoldersBarWidget extends StatelessWidget {
DirectionUtils.isDirectionRTLByLanguage(context),
),
iconColor: Colors.black,
- iconSize: PlatformInfo.isMobile ? 17 : 20,
+ iconSize: 17,
+ margin: isDesktop
+ ? const EdgeInsetsDirectional.only(start: 8)
+ : null,
backgroundColor: Colors.transparent,
- padding: EdgeInsets.all(PlatformInfo.isMobile ? 3 : 5),
+ padding: const EdgeInsets.all(3),
tooltipMessage: expandMode!.getTooltipMessage(AppLocalizations.of(context)),
onTapActionCallback: () => onToggleExpandFolder?.call(),
)
diff --git a/lib/features/mailbox/presentation/widgets/label_mailbox_item_widget.dart b/lib/features/mailbox/presentation/widgets/label_mailbox_item_widget.dart
index 49a951d50..48baf7bb7 100644
--- a/lib/features/mailbox/presentation/widgets/label_mailbox_item_widget.dart
+++ b/lib/features/mailbox/presentation/widgets/label_mailbox_item_widget.dart
@@ -3,7 +3,6 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/presentation/views/text/text_overflow_builder.dart';
-import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
@@ -72,7 +71,8 @@ class _LabelMailboxItemWidgetState extends State {
itemKey: widget.itemKey,
mailboxNode: widget.mailboxNode,
imagePaths: widget.imagePaths,
- onExpandFolderActionClick: widget.onClickExpandMailboxNodeAction,
+ responsiveUtils: widget.responsiveUtils,
+ onExpandFolderActionClick: onClickExpandMailboxNodeAction,
),
],
);
@@ -163,13 +163,13 @@ class _LabelMailboxItemWidgetState extends State {
TextStyle get _displayNameTextStyle {
if (isSelected) {
return ThemeUtils.textStyleInter700(
- color: PlatformInfo.isMobile ? AppColor.iconFolder : null,
+ color: responsiveUtils.isDesktop(context) ? null : AppColor.iconFolder,
fontSize: 14,
);
} else {
- return PlatformInfo.isMobile
- ? ThemeUtils.textStyleInter500()
- : ThemeUtils.textStyleBodyBody3(color: Colors.black);
+ return responsiveUtils.isWebDesktop(context)
+ ? ThemeUtils.textStyleBodyBody3(color: Colors.black)
+ : ThemeUtils.textStyleInter500();
}
}
}
\ No newline at end of file
diff --git a/lib/features/mailbox/presentation/widgets/mailbox_category_widget.dart b/lib/features/mailbox/presentation/widgets/mailbox_category_widget.dart
index c92044e15..fa607e884 100644
--- a/lib/features/mailbox/presentation/widgets/mailbox_category_widget.dart
+++ b/lib/features/mailbox/presentation/widgets/mailbox_category_widget.dart
@@ -2,7 +2,6 @@ import 'package:core/presentation/resources/image_paths.dart';
import 'package:core/presentation/utils/theme_utils.dart';
import 'package:core/presentation/views/button/tmail_button_widget.dart';
import 'package:core/utils/direction_utils.dart';
-import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
@@ -79,12 +78,10 @@ class _MailboxCategoryWidgetState extends State {
DirectionUtils.isDirectionRTLByLanguage(context),
),
iconColor: Colors.black,
- iconSize: PlatformInfo.isMobile ? 17 : 20,
+ iconSize: 17,
backgroundColor: Colors.transparent,
- margin: PlatformInfo.isMobile
- ? const EdgeInsetsDirectional.only(start: 8)
- : null,
- padding: EdgeInsets.all(PlatformInfo.isMobile ? 3 : 5),
+ margin: const EdgeInsetsDirectional.only(start: 8),
+ padding: const EdgeInsets.all(3),
tooltipMessage: widget.expandMode.getTooltipMessage(AppLocalizations.of(context)),
onTapActionCallback: () =>
widget.onToggleMailboxCategories(widget.categories, _key)),
diff --git a/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart b/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart
index 0058d025b..3a54b82ad 100644
--- a/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart
+++ b/lib/features/mailbox/presentation/widgets/mailbox_expand_button.dart
@@ -1,8 +1,8 @@
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:core/utils/direction_utils.dart';
-import 'package:core/utils/platform_info.dart';
import 'package:flutter/material.dart';
import 'package:model/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/expand_mode_extension.dart';
@@ -14,6 +14,7 @@ class MailboxExpandButton extends StatelessWidget {
final GlobalKey itemKey;
final MailboxNode mailboxNode;
final ImagePaths imagePaths;
+ final ResponsiveUtils responsiveUtils;
final OnClickExpandMailboxNodeAction? onExpandFolderActionClick;
const MailboxExpandButton({
@@ -21,6 +22,7 @@ class MailboxExpandButton extends StatelessWidget {
required this.itemKey,
required this.mailboxNode,
required this.imagePaths,
+ required this.responsiveUtils,
required this.onExpandFolderActionClick,
});
@@ -32,11 +34,9 @@ class MailboxExpandButton extends StatelessWidget {
DirectionUtils.isDirectionRTLByLanguage(context),
),
iconColor: _expandIconColor,
- iconSize: PlatformInfo.isMobile ? 17 : 20,
- margin: PlatformInfo.isMobile
- ? const EdgeInsetsDirectional.only(start: 8)
- : null,
- padding: EdgeInsets.all(PlatformInfo.isMobile ? 3 : 5),
+ iconSize: 17,
+ margin: const EdgeInsetsDirectional.only(start: 8),
+ padding: const EdgeInsets.all(3),
backgroundColor: Colors.transparent,
tooltipMessage: mailboxNode.expandMode.getTooltipMessage(AppLocalizations.of(context)),
onTapActionCallback: () => onExpandFolderActionClick?.call(mailboxNode, itemKey),
diff --git a/lib/features/mailbox/presentation/widgets/mailbox_item_widget.dart b/lib/features/mailbox/presentation/widgets/mailbox_item_widget.dart
index 99525da7e..11fdcbe72 100644
--- a/lib/features/mailbox/presentation/widgets/mailbox_item_widget.dart
+++ b/lib/features/mailbox/presentation/widgets/mailbox_item_widget.dart
@@ -142,11 +142,17 @@ class _MailboxItemWidgetState extends State {
),
height: widget.mailboxNode.item.isTeamMailboxes
? MailboxItemWidgetStyles.teamMailboxHeight
- : MailboxItemWidgetStyles.height,
+ : MailboxItemWidgetStyles.mobileHeight,
child: Row(
children: [
if (_isIconDisplayed)
- MailboxIconWidget(icon: _iconMailbox),
+ MailboxIconWidget(
+ icon: _iconMailbox,
+ padding: const EdgeInsetsDirectional.only(
+ end: MailboxItemWidgetStyles.mobileLabelIconSpace,
+ ),
+ color: AppColor.iconFolder,
+ ),
Expanded(
child: LabelMailboxItemWidget(
itemKey: _key,
diff --git a/lib/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.dart b/lib/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.dart
index 021b7f291..40edad7d3 100644
--- a/lib/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.dart
+++ b/lib/features/mailbox/presentation/widgets/trailing_mailbox_item_widget.dart
@@ -36,8 +36,12 @@ class TrailingMailboxItemWidget extends StatelessWidget {
? EdgeInsets.zero
: TrailingMailboxItemWidgetStyles.menuIconMargin,
icon: imagePaths.icMoreVertical,
- iconSize: TrailingMailboxItemWidgetStyles.menuIconSize,
- padding: TrailingMailboxItemWidgetStyles.menuIconPadding,
+ iconSize: mailboxNode.item.isTeamMailboxes
+ ? 17
+ : TrailingMailboxItemWidgetStyles.menuIconSize,
+ padding: mailboxNode.item.isTeamMailboxes
+ ? const EdgeInsets.all(3)
+ : TrailingMailboxItemWidgetStyles.menuIconPadding,
backgroundColor: TrailingMailboxItemWidgetStyles.menuIconBackgroundColor,
onTapActionAtPositionCallback: (position) => onMenuActionClick?.call(position, mailboxNode),
);
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 feb2e29df..3c37a3928 100644
--- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart
+++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart
@@ -258,6 +258,7 @@ class MailboxDashBoardController extends ReloadableController
final isRecoveringDeletedMessage = RxBool(false);
final localFileDraggableAppState = Rxn();
final isSenderImportantFlagEnabled = RxBool(true);
+ final isAppGridDialogDisplayed = RxBool(false);
Session? sessionCurrent;
Map mapDefaultMailboxIdByRole = {};
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 dd61a86ae..ecea6a6e0 100644
--- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart
+++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart
@@ -264,7 +264,10 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
key: controller.scaffoldKey,
drawer: ResponsiveWidget(
responsiveUtils: controller.responsiveUtils,
- mobile: SizedBox(width: ResponsiveUtils.defaultSizeDrawer, child: MailboxView()),
+ mobile: SizedBox(
+ width: ResponsiveUtils.mobileLeftMenuSize,
+ child: MailboxView(),
+ ),
tabletLarge: SizedBox(width: ResponsiveUtils.defaultSizeLeftMenuMobile, child: MailboxView()),
desktop: const SizedBox.shrink()
),
diff --git a/lib/features/quotas/presentation/quotas_view.dart b/lib/features/quotas/presentation/quotas_view.dart
index 8c4b78113..098eede14 100644
--- a/lib/features/quotas/presentation/quotas_view.dart
+++ b/lib/features/quotas/presentation/quotas_view.dart
@@ -11,114 +11,96 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class QuotasView extends GetWidget {
- final EdgeInsetsGeometry? padding;
- final TextStyle? labelStyle;
- final int? labelMaxLines;
-
- const QuotasView({
- super.key,
- this.padding,
- this.labelStyle,
- this.labelMaxLines,
- });
+ const QuotasView({super.key});
@override
Widget build(BuildContext context) {
return Obx(() {
final octetQuota = controller.octetsQuota.value;
- if (octetQuota != null && octetQuota.storageAvailable) {
- return LayoutBuilder(builder: (context, constraints) {
- return Container(
- padding: padding ?? const EdgeInsetsDirectional.only(
- start: QuotasViewStyles.padding,
- top: QuotasViewStyles.padding,
- ),
- margin: controller.responsiveUtils.isWebDesktop(context)
- ? const EdgeInsetsDirectional.only(end: QuotasViewStyles.margin)
- : null,
- decoration: BoxDecoration(
- color: controller.responsiveUtils.isWebDesktop(context)
- ? QuotasViewStyles.webBackgroundColor
- : QuotasViewStyles.mobileBackgroundColor,
- ),
- alignment: AlignmentDirectional.centerStart,
- child: Column(
- mainAxisSize: MainAxisSize.min,
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Row(
- children: [
- SvgPicture.asset(
- controller.imagePaths.icQuotas,
- width: QuotasViewStyles.iconSize,
- height: QuotasViewStyles.iconSize,
- colorFilter: AppColor.steelGray400.asFilter(),
- fit: BoxFit.fill,
- ),
- const SizedBox(width: QuotasViewStyles.iconPadding),
- Flexible(
- child: Text(
- AppLocalizations.of(context).storageQuotas,
- style: labelStyle ?? const TextStyle(
- fontSize: QuotasViewStyles.labelTextSize,
- fontWeight: QuotasViewStyles.labelFontWeight,
- color: QuotasViewStyles.labelTextColor,
- ),
- maxLines: labelMaxLines ?? 2,
- overflow: TextOverflow.ellipsis,
- ),
- ),
- const SizedBox(width: QuotasViewStyles.iconPadding),
- Obx(() {
- final isLoading = controller.viewState.value.fold(
- (failure) => false,
- (success) => success is GetQuotasLoading,
- );
+ bool isDesktop = controller.responsiveUtils.isDesktop(context);
- return QuotaReloadButton(
- icon: controller.imagePaths.icRefresh,
- isLoading: isLoading,
- onTap: controller.reloadQuota,
- );
- }),
- ],
- ),
- const SizedBox(height: QuotasViewStyles.space),
- SizedBox(
- width: _getProgressBarMaxWith(constraints.maxWidth),
- child: LinearProgressIndicator(
- color: octetQuota.getQuotasStateProgressBarColor(),
- minHeight: QuotasViewStyles.progressBarHeight,
- backgroundColor: QuotasViewStyles.progressBarBackgroundColor,
- value: octetQuota.usedStoragePercent,
+ if (octetQuota != null && octetQuota.storageAvailable) {
+ final quotasWidget = Container(
+ padding: isDesktop
+ ? const EdgeInsets.all(16)
+ : const EdgeInsets.symmetric(vertical: 16),
+ margin: isDesktop
+ ? const EdgeInsetsDirectional.only(start: 8)
+ : const EdgeInsetsDirectional.only(start: 24),
+ width: isDesktop ? 224 : 196,
+ alignment: isDesktop
+ ? AlignmentDirectional.center
+ : AlignmentDirectional.centerStart,
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Row(
+ children: [
+ SvgPicture.asset(
+ controller.imagePaths.icQuotas,
+ width: QuotasViewStyles.iconSize,
+ height: QuotasViewStyles.iconSize,
+ colorFilter: AppColor.steelGray400.asFilter(),
+ fit: BoxFit.fill,
),
- ),
- const SizedBox(height: QuotasViewStyles.space),
- Text(
- octetQuota.getQuotasStateTitle(context),
- style: labelStyle ?? TextStyle(
- fontSize: QuotasViewStyles.progressStateTextSize,
- fontWeight: QuotasViewStyles.progressStateFontWeight,
- color: octetQuota.getQuotasStateTitleColor(),
+ const SizedBox(width: QuotasViewStyles.iconPadding),
+ Expanded(
+ child: Text(
+ AppLocalizations.of(context).storageQuotas,
+ style: Theme.of(context).textTheme.bodySmall?.copyWith(
+ color: AppColor.steelGray400,
+ ),
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ ),
),
- maxLines: labelMaxLines ?? 2,
- overflow: TextOverflow.ellipsis,
- )
- ],
- ),
- );
- });
+ const SizedBox(width: QuotasViewStyles.iconPadding),
+ Obx(() {
+ final isLoading = controller.viewState.value.fold(
+ (failure) => false,
+ (success) => success is GetQuotasLoading,
+ );
+
+ return QuotaReloadButton(
+ icon: controller.imagePaths.icRefreshQuotas,
+ isLoading: isLoading,
+ onTap: controller.reloadQuota,
+ );
+ }),
+ ],
+ ),
+ const SizedBox(height: QuotasViewStyles.space),
+ SizedBox(
+ width: QuotasViewStyles.progressBarMaxWidth,
+ child: LinearProgressIndicator(
+ color: octetQuota.getQuotasStateProgressBarColor(),
+ minHeight: QuotasViewStyles.progressBarHeight,
+ backgroundColor: QuotasViewStyles.progressBarBackgroundColor,
+ value: octetQuota.usedStoragePercent,
+ ),
+ ),
+ const SizedBox(height: QuotasViewStyles.space),
+ Text(
+ octetQuota.getQuotasStateTitle(context),
+ style: Theme.of(context).textTheme.bodySmall?.copyWith(
+ color: octetQuota.getQuotasStateTitleColor(),
+ ),
+ maxLines: 1,
+ overflow: TextOverflow.ellipsis,
+ )
+ ],
+ ),
+ );
+
+ if (isDesktop) {
+ return Center(child: quotasWidget);
+ } else {
+ return quotasWidget;
+ }
} else {
- return const SizedBox.shrink();
+ return const SizedBox(height: 16);
}
});
}
-
- double _getProgressBarMaxWith(double maxWith) {
- if (maxWith > QuotasViewStyles.progressBarMaxWidth) {
- return QuotasViewStyles.progressBarMaxWidth;
- } else {
- return maxWith;
- }
- }
}
diff --git a/lib/features/quotas/presentation/styles/quotas_view_styles.dart b/lib/features/quotas/presentation/styles/quotas_view_styles.dart
index f3148467a..e48d76cfa 100644
--- a/lib/features/quotas/presentation/styles/quotas_view_styles.dart
+++ b/lib/features/quotas/presentation/styles/quotas_view_styles.dart
@@ -3,24 +3,13 @@ import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
class QuotasViewStyles {
- static const double padding = 16;
static const double margin = 16;
- static const double bottomPadding = 24;
static const double iconPadding = 12;
static const double iconSize = 24;
- static const double labelTextSize = 13;
static const double space = 8;
static const double progressBarHeight = 3;
- static const double progressBarMaxWidth = 168;
- static const double progressStateTextSize = 13;
- static const double topLineSize = 1;
+ static const double progressBarMaxWidth = 193;
- static const Color labelTextColor = AppColor.steelGray400;
- static const Color webBackgroundColor = AppColor.colorBgDesktop;
- static const Color mobileBackgroundColor = Colors.white;
static const Color progressBarBackgroundColor = AppColor.colorDivider;
static const Color topLineColor = AppColor.colorDividerHorizontal;
-
- static const FontWeight labelFontWeight = FontWeight.w400;
- static const FontWeight progressStateFontWeight = FontWeight.w400;
}
\ No newline at end of file
diff --git a/lib/features/search/mailbox/presentation/search_mailbox_view.dart b/lib/features/search/mailbox/presentation/search_mailbox_view.dart
index 7454cebf6..0339904b2 100644
--- a/lib/features/search/mailbox/presentation/search_mailbox_view.dart
+++ b/lib/features/search/mailbox/presentation/search_mailbox_view.dart
@@ -12,6 +12,7 @@ import 'package:get/get.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/mixin/app_loader_mixin.dart';
+import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/search_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/context_item_mailbox_action.dart';
@@ -196,19 +197,20 @@ class SearchMailboxView extends GetWidget
}
List _listPopupMenuItemAction(BuildContext context, PresentationMailbox mailbox) {
- final bool deletedMessageVaultSupported = MailboxUtils.isDeletedMessageVaultSupported(
- controller.dashboardController.sessionCurrent,
- controller.dashboardController.accountId.value);
+ final session = controller.dashboardController.sessionCurrent;
+ final accountId = controller.dashboardController.accountId.value;
- final bool subaddressingSupported = MailboxWidgetMixin.isSubaddressingSupported(
- controller.dashboardController.sessionCurrent,
- controller.dashboardController.accountId.value);
+ final deletedMessageVaultSupported =
+ MailboxUtils.isDeletedMessageVaultSupported(session, accountId);
+
+ final isSubAddressingSupported =
+ session?.isSubAddressingSupported(accountId) ?? false;
final contextMenuActions = listContextMenuItemAction(
mailbox,
controller.dashboardController.enableSpamReport,
deletedMessageVaultSupported,
- subaddressingSupported,
+ isSubAddressingSupported,
);
return contextMenuActions
.map((action) => _mailboxFocusedMenuItem(context, action, mailbox))
@@ -262,19 +264,20 @@ class SearchMailboxView extends GetWidget
PresentationMailbox mailbox,
{RelativeRect? position}
) {
- final bool deletedMessageVaultSupported = MailboxUtils.isDeletedMessageVaultSupported(
- controller.dashboardController.sessionCurrent,
- controller.dashboardController.accountId.value);
+ final session = controller.dashboardController.sessionCurrent;
+ final accountId = controller.dashboardController.accountId.value;
- final bool subaddressingSupported = MailboxWidgetMixin.isSubaddressingSupported(
- controller.dashboardController.sessionCurrent,
- controller.dashboardController.accountId.value);
+ final deletedMessageVaultSupported =
+ MailboxUtils.isDeletedMessageVaultSupported(session, accountId);
+
+ final isSubAddressingSupported =
+ session?.isSubAddressingSupported(accountId) ?? false;
final contextMenuActions = listContextMenuItemAction(
mailbox,
controller.dashboardController.enableSpamReport,
deletedMessageVaultSupported,
- subaddressingSupported,
+ isSubAddressingSupported,
);
if (contextMenuActions.isEmpty) {
diff --git a/test/features/mailbox/presentation/mailbox_widget_mixin_test.dart b/test/features/mailbox/presentation/mailbox_widget_mixin_test.dart
index 8fbf9da27..b40adc95c 100644
--- a/test/features/mailbox/presentation/mailbox_widget_mixin_test.dart
+++ b/test/features/mailbox/presentation/mailbox_widget_mixin_test.dart
@@ -7,7 +7,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
-import 'package:tmail_ui_user/features/mailbox/presentation/mixin/mailbox_widget_mixin.dart';
+import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
void main() {
group('MailboxWidgetMixin::isSubaddressingSupported::test', () {
@@ -24,10 +24,10 @@ void main() {
{}, UserName(''), Uri(), Uri(), Uri(), Uri(), State(''));
// act
- final subaddressingSupported = MailboxWidgetMixin.isSubaddressingSupported(session, AccountId(Id("1")));
+ final isSubAddressingSupported = session.isSubAddressingSupported(AccountId(Id("1")));
// assert
- expect(subaddressingSupported, true);
+ expect(isSubAddressingSupported, true);
});
test(
@@ -42,10 +42,10 @@ void main() {
{}, UserName(''), Uri(), Uri(), Uri(), Uri(), State(''));
// act
- final subaddressingSupported = MailboxWidgetMixin.isSubaddressingSupported(session, AccountId(Id("1")));
+ final isSubAddressingSupported = session.isSubAddressingSupported(AccountId(Id("1")));
// assert
- expect(subaddressingSupported, false);
+ expect(isSubAddressingSupported, false);
});
test(
@@ -60,10 +60,10 @@ void main() {
{}, UserName(''), Uri(), Uri(), Uri(), Uri(), State(''));
// act
- final subaddressingSupported = MailboxWidgetMixin.isSubaddressingSupported(session, AccountId(Id("1")));
+ final isSubAddressingSupported = session.isSubAddressingSupported(AccountId(Id("1")));
// assert
- expect(subaddressingSupported, false);
+ expect(isSubAddressingSupported, false);
});
});
}
\ No newline at end of file