diff --git a/core/lib/presentation/views/dialog/color_picker_dialog_builder.dart b/core/lib/presentation/views/dialog/color_picker_dialog_builder.dart index 4e56e8c41..4bd8b2e47 100644 --- a/core/lib/presentation/views/dialog/color_picker_dialog_builder.dart +++ b/core/lib/presentation/views/dialog/color_picker_dialog_builder.dart @@ -3,6 +3,7 @@ import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/views/button/icon_button_web.dart'; import 'package:flex_color_picker/flex_color_picker.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; typedef SelectColorActionCallback = Function(Color? colorSelected); @@ -11,7 +12,6 @@ class ColorPickerDialogBuilder { final SelectColorActionCallback? setColorActionCallback; final VoidCallback? cancelActionCallback; final VoidCallback? resetToDefaultActionCallback; - final BuildContext _context; final Color defaultColor; final ValueNotifier _currentColor; final String? title; @@ -24,7 +24,6 @@ class ColorPickerDialogBuilder { Color _colorCode = Colors.black; ColorPickerDialogBuilder( - this._context, this._currentColor, { this.onSelected, @@ -39,9 +38,9 @@ class ColorPickerDialogBuilder { } ); - Future show() async { - await showDialog(context: _context, builder: (BuildContext context) { - return PointerInterceptor( + Future show() async { + return Get.dialog( + PointerInterceptor( child: AlertDialog( title: Text( title ?? '', @@ -151,8 +150,8 @@ class ColorPickerDialogBuilder { }) ], ), - ); - }); + ) + ); } Widget _itemColorWidget(BuildContext context, Color color) { diff --git a/lib/features/composer/presentation/controller/base_rich_text_controller.dart b/lib/features/composer/presentation/controller/base_rich_text_controller.dart index d2e2b1b19..262dbd544 100644 --- a/lib/features/composer/presentation/controller/base_rich_text_controller.dart +++ b/lib/features/composer/presentation/controller/base_rich_text_controller.dart @@ -5,10 +5,10 @@ import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:html/parser.dart' show parse; import 'package:model/email/attachment.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; -import 'package:html/parser.dart' show parse; abstract class BaseRichTextController extends GetxController { @@ -21,7 +21,6 @@ abstract class BaseRichTextController extends GetxController { } ) async { await ColorPickerDialogBuilder( - context, ValueNotifier(currentColor), title: AppLocalizations.of(context).chooseAColor, textActionSetColor: AppLocalizations.of(context).setColor, diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 9467fe2af..4f6e7292f 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -1065,7 +1065,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM } void _replaceBrowserHistory() { - log('MailboxController::_updateSelectedMailboxRouteOnBrowser:selectedMailbox: ${selectedMailbox?.id}'); + log('MailboxController::_replaceBrowserHistory:selectedMailbox: ${selectedMailbox?.id}'); if (PlatformInfo.isWeb) { final selectedMailboxId = selectedMailbox?.id; final route = RouteUtils.createUrlWebLocationBar( 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 f110c1541..a0aebdbd1 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -140,6 +140,7 @@ import 'package:tmail_ui_user/main/exceptions/remote_exception.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/dialog_router.dart'; +import 'package:tmail_ui_user/main/routes/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; import 'package:tmail_ui_user/main/utils/email_receive_manager.dart'; @@ -259,7 +260,7 @@ class MailboxDashBoardController extends ReloadableController { @override void onInit() { _registerStreamListener(); - BackButtonInterceptor.add(onBackButtonInterceptor); + BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); super.onInit(); } @@ -1409,11 +1410,13 @@ class MailboxDashBoardController extends ReloadableController { void goToSettings() async { closeMailboxMenuDrawer(); + BackButtonInterceptor.removeByName(AppRoutes.dashboard); final result = await push( AppRoutes.settings, arguments: ManageAccountArguments(sessionCurrent) ); + BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); if (result is VacationResponse) { vacationResponse.value = result; dispatchMailboxUIAction(RefreshChangeMailboxAction(null)); @@ -1468,11 +1471,16 @@ class MailboxDashBoardController extends ReloadableController { } void goToVacationSetting() async { - final result = await push(AppRoutes.settings, - arguments: ManageAccountArguments( - sessionCurrent, - menuSettingCurrent: AccountMenuItem.vacation)); + BackButtonInterceptor.removeByName(AppRoutes.dashboard); + final result = await push( + AppRoutes.settings, + arguments: ManageAccountArguments( + sessionCurrent, + menuSettingCurrent: AccountMenuItem.vacation + ) + ); + BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.dashboard); if (result is VacationResponse) { vacationResponse.value = result; } @@ -2224,8 +2232,42 @@ class MailboxDashBoardController extends ReloadableController { setSelectedEmail(email.toPresentationEmail()); } - bool onBackButtonInterceptor(bool stopDefaultButtonEvent, RouteInfo routeInfo) { - log('MailboxDashBoardController::onBackButtonInterceptor:stopDefaultButtonEvent: $stopDefaultButtonEvent | routeInfo: ${routeInfo.routeWhenAdded}'); + void _replaceBrowserHistory() { + if (PlatformInfo.isWeb) { + final selectedMailboxId = selectedMailbox.value?.id; + final selectedEmailId = selectedEmail.value?.id; + final isSearchRunning = searchController.isSearchEmailRunning; + String title = ''; + if (selectedEmail.value != null) { + title = 'Email-${selectedEmailId?.asString ?? ''}'; + } else if (isSearchRunning) { + title = 'SearchEmail'; + } else { + title = 'Mailbox-${selectedMailboxId?.asString}'; + } + RouteUtils.replaceBrowserHistory( + title: title, + url: RouteUtils.createUrlWebLocationBar( + AppRoutes.dashboard, + router: NavigationRouter( + emailId: selectedEmail.value?.id, + mailboxId: isSearchRunning + ? null + : selectedMailboxId, + dashboardType: isSearchRunning + ? DashboardType.search + : DashboardType.normal, + searchQuery: isSearchRunning + ? searchController.searchQuery + : null + ) + ) + ); + } + } + + bool _navigateToScreen() { + log('MailboxDashBoardController::_navigateToScreen: dashboardRoute: $dashboardRoute'); switch(dashboardRoute.value) { case DashboardRoutes.emailDetailed: dispatchEmailUIAction(CloseEmailDetailedViewAction()); @@ -2255,8 +2297,24 @@ class MailboxDashBoardController extends ReloadableController { dispatchAction(CloseSearchEmailViewAction()); return true; default: - break; + return false; } + } + + bool get _isDialogViewOpen => Get.isOverlaysOpen == true; + + bool _onBackButtonInterceptor(bool stopDefaultButtonEvent, RouteInfo routeInfo) { + log('MailboxDashBoardController::_onBackButtonInterceptor:currentRoute: ${Get.currentRoute} | _isDialogViewOpen: $_isDialogViewOpen'); + if (_isDialogViewOpen) { + popBack(); + _replaceBrowserHistory(); + return true; + } + + if (Get.currentRoute.startsWith(AppRoutes.dashboard)) { + return _navigateToScreen(); + } + return false; } @@ -2270,7 +2328,7 @@ class MailboxDashBoardController extends ReloadableController { _refreshActionEventController.close(); _notificationManager.closeStream(); _fcmService.closeStream(); - BackButtonInterceptor.remove(onBackButtonInterceptor); + BackButtonInterceptor.removeByName(AppRoutes.dashboard); MailboxDashBoardBindings().deleteController(); super.onClose(); } 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 b53cd03d9..f29a91a2a 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_controller.dart @@ -1,4 +1,5 @@ +import 'package:back_button_interceptor/back_button_interceptor.dart'; import 'package:core/core.dart'; import 'package:flutter/material.dart'; import 'package:forward/forward/capability_forward.dart'; @@ -31,6 +32,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vaca import 'package:tmail_ui_user/main/error/capability_validator.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/navigation_router.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_utils.dart'; @@ -48,6 +50,13 @@ class ManageAccountDashBoardController extends ReloadableController { final dashboardSettingAction = Rxn(); Session? sessionCurrent; + bool? isVacationDateDialogDisplayed; + + @override + void onInit() { + BackButtonInterceptor.add(_onBackButtonInterceptor, name: AppRoutes.settings); + super.onInit(); + } @override void onReady() { @@ -74,16 +83,17 @@ class ManageAccountDashBoardController extends ReloadableController { @override void handleReloaded(Session session) { + log('ManageAccountDashBoardController::handleReloaded:'); sessionCurrent = session; accountId.value = session.personalAccount.accountId; _getUserProfile(); _bindingInteractorForMenuItemView(sessionCurrent, accountId.value); _getVacationResponse(); + _getParametersRouter(); } void _getArguments() { final arguments = Get.arguments; - log('ManageAccountDashBoardController::_getArguments(): $arguments'); if (arguments is ManageAccountArguments) { sessionCurrent = arguments.session; accountId.value = arguments.session?.personalAccount.accountId; @@ -91,13 +101,28 @@ class ManageAccountDashBoardController extends ReloadableController { _bindingInteractorForMenuItemView(sessionCurrent, accountId.value); _getVacationResponse(); if (arguments.menuSettingCurrent != null) { - _goToSettingMenuCurrent(arguments.menuSettingCurrent!); + selectAccountMenuItem(arguments.menuSettingCurrent!); } } else if (PlatformInfo.isWeb) { reload(); } } + void _getParametersRouter() { + final parameters = Get.parameters; + log('ManageAccountDashBoardController::_getParametersRouter:parameters: $parameters'); + final navigationRouter = RouteUtils.parsingRouteParametersToNavigationRouter(parameters); + log('ManageAccountDashBoardController::_getParametersRouter:navigationRouter: $navigationRouter'); + if (navigationRouter.accountMenuItem == AccountMenuItem.none && + currentContext != null && + responsiveUtils.isWebDesktop(currentContext!) + ) { + selectAccountMenuItem(AccountMenuItem.profiles); + } else { + selectAccountMenuItem(navigationRouter.accountMenuItem); + } + } + void _initialPageLevel() { if (currentContext != null && responsiveUtils.isWebDesktop(currentContext!)) { settingsPageLevel.value = SettingsPageLevel.level1; @@ -154,6 +179,7 @@ class ManageAccountDashBoardController extends ReloadableController { clearInputFormView(); _bindingControllerMenuItemView(newAccountMenuItem); accountMenuItemSelected.value = newAccountMenuItem; + _replaceBrowserHistory(); } void _bindingControllerMenuItemView(AccountMenuItem item) { @@ -189,17 +215,15 @@ class ManageAccountDashBoardController extends ReloadableController { } } - void _goToSettingMenuCurrent(AccountMenuItem accountMenuItem) { - selectAccountMenuItem(accountMenuItem); - } - void goToSettings() { - popAndPush(AppRoutes.settings, - arguments: ManageAccountArguments(sessionCurrent)); + popAndPush( + AppRoutes.settings, + arguments: ManageAccountArguments(sessionCurrent) + ); } - void backToMailboxDashBoard(BuildContext context) { - if (canBack(context)) { + void backToMailboxDashBoard({BuildContext? context}) { + if (context != null && canBack(context)) { popBack(result: vacationResponse.value); } else { log('ManageAccountDashBoardController::backToMailboxDashBoard(): canBack: FALSE'); @@ -269,10 +293,86 @@ class ManageAccountDashBoardController extends ReloadableController { } } - Future backButtonPressedCallbackAction(BuildContext context) async { - if (PlatformInfo.isMobile) { - backToMailboxDashBoard(context); + void selectSettings(AccountMenuItem accountMenuItem) { + log('ManageAccountDashBoardController::selectSettings(): $accountMenuItem'); + selectAccountMenuItem(accountMenuItem); + settingsPageLevel.value = SettingsPageLevel.level1; + } + + void backToUniversalSettings() { + log('ManageAccountDashBoardController::backToUniversalSettings()'); + clearInputFormView(); + selectAccountMenuItem(AccountMenuItem.none); + settingsPageLevel.value = SettingsPageLevel.universal; + _replaceBrowserHistory(); + } + + void _replaceBrowserHistory() { + if (PlatformInfo.isWeb) { + RouteUtils.replaceBrowserHistory( + title: accountMenuItemSelected.value == AccountMenuItem.none + ? 'Setting' + : 'Setting-${accountMenuItemSelected.value.getAliasBrowser()}', + url: RouteUtils.createUrlWebLocationBar( + AppRoutes.settings, + router: NavigationRouter(accountMenuItem: accountMenuItemSelected.value) + ) + ); } + } + + bool _navigateToScreen() { + log('ManageAccountDashBoardController::_navigateToScreen: settingsPageLevel: $settingsPageLevel'); + if (PlatformInfo.isMobile) { + switch(settingsPageLevel.value) { + case SettingsPageLevel.level1: + backToUniversalSettings(); + return true; + case SettingsPageLevel.universal: + return false; + } + } else { + if (currentContext != null && responsiveUtils.isWebDesktop(currentContext!)) { + if (accountMenuItemSelected.value == AccountMenuItem.profiles) { + backToMailboxDashBoard(context: currentContext); + return true; + } else { + selectSettings(AccountMenuItem.profiles); + return true; + } + } else { + switch(settingsPageLevel.value) { + case SettingsPageLevel.level1: + backToUniversalSettings(); + return true; + case SettingsPageLevel.universal: + backToMailboxDashBoard(context: currentContext); + return true; + } + } + } + } + + bool get _isDialogViewOpen => Get.isOverlaysOpen == true; + + bool _onBackButtonInterceptor(bool stopDefaultButtonEvent, RouteInfo routeInfo) { + log('ManageAccountDashBoardController::_onBackButtonInterceptor:currentRoute: ${Get.currentRoute} | _isDialogViewOpen: $_isDialogViewOpen'); + if (_isDialogViewOpen || isVacationDateDialogDisplayed == true) { + popBack(); + _replaceBrowserHistory(); + return true; + } + + if (Get.currentRoute.startsWith(AppRoutes.settings)) { + return _navigateToScreen(); + } + return false; } + + @override + void onClose() { + BackButtonInterceptor.removeByName(AppRoutes.settings); + super.onClose(); + } } \ 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 b66dba9c6..2afbbaddb 100644 --- a/lib/features/manage_account/presentation/manage_account_dashboard_view.dart +++ b/lib/features/manage_account/presentation/manage_account_dashboard_view.dart @@ -8,19 +8,19 @@ import 'package:core/utils/platform_info.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/extensions/vacation_response_extension.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; -import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_view.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/extensions/vacation_response_extension.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/forward/forward_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/language_and_region/language_and_region_view.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/mailbox_visibility/mailbox_visibility_view.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_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings/settings_view.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/menu/settings_utils.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/profiles/profiles_view.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/vacation/vacation_view.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widgets/vacation_notification_message_widget.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -31,96 +31,93 @@ class ManageAccountDashBoardView extends GetWidget controller.backButtonPressedCallbackAction.call(context), - child: Scaffold( - backgroundColor: Colors.white, - drawerEnableOpenDragGesture: false, - body: GestureDetector( - onTap: () => FocusScope.of(context).unfocus(), - child: ResponsiveWidget( - responsiveUtils: controller.responsiveUtils, - desktop: Column(children: [ - Row(children: [ - Container(width: 256, color: Colors.white, - padding: SettingsUtils.getPaddingHeaderSetting(context), - child: Row(children: [ - SloganBuilder( - sizeLogo: 24, - text: AppLocalizations.of(context).app_name, - textAlign: TextAlign.center, - textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), - logoSVG: controller.imagePaths.icTMailLogo, - onTapCallback: () => controller.backToMailboxDashBoard(context), - ), - 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: SettingsUtils.getPaddingRightHeaderSetting(context), - child: _buildRightHeader(context))) - ]), - Expanded(child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox( - width: ResponsiveUtils.defaultSizeMenu, - child: ManageAccountMenuView() - ), - Expanded(child: Container( - color: AppColor.colorBgDesktop, - child: Column(children: [ - Obx(() { - if (controller.vacationResponse.value?.vacationResponderIsValid == true) { - return VacationNotificationMessageWidget( - margin: const EdgeInsets.only( - top: 16, - left: PlatformInfo.isWeb ? 24 : 16, - right: PlatformInfo.isWeb ? 24 : 16), - fromAccountDashBoard: true, - vacationResponse: controller.vacationResponse.value!, - actionGotoVacationSetting: !controller.inVacationSettings() - ? () => controller.selectAccountMenuItem(AccountMenuItem.vacation) - : null, - actionEndNow: () => controller.disableVacationResponder()); - } else if ((controller.vacationResponse.value?.vacationResponderIsWaiting == true - || controller.vacationResponse.value?.vacationResponderIsStopped == true) - && controller.accountMenuItemSelected.value == AccountMenuItem.vacation) { - return VacationNotificationMessageWidget( - margin: const EdgeInsets.only( - top: 16, - left: PlatformInfo.isWeb ? 24 : 16, - right: PlatformInfo.isWeb ? 24 : 16), - fromAccountDashBoard: true, - vacationResponse: controller.vacationResponse.value!, - padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), - leadingIcon: const Padding( - padding: EdgeInsets.only(right: 16), - child: Icon(Icons.timer, size: 20), - )); - } else { - return const SizedBox.shrink(); - } - }), - Expanded(child: _viewDisplayedOfAccountMenuItem()) - ]), - )) - ], - )) + return Scaffold( + backgroundColor: Colors.white, + drawerEnableOpenDragGesture: false, + body: GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: ResponsiveWidget( + responsiveUtils: controller.responsiveUtils, + desktop: Column(children: [ + Row(children: [ + Container(width: 256, color: Colors.white, + padding: SettingsUtils.getPaddingHeaderSetting(context), + child: Row(children: [ + SloganBuilder( + sizeLogo: 24, + text: AppLocalizations.of(context).app_name, + textAlign: TextAlign.center, + textStyle: const TextStyle(color: Colors.black, fontSize: 20, fontWeight: FontWeight.bold), + logoSVG: controller.imagePaths.icTMailLogo, + onTapCallback: () => controller.backToMailboxDashBoard(context: context), + ), + 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: SettingsUtils.getPaddingRightHeaderSetting(context), + child: _buildRightHeader(context))) ]), - mobile: SettingsView(closeAction: () => controller.backToMailboxDashBoard(context)) - ), + Expanded(child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + width: ResponsiveUtils.defaultSizeMenu, + child: ManageAccountMenuView() + ), + Expanded(child: Container( + color: AppColor.colorBgDesktop, + child: Column(children: [ + Obx(() { + if (controller.vacationResponse.value?.vacationResponderIsValid == true) { + return VacationNotificationMessageWidget( + margin: const EdgeInsets.only( + top: 16, + left: PlatformInfo.isWeb ? 24 : 16, + right: PlatformInfo.isWeb ? 24 : 16), + fromAccountDashBoard: true, + vacationResponse: controller.vacationResponse.value!, + actionGotoVacationSetting: !controller.inVacationSettings() + ? () => controller.selectAccountMenuItem(AccountMenuItem.vacation) + : null, + actionEndNow: () => controller.disableVacationResponder()); + } else if ((controller.vacationResponse.value?.vacationResponderIsWaiting == true + || controller.vacationResponse.value?.vacationResponderIsStopped == true) + && controller.accountMenuItemSelected.value == AccountMenuItem.vacation) { + return VacationNotificationMessageWidget( + margin: const EdgeInsets.only( + top: 16, + left: PlatformInfo.isWeb ? 24 : 16, + right: PlatformInfo.isWeb ? 24 : 16), + fromAccountDashBoard: true, + vacationResponse: controller.vacationResponse.value!, + padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 16), + leadingIcon: const Padding( + padding: EdgeInsets.only(right: 16), + child: Icon(Icons.timer, size: 20), + )); + } else { + return const SizedBox.shrink(); + } + }), + Expanded(child: _viewDisplayedOfAccountMenuItem()) + ]), + )) + ], + )) + ]), + mobile: SettingsView(closeAction: () => controller.backToMailboxDashBoard(context: context)) ), ), ); 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 ac14cf767..72333386a 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 @@ -61,6 +61,6 @@ class ManageAccountMenuController extends GetxController { } void backToMailboxDashBoard(BuildContext context) { - dashBoardController.backToMailboxDashBoard(context); + dashBoardController.backToMailboxDashBoard(context: context); } } \ No newline at end of file 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 84b92ebc9..737441701 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,9 @@ import 'package:core/presentation/resources/image_paths.dart'; import 'package:core/presentation/utils/responsive_utils.dart'; -import 'package:core/utils/app_logger.dart'; import 'package:flutter/cupertino.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/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(); @@ -13,18 +11,9 @@ class SettingsController extends GetxController { final imagePaths = Get.find(); final settingScrollController = ScrollController(); - void selectSettings(AccountMenuItem accountMenuItem) { - log('SettingsController::selectSettings(): $accountMenuItem'); - manageAccountDashboardController.selectAccountMenuItem(accountMenuItem); - manageAccountDashboardController.settingsPageLevel.value = SettingsPageLevel.level1; - } + void selectSettings(AccountMenuItem accountMenuItem) => manageAccountDashboardController.selectSettings(accountMenuItem); - void backToUniversalSettings() { - log('SettingsController::backToUniversalSettings()'); - manageAccountDashboardController.clearInputFormView(); - manageAccountDashboardController.selectAccountMenuItem(AccountMenuItem.none); - manageAccountDashboardController.settingsPageLevel.value = SettingsPageLevel.universal; - } + void backToUniversalSettings() => manageAccountDashboardController.backToUniversalSettings(); @override void onClose() { diff --git a/lib/features/manage_account/presentation/model/account_menu_item.dart b/lib/features/manage_account/presentation/model/account_menu_item.dart index fecdb722a..79e36e6a9 100644 --- a/lib/features/manage_account/presentation/model/account_menu_item.dart +++ b/lib/features/manage_account/presentation/model/account_menu_item.dart @@ -49,4 +49,23 @@ enum AccountMenuItem { return AppLocalizations.of(context).profiles; } } + + String getAliasBrowser() { + switch(this) { + case AccountMenuItem.profiles: + return 'profiles'; + case AccountMenuItem.languageAndRegion: + return 'language-region'; + case AccountMenuItem.emailRules: + return 'email-rules'; + case AccountMenuItem.forward: + return 'forwarding'; + case AccountMenuItem.vacation: + return 'vacation'; + case AccountMenuItem.mailboxVisibility: + return 'folder-visibility'; + case AccountMenuItem.none: + return 'profiles'; + } + } } \ No newline at end of file diff --git a/lib/features/manage_account/presentation/vacation/vacation_controller.dart b/lib/features/manage_account/presentation/vacation/vacation_controller.dart index 81328d497..7067f8b14 100644 --- a/lib/features/manage_account/presentation/vacation/vacation_controller.dart +++ b/lib/features/manage_account/presentation/vacation/vacation_controller.dart @@ -153,6 +153,7 @@ class VacationController extends BaseController { } void selectDate(BuildContext context, DateType dateType, DateTime? currentDate) async { + _accountDashBoardController.isVacationDateDialogDisplayed = true; final datePicked = await showDatePicker( context: context, initialDate: currentDate ?? DateTime.now(), @@ -161,17 +162,25 @@ class VacationController extends BaseController { lastDate: DateTime(2100), locale: Localizations.localeOf(context), builder: (context, child) { - return Theme( + return PointerInterceptor( + child: Theme( data: Theme.of(context).copyWith( - colorScheme: const ColorScheme.light( - primary: AppColor.primaryColor, - onPrimary: Colors.white, - onSurface: Colors.black), - textButtonTheme: TextButtonThemeData( - style: TextButton.styleFrom(foregroundColor: AppColor.primaryColor))), - child: child!); + colorScheme: const ColorScheme.light( + primary: AppColor.primaryColor, + onPrimary: Colors.white, + onSurface: Colors.black + ), + textButtonTheme: TextButtonThemeData( + style: TextButton.styleFrom( + foregroundColor: AppColor.primaryColor + ) + ) + ), + child: child! + ), + ); } - ); + ).whenComplete(() => _accountDashBoardController.isVacationDateDialogDisplayed = false); if (datePicked == null) { return; @@ -185,6 +194,7 @@ class VacationController extends BaseController { } void selectTime(BuildContext context, DateType dateType, TimeOfDay? currentTime) async { + _accountDashBoardController.isVacationDateDialogDisplayed = true; final timePicked = await showTimePicker( context: context, initialTime: currentTime ?? TimeOfDay.now(), @@ -204,7 +214,7 @@ class VacationController extends BaseController { ), ); } - ); + ).whenComplete(() => _accountDashBoardController.isVacationDateDialogDisplayed = false); if (timePicked == null) { return; diff --git a/lib/main/routes/navigation_router.dart b/lib/main/routes/navigation_router.dart index 952325e00..9409e3240 100644 --- a/lib/main/routes/navigation_router.dart +++ b/lib/main/routes/navigation_router.dart @@ -3,6 +3,7 @@ import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; enum DashboardType { @@ -19,6 +20,7 @@ class NavigationRouter with EquatableMixin { final EmailAddress? emailAddress; final String? subject; final String? body; + final AccountMenuItem accountMenuItem; NavigationRouter({ this.emailId, @@ -29,6 +31,7 @@ class NavigationRouter with EquatableMixin { this.emailAddress, this.subject, this.body, + this.accountMenuItem = AccountMenuItem.none, }); factory NavigationRouter.initial() => NavigationRouter(); @@ -43,5 +46,6 @@ class NavigationRouter with EquatableMixin { emailAddress, subject, body, + accountMenuItem, ]; } \ No newline at end of file diff --git a/lib/main/routes/route_utils.dart b/lib/main/routes/route_utils.dart index 86560fe14..842b62c54 100644 --- a/lib/main/routes/route_utils.dart +++ b/lib/main/routes/route_utils.dart @@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/login/data/extensions/service_path_extension.dart'; +import 'package:tmail_ui_user/features/manage_account/presentation/model/account_menu_item.dart'; import 'package:tmail_ui_user/features/thread/domain/model/search_query.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/navigation_router.dart'; @@ -31,17 +32,23 @@ abstract class RouteUtils { static String get baseOriginUrl => Uri.base.origin; - static String get baseUrl => Uri.base.path; + static Uri get baseUri => Uri.base; static String generateNavigationRoute(String route, {NavigationRouter? router}) { if (PlatformInfo.isWeb) { - return _createServicePath(route, router: router).path; + if (route == AppRoutes.dashboard) { + return _createDashboardServicePath(route, router: router).path; + } else if (route == AppRoutes.settings) { + return _createSettingServicePath(route, router: router).path; + } else { + return _createServicePath(route).path; + } } else { return route; } } - static ServicePath _createServicePath(String route, {NavigationRouter? router}) { + static ServicePath _createDashboardServicePath(String route, {NavigationRouter? router}) { ServicePath servicePath = ServicePath(route); if (router != null) { if (router.emailId != null) { @@ -62,9 +69,35 @@ abstract class RouteUtils { return servicePath; } + static ServicePath _createSettingServicePath(String route, {NavigationRouter? router}) { + ServicePath servicePath = ServicePath(route); + if (router != null && router.accountMenuItem != AccountMenuItem.none) { + servicePath = servicePath.withQueryParameters([ + StringQueryParameter(paramType, router.accountMenuItem.getAliasBrowser()) + ]); + } + return servicePath; + } + + static ServicePath _createServicePath(String route) { + ServicePath servicePath = ServicePath(route); + return servicePath; + } + static Uri createUrlWebLocationBar(String route, {NavigationRouter? router}) { - final servicePath = _createServicePath('$baseOriginUrl$route', router: router); - return Uri.parse(servicePath.path); + if (route == AppRoutes.dashboard) { + final servicePath = _createDashboardServicePath( + '$baseOriginUrl$route', + router: router + ); + return Uri.parse(servicePath.path); + } else if (route == AppRoutes.settings) { + final servicePath = _createSettingServicePath('$baseOriginUrl$route', router: router); + return Uri.parse(servicePath.path); + } else { + final servicePath = _createServicePath('$baseOriginUrl$route'); + return Uri.parse(servicePath.path); + } } static NavigationRouter parsingRouteParametersToNavigationRouter(Map parameters) { @@ -80,9 +113,8 @@ abstract class RouteUtils { final emailId = idParam != null ? EmailId(Id(idParam)) : null; final mailboxId = contextPram != null ? MailboxId(Id(contextPram)) : null; final searchQuery = queryParam != null ? SearchQuery(queryParam) : null; - final dashboardType = typeParam == DashboardType.search.name - ? DashboardType.search - : DashboardType.normal; + final dashboardType = DashboardType.values.firstWhereOrNull((type) => type.name == typeParam) ?? DashboardType.normal; + final settingType = AccountMenuItem.values.firstWhereOrNull((type) => type.getAliasBrowser() == typeParam) ?? AccountMenuItem.none; final emailAddress = mailtoAddress != null && GetUtils.isEmail(mailtoAddress) ? EmailAddress(null, mailtoAddress) : EmailAddress(null, INVALID_VALUE); @@ -96,6 +128,7 @@ abstract class RouteUtils { emailAddress: emailAddress, subject: subject, body: body, + accountMenuItem: settingType, ); }