TF-460 Create ManageAccountDashBoardView

This commit is contained in:
dab246
2022-04-25 16:54:13 +07:00
committed by Dat H. Pham
parent 52fd989272
commit d1c341b020
15 changed files with 346 additions and 25 deletions
@@ -6,6 +6,7 @@ import 'package:dartz/dartz.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_interactor.dart';
@@ -20,6 +21,7 @@ abstract class ReloadableController extends BaseController {
final AuthorizationInterceptors _authorizationInterceptors = Get.find<AuthorizationInterceptors>();
final GetSessionInteractor _getSessionInteractor = Get.find<GetSessionInteractor>();
final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>();
final CachingManager _cachingManager = Get.find<CachingManager>();
ReloadableController();
@@ -90,4 +92,18 @@ abstract class ReloadableController extends BaseController {
}
void handleReloaded(Session session) {}
void _clearAllCacheAction() async {
await _cachingManager.clearAll();
}
void logoutAction() {
_deleteCredentialAction();
_clearAllCacheAction();
goToLogin();
}
void goToSettings() {
push(AppRoutes.MANAGE_ACCOUNT);
}
}
@@ -17,7 +17,6 @@ import 'package:model/model.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:tmail_ui_user/features/base/action/ui_action.dart';
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
@@ -31,7 +30,6 @@ import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart';
@@ -53,8 +51,6 @@ class MailboxDashBoardController extends ReloadableController {
final AppToast _appToast = Get.find<AppToast>();
final ImagePaths _imagePaths = Get.find<ImagePaths>();
final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find<RemoveEmailDraftsInteractor>();
final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>();
final CachingManager _cachingManager = Get.find<CachingManager>();
final Connectivity _connectivity = Get.find<Connectivity>();
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
@@ -422,28 +418,10 @@ class MailboxDashBoardController extends ReloadableController {
}
}
void _deleteCredential() async {
await _deleteCredentialInteractor.execute();
}
void _clearAllCache() async {
await _cachingManager.clearAll();
}
void logoutAction() {
_deleteCredential();
_clearAllCache();
goToLogin();
}
void clearDashBoardAction() {
dashBoardAction.value = DashBoardAction.idle;
}
void goToSettings() {
dispatchAction(GoToSettingsAction());
}
@override
void onClose() {
_emailReceiveManager.closeEmailReceiveManagerStream();
@@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart';
import 'package:tmail_ui_user/features/thread/presentation/widgets/search_app_bar_widget.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/route_navigation.dart';
class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> with NetworkConnectionMixin,
UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin {
@@ -171,7 +172,10 @@ class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> with Ne
controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context,
controller.userProfile.value,
onLogoutAction: () => controller.logoutAction(),
onSettingAction: () => controller.goToSettings())))
onSettingAction: () {
popBack();
controller.goToSettings();
})))
..addBoxShadows([const BoxShadow(
color: AppColor.colorShadowBgContentEmail,
spreadRadius: 1, blurRadius: 1, offset: Offset(0, 0.5))])
@@ -0,0 +1,31 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/content/manage_account_content_controller.dart';
class ManageAccountContentBindings extends BaseBindings {
@override
void bindingsController() {
Get.lazyPut(() => ManageAccountContentController());
}
@override
void bindingsDataSource() {
}
@override
void bindingsDataSourceImpl() {
}
@override
void bindingsInteractor() {
}
@override
void bindingsRepository() {
}
@override
void bindingsRepositoryImpl() {
}
}
@@ -0,0 +1,13 @@
import 'package:tmail_ui_user/features/base/base_controller.dart';
class ManageAccountContentController extends BaseController {
@override
void onDone() {
}
@override
void onError(error) {
}
}
@@ -0,0 +1,14 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/content/manage_account_content_controller.dart';
class ManageAccountContentView extends GetWidget<ManageAccountContentController> {
const ManageAccountContentView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: Colors.black);
}
}
@@ -0,0 +1,45 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/content/manage_account_content_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/dashboard/manage_account_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_bindings.dart';
class ManageAccountDashBoardBindings extends BaseBindings {
@override
void dependencies() {
super.dependencies();
ManageAccountMenuBindings().dependencies();
ManageAccountContentBindings().dependencies();
}
@override
void bindingsController() {
Get.lazyPut(() => ManageAccountDashBoardController(
Get.find<GetUserProfileInteractor>(),
));
}
@override
void bindingsDataSource() {
}
@override
void bindingsDataSourceImpl() {
}
@override
void bindingsInteractor() {
Get.lazyPut(() => GetUserProfileInteractor(Get.find<CredentialRepository>()));
}
@override
void bindingsRepository() {
}
@override
void bindingsRepositoryImpl() {
}
}
@@ -0,0 +1,46 @@
import 'package:get/get.dart';
import 'package:model/model.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart';
class ManageAccountDashBoardController extends ReloadableController {
final GetUserProfileInteractor _getUserProfileInteractor;
final appInformation = Rxn<PackageInfo>();
final userProfile = Rxn<UserProfile>();
ManageAccountDashBoardController(
this._getUserProfileInteractor,
);
@override
void onReady() {
_getUserProfile();
super.onReady();
}
@override
void onDone() {
viewState.value.fold(
(failure) {},
(success) {
if (success is GetUserProfileSuccess) {
userProfile.value = success.userProfile;
}
}
);
}
@override
void onError(error) {
}
void _getUserProfile() async {
consumeState(_getUserProfileInteractor.execute());
}
}
@@ -0,0 +1,108 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/user_setting_popup_menu_mixin.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/content/manage_account_content_view.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/dashboard/manage_account_dashboard_controller.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_view.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardController> with
UserSettingPopupMenuMixin {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
ManageAccountDashBoardView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Stack(children: [
ResponsiveWidget(
responsiveUtils: _responsiveUtils,
desktop: Column(children: [
Row(children: [
Container(width: 256, color: Colors.white,
padding: const EdgeInsets.only(top: 25, bottom: 25, left: 32),
child: Row(children: [
(SloganBuilder(arrangedByHorizontal: true)
..setSloganText(AppLocalizations.of(context).app_name)
..setSloganTextAlign(TextAlign.center)
..setSloganTextStyle(const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold))
..setSizeLogo(24)
..setLogo(_imagePaths.icLogoTMail))
.build(),
Obx(() {
if (controller.appInformation.value != null) {
return Padding(padding: const EdgeInsets.only(top: 6),
child: Text(
'v.${controller.appInformation.value!.version}',
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 13, color: AppColor.colorContentEmail, fontWeight: FontWeight.w500),
));
} else {
return const SizedBox.shrink();
}
}),
])
),
Expanded(child: Padding(
padding: const EdgeInsets.only(right: 10, top: 16, bottom: 10, left: 48),
child: _buildRightHeader(context)))
]),
Expanded(child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(child: const ManageAccountMenuView(), width: _responsiveUtils.defaultSizeMenuWidthWeb),
const Expanded(child: ManageAccountContentView())
],
))
]),
tabletLarge: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(child: const ManageAccountMenuView(), width: _responsiveUtils.defaultSizeMenuWidthWeb),
const Expanded(child: ManageAccountContentView())
],
),
mobile: const ManageAccountContentView()
),
]),
);
}
Widget _buildRightHeader(BuildContext context) {
return Row(children: [
const Spacer(),
(SearchBarView(_imagePaths)
..hintTextSearch(AppLocalizations.of(context).search_emails)
..maxSizeWidth(240)
..addOnOpenSearchViewAction(() => {}))
.build(),
const SizedBox(width: 16),
(AvatarBuilder()
..text(controller.userProfile.value?.getAvatarText() ?? '')
..backgroundColor(Colors.white)
..textColor(Colors.black)
..context(context)
..addOnTapAvatarActionWithPositionClick((position) =>
controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context,
controller.userProfile.value,
onLogoutAction: () => controller.logoutAction(),
onSettingAction: () {
popBack();
controller.goToSettings();
})))
..addBoxShadows([const BoxShadow(
color: AppColor.colorShadowBgContentEmail,
spreadRadius: 1, blurRadius: 1, offset: Offset(0, 0.5))])
..size(48))
.build(),
const SizedBox(width: 16)
]);
}
}
@@ -0,0 +1,31 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart';
class ManageAccountMenuBindings extends BaseBindings {
@override
void bindingsController() {
Get.lazyPut(() => ManageAccountMenuController());
}
@override
void bindingsDataSource() {
}
@override
void bindingsDataSourceImpl() {
}
@override
void bindingsInteractor() {
}
@override
void bindingsRepository() {
}
@override
void bindingsRepositoryImpl() {
}
}
@@ -0,0 +1,13 @@
import 'package:tmail_ui_user/features/base/base_controller.dart';
class ManageAccountMenuController extends BaseController {
@override
void onDone() {
}
@override
void onError(error) {
}
}
@@ -0,0 +1,14 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart';
class ManageAccountMenuView extends GetWidget<ManageAccountMenuController> {
const ManageAccountMenuView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(color: Colors.green);
}
}
@@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_credential_inte
class CredentialBindings extends Bindings {
@override
void dependencies() {
bindingsRepositoryImpl();
bindingsRepository();
+8 -2
View File
@@ -13,9 +13,11 @@ import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_crea
import 'package:tmail_ui_user/features/mailbox_creator/presentation/mailbox_creator_view.dart' deferred as mailbox_creator;
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart'
if (dart.library.html) 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart' deferred as mailbox_dashBoard;
if (dart.library.html) 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart' deferred as mailbox_dashboard;
import 'package:tmail_ui_user/features/manage_account/presentation/dashboard/manage_account_dashboard_bindings.dart';
import 'package:tmail_ui_user/features/session/presentation/session_page_bindings.dart';
import 'package:tmail_ui_user/features/session/presentation/session_view.dart' deferred as session;
import 'package:tmail_ui_user/features/manage_account/presentation/dashboard/manage_account_dashboard_view.dart' deferred as manage_account_dashboard;
import 'package:tmail_ui_user/main/pages/deferred_widget.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
@@ -35,7 +37,7 @@ class AppPages {
binding: SessionPageBindings()),
GetPage(
name: AppRoutes.MAILBOX_DASHBOARD,
page: () => DeferredWidget(mailbox_dashBoard.loadLibrary, () => mailbox_dashBoard.MailboxDashBoardView()),
page: () => DeferredWidget(mailbox_dashboard.loadLibrary, () => mailbox_dashboard.MailboxDashBoardView()),
binding: MailboxDashBoardBindings()),
GetPage(
name: AppRoutes.EMAIL,
@@ -55,5 +57,9 @@ class AppPages {
opaque: false,
page: () => DeferredWidget(mailbox_creator.loadLibrary, () => mailbox_creator.MailboxCreatorView()),
binding: MailboxCreatorBindings()),
GetPage(
name: AppRoutes.MANAGE_ACCOUNT,
page: () => DeferredWidget(manage_account_dashboard.loadLibrary, () => manage_account_dashboard.ManageAccountDashBoardView()),
binding: ManageAccountDashBoardBindings()),
];
}
+1
View File
@@ -9,4 +9,5 @@ abstract class AppRoutes {
static const COMPOSER = '/composer';
static const DESTINATION_PICKER = '/destinationPicker';
static const MAILBOX_CREATOR = '/mailboxCreator';
static const MANAGE_ACCOUNT = '/manage_account';
}