diff --git a/lib/features/base/reloadable/reloadable_controller.dart b/lib/features/base/reloadable/reloadable_controller.dart index cd689374a..436737211 100644 --- a/lib/features/base/reloadable/reloadable_controller.dart +++ b/lib/features/base/reloadable/reloadable_controller.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; +import 'package:fcm/model/firebase_capability.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; @@ -24,7 +25,9 @@ import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_ import 'package:tmail_ui_user/features/manage_account/domain/state/log_out_oidc_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/log_out_oidc_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_interactors_bindings.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/state/destroy_subscription_state.dart'; import 'package:tmail_ui_user/features/push_notification/domain/state/get_fcm_subscription_local.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/usecases/destroy_subscription_interactor.dart'; import 'package:tmail_ui_user/features/push_notification/domain/usecases/get_fcm_subscription_local_interactor.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/services/fcm_receiver.dart'; import 'package:tmail_ui_user/features/session/domain/state/get_session_state.dart'; @@ -33,6 +36,7 @@ import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; +import 'package:tmail_ui_user/main/utils/app_config.dart'; abstract class ReloadableController extends BaseController { final DynamicUrlInterceptors _dynamicUrlInterceptors = Get.find(); @@ -49,6 +53,7 @@ abstract class ReloadableController extends BaseController { final _fcmReceiver = FcmReceiver.instance; GetFCMSubscriptionLocalInteractor? _getSubscriptionLocalInteractor; + DestroySubscriptionInteractor? _destroySubscriptionInteractor; ReloadableController( this._logoutOidcInteractor, @@ -71,9 +76,11 @@ abstract class ReloadableController extends BaseController { _goToLogin(arguments: LoginArguments(LoginFormType.ssoForm)); } else if (failure is GetAuthenticatedAccountFailure || failure is NoAuthenticatedAccountFailure) { _goToLogin(arguments: LoginArguments(LoginFormType.credentialForm)); - } else if (failure is GetFCMSubscriptionLocalFailure){ + } else if (failure is GetFCMSubscriptionLocalFailure) { logoutAction(); - } + } else if (failure is DestroySubscriptionFailure) { + logoutAction(); + } }, (success) { if (success is GetCredentialViewState) { @@ -84,6 +91,11 @@ abstract class ReloadableController extends BaseController { handleLogoutOidcSuccess(success); } else if (success is GetStoredTokenOidcSuccess) { _handleGetStoredTokenOIDCSuccess(success); + } else if (success is GetFCMSubscriptionLocalSuccess) { + final _subscriptionId = success.fcmSubscription.subscriptionId; + _destroySubscriptionAction(_subscriptionId); + } else if (success is DestroySubscriptionSuccess) { + logoutAction(); } } ); @@ -219,4 +231,38 @@ abstract class ReloadableController extends BaseController { } return Future.value(); } + + void _destroySubscriptionAction(String subscriptionId) { + try { + _destroySubscriptionInteractor = Get.find(); + consumeState(_destroySubscriptionInteractor!.execute(subscriptionId)); + } catch(e) { + logError('ReloadableController::destroySubscriptionAction(): exception: $e'); + logoutAction(); + } + } + + bool fcmEnabled(Session? session, AccountId? accountId) { + bool _fcmEnabled = false; + try { + requireCapability(session!, accountId!, [FirebaseCapability.fcmIdentifier]); + if (AppConfig.fcmAvailable) { + _fcmEnabled = true; + } else { + _fcmEnabled = false; + } + } catch (e) { + logError('BaseController::fcmEnabled(): exception: $e'); + } + return _fcmEnabled; + } + + void logout(Session? session, AccountId? accountId) { + final _fcmEnabled = fcmEnabled(session, accountId); + if (_fcmEnabled) { + getSubscriptionLocalAction(); + } else { + logoutAction(); + } + } } \ No newline at end of file diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index 434478118..09d41daca 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -1401,6 +1401,12 @@ class MailboxDashBoardController extends ReloadableController { Get.until((route) => Get.currentRoute == AppRoutes.dashboard); } + @override + void logoutAction() { + popBack(); + super.logoutAction(); + } + @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 73bf385f7..fa0e47237 100644 --- a/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart +++ b/lib/features/mailbox_dashboard/presentation/mailbox_dashboard_view_web.dart @@ -319,8 +319,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView { controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context, controller.userProfile.value, onLogoutAction: () { - popBack(); - controller.logoutAction(); + controller.logout(controller.sessionCurrent, controller.accountId.value); }, onSettingAction: () { popBack(); diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart index 835711e1b..7fa3fa7d6 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -59,8 +59,9 @@ class ManageAccountDashBoardController extends ReloadableController { ManageAccountDashBoardController( LogoutOidcInteractor logoutOidcInteractor, DeleteAuthorityOidcInteractor deleteAuthorityOidcInteractor, - GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor - ) : super(logoutOidcInteractor, + GetAuthenticatedAccountInteractor getAuthenticatedAccountInteractor, + ) : super( + logoutOidcInteractor, deleteAuthorityOidcInteractor, getAuthenticatedAccountInteractor); @@ -298,4 +299,10 @@ class ManageAccountDashBoardController extends ReloadableController { dashboardSettingAction.value = newAction; } } + + @override + void logoutAction() { + popBack(); + super.logoutAction(); + } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart index 4901426d4..cb43e1651 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -141,10 +141,9 @@ class ManageAccountDashBoardView extends GetWidget controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context, controller.userProfile.value, - onLogoutAction: () { - popBack(); - controller.logoutAction(); - }, + onLogoutAction: () { + controller.logout(controller.sessionCurrent.value, controller.accountId.value); + }, onSettingAction: () { popBack(); controller.goToSettings(); 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 index b7c96445d..093b35006 100644 --- a/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_controller.dart @@ -65,4 +65,8 @@ class ManageAccountMenuController extends BaseController { void backToMailboxDashBoard(BuildContext context) { dashBoardController.backToMailboxDashBoard(context); } + + void logout(){ + dashBoardController.logout(dashBoardController.sessionCurrent.value, dashBoardController.accountId.value); + } } \ 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 index 0ed1efb09..509336a13 100644 --- a/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart +++ b/lib/features/manage_account/presentation/menu/manage_account_menu_view.dart @@ -97,7 +97,9 @@ class ManageAccountMenuView extends GetWidget { child: Divider(color: AppColor.lineItemListColor, height: 0.5, thickness: 0.2)), Padding(padding: const EdgeInsets.only(left: 32), child: InkWell( - onTap: () => controller.dashBoardController.logoutAction(), + onTap: () { + controller.logout(); + }, child: Row(children: [ SvgPicture.asset(_imagePaths.icSignOut, fit: BoxFit.fill), const SizedBox(width: 12), diff --git a/lib/features/manage_account/presentation/menu/settings/settings_controller.dart b/lib/features/manage_account/presentation/menu/settings/settings_controller.dart index 0c602b495..82fcc2fc4 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_controller.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_controller.dart @@ -1,11 +1,14 @@ import 'package:core/utils/app_logger.dart'; import 'package:get/get.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/menu/manage_account_menu_controller.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart'; class SettingsController extends GetxController { final manageAccountDashboardController = Get.find(); + final manageAccountMenuController = Get.find(); + void selectSettings(AccountMenuItem accountMenuItem) { log('SettingsController::selectSettings(): $accountMenuItem'); diff --git a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart index 0f03397fa..9d62ce7af 100644 --- a/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart +++ b/lib/features/manage_account/presentation/menu/settings/settings_first_level_view.dart @@ -119,7 +119,7 @@ class SettingsFirstLevelView extends GetWidget { SettingFirstLevelTileBuilder( AppLocalizations.of(context).sign_out, _imagePaths.icSignOut, - controller.manageAccountDashboardController.logoutAction + controller.manageAccountMenuController.logout, ), ]), );