TF-1427 Remove object do not used

This commit is contained in:
dab246
2023-02-09 19:14:33 +07:00
committed by Dat Vu
parent 2cc2e17bf2
commit 181820ed45
13 changed files with 215 additions and 415 deletions
@@ -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,
);
}
}
@@ -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;
}
@@ -216,7 +216,7 @@ class DestinationPickerView extends GetWidget<DestinationPickerController>
_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<DestinationPickerController>
actions,
mailboxIdSelected)
: const SizedBox.shrink()),
Obx(() => controller.personalMailboxHasChild
Obx(() => controller.personalMailboxIsNotEmpty
? _buildMailboxCategory(
context,
MailboxCategories.personalMailboxes,
@@ -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<GetAllMailboxInteractor>(),
Get.find<RefreshAllMailboxInteractor>(),
Get.find<CreateNewMailboxInteractor>(),
Get.find<SearchMailboxInteractor>(),
Get.find<DeleteMultipleMailboxInteractor>(),
Get.find<RenameMailboxInteractor>(),
Get.find<MoveMailboxInteractor>(),
@@ -95,7 +93,6 @@ class MailboxBindings extends BaseBindings {
Get.lazyPut(() => GetAllMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => RefreshAllMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => CreateNewMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => SearchMailboxInteractor());
Get.lazyPut(() => DeleteMultipleMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => VerifyNameInteractor());
Get.lazyPut(() => RenameMailboxInteractor(Get.find<MailboxRepository>()));
@@ -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 = <PresentationMailbox>[].obs;
final searchState = SearchState.initial().obs;
final searchQuery = SearchQuery.initial().obs;
final currentSelectMode = SelectMode.INACTIVE.obs;
final mailboxCategoriesExpandMode = MailboxCategoriesExpandMode.initial().obs;
final _openMailboxEventController = StreamController<OpenMailboxViewEvent>();
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<PresentationMailbox> 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<PresentationMailbox> 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(
@@ -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<MailboxController> {
@@ -47,14 +45,8 @@ class MailboxView extends GetWidget<MailboxController> {
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<MailboxController> {
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<MailboxController> {
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<MailboxController> {
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<MailboxController> {
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<MailboxController> {
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<MailboxController> {
]),
),
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<MailboxController> {
).toList() ?? <Widget>[];
}
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),
@@ -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<MailboxController> 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<MailboxController> 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<MailboxController> 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<MailboxController> 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<MailboxController> 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<PresentationMailbox> 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),
@@ -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);
}
}
}
}
@@ -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(
@@ -72,14 +72,20 @@ class MailBoxFolderTileBuilder {
_onLongPressMailboxNodeAction = onLongPressMailboxNodeAction;
}
Widget build() => DragTarget<List<PresentationEmail>>(
builder: (context, _, __,) {
Widget build() {
if (BuildUtils.isWeb) {
return DragTarget<List<PresentationEmail>>(
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()
]),
),
]
)
),
),
),
),
@@ -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) {
@@ -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';
@@ -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),