diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart new file mode 100644 index 000000000..d015b7820 --- /dev/null +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -0,0 +1,93 @@ +import 'package:core/data/network/config/authorization_interceptors.dart'; +import 'package:core/data/network/config/dynamic_url_interceptors.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +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/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'; +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'; +import 'package:tmail_ui_user/main/routes/route_navigation.dart'; + +abstract class ReloadableController extends BaseController { + final GetCredentialInteractor _getCredentialInteractor = Get.find(); + final DynamicUrlInterceptors _dynamicUrlInterceptors = Get.find(); + final AuthorizationInterceptors _authorizationInterceptors = Get.find(); + final GetSessionInteractor _getSessionInteractor = Get.find(); + final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find(); + + ReloadableController(); + + @override + void onData(Either newState) { + super.onData(newState); + viewState.value.fold( + (failure) { + if (failure is GetCredentialFailure) { + goToLogin(); + } else if (failure is GetSessionFailure) { + _handleGetSessionFailure(); + } + }, + (success) { + if (success is GetCredentialViewState) { + _handleGetCredentialSuccess(success); + } else if (success is GetSessionSuccess) { + _handleGetSessionSuccess(success); + } + } + ); + } + + /* + * trigger reload by getting Credential again then setting up Interceptor and retrieving session + * */ + void reload() { + _getCredentialAction(); + } + + void _getCredentialAction() { + consumeState(_getCredentialInteractor.execute().asStream()); + } + + void goToLogin() { + pushAndPopAll(AppRoutes.LOGIN); + } + + void _setUpInterceptors(GetCredentialViewState credentialViewState) { + _dynamicUrlInterceptors.changeBaseUrl(credentialViewState.baseUrl.origin); + _authorizationInterceptors.changeAuthorization( + credentialViewState.userName.userName, + credentialViewState.password.value, + ); + } + + void _handleGetCredentialSuccess(GetCredentialViewState credentialViewState) { + _setUpInterceptors(credentialViewState); + _getSessionAction(); + } + + void _getSessionAction() { + consumeState(_getSessionInteractor.execute().asStream()); + } + + void _handleGetSessionFailure() { + _deleteCredentialAction(); + goToLogin(); + } + + void _deleteCredentialAction() async { + await _deleteCredentialInteractor.execute(); + } + + void _handleGetSessionSuccess(GetSessionSuccess success) { + handleReloaded(success.session); + } + + void handleReloaded(Session session) {} +} \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart index cb8cb90fe..db8121e55 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_bindings.dart @@ -1,6 +1,5 @@ import 'package:core/core.dart'; import 'package:get/get.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; @@ -11,7 +10,6 @@ import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/repository/email_repository_impl.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/presentation/email_bindings.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/mailbox/presentation/mailbox_bindings.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_user_profile_interactor.dart'; @@ -31,12 +29,7 @@ class MailboxDashBoardBindings extends BaseBindings { @override void bindingsController() { - Get.put(MailboxDashBoardController( - Get.find(), - Get.find(), - Get.find(), - Get.find(), - )); + Get.put(MailboxDashBoardController()); } @override @@ -62,13 +55,11 @@ class MailboxDashBoardBindings extends BaseBindings { @override void bindingsRepository() { - Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); } @override void bindingsRepositoryImpl() { - Get.lazyPut(() => CredentialRepositoryImpl(Get.find())); Get.lazyPut(() => EmailRepositoryImpl( Get.find(), Get.find() diff --git a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart index 9d539c209..42496a06e 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart @@ -1,5 +1,6 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; @@ -7,7 +8,7 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/base/reloadable/reloadable_controller.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'; @@ -26,12 +27,12 @@ import 'package:tmail_ui_user/features/thread/presentation/model/search_status.d import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/router_arguments.dart'; -class MailboxDashBoardController extends BaseController { +class MailboxDashBoardController extends ReloadableController { - final GetUserProfileInteractor _getUserProfileInteractor; - final AppToast _appToast; - final ImagePaths _imagePaths; - final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor; + final GetUserProfileInteractor _getUserProfileInteractor = Get.find(); + final AppToast _appToast = Get.find(); + final ImagePaths _imagePaths = Get.find(); + final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find(); final scaffoldKey = GlobalKey(); final selectedMailbox = Rxn(); @@ -50,16 +51,12 @@ class MailboxDashBoardController extends BaseController { FocusNode searchFocus = FocusNode(); RouterArguments? routerArguments; - MailboxDashBoardController( - this._getUserProfileInteractor, - this._appToast, - this._imagePaths, - this._removeEmailDraftsInteractor, - ); + MailboxDashBoardController(); @override void onReady() { super.onReady(); + log('MailboxDashBoardController::onReady()'); _setSessionCurrent(); _getUserProfile(); } @@ -132,9 +129,14 @@ class MailboxDashBoardController extends BaseController { void _setSessionCurrent() { Future.delayed(const Duration(milliseconds: 100), () { final arguments = Get.arguments; + log('MailboxDashBoardController::_setSessionCurrent(): arguments = $arguments'); if (arguments is Session) { sessionCurrent = Get.arguments as Session; accountId.value = sessionCurrent?.accounts.keys.first; + } else { + if (kIsWeb) { + reload(); + } } }); } @@ -245,6 +247,12 @@ class MailboxDashBoardController extends BaseController { dashBoardAction.value = action; } + @override + void handleReloaded(Session session) { + sessionCurrent = session; + accountId.value = sessionCurrent?.accounts.keys.first; + } + @override void onClose() { searchInputController.dispose();