Add presentation layer for mailbox, mail, message

This commit is contained in:
dab246
2021-07-29 12:49:17 +07:00
committed by Dat H. Pham
parent 5d3d2f4c1e
commit 7a99fd2c59
31 changed files with 626 additions and 105 deletions
@@ -0,0 +1,10 @@
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mail/presentation/mail_controller.dart';
class MailBindings extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => MailController(Get.find<ResponsiveUtils>()));
}
}
@@ -0,0 +1,29 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
class MailController extends BaseController {
final ResponsiveUtils responsiveUtils;
MailController(this.responsiveUtils);
@override
void onReady() {
super.onReady();
}
void goToMailboxListMail(BuildContext context) {
Get.back();
}
@override
void onDone() {
}
@override
void onError(error) {
}
}
@@ -0,0 +1,72 @@
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:tmail_ui_user/features/mail/presentation/mail_controller.dart';
import 'package:tmail_ui_user/features/mail/presentation/widgets/app_bar_mail_widget_builder.dart';
import 'package:tmail_ui_user/features/mail/presentation/widgets/bottom_bar_mail_widget_builder.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class MailView extends GetWidget<MailController> {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final responsiveUtils = Get.find<ResponsiveUtils>();
final imagePaths = Get.find<ImagePaths>();
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: AppColor.primaryLightColor,
body: SafeArea(
right: false,
left: false,
child: Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
_buildAppBar(context),
Expanded(child: _buildListMail(context)),
_buildBottomBar(context),
])
)
),
);
}
Widget _buildAppBar(BuildContext context) {
return Padding(
padding: EdgeInsets.only(left: 16, top: 16.0, right: 16, bottom: 16),
child: AppBarMailWidgetBuilder(context, imagePaths, responsiveUtils)
.onBackActionClick(() => controller.goToMailboxListMail(context))
.build());
}
Widget _buildBottomBar(BuildContext context) {
return Padding(
padding: EdgeInsets.only(left: 16, top: 16.0, right: 16, bottom: 16),
child: BottomBarMailWidgetBuilder(context, imagePaths, responsiveUtils)
.build());
}
Widget _buildListMail(BuildContext context) {
return Container(
margin: EdgeInsets.zero,
width: double.infinity,
height: double.infinity,
alignment: Alignment.center,
padding: EdgeInsets.all(20),
color: AppColor.bgMessenger,
child: Obx(() => Text(
mailboxDashBoardController.mailCurrent.value.id != 'empty'
? '${mailboxDashBoardController.mailCurrent.value.message}'
: AppLocalizations.of(context).no_mail_selected,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 25, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold)
))
);
}
}
@@ -0,0 +1,75 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
typedef OnBackActionClick = void Function();
class AppBarMailWidgetBuilder {
OnBackActionClick? _onBackActionClick;
final BuildContext _context;
final ImagePaths _imagePaths;
final ResponsiveUtils _responsiveUtils;
AppBarMailWidgetBuilder(
this._context,
this._imagePaths,
this._responsiveUtils,
);
AppBarMailWidgetBuilder onBackActionClick(
OnBackActionClick onBackActionClick) {
_onBackActionClick = onBackActionClick;
return this;
}
Widget build() {
return Container(
key: Key('app_bar_messenger_widget'),
alignment: Alignment.center,
color: Colors.white,
child: MediaQuery(
data: MediaQueryData(padding: EdgeInsets.zero),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (!_responsiveUtils.isDesktop(_context))
Expanded(child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children:[_buildBackButton()])),
_buildListOptionButton(),
]
)
)
);
}
Widget _buildBackButton() {
return ButtonBuilder(_imagePaths.icBack)
.size(20)
.onBackActionClick(() {
if (_onBackActionClick != null) {
_onBackActionClick!();
}})
.build();
}
Widget _buildListOptionButton() {
return Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ButtonBuilder(_imagePaths.icTrash).key(Key('button_delete_message')).build(),
SizedBox(width: 20),
ButtonBuilder(_imagePaths.icEyeDisable).key(Key('button_hide_message')).build(),
SizedBox(width: 20),
ButtonBuilder(_imagePaths.icStar).key(Key('button_favorite_message')).build(),
SizedBox(width: 20),
ButtonBuilder(_imagePaths.icFolder).key(Key('button_add_folder_message')).build(),
]
);
}
}
@@ -0,0 +1,50 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class BottomBarMailWidgetBuilder {
final BuildContext _context;
final ImagePaths _imagePaths;
final ResponsiveUtils _responsiveUtils;
BottomBarMailWidgetBuilder(
this._context,
this._imagePaths,
this._responsiveUtils,
);
Widget build() {
return Container(
key: Key('bottom_bar_messenger_widget'),
alignment: Alignment.center,
color: Colors.white,
child: MediaQuery(
data: MediaQueryData(padding: EdgeInsets.zero),
child: _buildListOptionButton()
)
);
}
Widget _buildListOptionButton() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ButtonBuilder(_imagePaths.icReplyAll)
.key(Key('button_reply_all_message'))
.text(AppLocalizations.of(_context).reply_all, isVertical: _responsiveUtils.isMobile(_context))
.build(),
ButtonBuilder(_imagePaths.icReply)
.key(Key('button_reply_message'))
.text(AppLocalizations.of(_context).reply, isVertical: _responsiveUtils.isMobile(_context))
.build(),
ButtonBuilder(_imagePaths.icForward)
.key(Key('button_forward_message'))
.text(AppLocalizations.of(_context).forward, isVertical: _responsiveUtils.isMobile(_context))
.build()
]
);
}
}