diff --git a/lib/features/base/base_controller.dart b/lib/features/base/base_controller.dart index 5e282e926..fe483b0a4 100644 --- a/lib/features/base/base_controller.dart +++ b/lib/features/base/base_controller.dart @@ -28,6 +28,7 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:model/model.dart'; import 'package:rule_filter/rule_filter/capability_rule_filter.dart'; import 'package:tmail_ui_user/features/base/before_reconnect_manager.dart'; +import 'package:tmail_ui_user/features/base/mixin/logout_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart'; import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; @@ -73,7 +74,8 @@ import 'package:uuid/uuid.dart'; abstract class BaseController extends GetxController with MessageDialogActionMixin, - PopupContextMenuActionMixin { + PopupContextMenuActionMixin, + LogoutMixin { final CachingManager cachingManager = Get.find(); final LanguageCacheManager languageCacheManager = Get.find(); @@ -437,11 +439,28 @@ abstract class BaseController extends GetxController arguments: LoginArguments(LoginFormType.none)); } - void logout(Session? session, AccountId? accountId) async { + void logout( + BuildContext context, + Session? session, + AccountId? accountId, + ) { + if (PlatformInfo.isMobile) { + showLogoutConfirmDialog( + context: context, + username: session?.username.value ?? '', + onConfirmAction: () => _handleLogoutAction(session, accountId), + ); + } else { + _handleLogoutAction(session, accountId); + } + } + + Future _handleLogoutAction(Session? session, AccountId? accountId) async { if (session == null || accountId == null) { await clearDataAndGoToLoginPage(); return; } + _isFcmEnabled = _isFcmActivated(session, accountId); if (isAuthenticatedWithOidc) { consumeState(logoutOidcInteractor.execute()); diff --git a/lib/features/base/mixin/logout_mixin.dart b/lib/features/base/mixin/logout_mixin.dart new file mode 100644 index 000000000..24b55faf3 --- /dev/null +++ b/lib/features/base/mixin/logout_mixin.dart @@ -0,0 +1,48 @@ +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/material.dart'; +import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +mixin LogoutMixin implements MessageDialogActionMixin { + void showLogoutConfirmDialog({ + required BuildContext context, + required String username, + required Function? onConfirmAction, + }) { + final appLocalizations = AppLocalizations.of(context); + + showConfirmDialogAction( + context, + '', + appLocalizations.yesLogout, + title: appLocalizations.logoutConfirmation, + alignCenter: true, + outsideDismissible: false, + titleActionButtonMaxLines: 1, + titlePadding: const EdgeInsetsDirectional.only( + start: 24, + top: 24, + end: 24, + bottom: 12, + ), + messageStyle: const TextStyle( + color: AppColor.colorTextBody, + fontSize: 15, + fontWeight: FontWeight.w400, + ), + listTextSpan: [ + TextSpan(text: AppLocalizations.of(context).messageConfirmationLogout), + TextSpan( + text: ' $username', + style: Theme.of(context).textTheme.bodyLarge?.copyWith( + color: AppColor.colorTextBody, + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + const TextSpan(text: '?'), + ], + onConfirmAction: onConfirmAction, + ); + } +} diff --git a/lib/features/base/mixin/message_dialog_action_mixin.dart b/lib/features/base/mixin/message_dialog_action_mixin.dart index 3756683cb..168ca43c7 100644 --- a/lib/features/base/mixin/message_dialog_action_mixin.dart +++ b/lib/features/base/mixin/message_dialog_action_mixin.dart @@ -37,11 +37,17 @@ mixin MessageDialogActionMixin { PopInvokedCallback? onPopInvoked, bool isArrangeActionButtonsVertical = false, int? titleActionButtonMaxLines, + EdgeInsetsGeometry? titlePadding, } ) async { final responsiveUtils = Get.find(); final imagePaths = Get.find(); + final paddingTitle = titlePadding ?? + (icon != null + ? const EdgeInsetsDirectional.only(top: 24, start: 24, end: 24) + : const EdgeInsetsDirectional.symmetric(horizontal: 24)); + if (alignCenter) { final childWidget = PointerInterceptor( child: (ConfirmDialogBuilder( @@ -57,10 +63,7 @@ mixin MessageDialogActionMixin { ..colorConfirmButton(actionButtonColor ?? AppColor.colorTextButton) ..colorCancelButton(cancelButtonColor ?? AppColor.colorCancelButton) ..marginIcon(icon != null ? (marginIcon ?? const EdgeInsets.only(top: 24)) : null) - ..paddingTitle(icon != null - ? const EdgeInsetsDirectional.only(top: 24, start: 24, end: 24) - : const EdgeInsetsDirectional.symmetric(horizontal: 24) - ) + ..paddingTitle(paddingTitle) ..radiusButton(12) ..paddingButton(paddingButton) ..paddingContent(const EdgeInsets.only(left: 24, right: 24, bottom: 24, top: 12)) @@ -114,10 +117,7 @@ mixin MessageDialogActionMixin { ..widthDialog(responsiveUtils.getSizeScreenWidth(context)) ..colorConfirmButton(actionButtonColor ?? AppColor.colorTextButton) ..colorCancelButton(cancelButtonColor ?? AppColor.colorCancelButton) - ..paddingTitle(icon != null - ? const EdgeInsetsDirectional.only(top: 24, start: 24, end: 24) - : const EdgeInsetsDirectional.symmetric(horizontal: 24) - ) + ..paddingTitle(paddingTitle) ..marginIcon(EdgeInsets.zero) ..paddingContent(const EdgeInsets.only(left: 44, right: 44, bottom: 24, top: 12)) ..marginButton(hasCancelButton ? null : const EdgeInsets.only(bottom: 16, left: 44, right: 44)) @@ -194,9 +194,7 @@ mixin MessageDialogActionMixin { ..colorConfirmButton(actionButtonColor ?? AppColor.colorTextButton) ..colorCancelButton(cancelButtonColor ?? AppColor.colorCancelButton) ..marginIcon(icon != null ? const EdgeInsets.only(top: 24) : null) - ..paddingTitle(icon != null - ? const EdgeInsetsDirectional.only(top: 24, start: 24, end: 24) - : const EdgeInsetsDirectional.symmetric(horizontal: 24)) + ..paddingTitle(paddingTitle) ..marginIcon(EdgeInsets.zero) ..paddingContent(const EdgeInsets.only(left: 44, right: 44, bottom: 24, top: 12)) ..marginButton(hasCancelButton ? null : const EdgeInsets.only(bottom: 16, left: 44, right: 44)) 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 cf1548c37..0300f6c86 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -3077,6 +3077,7 @@ class MailboxDashBoardController extends ReloadableController onLogoutAction: () { popBack(); logout( + context, sessionCurrent, accountId.value ); 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 ae57d913a..8bd0e35f7 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -367,7 +367,7 @@ class ManageAccountDashBoardController extends ReloadableController with UserSet sessionCurrent?.username, onLogoutAction: () { popBack(); - logout(sessionCurrent, accountId.value); + logout(context, sessionCurrent, accountId.value); } ) ); 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 9c5fe7c8b..7e5b5d1af 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 @@ -103,6 +103,7 @@ class ManageAccountMenuView extends GetWidget { child: InkWell( onTap: () { controller.dashBoardController.logout( + context, controller.dashBoardController.sessionCurrent, controller.dashBoardController.accountId.value ); 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 c5de7de20..6c33f15a6 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 @@ -163,6 +163,7 @@ class SettingsFirstLevelView extends GetWidget { AppLocalizations.of(context).sign_out, controller.imagePaths.icSignOut, () => controller.manageAccountDashboardController.logout( + context, controller.manageAccountDashboardController.sessionCurrent, controller.manageAccountDashboardController.accountId.value) ), diff --git a/lib/l10n/intl_messages.arb b/lib/l10n/intl_messages.arb index e1dcb6c64..c14feccd4 100644 --- a/lib/l10n/intl_messages.arb +++ b/lib/l10n/intl_messages.arb @@ -1,5 +1,5 @@ { - "@@last_modified": "2024-12-03T10:03:02.076482", + "@@last_modified": "2024-12-05T18:34:48.830922", "initializing_data": "Initializing data...", "@initializing_data": { "type": "text", @@ -2860,6 +2860,12 @@ "placeholders_order": [], "placeholders": {} }, + "errorWhileFetchingSubaddress": "Error while fetching the subaddress", + "@errorWhileFetchingSubaddress": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, "connectedToTheInternet": "Connected to the internet", "@connectedToTheInternet": { "type": "text", @@ -4094,6 +4100,24 @@ "placeholders_order": [], "placeholders": {} }, + "yesLogout": "Yes, Log out", + "@yesLogout": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "logoutConfirmation": "Logout Confirmation", + "@logoutConfirmation": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, + "messageConfirmationLogout": "Do you want to log out of", + "@messageConfirmationLogout": { + "type": "text", + "placeholders_order": [], + "placeholders": {} + }, "getHelpOrReportABug": "Get help or report a bug", "@getHelpOrReportABug": { "type": "text", diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index a4504a2c8..0971b760e 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -4294,6 +4294,27 @@ class AppLocalizations { ); } + String get yesLogout { + return Intl.message( + 'Yes, Log out', + name: 'yesLogout', + ); + } + + String get logoutConfirmation { + return Intl.message( + 'Logout Confirmation', + name: 'logoutConfirmation', + ); + } + + String get messageConfirmationLogout { + return Intl.message( + 'Do you want to log out of', + name: 'messageConfirmationLogout', + ); + } + String get getHelpOrReportABug { return Intl.message( 'Get help or report a bug',