TF-934 Select mailbox, email when change route on browser

This commit is contained in:
dab246
2022-11-10 20:14:47 +07:00
committed by Dat H. Pham
parent aa8b80975e
commit 6050ee5386
21 changed files with 491 additions and 287 deletions
@@ -1,6 +1,6 @@
import 'dart:collection';
import 'package:core/utils/build_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
@@ -25,8 +25,15 @@ class EmailSupervisorController extends BaseController {
Session? get sessionCurrent => mailboxDashBoardController.sessionCurrent;
AccountId? get accountId => mailboxDashBoardController.accountId.value;
RxList<PresentationEmail> get listEmail => mailboxDashBoardController.searchController.isSearchEmailRunning && !kIsWeb ?
mailboxDashBoardController.listResultSearch : mailboxDashBoardController.emailsInCurrentMailbox;
RxList<PresentationEmail> get listEmail {
if (mailboxDashBoardController.searchController.isSearchEmailRunning && !BuildUtils.isWeb) {
return mailboxDashBoardController.listResultSearch;
} else {
return mailboxDashBoardController.emailsInCurrentMailbox;
}
}
bool get supportedPageView => listEmail.isNotEmpty;
@override
void onClose() {
@@ -52,6 +52,7 @@ import 'package:tmail_ui_user/features/email/presentation/model/composer_argumen
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_bottom_sheet_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart';
@@ -66,7 +67,9 @@ import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.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';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:uuid/uuid.dart';
class SingleEmailController extends BaseController with AppLoaderMixin {
@@ -129,7 +132,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
@override
void onInit() {
_initializeDebounceTimeIndexPageViewChange();
_initWorker();
_registerListenerWorker();
_listenDownloadAttachmentProgressState();
injectRuleFilterBindings(
emailSupervisorController.sessionCurrent,
@@ -160,7 +163,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void onClose() {
_downloadProgressStateController.close();
_getEmailDeBouncer.cancel();
_clearWorker();
_unregisterListenerWorker();
super.onClose();
}
@@ -172,14 +175,18 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
});
}
void _initWorker() {
void _registerListenerWorker() {
emailWorker = ever(emailSupervisorController.selectedEmail, (presentationEmail) {
log('SingleEmailController::_initWorker(): $presentationEmail');
if (presentationEmail is PresentationEmail) {
if (_currentEmailId != presentationEmail.id) {
_currentEmailId = presentationEmail.id;
emailSupervisorController.setCurrentPositionEmailInListEmail(_currentEmailId);
_getEmailDeBouncer.value = emailSupervisorController.currentIndexPageView;
if (emailSupervisorController.supportedPageView) {
emailSupervisorController.setCurrentPositionEmailInListEmail(_currentEmailId);
_getEmailDeBouncer.value = emailSupervisorController.currentIndexPageView;
} else {
_getEmailContentAction(presentationEmail.id);
}
_resetToOriginalValue();
if (!presentationEmail.hasRead) {
markAsEmailRead(presentationEmail, ReadActions.markAsRead);
@@ -192,8 +199,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
});
}
void _clearWorker() {
emailWorker.call();
void _unregisterListenerWorker() {
emailWorker.dispose();
}
void _listenDownloadAttachmentProgressState() {
@@ -984,12 +991,16 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
}
void closeEmailView(BuildContext context) {
emailSupervisorController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent?.id == currentEmail?.id);
emailSupervisorController.currentIndexPageView = -1;
_getEmailDeBouncer.value = null;
log('SingleEmailController::closeEmailView(): ');
if (emailSupervisorController.supportedPageView) {
emailSupervisorController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent?.id == currentEmail?.id);
emailSupervisorController.currentIndexPageView = -1;
_getEmailDeBouncer.value = null;
}
mailboxDashBoardController.clearSelectedEmail();
_currentEmailId = null;
_resetToOriginalValue();
_updateRouteOnBrowser();
if (mailboxDashBoardController.searchController.isSearchEmailRunning) {
if (responsiveUtils.isWebDesktop(context)) {
mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread);
@@ -998,6 +1009,28 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
}
} else {
mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread);
if (isOpenEmailNotMailboxFromRoute) {
mailboxDashBoardController.dispatchAction(SelectMailboxDefaultAction());
}
}
}
bool get isOpenEmailNotMailboxFromRoute => !emailSupervisorController.supportedPageView
&& mailboxDashBoardController.selectedMailbox.value == null;
void _updateRouteOnBrowser() {
if (BuildUtils.isWeb) {
final selectedMailboxId = mailboxDashBoardController.selectedMailbox.value?.id;
final route = RouteUtils.generateRouteBrowser(
AppRoutes.dashboard,
NavigationRouter(
mailboxId: selectedMailboxId,
dashboardType: mailboxDashBoardController.searchController.isSearchEmailRunning
? DashboardType.search
: DashboardType.normal
)
);
RouteUtils.updateRouteOnBrowser('Mailbox-${selectedMailboxId?.id.value}', route);
}
}
+19 -13
View File
@@ -1,7 +1,6 @@
import 'package:core/core.dart';
import 'package:filesize/filesize.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
@@ -55,7 +54,6 @@ class EmailView extends GetWidget<SingleEmailController> {
: const BoxDecoration(color: Colors.white),
margin: _getMarginEmailView(context),
child: Obx(() {
log('EmailView::_buildLoadingView(): ${controller.currentEmail}');
if (controller.currentEmail != null) {
return _buildEmailView(context, controller.currentEmail!);
} else {
@@ -90,21 +88,28 @@ class EmailView extends GetWidget<SingleEmailController> {
_buildAppBar(context, email),
_buildVacationNotificationMessage(context),
const Divider(color: AppColor.colorDividerHorizontal, height: 1),
Expanded(
child: PageView.builder(
physics: kIsWeb ? const NeverScrollableScrollPhysics() : null,
itemCount: controller.emailSupervisorController.listEmail.length,
controller: controller.emailSupervisorController.pageController,
onPageChanged: controller.emailSupervisorController.onPageChanged,
itemBuilder: (context, index) {
return _buildEmailBody(context, controller.emailSupervisorController.listEmail[index]);
}),
Expanded(child: controller.emailSupervisorController.supportedPageView
? _buildMultipleEmailView(controller.emailSupervisorController.listEmail)
: _buildSingleEmailView(context, email),
),
const Divider(color: AppColor.colorDividerHorizontal, height: 1),
_buildBottomBar(context, email),
]);
}
Widget _buildMultipleEmailView(List<PresentationEmail> listEmails) {
return PageView.builder(
physics: BuildUtils.isWeb ? const NeverScrollableScrollPhysics() : null,
itemCount: listEmails.length,
controller: controller.emailSupervisorController.pageController,
onPageChanged: controller.emailSupervisorController.onPageChanged,
itemBuilder: (context, index) => _buildSingleEmailView(context, listEmails[index])
);
}
Widget _buildSingleEmailView(BuildContext context, PresentationEmail email) {
return _buildEmailBody(context, email);
}
bool _supportVerticalDivider(BuildContext context) {
if (BuildUtils.isWeb) {
@@ -156,7 +161,9 @@ class EmailView extends GetWidget<SingleEmailController> {
_popupMenuEmailActionTile(context, email));
}
},
optionsWidget: kIsWeb ? _buildNavigatorPageViewWidgets(context) : null,
optionsWidget: BuildUtils.isWeb && controller.emailSupervisorController.supportedPageView
? _buildNavigatorPageViewWidgets(context)
: null,
));
}
@@ -323,7 +330,6 @@ class EmailView extends GetWidget<SingleEmailController> {
return controller.viewState.value.fold(
(failure) => const SizedBox.shrink(),
(success) {
log('EmailView::_buildLoadingView(): $success');
if (success is LoadingState) {
return const Align(alignment: Alignment.topCenter, child: Padding(
padding: EdgeInsets.all(16),