diff --git a/core/lib/presentation/views/background/background_widget_builder.dart b/core/lib/presentation/views/background/background_widget_builder.dart index a110ff935..47bd84fb8 100644 --- a/core/lib/presentation/views/background/background_widget_builder.dart +++ b/core/lib/presentation/views/background/background_widget_builder.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; +import 'package:core/presentation/views/responsive/responsive_widget.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -27,60 +28,62 @@ class BackgroundWidgetBuilder extends StatelessWidget { key: const Key('background_widget'), child: SizedBox( width: maxWidth ?? 360, - child: CustomScrollView( - slivers: [ - SliverFillRemaining( - child: Container( - color: Colors.transparent, - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - if (iconSVG != null) - SvgPicture.asset( - iconSVG!, - width: responsiveUtils.isLandscapeMobile(context) - ? 120 - : 212, - height: responsiveUtils.isLandscapeMobile(context) - ? 120 - : 212, - fit: BoxFit.fill - ), - Padding( - padding: EdgeInsets.only(top: iconSVG != null ? 12 : 0), - child: Text( - title, - style: const TextStyle( - color: Colors.black, - fontSize: 20, - fontWeight: FontWeight.normal - ), - textAlign: TextAlign.center, - ), - ), - if (subTitle != null) - Padding( - padding: const EdgeInsets.only(top: 12), - child: Text( - subTitle!, - style: const TextStyle( - color: AppColor.colorSubtitle, - fontSize: 15, - fontWeight: FontWeight.normal - ), - textAlign: TextAlign.center, - ), - ) - ], - ), - height: MediaQuery.of(context).size.height, - ), - ) - ] + child: ResponsiveWidget( + mobile: CustomScrollView(slivers: [ + SliverFillRemaining(child: _buildMessageBody(context)) + ]), + landscapeMobile: SingleChildScrollView(child: _buildMessageBody(context)), + responsiveUtils: responsiveUtils, ), ) ); } + + Widget _buildMessageBody(BuildContext context) { + return Container( + color: Colors.transparent, + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Column( + mainAxisAlignment: responsiveUtils.isLandscapeMobile(context) + ? MainAxisAlignment.start + : MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + if (iconSVG != null) + SvgPicture.asset( + iconSVG!, + width: 212, + height: 212, + fit: BoxFit.fill + ), + Padding( + padding: EdgeInsets.only(top: iconSVG != null ? 12 : 0), + child: Text( + title, + style: const TextStyle( + color: Colors.black, + fontSize: 20, + fontWeight: FontWeight.normal + ), + textAlign: TextAlign.center, + ), + ), + if (subTitle != null) + Padding( + padding: const EdgeInsets.only(top: 12), + child: Text( + subTitle!, + style: const TextStyle( + color: AppColor.colorSubtitle, + fontSize: 15, + fontWeight: FontWeight.normal + ), + textAlign: TextAlign.center, + ), + ) + ], + ), + height: MediaQuery.of(context).size.height, + ); + } } \ No newline at end of file diff --git a/lib/features/base/base_mailbox_controller.dart b/lib/features/base/base_mailbox_controller.dart index a917efadd..cb4455f6a 100644 --- a/lib/features/base/base_mailbox_controller.dart +++ b/lib/features/base/base_mailbox_controller.dart @@ -173,13 +173,13 @@ abstract class BaseMailboxController extends BaseController { }).toList(); } - bool get defaultMailboxHasChild => - defaultMailboxTree.value.root.childrenItems?.isNotEmpty ?? false; + bool get defaultMailboxIsNotEmpty => + defaultMailboxTree.value.root.childrenItems?.isNotEmpty ?? false; - bool get personalMailboxHasChild => - personalMailboxTree.value.root.childrenItems?.isNotEmpty ?? false; + bool get personalMailboxIsNotEmpty => + personalMailboxTree.value.root.childrenItems?.isNotEmpty ?? false; - bool get teamMailboxesHasChild { + bool get teamMailboxesIsNotEmpty { return (teamMailboxesTree.value.root.childrenItems?.isNotEmpty ?? false) && !teamMailboxesTree.value.root.item.isTeamMailboxes; } diff --git a/lib/features/destination_picker/presentation/destination_picker_view.dart b/lib/features/destination_picker/presentation/destination_picker_view.dart index 86f6c405a..226ea7b59 100644 --- a/lib/features/destination_picker/presentation/destination_picker_view.dart +++ b/lib/features/destination_picker/presentation/destination_picker_view.dart @@ -216,7 +216,7 @@ class DestinationPickerView extends GetWidget _buildLoadingView(), if (actions?.hasAllMailboxDefault() == true) _buildAllMailboxes(context, actions, mailboxIdSelected), - Obx(() => controller.defaultMailboxHasChild + Obx(() => controller.defaultMailboxIsNotEmpty ? _buildMailboxCategory( context, MailboxCategories.exchange, @@ -224,7 +224,7 @@ class DestinationPickerView extends GetWidget actions, mailboxIdSelected) : const SizedBox.shrink()), - Obx(() => controller.personalMailboxHasChild + Obx(() => controller.personalMailboxIsNotEmpty ? _buildMailboxCategory( context, MailboxCategories.personalMailboxes, diff --git a/lib/features/mailbox/presentation/mailbox_bindings.dart b/lib/features/mailbox/presentation/mailbox_bindings.dart index 43679ad7d..8f0138382 100644 --- a/lib/features/mailbox/presentation/mailbox_bindings.dart +++ b/lib/features/mailbox/presentation/mailbox_bindings.dart @@ -21,7 +21,6 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_i import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart'; @@ -52,7 +51,6 @@ class MailboxBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), - Get.find(), Get.find(), Get.find(), Get.find(), @@ -95,7 +93,6 @@ class MailboxBindings extends BaseBindings { Get.lazyPut(() => GetAllMailboxInteractor(Get.find())); Get.lazyPut(() => RefreshAllMailboxInteractor(Get.find())); Get.lazyPut(() => CreateNewMailboxInteractor(Get.find())); - Get.lazyPut(() => SearchMailboxInteractor()); Get.lazyPut(() => DeleteMultipleMailboxInteractor(Get.find())); Get.lazyPut(() => VerifyNameInteractor()); Get.lazyPut(() => RenameMailboxInteractor(Get.find())); diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 8c64649da..4202611a5 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -41,7 +41,6 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/state/search_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart'; @@ -50,7 +49,6 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_i import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/usecases/search_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart'; 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'; @@ -74,8 +72,6 @@ import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/features/thread/domain/state/empty_trash_folder_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart'; -import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart'; -import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart'; @@ -94,22 +90,16 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM final GetAllMailboxInteractor _getAllMailboxInteractor; final RefreshAllMailboxInteractor _refreshAllMailboxInteractor; final CreateNewMailboxInteractor _createNewMailboxInteractor; - final SearchMailboxInteractor _searchMailboxInteractor; final DeleteMultipleMailboxInteractor _deleteMultipleMailboxInteractor; final RenameMailboxInteractor _renameMailboxInteractor; final MoveMailboxInteractor _moveMailboxInteractor; final SubscribeMailboxInteractor _subscribeMailboxInteractor; final SubscribeMultipleMailboxInteractor _subscribeMultipleMailboxInteractor; - final listMailboxSearched = [].obs; - final searchState = SearchState.initial().obs; - final searchQuery = SearchQuery.initial().obs; final currentSelectMode = SelectMode.INACTIVE.obs; final mailboxCategoriesExpandMode = MailboxCategoriesExpandMode.initial().obs; final _openMailboxEventController = StreamController(); - final searchInputController = TextEditingController(); - final searchFocus = FocusNode(); final mailboxListScrollController = ScrollController(); PresentationMailbox? get selectedMailbox => mailboxDashBoardController.selectedMailbox.value; @@ -120,7 +110,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM this._getAllMailboxInteractor, this._refreshAllMailboxInteractor, this._createNewMailboxInteractor, - this._searchMailboxInteractor, this._deleteMultipleMailboxInteractor, this._renameMailboxInteractor, this._moveMailboxInteractor, @@ -133,7 +122,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM @override void onInit() { _registerObxStreamListener(); - _registerSearchFocusListener(); super.onInit(); } @@ -149,8 +137,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM @override void onClose() { - searchInputController.dispose(); - searchFocus.dispose(); _openMailboxEventController.close(); mailboxListScrollController.dispose(); super.onClose(); @@ -176,8 +162,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM (failure) { if (failure is CreateNewMailboxFailure) { _createNewMailboxFailure(failure); - } else if (failure is SearchMailboxFailure) { - _searchMailboxFailure(failure); } else if (failure is DeleteMultipleMailboxFailure) { _deleteMailboxFailure(failure); } @@ -189,14 +173,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM _initialMailboxVariableStorage(isRefreshChange: true); } else if (success is CreateNewMailboxSuccess) { _createNewMailboxSuccess(success); - } else if (success is SearchMailboxSuccess) { - _searchMailboxSuccess(success); } else if (success is DeleteMultipleMailboxAllSuccess) { _deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState); } else if (success is DeleteMultipleMailboxHasSomeSuccess) { _deleteMultipleMailboxSuccess(success.listMailboxIdDeleted, success.currentMailboxState); - } else if ((success is GetAllMailboxSuccess || success is RefreshChangesAllMailboxSuccess) && isSearchActive()) { - _searchMailboxAction(allMailboxes, searchQuery.value); } else if (success is RenameMailboxSuccess) { refreshMailboxChanges(currentMailboxState: success.currentMailboxState); } else if (success is MoveMailboxSuccess) { @@ -291,17 +271,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM }); } - void _registerSearchFocusListener() { - searchFocus.addListener(() { - final hasFocus = searchFocus.hasFocus; - final query = searchQuery.value.value; - log('MailboxController::_registerSearchFocusListener(): hasFocus: $hasFocus | query: $query'); - if (!hasFocus && query.isEmpty) { - disableSearch(); - } - }); - } - void _initCollapseMailboxCategories() { if (kIsWeb && currentContext != null && (_responsiveUtils.isMobile(currentContext!) || _responsiveUtils.isTablet(currentContext!))) { @@ -319,14 +288,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM } void refreshAllMailbox() { - if (!isSearchActive()) { - final session = mailboxDashBoardController.sessionCurrent; - final accountId = mailboxDashBoardController.accountId.value; - if (session != null && accountId != null) { - consumeState(_getAllMailboxInteractor.execute(session, accountId)); - } - } else { - _searchMailboxAction(allMailboxes, searchQuery.value); + final session = mailboxDashBoardController.sessionCurrent; + final accountId = mailboxDashBoardController.accountId.value; + if (session != null && accountId != null) { + consumeState(_getAllMailboxInteractor.execute(session, accountId)); } } @@ -594,52 +559,12 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM } } - bool isSearchActive() => searchState.value.searchStatus == SearchStatus.ACTIVE; - void openSearchViewAction(BuildContext context) { SearchMailboxBindings().dependencies(); mailboxDashBoardController.searchMailboxActivated.value = true; closeMailboxScreen(context); } - void disableSearch() { - _cancelSelectMailbox(); - listMailboxSearched.clear(); - searchState.value = searchState.value.disableSearchState(); - searchQuery.value = SearchQuery.initial(); - searchInputController.clear(); - searchFocus.unfocus(); - } - - void clearSearchText() { - searchQuery.value = SearchQuery.initial(); - searchFocus.requestFocus(); - listMailboxSearched.clear(); - } - - void searchMailbox(String value) { - searchQuery.value = SearchQuery(value); - _searchMailboxAction(allMailboxes, searchQuery.value); - } - - void _searchMailboxAction(List allMailboxes, SearchQuery searchQuery) { - log('MailboxController::_searchMailboxAction():'); - if (searchQuery.value.isNotEmpty) { - consumeState(_searchMailboxInteractor.execute(allMailboxes, searchQuery)); - } else { - listMailboxSearched.clear(); - } - } - - void _searchMailboxSuccess(SearchMailboxSuccess success) { - final mailboxesSearchedWithPath = findMailboxPath(success.mailboxesSearched); - listMailboxSearched.value = mailboxesSearchedWithPath; - } - - void _searchMailboxFailure(SearchMailboxFailure failure) { - listMailboxSearched.clear(); - } - void enableSelectionMailbox() { currentSelectMode.value = SelectMode.ACTIVE; } @@ -650,43 +575,25 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE; - void selectMailboxSearched(BuildContext context, PresentationMailbox mailboxSelected) { - listMailboxSearched.value = listMailboxSearched - .map((mailbox) => mailbox.id == mailboxSelected.id ? mailbox.toggleSelectPresentationMailbox() : mailbox) - .toList(); - } - void _cancelSelectMailbox() { - if (isSearchActive()) { - listMailboxSearched.value = listMailboxSearched - .map((mailbox) => mailbox.toSelectedPresentationMailbox(selectMode: SelectMode.INACTIVE)) - .toList(); - } else { - unAllSelectedMailboxNode(); - } + unAllSelectedMailboxNode(); currentSelectMode.value = SelectMode.INACTIVE; } List get listMailboxSelected { - if (isSearchActive()) { - return listMailboxSearched - .where((mailbox) => mailbox.selectMode == SelectMode.ACTIVE) - .toList(); - } else { - final defaultMailboxSelected = defaultMailboxTree.value - .findNodes((node) => node.selectMode == SelectMode.ACTIVE); + final defaultMailboxSelected = defaultMailboxTree.value + .findNodes((node) => node.selectMode == SelectMode.ACTIVE); - final folderMailboxSelected = personalMailboxTree.value - .findNodes((node) => node.selectMode == SelectMode.ACTIVE); + final folderMailboxSelected = personalMailboxTree.value + .findNodes((node) => node.selectMode == SelectMode.ACTIVE); - final teamMailboxesSelected = teamMailboxesTree.value - .findNodes((node) => node.selectMode == SelectMode.ACTIVE); + final teamMailboxesSelected = teamMailboxesTree.value + .findNodes((node) => node.selectMode == SelectMode.ACTIVE); - return [defaultMailboxSelected, folderMailboxSelected, teamMailboxesSelected] - .expand((node) => node) - .map((node) => node.item) - .toList(); - } + return [defaultMailboxSelected, folderMailboxSelected, teamMailboxesSelected] + .expand((node) => node) + .map((node) => node.item) + .toList(); } void pressMailboxSelectionAction( diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index 6537d92c7..3bd31373d 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -13,10 +13,8 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.d import 'package:tmail_ui_user/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_bottom_sheet_action_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart'; import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart'; -import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; class MailboxView extends GetWidget { @@ -47,14 +45,8 @@ class MailboxView extends GetWidget { Expanded( child: Column(children: [ _buildHeaderMailbox(context), - Obx(() => controller.isSearchActive() - ? SafeArea(bottom: false, top: false, right: false, - child: _buildInputSearchFormWidget(context)) - : const SizedBox.shrink()), - Expanded(child: Obx(() => Container( - color: controller.isSearchActive() - ? Colors.white - : AppColor.colorBgMailbox, + Expanded(child: Container( + color: Colors.white, child: RefreshIndicator( color: AppColor.primaryColor, onRefresh: () async => controller.refreshAllMailbox(), @@ -62,19 +54,16 @@ class MailboxView extends GetWidget { top: false, right: false, bottom: false, - child: controller.isSearchActive() - ? _buildListMailboxSearched(context) - : _buildListMailbox(context) + child: _buildListMailbox(context) ) ), - ))), + )), Obx(() => controller.isSelectionEnabled() ? _buildOptionSelectionMailbox(context) : const SizedBox.shrink()), ]), ), Obx(() => controller.isMailboxListScrollable.isTrue - && !controller.isSearchActive() && !controller.isSelectionEnabled() ? const QuotasFooterWidget() : const SizedBox.shrink(), @@ -82,7 +71,6 @@ class MailboxView extends GetWidget { Obx(() { final appInformation = controller.mailboxDashBoardController.appInformation.value; if (appInformation != null - && !controller.isSearchActive() && !controller.isSelectionEnabled()) { if (_responsiveUtils.isLandscapeMobile(context)) { return const SizedBox.shrink(); @@ -111,19 +99,12 @@ class MailboxView extends GetWidget { Padding( padding: const EdgeInsets.only(left: 10), child: _buildCloseScreenButton(context)), + SizedBox(width: controller.isSelectionEnabled() ? 49 : 40), Expanded(child: Text( AppLocalizations.of(context).folders, textAlign: TextAlign.center, style: const TextStyle(fontSize: 21, color: Colors.black, fontWeight: FontWeight.bold))), - Obx(() { - if (controller.isSearchActive()) { - return controller.listMailboxSearched.isNotEmpty - ? _buildEditMailboxButton(context, controller.isSelectionEnabled()) - : const SizedBox(width: 60); - } else { - return _buildEditMailboxButton(context, controller.isSelectionEnabled()); - } - }) + Obx(() => _buildEditMailboxButton(context, controller.isSelectionEnabled())) ] ) ), @@ -205,9 +186,20 @@ class MailboxView extends GetWidget { return _buildUserInformation(context); }), _buildLoadingView(), - Obx(() => controller.defaultMailboxTree.value.root.childrenItems?.isNotEmpty ?? false - ? _buildMailboxCategory(context, MailboxCategories.exchange, controller.defaultMailboxTree.value.root) - : const SizedBox.shrink()), + Obx(() { + if (controller.defaultMailboxIsNotEmpty) { + return Padding( + padding: const EdgeInsets.only(top: 16), + child: _buildMailboxCategory( + context, + MailboxCategories.exchange, + controller.defaultRootNode + ), + ); + } else { + return const SizedBox.shrink(); + } + }), const Divider(color: AppColor.colorDividerMailbox, height: 0.5, thickness: 0.2), const SizedBox(height: 12), Container( @@ -233,7 +225,7 @@ class MailboxView extends GetWidget { color: AppColor.colorTextButton, fit: BoxFit.fill ), - tooltip: AppLocalizations.of(context).search_folder, + tooltip: AppLocalizations.of(context).searchForMailboxes, onTap: () => controller.openSearchViewAction(context) ), buildIconWeb( @@ -249,19 +241,36 @@ class MailboxView extends GetWidget { ]), ), const SizedBox(height: 8), - Obx(() => controller.personalMailboxTree.value.root.childrenItems?.isNotEmpty ?? false - ? _buildMailboxCategory(context, MailboxCategories.personalMailboxes, controller.personalMailboxTree.value.root) - : const SizedBox.shrink()), + Obx(() { + if (controller.personalMailboxIsNotEmpty) { + return _buildMailboxCategory( + context, + MailboxCategories.personalMailboxes, + controller.personalRootNode + ); + } else { + return const SizedBox.shrink(); + } + }), const SizedBox(height: 8), - Obx(() => controller.teamMailboxesTree.value.root.childrenItems?.isNotEmpty ?? false - ? _buildMailboxCategory(context, MailboxCategories.teamMailboxes, controller.teamMailboxesTree.value.root) - : const SizedBox.shrink()), - Obx(() => controller.isMailboxListScrollable.isFalse - && !controller.isSearchActive() - && !controller.isSelectionEnabled() - ? const QuotasFooterWidget() - : const SizedBox.shrink(), - ), + Obx(() { + if (controller.teamMailboxesIsNotEmpty) { + return _buildMailboxCategory( + context, + MailboxCategories.teamMailboxes, + controller.teamMailboxesRootNode + ); + } else { + return const SizedBox.shrink(); + } + }), + Obx(() { + if (controller.isMailboxListScrollable.isFalse) { + return const QuotasFooterWidget(); + } else { + return const SizedBox.shrink(); + } + }), ]) ), ); @@ -410,71 +419,6 @@ class MailboxView extends GetWidget { ).toList() ?? []; } - Widget _buildInputSearchFormWidget(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 16, bottom: 16), - child: Row( - children: [ - _buildBackSearchButton(context), - Expanded(child: (SearchAppBarWidget( - _imagePaths, - controller.searchQuery.value, - controller.searchFocus, - controller.searchInputController, - hasBackButton: false, - hasSearchButton: true) - ..addPadding(EdgeInsets.zero) - ..setMargin(const EdgeInsets.only(right: 16)) - ..addDecoration(BoxDecoration(borderRadius: BorderRadius.circular(12), color: AppColor.colorBgSearchBar)) - ..addIconClearText(SvgPicture.asset(_imagePaths.icClearTextSearch, width: 18, height: 18, fit: BoxFit.fill)) - ..setHintText(AppLocalizations.of(context).hint_search_mailboxes) - ..addOnClearTextSearchAction(() => controller.clearSearchText()) - ..addOnTextChangeSearchAction((query) => controller.searchMailbox(query)) - ..addOnSearchTextAction((query) => controller.searchMailbox(query))) - .build()) - ] - ) - ); - } - - Widget _buildBackSearchButton(BuildContext context) { - return Padding( - padding: EdgeInsets.only(left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 5), - child: buildIconWeb( - onTap: () => controller.disableSearch(), - icon: SvgPicture.asset(_imagePaths.icBack, color: AppColor.colorTextButton), - )); - } - - Widget _buildListMailboxSearched(BuildContext context) { - return Obx(() => Container( - margin: _responsiveUtils.isDesktop(context) - ? const EdgeInsets.only(left: 16, right: 16) - : EdgeInsets.zero, - decoration: _responsiveUtils.isDesktop(context) - ? BoxDecoration(borderRadius: BorderRadius.circular(14), color: Colors.white) - : null, - child: ListView.builder( - padding: EdgeInsets.only(left: _responsiveUtils.isLandscapeMobile(context) ? 0 : 16, right: 8), - key: const Key('list_mailbox_searched'), - itemCount: controller.listMailboxSearched.length, - shrinkWrap: true, - primary: false, - itemBuilder: (context, index) => - Obx(() => (MailboxSearchTileBuilder( - context, - _imagePaths, - _responsiveUtils, - controller.listMailboxSearched[index], - allSelectMode: controller.currentSelectMode.value, - lastMailboxIdInSearchedList: controller.listMailboxSearched.last.id) - ..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox)) - ..addOnSelectMailboxAction((mailbox) => controller.selectMailboxSearched(context, mailbox))) - .build()) - ) - )); - } - Widget _buildOptionSelectionMailbox(BuildContext context) { return Column(children: [ const Divider(color: AppColor.lineItemListColor, height: 1, thickness: 0.2), diff --git a/lib/features/mailbox/presentation/mailbox_view_web.dart b/lib/features/mailbox/presentation/mailbox_view_web.dart index 2287529fb..196f72e46 100644 --- a/lib/features/mailbox/presentation/mailbox_view_web.dart +++ b/lib/features/mailbox/presentation/mailbox_view_web.dart @@ -13,11 +13,9 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_catego import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_bottom_sheet_action_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/widgets/mailbox_search_tile_builder.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/widgets/user_information_widget_builder.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/app_dashboard/app_list_dashboard_item.dart'; import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_footer_widget.dart'; -import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/utils/app_config.dart'; @@ -47,26 +45,16 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu color: _responsiveUtils.isDesktop(context) ? AppColor.colorBgDesktop : Colors.white, - child: Column(children: [ - Obx(() => controller.isSearchActive() - ? _buildInputSearchFormWidget(context) - : const SizedBox.shrink()), - Expanded(child: Obx(() { - return Container( - color: _responsiveUtils.isDesktop(context) - ? AppColor.colorBgDesktop - : Colors.white, - padding: EdgeInsets.zero, - child: RefreshIndicator( - color: AppColor.primaryColor, - onRefresh: () async => controller.refreshAllMailbox(), - child: controller.isSearchActive() - ? _buildListMailboxSearched( - context, controller.listMailboxSearched) - : _buildListMailbox(context)), - ); - })), - ]), + child: Container( + color: _responsiveUtils.isDesktop(context) + ? AppColor.colorBgDesktop + : Colors.white, + child: RefreshIndicator( + color: AppColor.primaryColor, + onRefresh: () async => controller.refreshAllMailbox(), + child: _buildListMailbox(context) + ), + ), )), const QuotasFooterWidget(), ]), @@ -132,9 +120,17 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu const SizedBox(height: 8), ]) : const SizedBox.shrink(), - Obx(() => controller.defaultMailboxHasChild - ? _buildMailboxCategory(context, MailboxCategories.exchange, controller.defaultRootNode) - : const SizedBox.shrink()), + 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: 0.5, thickness: 0.2), const SizedBox(height: 13), @@ -175,7 +171,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu ]), ), const SizedBox(height: 8), - Obx(() => controller.personalMailboxHasChild + Obx(() => controller.personalMailboxIsNotEmpty ? Column( children: [ _buildHeaderMailboxCategory(context, MailboxCategories.personalMailboxes), @@ -184,7 +180,7 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu ) : const SizedBox.shrink()), const SizedBox(height: 8), - Obx(() => controller.teamMailboxesHasChild + Obx(() => controller.teamMailboxesIsNotEmpty ? Column( children: [ _buildHeaderMailboxCategory(context, MailboxCategories.teamMailboxes), @@ -335,74 +331,6 @@ class MailboxView extends GetWidget with AppLoaderMixin, Popu } } - Widget _buildInputSearchFormWidget(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 16), - child: Transform( - transform: Matrix4.translationValues( - _responsiveUtils.isDesktop(context) ? -10.0 : 0.0, - 0.0, - 0.0), - child: Row( - children: [ - if (!_responsiveUtils.isDesktop(context)) - const SizedBox(width: 10), - buildIconWeb( - iconPadding: EdgeInsets.zero, - minSize: 40, - splashRadius: 15, - icon: SvgPicture.asset(_imagePaths.icBack, color: AppColor.colorTextButton), - onTap: () => controller.disableSearch()), - Expanded(child: (SearchAppBarWidget( - _imagePaths, - controller.searchQuery.value, - controller.searchFocus, - controller.searchInputController, - hasBackButton: false, - hasSearchButton: true) - ..addPadding(EdgeInsets.zero) - ..setMargin(EdgeInsets.only(right: _responsiveUtils.isDesktop(context) ? 8 : 16)) - ..addDecoration(BoxDecoration(borderRadius: BorderRadius.circular(12), color: AppColor.colorBgSearchBar)) - ..addIconClearText(SvgPicture.asset(_imagePaths.icClearTextSearch, width: 16, height: 16, fit: BoxFit.fill)) - ..setHintText(AppLocalizations.of(context).hint_search_mailboxes) - ..addOnClearTextSearchAction(() => controller.clearSearchText()) - ..addOnTextChangeSearchAction((query) => controller.searchMailbox(query)) - ..addOnSearchTextAction((query) => controller.searchMailbox(query))) - .build()) - ] - ), - ) - ); - } - - Widget _buildListMailboxSearched(BuildContext context, List listMailbox) { - return Container( - margin: EdgeInsets.zero, - color: _responsiveUtils.isDesktop(context) ? AppColor.colorBgDesktop : Colors.white, - child: ListView.builder( - padding: EdgeInsets.only( - right: 16, - left: _responsiveUtils.isDesktop(context) ? 0 : 16, - bottom: 16, - top: _responsiveUtils.isDesktop(context) ? 0 : 16), - key: const Key('list_mailbox_searched'), - itemCount: listMailbox.length, - shrinkWrap: true, - primary: false, - itemBuilder: (context, index) => - Obx(() => (MailboxSearchTileBuilder( - context, - _imagePaths, - _responsiveUtils, - listMailbox[index]) - ..addOnDragEmailToMailboxAccepted(controller.mailboxDashBoardController.dragSelectedMultipleEmailToMailboxAction) - ..addOnOpenMailboxAction((mailbox) => controller.openMailbox(context, mailbox)) - ..addOnMenuActionClick((position, mailbox) => _openMailboxMenuAction(context, position, mailbox)) - ..addOnSelectMailboxAction((mailbox) => controller.selectMailboxSearched(context, mailbox))) - .build())) - ); - } - Widget _buildVersionInformation(BuildContext context, PackageInfo packageInfo) { return Container( padding: const EdgeInsets.only(top: 4), diff --git a/lib/features/mailbox/presentation/utils/mailbox_utils.dart b/lib/features/mailbox/presentation/utils/mailbox_utils.dart index ed351fb5b..dd12ca7d0 100644 --- a/lib/features/mailbox/presentation/utils/mailbox_utils.dart +++ b/lib/features/mailbox/presentation/utils/mailbox_utils.dart @@ -1,5 +1,7 @@ +import 'package:core/presentation/utils/responsive_utils.dart'; import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; +import 'package:flutter/material.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/extensions/list_mailbox_node_extension.dart'; @@ -36,4 +38,16 @@ class MailboxUtils { log('MailboxUtils::generateMapDescendantIdsAndMailboxIdList(): mapDescendantIds: $mapDescendantIds'); return Tuple2(mapDescendantIds, allMailboxIds); } + + static EdgeInsets getPaddingListViewMailboxSearched(BuildContext context, ResponsiveUtils responsiveUtils) { + if (responsiveUtils.isWebDesktop(context)) { + return const EdgeInsets.only(left: 16, right: 16, bottom: 16); + } else { + if (responsiveUtils.isScreenWithShortestSide(context)) { + return const EdgeInsets.all(16); + } else { + return const EdgeInsets.symmetric(horizontal: 32, vertical: 16); + } + } + } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart b/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart index 3adcbce54..3ca8a43ff 100644 --- a/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart +++ b/lib/features/mailbox/presentation/widgets/bottom_bar_selection_mailbox_widget.dart @@ -41,7 +41,7 @@ class BottomBarSelectionMailboxWidget { mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Expanded(child: (ButtonBuilder(_imagePaths.icMove) + Expanded(child: (ButtonBuilder(_imagePaths.icMoveMailbox) ..key(const Key('button_move_all_mailbox')) ..paddingIcon(const EdgeInsets.all(8)) ..textStyle(TextStyle( @@ -77,7 +77,7 @@ class BottomBarSelectionMailboxWidget { }) ..text(AppLocalizations.of(_context).rename, isVertical: true)) .build()), - Expanded(child: (ButtonBuilder(_imagePaths.icRead) + Expanded(child: (ButtonBuilder(_imagePaths.icMarkAsRead) ..key(const Key('button_mark_read_all_mailbox')) ..paddingIcon(const EdgeInsets.all(8)) ..textStyle(TextStyle( @@ -95,7 +95,7 @@ class BottomBarSelectionMailboxWidget { }) ..text(AppLocalizations.of(_context).mark_as_read, isVertical: true)) .build()), - Expanded(child: (ButtonBuilder(_imagePaths.icDelete) + Expanded(child: (ButtonBuilder(_imagePaths.icDeleteMailbox) ..key(const Key('button_delete_all_mailbox')) ..paddingIcon(const EdgeInsets.all(8)) ..textStyle(TextStyle( diff --git a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart index f7eba041c..8df7a0faa 100644 --- a/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart +++ b/lib/features/mailbox/presentation/widgets/mailbox_folder_tile_builder.dart @@ -72,14 +72,20 @@ class MailBoxFolderTileBuilder { _onLongPressMailboxNodeAction = onLongPressMailboxNodeAction; } - Widget build() => DragTarget>( - builder: (context, _, __,) { + Widget build() { + if (BuildUtils.isWeb) { + return DragTarget>( + builder: (context, _, __,) { + return _buildMailboxItem(); + }, + onAccept: (emails) { + _onDragItemAccepted?.call(emails, _mailboxNode.item); + }, + ); + } else { return _buildMailboxItem(); - }, - onAccept: (emails) { - _onDragItemAccepted?.call(emails, _mailboxNode.item); - }, - ); + } + } Widget _buildMailboxItem() { if (mailboxDisplayed == MailboxDisplayed.mailbox) { @@ -124,35 +130,39 @@ class MailBoxFolderTileBuilder { absorbing: !_mailboxNode.isActivated, child: Opacity( opacity: _mailboxNode.isActivated ? 1.0 : 0.3, - child: InkWell( - onLongPress: () => _onLongPressMailboxFolderClick?.call(_mailboxNode), - onTap: () => allSelectMode == SelectMode.ACTIVE - ? _onSelectMailboxFolderClick?.call(_mailboxNode) - : _onOpenMailboxFolderClick?.call(_mailboxNode), - child: ClipRRect( - borderRadius: const BorderRadius.all(Radius.circular(14)), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric( - vertical: _mailboxNode.hasChildren() ? 8 : 15), - child: Row( - crossAxisAlignment: _mailboxNode.item.isTeamMailboxes - ? CrossAxisAlignment.start - : CrossAxisAlignment.center, - children: [ - _buildLeadingMailboxItem(), - const SizedBox(width: 8), - Expanded(child: _buildTitleFolderItem()), - _buildSelectedIcon(), - const SizedBox(width: 8), - _buildTrailingMailboxItem() - ]), - ), - ] - ) + child: Material( + color: Colors.transparent, + child: InkWell( + onLongPress: () => _onLongPressMailboxFolderClick?.call(_mailboxNode), + onTap: () => allSelectMode == SelectMode.ACTIVE + ? _onSelectMailboxFolderClick?.call(_mailboxNode) + : _onOpenMailboxFolderClick?.call(_mailboxNode), + borderRadius: const BorderRadius.all(Radius.circular(8)), + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(14)), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.symmetric( + vertical: _mailboxNode.hasChildren() ? 8 : 15), + child: Row( + crossAxisAlignment: _mailboxNode.item.isTeamMailboxes + ? CrossAxisAlignment.start + : CrossAxisAlignment.center, + children: [ + _buildLeadingMailboxItem(), + const SizedBox(width: 8), + Expanded(child: _buildTitleFolderItem()), + _buildSelectedIcon(), + const SizedBox(width: 8), + _buildTrailingMailboxItem() + ]), + ), + ] + ) + ), ), ), ), diff --git a/lib/features/search/mailbox/presentation/search_mailbox_controller.dart b/lib/features/search/mailbox/presentation/search_mailbox_controller.dart index b4a8bb002..25d1c153b 100644 --- a/lib/features/search/mailbox/presentation/search_mailbox_controller.dart +++ b/lib/features/search/mailbox/presentation/search_mailbox_controller.dart @@ -148,8 +148,8 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa } void refreshMailboxChanges({jmap.State? mailboxState}) { + dashboardController.dispatchMailboxUIAction(RefreshChangeMailboxAction(null)); final newMailboxState = mailboxState ?? currentMailboxState; - dashboardController.dispatchMailboxUIAction(RefreshChangeMailboxAction(newMailboxState)); final accountId = dashboardController.accountId.value; final session = dashboardController.sessionCurrent; if (session != null && accountId != null && newMailboxState != null) { diff --git a/lib/features/search/mailbox/presentation/search_mailbox_view.dart b/lib/features/search/mailbox/presentation/search_mailbox_view.dart index 79246ed64..f28ed0b90 100644 --- a/lib/features/search/mailbox/presentation/search_mailbox_view.dart +++ b/lib/features/search/mailbox/presentation/search_mailbox_view.dart @@ -1,5 +1,4 @@ -import 'package:core/core.dart'; import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:core/presentation/views/text/text_field_builder.dart'; diff --git a/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart b/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart index 7d6d3dd44..b84550f3e 100644 --- a/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart +++ b/lib/features/thread/presentation/widgets/spam_report_banner_widget.dart @@ -20,9 +20,7 @@ class SpamReportBannerWidget extends StatelessWidget { } return Container( height: 124, - margin: const EdgeInsets.only( - top: 12, left: 16, right: 16, bottom: 16 - ), + margin: const EdgeInsets.only(left: 16, right: 16, bottom: 16), decoration: BoxDecoration( borderRadius: BorderRadius.circular(12), border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),