From d1c341b0209647751a6f187463b37f338f0073c7 Mon Sep 17 00:00:00 2001 From: dab246 Date: Mon, 25 Apr 2022 16:54:13 +0700 Subject: [PATCH] TF-460 Create ManageAccountDashBoardView --- .../reloadable/reloadable_controller.dart | 16 +++ .../mailbox_dashboard_controller.dart | 22 ---- .../mailbox_dashboard_view_web.dart | 6 +- .../manage_account_content_bindings.dart | 31 +++++ .../manage_account_content_controller.dart | 13 +++ .../content/manage_account_content_view.dart | 14 +++ .../manage_account_dashboard_bindings.dart | 45 ++++++++ .../manage_account_dashboard_controller.dart | 46 ++++++++ .../manage_account_dashboard_view.dart | 108 ++++++++++++++++++ .../menu/manage_account_menu_bindings.dart | 31 +++++ .../menu/manage_account_menu_controller.dart | 13 +++ .../menu/manage_account_menu_view.dart | 14 +++ .../credential/credential_bindings.dart | 1 + lib/main/pages/app_pages.dart | 10 +- lib/main/routes/app_routes.dart | 1 + 15 files changed, 346 insertions(+), 25 deletions(-) create mode 100644 lib/features/manage_account/presentation/content/manage_account_content_bindings.dart create mode 100644 lib/features/manage_account/presentation/content/manage_account_content_controller.dart create mode 100644 lib/features/manage_account/presentation/content/manage_account_content_view.dart create mode 100644 lib/features/manage_account/presentation/dashboard/manage_account_dashboard_bindings.dart create mode 100644 lib/features/manage_account/presentation/dashboard/manage_account_dashboard_controller.dart create mode 100644 lib/features/manage_account/presentation/dashboard/manage_account_dashboard_view.dart create mode 100644 lib/features/manage_account/presentation/menu/manage_account_menu_bindings.dart create mode 100644 lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart create mode 100644 lib/features/manage_account/presentation/menu/manage_account_menu_view.dart diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index d015b7820..adbbd8ecd 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -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(); final GetSessionInteractor _getSessionInteractor = Get.find(); final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find(); + final CachingManager _cachingManager = Get.find(); 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); + } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index d75181e55..e588ca0ce 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -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(); final ImagePaths _imagePaths = Get.find(); final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find(); - final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find(); - final CachingManager _cachingManager = Get.find(); final Connectivity _connectivity = Get.find(); final ResponsiveUtils _responsiveUtils = Get.find(); final EmailReceiveManager _emailReceiveManager = Get.find(); @@ -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(); diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart index dc517e52f..7f8439a25 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -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 with NetworkConnectionMixin, UserSettingPopupMenuMixin, FilterEmailPopupMenuMixin { @@ -171,7 +172,10 @@ class MailboxDashBoardView extends GetWidget 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))]) diff --git a/lib/features/manage_account/presentation/content/manage_account_content_bindings.dart b/lib/features/manage_account/presentation/content/manage_account_content_bindings.dart new file mode 100644 index 000000000..003018475 --- /dev/null +++ b/lib/features/manage_account/presentation/content/manage_account_content_bindings.dart @@ -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() { + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/content/manage_account_content_controller.dart b/lib/features/manage_account/presentation/content/manage_account_content_controller.dart new file mode 100644 index 000000000..94a2e64e3 --- /dev/null +++ b/lib/features/manage_account/presentation/content/manage_account_content_controller.dart @@ -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) { + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/content/manage_account_content_view.dart b/lib/features/manage_account/presentation/content/manage_account_content_view.dart new file mode 100644 index 000000000..9cbfbfb9f --- /dev/null +++ b/lib/features/manage_account/presentation/content/manage_account_content_view.dart @@ -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 { + + const ManageAccountContentView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(color: Colors.black); + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_bindings.dart b/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_bindings.dart new file mode 100644 index 000000000..022a33386 --- /dev/null +++ b/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_bindings.dart @@ -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(), + )); + } + + @override + void bindingsDataSource() { + } + + @override + void bindingsDataSourceImpl() { + } + + @override + void bindingsInteractor() { + Get.lazyPut(() => GetUserProfileInteractor(Get.find())); + } + + @override + void bindingsRepository() { + } + + @override + void bindingsRepositoryImpl() { + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_controller.dart new file mode 100644 index 000000000..5dbe9a171 --- /dev/null +++ b/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_controller.dart @@ -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(); + final userProfile = Rxn(); + + 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()); + } + +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_view.dart b/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_view.dart new file mode 100644 index 000000000..6d5ba329a --- /dev/null +++ b/lib/features/manage_account/presentation/dashboard/manage_account_dashboard_view.dart @@ -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 with + UserSettingPopupMenuMixin { + + final _responsiveUtils = Get.find(); + final _imagePaths = Get.find(); + + 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) + ]); + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/menu/manage_account_menu_bindings.dart b/lib/features/manage_account/presentation/menu/manage_account_menu_bindings.dart new file mode 100644 index 000000000..037b0ab21 --- /dev/null +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_bindings.dart @@ -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() { + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart b/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart new file mode 100644 index 000000000..bb682c3d2 --- /dev/null +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart @@ -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) { + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart new file mode 100644 index 000000000..a487312bb --- /dev/null +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart @@ -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 { + + const ManageAccountMenuView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(color: Colors.green); + } +} \ No newline at end of file diff --git a/lib/main/bindings/credential/credential_bindings.dart b/lib/main/bindings/credential/credential_bindings.dart index 178b0757e..e8e201f4d 100644 --- a/lib/main/bindings/credential/credential_bindings.dart +++ b/lib/main/bindings/credential/credential_bindings.dart @@ -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(); diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index 583a98ac5..d1be36c48 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -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()), ]; } diff --git a/lib/main/routes/app_routes.dart b/lib/main/routes/app_routes.dart index 4b3050db5..957c6f98e 100644 --- a/lib/main/routes/app_routes.dart +++ b/lib/main/routes/app_routes.dart @@ -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'; } \ No newline at end of file