Add presentation layer for get list Email in Mailbox

This commit is contained in:
dab246
2021-08-10 12:33:38 +07:00
committed by Dat H. Pham
parent 1863ba8d02
commit bc6e10bafe
18 changed files with 406 additions and 148 deletions
@@ -2,16 +2,16 @@ import 'package:core/core.dart';
import 'package:core/presentation/extensions/color_extension.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:model/email/presentation_email.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/app_bar_thread_widget_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/thread_tile_builder.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/email_tile_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class ThreadView extends GetWidget<ThreadController> {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
@@ -19,7 +19,7 @@ class ThreadView extends GetWidget<ThreadController> {
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: AppColor.primaryLightColor,
backgroundColor: responsiveUtils.isMobile(context) ? AppColor.bgMailboxListMail : AppColor.primaryLightColor,
body: SafeArea(
right: false,
left: false,
@@ -29,27 +29,54 @@ class ThreadView extends GetWidget<ThreadController> {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Obx(() => _buildAppBarMailboxListMail(context)),
Expanded(child: _buildListMail(context)),
])
Obx(() => _buildAppBarMailboxListMail(context, controller.mailboxDashBoardController.selectedMailbox.value)),
_buildLoadingView(),
Expanded(child: _buildListEmail(context)),
_buildLoadingViewLoadMore()
]
)
)
),
);
}
Widget _buildAppBarMailboxListMail(BuildContext context) {
Widget _buildAppBarMailboxListMail(BuildContext context, PresentationMailbox presentationMailbox) {
return Padding(
padding: EdgeInsets.only(left: 16, top: 8.0, right: 16),
child: AppBarThreadWidgetBuilder(
context,
imagePaths,
responsiveUtils,
mailboxDashBoardController.mailboxCurrent.value)
.onOpenListMailboxActionClick(() => controller.goToMailbox(keyWidgetMailboxContainer: mailboxDashBoardController.scaffoldKey))
presentationMailbox)
.onOpenListMailboxActionClick(() => controller.goToMailbox())
.build());
}
Widget _buildListMail(BuildContext context) {
Widget _buildLoadingView() {
return Obx(() => controller.viewState.value.fold(
(failure) => SizedBox.shrink(),
(success) => success == UIState.loading
? Center(child: Padding(
padding: EdgeInsets.only(top: 16, bottom: 16),
child: SizedBox(
width: 30,
height: 30,
child: CircularProgressIndicator(color: AppColor.primaryColor))))
: SizedBox.shrink()));
}
Widget _buildLoadingViewLoadMore() {
return Obx(() => controller.loadMoreState.value == LoadMoreState.LOADING
? Center(child: Padding(
padding: EdgeInsets.only(top: 16, bottom: 16),
child: SizedBox(
width: 30,
height: 30,
child: CircularProgressIndicator(color: AppColor.primaryColor))))
: SizedBox.shrink());
}
Widget _buildListEmail(BuildContext context) {
return Container(
margin: EdgeInsets.zero,
width: double.infinity,
@@ -57,37 +84,54 @@ class ThreadView extends GetWidget<ThreadController> {
alignment: Alignment.center,
padding: EdgeInsets.zero,
color: responsiveUtils.isMobile(context) ? AppColor.bgMailboxListMail : Colors.white,
child: Obx(() => controller.viewState.value.fold(
(failure) => _buildEmptyThread(context),
(success) => _buildListThreadBody(context, []))
),
);
child: Obx(() => RefreshIndicator(
color: AppColor.primaryColor,
onRefresh: () async => controller.refreshGetAllEmailAction(),
child: controller.emailList.isNotEmpty
? _buildListEmailBody(context, controller.emailList)
: _buildEmptyEmail(context)))
);
}
Widget _buildListThreadBody(BuildContext context, List<PresentationThread> listThread) {
if (listThread.isEmpty) {
return _buildEmptyThread(context);
Widget _buildListEmailBody(BuildContext context, List<PresentationEmail> listPresentationEmail) {
if (listPresentationEmail.isEmpty) {
return _buildEmptyEmail(context);
} else {
return ListView.builder(
padding: EdgeInsets.only(top: 16, left: 16, right: 16),
key: Key('thread_list'),
itemCount: listThread.length,
itemBuilder: (context, index) =>
Obx(() => ThreadTileBuilder(
imagePaths,
controller.getSelectMode(listThread[index]),
listThread[index])
.onOpenMailAction(() => controller.selectMail(context, listThread[index]))
.build()
)
);
return NotificationListener<ScrollNotification>(
onNotification: (ScrollNotification scrollInfo) {
if (controller.loadMoreState.value == LoadMoreState.IDLE
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
controller.loadMoreEmailAction();
return true;
}
return false;
},
child: ListView.builder(
padding: EdgeInsets.only(top: 16, left: 16, right: 16),
key: Key('presentation_email_list'),
itemCount: listPresentationEmail.length,
itemBuilder: (context, index) =>
Obx(() => EmailTileBuilder(
context,
imagePaths,
controller.getSelectMode(listPresentationEmail[index], controller.mailboxDashBoardController.selectedEmail.value),
listPresentationEmail[index],
responsiveUtils)
.onOpenMailAction(() => controller.selectEmail(context, listPresentationEmail[index]))
.build())
));
}
}
Widget _buildEmptyThread(BuildContext context) {
return Text(
AppLocalizations.of(context).no_threads,
maxLines: 1,
style: TextStyle(fontSize: 25, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold));
Widget _buildEmptyEmail(BuildContext context) {
return Obx(() => controller.viewState.value.fold(
(failure) => SizedBox.shrink(),
(success) => success != UIState.loading
? Text(
AppLocalizations.of(context).no_emails,
maxLines: 1,
style: TextStyle(fontSize: 25, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold))
: SizedBox.shrink())
);
}
}