TF-996: add previous / Next message of a mailbox on Web

This commit is contained in:
ManhNTX
2022-10-27 18:02:00 +07:00
committed by Dat H. Pham
parent bc102dd9ec
commit 8a931019ed
8 changed files with 90 additions and 4 deletions
@@ -93,6 +93,9 @@ class EmailController extends BaseController with AppLoaderMixin {
late Worker emailWorker;
final Map<EmailId, EmailLoaded> presentationEmailsLoaded = {};
PageController? pageController;
int currentIndexPageView = 0;
final canGetNewerEmail = true.obs;
final canGetOlderEmail = true.obs;
final StreamController<Either<Failure, Success>> _downloadProgressStateController =
StreamController<Either<Failure, Success>>.broadcast();
Stream<Either<Failure, Success>> get downloadProgressState => _downloadProgressStateController.stream;
@@ -144,12 +147,29 @@ class EmailController extends BaseController with AppLoaderMixin {
void _setCurrentPositionEmailInListEmail() {
pageController ??= PageController(initialPage: mailboxDashBoardController.emailList.indexOf(mailboxDashBoardController.selectedEmail.value));
currentIndexPageView = mailboxDashBoardController.emailList.indexOf(mailboxDashBoardController.selectedEmail.value);
_checkEnableNavigatorPageView();
}
void onPageChanged(int index) {
mailboxDashBoardController.selectedEmail.value = mailboxDashBoardController.emailList[index];
}
void _checkEnableNavigatorPageView() {
canGetNewerEmail.value = currentIndexPageView > 0;
canGetOlderEmail.value = mailboxDashBoardController.emailList.length > 1 && currentIndexPageView < mailboxDashBoardController.emailList.length - 1;
}
void getNewerEmail() {
currentIndexPageView = currentIndexPageView - 1;
pageController?.jumpToPage(currentIndexPageView);
}
void getOlderEmail() {
currentIndexPageView = currentIndexPageView + 1;
pageController?.jumpToPage(currentIndexPageView);
}
void _initWorker() {
emailWorker = ever(mailboxDashBoardController.selectedEmail, (presentationEmail) {
log('EmailController::_initWorker(): $presentationEmail');
@@ -1,6 +1,7 @@
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';
@@ -48,9 +49,9 @@ class EmailView extends GetWidget<EmailController> {
child: Container(
decoration: responsiveUtils.isWebDesktop(context)
? BoxDecoration(
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
color: Colors.white)
borderRadius: BorderRadius.circular(20),
border: Border.all(color: AppColor.colorBorderBodyThread, width: 1),
color: Colors.white)
: const BoxDecoration(color: Colors.white),
margin: _getMarginEmailView(context),
child: Obx(() {
@@ -91,6 +92,7 @@ class EmailView extends GetWidget<EmailController> {
const Divider(color: AppColor.colorDividerHorizontal, height: 1),
Expanded(
child: PageView.builder(
physics: kIsWeb ? const NeverScrollableScrollPhysics() : null,
itemCount: controller.mailboxDashBoardController.emailList.length,
controller: controller.pageController,
onPageChanged: controller.onPageChanged,
@@ -153,10 +155,34 @@ class EmailView extends GetWidget<EmailController> {
position,
_popupMenuEmailActionTile(context, email));
}
}
},
optionsWidget: kIsWeb ? _buildNavigatorPageViewWidgets(context) : null,
));
}
List<Widget> _buildNavigatorPageViewWidgets(BuildContext context) {
return [
buildIconWeb(
icon: SvgPicture.asset(
imagePaths.icNewer,
color: controller.canGetNewerEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon,
width: IconUtils.defaultIconSize,
height: IconUtils.defaultIconSize,
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).newer,
onTap: controller.canGetNewerEmail.value ? controller.getNewerEmail : null),
buildIconWeb(
icon: SvgPicture.asset(
imagePaths.icOlder,
width: IconUtils.defaultIconSize,
height: IconUtils.defaultIconSize,
color: controller.canGetOlderEmail.value ? AppColor.primaryColor : AppColor.colorAttachmentIcon,
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).older,
onTap: controller.canGetOlderEmail.value ? controller.getOlderEmail : null),
];
}
Widget _buildBottomBar(BuildContext context, PresentationEmail presentationEmail) {
return BottomBarMailWidgetBuilder(
presentationEmail,
@@ -15,6 +15,7 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final PresentationEmail _presentationEmail;
final List<Widget>? optionsWidget;
final PresentationMailbox? currentMailbox;
final bool isSearchIsRunning;
final OnBackActionClick? onBackActionClick;
@@ -29,6 +30,7 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
this.onBackActionClick,
this.onEmailActionClick,
this.onMoreActionClick,
this.optionsWidget,
this.isSearchIsRunning = false,
}
) : super(key: key);
@@ -102,6 +104,8 @@ class AppBarMailWidgetBuilder extends StatelessWidget {
Widget _buildListOptionButton(BuildContext context) {
return Row(
children: [
if(optionsWidget != null)
...optionsWidget!,
buildIconWeb(
icon: SvgPicture.asset(
_imagePaths.icMoveEmail,