From 740859054ae641dc972bef4b9591f4d79590c7d0 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 29 Jul 2021 18:26:31 +0700 Subject: [PATCH] Add presentation layer for get Session --- .../home/presentation/home_controller.dart | 2 +- .../state/authentication_user_state.dart | 2 +- .../domain/state/delete_credential_state.dart | 18 +++++++++ .../domain/state/get_credential_state.dart | 2 +- .../delete_credential_interactor.dart | 25 ++++++++++++ .../login/presentation/login_controller.dart | 2 +- .../presentation/mailbox_bindings.dart | 8 ++++ .../presentation/mailbox_controller.dart | 20 +++++++--- .../mailbox/presentation/mailbox_view.dart | 4 +- .../mailbox_dashboard_controller.dart | 6 +++ .../presentation/mailbox_dashboard_view.dart | 4 ++ .../presentation/session_bindings.dart | 27 +++++++++++++ .../presentation/session_controller.dart | 38 +++++++++++++++++++ .../session/presentation/session_view.dart | 20 ++++++++++ .../bindings/network/network_bindings.dart | 2 + lib/main/pages/app_pages.dart | 6 +++ lib/main/routes/app_routes.dart | 1 + model/pubspec.yaml | 4 +- pubspec.yaml | 4 +- 19 files changed, 180 insertions(+), 15 deletions(-) create mode 100644 lib/features/login/domain/state/delete_credential_state.dart create mode 100644 lib/features/login/domain/usecases/delete_credential_interactor.dart create mode 100644 lib/features/session/presentation/session_bindings.dart create mode 100644 lib/features/session/presentation/session_controller.dart create mode 100644 lib/features/session/presentation/session_view.dart diff --git a/lib/features/home/presentation/home_controller.dart b/lib/features/home/presentation/home_controller.dart index e9b8ae230..75ffe38cd 100644 --- a/lib/features/home/presentation/home_controller.dart +++ b/lib/features/home/presentation/home_controller.dart @@ -34,6 +34,6 @@ class HomeController extends GetxController { credentialViewState.userName.userName, credentialViewState.password.value, ); - Get.offNamed(AppRoutes.MAILBOX_DASHBOARD); + Get.offNamed(AppRoutes.SESSION); } } \ No newline at end of file diff --git a/lib/features/login/domain/state/authentication_user_state.dart b/lib/features/login/domain/state/authentication_user_state.dart index 9c3d57887..cf8d2fc80 100644 --- a/lib/features/login/domain/state/authentication_user_state.dart +++ b/lib/features/login/domain/state/authentication_user_state.dart @@ -1,7 +1,7 @@ import 'package:core/core.dart'; import 'package:model/model.dart'; -class AuthenticationUserViewState extends ViewState { +class AuthenticationUserViewState extends UIState { final User user; AuthenticationUserViewState(this.user); diff --git a/lib/features/login/domain/state/delete_credential_state.dart b/lib/features/login/domain/state/delete_credential_state.dart new file mode 100644 index 000000000..ffdf3f15e --- /dev/null +++ b/lib/features/login/domain/state/delete_credential_state.dart @@ -0,0 +1,18 @@ +import 'package:core/core.dart'; +import 'package:core/presentation/state/failure.dart'; + +class DeleteCredentialSuccess extends UIState { + DeleteCredentialSuccess(); + + @override + List get props => []; +} + +class DeleteCredentialFailure extends FeatureFailure { + final exception; + + DeleteCredentialFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/login/domain/state/get_credential_state.dart b/lib/features/login/domain/state/get_credential_state.dart index 1e579a2b3..955735c26 100644 --- a/lib/features/login/domain/state/get_credential_state.dart +++ b/lib/features/login/domain/state/get_credential_state.dart @@ -3,7 +3,7 @@ import 'package:core/presentation/state/failure.dart'; import 'package:model/account/password.dart'; import 'package:model/account/user_name.dart'; -class GetCredentialViewState extends ViewState { +class GetCredentialViewState extends UIState { final Uri baseUrl; final UserName userName; final Password password; diff --git a/lib/features/login/domain/usecases/delete_credential_interactor.dart b/lib/features/login/domain/usecases/delete_credential_interactor.dart new file mode 100644 index 000000000..6f796b201 --- /dev/null +++ b/lib/features/login/domain/usecases/delete_credential_interactor.dart @@ -0,0 +1,25 @@ +import 'dart:core'; + +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/state/delete_credential_state.dart'; + +class DeleteCredentialInteractor { + final CredentialRepository credentialRepository; + + DeleteCredentialInteractor(this.credentialRepository); + + Future> execute() async { + try { + await Future.wait([ + credentialRepository.removeBaseUrl(), + credentialRepository.removeUserName(), + credentialRepository.removePassword() + ]); + return Right(DeleteCredentialSuccess()); + } catch (exception) { + return Left(DeleteCredentialFailure(exception)); + } + } +} \ No newline at end of file diff --git a/lib/features/login/presentation/login_controller.dart b/lib/features/login/presentation/login_controller.dart index 791ba62c7..e116792a8 100644 --- a/lib/features/login/presentation/login_controller.dart +++ b/lib/features/login/presentation/login_controller.dart @@ -60,7 +60,7 @@ class LoginController extends GetxController { loginState.value = LoginState(Right(success)); _dynamicUrlInterceptors.changeBaseUrl(_urlText); _authorizationInterceptors.changeAuthorization(_userNameText, _passwordText); - Get.offNamed(AppRoutes.MAILBOX_DASHBOARD); + Get.offNamed(AppRoutes.SESSION); } void _loginFailureAction(AuthenticationUserFailure failure) { diff --git a/lib/features/mailbox/presentation/mailbox_bindings.dart b/lib/features/mailbox/presentation/mailbox_bindings.dart index ced384163..a71d96dc8 100644 --- a/lib/features/mailbox/presentation/mailbox_bindings.dart +++ b/lib/features/mailbox/presentation/mailbox_bindings.dart @@ -1,5 +1,9 @@ import 'package:core/core.dart'; import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; @@ -12,6 +16,9 @@ import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_b class MailboxBindings extends Bindings { @override void dependencies() { + Get.lazyPut(() => CredentialRepositoryImpl(Get.find())); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => DeleteCredentialInteractor(Get.find())); Get.lazyPut(() => MailboxDataSourceImpl(Get.find())); Get.lazyPut(() => Get.find()); Get.lazyPut(() => MailboxRepositoryImpl(Get.find())); @@ -20,6 +27,7 @@ class MailboxBindings extends Bindings { Get.lazyPut(() => TreeBuilder()); Get.lazyPut(() => MailboxController( Get.find(), + Get.find(), Get.find(), Get.find())); } diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index d86a780d7..7ab15cd88 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -6,12 +6,12 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; -import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:model/mailbox/select_mode.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/mailbox/domain/constants/mailbox_constants.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_node.dart'; @@ -23,12 +23,13 @@ import 'package:tmail_ui_user/main/routes/app_routes.dart'; class MailboxController extends BaseController { final GetAllMailboxInteractor _getAllMailboxInteractor; + final DeleteCredentialInteractor _deleteCredentialInteractor; final TreeBuilder _treeBuilder; final ResponsiveUtils responsiveUtils; final mailboxDashBoardController = Get.find(); - MailboxController(this._getAllMailboxInteractor, this._treeBuilder, this.responsiveUtils); + MailboxController(this._getAllMailboxInteractor, this._deleteCredentialInteractor, this._treeBuilder, this.responsiveUtils); final folderMailboxTree = MailboxTree(MailboxNode.root()).obs; final selectedMailbox = PresentationMailbox.createMailboxEmpty().obs; @@ -36,11 +37,13 @@ class MailboxController extends BaseController { @override void onReady() { super.onReady(); - getAllMailboxAction(); + if (mailboxDashBoardController.sessionCurrent != null) { + getAllMailboxAction( + mailboxDashBoardController.sessionCurrent!.accounts.keys.first); + } } - - void getAllMailboxAction() async { - final AccountId accountId = AccountId(Id('3ce33c876a726662c627746eb9537a1d13c2338193ef27bd051a3ce5c0fe5b12')); + + void getAllMailboxAction(AccountId accountId) async { consumeState(_getAllMailboxInteractor.execute(accountId)); } @@ -101,7 +104,12 @@ class MailboxController extends BaseController { keyWidgetMailboxDashBoard.currentState?.openEndDrawer(); } + void _deleteCredential() async { + await _deleteCredentialInteractor.execute(); + } + void closeMailboxScreen() { + _deleteCredential(); Get.offAllNamed(AppRoutes.LOGIN); } } \ No newline at end of file diff --git a/lib/features/mailbox/presentation/mailbox_view.dart b/lib/features/mailbox/presentation/mailbox_view.dart index c73fcbc0f..7ef9a6f89 100644 --- a/lib/features/mailbox/presentation/mailbox_view.dart +++ b/lib/features/mailbox/presentation/mailbox_view.dart @@ -39,7 +39,9 @@ class MailboxView extends GetWidget { left: false, child: RefreshIndicator( color: AppColor.primaryColor, - onRefresh: () async => controller.getAllMailboxAction(), + onRefresh: () async => mailboxDashBoardController.sessionCurrent != null + ? controller.getAllMailboxAction(mailboxDashBoardController.sessionCurrent!.accounts.keys.first) + : null, child: SingleChildScrollView( physics: AlwaysScrollableScrollPhysics(), child: Padding( diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 0e5f29087..a4038d4d1 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; @@ -9,6 +10,7 @@ class MailboxDashBoardController extends BaseController { final scaffoldKey = GlobalKey(); final mailboxCurrent = PresentationMailbox.createMailboxEmpty().obs; final mailCurrent = PresentationThread.createThreadEmpty().obs; + Session? sessionCurrent; MailboxDashBoardController(); @@ -25,4 +27,8 @@ class MailboxDashBoardController extends BaseController { @override void onError(error) { } + + void setSessionCurrent(Session session) { + sessionCurrent = session; + } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart index ad167dd16..92d6b8984 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart @@ -1,6 +1,7 @@ import 'package:core/core.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:tmail_ui_user/features/mail/presentation/mail_view.dart'; import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_view.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; @@ -12,6 +13,9 @@ class MailboxDashBoardView extends GetWidget { @override Widget build(BuildContext context) { + final arguments = Get.arguments as Session; + controller.setSessionCurrent(arguments); + return Scaffold( key: controller.scaffoldKey, drawer: responsiveUtils.isMobile(context) diff --git a/lib/features/session/presentation/session_bindings.dart b/lib/features/session/presentation/session_bindings.dart new file mode 100644 index 000000000..de3f01f61 --- /dev/null +++ b/lib/features/session/presentation/session_bindings.dart @@ -0,0 +1,27 @@ +import 'package:get/get.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart'; +import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; +import 'package:tmail_ui_user/features/session/data/datasource/session_datasource.dart'; +import 'package:tmail_ui_user/features/session/data/datasource_impl/session_datasource_impl.dart'; +import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; +import 'package:tmail_ui_user/features/session/data/repository/session_repository_impl.dart'; +import 'package:tmail_ui_user/features/session/domain/repository/session_repository.dart'; +import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; +import 'package:tmail_ui_user/features/session/presentation/session_controller.dart'; + +class SessionBindings extends Bindings { + @override + void dependencies() { + Get.lazyPut(() => SessionDataSourceImpl(Get.find())); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => SessionRepositoryImpl(Get.find())); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => GetSessionInteractor(Get.find())); + Get.lazyPut(() => CredentialRepositoryImpl(Get.find())); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => DeleteCredentialInteractor(Get.find())); + Get.lazyPut(() => SessionController(Get.find(), Get.find())); + } +} \ No newline at end of file diff --git a/lib/features/session/presentation/session_controller.dart b/lib/features/session/presentation/session_controller.dart new file mode 100644 index 000000000..87efb250e --- /dev/null +++ b/lib/features/session/presentation/session_controller.dart @@ -0,0 +1,38 @@ +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart'; +import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; +import 'package:tmail_ui_user/features/session/domain/usecases/get_session_interactor.dart'; +import 'package:tmail_ui_user/main/routes/app_routes.dart'; + +class SessionController extends GetxController { + final GetSessionInteractor _getSessionInteractor; + final DeleteCredentialInteractor _deleteCredentialInteractor; + + SessionController(this._getSessionInteractor, this._deleteCredentialInteractor); + + @override + void onReady() { + super.onReady(); + _getSession(); + } + + void _getSession() async { + await _getSessionInteractor.execute() + .then((response) => response.fold( + (failure) => _goToLogin(), + (success) => success is GetSessionSuccess ? _goToMailboxDashBoard(success) : _goToLogin())); + } + + void _deleteCredential() async { + await _deleteCredentialInteractor.execute(); + } + + void _goToLogin() { + _deleteCredential(); + Get.offNamed(AppRoutes.LOGIN); + } + + void _goToMailboxDashBoard(GetSessionSuccess getSessionSuccess) { + Get.offNamed(AppRoutes.MAILBOX_DASHBOARD, arguments: getSessionSuccess.session); + } +} \ No newline at end of file diff --git a/lib/features/session/presentation/session_view.dart b/lib/features/session/presentation/session_view.dart new file mode 100644 index 000000000..0ef839bfd --- /dev/null +++ b/lib/features/session/presentation/session_view.dart @@ -0,0 +1,20 @@ +import 'package:core/core.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/session/presentation/session_controller.dart'; + +class SessionView extends GetWidget { + + @override + Widget build(BuildContext context) { + return Container( + color: AppColor.primaryColor, + child: SizedBox( + width: 100, + height: 100, + child: CupertinoActivityIndicator(), + ), + ); + } +} \ No newline at end of file diff --git a/lib/main/bindings/network/network_bindings.dart b/lib/main/bindings/network/network_bindings.dart index b58dc7911..b00f77b32 100644 --- a/lib/main/bindings/network/network_bindings.dart +++ b/lib/main/bindings/network/network_bindings.dart @@ -7,6 +7,7 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/http/http_client.dart' as JmapHttpClient; import 'package:tmail_ui_user/features/login/data/network/login_api.dart'; import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart'; +import 'package:tmail_ui_user/features/session/data/network/session_api.dart'; class NetworkBindings extends Bindings { @@ -45,5 +46,6 @@ class NetworkBindings extends Bindings { Get.put(JmapHttpClient.HttpClient(Get.find())); Get.put(LoginAPI(Get.find())); Get.put(MailboxAPI(Get.find())); + Get.put(SessionAPI(Get.find())); } } \ No newline at end of file diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index 753a843f4..d0f3128ba 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -11,6 +11,8 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_da import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_view.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_bindings.dart'; import 'package:tmail_ui_user/features/thread/presentation/thread_view.dart'; +import 'package:tmail_ui_user/features/session/presentation/session_bindings.dart'; +import 'package:tmail_ui_user/features/session/presentation/session_view.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; class AppPages { @@ -23,6 +25,10 @@ class AppPages { name: AppRoutes.LOGIN, page: () => LoginView(), binding: LoginBindings()), + GetPage( + name: AppRoutes.SESSION, + page: () => SessionView(), + binding: SessionBindings()), GetPage( name: AppRoutes.MAILBOX, page: () => MailboxView(), diff --git a/lib/main/routes/app_routes.dart b/lib/main/routes/app_routes.dart index ddf13f409..f5b4d59e7 100644 --- a/lib/main/routes/app_routes.dart +++ b/lib/main/routes/app_routes.dart @@ -5,4 +5,5 @@ abstract class AppRoutes { static const MAILBOX_DASHBOARD = '/mailboxDashBoard'; static const THREAD = '$MAILBOX_DASHBOARD/thread'; static const MAIL = '$THREAD/mail'; + static const SESSION = '/session'; } \ No newline at end of file diff --git a/model/pubspec.yaml b/model/pubspec.yaml index 483388693..5a8443883 100644 --- a/model/pubspec.yaml +++ b/model/pubspec.yaml @@ -37,8 +37,8 @@ dependencies: # jmap_dart_client jmap_dart_client: git: - url: git://github.com/hoangdat/jmap-dart-client.git - ref: get_session_dat + url: git://github.com/dab246/jmap-dart-client.git + ref: fixbug_get_session dev_dependencies: flutter_test: diff --git a/pubspec.yaml b/pubspec.yaml index b86cdcd51..273072df5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -77,8 +77,8 @@ dependencies: # jmap_dart_client jmap_dart_client: git: - url: git://github.com/hoangdat/jmap-dart-client.git - ref: get_session_dat + url: git://github.com/dab246/jmap-dart-client.git + ref: fixbug_get_session dev_dependencies: flutter_test: