TF-1270 Fix click on an email then another email open

This commit is contained in:
dab246
2022-12-07 01:13:13 +07:00
committed by Dat H. Pham
parent 9c89c1527b
commit 54f1fd3a04
6 changed files with 202 additions and 117 deletions
@@ -1,39 +1,35 @@
import 'dart:collection'; import 'dart:collection';
import 'package:collection/collection.dart';
import 'package:core/utils/build_utils.dart'; import 'package:core/utils/build_utils.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/model.dart'; import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:model/extensions/list_presentation_email_extension.dart';
import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart'; import 'package:tmail_ui_user/features/email/presentation/model/email_loaded.dart';
import 'package:tmail_ui_user/features/email/presentation/model/page_view_navigator_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
class EmailSupervisorController extends BaseController { class EmailSupervisorController extends GetxController {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>(); final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final Queue<EmailLoaded> presentationEmailsLoaded = Queue(); final Queue<EmailLoaded> presentationEmailsLoaded = Queue();
PageController? pageController; PageController? pageController;
int currentIndexPageView = -1;
final canGetNewerEmail = true.obs; int _currentEmailIndex = -1;
final canGetOlderEmail = true.obs; final List<PresentationEmail> _currentListEmail = <PresentationEmail>[];
final supportedPageView = RxBool(true);
final pageViewNavigatorState = PageViewNavigatorState.none.obs;
final supportedPageView = RxBool(false);
final scrollPhysicsPageView = Rxn<ScrollPhysics>(); final scrollPhysicsPageView = Rxn<ScrollPhysics>();
Rxn<PresentationEmail> get selectedEmail => mailboxDashBoardController.selectedEmail; List<PresentationEmail> get currentListEmail => _currentListEmail;
Session? get sessionCurrent => mailboxDashBoardController.sessionCurrent;
AccountId? get accountId => mailboxDashBoardController.accountId.value;
RxList<PresentationEmail> get listEmail { int get currentEmailIndex => _currentEmailIndex;
if (mailboxDashBoardController.searchController.isSearchEmailRunning && !BuildUtils.isWeb) {
return mailboxDashBoardController.listResultSearch; void setCurrentEmailIndex(int index) => _currentEmailIndex = index;
} else {
return mailboxDashBoardController.emailsInCurrentMailbox;
}
}
@override @override
void onInit() { void onInit() {
@@ -44,45 +40,85 @@ class EmailSupervisorController extends BaseController {
@override @override
void onClose() { void onClose() {
pageController?.dispose(); pageController?.dispose();
pageController = null;
super.onClose(); super.onClose();
} }
void setCurrentPositionEmailInListEmail(EmailId? currentEmailId) { void updateNewCurrentListEmail() {
currentIndexPageView = listEmail.indexWhere((e) => e.id == currentEmailId); _currentListEmail.clear();
if(pageController != null && pageController!.hasClients && pageController!.page?.toInt() != currentIndexPageView) { if (isSearchActivatedOnMobile) {
pageController!.jumpToPage(currentIndexPageView); _currentListEmail.addAll(mailboxDashBoardController.listResultSearch);
} else { } else {
pageController = PageController(initialPage: currentIndexPageView); _currentListEmail.addAll(mailboxDashBoardController.emailsInCurrentMailbox);
}
}
bool get isSearchActivatedOnMobile {
return mailboxDashBoardController.searchController.isSearchEmailRunning
&& !BuildUtils.isWeb;
}
void createPageControllerAndJumpToEmailById(EmailId currentEmailId) {
_currentEmailIndex = _currentListEmail.matchedIndex(currentEmailId);
if (pageController != null && pageController?.hasClients == true) {
_jumpToPage(_currentEmailIndex);
} else {
pageController = PageController(initialPage: _currentEmailIndex);
}
if (BuildUtils.isWeb) {
_updateStatePageViewNavigator();
} }
_checkEnableNavigatorPageView();
} }
void onPageChanged(int index) { void onPageChanged(int index) {
updateScrollPhysicPageView(); updateScrollPhysicPageView();
mailboxDashBoardController.selectedEmail.value = listEmail[index]; mailboxDashBoardController.openEmailDetailedView(currentListEmail[index]);
} }
void _checkEnableNavigatorPageView() { void _updateStatePageViewNavigator() {
canGetNewerEmail.value = listEmail.length > 1 && currentIndexPageView > 0; if (_currentListEmail.length <= 1) {
canGetOlderEmail.value = listEmail.length > 1 && currentIndexPageView < listEmail.length - 1; pageViewNavigatorState.value = PageViewNavigatorState.none;
} else {
if (_currentEmailIndex > 0 && _currentEmailIndex < _currentListEmail.length - 1) {
pageViewNavigatorState.value = PageViewNavigatorState.all;
} else if (_currentEmailIndex <= 0) {
pageViewNavigatorState.value = PageViewNavigatorState.previous;
} else if (_currentEmailIndex >= _currentListEmail.length - 1) {
pageViewNavigatorState.value = PageViewNavigatorState.next;
}
}
} }
void getNewerEmail() { bool get nextEmailActivated {
currentIndexPageView = currentIndexPageView - 1; return pageViewNavigatorState.value == PageViewNavigatorState.next ||
_jumpToPage(); pageViewNavigatorState.value == PageViewNavigatorState.all;
} }
void getOlderEmail() { bool get previousEmailActivated {
currentIndexPageView = currentIndexPageView + 1; return pageViewNavigatorState.value == PageViewNavigatorState.previous ||
_jumpToPage(); pageViewNavigatorState.value == PageViewNavigatorState.all;
} }
void _jumpToPage() { void moveToNextEmail() {
if (nextEmailActivated) {
_currentEmailIndex--;
_jumpToPage(_currentEmailIndex);
}
}
void backToPreviousEmail() {
if (previousEmailActivated) {
_currentEmailIndex++;
_jumpToPage(_currentEmailIndex);
}
}
void _jumpToPage(int page) {
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
pageController?.jumpToPage(currentIndexPageView); pageController?.jumpToPage(page);
} else { } else {
pageController?.animateToPage( pageController?.animateToPage(
currentIndexPageView, page,
duration: const Duration(milliseconds: 500), duration: const Duration(milliseconds: 500),
curve: Curves.easeInToLinear); curve: Curves.easeInToLinear);
} }
@@ -96,7 +132,24 @@ class EmailSupervisorController extends BaseController {
} }
} }
@override EmailLoaded? getEmailInQueueByEmailId(EmailId emailId) {
void onDone() { return presentationEmailsLoaded.firstWhereOrNull((e) => e.emailCurrent!.id == emailId);
}
void popFirstEmailQueue() {
presentationEmailsLoaded.removeFirst();
}
void popEmailQueue(EmailId? emailId) {
presentationEmailsLoaded.removeWhere((e) => e.emailCurrent!.id == emailId);
}
void pushEmailQueue(EmailLoaded emailLoaded) {
presentationEmailsLoaded.add(emailLoaded);
}
void disposePageViewController() {
pageController?.dispose();
pageController = null;
} }
} }
@@ -9,7 +9,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:debounce_throttle/debounce_throttle.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/id.dart'; 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/session/session.dart';
@@ -49,6 +48,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/send_receipt_to_sender_interactor.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/send_receipt_to_sender_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart'; import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/email/presentation/model/page_view_navigator_state.dart';
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_bottom_sheet_builder.dart';
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_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/presentation/model/mailbox_actions.dart';
@@ -102,16 +102,13 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
EmailId? _currentEmailId; EmailId? _currentEmailId;
Identity? _identitySelected; Identity? _identitySelected;
List<EmailContent>? initialEmailContents; List<EmailContent>? initialEmailContents;
late Worker emailWorker, accountIdWorker; late Worker selectedEmailWorker, accountIdWorker;
final Debouncer<int?> _getEmailDeBouncer = Debouncer<int?>(
const Duration(milliseconds: 800),
initialValue: null,
);
final StreamController<Either<Failure, Success>> _downloadProgressStateController = final StreamController<Either<Failure, Success>> _downloadProgressStateController =
StreamController<Either<Failure, Success>>.broadcast(); StreamController<Either<Failure, Success>>.broadcast();
Stream<Either<Failure, Success>> get downloadProgressState => _downloadProgressStateController.stream; Stream<Either<Failure, Success>> get downloadProgressState => _downloadProgressStateController.stream;
PresentationEmail? get currentEmail => emailSupervisorController.selectedEmail.value; PresentationEmail? get currentEmail => mailboxDashBoardController.selectedEmail.value;
bool get isDisplayFullEmailAddress => emailAddressExpandMode.value == ExpandMode.EXPAND; bool get isDisplayFullEmailAddress => emailAddressExpandMode.value == ExpandMode.EXPAND;
@@ -131,7 +128,6 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
@override @override
void onInit() { void onInit() {
_initializeDebounceTimeIndexPageViewChange();
_registerListenerWorker(); _registerListenerWorker();
_listenDownloadAttachmentProgressState(); _listenDownloadAttachmentProgressState();
super.onInit(); super.onInit();
@@ -140,19 +136,10 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
@override @override
void onClose() { void onClose() {
_downloadProgressStateController.close(); _downloadProgressStateController.close();
_getEmailDeBouncer.cancel();
_unregisterListenerWorker(); _unregisterListenerWorker();
super.onClose(); super.onClose();
} }
void _initializeDebounceTimeIndexPageViewChange() {
_getEmailDeBouncer.values.listen((value) async {
if(value !=null) {
_getEmailContentAction(emailSupervisorController.listEmail[value].id);
}
});
}
void _registerListenerWorker() { void _registerListenerWorker() {
accountIdWorker = ever(mailboxDashBoardController.accountId, (accountId) { accountIdWorker = ever(mailboxDashBoardController.accountId, (accountId) {
if (accountId is AccountId) { if (accountId is AccountId) {
@@ -163,33 +150,57 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
}); });
emailWorker = ever(emailSupervisorController.selectedEmail, (presentationEmail) { selectedEmailWorker = ever<PresentationEmail?>(
log('SingleEmailController::_initWorker(): $presentationEmail'); mailboxDashBoardController.selectedEmail,
if (presentationEmail is PresentationEmail) { _handleOpenEmailDetailedView
if (_currentEmailId != presentationEmail.id) { );
_currentEmailId = presentationEmail.id;
if (emailSupervisorController.listEmail.isNotEmpty) {
emailSupervisorController.supportedPageView.value = true;
emailSupervisorController.setCurrentPositionEmailInListEmail(_currentEmailId);
_getEmailDeBouncer.value = emailSupervisorController.currentIndexPageView;
} else {
emailSupervisorController.supportedPageView.value = false;
_getEmailContentAction(presentationEmail.id);
}
_resetToOriginalValue();
if (!presentationEmail.hasRead) {
markAsEmailRead(presentationEmail, ReadActions.markAsRead);
}
if(_identitySelected == null) {
_getAllIdentities();
}
}
}
});
} }
void _unregisterListenerWorker() { void _unregisterListenerWorker() {
emailWorker.dispose(); accountIdWorker.dispose();
selectedEmailWorker.dispose();
}
void _handleOpenEmailDetailedView(PresentationEmail? selectedEmail) {
if (selectedEmail == null || _currentEmailId == selectedEmail.id) {
log('SingleEmailController::_handleOpenEmailDetailedView(): email unselected');
return;
}
emailSupervisorController.updateNewCurrentListEmail();
_updateCurrentEmailId(selectedEmail.id);
_resetToOriginalValue();
if (emailSupervisorController.currentListEmail.isNotEmpty) {
_createMultipleEmailViewAsPageView(selectedEmail.id);
} else {
_createSingleEmailView(selectedEmail.id);
}
if (!selectedEmail.hasRead) {
markAsEmailRead(selectedEmail, ReadActions.markAsRead);
}
if (_identitySelected == null) {
_getAllIdentities();
}
}
void _updateCurrentEmailId(EmailId? emailId) {
_currentEmailId = emailId;
}
void _createMultipleEmailViewAsPageView(EmailId emailId) {
log('SingleEmailController::_createMultipleEmailViewAsPageView():');
emailSupervisorController.supportedPageView.value = true;
emailSupervisorController.createPageControllerAndJumpToEmailById(emailId);
_getEmailContentAction(emailId);
}
void _createSingleEmailView(EmailId emailId) {
log('SingleEmailController::_createSingleEmailView():');
emailSupervisorController.supportedPageView.value = false;
_getEmailContentAction(emailId);
} }
void _listenDownloadAttachmentProgressState() { void _listenDownloadAttachmentProgressState() {
@@ -242,7 +253,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
void _getAllIdentities() { void _getAllIdentities() {
final accountId = emailSupervisorController.accountId; final accountId = mailboxDashBoardController.accountId.value;
if (accountId != null) { if (accountId != null) {
consumeState(_getAllIdentitiesInteractor.execute(accountId)); consumeState(_getAllIdentitiesInteractor.execute(accountId));
} }
@@ -262,12 +273,11 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
void _getEmailContentAction(EmailId emailId) async { void _getEmailContentAction(EmailId emailId) async {
final accountId = emailSupervisorController.accountId; final accountId = mailboxDashBoardController.accountId.value;
final baseDownloadUrl = emailSupervisorController.sessionCurrent?.getDownloadUrl(); final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl();
final currentEmail = emailSupervisorController.presentationEmailsLoaded.where((e) => e.emailCurrent!.id == emailId); final emailLoaded = emailSupervisorController.getEmailInQueueByEmailId(emailId);
EmailLoaded? emailLoaded;
if(currentEmail.isNotEmpty) { if (emailLoaded != null) {
emailLoaded = currentEmail.first;
dispatchState(Right<Failure, Success>(GetEmailContentLoading())); dispatchState(Right<Failure, Success>(GetEmailContentLoading()));
await Future.delayed(const Duration(milliseconds: 300)); await Future.delayed(const Duration(milliseconds: 300));
consumeState(Stream.value(Right<Failure, Success>(GetEmailContentSuccess( consumeState(Stream.value(Right<Failure, Success>(GetEmailContentSuccess(
@@ -319,17 +329,18 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
void _getEmailContentSuccess(GetEmailContentSuccess success) { void _getEmailContentSuccess(GetEmailContentSuccess success) {
if(emailSupervisorController.presentationEmailsLoaded.length > ThreadConstants.defaultLimit.value.toInt()) { if(emailSupervisorController.presentationEmailsLoaded.length > ThreadConstants.defaultLimit.value.toInt()) {
emailSupervisorController.presentationEmailsLoaded.removeFirst(); emailSupervisorController.popFirstEmailQueue();
} }
final emailLoaded = EmailLoaded( emailSupervisorController.popEmailQueue(success.emailCurrent?.id);
emailSupervisorController.pushEmailQueue(EmailLoaded(
success.emailContents.toList(), success.emailContents.toList(),
success.emailContentsDisplayed.toList(), success.emailContentsDisplayed.toList(),
success.attachments.toList(), success.attachments.toList(),
success.emailCurrent, success.emailCurrent,
); ));
emailSupervisorController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent!.id == emailLoaded.emailCurrent!.id);
emailSupervisorController.presentationEmailsLoaded.add(emailLoaded); if (success.emailCurrent?.id == currentEmail?.id) {
if(success.emailCurrent?.id == mailboxDashBoardController.selectedEmail.value?.id) {
emailContents.value = success.emailContentsDisplayed; emailContents.value = success.emailContentsDisplayed;
initialEmailContents = success.emailContents; initialEmailContents = success.emailContents;
attachments.value = success.attachments; attachments.value = success.attachments;
@@ -999,14 +1010,13 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
void closeEmailView(BuildContext context) { void closeEmailView(BuildContext context) {
log('SingleEmailController::closeEmailView(): ');
if (emailSupervisorController.supportedPageView.isTrue) { if (emailSupervisorController.supportedPageView.isTrue) {
emailSupervisorController.presentationEmailsLoaded.removeWhere((e) => e.emailCurrent?.id == currentEmail?.id); emailSupervisorController.popEmailQueue(_currentEmailId);
emailSupervisorController.currentIndexPageView = -1; emailSupervisorController.setCurrentEmailIndex(-1);
_getEmailDeBouncer.value = null; emailSupervisorController.disposePageViewController();
} }
mailboxDashBoardController.clearSelectedEmail(); mailboxDashBoardController.clearSelectedEmail();
_currentEmailId = null; _updateCurrentEmailId(null);
_resetToOriginalValue(); _resetToOriginalValue();
_updateRouteOnBrowser(); _updateRouteOnBrowser();
if (mailboxDashBoardController.searchController.isSearchEmailRunning) { if (mailboxDashBoardController.searchController.isSearchEmailRunning) {
@@ -1118,17 +1128,15 @@ class SingleEmailController extends BaseController with AppLoaderMixin {
} }
void toggleScrollPhysicsPagerView(bool leftDirection) { void toggleScrollPhysicsPagerView(bool leftDirection) {
log('SingleEmailController::toggleScrollPhysicsPagerView():leftDirection: $leftDirection'); final navigatorState = emailSupervisorController.pageViewNavigatorState.value;
log('SingleEmailController::toggleScrollPhysicsPagerView():canGetOlderEmail: ${emailSupervisorController.canGetOlderEmail.isTrue}');
log('SingleEmailController::toggleScrollPhysicsPagerView():canGetNewerEmail: ${emailSupervisorController.canGetNewerEmail.isTrue}');
if (leftDirection) { if (leftDirection) {
if (emailSupervisorController.canGetNewerEmail.isTrue) { if (navigatorState == PageViewNavigatorState.next) {
emailSupervisorController.getNewerEmail(); emailSupervisorController.moveToNextEmail();
} }
} else { } else {
if (emailSupervisorController.canGetOlderEmail.isTrue) { if (navigatorState == PageViewNavigatorState.previous) {
emailSupervisorController.getOlderEmail(); emailSupervisorController.backToPreviousEmail();
} }
} }
} }
+15 -11
View File
@@ -105,7 +105,7 @@ class EmailView extends GetWidget<SingleEmailController>
const Divider(color: AppColor.colorDividerHorizontal, height: 1), const Divider(color: AppColor.colorDividerHorizontal, height: 1),
Expanded(child: Obx(() { Expanded(child: Obx(() {
return controller.emailSupervisorController.supportedPageView.isTrue return controller.emailSupervisorController.supportedPageView.isTrue
? _buildMultipleEmailView(controller.emailSupervisorController.listEmail) ? _buildMultipleEmailView(controller.emailSupervisorController.currentListEmail)
: _buildSingleEmailView(context, email); : _buildSingleEmailView(context, email);
}), }),
), ),
@@ -196,21 +196,25 @@ class EmailView extends GetWidget<SingleEmailController>
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icNewer, imagePaths.icNewer,
color: controller.emailSupervisorController.canGetNewerEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon, color: controller.emailSupervisorController.nextEmailActivated
? AppColor.primaryColor
: AppColor.colorAttachmentIcon,
width: IconUtils.defaultIconSize, width: IconUtils.defaultIconSize,
height: IconUtils.defaultIconSize, height: IconUtils.defaultIconSize,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).newer, tooltip: AppLocalizations.of(context).newer,
onTap: controller.emailSupervisorController.canGetNewerEmail.value ? controller.emailSupervisorController.getNewerEmail : null), onTap: controller.emailSupervisorController.moveToNextEmail),
buildIconWeb( buildIconWeb(
icon: SvgPicture.asset( icon: SvgPicture.asset(
imagePaths.icOlder, imagePaths.icOlder,
width: IconUtils.defaultIconSize, width: IconUtils.defaultIconSize,
height: IconUtils.defaultIconSize, height: IconUtils.defaultIconSize,
color: controller.emailSupervisorController.canGetOlderEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon, color: controller.emailSupervisorController.previousEmailActivated
? AppColor.primaryColor
: AppColor.colorAttachmentIcon,
fit: BoxFit.fill), fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).older, tooltip: AppLocalizations.of(context).older,
onTap: controller.emailSupervisorController.canGetOlderEmail.value ? controller.emailSupervisorController.getOlderEmail : null), onTap: controller.emailSupervisorController.backToPreviousEmail),
]; ];
} }
@@ -324,7 +328,7 @@ class EmailView extends GetWidget<SingleEmailController>
constraints.maxWidth), constraints.maxWidth),
), ),
)), )),
_buildEmailReceivedTime(context), _buildEmailReceivedTime(context, presentationEmail),
]), ]),
if (presentationEmail.numberOfAllEmailAddress() > 0) if (presentationEmail.numberOfAllEmailAddress() > 0)
Obx(() => Row( Obx(() => Row(
@@ -369,14 +373,14 @@ class EmailView extends GetWidget<SingleEmailController>
}); });
} }
Widget _buildEmailReceivedTime(BuildContext context) { Widget _buildEmailReceivedTime(BuildContext context, PresentationEmail presentationEmail) {
return Container( return Container(
constraints: const BoxConstraints(maxWidth: 100), constraints: const BoxConstraints(maxWidth: 100),
color: Colors.transparent, color: Colors.transparent,
child: Text( child: Text(
'${controller.currentEmail?.getReceivedAt( presentationEmail.getReceivedAt(
Localizations.localeOf(context).toLanguageTag(), Localizations.localeOf(context).toLanguageTag(),
pattern: controller.currentEmail?.receivedAt?.value.toLocal().toPatternForEmailView())}', pattern: presentationEmail.receivedAt?.value.toLocal().toPatternForEmailView()),
maxLines: 1, maxLines: 1,
overflow: CommonTextStyle.defaultTextOverFlow, overflow: CommonTextStyle.defaultTextOverFlow,
softWrap: CommonTextStyle.defaultSoftWrap, softWrap: CommonTextStyle.defaultSoftWrap,
@@ -747,7 +751,7 @@ class EmailView extends GetWidget<SingleEmailController>
} }
Widget _buildEmailContent(BuildContext context, BoxConstraints constraints, PresentationEmail email) { Widget _buildEmailContent(BuildContext context, BoxConstraints constraints, PresentationEmail email) {
if(email.id != controller.mailboxDashBoardController.selectedEmail.value?.id) { if(email.id != controller.currentEmail?.id) {
return const SizedBox.shrink(); return const SizedBox.shrink();
} }
return Obx(() { return Obx(() {
@@ -0,0 +1,6 @@
enum PageViewNavigatorState {
all,
previous,
next,
none,
}
@@ -89,6 +89,7 @@ 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/app_routes.dart';
import 'package:tmail_ui_user/main/routes/navigation_router.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_navigation.dart';
import 'package:tmail_ui_user/main/routes/route_utils.dart';
import 'package:tmail_ui_user/main/routes/router_arguments.dart'; import 'package:tmail_ui_user/main/routes/router_arguments.dart';
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
@@ -432,6 +433,17 @@ class MailboxDashBoardController extends ReloadableController {
selectedEmail.value = null; selectedEmail.value = null;
} }
void openEmailDetailedView(PresentationEmail presentationEmail) {
setSelectedEmail(presentationEmail);
dispatchRoute(DashboardRoutes.emailDetailed);
if (BuildUtils.isWeb && presentationEmail.routeWeb != null) {
RouteUtils.updateRouteOnBrowser(
'Email-${presentationEmail.id.id.value}',
presentationEmail.routeWeb!
);
}
}
void openMailboxMenuDrawer() { void openMailboxMenuDrawer() {
scaffoldKey.currentState?.openDrawer(); scaffoldKey.currentState?.openDrawer();
} }
@@ -96,4 +96,6 @@ extension ListPresentationEmailExtension on List<PresentationEmail> {
} }
}).toList(); }).toList();
} }
int matchedIndex(EmailId emailId) => indexWhere((email) => email.id == emailId);
} }